diff options
489 files changed, 17745 insertions, 16704 deletions
diff --git a/.travis.yml b/.travis.yml index 8a6f80002b..7bf968ba4c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -47,15 +47,6 @@ matrix: - &linux_deps [libasound2-dev, libgl1-mesa-dev, libglu1-mesa-dev, libx11-dev, libxcursor-dev, libxi-dev, libxinerama-dev, libxrandr-dev] - &linux_mono_deps [mono-devel, msbuild, nuget] - coverity_scan: - project: - name: "godotengine/godot" - description: "Godot Engine Coverity scans" - notification_email: coverity@godotengine.org - build_command_prepend: "" - build_command: "scons p=x11 -j2 $OPTIONS" - branch_pattern: coverity_scan - - name: Linux export template (release, Clang) stage: build env: PLATFORM=x11 TOOLS=no TARGET=release CACHE_NAME=${PLATFORM}-clang EXTRA_ARGS="warnings=extra werror=yes" diff --git a/SConstruct b/SConstruct index cdbb47faea..0e282a1f12 100644 --- a/SConstruct +++ b/SConstruct @@ -150,6 +150,7 @@ opts.Add(BoolVariable('builtin_mbedtls', "Use the built-in mbedTLS library", Tru opts.Add(BoolVariable('builtin_miniupnpc', "Use the built-in miniupnpc library", True)) opts.Add(BoolVariable('builtin_opus', "Use the built-in Opus library", True)) opts.Add(BoolVariable('builtin_pcre2', "Use the built-in PCRE2 library", True)) +opts.Add(BoolVariable('builtin_pcre2_with_jit', "Use JIT compiler for the built-in PCRE2 library", True)) opts.Add(BoolVariable('builtin_recast', "Use the built-in Recast library", True)) opts.Add(BoolVariable('builtin_squish', "Use the built-in squish library", True)) opts.Add(BoolVariable('builtin_xatlas', "Use the built-in xatlas library", True)) diff --git a/core/io/http_client.cpp b/core/io/http_client.cpp index bb1befb297..bfa272e859 100644 --- a/core/io/http_client.cpp +++ b/core/io/http_client.cpp @@ -98,6 +98,8 @@ Error HTTPClient::connect_to_host(const String &p_host, int p_port, bool p_ssl, void HTTPClient::set_connection(const Ref<StreamPeer> &p_connection) { + ERR_FAIL_COND_MSG(p_connection.is_null(), "Connection is not a reference to a valid StreamPeer object."); + close(); connection = p_connection; status = STATUS_CONNECTED; @@ -722,6 +724,10 @@ void HTTPClient::set_read_chunk_size(int p_size) { read_chunk_size = p_size; } +int HTTPClient::get_read_chunk_size() const { + return read_chunk_size; +} + HTTPClient::HTTPClient() { tcp_connection.instance(); @@ -826,6 +832,7 @@ void HTTPClient::_bind_methods() { ClassDB::bind_method(D_METHOD("get_response_body_length"), &HTTPClient::get_response_body_length); ClassDB::bind_method(D_METHOD("read_response_body_chunk"), &HTTPClient::read_response_body_chunk); ClassDB::bind_method(D_METHOD("set_read_chunk_size", "bytes"), &HTTPClient::set_read_chunk_size); + ClassDB::bind_method(D_METHOD("get_read_chunk_size"), &HTTPClient::get_read_chunk_size); ClassDB::bind_method(D_METHOD("set_blocking_mode", "enabled"), &HTTPClient::set_blocking_mode); ClassDB::bind_method(D_METHOD("is_blocking_mode_enabled"), &HTTPClient::is_blocking_mode_enabled); @@ -837,6 +844,7 @@ void HTTPClient::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::BOOL, "blocking_mode_enabled"), "set_blocking_mode", "is_blocking_mode_enabled"); ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "connection", PROPERTY_HINT_RESOURCE_TYPE, "StreamPeer", 0), "set_connection", "get_connection"); + ADD_PROPERTY(PropertyInfo(Variant::INT, "read_chunk_size", PROPERTY_HINT_RANGE, "256,16777216"), "set_read_chunk_size", "get_read_chunk_size"); BIND_ENUM_CONSTANT(METHOD_GET); BIND_ENUM_CONSTANT(METHOD_HEAD); diff --git a/core/io/http_client.h b/core/io/http_client.h index 33e4d15106..27c6711bcf 100644 --- a/core/io/http_client.h +++ b/core/io/http_client.h @@ -221,6 +221,7 @@ public: bool is_blocking_mode_enabled() const; void set_read_chunk_size(int p_size); + int get_read_chunk_size() const; Error poll(); diff --git a/core/io/packet_peer.cpp b/core/io/packet_peer.cpp index 821a04ebad..23dfc58385 100644 --- a/core/io/packet_peer.cpp +++ b/core/io/packet_peer.cpp @@ -279,6 +279,7 @@ Ref<StreamPeer> PacketPeerStream::get_stream_peer() const { void PacketPeerStream::set_input_buffer_max_size(int p_max_size) { + ERR_FAIL_COND_MSG(p_max_size < 0, "Max size of input buffer size cannot be smaller than 0."); //warning may lose packets ERR_FAIL_COND_MSG(ring_buffer.data_left(), "Buffer in use, resizing would cause loss of data."); ring_buffer.resize(nearest_shift(p_max_size + 4)); diff --git a/core/math/camera_matrix.cpp b/core/math/camera_matrix.cpp index 30c0cab909..b9b0f4ac54 100644 --- a/core/math/camera_matrix.cpp +++ b/core/math/camera_matrix.cpp @@ -183,6 +183,10 @@ void CameraMatrix::set_orthogonal(real_t p_size, real_t p_aspect, real_t p_znear void CameraMatrix::set_frustum(real_t p_left, real_t p_right, real_t p_bottom, real_t p_top, real_t p_near, real_t p_far) { + ERR_FAIL_COND(p_right <= p_left); + ERR_FAIL_COND(p_top <= p_bottom); + ERR_FAIL_COND(p_far <= p_near); + real_t *te = &matrix[0][0]; real_t x = 2 * p_near / (p_right - p_left); real_t y = 2 * p_near / (p_top - p_bottom); diff --git a/core/math/face3.cpp b/core/math/face3.cpp index ab09142b2d..666d214f98 100644 --- a/core/math/face3.cpp +++ b/core/math/face3.cpp @@ -393,7 +393,7 @@ Vector3 Face3::get_closest_point_to(const Vector3 &p_point) const { s = CLAMP(numer / denom, 0.f, 1.f); t = 1 - s; } else { - s = CLAMP(-e / c, 0.f, 1.f); + s = CLAMP(-d / a, 0.f, 1.f); t = 0.f; } } else { diff --git a/core/project_settings.cpp b/core/project_settings.cpp index 7704c7b377..067578e354 100644 --- a/core/project_settings.cpp +++ b/core/project_settings.cpp @@ -107,7 +107,7 @@ String ProjectSettings::localize_path(const String &p_path) const { if (plocal == "") { return ""; }; - return plocal + path.substr((sep + 1), path.size() - (sep + 1)); + return plocal + path.substr(sep, path.size() - sep); }; } @@ -525,6 +525,8 @@ Error ProjectSettings::_load_settings_binary(const String &p_path) { set(key, value); } + f->close(); + memdelete(f); return OK; } diff --git a/core/typedefs.h b/core/typedefs.h index 767a97ac38..42f34c73cb 100644 --- a/core/typedefs.h +++ b/core/typedefs.h @@ -174,6 +174,9 @@ inline void __swap_tmpl(T &x, T &y) { static _FORCE_INLINE_ unsigned int next_power_of_2(unsigned int x) { + if (x == 0) + return 0; + --x; x |= x >> 1; x |= x >> 2; diff --git a/core/ustring.cpp b/core/ustring.cpp index 0f82ca7e15..25930db201 100644 --- a/core/ustring.cpp +++ b/core/ustring.cpp @@ -1416,7 +1416,7 @@ bool String::parse_utf8(const char *p_utf8, int p_len) { if (skip == 0) { - uint8_t c = *ptrtmp; + uint8_t c = *ptrtmp >= 0 ? *ptrtmp : uint8_t(256 + *ptrtmp); /* Determine the number of characters in sequence */ if ((c & 0x80) == 0) diff --git a/doc/classes/AABB.xml b/doc/classes/AABB.xml index 61e1ea9b8d..44f1d9a921 100644 --- a/doc/classes/AABB.xml +++ b/doc/classes/AABB.xml @@ -182,6 +182,7 @@ <argument index="0" name="aabb" type="AABB"> </argument> <description> + Returns [code]true[/code] if this [AABB] and [code]aabb[/code] are approximately equal, by calling [code]is_equal_approx[/code] on each component. </description> </method> <method name="merge"> @@ -190,7 +191,7 @@ <argument index="0" name="with" type="AABB"> </argument> <description> - Returns a larger AABB that contains this AABB and [code]with[/code]. + Returns a larger [AABB] that contains both this [AABB] and [code]with[/code]. </description> </method> </methods> diff --git a/doc/classes/Basis.xml b/doc/classes/Basis.xml index df9438e695..5a7fc0a41b 100644 --- a/doc/classes/Basis.xml +++ b/doc/classes/Basis.xml @@ -102,6 +102,7 @@ <argument index="1" name="epsilon" type="float" default="0.00001"> </argument> <description> + Returns [code]true[/code] if this basis and [code]b[/code] are approximately equal, by calling [code]is_equal_approx[/code] on each component. </description> </method> <method name="orthonormalized"> diff --git a/doc/classes/Color.xml b/doc/classes/Color.xml index deba30712e..1d4225542a 100644 --- a/doc/classes/Color.xml +++ b/doc/classes/Color.xml @@ -157,6 +157,7 @@ <argument index="0" name="color" type="Color"> </argument> <description> + Returns [code]true[/code] if this color and [code]color[/code] are approximately equal, by running [method @GDScript.is_equal_approx] on each component. </description> </method> <method name="lightened"> diff --git a/doc/classes/EditorVCSInterface.xml b/doc/classes/EditorVCSInterface.xml index f67c1c9eb5..23d608dea8 100644 --- a/doc/classes/EditorVCSInterface.xml +++ b/doc/classes/EditorVCSInterface.xml @@ -34,13 +34,6 @@ - [code]"offset"[/code] to store the offset of the line change since the first contextual line content. </description> </method> - <method name="get_is_vcs_intialized"> - <return type="bool"> - </return> - <description> - Returns [code]true[/code] if the VCS addon has been initialized, else returns [code]false[/code]. - </description> - </method> <method name="get_modified_files_data"> <return type="Dictionary"> </return> @@ -84,6 +77,13 @@ Returns [code]true[/code] if the addon is ready to respond to function calls, else returns [code]false[/code]. </description> </method> + <method name="is_vcs_initialized"> + <return type="bool"> + </return> + <description> + Returns [code]true[/code] if the VCS addon has been initialized, else returns [code]false[/code]. + </description> + </method> <method name="shut_down"> <return type="bool"> </return> diff --git a/doc/classes/Environment.xml b/doc/classes/Environment.xml index 2b44eb81b1..0d64f0ff64 100644 --- a/doc/classes/Environment.xml +++ b/doc/classes/Environment.xml @@ -96,13 +96,13 @@ [Sky] resource's custom field of view. </member> <member name="background_sky_orientation" type="Basis" setter="set_sky_orientation" getter="get_sky_orientation" default="Basis( 1, 0, 0, 0, 1, 0, 0, 0, 1 )"> - [Sky] resource's rotation expressed as a [Basis] + [Sky] resource's rotation expressed as a [Basis]. </member> <member name="background_sky_rotation" type="Vector3" setter="set_sky_rotation" getter="get_sky_rotation" default="Vector3( 0, 0, 0 )"> - [Sky] resource's rotation expressed as euler angles in radians + [Sky] resource's rotation expressed as Euler angles in radians. </member> <member name="background_sky_rotation_degrees" type="Vector3" setter="set_sky_rotation_degrees" getter="get_sky_rotation_degrees" default="Vector3( 0, 0, 0 )"> - [Sky] resource's rotation expressed as euler angles in degrees + [Sky] resource's rotation expressed as Euler angles in degrees. </member> <member name="dof_blur_far_amount" type="float" setter="set_dof_blur_far_amount" getter="get_dof_blur_far_amount" default="0.1"> Amount of far blur. diff --git a/doc/classes/HTTPClient.xml b/doc/classes/HTTPClient.xml index 52e4b94051..3347eeafa7 100644 --- a/doc/classes/HTTPClient.xml +++ b/doc/classes/HTTPClient.xml @@ -170,15 +170,6 @@ Sends the body data raw, as a byte array and does not encode it in any way. </description> </method> - <method name="set_read_chunk_size"> - <return type="void"> - </return> - <argument index="0" name="bytes" type="int"> - </argument> - <description> - Sets the size of the buffer used and maximum bytes to read per iteration. See [method read_response_body_chunk]. - </description> - </method> </methods> <members> <member name="blocking_mode_enabled" type="bool" setter="set_blocking_mode" getter="is_blocking_mode_enabled" default="false"> @@ -187,6 +178,9 @@ <member name="connection" type="StreamPeer" setter="set_connection" getter="get_connection"> The connection to use for this client. </member> + <member name="read_chunk_size" type="int" setter="set_read_chunk_size" getter="get_read_chunk_size" default="4096"> + The size of the buffer used and maximum bytes to read per iteration. See [method read_response_body_chunk]. + </member> </members> <constants> <constant name="METHOD_GET" value="0" enum="Method"> diff --git a/doc/classes/HTTPRequest.xml b/doc/classes/HTTPRequest.xml index d0e8a5972f..98ba08e6a2 100644 --- a/doc/classes/HTTPRequest.xml +++ b/doc/classes/HTTPRequest.xml @@ -93,6 +93,10 @@ <member name="body_size_limit" type="int" setter="set_body_size_limit" getter="get_body_size_limit" default="-1"> Maximum allowed size for response bodies. </member> + <member name="download_chunk_size" type="int" setter="set_download_chunk_size" getter="get_download_chunk_size" default="4096"> + The size of the buffer used and maximum bytes to read per iteration. See [member HTTPClient.read_chunk_size]. + Set this to a higher value (e.g. 65536 for 64 KiB) when downloading large files to achieve better speeds at the cost of memory. + </member> <member name="download_file" type="String" setter="set_download_file" getter="get_download_file" default=""""> The file to download into. Will output any received file into it. </member> diff --git a/doc/classes/MeshLibrary.xml b/doc/classes/MeshLibrary.xml index 44dc4f334f..49278be44e 100644 --- a/doc/classes/MeshLibrary.xml +++ b/doc/classes/MeshLibrary.xml @@ -4,7 +4,7 @@ Library of meshes. </brief_description> <description> - A library of meshes. Contains a list of [Mesh] resources, each with a name and ID. This resource is used in [GridMap]. + A library of meshes. Contains a list of [Mesh] resources, each with a name and ID. Each item can also include collision and navigation shapes. This resource is used in [GridMap]. </description> <tutorials> </tutorials> @@ -22,7 +22,8 @@ <argument index="0" name="id" type="int"> </argument> <description> - Create a new item in the library, supplied as an ID. + Creates a new item in the library with the given ID. + You can get an unused ID from [method get_last_unused_item_id]. </description> </method> <method name="find_item_by_name" qualifiers="const"> @@ -31,13 +32,14 @@ <argument index="0" name="name" type="String"> </argument> <description> + Returns the first item with the given name. </description> </method> <method name="get_item_list" qualifiers="const"> <return type="PoolIntArray"> </return> <description> - Returns the list of items. + Returns the list of item IDs in use. </description> </method> <method name="get_item_mesh" qualifiers="const"> @@ -46,7 +48,7 @@ <argument index="0" name="id" type="int"> </argument> <description> - Returns the mesh of the item. + Returns the item's mesh. </description> </method> <method name="get_item_name" qualifiers="const"> @@ -55,7 +57,7 @@ <argument index="0" name="id" type="int"> </argument> <description> - Returns the name of the item. + Returns the item's name. </description> </method> <method name="get_item_navmesh" qualifiers="const"> @@ -64,6 +66,7 @@ <argument index="0" name="id" type="int"> </argument> <description> + Returns the item's navigation mesh. </description> </method> <method name="get_item_navmesh_transform" qualifiers="const"> @@ -72,6 +75,7 @@ <argument index="0" name="id" type="int"> </argument> <description> + Returns the transform applied to the item's navigation mesh. </description> </method> <method name="get_item_preview" qualifiers="const"> @@ -90,6 +94,8 @@ <argument index="0" name="id" type="int"> </argument> <description> + Returns an item's collision shapes. + The array consists of each [Shape] followed by its [Transform]. </description> </method> <method name="get_last_unused_item_id" qualifiers="const"> @@ -128,6 +134,7 @@ </argument> <description> Sets the item's name. + This name is shown in the editor. It can also be used to look up the item later using [method find_item_by_name]. </description> </method> <method name="set_item_navmesh"> @@ -138,6 +145,7 @@ <argument index="1" name="navmesh" type="NavigationMesh"> </argument> <description> + Sets the item's navigation mesh. </description> </method> <method name="set_item_navmesh_transform"> @@ -148,6 +156,7 @@ <argument index="1" name="navmesh" type="Transform"> </argument> <description> + Sets the transform to apply to the item's navigation mesh. </description> </method> <method name="set_item_preview"> @@ -158,6 +167,7 @@ <argument index="1" name="texture" type="Texture"> </argument> <description> + Sets a texture to use as the item's preview icon in the editor. </description> </method> <method name="set_item_shapes"> @@ -168,6 +178,8 @@ <argument index="1" name="shapes" type="Array"> </argument> <description> + Sets an item's collision shapes. + The array should consist of [Shape] objects, each followed by a [Transform] that will be applied to it. For shapes that should not have a transform, use [constant Transform.IDENTITY]. </description> </method> </methods> diff --git a/doc/classes/Node.xml b/doc/classes/Node.xml index 1f685aab81..e9fb47cbbd 100644 --- a/doc/classes/Node.xml +++ b/doc/classes/Node.xml @@ -251,7 +251,7 @@ <argument index="0" name="path" type="NodePath"> </argument> <description> - Fetches a node. The [NodePath] can be either a relative path (from the current node) or an absolute path (in the scene tree) to a node. If the path does not exist, a [code]null instance[/code] is returned and attempts to access it will result in an "Attempt to call <method> on a null instance." error. + Fetches a node. The [NodePath] can be either a relative path (from the current node) or an absolute path (in the scene tree) to a node. If the path does not exist, a [code]null instance[/code] is returned and an error is logged. Attempts to access methods on the return value will result in an "Attempt to call <method> on a null instance." error. [b]Note:[/b] Fetching absolute paths only works when the node is inside the scene tree (see [method is_inside_tree]). [b]Example:[/b] Assume your current node is Character and the following tree: [codeblock] @@ -295,7 +295,7 @@ <argument index="0" name="path" type="NodePath"> </argument> <description> - Similar to [method get_node], but does not raise an error if [code]path[/code] does not point to a valid [Node]. + Similar to [method get_node], but does not log an error if [code]path[/code] does not point to a valid [Node]. </description> </method> <method name="get_parent" qualifiers="const"> @@ -783,15 +783,6 @@ Enables or disabled internal processing for this node. Internal processing happens in isolation from the normal [method _process] calls and is used by some nodes internally to guarantee proper functioning even if the node is paused or processing is disabled for scripting ([method set_process]). Only useful for advanced uses to manipulate built-in nodes' behaviour. </description> </method> - <method name="set_process_priority"> - <return type="void"> - </return> - <argument index="0" name="priority" type="int"> - </argument> - <description> - Sets the node's priority in the execution order of the enabled processing callbacks (i.e. [constant NOTIFICATION_PROCESS], [constant NOTIFICATION_PHYSICS_PROCESS] and their internal counterparts). Nodes with a higher process priority will have their processing callbacks executed first. - </description> - </method> <method name="set_process_unhandled_input"> <return type="void"> </return> @@ -847,6 +838,9 @@ <member name="pause_mode" type="int" setter="set_pause_mode" getter="get_pause_mode" enum="Node.PauseMode" default="0"> Pause mode. How the node will behave if the [SceneTree] is paused. </member> + <member name="process_priority" type="int" setter="set_process_priority" getter="get_process_priority" default="0"> + The node's priority in the execution order of the enabled processing callbacks (i.e. [constant NOTIFICATION_PROCESS], [constant NOTIFICATION_PHYSICS_PROCESS] and their internal counterparts). Nodes with a higher process priority will have their processing callbacks executed first. + </member> </members> <signals> <signal name="ready"> diff --git a/doc/classes/Object.xml b/doc/classes/Object.xml index 4b77197e29..5a09fe39c0 100644 --- a/doc/classes/Object.xml +++ b/doc/classes/Object.xml @@ -139,7 +139,7 @@ <argument index="4" name="flags" type="int" default="0"> </argument> <description> - Connects a [code]signal[/code] to a [code]method[/code] on a [code]target[/code] object. Pass optional [code]binds[/code] to the call as an [Array] of parameters. Use [code]flags[/code] to set deferred or one-shot connections. See [enum ConnectFlags] constants. + Connects a [code]signal[/code] to a [code]method[/code] on a [code]target[/code] object. Pass optional [code]binds[/code] to the call as an [Array] of parameters. These parameters will be passed to the method after any parameter used in the call to [method emit_signal]. Use [code]flags[/code] to set deferred or one-shot connections. See [enum ConnectFlags] constants. A [code]signal[/code] can only be connected once to a [code]method[/code]. It will throw an error if already connected, unless the signal was connected with [constant CONNECT_REFERENCE_COUNTED]. To avoid this, first, use [method is_connected] to check for existing connections. If the [code]target[/code] is destroyed in the game's lifecycle, the connection will be lost. Examples: @@ -148,6 +148,13 @@ connect("text_entered", self, "_on_LineEdit_text_entered") # LineEdit signal connect("hit", self, "_on_Player_hit", [ weapon_type, damage ]) # User-defined signal [/codeblock] + An example of the relationship between [code]binds[/code] passed to [method connect] and parameters used when calling [method emit_signal]: + [codeblock] + connect("hit", self, "_on_Player_hit", [ weapon_type, damage ]) # weapon_type and damage are passed last + emit_signal("hit", "Dark lord", 5) # "Dark lord" and 5 are passed first + func _on_Player_hit(hit_by, level, weapon_type, damage): + print("Hit by %s (lvl %d) with weapon %s for %d damage" % [hit_by, level, weapon_type, damage]) + [/codeblock] </description> </method> <method name="disconnect"> diff --git a/doc/classes/Plane.xml b/doc/classes/Plane.xml index bb72f2734e..f179041327 100644 --- a/doc/classes/Plane.xml +++ b/doc/classes/Plane.xml @@ -122,6 +122,7 @@ <argument index="0" name="plane" type="Plane"> </argument> <description> + Returns [code]true[/code] if this plane and [code]plane[/code] are approximately equal, by running [method @GDScript.is_equal_approx] on each component. </description> </method> <method name="is_point_over"> diff --git a/doc/classes/Popup.xml b/doc/classes/Popup.xml index 2357ee2469..6b15b5a1ea 100644 --- a/doc/classes/Popup.xml +++ b/doc/classes/Popup.xml @@ -4,7 +4,7 @@ Base container control for popups and dialogs. </brief_description> <description> - Popup is a base [Control] used to show dialogs and popups. It's a subwindow and modal by default (see [Control]) and has helpers for custom popup behavior. + Popup is a base [Control] used to show dialogs and popups. It's a subwindow and modal by default (see [Control]) and has helpers for custom popup behavior. All popup methods ensure correct placement within the viewport. </description> <tutorials> </tutorials> diff --git a/doc/classes/Quat.xml b/doc/classes/Quat.xml index f5ee99d30c..eeb633f480 100644 --- a/doc/classes/Quat.xml +++ b/doc/classes/Quat.xml @@ -100,6 +100,7 @@ <argument index="0" name="quat" type="Quat"> </argument> <description> + Returns [code]true[/code] if this quaterion and [code]quat[/code] are approximately equal, by running [method @GDScript.is_equal_approx] on each component. </description> </method> <method name="is_normalized"> diff --git a/doc/classes/Rect2.xml b/doc/classes/Rect2.xml index 07fa7777fe..90dd996691 100644 --- a/doc/classes/Rect2.xml +++ b/doc/classes/Rect2.xml @@ -143,6 +143,7 @@ <argument index="0" name="rect" type="Rect2"> </argument> <description> + Returns [code]true[/code] if this [Rect2] and [code]rect[/code] are approximately equal, by calling [code]is_equal_approx[/code] on each component. </description> </method> <method name="merge"> @@ -151,7 +152,7 @@ <argument index="0" name="b" type="Rect2"> </argument> <description> - Returns a larger Rect2 that contains this Rect2 and [code]b[/code]. + Returns a larger [Rect2] that contains this [Rect2] and [code]b[/code]. </description> </method> </methods> diff --git a/doc/classes/Script.xml b/doc/classes/Script.xml index e8a88acdb5..91014580d3 100644 --- a/doc/classes/Script.xml +++ b/doc/classes/Script.xml @@ -4,7 +4,7 @@ A class stored as a resource. </brief_description> <description> - A class stored as a resource. A script exends the functionality of all objects that instance it. + A class stored as a resource. A script extends the functionality of all objects that instance it. The [code]new[/code] method of a script subclass creates a new instance. [method Object.set_script] extends an existing object, if that object's class matches one of the script's base classes. </description> <tutorials> diff --git a/doc/classes/String.xml b/doc/classes/String.xml index 11a9f6dc0d..f5597d89e5 100644 --- a/doc/classes/String.xml +++ b/doc/classes/String.xml @@ -752,7 +752,6 @@ print(some_array[0]) # Prints "Four" print(some_array[1]) # Prints "Three,Two,One" [/codeblock] - </description> </method> <method name="rstrip"> diff --git a/doc/classes/Transform.xml b/doc/classes/Transform.xml index 034a1b2f5b..4c4022b3b5 100644 --- a/doc/classes/Transform.xml +++ b/doc/classes/Transform.xml @@ -95,6 +95,7 @@ <argument index="0" name="transform" type="Transform"> </argument> <description> + Returns [code]true[/code] if this transform and [code]transform[/code] are approximately equal, by calling [code]is_equal_approx[/code] on each component. </description> </method> <method name="looking_at"> diff --git a/doc/classes/Transform2D.xml b/doc/classes/Transform2D.xml index 89ccffc2e9..6288bb074c 100644 --- a/doc/classes/Transform2D.xml +++ b/doc/classes/Transform2D.xml @@ -112,6 +112,7 @@ <argument index="0" name="transform" type="Transform2D"> </argument> <description> + Returns [code]true[/code] if this transform and [code]transform[/code] are approximately equal, by calling [code]is_equal_approx[/code] on each component. </description> </method> <method name="orthonormalized"> diff --git a/doc/classes/Vector2.xml b/doc/classes/Vector2.xml index 8ae5caf68c..b23c69de60 100644 --- a/doc/classes/Vector2.xml +++ b/doc/classes/Vector2.xml @@ -159,6 +159,7 @@ <argument index="0" name="v" type="Vector2"> </argument> <description> + Returns [code]true[/code] if this vector and [code]v[/code] are approximately equal, by running [method @GDScript.is_equal_approx] on each component. </description> </method> <method name="is_normalized"> diff --git a/doc/classes/Vector3.xml b/doc/classes/Vector3.xml index 29c24709e2..d838e6d2f7 100644 --- a/doc/classes/Vector3.xml +++ b/doc/classes/Vector3.xml @@ -135,6 +135,7 @@ <argument index="0" name="v" type="Vector3"> </argument> <description> + Returns [code]true[/code] if this vector and [code]v[/code] are approximately equal, by running [method @GDScript.is_equal_approx] on each component. </description> </method> <method name="is_normalized"> diff --git a/doc/classes/Viewport.xml b/doc/classes/Viewport.xml index 9bc46881f9..4effe9aad2 100644 --- a/doc/classes/Viewport.xml +++ b/doc/classes/Viewport.xml @@ -126,6 +126,7 @@ <return type="bool"> </return> <description> + Returns [code]true[/code] if the viewport is currently performing a drag operation. </description> </method> <method name="input"> diff --git a/doc/classes/ViewportContainer.xml b/doc/classes/ViewportContainer.xml index e4c6091909..2f1bc5d799 100644 --- a/doc/classes/ViewportContainer.xml +++ b/doc/classes/ViewportContainer.xml @@ -15,6 +15,9 @@ If [code]true[/code], the viewport will be scaled to the control's size. </member> <member name="stretch_shrink" type="int" setter="set_stretch_shrink" getter="get_stretch_shrink" default="1"> + Divides the viewport's effective resolution by this value while preserving its scale. This can be used to speed up rendering. + For example, a 1280×720 viewport with [member stretch_shrink] set to [code]2[/code] will be rendered at 640×360 while occupying the same size in the container. + [b]Note:[/b] [member stretch] must be [code]true[/code] for this property to work. </member> </members> <constants> diff --git a/doc/classes/VisualServer.xml b/doc/classes/VisualServer.xml index 28365c213b..895aba2473 100644 --- a/doc/classes/VisualServer.xml +++ b/doc/classes/VisualServer.xml @@ -4255,10 +4255,10 @@ Multisample antialiasing is set to 16×. </constant> <constant name="VIEWPORT_MSAA_EXT_2X" value="5" enum="ViewportMSAA"> - Multisample antialiasing is set to 2× on external texture. Special mode for GLES2 VR for the Oculus Quest. + Multisample antialiasing is set to 2× on external texture. Special mode for GLES2 Android VR (Oculus Quest and Go). </constant> <constant name="VIEWPORT_MSAA_EXT_4X" value="6" enum="ViewportMSAA"> - Multisample antialiasing is set to 4× on external texture. Special mode for GLES2 VR for the Oculus Quest. + Multisample antialiasing is set to 4× on external texture. Special mode for GLES2 Android VR (Oculus Quest and Go). </constant> <constant name="VIEWPORT_USAGE_2D" value="0" enum="ViewportUsage"> The Viewport does not render 3D but samples. diff --git a/drivers/gles2/rasterizer_canvas_gles2.cpp b/drivers/gles2/rasterizer_canvas_gles2.cpp index e34705f7b7..ac54af722c 100644 --- a/drivers/gles2/rasterizer_canvas_gles2.cpp +++ b/drivers/gles2/rasterizer_canvas_gles2.cpp @@ -291,6 +291,10 @@ RasterizerStorageGLES2::Texture *RasterizerCanvasGLES2::_bind_canvas_texture(con void RasterizerCanvasGLES2::_draw_polygon(const int *p_indices, int p_index_count, int p_vertex_count, const Vector2 *p_vertices, const Vector2 *p_uvs, const Color *p_colors, bool p_singlecolor, const float *p_weights, const int *p_bones) { glBindBuffer(GL_ARRAY_BUFFER, data.polygon_buffer); +#ifndef GLES_OVER_GL + // Orphan the buffer to avoid CPU/GPU sync points caused by glBufferSubData + glBufferData(GL_ARRAY_BUFFER, data.polygon_buffer_size, NULL, GL_DYNAMIC_DRAW); +#endif uint32_t buffer_ofs = 0; @@ -339,6 +343,11 @@ void RasterizerCanvasGLES2::_draw_polygon(const int *p_indices, int p_index_coun } glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, data.polygon_index_buffer); +#ifndef GLES_OVER_GL + // Orphan the buffer to avoid CPU/GPU sync points caused by glBufferSubData + glBufferData(GL_ELEMENT_ARRAY_BUFFER, data.polygon_index_buffer_size, NULL, GL_DYNAMIC_DRAW); +#endif + if (storage->config.support_32_bits_indices) { //should check for glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, sizeof(int) * p_index_count, p_indices); glDrawElements(GL_TRIANGLES, p_index_count, GL_UNSIGNED_INT, 0); @@ -358,6 +367,10 @@ void RasterizerCanvasGLES2::_draw_polygon(const int *p_indices, int p_index_coun void RasterizerCanvasGLES2::_draw_generic(GLuint p_primitive, int p_vertex_count, const Vector2 *p_vertices, const Vector2 *p_uvs, const Color *p_colors, bool p_singlecolor) { glBindBuffer(GL_ARRAY_BUFFER, data.polygon_buffer); +#ifndef GLES_OVER_GL + // Orphan the buffer to avoid CPU/GPU sync points caused by glBufferSubData + glBufferData(GL_ARRAY_BUFFER, data.polygon_buffer_size, NULL, GL_DYNAMIC_DRAW); +#endif uint32_t buffer_ofs = 0; @@ -435,6 +448,10 @@ void RasterizerCanvasGLES2::_draw_gui_primitive(int p_points, const Vector2 *p_v } glBindBuffer(GL_ARRAY_BUFFER, data.polygon_buffer); +#ifndef GLES_OVER_GL + // Orphan the buffer to avoid CPU/GPU sync points caused by glBufferSubData + glBufferData(GL_ARRAY_BUFFER, data.polygon_buffer_size, NULL, GL_DYNAMIC_DRAW); +#endif glBufferSubData(GL_ARRAY_BUFFER, 0, p_points * stride * 4 * sizeof(float), buffer_data); glVertexAttribPointer(VS::ARRAY_VERTEX, 2, GL_FLOAT, GL_FALSE, stride * sizeof(float), NULL); @@ -749,6 +766,10 @@ void RasterizerCanvasGLES2::_canvas_item_render_commands(Item *p_item, Item *cur WARN_PRINT("NinePatch without texture not supported yet in GLES2 backend, skipping."); continue; } + if (tex->width == 0 || tex->height == 0) { + WARN_PRINT("Cannot set empty texture to NinePatch."); + continue; + } Size2 texpixel_size(1.0 / tex->width, 1.0 / tex->height); @@ -883,7 +904,7 @@ void RasterizerCanvasGLES2::_canvas_item_render_commands(Item *p_item, Item *cur } glBindBuffer(GL_ARRAY_BUFFER, data.ninepatch_vertices); - glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(float) * (16 + 16) * 2, buffer); + glBufferData(GL_ARRAY_BUFFER, sizeof(float) * (16 + 16) * 2, buffer, GL_DYNAMIC_DRAW); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, data.ninepatch_elements); @@ -2034,6 +2055,8 @@ void RasterizerCanvasGLES2::initialize() { glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, data.polygon_index_buffer); glBufferData(GL_ELEMENT_ARRAY_BUFFER, index_size, NULL, GL_DYNAMIC_DRAW); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); + + data.polygon_index_buffer_size = index_size; } // ninepatch buffers diff --git a/drivers/gles2/rasterizer_canvas_gles2.h b/drivers/gles2/rasterizer_canvas_gles2.h index ab636dca71..ba636a9763 100644 --- a/drivers/gles2/rasterizer_canvas_gles2.h +++ b/drivers/gles2/rasterizer_canvas_gles2.h @@ -65,6 +65,7 @@ public: GLuint polygon_index_buffer; uint32_t polygon_buffer_size; + uint32_t polygon_index_buffer_size; GLuint ninepatch_vertices; GLuint ninepatch_elements; diff --git a/drivers/gles2/rasterizer_scene_gles2.cpp b/drivers/gles2/rasterizer_scene_gles2.cpp index 6bcda62e7f..06608c658d 100644 --- a/drivers/gles2/rasterizer_scene_gles2.cpp +++ b/drivers/gles2/rasterizer_scene_gles2.cpp @@ -1869,7 +1869,6 @@ void RasterizerSceneGLES2::_setup_light_type(LightInstance *p_light, ShadowAtlas state.scene_shader.set_conditional(SceneShaderGLES2::LIGHT_USE_PSSM2, false); state.scene_shader.set_conditional(SceneShaderGLES2::LIGHT_USE_PSSM4, false); state.scene_shader.set_conditional(SceneShaderGLES2::LIGHT_USE_PSSM_BLEND, false); - state.scene_shader.set_conditional(SceneShaderGLES2::USE_SHADOW, false); if (!p_light) { //no light, return off return; @@ -2342,9 +2341,7 @@ void RasterizerSceneGLES2::_render_render_list(RenderList::Element **p_elements, if (accum_pass) { //accum pass force pass blend_mode = RasterizerStorageGLES2::Shader::Spatial::BLEND_MODE_ADD; - if (rebind_light && light && light->light_ptr->negative) { - glBlendEquation(GL_FUNC_REVERSE_SUBTRACT); - glBlendFunc(GL_SRC_ALPHA, GL_ONE); + if (light && light->light_ptr->negative) { blend_mode = RasterizerStorageGLES2::Shader::Spatial::BLEND_MODE_SUB; } } @@ -2704,7 +2701,7 @@ void RasterizerSceneGLES2::_draw_sky(RasterizerStorageGLES2::Sky *p_sky, const C } glBindBuffer(GL_ARRAY_BUFFER, state.sky_verts); - glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(Vector3) * 8, vertices); + glBufferData(GL_ARRAY_BUFFER, sizeof(Vector3) * 8, vertices, GL_DYNAMIC_DRAW); // bind sky vertex array.... glVertexAttribPointer(VS::ARRAY_VERTEX, 3, GL_FLOAT, GL_FALSE, sizeof(Vector3) * 2, 0); diff --git a/drivers/gles2/rasterizer_storage_gles2.cpp b/drivers/gles2/rasterizer_storage_gles2.cpp index 82cb1ef90b..40e7f0c441 100644 --- a/drivers/gles2/rasterizer_storage_gles2.cpp +++ b/drivers/gles2/rasterizer_storage_gles2.cpp @@ -85,7 +85,9 @@ GLuint RasterizerStorageGLES2::system_fbo = 0; #define glClearDepth glClearDepthf // enable extensions manually for android and ios +#ifndef UWP_ENABLED #include <dlfcn.h> // needed to load extensions +#endif #ifdef IPHONE_ENABLED @@ -93,13 +95,18 @@ GLuint RasterizerStorageGLES2::system_fbo = 0; //void *glRenderbufferStorageMultisampleAPPLE; //void *glResolveMultisampleFramebufferAPPLE; #define glRenderbufferStorageMultisample glRenderbufferStorageMultisampleAPPLE -#elif ANDROID_ENABLED +#elif defined(ANDROID_ENABLED) #include <GLES2/gl2ext.h> PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC glRenderbufferStorageMultisampleEXT; PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEEXTPROC glFramebufferTexture2DMultisampleEXT; #define glRenderbufferStorageMultisample glRenderbufferStorageMultisampleEXT #define glFramebufferTexture2DMultisample glFramebufferTexture2DMultisampleEXT + +#elif defined(UWP_ENABLED) +#include <GLES2/gl2ext.h> +#define glRenderbufferStorageMultisample glRenderbufferStorageMultisampleANGLE +#define glFramebufferTexture2DMultisample glFramebufferTexture2DMultisampleANGLE #endif #define GL_MAX_SAMPLES 0x8D57 @@ -4583,13 +4590,24 @@ void RasterizerStorageGLES2::_render_target_allocate(RenderTarget *rt) { GLuint color_internal_format; GLuint color_format; GLuint color_type = GL_UNSIGNED_BYTE; + Image::Format image_format; if (rt->flags[RasterizerStorage::RENDER_TARGET_TRANSPARENT]) { +#ifdef GLES_OVER_GL + color_internal_format = GL_RGBA8; +#else color_internal_format = GL_RGBA; +#endif color_format = GL_RGBA; + image_format = Image::FORMAT_RGBA8; } else { +#ifdef GLES_OVER_GL + color_internal_format = GL_RGB8; +#else color_internal_format = GL_RGB; +#endif color_format = GL_RGB; + image_format = Image::FORMAT_RGB8; } rt->used_dof_blur_near = false; @@ -4646,7 +4664,7 @@ void RasterizerStorageGLES2::_render_target_allocate(RenderTarget *rt) { glGenRenderbuffers(1, &rt->depth); glBindRenderbuffer(GL_RENDERBUFFER, rt->depth); - glRenderbufferStorage(GL_RENDERBUFFER, config.depth_internalformat, rt->width, rt->height); + glRenderbufferStorage(GL_RENDERBUFFER, config.depth_buffer_internalformat, rt->width, rt->height); glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, rt->depth); } @@ -4676,10 +4694,10 @@ void RasterizerStorageGLES2::_render_target_allocate(RenderTarget *rt) { return; } - texture->format = Image::FORMAT_RGBA8; - texture->gl_format_cache = GL_RGBA; + texture->format = image_format; + texture->gl_format_cache = color_format; texture->gl_type_cache = GL_UNSIGNED_BYTE; - texture->gl_internal_format_cache = GL_RGBA; + texture->gl_internal_format_cache = color_internal_format; texture->tex_id = rt->color; texture->width = rt->width; texture->alloc_width = rt->width; @@ -4714,7 +4732,7 @@ void RasterizerStorageGLES2::_render_target_allocate(RenderTarget *rt) { glGenRenderbuffers(1, &rt->multisample_depth); glBindRenderbuffer(GL_RENDERBUFFER, rt->multisample_depth); - glRenderbufferStorageMultisample(GL_RENDERBUFFER, msaa, config.depth_internalformat, rt->width, rt->height); + glRenderbufferStorageMultisample(GL_RENDERBUFFER, msaa, config.depth_buffer_internalformat, rt->width, rt->height); glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, rt->multisample_depth); @@ -5178,7 +5196,7 @@ void RasterizerStorageGLES2::render_target_set_external_texture(RID p_render_tar // create a multisample depth buffer, we're not reusing Godots because Godot's didn't get created.. glGenRenderbuffers(1, &rt->external.depth); glBindRenderbuffer(GL_RENDERBUFFER, rt->external.depth); - glRenderbufferStorageMultisample(GL_RENDERBUFFER, msaa, config.depth_internalformat, rt->width, rt->height); + glRenderbufferStorageMultisample(GL_RENDERBUFFER, msaa, config.depth_buffer_internalformat, rt->width, rt->height); glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, rt->external.depth); } @@ -5291,7 +5309,7 @@ RID RasterizerStorageGLES2::canvas_light_shadow_buffer_create(int p_width) { glGenRenderbuffers(1, &cls->depth); glBindRenderbuffer(GL_RENDERBUFFER, cls->depth); - glRenderbufferStorage(GL_RENDERBUFFER, config.depth_internalformat, cls->size, cls->height); + glRenderbufferStorage(GL_RENDERBUFFER, config.depth_buffer_internalformat, cls->size, cls->height); glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, cls->depth); glGenTextures(1, &cls->distance); @@ -5772,6 +5790,8 @@ void RasterizerStorageGLES2::initialize() { config.keep_original_textures = false; config.shrink_textures_x2 = false; + config.depth_internalformat = GL_DEPTH_COMPONENT; + config.depth_type = GL_UNSIGNED_INT; #ifdef GLES_OVER_GL config.float_texture_supported = true; @@ -5779,20 +5799,20 @@ void RasterizerStorageGLES2::initialize() { config.pvrtc_supported = false; config.etc1_supported = false; config.support_npot_repeat_mipmap = true; - config.depth_internalformat = GL_DEPTH_COMPONENT; - config.depth_type = GL_UNSIGNED_INT; + config.depth_buffer_internalformat = GL_DEPTH_COMPONENT24; #else config.float_texture_supported = config.extensions.has("GL_ARB_texture_float") || config.extensions.has("GL_OES_texture_float"); config.s3tc_supported = config.extensions.has("GL_EXT_texture_compression_s3tc") || config.extensions.has("WEBGL_compressed_texture_s3tc"); config.etc1_supported = config.extensions.has("GL_OES_compressed_ETC1_RGB8_texture") || config.extensions.has("WEBGL_compressed_texture_etc1"); config.pvrtc_supported = config.extensions.has("IMG_texture_compression_pvrtc") || config.extensions.has("WEBGL_compressed_texture_pvrtc"); config.support_npot_repeat_mipmap = config.extensions.has("GL_OES_texture_npot"); - // on mobile check for 24 bit depth support + + // on mobile check for 24 bit depth support for RenderBufferStorage if (config.extensions.has("GL_OES_depth24")) { - config.depth_internalformat = _DEPTH_COMPONENT24_OES; + config.depth_buffer_internalformat = _DEPTH_COMPONENT24_OES; config.depth_type = GL_UNSIGNED_INT; } else { - config.depth_internalformat = GL_DEPTH_COMPONENT16; + config.depth_buffer_internalformat = GL_DEPTH_COMPONENT16; config.depth_type = GL_UNSIGNED_SHORT; } #endif @@ -5871,7 +5891,7 @@ void RasterizerStorageGLES2::initialize() { GLuint depth; glGenTextures(1, &depth); glBindTexture(GL_TEXTURE_2D, depth); - glTexImage2D(GL_TEXTURE_2D, 0, config.depth_internalformat, 32, 32, 0, config.depth_internalformat, config.depth_type, NULL); + glTexImage2D(GL_TEXTURE_2D, 0, config.depth_internalformat, 32, 32, 0, GL_DEPTH_COMPONENT, config.depth_type, NULL); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); @@ -5890,8 +5910,12 @@ void RasterizerStorageGLES2::initialize() { if (status != GL_FRAMEBUFFER_COMPLETE) { // If it fails, test to see if it supports a framebuffer texture using UNSIGNED_SHORT // This is needed because many OSX devices don't support either UNSIGNED_INT or UNSIGNED_SHORT - +#ifdef GLES_OVER_GL config.depth_internalformat = GL_DEPTH_COMPONENT16; +#else + // OES_depth_texture extension only specifies GL_DEPTH_COMPONENT. + config.depth_internalformat = GL_DEPTH_COMPONENT; +#endif config.depth_type = GL_UNSIGNED_SHORT; glGenFramebuffers(1, &fbo); @@ -5899,7 +5923,7 @@ void RasterizerStorageGLES2::initialize() { glGenTextures(1, &depth); glBindTexture(GL_TEXTURE_2D, depth); - glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT16, 32, 32, 0, GL_DEPTH_COMPONENT16, GL_UNSIGNED_SHORT, NULL); + glTexImage2D(GL_TEXTURE_2D, 0, config.depth_internalformat, 32, 32, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, NULL); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); diff --git a/drivers/gles2/rasterizer_storage_gles2.h b/drivers/gles2/rasterizer_storage_gles2.h index 6de530d8c3..daf6b93afc 100644 --- a/drivers/gles2/rasterizer_storage_gles2.h +++ b/drivers/gles2/rasterizer_storage_gles2.h @@ -99,6 +99,7 @@ public: GLuint depth_internalformat; GLuint depth_type; + GLuint depth_buffer_internalformat; } config; diff --git a/drivers/gles2/shader_gles2.h b/drivers/gles2/shader_gles2.h index 2456a83d35..c7a6465194 100644 --- a/drivers/gles2/shader_gles2.h +++ b/drivers/gles2/shader_gles2.h @@ -119,6 +119,7 @@ private: bool ok; Version() { code_version = 0; + frag_id = 0; ok = false; uniform_location = NULL; } diff --git a/drivers/gles2/shaders/scene.glsl b/drivers/gles2/shaders/scene.glsl index e36e776881..25dbbf3c90 100644 --- a/drivers/gles2/shaders/scene.glsl +++ b/drivers/gles2/shaders/scene.glsl @@ -1547,155 +1547,157 @@ FRAGMENT_SHADER_CODE #endif // !USE_SHADOW_TO_OPACITY #ifdef BASE_PASS - //none + { + // IBL precalculations + float ndotv = clamp(dot(normal, eye_position), 0.0, 1.0); + vec3 f0 = F0(metallic, specular, albedo); + vec3 F = f0 + (max(vec3(1.0 - roughness), f0) - f0) * pow(1.0 - ndotv, 5.0); #ifdef AMBIENT_LIGHT_DISABLED - ambient_light = vec3(0.0, 0.0, 0.0); + ambient_light = vec3(0.0, 0.0, 0.0); #else #ifdef USE_RADIANCE_MAP - vec3 ref_vec = reflect(-eye_position, N); - ref_vec = normalize((radiance_inverse_xform * vec4(ref_vec, 0.0)).xyz); + vec3 ref_vec = reflect(-eye_position, N); + ref_vec = normalize((radiance_inverse_xform * vec4(ref_vec, 0.0)).xyz); - ref_vec.z *= -1.0; + ref_vec.z *= -1.0; - specular_light = textureCubeLod(radiance_map, ref_vec, roughness * RADIANCE_MAX_LOD).xyz * bg_energy; - { - vec3 ambient_dir = normalize((radiance_inverse_xform * vec4(normal, 0.0)).xyz); - vec3 env_ambient = textureCubeLod(radiance_map, ambient_dir, RADIANCE_MAX_LOD).xyz * bg_energy; + specular_light = textureCubeLod(radiance_map, ref_vec, roughness * RADIANCE_MAX_LOD).xyz * bg_energy; +#ifndef USE_LIGHTMAP + { + vec3 ambient_dir = normalize((radiance_inverse_xform * vec4(normal, 0.0)).xyz); + vec3 env_ambient = textureCubeLod(radiance_map, ambient_dir, 4.0).xyz * bg_energy; + env_ambient *= 1.0 - F; - ambient_light = mix(ambient_color.rgb, env_ambient, ambient_sky_contribution); - } + ambient_light = mix(ambient_color.rgb, env_ambient, ambient_sky_contribution); + } +#endif #else - ambient_light = ambient_color.rgb; - specular_light = bg_color.rgb * bg_energy; + ambient_light = ambient_color.rgb; + specular_light = bg_color.rgb * bg_energy; #endif - #endif // AMBIENT_LIGHT_DISABLED - ambient_light *= ambient_energy; + ambient_light *= ambient_energy; #if defined(USE_REFLECTION_PROBE1) || defined(USE_REFLECTION_PROBE2) - vec4 ambient_accum = vec4(0.0); - vec4 reflection_accum = vec4(0.0); + vec4 ambient_accum = vec4(0.0); + vec4 reflection_accum = vec4(0.0); #ifdef USE_REFLECTION_PROBE1 - reflection_process(reflection_probe1, + reflection_process(reflection_probe1, #ifdef USE_VERTEX_LIGHTING - refprobe1_reflection_normal_blend.rgb, + refprobe1_reflection_normal_blend.rgb, #ifndef USE_LIGHTMAP - refprobe1_ambient_normal, + refprobe1_ambient_normal, #endif - refprobe1_reflection_normal_blend.a, + refprobe1_reflection_normal_blend.a, #else - normal_interp, vertex_interp, refprobe1_local_matrix, - refprobe1_use_box_project, refprobe1_box_extents, refprobe1_box_offset, + normal_interp, vertex_interp, refprobe1_local_matrix, + refprobe1_use_box_project, refprobe1_box_extents, refprobe1_box_offset, #endif - refprobe1_exterior, refprobe1_intensity, refprobe1_ambient, roughness, - ambient_light, specular_light, reflection_accum, ambient_accum); + refprobe1_exterior, refprobe1_intensity, refprobe1_ambient, roughness, + ambient_light, specular_light, reflection_accum, ambient_accum); #endif // USE_REFLECTION_PROBE1 #ifdef USE_REFLECTION_PROBE2 - reflection_process(reflection_probe2, + reflection_process(reflection_probe2, #ifdef USE_VERTEX_LIGHTING - refprobe2_reflection_normal_blend.rgb, + refprobe2_reflection_normal_blend.rgb, #ifndef USE_LIGHTMAP - refprobe2_ambient_normal, + refprobe2_ambient_normal, #endif - refprobe2_reflection_normal_blend.a, + refprobe2_reflection_normal_blend.a, #else - normal_interp, vertex_interp, refprobe2_local_matrix, - refprobe2_use_box_project, refprobe2_box_extents, refprobe2_box_offset, + normal_interp, vertex_interp, refprobe2_local_matrix, + refprobe2_use_box_project, refprobe2_box_extents, refprobe2_box_offset, #endif - refprobe2_exterior, refprobe2_intensity, refprobe2_ambient, roughness, - ambient_light, specular_light, reflection_accum, ambient_accum); + refprobe2_exterior, refprobe2_intensity, refprobe2_ambient, roughness, + ambient_light, specular_light, reflection_accum, ambient_accum); #endif // USE_REFLECTION_PROBE2 - if (reflection_accum.a > 0.0) { - specular_light = reflection_accum.rgb / reflection_accum.a; - } + if (reflection_accum.a > 0.0) { + specular_light = reflection_accum.rgb / reflection_accum.a; + } #ifndef USE_LIGHTMAP - if (ambient_accum.a > 0.0) { - ambient_light = ambient_accum.rgb / ambient_accum.a; - } + if (ambient_accum.a > 0.0) { + ambient_light = ambient_accum.rgb / ambient_accum.a; + } #endif #endif // defined(USE_REFLECTION_PROBE1) || defined(USE_REFLECTION_PROBE2) - // environment BRDF approximation - - { + // environment BRDF approximation + { #if defined(DIFFUSE_TOON) - //simplify for toon, as - specular_light *= specular * metallic * albedo * 2.0; + //simplify for toon, as + specular_light *= specular * metallic * albedo * 2.0; #else - // scales the specular reflections, needs to be be computed before lighting happens, - // but after environment and reflection probes are added - //TODO: this curve is not really designed for gammaspace, should be adjusted - const vec4 c0 = vec4(-1.0, -0.0275, -0.572, 0.022); - const vec4 c1 = vec4(1.0, 0.0425, 1.04, -0.04); - vec4 r = roughness * c0 + c1; - float ndotv = clamp(dot(normal, eye_position), 0.0, 1.0); - float a004 = min(r.x * r.x, exp2(-9.28 * ndotv)) * r.x + r.y; - vec2 env = vec2(-1.04, 1.04) * a004 + r.zw; - - vec3 f0 = F0(metallic, specular, albedo); - specular_light *= env.x * f0 + env.y; + // scales the specular reflections, needs to be be computed before lighting happens, + // but after environment and reflection probes are added + //TODO: this curve is not really designed for gammaspace, should be adjusted + const vec4 c0 = vec4(-1.0, -0.0275, -0.572, 0.022); + const vec4 c1 = vec4(1.0, 0.0425, 1.04, -0.04); + vec4 r = roughness * c0 + c1; + float a004 = min(r.x * r.x, exp2(-9.28 * ndotv)) * r.x + r.y; + vec2 env = vec2(-1.04, 1.04) * a004 + r.zw; + specular_light *= env.x * F + env.y; #endif - } + } #ifdef USE_LIGHTMAP - //ambient light will come entirely from lightmap is lightmap is used - ambient_light = texture2D(lightmap, uv2_interp).rgb * lightmap_energy; + //ambient light will come entirely from lightmap is lightmap is used + ambient_light = texture2D(lightmap, uv2_interp).rgb * lightmap_energy; #endif #ifdef USE_LIGHTMAP_CAPTURE - { - vec3 cone_dirs[12] = vec3[]( - vec3(0.0, 0.0, 1.0), - vec3(0.866025, 0.0, 0.5), - vec3(0.267617, 0.823639, 0.5), - vec3(-0.700629, 0.509037, 0.5), - vec3(-0.700629, -0.509037, 0.5), - vec3(0.267617, -0.823639, 0.5), - vec3(0.0, 0.0, -1.0), - vec3(0.866025, 0.0, -0.5), - vec3(0.267617, 0.823639, -0.5), - vec3(-0.700629, 0.509037, -0.5), - vec3(-0.700629, -0.509037, -0.5), - vec3(0.267617, -0.823639, -0.5)); - - vec3 local_normal = normalize(camera_matrix * vec4(normal, 0.0)).xyz; - vec4 captured = vec4(0.0); - float sum = 0.0; - for (int i = 0; i < 12; i++) { - float amount = max(0.0, dot(local_normal, cone_dirs[i])); //not correct, but creates a nice wrap around effect - captured += lightmap_captures[i] * amount; - sum += amount; - } + { + vec3 cone_dirs[12] = vec3[]( + vec3(0.0, 0.0, 1.0), + vec3(0.866025, 0.0, 0.5), + vec3(0.267617, 0.823639, 0.5), + vec3(-0.700629, 0.509037, 0.5), + vec3(-0.700629, -0.509037, 0.5), + vec3(0.267617, -0.823639, 0.5), + vec3(0.0, 0.0, -1.0), + vec3(0.866025, 0.0, -0.5), + vec3(0.267617, 0.823639, -0.5), + vec3(-0.700629, 0.509037, -0.5), + vec3(-0.700629, -0.509037, -0.5), + vec3(0.267617, -0.823639, -0.5)); + + vec3 local_normal = normalize(camera_matrix * vec4(normal, 0.0)).xyz; + vec4 captured = vec4(0.0); + float sum = 0.0; + for (int i = 0; i < 12; i++) { + float amount = max(0.0, dot(local_normal, cone_dirs[i])); //not correct, but creates a nice wrap around effect + captured += lightmap_captures[i] * amount; + sum += amount; + } - captured /= sum; + captured /= sum; - if (lightmap_capture_sky) { - ambient_light = mix(ambient_light, captured.rgb, captured.a); - } else { - ambient_light = captured.rgb; + if (lightmap_capture_sky) { + ambient_light = mix(ambient_light, captured.rgb, captured.a); + } else { + ambient_light = captured.rgb; + } } - } #endif - + } #endif //BASE PASS // diff --git a/drivers/gles3/rasterizer_canvas_gles3.cpp b/drivers/gles3/rasterizer_canvas_gles3.cpp index edffe852a2..55d16a6c2e 100644 --- a/drivers/gles3/rasterizer_canvas_gles3.cpp +++ b/drivers/gles3/rasterizer_canvas_gles3.cpp @@ -128,7 +128,7 @@ void RasterizerCanvasGLES3::light_internal_update(RID p_rid, Light *p_light) { li->ubo_data.shadow_distance_mult = (p_light->radius_cache * 1.1); glBindBuffer(GL_UNIFORM_BUFFER, li->ubo); - glBufferSubData(GL_UNIFORM_BUFFER, 0, sizeof(LightInternal::UBOData), &li->ubo_data); + glBufferData(GL_UNIFORM_BUFFER, sizeof(LightInternal::UBOData), &li->ubo_data, GL_DYNAMIC_DRAW); glBindBuffer(GL_UNIFORM_BUFFER, 0); } @@ -326,6 +326,12 @@ void RasterizerCanvasGLES3::_draw_polygon(const int *p_indices, int p_index_coun glBindVertexArray(data.polygon_buffer_pointer_array); glBindBuffer(GL_ARRAY_BUFFER, data.polygon_buffer); +#ifndef GLES_OVER_GL + // Orphan the buffers to avoid CPU/GPU sync points caused by glBufferSubData + glBufferData(GL_ARRAY_BUFFER, data.polygon_buffer_size, NULL, GL_DYNAMIC_DRAW); + glBufferData(GL_ELEMENT_ARRAY_BUFFER, data.polygon_index_buffer_size, NULL, GL_DYNAMIC_DRAW); +#endif + uint32_t buffer_ofs = 0; //vertex @@ -417,6 +423,12 @@ void RasterizerCanvasGLES3::_draw_generic(GLuint p_primitive, int p_vertex_count glBindVertexArray(data.polygon_buffer_pointer_array); glBindBuffer(GL_ARRAY_BUFFER, data.polygon_buffer); +#ifndef GLES_OVER_GL + // Orphan the buffers to avoid CPU/GPU sync points caused by glBufferSubData + glBufferData(GL_ARRAY_BUFFER, data.polygon_buffer_size, NULL, GL_DYNAMIC_DRAW); + glBufferData(GL_ELEMENT_ARRAY_BUFFER, data.polygon_index_buffer_size, NULL, GL_DYNAMIC_DRAW); +#endif + uint32_t buffer_ofs = 0; //vertex @@ -508,6 +520,11 @@ void RasterizerCanvasGLES3::_draw_gui_primitive(int p_points, const Vector2 *p_v } glBindBuffer(GL_ARRAY_BUFFER, data.polygon_buffer); +#ifndef GLES_OVER_GL + // Orphan the buffer to avoid CPU/GPU sync points caused by glBufferSubData + glBufferData(GL_ARRAY_BUFFER, data.polygon_buffer_size, NULL, GL_DYNAMIC_DRAW); +#endif + //TODO the below call may need to be replaced with: glBufferSubData(GL_ARRAY_BUFFER, 0, p_points * stride * 4 * sizeof(float), &b[0]); glBufferSubData(GL_ARRAY_BUFFER, 0, p_points * stride * 4, &b[0]); glBindVertexArray(data.polygon_buffer_quad_arrays[version]); glDrawArrays(prim[p_points], 0, p_points); @@ -1882,7 +1899,7 @@ void RasterizerCanvasGLES3::reset_canvas() { state.canvas_item_ubo_data.time = storage->frame.time[0]; glBindBuffer(GL_UNIFORM_BUFFER, state.canvas_item_ubo); - glBufferSubData(GL_UNIFORM_BUFFER, 0, sizeof(CanvasItemUBO), &state.canvas_item_ubo_data); + glBufferData(GL_UNIFORM_BUFFER, sizeof(CanvasItemUBO), &state.canvas_item_ubo_data, GL_DYNAMIC_DRAW); glBindBuffer(GL_UNIFORM_BUFFER, 0); state.canvas_texscreen_used = false; @@ -2109,6 +2126,8 @@ void RasterizerCanvasGLES3::initialize() { glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, data.polygon_index_buffer); glBufferData(GL_ELEMENT_ARRAY_BUFFER, index_size, NULL, GL_DYNAMIC_DRAW); //allocate max size glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); + + data.polygon_index_buffer_size = index_size; } store_transform(Transform(), state.canvas_item_ubo_data.projection_matrix); diff --git a/drivers/gles3/rasterizer_canvas_gles3.h b/drivers/gles3/rasterizer_canvas_gles3.h index bf5ef30820..382b1e5640 100644 --- a/drivers/gles3/rasterizer_canvas_gles3.h +++ b/drivers/gles3/rasterizer_canvas_gles3.h @@ -64,6 +64,7 @@ public: GLuint particle_quad_array; uint32_t polygon_buffer_size; + uint32_t polygon_index_buffer_size; } data; diff --git a/drivers/gles3/rasterizer_scene_gles3.cpp b/drivers/gles3/rasterizer_scene_gles3.cpp index 519fdf2b3b..9815936d1e 100644 --- a/drivers/gles3/rasterizer_scene_gles3.cpp +++ b/drivers/gles3/rasterizer_scene_gles3.cpp @@ -2011,7 +2011,7 @@ void RasterizerSceneGLES3::_set_cull(bool p_front, bool p_disabled, bool p_rever } } -void RasterizerSceneGLES3::_render_list(RenderList::Element **p_elements, int p_element_count, const Transform &p_view_transform, const CameraMatrix &p_projection, GLuint p_base_env, bool p_reverse_cull, bool p_alpha_pass, bool p_shadow, bool p_directional_add, bool p_directional_shadows) { +void RasterizerSceneGLES3::_render_list(RenderList::Element **p_elements, int p_element_count, const Transform &p_view_transform, const CameraMatrix &p_projection, RasterizerStorageGLES3::Sky *p_sky, bool p_reverse_cull, bool p_alpha_pass, bool p_shadow, bool p_directional_add, bool p_directional_shadows) { glBindBufferBase(GL_UNIFORM_BUFFER, 0, state.scene_ubo); //bind globals ubo @@ -2019,14 +2019,15 @@ void RasterizerSceneGLES3::_render_list(RenderList::Element **p_elements, int p_ if (!p_shadow && !p_directional_add) { glBindBufferBase(GL_UNIFORM_BUFFER, 2, state.env_radiance_ubo); //bind environment radiance info - if (p_base_env) { + if (p_sky != NULL) { glActiveTexture(GL_TEXTURE0 + storage->config.max_texture_image_units - 2); if (storage->config.use_texture_array_environment) { - glBindTexture(GL_TEXTURE_2D_ARRAY, p_base_env); + glBindTexture(GL_TEXTURE_2D_ARRAY, p_sky->radiance); } else { - glBindTexture(GL_TEXTURE_2D, p_base_env); + glBindTexture(GL_TEXTURE_2D, p_sky->radiance); } - + glActiveTexture(GL_TEXTURE0 + storage->config.max_texture_image_units - 6); + glBindTexture(GL_TEXTURE_2D, p_sky->irradiance); state.scene_shader.set_conditional(SceneShaderGLES3::USE_RADIANCE_MAP, true); state.scene_shader.set_conditional(SceneShaderGLES3::USE_RADIANCE_MAP_ARRAY, storage->config.use_texture_array_environment); use_radiance_map = true; @@ -2550,7 +2551,7 @@ void RasterizerSceneGLES3::_draw_sky(RasterizerStorageGLES3::Sky *p_sky, const C } glBindBuffer(GL_ARRAY_BUFFER, state.sky_verts); - glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(Vector3) * 8, vertices); + glBufferData(GL_ARRAY_BUFFER, sizeof(Vector3) * 8, vertices, GL_DYNAMIC_DRAW); glBindBuffer(GL_ARRAY_BUFFER, 0); //unbind glBindVertexArray(state.sky_array); @@ -2690,7 +2691,7 @@ void RasterizerSceneGLES3::_setup_environment(Environment *env, const CameraMatr } glBindBuffer(GL_UNIFORM_BUFFER, state.scene_ubo); - glBufferSubData(GL_UNIFORM_BUFFER, 0, sizeof(State::SceneDataUBO), &state.ubo_data); + glBufferData(GL_UNIFORM_BUFFER, sizeof(State::SceneDataUBO), &state.ubo_data, GL_DYNAMIC_DRAW); glBindBuffer(GL_UNIFORM_BUFFER, 0); //fill up environment @@ -2698,7 +2699,7 @@ void RasterizerSceneGLES3::_setup_environment(Environment *env, const CameraMatr store_transform(sky_orientation * p_cam_transform, state.env_radiance_data.transform); glBindBuffer(GL_UNIFORM_BUFFER, state.env_radiance_ubo); - glBufferSubData(GL_UNIFORM_BUFFER, 0, sizeof(State::EnvironmentRadianceUBO), &state.env_radiance_data); + glBufferData(GL_UNIFORM_BUFFER, sizeof(State::EnvironmentRadianceUBO), &state.env_radiance_data, GL_DYNAMIC_DRAW); glBindBuffer(GL_UNIFORM_BUFFER, 0); } @@ -2808,7 +2809,7 @@ void RasterizerSceneGLES3::_setup_directional_light(int p_index, const Transform } glBindBuffer(GL_UNIFORM_BUFFER, state.directional_ubo); - glBufferSubData(GL_UNIFORM_BUFFER, 0, sizeof(LightDataUBO), &ubo_data); + glBufferData(GL_UNIFORM_BUFFER, sizeof(LightDataUBO), &ubo_data, GL_DYNAMIC_DRAW); glBindBuffer(GL_UNIFORM_BUFFER, 0); directional_light = li; @@ -4231,7 +4232,7 @@ void RasterizerSceneGLES3::render_scene(const Transform &p_cam_transform, const _fill_render_list(p_cull_result, p_cull_count, true, false); render_list.sort_by_key(false); state.scene_shader.set_conditional(SceneShaderGLES3::RENDER_DEPTH, true); - _render_list(render_list.elements, render_list.element_count, p_cam_transform, p_cam_projection, 0, false, false, true, false, false); + _render_list(render_list.elements, render_list.element_count, p_cam_transform, p_cam_projection, NULL, false, false, true, false, false); state.scene_shader.set_conditional(SceneShaderGLES3::RENDER_DEPTH, false); glColorMask(1, 1, 1, 1); @@ -4355,7 +4356,6 @@ void RasterizerSceneGLES3::render_scene(const Transform &p_cam_transform, const RasterizerStorageGLES3::Sky *sky = NULL; Ref<CameraFeed> feed; - GLuint env_radiance_tex = 0; if (state.debug_draw == VS::VIEWPORT_DEBUG_DRAW_OVERDRAW) { clear_color = Color(0, 0, 0, 0); @@ -4409,9 +4409,6 @@ void RasterizerSceneGLES3::render_scene(const Transform &p_cam_transform, const sky = storage->sky_owner.getornull(env->sky); - if (sky) { - env_radiance_tex = sky->radiance; - } break; case VS::ENV_BG_CANVAS: //copy canvas to 3d buffer and convert it to linear @@ -4505,7 +4502,7 @@ void RasterizerSceneGLES3::render_scene(const Transform &p_cam_transform, const } if (probe && probe->probe_ptr->interior) { - env_radiance_tex = 0; //for rendering probe interiors, radiance must not be used. + sky = NULL; //for rendering probe interiors, radiance must not be used. } state.texscreen_copied = false; @@ -4524,7 +4521,7 @@ void RasterizerSceneGLES3::render_scene(const Transform &p_cam_transform, const if (state.directional_light_count == 0) { directional_light = NULL; - _render_list(render_list.elements, render_list.element_count, p_cam_transform, p_cam_projection, env_radiance_tex, false, false, false, false, shadow_atlas != NULL); + _render_list(render_list.elements, render_list.element_count, p_cam_transform, p_cam_projection, sky, false, false, false, false, shadow_atlas != NULL); } else { for (int i = 0; i < state.directional_light_count; i++) { directional_light = directional_lights[i]; @@ -4532,7 +4529,7 @@ void RasterizerSceneGLES3::render_scene(const Transform &p_cam_transform, const glEnable(GL_BLEND); } _setup_directional_light(i, p_cam_transform.affine_inverse(), shadow_atlas != NULL && shadow_atlas->size > 0); - _render_list(render_list.elements, render_list.element_count, p_cam_transform, p_cam_projection, env_radiance_tex, false, false, false, i > 0, shadow_atlas != NULL); + _render_list(render_list.elements, render_list.element_count, p_cam_transform, p_cam_projection, sky, false, false, false, i > 0, shadow_atlas != NULL); } } @@ -4610,12 +4607,12 @@ void RasterizerSceneGLES3::render_scene(const Transform &p_cam_transform, const if (state.directional_light_count == 0) { directional_light = NULL; - _render_list(&render_list.elements[render_list.max_elements - render_list.alpha_element_count], render_list.alpha_element_count, p_cam_transform, p_cam_projection, env_radiance_tex, false, true, false, false, shadow_atlas != NULL); + _render_list(&render_list.elements[render_list.max_elements - render_list.alpha_element_count], render_list.alpha_element_count, p_cam_transform, p_cam_projection, sky, false, true, false, false, shadow_atlas != NULL); } else { for (int i = 0; i < state.directional_light_count; i++) { directional_light = directional_lights[i]; _setup_directional_light(i, p_cam_transform.affine_inverse(), shadow_atlas != NULL && shadow_atlas->size > 0); - _render_list(&render_list.elements[render_list.max_elements - render_list.alpha_element_count], render_list.alpha_element_count, p_cam_transform, p_cam_projection, env_radiance_tex, false, true, false, i > 0, shadow_atlas != NULL); + _render_list(&render_list.elements[render_list.max_elements - render_list.alpha_element_count], render_list.alpha_element_count, p_cam_transform, p_cam_projection, sky, false, true, false, i > 0, shadow_atlas != NULL); } } @@ -4898,7 +4895,7 @@ void RasterizerSceneGLES3::render_shadow(RID p_light, RID p_shadow_atlas, int p_ if (light->reverse_cull) { flip_facing = !flip_facing; } - _render_list(render_list.elements, render_list.element_count, light_transform, light_projection, 0, flip_facing, false, true, false, false); + _render_list(render_list.elements, render_list.element_count, light_transform, light_projection, NULL, flip_facing, false, true, false, false); state.scene_shader.set_conditional(SceneShaderGLES3::RENDER_DEPTH, false); state.scene_shader.set_conditional(SceneShaderGLES3::RENDER_DEPTH_DUAL_PARABOLOID, false); diff --git a/drivers/gles3/rasterizer_scene_gles3.h b/drivers/gles3/rasterizer_scene_gles3.h index e6d2449653..a756ce251e 100644 --- a/drivers/gles3/rasterizer_scene_gles3.h +++ b/drivers/gles3/rasterizer_scene_gles3.h @@ -837,7 +837,7 @@ public: _FORCE_INLINE_ void _render_geometry(RenderList::Element *e); _FORCE_INLINE_ void _setup_light(RenderList::Element *e, const Transform &p_view_transform); - void _render_list(RenderList::Element **p_elements, int p_element_count, const Transform &p_view_transform, const CameraMatrix &p_projection, GLuint p_base_env, bool p_reverse_cull, bool p_alpha_pass, bool p_shadow, bool p_directional_add, bool p_directional_shadows); + void _render_list(RenderList::Element **p_elements, int p_element_count, const Transform &p_view_transform, const CameraMatrix &p_projection, RasterizerStorageGLES3::Sky *p_sky, bool p_reverse_cull, bool p_alpha_pass, bool p_shadow, bool p_directional_add, bool p_directional_shadows); _FORCE_INLINE_ void _add_geometry(RasterizerStorageGLES3::Geometry *p_geometry, InstanceBase *p_instance, RasterizerStorageGLES3::GeometryOwner *p_owner, int p_material, bool p_depth_pass, bool p_shadow_pass); diff --git a/drivers/gles3/rasterizer_storage_gles3.cpp b/drivers/gles3/rasterizer_storage_gles3.cpp index 71737426a9..07d7416905 100644 --- a/drivers/gles3/rasterizer_storage_gles3.cpp +++ b/drivers/gles3/rasterizer_storage_gles3.cpp @@ -1757,6 +1757,7 @@ RID RasterizerStorageGLES3::sky_create() { Sky *sky = memnew(Sky); sky->radiance = 0; + sky->irradiance = 0; return sky_owner.make_rid(sky); } @@ -1768,7 +1769,9 @@ void RasterizerStorageGLES3::sky_set_texture(RID p_sky, RID p_panorama, int p_ra if (sky->panorama.is_valid()) { sky->panorama = RID(); glDeleteTextures(1, &sky->radiance); + glDeleteTextures(1, &sky->irradiance); sky->radiance = 0; + sky->irradiance = 0; } sky->panorama = p_panorama; @@ -1791,10 +1794,22 @@ void RasterizerStorageGLES3::sky_set_texture(RID p_sky, RID p_panorama, int p_ra glActiveTexture(GL_TEXTURE0); glBindTexture(texture->target, texture->tex_id); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); //need this for proper sampling + glTexParameteri(texture->target, GL_TEXTURE_BASE_LEVEL, 0); +#ifdef GLES_OVER_GL + glTexParameteri(texture->target, GL_TEXTURE_MAX_LEVEL, int(Math::floor(Math::log(float(texture->width)) / Math::log(2.0f)))); + glGenerateMipmap(texture->target); +#else + glTexParameteri(texture->target, GL_TEXTURE_MAX_LEVEL, 0); +#endif + // Need Mipmaps regardless of whether they are set in import by user + glTexParameterf(texture->target, GL_TEXTURE_WRAP_S, GL_REPEAT); + glTexParameterf(texture->target, GL_TEXTURE_WRAP_T, GL_REPEAT); +#ifdef GLES_OVER_GL + glTexParameterf(texture->target, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); +#else + glTexParameterf(texture->target, GL_TEXTURE_MIN_FILTER, GL_LINEAR); +#endif + glTexParameterf(texture->target, GL_TEXTURE_MAG_FILTER, GL_LINEAR); if (config.srgb_decode_supported && texture->srgb && !texture->using_srgb) { @@ -1808,6 +1823,66 @@ void RasterizerStorageGLES3::sky_set_texture(RID p_sky, RID p_panorama, int p_ra #endif } + { + //Irradiance map + glActiveTexture(GL_TEXTURE1); + glGenTextures(1, &sky->irradiance); + glBindTexture(GL_TEXTURE_2D, sky->irradiance); + + GLuint tmp_fb; + + glGenFramebuffers(1, &tmp_fb); + glBindFramebuffer(GL_FRAMEBUFFER, tmp_fb); + + int size = 64; + + bool use_float = config.framebuffer_half_float_supported; + + GLenum internal_format = use_float ? GL_RGBA16F : GL_RGB10_A2; + GLenum format = GL_RGBA; + GLenum type = use_float ? GL_HALF_FLOAT : GL_UNSIGNED_INT_2_10_10_10_REV; + + glTexImage2D(GL_TEXTURE_2D, 0, internal_format, size, size * 2, 0, format, type, NULL); + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0); + glTexParameterf(texture->target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameterf(texture->target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, sky->irradiance, 0); + + shaders.cubemap_filter.set_conditional(CubemapFilterShaderGLES3::USE_DUAL_PARABOLOID, true); + shaders.cubemap_filter.set_conditional(CubemapFilterShaderGLES3::USE_SOURCE_PANORAMA, true); + shaders.cubemap_filter.set_conditional(CubemapFilterShaderGLES3::COMPUTE_IRRADIANCE, true); + shaders.cubemap_filter.bind(); + + // Very large Panoramas require way too much effort to compute irradiance so use a mipmap + // level that corresponds to a panorama of 1024x512 + shaders.cubemap_filter.set_uniform(CubemapFilterShaderGLES3::SOURCE_MIP_LEVEL, MAX(Math::floor(Math::log(float(texture->width)) / Math::log(2.0f)) - 10.0f, 0.0f)); + + for (int i = 0; i < 2; i++) { + glViewport(0, i * size, size, size); + glBindVertexArray(resources.quadie_array); + + shaders.cubemap_filter.set_uniform(CubemapFilterShaderGLES3::Z_FLIP, i > 0); + + glDrawArrays(GL_TRIANGLE_FAN, 0, 4); + glBindVertexArray(0); + } + + shaders.cubemap_filter.set_conditional(CubemapFilterShaderGLES3::USE_DUAL_PARABOLOID, false); + shaders.cubemap_filter.set_conditional(CubemapFilterShaderGLES3::USE_SOURCE_PANORAMA, false); + shaders.cubemap_filter.set_conditional(CubemapFilterShaderGLES3::COMPUTE_IRRADIANCE, false); + + glBindFramebuffer(GL_FRAMEBUFFER, RasterizerStorageGLES3::system_fbo); + glDeleteFramebuffers(1, &tmp_fb); + } + + // Now compute radiance + glActiveTexture(GL_TEXTURE1); glGenTextures(1, &sky->radiance); @@ -1833,8 +1908,8 @@ void RasterizerStorageGLES3::sky_set_texture(RID p_sky, RID p_panorama, int p_ra glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, internal_format, size, size * 2, array_level, 0, format, type, NULL); - glTexParameterf(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glTexParameterf(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameterf(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameterf(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_LINEAR); GLuint tmp_fb2; GLuint tmp_tex; @@ -1846,8 +1921,8 @@ void RasterizerStorageGLES3::sky_set_texture(RID p_sky, RID p_panorama, int p_ra glBindTexture(GL_TEXTURE_2D, tmp_tex); glTexImage2D(GL_TEXTURE_2D, 0, internal_format, size, size * 2, 0, format, type, NULL); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tmp_tex, 0); - glTexParameterf(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glTexParameterf(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); #ifdef DEBUG_ENABLED GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); ERR_FAIL_COND(status != GL_FRAMEBUFFER_COMPLETE); @@ -1858,25 +1933,29 @@ void RasterizerStorageGLES3::sky_set_texture(RID p_sky, RID p_panorama, int p_ra glBindFramebuffer(GL_FRAMEBUFFER, tmp_fb2); +#ifdef GLES_OVER_GL + if (j < 3) { +#else if (j == 0) { +#endif shaders.cubemap_filter.set_conditional(CubemapFilterShaderGLES3::USE_DUAL_PARABOLOID, true); shaders.cubemap_filter.set_conditional(CubemapFilterShaderGLES3::USE_SOURCE_PANORAMA, true); - shaders.cubemap_filter.set_conditional(CubemapFilterShaderGLES3::USE_DIRECT_WRITE, true); shaders.cubemap_filter.set_conditional(CubemapFilterShaderGLES3::USE_SOURCE_DUAL_PARABOLOID_ARRAY, false); shaders.cubemap_filter.bind(); glActiveTexture(GL_TEXTURE0); glBindTexture(texture->target, texture->tex_id); + shaders.cubemap_filter.set_uniform(CubemapFilterShaderGLES3::SOURCE_RESOLUTION, float(texture->width / 4)); } else { shaders.cubemap_filter.set_conditional(CubemapFilterShaderGLES3::USE_DUAL_PARABOLOID, true); shaders.cubemap_filter.set_conditional(CubemapFilterShaderGLES3::USE_SOURCE_PANORAMA, false); shaders.cubemap_filter.set_conditional(CubemapFilterShaderGLES3::USE_SOURCE_DUAL_PARABOLOID_ARRAY, true); - shaders.cubemap_filter.set_conditional(CubemapFilterShaderGLES3::USE_DIRECT_WRITE, false); shaders.cubemap_filter.bind(); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D_ARRAY, sky->radiance); shaders.cubemap_filter.set_uniform(CubemapFilterShaderGLES3::SOURCE_ARRAY_INDEX, j - 1); //read from previous to ensure better blur + shaders.cubemap_filter.set_uniform(CubemapFilterShaderGLES3::SOURCE_RESOLUTION, float(size / 2)); } for (int i = 0; i < 2; i++) { @@ -1902,7 +1981,6 @@ void RasterizerStorageGLES3::sky_set_texture(RID p_sky, RID p_panorama, int p_ra shaders.cubemap_filter.set_conditional(CubemapFilterShaderGLES3::USE_SOURCE_PANORAMA, false); shaders.cubemap_filter.set_conditional(CubemapFilterShaderGLES3::USE_DUAL_PARABOLOID, false); shaders.cubemap_filter.set_conditional(CubemapFilterShaderGLES3::USE_SOURCE_DUAL_PARABOLOID_ARRAY, false); - shaders.cubemap_filter.set_conditional(CubemapFilterShaderGLES3::USE_DIRECT_WRITE, false); //restore ranges glActiveTexture(GL_TEXTURE0); @@ -1947,23 +2025,68 @@ void RasterizerStorageGLES3::sky_set_texture(RID p_sky, RID p_panorama, int p_ra glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, mipmaps - 1); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + + GLuint tmp_fb2; + GLuint tmp_tex; + { + // Need a temporary framebuffer for rendering so we can read from previous iterations + glGenFramebuffers(1, &tmp_fb2); + glBindFramebuffer(GL_FRAMEBUFFER, tmp_fb2); + glGenTextures(1, &tmp_tex); + glBindTexture(GL_TEXTURE_2D, tmp_tex); + glTexImage2D(GL_TEXTURE_2D, 0, internal_format, size, size * 2, 0, format, type, NULL); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tmp_tex, 0); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); +#ifdef DEBUG_ENABLED + GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); + ERR_FAIL_COND(status != GL_FRAMEBUFFER_COMPLETE); +#endif + } lod = 0; mm_level = mipmaps; size = p_radiance_size; - shaders.cubemap_filter.set_conditional(CubemapFilterShaderGLES3::USE_DUAL_PARABOLOID, true); - shaders.cubemap_filter.set_conditional(CubemapFilterShaderGLES3::USE_SOURCE_PANORAMA, true); - shaders.cubemap_filter.bind(); - while (mm_level) { - + glBindFramebuffer(GL_FRAMEBUFFER, tmp_fb); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, sky->radiance, lod); + #ifdef DEBUG_ENABLED GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); ERR_CONTINUE(status != GL_FRAMEBUFFER_COMPLETE); #endif + glBindTexture(GL_TEXTURE_2D, tmp_tex); + glTexImage2D(GL_TEXTURE_2D, 0, internal_format, size, size * 2, 0, format, type, NULL); + glBindFramebuffer(GL_FRAMEBUFFER, tmp_fb2); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tmp_tex, 0); +#ifdef GLES_OVER_GL + if (lod < 3) { +#else + if (lod == 0) { +#endif + + shaders.cubemap_filter.set_conditional(CubemapFilterShaderGLES3::USE_DUAL_PARABOLOID, true); + shaders.cubemap_filter.set_conditional(CubemapFilterShaderGLES3::USE_SOURCE_PANORAMA, true); + shaders.cubemap_filter.set_conditional(CubemapFilterShaderGLES3::USE_SOURCE_DUAL_PARABOLOID, false); + shaders.cubemap_filter.bind(); + glActiveTexture(GL_TEXTURE0); + glBindTexture(texture->target, texture->tex_id); + shaders.cubemap_filter.set_uniform(CubemapFilterShaderGLES3::SOURCE_RESOLUTION, float(texture->width / 4)); + } else { + + shaders.cubemap_filter.set_conditional(CubemapFilterShaderGLES3::USE_DUAL_PARABOLOID, true); + shaders.cubemap_filter.set_conditional(CubemapFilterShaderGLES3::USE_SOURCE_PANORAMA, false); + shaders.cubemap_filter.set_conditional(CubemapFilterShaderGLES3::USE_SOURCE_DUAL_PARABOLOID, true); + shaders.cubemap_filter.bind(); + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, sky->radiance); + shaders.cubemap_filter.set_uniform(CubemapFilterShaderGLES3::SOURCE_MIP_LEVEL, float(lod - 1)); //read from previous to ensure better blur + shaders.cubemap_filter.set_uniform(CubemapFilterShaderGLES3::SOURCE_RESOLUTION, float(size)); + } for (int i = 0; i < 2; i++) { glViewport(0, i * size, size, size); @@ -1976,6 +2099,14 @@ void RasterizerStorageGLES3::sky_set_texture(RID p_sky, RID p_panorama, int p_ra glBindVertexArray(0); } + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, tmp_fb); + glFramebufferTextureLayer(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, sky->radiance, 0, lod); + glBindFramebuffer(GL_READ_FRAMEBUFFER, tmp_fb2); + glReadBuffer(GL_COLOR_ATTACHMENT0); + glBlitFramebuffer(0, 0, size, size * 2, 0, 0, size, size * 2, GL_COLOR_BUFFER_BIT, GL_NEAREST); + glBindFramebuffer(GL_READ_FRAMEBUFFER, 0); + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); + if (size > 1) size >>= 1; lod++; @@ -1995,6 +2126,8 @@ void RasterizerStorageGLES3::sky_set_texture(RID p_sky, RID p_panorama, int p_ra glBindFramebuffer(GL_FRAMEBUFFER, RasterizerStorageGLES3::system_fbo); glDeleteFramebuffers(1, &tmp_fb); + glDeleteFramebuffers(1, &tmp_fb2); + glDeleteTextures(1, &tmp_tex); } } @@ -3099,7 +3232,7 @@ void RasterizerStorageGLES3::_update_material(Material *material) { } glBindBuffer(GL_UNIFORM_BUFFER, material->ubo_id); - glBufferSubData(GL_UNIFORM_BUFFER, 0, material->ubo_size, local_ubo); + glBufferData(GL_UNIFORM_BUFFER, material->ubo_size, local_ubo, GL_STATIC_DRAW); glBindBuffer(GL_UNIFORM_BUFFER, 0); } diff --git a/drivers/gles3/rasterizer_storage_gles3.h b/drivers/gles3/rasterizer_storage_gles3.h index 3b1021d0e1..350b259b2b 100644 --- a/drivers/gles3/rasterizer_storage_gles3.h +++ b/drivers/gles3/rasterizer_storage_gles3.h @@ -388,6 +388,7 @@ public: RID panorama; GLuint radiance; + GLuint irradiance; int radiance_size; }; diff --git a/drivers/gles3/shaders/cubemap_filter.glsl b/drivers/gles3/shaders/cubemap_filter.glsl index 619e29b130..f94ac8c81c 100644 --- a/drivers/gles3/shaders/cubemap_filter.glsl +++ b/drivers/gles3/shaders/cubemap_filter.glsl @@ -30,12 +30,22 @@ uniform sampler2DArray source_dual_paraboloid_array; //texunit:0 uniform int source_array_index; #endif -#if !defined(USE_SOURCE_DUAL_PARABOLOID_ARRAY) && !defined(USE_SOURCE_PANORAMA) +#ifdef USE_SOURCE_DUAL_PARABOLOID +uniform sampler2D source_dual_paraboloid; //texunit:0 +#endif + +#if defined(USE_SOURCE_DUAL_PARABOLOID) || defined(COMPUTE_IRRADIANCE) +uniform float source_mip_level; +#endif + +#if !defined(USE_SOURCE_DUAL_PARABOLOID_ARRAY) && !defined(USE_SOURCE_PANORAMA) && !defined(USE_SOURCE_DUAL_PARABOLOID) uniform samplerCube source_cube; //texunit:0 #endif uniform int face_id; uniform float roughness; +uniform float source_resolution; + in highp vec2 uv_interp; layout(location = 0) out vec4 frag_color; @@ -133,6 +143,19 @@ vec3 ImportanceSampleGGX(vec2 Xi, float Roughness, vec3 N) { return TangentX * H.x + TangentY * H.y + N * H.z; } +float DistributionGGX(vec3 N, vec3 H, float roughness) { + float a = roughness * roughness; + float a2 = a * a; + float NdotH = max(dot(N, H), 0.0); + float NdotH2 = NdotH * NdotH; + + float nom = a2; + float denom = (NdotH2 * (a2 - 1.0) + 1.0); + denom = M_PI * denom * denom; + + return nom / denom; +} + // http://graphicrants.blogspot.com.au/2013/08/specular-brdf-reference.html float GGX(float NdotV, float a) { float k = a / 2.0; @@ -160,10 +183,12 @@ vec2 Hammersley(uint i, uint N) { #ifdef LOW_QUALITY #define SAMPLE_COUNT 64u +#define SAMPLE_DELTA 0.05 #else -#define SAMPLE_COUNT 1024u +#define SAMPLE_COUNT 512u +#define SAMPLE_DELTA 0.01 #endif @@ -171,7 +196,7 @@ uniform bool z_flip; #ifdef USE_SOURCE_PANORAMA -vec4 texturePanorama(vec3 normal, sampler2D pano) { +vec4 texturePanorama(vec3 normal, sampler2D pano, float mipLevel) { vec2 st = vec2( atan(normal.x, normal.z), @@ -182,7 +207,7 @@ vec4 texturePanorama(vec3 normal, sampler2D pano) { st /= vec2(M_PI * 2.0, M_PI); - return textureLod(pano, st, 0.0); + return textureLod(pano, st, mipLevel); } #endif @@ -202,6 +227,20 @@ vec4 textureDualParaboloidArray(vec3 normal) { #endif +#ifdef USE_SOURCE_DUAL_PARABOLOID +vec4 textureDualParaboloid(vec3 normal) { + + vec3 norm = normalize(normal); + norm.xy /= 1.0 + abs(norm.z); + norm.xy = norm.xy * vec2(0.5, 0.25) + vec2(0.5, 0.25); + if (norm.z < 0.0) { + norm.y = 0.5 - norm.y + 0.5; + } + return textureLod(source_dual_paraboloid, norm.xy, source_mip_level); +} + +#endif + void main() { #ifdef USE_DUAL_PARABOLOID @@ -225,7 +264,7 @@ void main() { #ifdef USE_SOURCE_PANORAMA - frag_color = vec4(texturePanorama(N, source_panorama).rgb, 1.0); + frag_color = vec4(texturePanorama(N, source_panorama, 0.0).rgb, 1.0); #endif #ifdef USE_SOURCE_DUAL_PARABOLOID_ARRAY @@ -233,12 +272,51 @@ void main() { frag_color = vec4(textureDualParaboloidArray(N).rgb, 1.0); #endif -#if !defined(USE_SOURCE_DUAL_PARABOLOID_ARRAY) && !defined(USE_SOURCE_PANORAMA) +#ifdef USE_SOURCE_DUAL_PARABOLOID + + frag_color = vec4(textureDualParaboloid(N).rgb, 1.0); +#endif + +#if !defined(USE_SOURCE_DUAL_PARABOLOID_ARRAY) && !defined(USE_SOURCE_PANORAMA) && !defined(USE_SOURCE_DUAL_PARABOLOID) N.y = -N.y; frag_color = vec4(texture(N, source_cube).rgb, 1.0); #endif +#else // USE_DIRECT_WRITE + +#ifdef COMPUTE_IRRADIANCE + + vec3 irradiance = vec3(0.0); + + // tangent space calculation from origin point + vec3 UpVector = vec3(0.0, 1.0, 0.0); + vec3 TangentX = cross(UpVector, N); + vec3 TangentY = cross(N, TangentX); + + float num_samples = 0.0f; + + for (float phi = 0.0; phi < 2.0 * M_PI; phi += SAMPLE_DELTA) { + for (float theta = 0.0; theta < 0.5 * M_PI; theta += SAMPLE_DELTA) { + // Calculate sample positions + vec3 tangentSample = vec3(sin(theta) * cos(phi), sin(theta) * sin(phi), cos(theta)); + // Find world vector of sample position + vec3 H = tangentSample.x * TangentX + tangentSample.y * TangentY + tangentSample.z * N; + + vec2 st = vec2(atan(H.x, H.z), acos(H.y)); + if (st.x < 0.0) { + st.x += M_PI * 2.0; + } + st /= vec2(M_PI * 2.0, M_PI); + + irradiance += texture(source_panorama, st, source_mip_level).rgb * cos(theta) * sin(theta); + num_samples++; + } + } + irradiance = M_PI * irradiance * (1.0 / float(num_samples)); + + frag_color = vec4(irradiance, 1.0); + #else vec4 sum = vec4(0.0, 0.0, 0.0, 0.0); @@ -246,15 +324,26 @@ void main() { for (uint sampleNum = 0u; sampleNum < SAMPLE_COUNT; sampleNum++) { vec2 xi = Hammersley(sampleNum, SAMPLE_COUNT); - vec3 H = ImportanceSampleGGX(xi, roughness, N); + vec3 H = normalize(ImportanceSampleGGX(xi, roughness, N)); vec3 V = N; - vec3 L = (2.0 * dot(V, H) * H - V); + vec3 L = normalize(2.0 * dot(V, H) * H - V); - float ndotl = clamp(dot(N, L), 0.0, 1.0); + float ndotl = max(dot(N, L), 0.0); if (ndotl > 0.0) { + + float D = DistributionGGX(N, H, roughness); + float ndoth = max(dot(N, H), 0.0); + float hdotv = max(dot(H, V), 0.0); + float pdf = D * ndoth / (4.0 * hdotv) + 0.0001; + + float saTexel = 4.0 * M_PI / (6.0 * source_resolution * source_resolution); + float saSample = 1.0 / (float(SAMPLE_COUNT) * pdf + 0.0001); + + float mipLevel = roughness == 0.0 ? 0.0 : 0.5 * log2(saSample / saTexel); + #ifdef USE_SOURCE_PANORAMA - sum.rgb += texturePanorama(L, source_panorama).rgb * ndotl; + sum.rgb += texturePanorama(L, source_panorama, mipLevel).rgb * ndotl; #endif #ifdef USE_SOURCE_DUAL_PARABOLOID_ARRAY @@ -262,7 +351,12 @@ void main() { sum.rgb += textureDualParaboloidArray(L).rgb * ndotl; #endif -#if !defined(USE_SOURCE_DUAL_PARABOLOID_ARRAY) && !defined(USE_SOURCE_PANORAMA) +#ifdef USE_SOURCE_DUAL_PARABOLOID + + sum.rgb += textureDualParaboloid(L).rgb * ndotl; +#endif + +#if !defined(USE_SOURCE_DUAL_PARABOLOID_ARRAY) && !defined(USE_SOURCE_PANORAMA) && !defined(USE_SOURCE_DUAL_PARABOLOID) L.y = -L.y; sum.rgb += textureLod(source_cube, L, 0.0).rgb * ndotl; #endif @@ -273,5 +367,6 @@ void main() { frag_color = vec4(sum.rgb, 1.0); -#endif +#endif // COMPUTE_IRRADIANCE +#endif // USE_DIRECT_WRITE } diff --git a/drivers/gles3/shaders/scene.glsl b/drivers/gles3/shaders/scene.glsl index 403de25dd0..e1b0e9f595 100644 --- a/drivers/gles3/shaders/scene.glsl +++ b/drivers/gles3/shaders/scene.glsl @@ -627,6 +627,8 @@ layout(std140) uniform Radiance { // ubo:2 #define RADIANCE_MAX_LOD 5.0 +uniform sampler2D irradiance_map; // texunit:-6 + #ifdef USE_RADIANCE_MAP_ARRAY uniform sampler2DArray radiance_map; // texunit:-2 @@ -1766,6 +1768,11 @@ FRAGMENT_SHADER_CODE vec3 eye_vec = view; + // IBL precalculations + float ndotv = clamp(dot(normal, eye_vec), 0.0, 1.0); + vec3 f0 = F0(metallic, specular, albedo); + vec3 F = f0 + (max(vec3(1.0 - roughness), f0) - f0) * pow(1.0 - ndotv, 5.0); + #ifdef USE_RADIANCE_MAP #ifdef AMBIENT_LIGHT_DISABLED @@ -1775,22 +1782,27 @@ FRAGMENT_SHADER_CODE { //read radiance from dual paraboloid - vec3 ref_vec = reflect(-eye_vec, normal); //2.0 * ndotv * normal - view; // reflect(v, n); + vec3 ref_vec = reflect(-eye_vec, normal); ref_vec = normalize((radiance_inverse_xform * vec4(ref_vec, 0.0)).xyz); vec3 radiance = textureDualParaboloid(radiance_map, ref_vec, roughness) * bg_energy; env_reflection_light = radiance; } - //no longer a cubemap - //vec3 radiance = textureLod(radiance_cube, r, lod).xyz * ( brdf.x + brdf.y); } #ifndef USE_LIGHTMAP { - vec3 ambient_dir = normalize((radiance_inverse_xform * vec4(normal, 0.0)).xyz); - vec3 env_ambient = textureDualParaboloid(radiance_map, ambient_dir, 1.0) * bg_energy; + vec3 norm = normal; + norm = normalize((radiance_inverse_xform * vec4(norm, 0.0)).xyz); + norm.xy /= 1.0 + abs(norm.z); + norm.xy = norm.xy * vec2(0.5, 0.25) + vec2(0.5, 0.25); + if (norm.z > 0.0) { + norm.y = 0.5 - norm.y + 0.5; + } + + vec3 env_ambient = texture(irradiance_map, norm.xy).rgb * bg_energy; + env_ambient *= 1.0 - F; ambient_light = mix(ambient_light_color.rgb, env_ambient, radiance_ambient_contribution); - //ambient_light=vec3(0.0,0.0,0.0); } #endif #endif //AMBIENT_LIGHT_DISABLED @@ -1892,12 +1904,9 @@ FRAGMENT_SHADER_CODE const vec4 c0 = vec4(-1.0, -0.0275, -0.572, 0.022); const vec4 c1 = vec4(1.0, 0.0425, 1.04, -0.04); vec4 r = roughness * c0 + c1; - float ndotv = clamp(dot(normal, eye_vec), 0.0, 1.0); float a004 = min(r.x * r.x, exp2(-9.28 * ndotv)) * r.x + r.y; vec2 env = vec2(-1.04, 1.04) * a004 + r.zw; - - vec3 f0 = F0(metallic, specular, albedo); - specular_light *= env.x * f0 + env.y; + specular_light *= env.x * F + env.y; #endif } diff --git a/editor/animation_track_editor.cpp b/editor/animation_track_editor.cpp index 33f833afa4..40aa9a28b2 100644 --- a/editor/animation_track_editor.cpp +++ b/editor/animation_track_editor.cpp @@ -2026,7 +2026,7 @@ void AnimationTrackEdit::_notification(int p_what) { float offset = animation->track_get_key_time(track, i) - timeline->get_value(); if (editor->is_key_selected(track, i) && editor->is_moving_selection()) { - offset = editor->snap_time(offset + editor->get_moving_selection_offset()); + offset = editor->snap_time(offset + editor->get_moving_selection_offset(), true); } offset = offset * scale + limit; if (i < animation->track_get_key_count(track) - 1) { @@ -5703,7 +5703,7 @@ void AnimationTrackEditor::_selection_changed() { } } -float AnimationTrackEditor::snap_time(float p_value) { +float AnimationTrackEditor::snap_time(float p_value, bool p_relative) { if (is_snap_enabled()) { @@ -5713,7 +5713,12 @@ float AnimationTrackEditor::snap_time(float p_value) { else snap_increment = step->get_value(); - p_value = Math::stepify(p_value, snap_increment); + if (p_relative) { + double rel = Math::fmod(timeline->get_value(), snap_increment); + p_value = Math::stepify(p_value + rel, snap_increment) - rel; + } else { + p_value = Math::stepify(p_value, snap_increment); + } } return p_value; diff --git a/editor/animation_track_editor.h b/editor/animation_track_editor.h index fd28d8f4d1..ef6a769196 100644 --- a/editor/animation_track_editor.h +++ b/editor/animation_track_editor.h @@ -521,7 +521,7 @@ public: bool is_moving_selection() const; bool is_snap_enabled() const; float get_moving_selection_offset() const; - float snap_time(float p_value); + float snap_time(float p_value, bool p_relative = false); bool is_grouping_tracks(); MenuButton *get_edit_menu(); diff --git a/editor/doc/doc_data.h b/editor/doc/doc_data.h index 6d601f0dce..b722c324d6 100644 --- a/editor/doc/doc_data.h +++ b/editor/doc/doc_data.h @@ -78,6 +78,9 @@ public: bool operator<(const PropertyDoc &p_prop) const { return name < p_prop.name; } + PropertyDoc() { + overridden = false; + } }; struct ClassDoc { diff --git a/editor/editor_help_search.cpp b/editor/editor_help_search.cpp index 27e61362ed..517a1c34d1 100644 --- a/editor/editor_help_search.cpp +++ b/editor/editor_help_search.cpp @@ -170,7 +170,11 @@ void EditorHelpSearch::popup_dialog(const String &p_term) { if (p_term == "") { search_box->clear(); } else { - old_search = true; + if (old_term == p_term) + old_search = true; + else + old_term = p_term; + search_box->set_text(p_term); search_box->select_all(); } diff --git a/editor/editor_help_search.h b/editor/editor_help_search.h index 12ffd024a7..0be2f3419b 100644 --- a/editor/editor_help_search.h +++ b/editor/editor_help_search.h @@ -59,6 +59,7 @@ class EditorHelpSearch : public ConfirmationDialog { OptionButton *filter_combo; Tree *results_tree; bool old_search; + String old_term; class Runner; Ref<Runner> search; diff --git a/editor/editor_node.cpp b/editor/editor_node.cpp index ef382c0a19..ab41019ac3 100644 --- a/editor/editor_node.cpp +++ b/editor/editor_node.cpp @@ -6121,7 +6121,7 @@ EditorNode::EditorNode() { p = debug_menu->get_popup(); p->set_hide_on_window_lose_focus(true); - p->set_hide_on_item_selection(false); + p->set_hide_on_checkable_item_selection(false); p->add_check_shortcut(ED_SHORTCUT("editor/deploy_with_remote_debug", TTR("Deploy with Remote Debug")), RUN_DEPLOY_REMOTE_DEBUG); p->set_item_tooltip(p->get_item_count() - 1, TTR("When exporting or deploying, the resulting executable will attempt to connect to the IP of this computer in order to be debugged.")); p->add_check_shortcut(ED_SHORTCUT("editor/small_deploy_with_network_fs", TTR("Small Deploy with Network FS")), RUN_FILE_SERVER); diff --git a/editor/editor_profiler.cpp b/editor/editor_profiler.cpp index 471742948f..020cb3bada 100644 --- a/editor/editor_profiler.cpp +++ b/editor/editor_profiler.cpp @@ -88,14 +88,13 @@ void EditorProfiler::clear() { frame_metrics.resize(metric_size); last_metric = -1; variables->clear(); - //activate->set_pressed(false); plot_sigs.clear(); plot_sigs.insert("physics_frame_time"); plot_sigs.insert("category_frame_time"); updating_frame = true; cursor_metric_edit->set_min(0); - cursor_metric_edit->set_max(0); + cursor_metric_edit->set_max(100); // Doesn't make much sense, but we can't have min == max. Doesn't hurt. cursor_metric_edit->set_value(0); updating_frame = false; hover_metric = -1; diff --git a/editor/editor_sectioned_inspector.cpp b/editor/editor_sectioned_inspector.cpp index abff8190af..1993f24b24 100644 --- a/editor/editor_sectioned_inspector.cpp +++ b/editor/editor_sectioned_inspector.cpp @@ -177,7 +177,7 @@ String SectionedInspector::get_full_item_path(const String &p_item) { void SectionedInspector::edit(Object *p_object) { if (!p_object) { - obj = -1; + obj = 0; sections->clear(); filter->set_edited(NULL); @@ -308,7 +308,7 @@ EditorInspector *SectionedInspector::get_inspector() { } SectionedInspector::SectionedInspector() : - obj(-1), + obj(0), sections(memnew(Tree)), filter(memnew(SectionedInspectorFilter)), inspector(memnew(EditorInspector)), diff --git a/editor/editor_settings.cpp b/editor/editor_settings.cpp index a3a02dbd4c..87e8a53e94 100644 --- a/editor/editor_settings.cpp +++ b/editor/editor_settings.cpp @@ -727,6 +727,7 @@ static Dictionary _get_builtin_script_templates() { templates["no_comments.gd"] = "extends %BASE%\n" "\n" + "\n" "func _ready()%VOID_RETURN%:\n" "%TS%pass\n"; diff --git a/editor/editor_vcs_interface.cpp b/editor/editor_vcs_interface.cpp index 4df2a06736..766f9c3913 100644 --- a/editor/editor_vcs_interface.cpp +++ b/editor/editor_vcs_interface.cpp @@ -36,7 +36,7 @@ void EditorVCSInterface::_bind_methods() { // Proxy end points that act as fallbacks to unavailability of a function in the VCS addon ClassDB::bind_method(D_METHOD("_initialize", "project_root_path"), &EditorVCSInterface::_initialize); - ClassDB::bind_method(D_METHOD("_get_is_vcs_intialized"), &EditorVCSInterface::_get_is_vcs_intialized); + ClassDB::bind_method(D_METHOD("_is_vcs_initialized"), &EditorVCSInterface::_is_vcs_initialized); ClassDB::bind_method(D_METHOD("_get_vcs_name"), &EditorVCSInterface::_get_vcs_name); ClassDB::bind_method(D_METHOD("_shut_down"), &EditorVCSInterface::_shut_down); ClassDB::bind_method(D_METHOD("_get_project_name"), &EditorVCSInterface::_get_project_name); @@ -50,7 +50,7 @@ void EditorVCSInterface::_bind_methods() { // API methods that redirect calls to the proxy end points ClassDB::bind_method(D_METHOD("initialize", "project_root_path"), &EditorVCSInterface::initialize); - ClassDB::bind_method(D_METHOD("get_is_vcs_intialized"), &EditorVCSInterface::get_is_vcs_intialized); + ClassDB::bind_method(D_METHOD("is_vcs_initialized"), &EditorVCSInterface::is_vcs_initialized); ClassDB::bind_method(D_METHOD("get_modified_files_data"), &EditorVCSInterface::get_modified_files_data); ClassDB::bind_method(D_METHOD("stage_file", "file_path"), &EditorVCSInterface::stage_file); ClassDB::bind_method(D_METHOD("unstage_file", "file_path"), &EditorVCSInterface::unstage_file); @@ -67,7 +67,7 @@ bool EditorVCSInterface::_initialize(String p_project_root_path) { return true; } -bool EditorVCSInterface::_get_is_vcs_intialized() { +bool EditorVCSInterface::_is_vcs_initialized() { return false; } @@ -112,9 +112,9 @@ bool EditorVCSInterface::initialize(String p_project_root_path) { return is_initialized; } -bool EditorVCSInterface::get_is_vcs_intialized() { +bool EditorVCSInterface::is_vcs_initialized() { - return call("_get_is_vcs_intialized"); + return call("_is_vcs_initialized"); } Dictionary EditorVCSInterface::get_modified_files_data() { diff --git a/editor/editor_vcs_interface.h b/editor/editor_vcs_interface.h index 896193ed92..394a18f974 100644 --- a/editor/editor_vcs_interface.h +++ b/editor/editor_vcs_interface.h @@ -48,7 +48,7 @@ protected: // Implemented by addons as end points for the proxy functions bool _initialize(String p_project_root_path); - bool _get_is_vcs_intialized(); + bool _is_vcs_initialized(); Dictionary _get_modified_files_data(); void _stage_file(String p_file_path); void _unstage_file(String p_file_path); @@ -66,7 +66,7 @@ public: // Proxy functions to the editor for use bool initialize(String p_project_root_path); - bool get_is_vcs_intialized(); + bool is_vcs_initialized(); Dictionary get_modified_files_data(); void stage_file(String p_file_path); void unstage_file(String p_file_path); diff --git a/editor/filesystem_dock.cpp b/editor/filesystem_dock.cpp index fb591b51df..eb3ae33065 100644 --- a/editor/filesystem_dock.cpp +++ b/editor/filesystem_dock.cpp @@ -52,7 +52,7 @@ Ref<Texture> FileSystemDock::_get_tree_item_icon(EditorFileSystemDirectory *p_di return file_icon; } -bool FileSystemDock::_create_tree(TreeItem *p_parent, EditorFileSystemDirectory *p_dir, Vector<String> &uncollapsed_paths, bool p_select_in_favorites) { +bool FileSystemDock::_create_tree(TreeItem *p_parent, EditorFileSystemDirectory *p_dir, Vector<String> &uncollapsed_paths, bool p_select_in_favorites, bool p_unfold_path) { bool parent_should_expand = false; // Create a tree item for the subdirectory. @@ -71,14 +71,18 @@ bool FileSystemDock::_create_tree(TreeItem *p_parent, EditorFileSystemDirectory subdirectory_item->select(0); } - subdirectory_item->set_collapsed(uncollapsed_paths.find(lpath) < 0); + if (p_unfold_path && path.begins_with(lpath) && path != lpath) { + subdirectory_item->set_collapsed(false); + } else { + subdirectory_item->set_collapsed(uncollapsed_paths.find(lpath) < 0); + } if (searched_string.length() > 0 && dname.to_lower().find(searched_string) >= 0) { parent_should_expand = true; } // Create items for all subdirectories. for (int i = 0; i < p_dir->get_subdir_count(); i++) - parent_should_expand = (_create_tree(subdirectory_item, p_dir->get_subdir(i), uncollapsed_paths, p_select_in_favorites) || parent_should_expand); + parent_should_expand = (_create_tree(subdirectory_item, p_dir->get_subdir(i), uncollapsed_paths, p_select_in_favorites, p_unfold_path) || parent_should_expand); // Create all items for the files in the subdirectory. if (display_mode == DISPLAY_MODE_TREE_ONLY) { @@ -164,7 +168,7 @@ Vector<String> FileSystemDock::_compute_uncollapsed_paths() { return uncollapsed_paths; } -void FileSystemDock::_update_tree(const Vector<String> &p_uncollapsed_paths, bool p_uncollapse_root, bool p_select_in_favorites) { +void FileSystemDock::_update_tree(const Vector<String> &p_uncollapsed_paths, bool p_uncollapse_root, bool p_select_in_favorites, bool p_unfold_path) { // Recreate the tree. tree->clear(); tree_update_id++; @@ -237,7 +241,7 @@ void FileSystemDock::_update_tree(const Vector<String> &p_uncollapsed_paths, boo } // Create the remaining of the tree. - _create_tree(root, EditorFileSystem::get_singleton()->get_filesystem(), uncollapsed_paths, p_select_in_favorites); + _create_tree(root, EditorFileSystem::get_singleton()->get_filesystem(), uncollapsed_paths, p_select_in_favorites, p_unfold_path); tree->ensure_cursor_is_visible(); updating_tree = false; } @@ -459,7 +463,7 @@ void FileSystemDock::_navigate_to_path(const String &p_path, bool p_select_in_fa _set_current_path_text(path); _push_to_history(); - _update_tree(_compute_uncollapsed_paths(), false, p_select_in_favorites); + _update_tree(_compute_uncollapsed_paths(), false, p_select_in_favorites, true); if (display_mode == DISPLAY_MODE_SPLIT) { _update_file_list(false); files->get_v_scroll()->set_value(0); @@ -1780,7 +1784,7 @@ void FileSystemDock::_resource_created() const { } void FileSystemDock::_search_changed(const String &p_text, const Control *p_from) { - if (searched_string.length() == 0 && p_text.length() > 0) { + if (searched_string.length() == 0) { // Register the uncollapsed paths before they change. uncollapsed_paths_before_search = _compute_uncollapsed_paths(); } @@ -1792,13 +1796,14 @@ void FileSystemDock::_search_changed(const String &p_text, const Control *p_from else // File_list_search_box. tree_search_box->set_text(searched_string); + bool unfold_path = (p_text == String() && path != String()); switch (display_mode) { case DISPLAY_MODE_TREE_ONLY: { - _update_tree(searched_string.length() == 0 ? uncollapsed_paths_before_search : Vector<String>()); + _update_tree(searched_string.length() == 0 ? uncollapsed_paths_before_search : Vector<String>(), false, false, unfold_path); } break; case DISPLAY_MODE_SPLIT: { _update_file_list(false); - _update_tree(searched_string.length() == 0 ? uncollapsed_paths_before_search : Vector<String>()); + _update_tree(searched_string.length() == 0 ? uncollapsed_paths_before_search : Vector<String>(), false, false, unfold_path); } break; } } diff --git a/editor/filesystem_dock.h b/editor/filesystem_dock.h index 099f4ad273..d81a5133f2 100644 --- a/editor/filesystem_dock.h +++ b/editor/filesystem_dock.h @@ -177,9 +177,9 @@ private: bool import_dock_needs_update; Ref<Texture> _get_tree_item_icon(EditorFileSystemDirectory *p_dir, int p_idx); - bool _create_tree(TreeItem *p_parent, EditorFileSystemDirectory *p_dir, Vector<String> &uncollapsed_paths, bool p_select_in_favorites); + bool _create_tree(TreeItem *p_parent, EditorFileSystemDirectory *p_dir, Vector<String> &uncollapsed_paths, bool p_select_in_favorites, bool p_unfold_path = false); Vector<String> _compute_uncollapsed_paths(); - void _update_tree(const Vector<String> &p_uncollapsed_paths = Vector<String>(), bool p_uncollapse_root = false, bool p_select_in_favorites = false); + void _update_tree(const Vector<String> &p_uncollapsed_paths = Vector<String>(), bool p_uncollapse_root = false, bool p_select_in_favorites = false, bool p_unfold_path = false); void _navigate_to_path(const String &p_path, bool p_select_in_favorites = false); void _file_list_gui_input(Ref<InputEvent> p_event); diff --git a/editor/import/editor_scene_importer_gltf.cpp b/editor/import/editor_scene_importer_gltf.cpp index fcf0e4af6f..be066e15a5 100644 --- a/editor/import/editor_scene_importer_gltf.cpp +++ b/editor/import/editor_scene_importer_gltf.cpp @@ -229,8 +229,16 @@ Error EditorSceneImporterGLTF::_parse_scenes(GLTFState &state) { ERR_FAIL_COND_V(!state.json.has("scenes"), ERR_FILE_CORRUPT); const Array &scenes = state.json["scenes"]; - for (int i = 0; i < 1; i++) { //only first scene is imported - const Dictionary &s = scenes[i]; + int loaded_scene = 0; + if (state.json.has("scene")) { + loaded_scene = state.json["scene"]; + } else { + WARN_PRINT("The load-time scene is not defined in the glTF2 file. Picking the first scene.") + } + + if (scenes.size()) { + ERR_FAIL_COND_V(loaded_scene >= scenes.size(), ERR_FILE_CORRUPT); + const Dictionary &s = scenes[loaded_scene]; ERR_FAIL_COND_V(!s.has("nodes"), ERR_UNAVAILABLE); const Array &nodes = s["nodes"]; for (int j = 0; j < nodes.size(); j++) { @@ -1487,15 +1495,15 @@ Error EditorSceneImporterGLTF::_parse_materials(GLTFState &state) { } EditorSceneImporterGLTF::GLTFNodeIndex EditorSceneImporterGLTF::_find_highest_node(GLTFState &state, const Vector<GLTFNodeIndex> &subset) { - int heighest = -1; + int highest = -1; GLTFNodeIndex best_node = -1; for (int i = 0; i < subset.size(); ++i) { const GLTFNodeIndex node_i = subset[i]; const GLTFNode *node = state.nodes[node_i]; - if (heighest == -1 || node->height < heighest) { - heighest = node->height; + if (highest == -1 || node->height < highest) { + highest = node->height; best_node = node_i; } } @@ -2135,7 +2143,6 @@ Error EditorSceneImporterGLTF::_create_skeletons(GLTFState &state) { skeleton->add_bone(node->name); skeleton->set_bone_rest(bone_index, node->xform); - skeleton->set_bone_pose(bone_index, node->xform); if (node->parent >= 0 && state.nodes[node->parent]->skeleton == skel_i) { const int bone_parent = skeleton->find_bone(state.nodes[node->parent]->name); @@ -2316,7 +2323,7 @@ Error EditorSceneImporterGLTF::_parse_animations(GLTFState &state) { Array samplers = d["samplers"]; if (d.has("name")) { - animation.name = d["name"]; + animation.name = _sanitize_scene_name(d["name"]); } for (int j = 0; j < channels.size(); j++) { @@ -2356,6 +2363,7 @@ Error EditorSceneImporterGLTF::_parse_animations(GLTFState &state) { const int output = s["output"]; GLTFAnimation::Interpolation interp = GLTFAnimation::INTERP_LINEAR; + int output_count = 1; if (s.has("interpolation")) { const String &in = s["interpolation"]; if (in == "STEP") { @@ -2364,8 +2372,10 @@ Error EditorSceneImporterGLTF::_parse_animations(GLTFState &state) { interp = GLTFAnimation::INTERP_LINEAR; } else if (in == "CATMULLROMSPLINE") { interp = GLTFAnimation::INTERP_CATMULLROMSPLINE; + output_count = 3; } else if (in == "CUBICSPLINE") { interp = GLTFAnimation::INTERP_CUBIC_SPLINE; + output_count = 3; } } @@ -2395,6 +2405,9 @@ Error EditorSceneImporterGLTF::_parse_animations(GLTFState &state) { track->weight_tracks.resize(wc); + const int expected_value_count = times.size() * output_count * wc; + ERR_FAIL_COND_V_MSG(weights.size() != expected_value_count, ERR_PARSE_ERROR, "Invalid weight data, expected " + itos(expected_value_count) + " weight values, got " + itos(weights.size()) + " instead."); + const int wlen = weights.size() / wc; PoolVector<float>::Read r = weights.read(); for (int k = 0; k < wc; k++) { //separate tracks, having them together is not such a good idea @@ -2493,9 +2506,9 @@ Camera *EditorSceneImporterGLTF::_generate_camera(GLTFState &state, Node *scene_ const GLTFCamera &c = state.cameras[gltf_node->camera]; if (c.perspective) { - camera->set_perspective(c.fov_size, c.znear, c.znear); + camera->set_perspective(c.fov_size, c.znear, c.zfar); } else { - camera->set_orthogonal(c.fov_size, c.znear, c.znear); + camera->set_orthogonal(c.fov_size, c.znear, c.zfar); } return camera; diff --git a/editor/import_dock.cpp b/editor/import_dock.cpp index 1d72e370b3..947e322075 100644 --- a/editor/import_dock.cpp +++ b/editor/import_dock.cpp @@ -182,7 +182,7 @@ void ImportDock::set_edit_multiple_paths(const Vector<String> &p_paths) { clear(); - //use the value that is repeated the mot + // Use the value that is repeated the most. Map<String, Dictionary> value_frequency; for (int i = 0; i < p_paths.size(); i++) { diff --git a/editor/multi_node_edit.cpp b/editor/multi_node_edit.cpp index 0792d5c95f..e1992b8540 100644 --- a/editor/multi_node_edit.cpp +++ b/editor/multi_node_edit.cpp @@ -122,7 +122,7 @@ void MultiNodeEdit::_get_property_list(List<PropertyInfo> *p_list) const { int nc = 0; - List<PLData *> datas; + List<PLData *> data_list; for (const List<NodePath>::Element *E = nodes.front(); E; E = E->next()) { @@ -145,7 +145,7 @@ void MultiNodeEdit::_get_property_list(List<PropertyInfo> *p_list) const { pld.uses = 0; pld.info = F->get(); usage[F->get().name] = pld; - datas.push_back(usage.getptr(F->get().name)); + data_list.push_back(usage.getptr(F->get().name)); } // Make sure only properties with the same exact PropertyInfo data will appear @@ -156,7 +156,7 @@ void MultiNodeEdit::_get_property_list(List<PropertyInfo> *p_list) const { nc++; } - for (List<PLData *>::Element *E = datas.front(); E; E = E->next()) { + for (List<PLData *>::Element *E = data_list.front(); E; E = E->next()) { if (nc == E->get()->uses) { p_list->push_back(E->get()->info); diff --git a/editor/plugins/animation_blend_space_1d_editor.cpp b/editor/plugins/animation_blend_space_1d_editor.cpp index e07f041eb1..475e4c8d67 100644 --- a/editor/plugins/animation_blend_space_1d_editor.cpp +++ b/editor/plugins/animation_blend_space_1d_editor.cpp @@ -702,13 +702,13 @@ AnimationNodeBlendSpace1DEditor::AnimationNodeBlendSpace1DEditor() { bottom_hb->set_h_size_flags(SIZE_EXPAND_FILL); min_value = memnew(SpinBox); - min_value->set_max(0); min_value->set_min(-10000); + min_value->set_max(0); min_value->set_step(0.01); max_value = memnew(SpinBox); - max_value->set_max(10000); max_value->set_min(0.01); + max_value->set_max(10000); max_value->set_step(0.01); label_value = memnew(LineEdit); diff --git a/editor/plugins/canvas_item_editor_plugin.cpp b/editor/plugins/canvas_item_editor_plugin.cpp index 7170ce30cc..9894c8c562 100644 --- a/editor/plugins/canvas_item_editor_plugin.cpp +++ b/editor/plugins/canvas_item_editor_plugin.cpp @@ -794,6 +794,7 @@ bool CanvasItemEditor::_select_click_on_item(CanvasItem *item, Point2 p_click_po editor_selection->add_node(item); // Reselect if (Engine::get_singleton()->is_editor_hint()) { + selected_from_canvas = true; editor->call("edit_node", item); } } @@ -2237,6 +2238,7 @@ bool CanvasItemEditor::_gui_input_select(const Ref<InputEvent> &p_event) { // Clear the selection if not additive editor_selection->clear(); viewport->update(); + selected_from_canvas = true; }; drag_from = click; @@ -3671,7 +3673,7 @@ void CanvasItemEditor::_notification(int p_what) { int nb_having_pivot = 0; // Update the viewport if the canvas_item changes - List<CanvasItem *> selection = _get_edited_canvas_items(); + List<CanvasItem *> selection = _get_edited_canvas_items(true); for (List<CanvasItem *>::Element *E = selection.front(); E; E = E->next()) { CanvasItem *canvas_item = E->get(); CanvasItemEditorSelectedItem *se = editor_selection->get_node_editor_data<CanvasItemEditorSelectedItem>(canvas_item); @@ -3911,6 +3913,11 @@ void CanvasItemEditor::_selection_changed() { } anchors_mode = (nbValidControls == nbAnchorsMode); anchor_mode_button->set_pressed(anchors_mode); + + if (!selected_from_canvas) { + drag_type = DRAG_NONE; + } + selected_from_canvas = false; } void CanvasItemEditor::edit(CanvasItem *p_canvas_item) { @@ -3971,9 +3978,9 @@ void CanvasItemEditor::_update_scrollbars() { updating_scroll = true; // Move the zoom buttons - Point2 zoom_hb_begin = Point2(5, 5); - zoom_hb_begin += (show_rulers) ? Point2(RULER_WIDTH, RULER_WIDTH) : Point2(); - zoom_hb->set_begin(zoom_hb_begin); + Point2 controls_vb_begin = Point2(5, 5); + controls_vb_begin += (show_rulers) ? Point2(RULER_WIDTH, RULER_WIDTH) : Point2(); + controls_vb->set_begin(controls_vb_begin); // Move and resize the scrollbars Size2 size = viewport->get_size(); @@ -5253,6 +5260,7 @@ CanvasItemEditor::CanvasItemEditor(EditorNode *p_editor) { snap_target[0] = SNAP_TARGET_NONE; snap_target[1] = SNAP_TARGET_NONE; + selected_from_canvas = false; anchors_mode = false; skeleton_show_bones = true; @@ -5262,6 +5270,8 @@ CanvasItemEditor::CanvasItemEditor(EditorNode *p_editor) { drag_to = Vector2(); dragged_guide_pos = Point2(); dragged_guide_index = -1; + is_hovering_h_guide = false; + is_hovering_v_guide = false; panning = false; pan_pressed = false; @@ -5308,6 +5318,14 @@ CanvasItemEditor::CanvasItemEditor(EditorNode *p_editor) { scene_tree->set_anchors_and_margins_preset(Control::PRESET_WIDE); scene_tree->add_child(p_editor->get_scene_root()); + controls_vb = memnew(VBoxContainer); + controls_vb->set_begin(Point2(5, 5)); + + zoom_hb = memnew(HBoxContainer); + // Bring the zoom percentage closer to the zoom buttons + zoom_hb->add_constant_override("separation", Math::round(-8 * EDSCALE)); + controls_vb->add_child(zoom_hb); + viewport = memnew(CanvasItemEditorViewport(p_editor, this)); viewport_scrollable->add_child(viewport); viewport->set_mouse_filter(MOUSE_FILTER_PASS); @@ -5351,11 +5369,7 @@ CanvasItemEditor::CanvasItemEditor(EditorNode *p_editor) { v_scroll->connect("value_changed", this, "_update_scroll"); v_scroll->hide(); - zoom_hb = memnew(HBoxContainer); - viewport->add_child(zoom_hb); - zoom_hb->set_begin(Point2(5, 5)); - // Bring the zoom percentage closer to the zoom buttons - zoom_hb->add_constant_override("separation", Math::round(-8 * EDSCALE)); + viewport->add_child(controls_vb); zoom_minus = memnew(ToolButton); zoom_hb->add_child(zoom_minus); @@ -5742,8 +5756,6 @@ void CanvasItemEditorViewport::_on_change_type_closed() { } void CanvasItemEditorViewport::_create_preview(const Vector<String> &files) const { - label->set_position(get_global_position() + Point2(14, 14) * EDSCALE); - label_desc->set_position(label->get_position() + Point2(0, label->get_size().height)); bool add_preview = false; for (int i = 0; i < files.size(); i++) { String path = files[i]; @@ -6165,7 +6177,7 @@ CanvasItemEditorViewport::CanvasItemEditorViewport(EditorNode *p_node, CanvasIte label->add_color_override("font_color_shadow", Color(0, 0, 0, 1)); label->add_constant_override("shadow_as_outline", 1 * EDSCALE); label->hide(); - editor->get_gui_base()->add_child(label); + canvas_item_editor->get_controls_container()->add_child(label); label_desc = memnew(Label); label_desc->set_text(TTR("Drag & drop + Shift : Add node as sibling\nDrag & drop + Alt : Change node type")); @@ -6174,7 +6186,8 @@ CanvasItemEditorViewport::CanvasItemEditorViewport(EditorNode *p_node, CanvasIte label_desc->add_constant_override("shadow_as_outline", 1 * EDSCALE); label_desc->add_constant_override("line_spacing", 0); label_desc->hide(); - editor->get_gui_base()->add_child(label_desc); + canvas_item_editor->get_controls_container()->add_child(label_desc); + VS::get_singleton()->canvas_set_disable_scale(true); } diff --git a/editor/plugins/canvas_item_editor_plugin.h b/editor/plugins/canvas_item_editor_plugin.h index 3fdf00d611..74adb882d1 100644 --- a/editor/plugins/canvas_item_editor_plugin.h +++ b/editor/plugins/canvas_item_editor_plugin.h @@ -252,6 +252,7 @@ private: Point2 view_offset; Point2 previous_update_view_offset; + bool selected_from_canvas; bool anchors_mode; Point2 grid_offset; @@ -530,6 +531,7 @@ private: void _button_toggle_anchor_mode(bool p_status); + VBoxContainer *controls_vb; HBoxContainer *zoom_hb; void _zoom_on_position(float p_zoom, Point2 p_position = Point2()); void _update_zoom_label(); @@ -627,6 +629,8 @@ public: Control *get_viewport_control() { return viewport; } + Control *get_controls_container() { return controls_vb; } + void update_viewport(); Tool get_current_tool() { return tool; } diff --git a/editor/plugins/editor_preview_plugins.cpp b/editor/plugins/editor_preview_plugins.cpp index 007ce58bd7..204562ac38 100644 --- a/editor/plugins/editor_preview_plugins.cpp +++ b/editor/plugins/editor_preview_plugins.cpp @@ -827,19 +827,23 @@ void EditorFontPreviewPlugin::_bind_methods() { bool EditorFontPreviewPlugin::handles(const String &p_type) const { - return ClassDB::is_parent_class(p_type, "DynamicFontData"); + return ClassDB::is_parent_class(p_type, "DynamicFontData") || ClassDB::is_parent_class(p_type, "DynamicFont"); } Ref<Texture> EditorFontPreviewPlugin::generate_from_path(const String &p_path, const Size2 &p_size) const { - Ref<DynamicFontData> SampledFont; - SampledFont.instance(); - SampledFont->set_font_path(p_path); - + RES res = ResourceLoader::load(p_path); Ref<DynamicFont> sampled_font; - sampled_font.instance(); + if (res->is_class("DynamicFont")) { + sampled_font = res->duplicate(); + if (sampled_font->get_outline_color() == Color(1, 1, 1, 1)) { + sampled_font->set_outline_color(Color(0, 0, 0, 1)); + } + } else if (res->is_class("DynamicFontData")) { + sampled_font.instance(); + sampled_font->set_font_data(res); + } sampled_font->set_size(50); - sampled_font->set_font_data(SampledFont); String sampled_text = "Abg"; Vector2 size = sampled_font->get_string_size(sampled_text); diff --git a/editor/plugins/script_editor_plugin.cpp b/editor/plugins/script_editor_plugin.cpp index f7e997a269..54bf8ce5a2 100644 --- a/editor/plugins/script_editor_plugin.cpp +++ b/editor/plugins/script_editor_plugin.cpp @@ -2497,7 +2497,10 @@ void ScriptEditor::drop_data_fw(const Point2 &p_point, const Variant &p_data, Co ScriptEditorBase *se = Object::cast_to<ScriptEditorBase>(node); EditorHelp *eh = Object::cast_to<EditorHelp>(node); if (se || eh) { - int new_index = script_list->get_item_metadata(script_list->get_item_at_position(p_point)); + int new_index = 0; + if (script_list->get_item_count() > 0) { + new_index = script_list->get_item_metadata(script_list->get_item_at_position(p_point)); + } tab_container->move_child(node, new_index); tab_container->set_current_tab(new_index); _update_script_names(); @@ -2514,7 +2517,10 @@ void ScriptEditor::drop_data_fw(const Point2 &p_point, const Variant &p_data, Co ScriptEditorBase *se = Object::cast_to<ScriptEditorBase>(node); EditorHelp *eh = Object::cast_to<EditorHelp>(node); if (se || eh) { - int new_index = script_list->get_item_metadata(script_list->get_item_at_position(p_point)); + int new_index = 0; + if (script_list->get_item_count() > 0) { + new_index = script_list->get_item_metadata(script_list->get_item_at_position(p_point)); + } tab_container->move_child(node, new_index); tab_container->set_current_tab(new_index); _update_script_names(); @@ -2525,7 +2531,10 @@ void ScriptEditor::drop_data_fw(const Point2 &p_point, const Variant &p_data, Co Vector<String> files = d["files"]; - int new_index = script_list->get_item_metadata(script_list->get_item_at_position(p_point)); + int new_index = 0; + if (script_list->get_item_count() > 0) { + new_index = script_list->get_item_metadata(script_list->get_item_at_position(p_point)); + } int num_tabs_before = tab_container->get_child_count(); for (int i = 0; i < files.size(); i++) { String file = files[i]; @@ -2551,16 +2560,20 @@ void ScriptEditor::_unhandled_input(const Ref<InputEvent> &p_event) { if (!is_visible_in_tree() || !p_event->is_pressed() || p_event->is_echo()) return; if (ED_IS_SHORTCUT("script_editor/next_script", p_event)) { - int next_tab = script_list->get_current() + 1; - next_tab %= script_list->get_item_count(); - _go_to_tab(script_list->get_item_metadata(next_tab)); - _update_script_names(); + if (script_list->get_item_count() > 1) { + int next_tab = script_list->get_current() + 1; + next_tab %= script_list->get_item_count(); + _go_to_tab(script_list->get_item_metadata(next_tab)); + _update_script_names(); + } } if (ED_IS_SHORTCUT("script_editor/prev_script", p_event)) { - int next_tab = script_list->get_current() - 1; - next_tab = next_tab >= 0 ? next_tab : script_list->get_item_count() - 1; - _go_to_tab(script_list->get_item_metadata(next_tab)); - _update_script_names(); + if (script_list->get_item_count() > 1) { + int next_tab = script_list->get_current() - 1; + next_tab = next_tab >= 0 ? next_tab : script_list->get_item_count() - 1; + _go_to_tab(script_list->get_item_metadata(next_tab)); + _update_script_names(); + } } if (ED_IS_SHORTCUT("script_editor/window_move_up", p_event)) { _menu_option(WINDOW_MOVE_UP); @@ -3238,7 +3251,7 @@ ScriptEditor::ScriptEditor(EditorNode *p_editor) { ED_SHORTCUT("script_editor/window_move_up", TTR("Move Up"), KEY_MASK_SHIFT | KEY_MASK_ALT | KEY_UP); ED_SHORTCUT("script_editor/window_move_down", TTR("Move Down"), KEY_MASK_SHIFT | KEY_MASK_ALT | KEY_DOWN); ED_SHORTCUT("script_editor/next_script", TTR("Next script"), KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_PERIOD); // these should be KEY_GREATER and KEY_LESS but those don't work - ED_SHORTCUT("script_editor/prev_script", TTR("Previous script"), KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_COLON); + ED_SHORTCUT("script_editor/prev_script", TTR("Previous script"), KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_COMMA); set_process_unhandled_input(true); file_menu = memnew(MenuButton); diff --git a/editor/plugins/skeleton_editor_plugin.cpp b/editor/plugins/skeleton_editor_plugin.cpp index cd360d4caf..1adf0be108 100644 --- a/editor/plugins/skeleton_editor_plugin.cpp +++ b/editor/plugins/skeleton_editor_plugin.cpp @@ -65,7 +65,6 @@ void SkeletonEditor::create_physical_skeleton() { for (int bone_id = 0; bc > bone_id; ++bone_id) { const int parent = skeleton->get_bone_parent(bone_id); - const int parent_parent = skeleton->get_bone_parent(parent); if (parent < 0) { @@ -73,6 +72,8 @@ void SkeletonEditor::create_physical_skeleton() { } else { + const int parent_parent = skeleton->get_bone_parent(parent); + bones_infos.write[bone_id].relative_rest = bones_infos[parent].relative_rest * skeleton->get_bone_rest(bone_id); /// create physical bone on parent diff --git a/editor/plugins/spatial_editor_plugin.cpp b/editor/plugins/spatial_editor_plugin.cpp index d187e4ff4a..10e4559805 100644 --- a/editor/plugins/spatial_editor_plugin.cpp +++ b/editor/plugins/spatial_editor_plugin.cpp @@ -521,7 +521,7 @@ void SpatialEditorViewport::_select_region() { if (selected.find(item) != -1) continue; - if (_is_node_locked(Object::cast_to<Spatial>(item))) continue; + if (_is_node_locked(item)) continue; Ref<EditorSpatialGizmo> seg = sp->get_gizmo(); diff --git a/editor/plugins/sprite_frames_editor_plugin.cpp b/editor/plugins/sprite_frames_editor_plugin.cpp index 394122d91d..34780af59e 100644 --- a/editor/plugins/sprite_frames_editor_plugin.cpp +++ b/editor/plugins/sprite_frames_editor_plugin.cpp @@ -757,7 +757,7 @@ Variant SpriteFramesEditor::get_drag_data_fw(const Point2 &p_point, Control *p_f return Variant(); Dictionary drag_data = EditorNode::get_singleton()->drag_resource(frame, p_from); - drag_data["frame"] = idx; // store the frame, incase we want to reorder frames inside 'drop_data_fw' + drag_data["frame"] = idx; // store the frame, in case we want to reorder frames inside 'drop_data_fw' return drag_data; } diff --git a/editor/plugins/style_box_editor_plugin.cpp b/editor/plugins/style_box_editor_plugin.cpp index c4a9803ff4..7e5e278689 100644 --- a/editor/plugins/style_box_editor_plugin.cpp +++ b/editor/plugins/style_box_editor_plugin.cpp @@ -68,7 +68,14 @@ void StyleBoxPreview::_sb_changed() { void StyleBoxPreview::_redraw() { if (stylebox.is_valid()) { - preview->draw_style_box(stylebox, preview->get_rect()); + Rect2 preview_rect = preview->get_rect(); + + // Re-adjust preview panel to fit all drawn content + Rect2 draw_rect = stylebox->get_draw_rect(preview_rect); + preview_rect.size -= draw_rect.size - preview_rect.size; + preview_rect.position -= draw_rect.position - preview_rect.position; + + preview->draw_style_box(stylebox, preview_rect); } } @@ -81,6 +88,7 @@ void StyleBoxPreview::_bind_methods() { StyleBoxPreview::StyleBoxPreview() { preview = memnew(Control); preview->set_custom_minimum_size(Size2(0, 150 * EDSCALE)); + preview->set_clip_contents(true); preview->connect("draw", this, "_redraw"); add_margin_child(TTR("Preview:"), preview); } diff --git a/editor/plugins/text_editor.cpp b/editor/plugins/text_editor.cpp index 0cef5a8b6f..7651ab8526 100644 --- a/editor/plugins/text_editor.cpp +++ b/editor/plugins/text_editor.cpp @@ -713,7 +713,7 @@ TextEditor::TextEditor() { goto_menu->get_popup()->add_separator(); bookmarks_menu = memnew(PopupMenu); - bookmarks_menu->set_name(TTR("Bookmarks")); + bookmarks_menu->set_name("Bookmarks"); goto_menu->get_popup()->add_child(bookmarks_menu); goto_menu->get_popup()->add_submenu_item(TTR("Bookmarks"), "Bookmarks"); _update_bookmark_list(); diff --git a/editor/plugins/texture_region_editor_plugin.cpp b/editor/plugins/texture_region_editor_plugin.cpp index bda3d142fa..a2f4040152 100644 --- a/editor/plugins/texture_region_editor_plugin.cpp +++ b/editor/plugins/texture_region_editor_plugin.cpp @@ -430,9 +430,9 @@ void TextureRegionEditor::_region_input(const Ref<InputEvent> &p_input) { if (mm->get_button_mask() & BUTTON_MASK_MIDDLE || Input::get_singleton()->is_key_pressed(KEY_SPACE)) { - Vector2 draged(mm->get_relative().x / draw_zoom, mm->get_relative().y / draw_zoom); - hscroll->set_value(hscroll->get_value() - draged.x); - vscroll->set_value(vscroll->get_value() - draged.y); + Vector2 dragged(mm->get_relative().x / draw_zoom, mm->get_relative().y / draw_zoom); + hscroll->set_value(hscroll->get_value() - dragged.x); + vscroll->set_value(vscroll->get_value() - dragged.y); } else if (drag) { diff --git a/editor/plugins/tile_map_editor_plugin.cpp b/editor/plugins/tile_map_editor_plugin.cpp index 385ba4cfda..a8e81b612b 100644 --- a/editor/plugins/tile_map_editor_plugin.cpp +++ b/editor/plugins/tile_map_editor_plugin.cpp @@ -52,12 +52,6 @@ void TileMapEditor::_notification(int p_what) { case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: { - bool new_show_tile_info = EditorSettings::get_singleton()->get("editors/tile_map/show_tile_info_on_hover"); - if (new_show_tile_info != show_tile_info) { - show_tile_info = new_show_tile_info; - tile_info->set_visible(show_tile_info); - } - if (is_visible_in_tree()) { _update_palette(); } @@ -1250,14 +1244,13 @@ bool TileMapEditor::forward_gui_input(const Ref<InputEvent> &p_event) { CanvasItemEditor::get_singleton()->update_viewport(); } - if (show_tile_info) { - int tile_under = node->get_cell(over_tile.x, over_tile.y); - String tile_name = "none"; + int tile_under = node->get_cell(over_tile.x, over_tile.y); + String tile_name = "none"; - if (node->get_tileset()->has_tile(tile_under)) - tile_name = node->get_tileset()->tile_get_name(tile_under); - tile_info->set_text(String::num(over_tile.x) + ", " + String::num(over_tile.y) + " [" + tile_name + "]"); - } + if (node->get_tileset()->has_tile(tile_under)) + tile_name = node->get_tileset()->tile_get_name(tile_under); + tile_info->show(); + tile_info->set_text(String::num(over_tile.x) + ", " + String::num(over_tile.y) + " [" + tile_name + "]"); if (tool == TOOL_PAINTING) { @@ -1925,7 +1918,6 @@ TileMapEditor::TileMapEditor(EditorNode *p_editor) { tool = TOOL_NONE; selection_active = false; mouse_over = false; - show_tile_info = true; flip_h = false; flip_v = false; @@ -2055,7 +2047,12 @@ TileMapEditor::TileMapEditor(EditorNode *p_editor) { // Tile position. tile_info = memnew(Label); - toolbar_right->add_child(tile_info); + tile_info->set_modulate(Color(1, 1, 1, 0.8)); + tile_info->set_mouse_filter(MOUSE_FILTER_IGNORE); + tile_info->add_font_override("font", EditorNode::get_singleton()->get_gui_base()->get_font("main", "EditorFonts")); + // The tile info is only displayed after a tile has been hovered. + tile_info->hide(); + CanvasItemEditor::get_singleton()->add_control_to_info_overlay(tile_info); // Menu. options = memnew(MenuButton); @@ -2151,6 +2148,10 @@ void TileMapEditorPlugin::make_visible(bool p_visible) { tile_map_editor->show(); tile_map_editor->get_toolbar()->show(); tile_map_editor->get_toolbar_right()->show(); + // `tile_info` isn't shown here, as it's displayed after a tile has been hovered. + // Otherwise, a translucent black rectangle would be visible as there would be an + // empty Label in the CanvasItemEditor's info overlay. + // Change to TOOL_SELECT when TileMap node is selected, to prevent accidental movement. CanvasItemEditor::get_singleton()->set_current_tool(CanvasItemEditor::TOOL_SELECT); } else { @@ -2158,6 +2159,7 @@ void TileMapEditorPlugin::make_visible(bool p_visible) { tile_map_editor->hide(); tile_map_editor->get_toolbar()->hide(); tile_map_editor->get_toolbar_right()->hide(); + tile_map_editor->get_tile_info()->hide(); tile_map_editor->edit(NULL); } } @@ -2170,7 +2172,6 @@ TileMapEditorPlugin::TileMapEditorPlugin(EditorNode *p_node) { EDITOR_DEF("editors/tile_map/show_tile_ids", false); EDITOR_DEF("editors/tile_map/sort_tiles_by_name", true); EDITOR_DEF("editors/tile_map/bucket_fill_preview", true); - EDITOR_DEF("editors/tile_map/show_tile_info_on_hover", true); EDITOR_DEF("editors/tile_map/editor_side", 1); EditorSettings::get_singleton()->add_property_hint(PropertyInfo(Variant::INT, "editors/tile_map/editor_side", PROPERTY_HINT_ENUM, "Left,Right")); diff --git a/editor/plugins/tile_map_editor_plugin.h b/editor/plugins/tile_map_editor_plugin.h index e3d678c2fd..6400431bd1 100644 --- a/editor/plugins/tile_map_editor_plugin.h +++ b/editor/plugins/tile_map_editor_plugin.h @@ -109,7 +109,6 @@ class TileMapEditor : public VBoxContainer { bool selection_active; bool mouse_over; - bool show_tile_info; bool flip_h; bool flip_v; @@ -218,6 +217,7 @@ protected: public: HBoxContainer *get_toolbar() const { return toolbar; } HBoxContainer *get_toolbar_right() const { return toolbar_right; } + Label *get_tile_info() const { return tile_info; } bool forward_gui_input(const Ref<InputEvent> &p_event); void forward_canvas_draw_over_viewport(Control *p_overlay); diff --git a/editor/plugins/version_control_editor_plugin.cpp b/editor/plugins/version_control_editor_plugin.cpp index 783797ada4..aa3bd74c49 100644 --- a/editor/plugins/version_control_editor_plugin.cpp +++ b/editor/plugins/version_control_editor_plugin.cpp @@ -29,6 +29,7 @@ /*************************************************************************/ #include "version_control_editor_plugin.h" + #include "core/script_language.h" #include "editor/editor_file_system.h" #include "editor/editor_node.h" @@ -398,9 +399,9 @@ void VersionControlEditorPlugin::shut_down() { } } -bool VersionControlEditorPlugin::get_is_vcs_intialized() const { +bool VersionControlEditorPlugin::is_vcs_initialized() const { - return EditorVCSInterface::get_singleton() ? EditorVCSInterface::get_singleton()->get_is_vcs_intialized() : false; + return EditorVCSInterface::get_singleton() ? EditorVCSInterface::get_singleton()->is_vcs_initialized() : false; } const String VersionControlEditorPlugin::get_vcs_name() const { diff --git a/editor/plugins/version_control_editor_plugin.h b/editor/plugins/version_control_editor_plugin.h index 450ebccce1..f9f8437e15 100644 --- a/editor/plugins/version_control_editor_plugin.h +++ b/editor/plugins/version_control_editor_plugin.h @@ -129,7 +129,7 @@ public: PanelContainer *get_version_control_dock() const { return version_control_dock; } List<StringName> get_available_vcs_names() const { return available_addons; } - bool get_is_vcs_intialized() const; + bool is_vcs_initialized() const; const String get_vcs_name() const; void register_editor(); diff --git a/editor/script_create_dialog.cpp b/editor/script_create_dialog.cpp index 6522cf4d02..08bf52ab57 100644 --- a/editor/script_create_dialog.cpp +++ b/editor/script_create_dialog.cpp @@ -852,6 +852,7 @@ ScriptCreateDialog::ScriptCreateDialog() { hb->add_child(path_button); gc->add_child(memnew(Label(TTR("Path:")))); gc->add_child(hb); + re_check_path = false; /* Dialog Setup */ diff --git a/editor/script_editor_debugger.cpp b/editor/script_editor_debugger.cpp index afbd8832f2..8e7aac896a 100644 --- a/editor/script_editor_debugger.cpp +++ b/editor/script_editor_debugger.cpp @@ -492,7 +492,7 @@ void ScriptEditorDebugger::_video_mem_request() { Size2 ScriptEditorDebugger::get_minimum_size() const { - Size2 ms = Control::get_minimum_size(); + Size2 ms = MarginContainer::get_minimum_size(); ms.y = MAX(ms.y, 250 * EDSCALE); return ms; } @@ -1426,11 +1426,12 @@ void ScriptEditorDebugger::_notification(int p_what) { } break; case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: { + add_constant_override("margin_left", -EditorNode::get_singleton()->get_gui_base()->get_stylebox("BottomPanelDebuggerOverride", "EditorStyles")->get_margin(MARGIN_LEFT)); + add_constant_override("margin_right", -EditorNode::get_singleton()->get_gui_base()->get_stylebox("BottomPanelDebuggerOverride", "EditorStyles")->get_margin(MARGIN_RIGHT)); + tabs->add_style_override("panel", editor->get_gui_base()->get_stylebox("DebuggerPanel", "EditorStyles")); tabs->add_style_override("tab_fg", editor->get_gui_base()->get_stylebox("DebuggerTabFG", "EditorStyles")); tabs->add_style_override("tab_bg", editor->get_gui_base()->get_stylebox("DebuggerTabBG", "EditorStyles")); - tabs->set_margin(MARGIN_LEFT, -EditorNode::get_singleton()->get_gui_base()->get_stylebox("BottomPanelDebuggerOverride", "EditorStyles")->get_margin(MARGIN_LEFT)); - tabs->set_margin(MARGIN_RIGHT, EditorNode::get_singleton()->get_gui_base()->get_stylebox("BottomPanelDebuggerOverride", "EditorStyles")->get_margin(MARGIN_RIGHT)); copy->set_icon(get_icon("ActionCopy", "EditorIcons")); step->set_icon(get_icon("DebugStep", "EditorIcons")); @@ -2242,6 +2243,9 @@ void ScriptEditorDebugger::_bind_methods() { ScriptEditorDebugger::ScriptEditorDebugger(EditorNode *p_editor) { + add_constant_override("margin_left", -EditorNode::get_singleton()->get_gui_base()->get_stylebox("BottomPanelDebuggerOverride", "EditorStyles")->get_margin(MARGIN_LEFT)); + add_constant_override("margin_right", -EditorNode::get_singleton()->get_gui_base()->get_stylebox("BottomPanelDebuggerOverride", "EditorStyles")->get_margin(MARGIN_RIGHT)); + ppeer = Ref<PacketPeerStream>(memnew(PacketPeerStream)); ppeer->set_input_buffer_max_size(1024 * 1024 * 8); //8mb should be enough editor = p_editor; @@ -2253,9 +2257,6 @@ ScriptEditorDebugger::ScriptEditorDebugger(EditorNode *p_editor) { tabs->add_style_override("tab_fg", editor->get_gui_base()->get_stylebox("DebuggerTabFG", "EditorStyles")); tabs->add_style_override("tab_bg", editor->get_gui_base()->get_stylebox("DebuggerTabBG", "EditorStyles")); - tabs->set_anchors_and_margins_preset(Control::PRESET_WIDE); - tabs->set_margin(MARGIN_LEFT, -editor->get_gui_base()->get_stylebox("BottomPanelDebuggerOverride", "EditorStyles")->get_margin(MARGIN_LEFT)); - tabs->set_margin(MARGIN_RIGHT, editor->get_gui_base()->get_stylebox("BottomPanelDebuggerOverride", "EditorStyles")->get_margin(MARGIN_RIGHT)); add_child(tabs); { //debugger @@ -2600,6 +2601,7 @@ ScriptEditorDebugger::ScriptEditorDebugger(EditorNode *p_editor) { p_editor->get_undo_redo()->set_method_notify_callback(_method_changeds, this); p_editor->get_undo_redo()->set_property_notify_callback(_property_changeds, this); live_debug = true; + camera_override = OVERRIDE_NONE; last_path_id = false; error_count = 0; warning_count = 0; diff --git a/editor/script_editor_debugger.h b/editor/script_editor_debugger.h index 14b024d066..c885614dab 100644 --- a/editor/script_editor_debugger.h +++ b/editor/script_editor_debugger.h @@ -55,9 +55,9 @@ class EditorNetworkProfiler; class ScriptEditorDebuggerInspectedObject; -class ScriptEditorDebugger : public Control { +class ScriptEditorDebugger : public MarginContainer { - GDCLASS(ScriptEditorDebugger, Control); + GDCLASS(ScriptEditorDebugger, MarginContainer); public: enum CameraOverride { diff --git a/editor/translations/af.po b/editor/translations/af.po index 131ecd5c0d..bbcaf092e7 100644 --- a/editor/translations/af.po +++ b/editor/translations/af.po @@ -2919,7 +2919,7 @@ msgid "Play" msgstr "" #: editor/editor_node.cpp -msgid "Pause the scene" +msgid "Pause the scene execution for debugging." msgstr "" #: editor/editor_node.cpp @@ -3602,6 +3602,11 @@ msgstr "Geërf deur:" #: editor/filesystem_dock.cpp #, fuzzy +msgid "Set As Main Scene" +msgstr "Stoor As" + +#: editor/filesystem_dock.cpp +#, fuzzy msgid "Open Scenes" msgstr "Open Lêer(s)" @@ -4360,6 +4365,20 @@ msgid "" msgstr "" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Anim Clips" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Audio Clips" +msgstr "Anim Voeg Baan By" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Functions" +msgstr "Maak Funksie" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/animation_state_machine_editor.cpp #, fuzzy msgid "Node Renamed" @@ -5051,6 +5070,14 @@ msgid "Grid Step:" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Primary Line Every:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "steps" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotation Offset:" msgstr "" @@ -5059,6 +5086,11 @@ msgid "Rotation Step:" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Scale Step:" +msgstr "Skaal Verhouding:" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move Vertical Guide" msgstr "" @@ -5145,6 +5177,20 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"Overrides game camera with editor viewport camera." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"No game instance running." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp msgid "Lock Selected" msgstr "" @@ -5286,6 +5332,10 @@ msgid "Use Rotation Snap" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Use Scale Snap" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap Relative" msgstr "" @@ -5427,7 +5477,7 @@ msgstr "Anim Voeg Sleutel by" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" -"Auto insert keys when objects are translated, rotated on scaled (based on " +"Auto insert keys when objects are translated, rotated or scaled (based on " "mask).\n" "Keys are only added to existing tracks, no new tracks will be created.\n" "Keys must be inserted manually for the first time." @@ -8375,7 +8425,7 @@ msgid "Dodge operator." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "HardLight operator" +msgid "HardLight operator." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8970,9 +9020,10 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Custom Godot Shader Language expression, which placed on top of the resulted " -"shader. You can place various function definitions inside and call it later " -"in the Expressions. You can also declare varyings, uniforms and constants." +"Custom Godot Shader Language expression, which is placed on top of the " +"resulted shader. You can place various function definitions inside and call " +"it later in the Expressions. You can also declare varyings, uniforms and " +"constants." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -9081,6 +9132,12 @@ msgid "Add..." msgstr "" #: editor/project_export.cpp +msgid "" +"If checked, the preset will be available for use in one-click deploy.\n" +"Only one preset per platform may be marked as runnable." +msgstr "" + +#: editor/project_export.cpp msgid "Export Path" msgstr "" @@ -9526,18 +9583,6 @@ msgid "Device" msgstr "" #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Shift+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Alt+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Control+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "Press a Key..." msgstr "" @@ -11278,7 +11323,7 @@ msgid "Can't create function of nodes from nodes of multiple functions." msgstr "" #: modules/visual_script/visual_script_editor.cpp -msgid "Select atleast one node with sequence port." +msgid "Select at least one node with sequence port." msgstr "" #: modules/visual_script/visual_script_editor.cpp @@ -11594,11 +11639,21 @@ msgstr "" #: platform/uwp/export/export.cpp #, fuzzy +msgid "Invalid package short name." +msgstr "Ongeldige naam." + +#: platform/uwp/export/export.cpp +#, fuzzy msgid "Invalid package unique name." msgstr "Ongeldige naam." #: platform/uwp/export/export.cpp #, fuzzy +msgid "Invalid package publisher display name." +msgstr "Ongeldige naam." + +#: platform/uwp/export/export.cpp +#, fuzzy msgid "Invalid product GUID." msgstr "Ongeldige naam." diff --git a/editor/translations/ar.po b/editor/translations/ar.po index a4133403a1..6be373b1f1 100644 --- a/editor/translations/ar.po +++ b/editor/translations/ar.po @@ -2976,8 +2976,8 @@ msgid "Play" msgstr "تشغيل" #: editor/editor_node.cpp -msgid "Pause the scene" -msgstr "إيقا٠المشهد مؤقتاً" +msgid "Pause the scene execution for debugging." +msgstr "" #: editor/editor_node.cpp msgid "Pause Scene" @@ -3672,6 +3672,11 @@ msgstr "مشهد مورث جديد..." #: editor/filesystem_dock.cpp #, fuzzy +msgid "Set As Main Scene" +msgstr "إختر المشهد الأساسي" + +#: editor/filesystem_dock.cpp +#, fuzzy msgid "Open Scenes" msgstr "ÙØªØ Ù…Ø´Ù‡Ø¯" @@ -4456,6 +4461,21 @@ msgid "" msgstr "" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Anim Clips" +msgstr "مقاطع الرسوم المتØركة:" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Audio Clips" +msgstr "مقاطع صوتية:" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Functions" +msgstr "الإعدادات:" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/animation_state_machine_editor.cpp #, fuzzy msgid "Node Renamed" @@ -5162,6 +5182,15 @@ msgid "Grid Step:" msgstr "خطوة الشبكة:" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Primary Line Every:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "steps" +msgstr "خطوتان" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotation Offset:" msgstr "معادل الدوران:" @@ -5171,6 +5200,11 @@ msgstr "خطوة الدوران:" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy +msgid "Scale Step:" +msgstr "تكبير/تصغير:" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy msgid "Move Vertical Guide" msgstr "تØريك الموجه العمودي" @@ -5258,6 +5292,20 @@ msgstr "تغيير المرتكزات" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"Overrides game camera with editor viewport camera." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"No game instance running." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp #, fuzzy msgid "Lock Selected" msgstr "Øدد" @@ -5407,6 +5455,11 @@ msgid "Use Rotation Snap" msgstr "إستعمال كبس التدوير" #: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Use Scale Snap" +msgstr "إستخدم الكبس" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap Relative" msgstr "نسبية الكبس" @@ -5557,7 +5610,7 @@ msgstr "أدخل Ù…ÙØªØ§Ø (مسارات موجودة بالÙعل)" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" -"Auto insert keys when objects are translated, rotated on scaled (based on " +"Auto insert keys when objects are translated, rotated or scaled (based on " "mask).\n" "Keys are only added to existing tracks, no new tracks will be created.\n" "Keys must be inserted manually for the first time." @@ -8582,7 +8635,7 @@ msgid "Dodge operator." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "HardLight operator" +msgid "HardLight operator." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -9179,9 +9232,10 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Custom Godot Shader Language expression, which placed on top of the resulted " -"shader. You can place various function definitions inside and call it later " -"in the Expressions. You can also declare varyings, uniforms and constants." +"Custom Godot Shader Language expression, which is placed on top of the " +"resulted shader. You can place various function definitions inside and call " +"it later in the Expressions. You can also declare varyings, uniforms and " +"constants." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -9293,6 +9347,12 @@ msgid "Add..." msgstr "" #: editor/project_export.cpp +msgid "" +"If checked, the preset will be available for use in one-click deploy.\n" +"Only one preset per platform may be marked as runnable." +msgstr "" + +#: editor/project_export.cpp #, fuzzy msgid "Export Path" msgstr "تصدير المشروع" @@ -9744,18 +9804,6 @@ msgid "Device" msgstr "" #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Shift+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Alt+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Control+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "Press a Key..." msgstr "" @@ -11531,7 +11579,7 @@ msgid "Can't create function of nodes from nodes of multiple functions." msgstr "" #: modules/visual_script/visual_script_editor.cpp -msgid "Select atleast one node with sequence port." +msgid "Select at least one node with sequence port." msgstr "" #: modules/visual_script/visual_script_editor.cpp @@ -11846,11 +11894,21 @@ msgstr "" #: platform/uwp/export/export.cpp #, fuzzy +msgid "Invalid package short name." +msgstr "إسم صن٠غير صالØ" + +#: platform/uwp/export/export.cpp +#, fuzzy msgid "Invalid package unique name." msgstr "اسم غير صالØ." #: platform/uwp/export/export.cpp #, fuzzy +msgid "Invalid package publisher display name." +msgstr "اسم غير صالØ." + +#: platform/uwp/export/export.cpp +#, fuzzy msgid "Invalid product GUID." msgstr "اسم غير صالØ." @@ -12399,6 +12457,9 @@ msgstr "يمكن تعيين المتغيرات Ùقط ÙÙŠ الذروة ." msgid "Constants cannot be modified." msgstr "" +#~ msgid "Pause the scene" +#~ msgstr "إيقا٠المشهد مؤقتاً" + #, fuzzy #~ msgid "Snap to Grid" #~ msgstr "الكبس إلي الشبكة" diff --git a/editor/translations/bg.po b/editor/translations/bg.po index 880682ab7c..9f82d5e72d 100644 --- a/editor/translations/bg.po +++ b/editor/translations/bg.po @@ -2889,8 +2889,8 @@ msgid "Play" msgstr "" #: editor/editor_node.cpp -msgid "Pause the scene" -msgstr "ПреуÑтановÑване на Ñцената" +msgid "Pause the scene execution for debugging." +msgstr "" #: editor/editor_node.cpp msgid "Pause Scene" @@ -3584,6 +3584,11 @@ msgstr "Ðов Ñкрипт" #: editor/filesystem_dock.cpp #, fuzzy +msgid "Set As Main Scene" +msgstr "Изберете главна Ñцена" + +#: editor/filesystem_dock.cpp +#, fuzzy msgid "Open Scenes" msgstr "ОтварÑне на Ñцена" @@ -4366,6 +4371,20 @@ msgid "" msgstr "" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Anim Clips" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Audio Clips" +msgstr "ДобавÑне на нови пътечки." + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Functions" +msgstr "Отиди на Ред" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/animation_state_machine_editor.cpp #, fuzzy msgid "Node Renamed" @@ -5061,6 +5080,14 @@ msgid "Grid Step:" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Primary Line Every:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "steps" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy msgid "Rotation Offset:" msgstr "ИзмеÑтване при Завъртане:" @@ -5071,6 +5098,11 @@ msgstr "Съпка при Завъртане:" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy +msgid "Scale Step:" +msgstr "Мащаб:" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy msgid "Move Vertical Guide" msgstr "ПемеÑти вертикална помощна линиÑ" @@ -5158,6 +5190,20 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"Overrides game camera with editor viewport camera." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"No game instance running." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp #, fuzzy msgid "Lock Selected" msgstr "Изберете метод" @@ -5305,6 +5351,10 @@ msgid "Use Rotation Snap" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Use Scale Snap" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap Relative" msgstr "" @@ -5452,7 +5502,7 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" -"Auto insert keys when objects are translated, rotated on scaled (based on " +"Auto insert keys when objects are translated, rotated or scaled (based on " "mask).\n" "Keys are only added to existing tracks, no new tracks will be created.\n" "Keys must be inserted manually for the first time." @@ -8439,7 +8489,7 @@ msgid "Dodge operator." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "HardLight operator" +msgid "HardLight operator." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -9033,9 +9083,10 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Custom Godot Shader Language expression, which placed on top of the resulted " -"shader. You can place various function definitions inside and call it later " -"in the Expressions. You can also declare varyings, uniforms and constants." +"Custom Godot Shader Language expression, which is placed on top of the " +"resulted shader. You can place various function definitions inside and call " +"it later in the Expressions. You can also declare varyings, uniforms and " +"constants." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -9146,6 +9197,12 @@ msgid "Add..." msgstr "" #: editor/project_export.cpp +msgid "" +"If checked, the preset will be available for use in one-click deploy.\n" +"Only one preset per platform may be marked as runnable." +msgstr "" + +#: editor/project_export.cpp #, fuzzy msgid "Export Path" msgstr "ИзнаÑÑне на проекта" @@ -9604,18 +9661,6 @@ msgid "Device" msgstr "УÑтройÑтво" #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Shift+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Alt+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Control+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "Press a Key..." msgstr "" @@ -11402,7 +11447,7 @@ msgid "Can't create function of nodes from nodes of multiple functions." msgstr "" #: modules/visual_script/visual_script_editor.cpp -msgid "Select atleast one node with sequence port." +msgid "Select at least one node with sequence port." msgstr "" #: modules/visual_script/visual_script_editor.cpp @@ -11718,11 +11763,21 @@ msgstr "ÐеуÑпешно Ñъздаване на папка." #: platform/uwp/export/export.cpp #, fuzzy +msgid "Invalid package short name." +msgstr "невалидно име на Група." + +#: platform/uwp/export/export.cpp +#, fuzzy msgid "Invalid package unique name." msgstr "невалидно име на Група." #: platform/uwp/export/export.cpp #, fuzzy +msgid "Invalid package publisher display name." +msgstr "невалидно име на Група." + +#: platform/uwp/export/export.cpp +#, fuzzy msgid "Invalid product GUID." msgstr "Име:" @@ -12294,6 +12349,9 @@ msgstr "" msgid "Constants cannot be modified." msgstr "" +#~ msgid "Pause the scene" +#~ msgstr "ПреуÑтановÑване на Ñцената" + #, fuzzy #~ msgid "Methods:" #~ msgstr "Методи" diff --git a/editor/translations/bn.po b/editor/translations/bn.po index fa1842f3a2..da5e8b41ac 100644 --- a/editor/translations/bn.po +++ b/editor/translations/bn.po @@ -3070,8 +3070,8 @@ msgid "Play" msgstr "চালান" #: editor/editor_node.cpp -msgid "Pause the scene" -msgstr "দৃশà§à¦¯à¦Ÿà¦¿à¦•à§‡ বিরতি দিন" +msgid "Pause the scene execution for debugging." +msgstr "" #: editor/editor_node.cpp msgid "Pause Scene" @@ -3826,6 +3826,11 @@ msgstr "নতà§à¦¨ উতà§à¦¤à¦°à¦¾à¦§à¦¿à¦•à¦¾à¦°à§€ দৃশà§à¦¯..." #: editor/filesystem_dock.cpp #, fuzzy +msgid "Set As Main Scene" +msgstr "পà§à¦°à¦§à¦¾à¦¨ দৃশà§à¦¯" + +#: editor/filesystem_dock.cpp +#, fuzzy msgid "Open Scenes" msgstr "দৃশà§à¦¯ খà§à¦²à§à¦¨" @@ -4630,6 +4635,21 @@ msgid "" msgstr "" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Anim Clips" +msgstr "কà§à¦²à¦¿à¦ªà¦¸à¦®à§‚হ" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Audio Clips" +msgstr "অডিও শà§à¦°à§‹à¦¤à¦¾" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Functions" +msgstr "ফাংশনগà§à¦²à¦¿:" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/animation_state_machine_editor.cpp #, fuzzy msgid "Node Renamed" @@ -5346,6 +5366,14 @@ msgid "Grid Step:" msgstr "গà§à¦°à¦¿à¦¡à§‡à¦° পদকà§à¦·à§‡à¦ª:" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Primary Line Every:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "steps" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotation Offset:" msgstr "ঘূরà§à¦£à¦¾à§Ÿà¦¨à§‡à¦° অফসেট/à¦à¦¾à¦°à¦¸à¦¾à¦®à§à¦¯:" @@ -5355,6 +5383,11 @@ msgstr "ঘূরà§à¦£à¦¾à§Ÿà¦¨à§‡à¦° পদকà§à¦·à§‡à¦ª:" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy +msgid "Scale Step:" +msgstr "সà§à¦•à§‡à¦²/মাপ:" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy msgid "Move Vertical Guide" msgstr "à¦à¦¾à¦°à§à¦Ÿà¦¿à¦•à§à¦¯à¦¾à¦² গাইড সরান" @@ -5450,6 +5483,20 @@ msgstr "অà§à¦¯à¦¾à¦‚করসমূহ পরিবরà§à¦¤à¦¨ করà§à¦¨" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"Overrides game camera with editor viewport camera." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"No game instance running." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp #, fuzzy msgid "Lock Selected" msgstr "নিরà§à¦¬à¦¾à¦šà¦¨ করà§à¦¨" @@ -5601,6 +5648,11 @@ msgid "Use Rotation Snap" msgstr "ঘূরà§à¦£à¦¨ সà§à¦¨à§à¦¯à¦¾à¦ª বà§à¦¯à¦¬à¦¹à¦¾à¦° করà§à¦¨" #: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Use Scale Snap" +msgstr "সà§à¦¨à§à¦¯à¦¾à¦ª বà§à¦¯à¦¬à¦¹à¦¾à¦° করà§à¦¨" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap Relative" msgstr "আপেকà§à¦·à¦¿à¦• সà§à¦¨à§à¦¯à¦¾à¦ª" @@ -5758,7 +5810,7 @@ msgstr "চাবি সনà§à¦¨à¦¿à¦¬à§‡à¦¶ করà§à¦¨ (বিদà§à¦¯à¦®à¦ #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" -"Auto insert keys when objects are translated, rotated on scaled (based on " +"Auto insert keys when objects are translated, rotated or scaled (based on " "mask).\n" "Keys are only added to existing tracks, no new tracks will be created.\n" "Keys must be inserted manually for the first time." @@ -8887,8 +8939,9 @@ msgid "Dodge operator." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "HardLight operator" -msgstr "" +#, fuzzy +msgid "HardLight operator." +msgstr "সà§à¦•à§‡à¦²à¦¾à¦° অপারেটর পরিবরà§à¦¤à¦¨ করà§à¦¨" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Lighten operator." @@ -9492,9 +9545,10 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Custom Godot Shader Language expression, which placed on top of the resulted " -"shader. You can place various function definitions inside and call it later " -"in the Expressions. You can also declare varyings, uniforms and constants." +"Custom Godot Shader Language expression, which is placed on top of the " +"resulted shader. You can place various function definitions inside and call " +"it later in the Expressions. You can also declare varyings, uniforms and " +"constants." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -9615,6 +9669,12 @@ msgid "Add..." msgstr "সংযোগ..." #: editor/project_export.cpp +msgid "" +"If checked, the preset will be available for use in one-click deploy.\n" +"Only one preset per platform may be marked as runnable." +msgstr "" + +#: editor/project_export.cpp #, fuzzy msgid "Export Path" msgstr "à¦à¦•à§à¦¸à¦ªà§‹à¦°à§à¦Ÿà§‡à¦° পà§à¦°à¦¿à¦¸à§‡à¦Ÿ:" @@ -10110,18 +10170,6 @@ msgid "Device" msgstr "ডিà¦à¦¾à¦‡à¦¸/যনà§à¦¤à§à¦°" #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Shift+" -msgstr "Shift+" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Alt+" -msgstr "Alt+" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Control+" -msgstr "কনà§à¦Ÿà§à¦°à§‹à¦²+" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "Press a Key..." msgstr "যেকোনো কী/চাবি চাপà§à¦¨..." @@ -12017,7 +12065,7 @@ msgid "Can't create function of nodes from nodes of multiple functions." msgstr "" #: modules/visual_script/visual_script_editor.cpp -msgid "Select atleast one node with sequence port." +msgid "Select at least one node with sequence port." msgstr "" #: modules/visual_script/visual_script_editor.cpp @@ -12343,10 +12391,20 @@ msgstr "টাইলটি খà§à¦à¦œà§‡ পাওয়া যায়নি:" #: platform/uwp/export/export.cpp #, fuzzy +msgid "Invalid package short name." +msgstr "অগà§à¦°à¦¹à¦£à¦¯à§‹à¦—à§à¦¯ কà§à¦²à¦¾à¦¸ নাম" + +#: platform/uwp/export/export.cpp +#, fuzzy msgid "Invalid package unique name." msgstr "à¦à¦•à¦• (অননà§à¦¯) নামটি অগà§à¦°à¦¹à¦¨à¦¯à§‹à¦—à§à¦¯à¥¤" #: platform/uwp/export/export.cpp +#, fuzzy +msgid "Invalid package publisher display name." +msgstr "à¦à¦•à¦• (অননà§à¦¯) নামটি অগà§à¦°à¦¹à¦¨à¦¯à§‹à¦—à§à¦¯à¥¤" + +#: platform/uwp/export/export.cpp msgid "Invalid product GUID." msgstr "পণà§à¦¯à§‡à¦° অগà§à¦°à¦¹à¦¨à¦¯à§‹à¦—à§à¦¯ GUID।" @@ -12946,6 +13004,18 @@ msgstr "" msgid "Constants cannot be modified." msgstr "" +#~ msgid "Pause the scene" +#~ msgstr "দৃশà§à¦¯à¦Ÿà¦¿à¦•à§‡ বিরতি দিন" + +#~ msgid "Shift+" +#~ msgstr "Shift+" + +#~ msgid "Alt+" +#~ msgstr "Alt+" + +#~ msgid "Control+" +#~ msgstr "কনà§à¦Ÿà§à¦°à§‹à¦²+" + #, fuzzy #~ msgid "Snap to Grid" #~ msgstr "সà§à¦¨à§à¦¯à¦¾à¦ª মোড:" diff --git a/editor/translations/ca.po b/editor/translations/ca.po index 3c105cd75c..4740b9ac89 100644 --- a/editor/translations/ca.po +++ b/editor/translations/ca.po @@ -2930,8 +2930,8 @@ msgid "Play" msgstr "Reprodueix" #: editor/editor_node.cpp -msgid "Pause the scene" -msgstr "Pausa l'escena" +msgid "Pause the scene execution for debugging." +msgstr "" #: editor/editor_node.cpp msgid "Pause Scene" @@ -3619,6 +3619,11 @@ msgid "New Inherited Scene" msgstr "Nova Escena Heretada" #: editor/filesystem_dock.cpp +#, fuzzy +msgid "Set As Main Scene" +msgstr "Escena Principal" + +#: editor/filesystem_dock.cpp msgid "Open Scenes" msgstr "Obrir Escenes" @@ -4355,6 +4360,21 @@ msgstr "" "que no es poden recuperar els noms de les pistes." #: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Anim Clips" +msgstr "Talls d'Animació:" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Audio Clips" +msgstr "Talls d'Àudio:" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Functions" +msgstr "Funcions:" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/animation_state_machine_editor.cpp msgid "Node Renamed" msgstr "Node Reanomenat" @@ -5047,6 +5067,15 @@ msgid "Grid Step:" msgstr "Pas de la Graella:" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Primary Line Every:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "steps" +msgstr "2 passos" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotation Offset:" msgstr "òfset de la Rotació:" @@ -5055,6 +5084,11 @@ msgid "Rotation Step:" msgstr "Pas de la Rotació:" #: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Scale Step:" +msgstr "Escala:" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move Vertical Guide" msgstr "Moure guia vertical" @@ -5144,6 +5178,20 @@ msgstr "Modifica Ancoratges" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"Overrides game camera with editor viewport camera." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"No game instance running." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp #, fuzzy msgid "Lock Selected" msgstr "Bloca el Seleccionat" @@ -5294,6 +5342,11 @@ msgid "Use Rotation Snap" msgstr "Utilitzar Ajustament de Rotació" #: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Use Scale Snap" +msgstr "Utilitzar Ajustament" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap Relative" msgstr "Ajustament Relatiu" @@ -5442,7 +5495,7 @@ msgstr "Inserir claus (basades en mascara)." #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy msgid "" -"Auto insert keys when objects are translated, rotated on scaled (based on " +"Auto insert keys when objects are translated, rotated or scaled (based on " "mask).\n" "Keys are only added to existing tracks, no new tracks will be created.\n" "Keys must be inserted manually for the first time." @@ -8443,8 +8496,9 @@ msgid "Dodge operator." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "HardLight operator" -msgstr "" +#, fuzzy +msgid "HardLight operator." +msgstr "Operador Aclarir." #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy @@ -9100,9 +9154,10 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Custom Godot Shader Language expression, which placed on top of the resulted " -"shader. You can place various function definitions inside and call it later " -"in the Expressions. You can also declare varyings, uniforms and constants." +"Custom Godot Shader Language expression, which is placed on top of the " +"resulted shader. You can place various function definitions inside and call " +"it later in the Expressions. You can also declare varyings, uniforms and " +"constants." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -9216,6 +9271,12 @@ msgid "Add..." msgstr "Afegeix..." #: editor/project_export.cpp +msgid "" +"If checked, the preset will be available for use in one-click deploy.\n" +"Only one preset per platform may be marked as runnable." +msgstr "" + +#: editor/project_export.cpp msgid "Export Path" msgstr "Camà d'exportació" @@ -9717,18 +9778,6 @@ msgid "Device" msgstr "Dispositiu" #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Shift+" -msgstr "Maj +" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Alt+" -msgstr "Alt +" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Control+" -msgstr "Control+" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "Press a Key..." msgstr "Premeu una Tecla..." @@ -11531,7 +11580,7 @@ msgid "Can't create function of nodes from nodes of multiple functions." msgstr "" #: modules/visual_script/visual_script_editor.cpp -msgid "Select atleast one node with sequence port." +msgid "Select at least one node with sequence port." msgstr "" #: modules/visual_script/visual_script_editor.cpp @@ -11879,10 +11928,20 @@ msgid "Using default boot splash image." msgstr "Utilitzant la imatge de presentació per defecte." #: platform/uwp/export/export.cpp +#, fuzzy +msgid "Invalid package short name." +msgstr "El nom del paquet no és và lid:" + +#: platform/uwp/export/export.cpp msgid "Invalid package unique name." msgstr "El nom únic del paquet no és và lid." #: platform/uwp/export/export.cpp +#, fuzzy +msgid "Invalid package publisher display name." +msgstr "El nom únic del paquet no és và lid." + +#: platform/uwp/export/export.cpp msgid "Invalid product GUID." msgstr "GUID del producte no và lid." @@ -12541,6 +12600,18 @@ msgstr "" msgid "Constants cannot be modified." msgstr "Les constants no es poden modificar." +#~ msgid "Pause the scene" +#~ msgstr "Pausa l'escena" + +#~ msgid "Shift+" +#~ msgstr "Maj +" + +#~ msgid "Alt+" +#~ msgstr "Alt +" + +#~ msgid "Control+" +#~ msgstr "Control+" + #~ msgid "Snap to Grid" #~ msgstr "Ajustar a la QuadrÃcula" diff --git a/editor/translations/cs.po b/editor/translations/cs.po index dc6e69bc0c..d359c22f28 100644 --- a/editor/translations/cs.po +++ b/editor/translations/cs.po @@ -2948,8 +2948,8 @@ msgid "Play" msgstr "Spustit" #: editor/editor_node.cpp -msgid "Pause the scene" -msgstr "Pozastavit scénu" +msgid "Pause the scene execution for debugging." +msgstr "" #: editor/editor_node.cpp msgid "Pause Scene" @@ -3641,6 +3641,11 @@ msgstr "Nová odvozená scéna..." #: editor/filesystem_dock.cpp #, fuzzy +msgid "Set As Main Scene" +msgstr "Hlavnà scéna" + +#: editor/filesystem_dock.cpp +#, fuzzy msgid "Open Scenes" msgstr "OtevÅ™Ãt scénu" @@ -4379,6 +4384,21 @@ msgid "" msgstr "" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Anim Clips" +msgstr "AnimaÄnà klipy:" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Audio Clips" +msgstr "Audio klipy:" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Functions" +msgstr "Funkce:" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/animation_state_machine_editor.cpp msgid "Node Renamed" msgstr "Uzel pÅ™ejmenován" @@ -5061,6 +5081,15 @@ msgid "Grid Step:" msgstr "Krok mřÞky:" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Primary Line Every:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "steps" +msgstr "2 kroky" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotation Offset:" msgstr "Offset rotace:" @@ -5070,6 +5099,11 @@ msgstr "Krok rotace:" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy +msgid "Scale Step:" +msgstr "ZvÄ›tÅ¡enÃ:" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy msgid "Move Vertical Guide" msgstr "PÅ™esunout svislé vodÃtko" @@ -5157,6 +5191,20 @@ msgstr "Upravit kotvy" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"Overrides game camera with editor viewport camera." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"No game instance running." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp #, fuzzy msgid "Lock Selected" msgstr "Nástroj VýbÄ›r" @@ -5304,6 +5352,11 @@ msgid "Use Rotation Snap" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Use Scale Snap" +msgstr "PoužÃt pÅ™ichycovánÃ" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap Relative" msgstr "" @@ -5453,7 +5506,7 @@ msgstr "Vložit klÃÄ (existujÃcà stopy)" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" -"Auto insert keys when objects are translated, rotated on scaled (based on " +"Auto insert keys when objects are translated, rotated or scaled (based on " "mask).\n" "Keys are only added to existing tracks, no new tracks will be created.\n" "Keys must be inserted manually for the first time." @@ -8446,8 +8499,9 @@ msgid "Dodge operator." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "HardLight operator" -msgstr "" +#, fuzzy +msgid "HardLight operator." +msgstr "ZmÄ›nit skalárnà operátor" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Lighten operator." @@ -9057,9 +9111,10 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Custom Godot Shader Language expression, which placed on top of the resulted " -"shader. You can place various function definitions inside and call it later " -"in the Expressions. You can also declare varyings, uniforms and constants." +"Custom Godot Shader Language expression, which is placed on top of the " +"resulted shader. You can place various function definitions inside and call " +"it later in the Expressions. You can also declare varyings, uniforms and " +"constants." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -9172,6 +9227,12 @@ msgid "Add..." msgstr "PÅ™idat..." #: editor/project_export.cpp +msgid "" +"If checked, the preset will be available for use in one-click deploy.\n" +"Only one preset per platform may be marked as runnable." +msgstr "" + +#: editor/project_export.cpp msgid "Export Path" msgstr "Exportovat cestu" @@ -9624,18 +9685,6 @@ msgid "Device" msgstr "ZaÅ™ÃzenÃ" #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Shift+" -msgstr "Shift+" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Alt+" -msgstr "Alt+" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Control+" -msgstr "Ctrl+" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "Press a Key..." msgstr "StisknÄ›te klávesu..." @@ -11430,7 +11479,7 @@ msgid "Can't create function of nodes from nodes of multiple functions." msgstr "" #: modules/visual_script/visual_script_editor.cpp -msgid "Select atleast one node with sequence port." +msgid "Select at least one node with sequence port." msgstr "" #: modules/visual_script/visual_script_editor.cpp @@ -11752,10 +11801,20 @@ msgstr "Nelze vytvoÅ™it složku." #: platform/uwp/export/export.cpp #, fuzzy +msgid "Invalid package short name." +msgstr "Neplatné jméno tÅ™Ãdy" + +#: platform/uwp/export/export.cpp +#, fuzzy msgid "Invalid package unique name." msgstr "Neplatný unikátnà název." #: platform/uwp/export/export.cpp +#, fuzzy +msgid "Invalid package publisher display name." +msgstr "Neplatný unikátnà název." + +#: platform/uwp/export/export.cpp msgid "Invalid product GUID." msgstr "Neplatné GUID produktu." @@ -12367,6 +12426,18 @@ msgstr "" msgid "Constants cannot be modified." msgstr "Konstanty nenà možné upravovat." +#~ msgid "Pause the scene" +#~ msgstr "Pozastavit scénu" + +#~ msgid "Shift+" +#~ msgstr "Shift+" + +#~ msgid "Alt+" +#~ msgstr "Alt+" + +#~ msgid "Control+" +#~ msgstr "Ctrl+" + #, fuzzy #~ msgid "Snap to Grid" #~ msgstr "PÅ™ichytit k mřÞce" diff --git a/editor/translations/da.po b/editor/translations/da.po index b91eec6954..cd37bbc5f9 100644 --- a/editor/translations/da.po +++ b/editor/translations/da.po @@ -2981,8 +2981,8 @@ msgid "Play" msgstr "Spil" #: editor/editor_node.cpp -msgid "Pause the scene" -msgstr "Sæt scenen pÃ¥ pause" +msgid "Pause the scene execution for debugging." +msgstr "" #: editor/editor_node.cpp msgid "Pause Scene" @@ -3678,6 +3678,11 @@ msgstr "Ny Nedarvet Scene..." #: editor/filesystem_dock.cpp #, fuzzy +msgid "Set As Main Scene" +msgstr "Vælg en Main Scene" + +#: editor/filesystem_dock.cpp +#, fuzzy msgid "Open Scenes" msgstr "Ã…bn Scene" @@ -4459,6 +4464,21 @@ msgid "" msgstr "" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Anim Clips" +msgstr "Anim klip:" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Audio Clips" +msgstr "Lydklip:" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Functions" +msgstr "Funktioner:" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/animation_state_machine_editor.cpp #, fuzzy msgid "Node Renamed" @@ -5161,6 +5181,14 @@ msgid "Grid Step:" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Primary Line Every:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "steps" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotation Offset:" msgstr "" @@ -5170,6 +5198,11 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy +msgid "Scale Step:" +msgstr "Skalaforhold:" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy msgid "Move Vertical Guide" msgstr "Fjern vertikal guide" @@ -5258,6 +5291,20 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"Overrides game camera with editor viewport camera." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"No game instance running." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp #, fuzzy msgid "Lock Selected" msgstr "Vælg værktøj" @@ -5404,6 +5451,10 @@ msgid "Use Rotation Snap" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Use Scale Snap" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap Relative" msgstr "" @@ -5549,7 +5600,7 @@ msgstr "Anim Indsæt Nøgle" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" -"Auto insert keys when objects are translated, rotated on scaled (based on " +"Auto insert keys when objects are translated, rotated or scaled (based on " "mask).\n" "Keys are only added to existing tracks, no new tracks will be created.\n" "Keys must be inserted manually for the first time." @@ -8552,7 +8603,7 @@ msgid "Dodge operator." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "HardLight operator" +msgid "HardLight operator." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -9147,9 +9198,10 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Custom Godot Shader Language expression, which placed on top of the resulted " -"shader. You can place various function definitions inside and call it later " -"in the Expressions. You can also declare varyings, uniforms and constants." +"Custom Godot Shader Language expression, which is placed on top of the " +"resulted shader. You can place various function definitions inside and call " +"it later in the Expressions. You can also declare varyings, uniforms and " +"constants." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -9261,6 +9313,12 @@ msgid "Add..." msgstr "" #: editor/project_export.cpp +msgid "" +"If checked, the preset will be available for use in one-click deploy.\n" +"Only one preset per platform may be marked as runnable." +msgstr "" + +#: editor/project_export.cpp #, fuzzy msgid "Export Path" msgstr "Eksporter Projekt" @@ -9718,18 +9776,6 @@ msgid "Device" msgstr "Enhed" #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Shift+" -msgstr "Shift+" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Alt+" -msgstr "Alt +" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Control+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "Press a Key..." msgstr "" @@ -11517,7 +11563,7 @@ msgid "Can't create function of nodes from nodes of multiple functions." msgstr "" #: modules/visual_script/visual_script_editor.cpp -msgid "Select atleast one node with sequence port." +msgid "Select at least one node with sequence port." msgstr "" #: modules/visual_script/visual_script_editor.cpp @@ -11843,11 +11889,21 @@ msgstr "Kan ikke læse boot splash billed fil:\n" #: platform/uwp/export/export.cpp #, fuzzy +msgid "Invalid package short name." +msgstr "Ugyldigt navn." + +#: platform/uwp/export/export.cpp +#, fuzzy msgid "Invalid package unique name." msgstr "Ugyldigt index egenskabsnavn." #: platform/uwp/export/export.cpp #, fuzzy +msgid "Invalid package publisher display name." +msgstr "Ugyldigt index egenskabsnavn." + +#: platform/uwp/export/export.cpp +#, fuzzy msgid "Invalid product GUID." msgstr "Ugyldig skriftstørrelse." @@ -12448,6 +12504,15 @@ msgstr "" msgid "Constants cannot be modified." msgstr "Konstanter kan ikke ændres." +#~ msgid "Pause the scene" +#~ msgstr "Sæt scenen pÃ¥ pause" + +#~ msgid "Shift+" +#~ msgstr "Shift+" + +#~ msgid "Alt+" +#~ msgstr "Alt +" + #, fuzzy #~ msgid "Add input +" #~ msgstr "Tilføj punkt" diff --git a/editor/translations/de.po b/editor/translations/de.po index 8c4a29f571..ab157ee779 100644 --- a/editor/translations/de.po +++ b/editor/translations/de.po @@ -46,11 +46,12 @@ # Nicolas Mohr <81moni1bif@hft-stuttgart.de>, 2019. # Linux User <no-ads@mail.de>, 2019. # David May <wasser@gmail.com>, 2019. +# Draco Drache <jan.holger.te@gmail.com>, 2019. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2019-10-04 03:14+0000\n" +"PO-Revision-Date: 2019-11-25 04:04+0000\n" "Last-Translator: So Wieso <sowieso@dukun.de>\n" "Language-Team: German <https://hosted.weblate.org/projects/godot-engine/" "godot/de/>\n" @@ -59,7 +60,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 3.9-dev\n" +"X-Generator: Weblate 3.10-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -674,9 +675,8 @@ msgid "Scale Ratio:" msgstr "Skalierungsverhältnis:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Select Tracks to Copy" -msgstr "Zu kopierende Spuren auswählen:" +msgstr "Zu kopierende Spuren auswählen" #: editor/animation_track_editor.cpp editor/editor_log.cpp #: editor/editor_properties.cpp @@ -688,9 +688,8 @@ msgid "Copy" msgstr "Kopieren" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Select All/None" -msgstr "Nichts auswählen" +msgstr "Alles/Nichts auswählen" #: editor/animation_track_editor_plugins.cpp msgid "Add Audio Track Clip" @@ -2946,8 +2945,8 @@ msgid "Play" msgstr "Starten" #: editor/editor_node.cpp -msgid "Pause the scene" -msgstr "Szene pausieren" +msgid "Pause the scene execution for debugging." +msgstr "Ausgeführte Szenen zum Debuggen anhalten." #: editor/editor_node.cpp msgid "Pause Scene" @@ -3641,6 +3640,10 @@ msgid "New Inherited Scene" msgstr "Neue geerbte Szene" #: editor/filesystem_dock.cpp +msgid "Set As Main Scene" +msgstr "Als Hauptszene setzen" + +#: editor/filesystem_dock.cpp msgid "Open Scenes" msgstr "Szenen öffnen" @@ -4374,6 +4377,18 @@ msgstr "" "nicht abgerufen werden." #: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Anim Clips" +msgstr "Animationsausschnitt" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Audio Clips" +msgstr "Audioausschnitt" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Functions" +msgstr "Funktionen" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/animation_state_machine_editor.cpp msgid "Node Renamed" msgstr "Node umbenannt" @@ -4963,7 +4978,7 @@ msgstr "Alle" #: editor/plugins/asset_library_editor_plugin.cpp msgid "No results for \"%s\"." -msgstr "" +msgstr "Keine Ergebnisse für „%s“." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Import..." @@ -5053,6 +5068,14 @@ msgid "Grid Step:" msgstr "Gitterabstand:" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Primary Line Every:" +msgstr "Alle Hauptzeilen:" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "steps" +msgstr "Schritte" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotation Offset:" msgstr "Rotationsversatz:" @@ -5061,6 +5084,10 @@ msgid "Rotation Step:" msgstr "Rotationsabstand:" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale Step:" +msgstr "Skalierungsabschnitte:" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move Vertical Guide" msgstr "Vertikale Hilfslinie verschieben" @@ -5146,8 +5173,26 @@ msgstr "Ankerpunkte ändern" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"Overrides game camera with editor viewport camera." +msgstr "" +"Spielekamera überschreiben\n" +"Ãœberschreibt die Spielekamera mit der Kamera des Anzeigefensters des Editors." + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"No game instance running." +msgstr "" +"Spielekamera überschreiben\n" +"Es läuft keine Spielinstanz." + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp msgid "Lock Selected" -msgstr "Auswahl sperren" +msgstr "Sperren ausgewählt" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -5263,24 +5308,20 @@ msgid "Ruler Mode" msgstr "Linealmodus" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Toggle smart snapping." -msgstr "Einrasten umschalten." +msgstr "Intelligentes Einrasten umschalten." #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Use Smart Snap" -msgstr "Einrasten aktivieren" +msgstr "Kluges Einrasten verwenden" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Toggle grid snapping." -msgstr "Einrasten umschalten." +msgstr "Gitter-Einrasten umschalten." #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Use Grid Snap" -msgstr "Gitter-Einrasten" +msgstr "Gitter-Einrasten benutzen" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snapping Options" @@ -5291,6 +5332,10 @@ msgid "Use Rotation Snap" msgstr "Rotationsraster benutzen" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Use Scale Snap" +msgstr "Einrasten verwenden" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap Relative" msgstr "Relatives Einrasten benutzen" @@ -5374,9 +5419,8 @@ msgid "View" msgstr "Ansicht" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Always Show Grid" -msgstr "Raster anzeigen" +msgstr "Raster immer anzeigen" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Show Helpers" @@ -5432,7 +5476,7 @@ msgstr "Schlüsselbilder einfügen (basierend auf Maske)." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" -"Auto insert keys when objects are translated, rotated on scaled (based on " +"Auto insert keys when objects are translated, rotated or scaled (based on " "mask).\n" "Keys are only added to existing tracks, no new tracks will be created.\n" "Keys must be inserted manually for the first time." @@ -5643,9 +5687,8 @@ msgid "Hold Shift to edit tangents individually" msgstr "Umsch halten um Tangenten einzeln zu bearbeiten" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Right click to add point" -msgstr "Rechtsklick: Punkt löschen" +msgstr "Rechtsklicken um Punkt hinzuzufügen" #: editor/plugins/gi_probe_editor_plugin.cpp msgid "Bake GI Probe" @@ -7107,9 +7150,8 @@ msgid "Freelook Speed Modifier" msgstr "Freisicht Geschwindigkeitsregler" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Freelook Slow Modifier" -msgstr "Freisicht Geschwindigkeitsregler" +msgstr "Freisicht Trägheitsregler" #: editor/plugins/spatial_editor_plugin.cpp msgid "" @@ -7384,9 +7426,8 @@ msgid "Simplification: " msgstr "Vereinfachung: " #: editor/plugins/sprite_editor_plugin.cpp -#, fuzzy msgid "Shrink (Pixels): " -msgstr "Wachsen (Pixel): " +msgstr "Schrumpfen (Pixel): " #: editor/plugins/sprite_editor_plugin.cpp msgid "Grow (Pixels): " @@ -8176,9 +8217,8 @@ msgid "(GLES3 only)" msgstr "(Nur GLES3)" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Add Output" -msgstr "Ausgang hinzufügen +" +msgstr "Ausgang hinzufügen" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Scalar" @@ -8193,9 +8233,8 @@ msgid "Boolean" msgstr "Boolean" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Sampler" -msgstr "Samples" +msgstr "Sampler" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Add input port" @@ -8327,8 +8366,8 @@ msgid "Dodge operator." msgstr "Umgehungsoperator." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "HardLight operator" -msgstr "Hartlicht-Operator" +msgid "HardLight operator." +msgstr "Hartlichtoperator." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Lighten operator." @@ -8970,11 +9009,12 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Custom Godot Shader Language expression, which placed on top of the resulted " -"shader. You can place various function definitions inside and call it later " -"in the Expressions. You can also declare varyings, uniforms and constants." +"Custom Godot Shader Language expression, which is placed on top of the " +"resulted shader. You can place various function definitions inside and call " +"it later in the Expressions. You can also declare varyings, uniforms and " +"constants." msgstr "" -"Ein selbst-erstellter Ausdruck in der Godot-Shader-Sprache, welcher vor dem " +"Selbst-erstellter Ausdruck in der Godot-Shader-Sprache, welcher vor dem " "resultierten Shader platziert wird. Hier können beliebige " "Funktionsdefinitionen eingefügt werden die dann in späteren Ausdrücken " "verwendet werden können. Das gleiche gilt für Varyings, Uniforms und " @@ -9103,6 +9143,15 @@ msgid "Add..." msgstr "Hinzufügen..." #: editor/project_export.cpp +msgid "" +"If checked, the preset will be available for use in one-click deploy.\n" +"Only one preset per platform may be marked as runnable." +msgstr "" +"Falls augeählt, werden die Voreinstellungen für die Ein-Klick-Entwicklung " +"verfügbar sein.\n" +"Nur eine Voreinstellung pro Platform muss ausführbar sein." + +#: editor/project_export.cpp msgid "Export Path" msgstr "Exportpfad" @@ -9116,7 +9165,7 @@ msgstr "Exportiere alle Ressourcen des Projekts" #: editor/project_export.cpp msgid "Export selected scenes (and dependencies)" -msgstr "Exportiere ausgewählte Ressourcen (inklusive Abhängigkeiten)" +msgstr "Exportiere ausgewählte Szenen (inklusive Abhängigkeiten)" #: editor/project_export.cpp msgid "Export selected resources (and dependencies)" @@ -9131,22 +9180,20 @@ msgid "Resources to export:" msgstr "Zu exportierende Ressourcen:" #: editor/project_export.cpp -#, fuzzy msgid "" "Filters to export non-resource files/folders\n" "(comma-separated, e.g: *.json, *.txt, docs/*)" msgstr "" -"Filter um Nicht-Ressourcendateien zu exportieren (durch Kommata getrennt, z." -"B.: *.json, *.txt)" +"Filter um Nicht-Ressourcendateien/-ordner zu exportieren\n" +"(durch Kommata getrennt, z.B.: *.json, *.txt, docs/*)" #: editor/project_export.cpp -#, fuzzy msgid "" "Filters to exclude files/folders from project\n" "(comma-separated, e.g: *.json, *.txt, docs/*)" msgstr "" -"Filter um vom Export auszuschließen (durch Kommata getrennt, z.B.: *.json, *." -"txt)" +"Filter um Dateien/Ordner vom Projekt auszuschließen\n" +"(durch Kommata getrennt, z.B.: *.json, *.txt, docs/*)" #: editor/project_export.cpp msgid "Patches" @@ -9600,18 +9647,6 @@ msgid "Device" msgstr "Gerät" #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Shift+" -msgstr "Umschalt+" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Alt+" -msgstr "Alt+" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Control+" -msgstr "Steuerung+" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "Press a Key..." msgstr "Drücke eine Taste..." @@ -9681,7 +9716,7 @@ msgstr "Ereignis hinzufügen" #: editor/project_settings_editor.cpp msgid "Button" -msgstr "Taste, Knopf (Button)" +msgstr "Knopf" #: editor/project_settings_editor.cpp msgid "Left Button." @@ -10197,13 +10232,13 @@ msgstr "" "dieses Nodes wieder in ihren Ausgangszustand zurückgesetzt." #: editor/scene_tree_dock.cpp -#, fuzzy msgid "" "Enabling \"Load As Placeholder\" will disable \"Editable Children\" and " "cause all properties of the node to be reverted to their default." msgstr "" -"Wenn „Editierbare Instanz“ deaktiviert wird, werden alle Eigenschaften " -"dieses Nodes wieder in ihren Ausgangszustand zurückgesetzt." +"Das Aktivieren von „Als Platzhalter laden“ wird die Option „Bearbeitbare " +"Unterobjekte“ deaktivieren und alle so bereits bearbeiteten Werte des Nodes " +"auf ihre Standardwerte zurücksetzen." #: editor/scene_tree_dock.cpp msgid "Make Local" @@ -10543,19 +10578,16 @@ msgid "Will load an existing script file." msgstr "Dies wird eine bestehende Skriptdatei laden." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Class Name:" -msgstr "Klassenname" +msgstr "Klassenname:" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Template:" -msgstr "Vorlage" +msgstr "Vorlage:" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Built-in Script:" -msgstr "Eingebettetes Skript" +msgstr "Eingebettetes Skript:" #: editor/script_create_dialog.cpp msgid "Attach Node Script" @@ -11198,7 +11230,6 @@ msgid "Add Function" msgstr "Funktion hinzufügen" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Delete input port" msgstr "Eingangsschnittstelle entfernen" @@ -11211,22 +11242,18 @@ msgid "Add Signal" msgstr "Signal hinzufügen" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Add Input Port" msgstr "Eingangsschnittstelle hinzufügen" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Add Output Port" msgstr "Ausgangsschnittstelle hinzufügen" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Remove Input Port" msgstr "Eingangsschnittstelle entfernen" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Remove Output Port" msgstr "Ausgangsschnittstelle entfernen" @@ -11277,6 +11304,8 @@ msgstr "Preload-Node hinzufügen" #: modules/visual_script/visual_script_editor.cpp msgid "Can't drop nodes because script '%s' is not used in this scene." msgstr "" +"Nodes können hier nicht fallen gelassen werden da Skript ‚%s‘ in dieser " +"Szene nicht genutzt wird." #: modules/visual_script/visual_script_editor.cpp msgid "Add Node(s) From Tree" @@ -11287,6 +11316,9 @@ msgid "" "Can't drop properties because script '%s' is not used in this scene.\n" "Drop holding 'Shift' to just copy the signature." msgstr "" +"Kann Eigenschaften nicht fallen lassen da Skript ‚%s‘ in dieser Szene nicht " +"genutzt wird.\n" +"Mittels gedrückter Umschalttaste kann zumindest die Signatur kopiert werden." #: modules/visual_script/visual_script_editor.cpp msgid "Add Getter Property" @@ -11313,9 +11345,8 @@ msgid "Connect Nodes" msgstr "Nodes verbinden" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Disconnect Nodes" -msgstr "Trenne Graph-Nodes" +msgstr "Getrennte Nodes" #: modules/visual_script/visual_script_editor.cpp msgid "Connect Node Data" @@ -11350,26 +11381,26 @@ msgid "Paste VisualScript Nodes" msgstr "VisualScript-Nodes einfügen" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Can't create function with a function node." -msgstr "Das Function-Node kann nicht kopiert werden." +msgstr "Funktion kann nicht mit einem Funktion-Node erstellt werden." #: modules/visual_script/visual_script_editor.cpp msgid "Can't create function of nodes from nodes of multiple functions." msgstr "" +"Eine Nodes-Funktion kann nicht aus Nodes mehrerer Funktionen erstellt werden." #: modules/visual_script/visual_script_editor.cpp -msgid "Select atleast one node with sequence port." +msgid "Select at least one node with sequence port." msgstr "" +"Mindestens ein Node mit einer Sequenz-Schnittstelle muss ausgewählt werden." #: modules/visual_script/visual_script_editor.cpp msgid "Try to only have one sequence input in selection." -msgstr "" +msgstr "Nur einen Sequenz-Eingang sollte ausgewählt sein." #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Create Function" -msgstr "Funktion umbenennen" +msgstr "Funktion erstellen" #: modules/visual_script/visual_script_editor.cpp msgid "Remove Function" @@ -11400,9 +11431,8 @@ msgid "Members:" msgstr "Mitglieder:" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "function_name" -msgstr "Funktion:" +msgstr "Funktionsname" #: modules/visual_script/visual_script_editor.cpp msgid "Select or create a function to edit its graph." @@ -11426,14 +11456,12 @@ msgid "Cut Nodes" msgstr "Nodes trennen" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Make Function" -msgstr "Funktion umbenennen" +msgstr "Funktion bauen" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Refresh Graph" -msgstr "Aktualisieren" +msgstr "Graph aktualisieren" #: modules/visual_script/visual_script_editor.cpp msgid "Edit Member" @@ -11660,7 +11688,7 @@ msgstr "Benötigtes Icon wurde nicht in der Vorlage festgelegt." #: platform/javascript/export/export.cpp msgid "Stop HTTP Server" -msgstr "" +msgstr "HTTP-Server stoppen" #: platform/javascript/export/export.cpp msgid "Run in Browser" @@ -11695,10 +11723,18 @@ msgid "Using default boot splash image." msgstr "Verwende Standard-Startbildschirm-Bilddatei." #: platform/uwp/export/export.cpp +msgid "Invalid package short name." +msgstr "Ungültiger Paketekurzname." + +#: platform/uwp/export/export.cpp msgid "Invalid package unique name." msgstr "Ungültiger paket-einzigartiger Name." #: platform/uwp/export/export.cpp +msgid "Invalid package publisher display name." +msgstr "Ungültiger Paket-Autor-Name." + +#: platform/uwp/export/export.cpp msgid "Invalid product GUID." msgstr "Ungültige Produkt-GUID." @@ -12377,6 +12413,18 @@ msgstr "Varyings können nur in Vertex-Funktion zugewiesen werden." msgid "Constants cannot be modified." msgstr "Konstanten können nicht verändert werden." +#~ msgid "Pause the scene" +#~ msgstr "Szene pausieren" + +#~ msgid "Shift+" +#~ msgstr "Umschalt+" + +#~ msgid "Alt+" +#~ msgstr "Alt+" + +#~ msgid "Control+" +#~ msgstr "Steuerung+" + #~ msgid "Snap to Grid" #~ msgstr "Am Gitter einrasten" diff --git a/editor/translations/de_CH.po b/editor/translations/de_CH.po index 8498847001..5b8d7da474 100644 --- a/editor/translations/de_CH.po +++ b/editor/translations/de_CH.po @@ -2870,7 +2870,7 @@ msgid "Play" msgstr "Abspielen" #: editor/editor_node.cpp -msgid "Pause the scene" +msgid "Pause the scene execution for debugging." msgstr "" #: editor/editor_node.cpp @@ -3568,6 +3568,11 @@ msgstr "Script hinzufügen" #: editor/filesystem_dock.cpp #, fuzzy +msgid "Set As Main Scene" +msgstr "Neue Szene speichern als..." + +#: editor/filesystem_dock.cpp +#, fuzzy msgid "Open Scenes" msgstr "Datei(en) öffnen" @@ -4324,6 +4329,19 @@ msgid "" msgstr "" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Anim Clips" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Audio Clips" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Functions" +msgstr "Node erstellen" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/animation_state_machine_editor.cpp #, fuzzy msgid "Node Renamed" @@ -5020,6 +5038,14 @@ msgid "Grid Step:" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Primary Line Every:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "steps" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotation Offset:" msgstr "" @@ -5029,6 +5055,11 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy +msgid "Scale Step:" +msgstr "TimeScale-Node" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy msgid "Move Vertical Guide" msgstr "Ungültige Bilder löschen" @@ -5118,6 +5149,20 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"Overrides game camera with editor viewport camera." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"No game instance running." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp msgid "Lock Selected" msgstr "" @@ -5261,6 +5306,10 @@ msgid "Use Rotation Snap" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Use Scale Snap" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap Relative" msgstr "" @@ -5406,7 +5455,7 @@ msgstr "Bilder (innerhalb) einfügen" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" -"Auto insert keys when objects are translated, rotated on scaled (based on " +"Auto insert keys when objects are translated, rotated or scaled (based on " "mask).\n" "Keys are only added to existing tracks, no new tracks will be created.\n" "Keys must be inserted manually for the first time." @@ -8392,7 +8441,7 @@ msgid "Dodge operator." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "HardLight operator" +msgid "HardLight operator." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8982,9 +9031,10 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Custom Godot Shader Language expression, which placed on top of the resulted " -"shader. You can place various function definitions inside and call it later " -"in the Expressions. You can also declare varyings, uniforms and constants." +"Custom Godot Shader Language expression, which is placed on top of the " +"resulted shader. You can place various function definitions inside and call " +"it later in the Expressions. You can also declare varyings, uniforms and " +"constants." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -9095,6 +9145,12 @@ msgid "Add..." msgstr "" #: editor/project_export.cpp +msgid "" +"If checked, the preset will be available for use in one-click deploy.\n" +"Only one preset per platform may be marked as runnable." +msgstr "" + +#: editor/project_export.cpp #, fuzzy msgid "Export Path" msgstr "Projekt exportieren" @@ -9555,18 +9611,6 @@ msgid "Device" msgstr "" #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Shift+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Alt+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Control+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "Press a Key..." msgstr "Taste drücken..." @@ -11335,7 +11379,7 @@ msgid "Can't create function of nodes from nodes of multiple functions." msgstr "" #: modules/visual_script/visual_script_editor.cpp -msgid "Select atleast one node with sequence port." +msgid "Select at least one node with sequence port." msgstr "" #: modules/visual_script/visual_script_editor.cpp @@ -11649,11 +11693,21 @@ msgstr "" #: platform/uwp/export/export.cpp #, fuzzy +msgid "Invalid package short name." +msgstr "Projektname:" + +#: platform/uwp/export/export.cpp +#, fuzzy msgid "Invalid package unique name." msgstr "Projektname:" #: platform/uwp/export/export.cpp #, fuzzy +msgid "Invalid package publisher display name." +msgstr "Projektname:" + +#: platform/uwp/export/export.cpp +#, fuzzy msgid "Invalid product GUID." msgstr "Projektname:" diff --git a/editor/translations/editor.pot b/editor/translations/editor.pot index 47ac024f4d..d2a8b188f4 100644 --- a/editor/translations/editor.pot +++ b/editor/translations/editor.pot @@ -2756,7 +2756,7 @@ msgid "Play" msgstr "" #: editor/editor_node.cpp -msgid "Pause the scene" +msgid "Pause the scene execution for debugging." msgstr "" #: editor/editor_node.cpp @@ -3421,6 +3421,10 @@ msgid "New Inherited Scene" msgstr "" #: editor/filesystem_dock.cpp +msgid "Set As Main Scene" +msgstr "" + +#: editor/filesystem_dock.cpp msgid "Open Scenes" msgstr "" @@ -4130,6 +4134,18 @@ msgid "" msgstr "" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Anim Clips" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Audio Clips" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Functions" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/animation_state_machine_editor.cpp msgid "Node Renamed" msgstr "" @@ -4796,6 +4812,14 @@ msgid "Grid Step:" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Primary Line Every:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "steps" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotation Offset:" msgstr "" @@ -4804,6 +4828,10 @@ msgid "Rotation Step:" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale Step:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move Vertical Guide" msgstr "" @@ -4885,6 +4913,20 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"Overrides game camera with editor viewport camera." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"No game instance running." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp msgid "Lock Selected" msgstr "" @@ -5019,6 +5061,10 @@ msgid "Use Rotation Snap" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Use Scale Snap" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap Relative" msgstr "" @@ -5158,7 +5204,7 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" -"Auto insert keys when objects are translated, rotated on scaled (based on " +"Auto insert keys when objects are translated, rotated or scaled (based on " "mask).\n" "Keys are only added to existing tracks, no new tracks will be created.\n" "Keys must be inserted manually for the first time." @@ -7985,7 +8031,7 @@ msgid "Dodge operator." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "HardLight operator" +msgid "HardLight operator." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8572,9 +8618,10 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Custom Godot Shader Language expression, which placed on top of the resulted " -"shader. You can place various function definitions inside and call it later " -"in the Expressions. You can also declare varyings, uniforms and constants." +"Custom Godot Shader Language expression, which is placed on top of the " +"resulted shader. You can place various function definitions inside and call " +"it later in the Expressions. You can also declare varyings, uniforms and " +"constants." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8683,6 +8730,12 @@ msgid "Add..." msgstr "" #: editor/project_export.cpp +msgid "" +"If checked, the preset will be available for use in one-click deploy.\n" +"Only one preset per platform may be marked as runnable." +msgstr "" + +#: editor/project_export.cpp msgid "Export Path" msgstr "" @@ -9119,18 +9172,6 @@ msgid "Device" msgstr "" #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Shift+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Alt+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Control+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "Press a Key..." msgstr "" @@ -10819,7 +10860,7 @@ msgid "Can't create function of nodes from nodes of multiple functions." msgstr "" #: modules/visual_script/visual_script_editor.cpp -msgid "Select atleast one node with sequence port." +msgid "Select at least one node with sequence port." msgstr "" #: modules/visual_script/visual_script_editor.cpp @@ -11124,10 +11165,18 @@ msgid "Using default boot splash image." msgstr "" #: platform/uwp/export/export.cpp +msgid "Invalid package short name." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package unique name." msgstr "" #: platform/uwp/export/export.cpp +msgid "Invalid package publisher display name." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid product GUID." msgstr "" diff --git a/editor/translations/el.po b/editor/translations/el.po index 451a24bb00..7aea9126c6 100644 --- a/editor/translations/el.po +++ b/editor/translations/el.po @@ -2923,8 +2923,8 @@ msgid "Play" msgstr "ΑναπαÏαγωγή" #: editor/editor_node.cpp -msgid "Pause the scene" -msgstr "ΠαÏση της σκηνής" +msgid "Pause the scene execution for debugging." +msgstr "" #: editor/editor_node.cpp msgid "Pause Scene" @@ -3620,6 +3620,11 @@ msgid "New Inherited Scene" msgstr "ÎÎα ΚληÏονομημÎνη Σκηνή" #: editor/filesystem_dock.cpp +#, fuzzy +msgid "Set As Main Scene" +msgstr "ΚÏÏια σκηνή" + +#: editor/filesystem_dock.cpp msgid "Open Scenes" msgstr "Άνοιγμα Σκηνών" @@ -4358,6 +4363,21 @@ msgstr "" "ανάκτηση των ονομάτων των κομματιών." #: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Anim Clips" +msgstr "Αποσπάσματα Κίνησης:" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Audio Clips" +msgstr "Αποσπάσματα ήχου:" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Functions" +msgstr "ΣυναÏτήσεις:" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/animation_state_machine_editor.cpp msgid "Node Renamed" msgstr "Μετονομασία Κόμβου" @@ -5047,6 +5067,15 @@ msgid "Grid Step:" msgstr "Βήμα πλÎγματος:" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Primary Line Every:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "steps" +msgstr "2 βήματα" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotation Offset:" msgstr "Μετατόπιση πεÏιστÏοφής:" @@ -5055,6 +5084,11 @@ msgid "Rotation Step:" msgstr "Βήμα πεÏιστÏοφής:" #: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Scale Step:" +msgstr "Κλιμάκωση:" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move Vertical Guide" msgstr "Μετακίνηση Κάθετου ΟδηγοÏ" @@ -5140,6 +5174,20 @@ msgstr "Αλλαγή αγκυÏών" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"Overrides game camera with editor viewport camera." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"No game instance running." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp msgid "Lock Selected" msgstr "Κλείδωμα Επιλογής" @@ -5286,6 +5334,11 @@ msgid "Use Rotation Snap" msgstr "ΧÏήση κουμπώματος πεÏιστÏοφής" #: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Use Scale Snap" +msgstr "ΧÏήση κουμπώματος" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap Relative" msgstr "Σχετικό κοÏμπωμα" @@ -5425,8 +5478,9 @@ msgid "Insert keys (based on mask)." msgstr "Εισαγωγή κλειδιών (βάση μάσκας)." #: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy msgid "" -"Auto insert keys when objects are translated, rotated on scaled (based on " +"Auto insert keys when objects are translated, rotated or scaled (based on " "mask).\n" "Keys are only added to existing tracks, no new tracks will be created.\n" "Keys must be inserted manually for the first time." @@ -8343,7 +8397,8 @@ msgid "Dodge operator." msgstr "Τελεστής άμβλυνσης." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "HardLight operator" +#, fuzzy +msgid "HardLight operator." msgstr "Τελεστής HardLight" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8989,9 +9044,10 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Custom Godot Shader Language expression, which placed on top of the resulted " -"shader. You can place various function definitions inside and call it later " -"in the Expressions. You can also declare varyings, uniforms and constants." +"Custom Godot Shader Language expression, which is placed on top of the " +"resulted shader. You can place various function definitions inside and call " +"it later in the Expressions. You can also declare varyings, uniforms and " +"constants." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -9118,6 +9174,12 @@ msgid "Add..." msgstr "Î Ïοσθήκη..." #: editor/project_export.cpp +msgid "" +"If checked, the preset will be available for use in one-click deploy.\n" +"Only one preset per platform may be marked as runnable." +msgstr "" + +#: editor/project_export.cpp msgid "Export Path" msgstr "ΔιαδÏομή Εξαγωγής" @@ -9615,18 +9677,6 @@ msgid "Device" msgstr "Συσκευή" #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Shift+" -msgstr "Shift+" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Alt+" -msgstr "Alt+" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Control+" -msgstr "Control+" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "Press a Key..." msgstr "Πατήστε Îνα κουμπί..." @@ -11421,7 +11471,7 @@ msgid "Can't create function of nodes from nodes of multiple functions." msgstr "" #: modules/visual_script/visual_script_editor.cpp -msgid "Select atleast one node with sequence port." +msgid "Select at least one node with sequence port." msgstr "" #: modules/visual_script/visual_script_editor.cpp @@ -11773,10 +11823,20 @@ msgstr "ΧÏήση Ï€ÏοεπιλεγμÎνης εικόνας ÎµÎºÎºÎ¯Î½Î·ÏƒÎ·Ï #: platform/uwp/export/export.cpp #, fuzzy +msgid "Invalid package short name." +msgstr "Μη ÎγκυÏο όνομα κλάσης" + +#: platform/uwp/export/export.cpp +#, fuzzy msgid "Invalid package unique name." msgstr "ΆκυÏο μοναδικό όνομα." #: platform/uwp/export/export.cpp +#, fuzzy +msgid "Invalid package publisher display name." +msgstr "ΆκυÏο μοναδικό όνομα." + +#: platform/uwp/export/export.cpp msgid "Invalid product GUID." msgstr "ΆκυÏο GUID Ï€Ïοϊόντος." @@ -12448,6 +12508,18 @@ msgstr "" msgid "Constants cannot be modified." msgstr "Οι σταθεÏÎÏ‚ δεν μποÏοÏν να Ï„ÏοποποιηθοÏν." +#~ msgid "Pause the scene" +#~ msgstr "ΠαÏση της σκηνής" + +#~ msgid "Shift+" +#~ msgstr "Shift+" + +#~ msgid "Alt+" +#~ msgstr "Alt+" + +#~ msgid "Control+" +#~ msgstr "Control+" + #~ msgid "Snap to Grid" #~ msgstr "ΚοÏμπωμα στο ΠλÎγμα" diff --git a/editor/translations/eo.po b/editor/translations/eo.po index 99654bd571..13b053c4f8 100644 --- a/editor/translations/eo.po +++ b/editor/translations/eo.po @@ -6,18 +6,19 @@ # AlexHoratio <yukithetupper@gmail.com>, 2019. # Teashrock <kajitsu22@gmail.com>, 2019. # Brandon Dyer <brandondyer64@gmail.com>, 2019. +# Alejandro Sánchez Medina <alejandrosanchzmedina@gmail.com>, 2019. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" -"PO-Revision-Date: 2019-10-11 15:07+0000\n" -"Last-Translator: Teashrock <kajitsu22@gmail.com>\n" +"PO-Revision-Date: 2019-11-11 14:19+0000\n" +"Last-Translator: Alejandro Sánchez Medina <alejandrosanchzmedina@gmail.com>\n" "Language-Team: Esperanto <https://hosted.weblate.org/projects/godot-engine/" "godot/eo/>\n" "Language: eo\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 3.9-dev\n" +"X-Generator: Weblate 3.10-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -972,7 +973,7 @@ msgstr "Rimedo" #: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp #: editor/project_settings_editor.cpp msgid "Path" -msgstr "Vojo" +msgstr "dosierindiko" #: editor/dependency_editor.cpp msgid "Dependencies:" @@ -1559,9 +1560,8 @@ msgid "Script Editor" msgstr "Skriptredaktilo" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Asset Library" -msgstr "Biblioteko de aktivoj" +msgstr "Biblioteko de havaĵoj" #: editor/editor_feature_profile.cpp msgid "Scene Tree Editing" @@ -2664,7 +2664,7 @@ msgstr "Sencimigi" #: editor/editor_node.cpp msgid "Deploy with Remote Debug" -msgstr "Malfaldi kun defora sencimigo" +msgstr "Disponigii kun defora sencimigo" #: editor/editor_node.cpp msgid "" @@ -2675,9 +2675,8 @@ msgstr "" "de ĉi tiu komputilo por estos sencimigita." #: editor/editor_node.cpp -#, fuzzy msgid "Small Deploy with Network FS" -msgstr "Malgranda malfaldo kun reta dosiersistemo" +msgstr "Eta disponigo kun reta dosiersistemo" #: editor/editor_node.cpp msgid "" @@ -2840,7 +2839,7 @@ msgid "Play" msgstr "" #: editor/editor_node.cpp -msgid "Pause the scene" +msgid "Pause the scene execution for debugging." msgstr "" #: editor/editor_node.cpp @@ -3508,6 +3507,11 @@ msgid "New Inherited Scene" msgstr "Nova heredita sceno" #: editor/filesystem_dock.cpp +#, fuzzy +msgid "Set As Main Scene" +msgstr "Konservi ĉiujn scenojn" + +#: editor/filesystem_dock.cpp msgid "Open Scenes" msgstr "" @@ -4222,6 +4226,21 @@ msgid "" msgstr "" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Anim Clips" +msgstr "Animado Filmitaĵero:" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Audio Clips" +msgstr "AÅdio Filmitaĵero:" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Functions" +msgstr "Funkcioj:" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/animation_state_machine_editor.cpp msgid "Node Renamed" msgstr "" @@ -4890,6 +4909,14 @@ msgid "Grid Step:" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Primary Line Every:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "steps" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotation Offset:" msgstr "" @@ -4898,6 +4925,11 @@ msgid "Rotation Step:" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Scale Step:" +msgstr "Skali RejÅo:" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move Vertical Guide" msgstr "" @@ -4981,6 +5013,20 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"Overrides game camera with editor viewport camera." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"No game instance running." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp msgid "Lock Selected" msgstr "" @@ -5115,6 +5161,10 @@ msgid "Use Rotation Snap" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Use Scale Snap" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap Relative" msgstr "" @@ -5254,7 +5304,7 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" -"Auto insert keys when objects are translated, rotated on scaled (based on " +"Auto insert keys when objects are translated, rotated or scaled (based on " "mask).\n" "Keys are only added to existing tracks, no new tracks will be created.\n" "Keys must be inserted manually for the first time." @@ -8092,7 +8142,7 @@ msgid "Dodge operator." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "HardLight operator" +msgid "HardLight operator." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8679,9 +8729,10 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Custom Godot Shader Language expression, which placed on top of the resulted " -"shader. You can place various function definitions inside and call it later " -"in the Expressions. You can also declare varyings, uniforms and constants." +"Custom Godot Shader Language expression, which is placed on top of the " +"resulted shader. You can place various function definitions inside and call " +"it later in the Expressions. You can also declare varyings, uniforms and " +"constants." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8790,6 +8841,12 @@ msgid "Add..." msgstr "" #: editor/project_export.cpp +msgid "" +"If checked, the preset will be available for use in one-click deploy.\n" +"Only one preset per platform may be marked as runnable." +msgstr "" + +#: editor/project_export.cpp msgid "Export Path" msgstr "" @@ -9240,18 +9297,6 @@ msgid "Device" msgstr "" #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Shift+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Alt+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Control+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "Press a Key..." msgstr "" @@ -10952,7 +10997,7 @@ msgid "Can't create function of nodes from nodes of multiple functions." msgstr "" #: modules/visual_script/visual_script_editor.cpp -msgid "Select atleast one node with sequence port." +msgid "Select at least one node with sequence port." msgstr "" #: modules/visual_script/visual_script_editor.cpp @@ -11261,10 +11306,19 @@ msgid "Using default boot splash image." msgstr "" #: platform/uwp/export/export.cpp +#, fuzzy +msgid "Invalid package short name." +msgstr "Nevalida grupa nomo." + +#: platform/uwp/export/export.cpp msgid "Invalid package unique name." msgstr "" #: platform/uwp/export/export.cpp +msgid "Invalid package publisher display name." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid product GUID." msgstr "" diff --git a/editor/translations/es.po b/editor/translations/es.po index 7966399033..a520f0c46e 100644 --- a/editor/translations/es.po +++ b/editor/translations/es.po @@ -41,11 +41,12 @@ # Patrick Zoch Alves <patrickzochalves@gmail.com>, 2019. # roger <616steam@gmail.com>, 2019. # Dario <darlex259@gmail.com>, 2019. +# Adolfo Jayme Barrientos <fitojb@ubuntu.com>, 2019. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2019-10-11 15:07+0000\n" +"PO-Revision-Date: 2019-11-29 14:49+0000\n" "Last-Translator: Javier Ocampos <xavier.ocampos@gmail.com>\n" "Language-Team: Spanish <https://hosted.weblate.org/projects/godot-engine/" "godot/es/>\n" @@ -54,7 +55,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 3.9-dev\n" +"X-Generator: Weblate 3.10-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -74,7 +75,8 @@ msgstr "Entrada inválida %i (no pasó) en la expresión" #: core/math/expression.cpp msgid "self can't be used because instance is null (not passed)" -msgstr "No se puede usar self porque la instancia es nula (no pasó)" +msgstr "" +"No se puede utilizar «self» porque la instancia es nula (no transmitida)" #: core/math/expression.cpp msgid "Invalid operands to operator %s, %s and %s." @@ -86,7 +88,7 @@ msgstr "Indice inválido de tipo %s para tipo base %s" #: core/math/expression.cpp msgid "Invalid named index '%s' for base type %s" -msgstr "Indice de nombre invalido '%s' para el tipo base %s" +msgstr "El Ãndice de nombre «%s» no es válido para el tipo de base %s" #: core/math/expression.cpp msgid "Invalid arguments to construct '%s'" @@ -666,12 +668,11 @@ msgstr "Limpiar" #: editor/animation_track_editor.cpp msgid "Scale Ratio:" -msgstr "Ratio de Escala:" +msgstr "Relación de Escala:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Select Tracks to Copy" -msgstr "Elegir pistas a copiar:" +msgstr "Selecciona las Pistas a Copiar" #: editor/animation_track_editor.cpp editor/editor_log.cpp #: editor/editor_properties.cpp @@ -683,9 +684,8 @@ msgid "Copy" msgstr "Copiar" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Select All/None" -msgstr "Deseleccionar todo" +msgstr "Seleccionar Todo/Ninguno" #: editor/animation_track_editor_plugins.cpp msgid "Add Audio Track Clip" @@ -2944,8 +2944,8 @@ msgid "Play" msgstr "Reproducir" #: editor/editor_node.cpp -msgid "Pause the scene" -msgstr "Pausar la escena" +msgid "Pause the scene execution for debugging." +msgstr "Pausar la ejecución de la escena para depurarla." #: editor/editor_node.cpp msgid "Pause Scene" @@ -3642,6 +3642,10 @@ msgid "New Inherited Scene" msgstr "Nueva Escena Heredada" #: editor/filesystem_dock.cpp +msgid "Set As Main Scene" +msgstr "Establecer Como Escena Principal" + +#: editor/filesystem_dock.cpp msgid "Open Scenes" msgstr "Abrir Escenas" @@ -4373,6 +4377,18 @@ msgstr "" "no se pudieron obtener los nombres de las pistas." #: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Anim Clips" +msgstr "Clips de Animación" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Audio Clips" +msgstr "Clips de Audio" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Functions" +msgstr "Funciones" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/animation_state_machine_editor.cpp msgid "Node Renamed" msgstr "Nodo Renombrado" @@ -4964,7 +4980,7 @@ msgstr "Todos" #: editor/plugins/asset_library_editor_plugin.cpp msgid "No results for \"%s\"." -msgstr "" +msgstr "No hay resultados para \"%s\"." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Import..." @@ -5053,6 +5069,14 @@ msgid "Grid Step:" msgstr "Grid Step:" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Primary Line Every:" +msgstr "LÃnea Principal Cada:" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "steps" +msgstr "pasos" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotation Offset:" msgstr "Offset de Rotación:" @@ -5061,6 +5085,10 @@ msgid "Rotation Step:" msgstr "Step de Rotación:" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale Step:" +msgstr "Pasos de Escalado:" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move Vertical Guide" msgstr "Mover GuÃa Vertical" @@ -5146,6 +5174,24 @@ msgstr "Cambiar Anclas" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"Overrides game camera with editor viewport camera." +msgstr "" +"Reemplazar Cámara del Juego\n" +"Reemplaza la cámara del juego con la cámara del viewport del editor." + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"No game instance running." +msgstr "" +"Reemplazar Cámara del Juego\n" +"No hay ninguna instancia de juego ejecutándose." + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp msgid "Lock Selected" msgstr "Bloqueo Seleccionado" @@ -5263,34 +5309,34 @@ msgid "Ruler Mode" msgstr "Modo Regla" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Toggle smart snapping." -msgstr "Act./Desact. alineado." +msgstr "Alternar acople inteligente." #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Use Smart Snap" -msgstr "Usar Snap" +msgstr "Usar Snap Inteligente" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Toggle grid snapping." -msgstr "Act./Desact. alineado." +msgstr "Act./Desact. grid snapping." #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Use Grid Snap" -msgstr "Grid Snap" +msgstr "Usar Grid Snap" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snapping Options" -msgstr "Opciones de Alineado" +msgstr "Opciones de Snapping" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Use Rotation Snap" msgstr "Usar Snap de Rotación" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Use Scale Snap" +msgstr "Usar Snap de Escalado" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap Relative" msgstr "Snap Relativo" @@ -5300,7 +5346,7 @@ msgstr "Usar Pixel Snap" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Smart Snapping" -msgstr "Ajuste Inteligente" +msgstr "Snapping Inteligente" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -5365,7 +5411,7 @@ msgstr "Crear Hueso(s) Personalizados a partir de Nodo(s)" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Clear Custom Bones" -msgstr "Restablecer Huesos Personalizados" +msgstr "Borrar Huesos Personalizados" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -5373,33 +5419,32 @@ msgid "View" msgstr "Ver" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Always Show Grid" -msgstr "Ver Grid" +msgstr "Mostrar Siempre el Grid" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Show Helpers" -msgstr "Ver Ayudas" +msgstr "Mostrar Ayudantes" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Show Rulers" -msgstr "Ver Reglas" +msgstr "Mostrar Reglas" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Show Guides" -msgstr "Ver GuÃas" +msgstr "Mostrar GuÃas" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Show Origin" -msgstr "Ver Origen" +msgstr "Mostrar Origen" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Show Viewport" -msgstr "Ver Viewport" +msgstr "Mostrar Viewport" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Show Group And Lock Icons" -msgstr "Ver Grupo y Bloquear Iconos" +msgstr "Mostrar Grupo y Bloquear Iconos" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Center Selection" @@ -5411,7 +5456,7 @@ msgstr "Encuadrar Selección" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Preview Canvas Scale" -msgstr "Previsualización de la Escala del Lienzo" +msgstr "Previsualizar Escala de Canvas" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Translation mask for inserting keys." @@ -5431,16 +5476,16 @@ msgstr "Insertar claves (basadas en máscara)." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" -"Auto insert keys when objects are translated, rotated on scaled (based on " +"Auto insert keys when objects are translated, rotated or scaled (based on " "mask).\n" "Keys are only added to existing tracks, no new tracks will be created.\n" "Keys must be inserted manually for the first time." msgstr "" -"Inserción automática de claves cuando los objetos son desplazados, rotados " -"en escala (basado en máscara).\n" +"Inserción automática de claves cuando los objetos son desplazados, rotados o " +"escalados (basado en máscara).\n" "Las claves sólo se añaden a las pistas existentes, no se crearán nuevas " "pistas.\n" -"Las claves deben insertarse manualmente por primera vez." +"Las llaves deben insertarse manualmente por primera vez." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Auto Insert Key" @@ -5642,9 +5687,8 @@ msgid "Hold Shift to edit tangents individually" msgstr "Mantén Shift para editar las tangentes individualmente" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Right click to add point" -msgstr "Clic derecho: Eliminar Punto" +msgstr "Clic derecho para añadir punto" #: editor/plugins/gi_probe_editor_plugin.cpp msgid "Bake GI Probe" @@ -6140,7 +6184,7 @@ msgid "" "viewport." msgstr "" "El polÃgono 2D tiene vértices internos, por lo que ya no se puede editar en " -"el viewport." +"la ventanilla." #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Create Polygon & UV" @@ -7101,7 +7145,6 @@ msgid "Freelook Speed Modifier" msgstr "Modificador de Velocidad de Vista Libre" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Freelook Slow Modifier" msgstr "Modificador de Velocidad de Vista Libre" @@ -7263,7 +7306,7 @@ msgstr "Snap de Escala (%):" #: editor/plugins/spatial_editor_plugin.cpp msgid "Viewport Settings" -msgstr "Ajustes de Viewport" +msgstr "Configuración de ventanilla" #: editor/plugins/spatial_editor_plugin.cpp msgid "Perspective FOV (deg.):" @@ -7374,9 +7417,8 @@ msgid "Simplification: " msgstr "Simplificación: " #: editor/plugins/sprite_editor_plugin.cpp -#, fuzzy msgid "Shrink (Pixels): " -msgstr "Crecer (Pixeles): " +msgstr "Encoger (PÃxeles): " #: editor/plugins/sprite_editor_plugin.cpp msgid "Grow (Pixels): " @@ -8162,9 +8204,8 @@ msgid "(GLES3 only)" msgstr "(Sólo GLES3)" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Add Output" -msgstr "Añadir salida +" +msgstr "Añadir Salida" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Scalar" @@ -8179,9 +8220,8 @@ msgid "Boolean" msgstr "Booleano" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Sampler" -msgstr "Sonidos" +msgstr "Sampler" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Add input port" @@ -8313,8 +8353,8 @@ msgid "Dodge operator." msgstr "Operador Dodge." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "HardLight operator" -msgstr "Operador HardLight" +msgid "HardLight operator." +msgstr "Operador HardLight." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Lighten operator." @@ -8959,11 +8999,12 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Custom Godot Shader Language expression, which placed on top of the resulted " -"shader. You can place various function definitions inside and call it later " -"in the Expressions. You can also declare varyings, uniforms and constants." +"Custom Godot Shader Language expression, which is placed on top of the " +"resulted shader. You can place various function definitions inside and call " +"it later in the Expressions. You can also declare varyings, uniforms and " +"constants." msgstr "" -"Expresión personalizada del lenguaje de shader de Godot, que se coloca " +"Expresión personalizada del lenguaje de shaders de Godot, que se coloca " "encima del shader resultante. Puedes colocar varias definiciones de " "funciones dentro y llamarlas más tarde en las Expresiones. También puedes " "declarar variaciones, uniformes y constantes." @@ -9090,6 +9131,15 @@ msgid "Add..." msgstr "Añadir..." #: editor/project_export.cpp +msgid "" +"If checked, the preset will be available for use in one-click deploy.\n" +"Only one preset per platform may be marked as runnable." +msgstr "" +"Si se selecciona, la plantilla estará disponible para su uso en un " +"despliegue con “un clickâ€.\n" +"Sólo se puede marcar como ejecutable una plantilla por plataforma." + +#: editor/project_export.cpp msgid "Export Path" msgstr "Ruta de Exportación" @@ -9118,22 +9168,20 @@ msgid "Resources to export:" msgstr "Recursos a exportar:" #: editor/project_export.cpp -#, fuzzy msgid "" "Filters to export non-resource files/folders\n" "(comma-separated, e.g: *.json, *.txt, docs/*)" msgstr "" -"Filtros para exportar archivos que no son recursos (separados por comas, ej: " -"*.json, *.txt)" +"Filtros para exportar archivos/carpetas que no son recursos\n" +"(separado por comas, por ejemplo: *.json, *.txt, docs/*)" #: editor/project_export.cpp -#, fuzzy msgid "" "Filters to exclude files/folders from project\n" "(comma-separated, e.g: *.json, *.txt, docs/*)" msgstr "" -"Filtros para excluir de la exportación (separados por comas, ej: *.json, *." -"txt)" +"Filtros para excluir archivos/carpetas del proyecto\n" +"(separados por comas, por ejemplo: *.json, *.txt, docs/*)" #: editor/project_export.cpp msgid "Patches" @@ -9585,18 +9633,6 @@ msgid "Device" msgstr "Dispositivo" #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Shift+" -msgstr "Shift+" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Alt+" -msgstr "Alt+" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Control+" -msgstr "Control+" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "Press a Key..." msgstr "Presiona una tecla..." @@ -10179,13 +10215,13 @@ msgstr "" "vuelvan a sus valores por defecto." #: editor/scene_tree_dock.cpp -#, fuzzy msgid "" "Enabling \"Load As Placeholder\" will disable \"Editable Children\" and " "cause all properties of the node to be reverted to their default." msgstr "" -"Desactivar \"editable_instance\" causara que todas las propiedades del nodo " -"vuelvan a sus valores por defecto." +"Activar \"Cargar Como Placeholder\" desactivará \"Hijos Editables\" y " +"causará que todas las propiedades del nodo se reviertan a sus valores por " +"defecto." #: editor/scene_tree_dock.cpp msgid "Make Local" @@ -10265,7 +10301,7 @@ msgstr "Hijos Editables" #: editor/scene_tree_dock.cpp msgid "Load As Placeholder" -msgstr "Cargar como Placeholder" +msgstr "Cargar Como Placeholder" #: editor/scene_tree_dock.cpp msgid "Open Documentation" @@ -10277,7 +10313,7 @@ msgstr "Añadir Nodo Hijo" #: editor/scene_tree_dock.cpp msgid "Expand/Collapse All" -msgstr "Expandir/Colapsar Todo" +msgstr "Expandir/Contraer Todo" #: editor/scene_tree_dock.cpp msgid "Change Type" @@ -10305,7 +10341,7 @@ msgstr "Copiar Ruta del Nodo" #: editor/scene_tree_dock.cpp msgid "Delete (No Confirm)" -msgstr "Eliminar (Sin confirmar)" +msgstr "Eliminar (Sin Confirmar)" #: editor/scene_tree_dock.cpp msgid "Add/Create a New Node." @@ -10525,19 +10561,16 @@ msgid "Will load an existing script file." msgstr "Se cargará un archivo de script existente." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Class Name:" -msgstr "Nombre de clase" +msgstr "Nombre de Clase:" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Template:" -msgstr "Plantilla" +msgstr "Plantilla:" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Built-in Script:" -msgstr "Script Integrado" +msgstr "Script Integrado:" #: editor/script_create_dialog.cpp msgid "Attach Node Script" @@ -11167,11 +11200,11 @@ msgstr "Otra función/variable/señal ya utiliza este nombre:" #: modules/visual_script/visual_script_editor.cpp msgid "Rename Function" -msgstr "Renombrar Función" +msgstr "Cambiar nombre de función" #: modules/visual_script/visual_script_editor.cpp msgid "Rename Variable" -msgstr "Renombrar Variable" +msgstr "Cambiar nombre de variable" #: modules/visual_script/visual_script_editor.cpp msgid "Rename Signal" @@ -11182,7 +11215,6 @@ msgid "Add Function" msgstr "Añadir Función" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Delete input port" msgstr "Eliminar puerto de entrada" @@ -11195,24 +11227,20 @@ msgid "Add Signal" msgstr "Añadir Señal" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Add Input Port" -msgstr "Agregar puerto de entrada" +msgstr "Añadir Puerto de Entrada" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Add Output Port" -msgstr "Añadir puerto de salida" +msgstr "Añadir Puerto de Salida" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Remove Input Port" -msgstr "Eliminar puerto de entrada" +msgstr "Eliminar Puerto de Entrada" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Remove Output Port" -msgstr "Eliminar puerto de salida" +msgstr "Eliminar Puerto de Salida" #: modules/visual_script/visual_script_editor.cpp msgid "Change Expression" @@ -11261,16 +11289,20 @@ msgstr "Añadir Nodo Preload" #: modules/visual_script/visual_script_editor.cpp msgid "Can't drop nodes because script '%s' is not used in this scene." msgstr "" +"No se pueden soltar nodos porque el script '%s' no es usado en esta escena." #: modules/visual_script/visual_script_editor.cpp msgid "Add Node(s) From Tree" -msgstr "Añadir Nodo(s) Desde Ãrbol" +msgstr "Añadir nodo(s) desde árbol" #: modules/visual_script/visual_script_editor.cpp msgid "" "Can't drop properties because script '%s' is not used in this scene.\n" "Drop holding 'Shift' to just copy the signature." msgstr "" +"No se pueden soltar propiedades porque el script '%s' no se usa en esta " +"escena.\n" +"Mantén pulsado 'Shift' para copiar la firma." #: modules/visual_script/visual_script_editor.cpp msgid "Add Getter Property" @@ -11297,9 +11329,8 @@ msgid "Connect Nodes" msgstr "Conectar Nodos" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Disconnect Nodes" -msgstr "Desconectar nodos gráficos" +msgstr "Desconectar Nodos" #: modules/visual_script/visual_script_editor.cpp msgid "Connect Node Data" @@ -11334,26 +11365,25 @@ msgid "Paste VisualScript Nodes" msgstr "Pegar nodos de VisualScript" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Can't create function with a function node." -msgstr "No se puede copiar el nodo de función." +msgstr "No se puede crear una función con un nodo función." #: modules/visual_script/visual_script_editor.cpp msgid "Can't create function of nodes from nodes of multiple functions." msgstr "" +"No se puede crear una función de nodos desde nodos de múltiples funciones." #: modules/visual_script/visual_script_editor.cpp -msgid "Select atleast one node with sequence port." -msgstr "" +msgid "Select at least one node with sequence port." +msgstr "Selecciona al menos un nodo con puerto de secuencia." #: modules/visual_script/visual_script_editor.cpp msgid "Try to only have one sequence input in selection." -msgstr "" +msgstr "Intenta tener sólo una secuencia de entrada en la selección." #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Create Function" -msgstr "Renombrar Función" +msgstr "Crear Función" #: modules/visual_script/visual_script_editor.cpp msgid "Remove Function" @@ -11373,7 +11403,7 @@ msgstr "Eliminar Señal" #: modules/visual_script/visual_script_editor.cpp msgid "Editing Signal:" -msgstr "Editando señal:" +msgstr "Editando Señal:" #: modules/visual_script/visual_script_editor.cpp msgid "Make Tool:" @@ -11384,9 +11414,8 @@ msgid "Members:" msgstr "Miembros:" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "function_name" -msgstr "Función:" +msgstr "nombre_funcion" #: modules/visual_script/visual_script_editor.cpp msgid "Select or create a function to edit its graph." @@ -11409,18 +11438,16 @@ msgid "Cut Nodes" msgstr "Cortar Nodos" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Make Function" -msgstr "Renombrar Función" +msgstr "Crear Función" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Refresh Graph" -msgstr "Recargar" +msgstr "Actualizar Gráfico" #: modules/visual_script/visual_script_editor.cpp msgid "Edit Member" -msgstr "Editar Miembros" +msgstr "Editar Miembro" #: modules/visual_script/visual_script_flow_control.cpp msgid "Input type not iterable: " @@ -11646,7 +11673,7 @@ msgstr "El icono requerido no está especificado en el preset." #: platform/javascript/export/export.cpp msgid "Stop HTTP Server" -msgstr "" +msgstr "Detener Servidor HTTP" #: platform/javascript/export/export.cpp msgid "Run in Browser" @@ -11681,10 +11708,18 @@ msgid "Using default boot splash image." msgstr "Usando la imagen de carga por defecto." #: platform/uwp/export/export.cpp +msgid "Invalid package short name." +msgstr "Nombre corto del paquete inválido." + +#: platform/uwp/export/export.cpp msgid "Invalid package unique name." msgstr "Nombre único de paquete inválido." #: platform/uwp/export/export.cpp +msgid "Invalid package publisher display name." +msgstr "Nombre para mostrar del editor inválido." + +#: platform/uwp/export/export.cpp msgid "Invalid product GUID." msgstr "GUID de producto inválido." @@ -12324,10 +12359,11 @@ msgid "" "obtain a size. Otherwise, make it a RenderTarget and assign its internal " "texture to some node for display." msgstr "" -"Este viewport no está configurado como render target. Si quieres que muestre " -"su contenido directamente en la pantalla, hazlo hijo de un Control para que " -"pueda obtener un tamaño. De lo contrario, conviértelo en un RenderTarget y " -"asigna su textura interna a algún nodo para mostrarlo." +"Esta ventanilla no está configurada como destino de representación. Si " +"quiere que su contenido se muestre directamente en la pantalla, hágalo un " +"elemento secundario de un control para que pueda recibir dimensiones. O " +"bien, conviértalo en un RenderTarget y asigne su textura interna a algún " +"nodo para que se muestre." #: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for preview." @@ -12357,6 +12393,18 @@ msgstr "Solo se pueden asignar variaciones en funciones de vértice." msgid "Constants cannot be modified." msgstr "Las constantes no pueden modificarse." +#~ msgid "Pause the scene" +#~ msgstr "Pausar la escena" + +#~ msgid "Shift+" +#~ msgstr "Shift+" + +#~ msgid "Alt+" +#~ msgstr "Alt+" + +#~ msgid "Control+" +#~ msgstr "Control+" + #~ msgid "Snap to Grid" #~ msgstr "Ajustar en Grid" diff --git a/editor/translations/es_AR.po b/editor/translations/es_AR.po index 4369ea73ab..0bf176e0af 100644 --- a/editor/translations/es_AR.po +++ b/editor/translations/es_AR.po @@ -12,12 +12,13 @@ # Andrés S <andres.segovia.dev@gmail.com>, 2019. # Florencia Menéndez <mariaflormz2@gmail.com>, 2019. # roger <616steam@gmail.com>, 2019. +# Francisco José Carllinni <panchopepe@protonmail.com>, 2019. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2019-10-11 15:07+0000\n" -"Last-Translator: Javier Ocampos <xavier.ocampos@gmail.com>\n" +"PO-Revision-Date: 2019-11-29 14:49+0000\n" +"Last-Translator: Lisandro Lorea <lisandrolorea@gmail.com>\n" "Language-Team: Spanish (Argentina) <https://hosted.weblate.org/projects/" "godot-engine/godot/es_AR/>\n" "Language: es_AR\n" @@ -25,7 +26,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 3.9-dev\n" +"X-Generator: Weblate 3.10-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -45,7 +46,9 @@ msgstr "Entrada inválida %i (no se transmitió) en la expresión" #: core/math/expression.cpp msgid "self can't be used because instance is null (not passed)" -msgstr "self no puede ser usado ya que la instancia es nula (no pasó)" +msgstr "" +"self no puede ser usado ya que la instancia es nula (la referencia no fue " +"pasada)" #: core/math/expression.cpp msgid "Invalid operands to operator %s, %s and %s." @@ -502,7 +505,7 @@ msgstr "" #: editor/animation_track_editor.cpp msgid "Warning: Editing imported animation" -msgstr "Advertencia: Se esta editando una animación importada" +msgstr "Advertencia: Se está editando una animación importada" #: editor/animation_track_editor.cpp msgid "Select an AnimationPlayer node to create and edit animations." @@ -638,9 +641,8 @@ msgid "Scale Ratio:" msgstr "Ratio de Escala:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Select Tracks to Copy" -msgstr "Elegir pistas a copiar:" +msgstr "Elegir Pistas a Copiar" #: editor/animation_track_editor.cpp editor/editor_log.cpp #: editor/editor_properties.cpp @@ -652,9 +654,8 @@ msgid "Copy" msgstr "Copiar" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Select All/None" -msgstr "No Seleccionar Ninguno" +msgstr "Seleccionar Todo/Ninguno" #: editor/animation_track_editor_plugins.cpp msgid "Add Audio Track Clip" @@ -1326,7 +1327,7 @@ msgstr "Abrir Layout de Bus de Audio" #: editor/editor_audio_buses.cpp msgid "There is no '%s' file." -msgstr "No hay ningún archivo `%s'." +msgstr "No hay ningún archivo '%s'." #: editor/editor_audio_buses.cpp editor/plugins/canvas_item_editor_plugin.cpp msgid "Layout" @@ -2888,7 +2889,7 @@ msgstr "Q&A" #: editor/editor_node.cpp msgid "Issue Tracker" -msgstr "Issue Tracker" +msgstr "Registro de problemas" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp msgid "Community" @@ -2907,8 +2908,8 @@ msgid "Play" msgstr "Reproducir" #: editor/editor_node.cpp -msgid "Pause the scene" -msgstr "Pausar la escena" +msgid "Pause the scene execution for debugging." +msgstr "Pausar la ejecución de la escena para depurar." #: editor/editor_node.cpp msgid "Pause Scene" @@ -3606,6 +3607,10 @@ msgid "New Inherited Scene" msgstr "Nueva Escena Heredada" #: editor/filesystem_dock.cpp +msgid "Set As Main Scene" +msgstr "Seleccionar Como Escena Principal" + +#: editor/filesystem_dock.cpp msgid "Open Scenes" msgstr "Abrir Escenas" @@ -4338,6 +4343,18 @@ msgstr "" "no se pudieron obtener los nombres de las pistas." #: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Anim Clips" +msgstr "Clips de Anim" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Audio Clips" +msgstr "Clips de Audio" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Functions" +msgstr "Funciones" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/animation_state_machine_editor.cpp msgid "Node Renamed" msgstr "Nodo Renombrado" @@ -4929,7 +4946,7 @@ msgstr "Todos" #: editor/plugins/asset_library_editor_plugin.cpp msgid "No results for \"%s\"." -msgstr "" +msgstr "No hay resultados para \"%s\"." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Import..." @@ -5018,6 +5035,14 @@ msgid "Grid Step:" msgstr "Step de Grilla:" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Primary Line Every:" +msgstr "LÃnea Principal Cada:" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "steps" +msgstr "pasos" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotation Offset:" msgstr "Offset de Rotación:" @@ -5026,6 +5051,10 @@ msgid "Rotation Step:" msgstr "Step de Rotación:" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale Step:" +msgstr "Escala temporal:" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move Vertical Guide" msgstr "Mover GuÃa Vertical" @@ -5111,6 +5140,24 @@ msgstr "Cambiar Anclas" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"Overrides game camera with editor viewport camera." +msgstr "" +"Reemplazar Cámara del Juego\n" +"Reemplaza la cámara del juego con la cámara del viewport del editor." + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"No game instance running." +msgstr "" +"Reemplazar Cámara del Juego\n" +"No hay ninguna instancia de juego ejecutándose." + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp msgid "Lock Selected" msgstr "Bloqueo Seleccionado" @@ -5227,24 +5274,20 @@ msgid "Ruler Mode" msgstr "Modo Regla" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Toggle smart snapping." -msgstr "Act/Desact. alineado." +msgstr "Act/Desact. ajuste inteligente." #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Use Smart Snap" -msgstr "Usar Snap" +msgstr "Usar Ajuste Inteligente" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Toggle grid snapping." -msgstr "Act/Desact. alineado." +msgstr "Act/Desact. ajuste a grilla." #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Use Grid Snap" -msgstr "Snap de Grilla" +msgstr "Usar Ajuste a Grilla" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snapping Options" @@ -5255,6 +5298,10 @@ msgid "Use Rotation Snap" msgstr "Usar Snap de Rotación" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Use Scale Snap" +msgstr "Usar Snap a la Escala" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap Relative" msgstr "Usar Snap Relativo" @@ -5337,13 +5384,12 @@ msgid "View" msgstr "Vista" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Always Show Grid" -msgstr "Mostrar la Grilla" +msgstr "Siempre Mostrar la Grilla" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Show Helpers" -msgstr "Mostrar ayudantes" +msgstr "Mostrar Ayudantes" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Show Rulers" @@ -5395,7 +5441,7 @@ msgstr "Insertar claves (basadas en máscara)." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" -"Auto insert keys when objects are translated, rotated on scaled (based on " +"Auto insert keys when objects are translated, rotated or scaled (based on " "mask).\n" "Keys are only added to existing tracks, no new tracks will be created.\n" "Keys must be inserted manually for the first time." @@ -5606,9 +5652,8 @@ msgid "Hold Shift to edit tangents individually" msgstr "Mantené Shift para editar tangentes individualmente" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Right click to add point" -msgstr "Click Derecho: Eliminar Punto" +msgstr "Click derecho para agregar punto" #: editor/plugins/gi_probe_editor_plugin.cpp msgid "Bake GI Probe" @@ -7065,7 +7110,6 @@ msgid "Freelook Speed Modifier" msgstr "Modificador de Velocidad de Vista Libre" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Freelook Slow Modifier" msgstr "Modificador de Velocidad de Vista Libre" @@ -7338,9 +7382,8 @@ msgid "Simplification: " msgstr "Simplificación: " #: editor/plugins/sprite_editor_plugin.cpp -#, fuzzy msgid "Shrink (Pixels): " -msgstr "Crecer (Pixeles): " +msgstr "Achicar (Pixeles): " #: editor/plugins/sprite_editor_plugin.cpp msgid "Grow (Pixels): " @@ -8124,9 +8167,8 @@ msgid "(GLES3 only)" msgstr "(Sólo GLES3)" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Add Output" -msgstr "Añadir salida +" +msgstr "Añadir Salida" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Scalar" @@ -8141,9 +8183,8 @@ msgid "Boolean" msgstr "Booleano" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Sampler" -msgstr "Muestras" +msgstr "Sampler" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Add input port" @@ -8275,8 +8316,8 @@ msgid "Dodge operator." msgstr "Operador Dodge(sobreexponer)." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "HardLight operator" -msgstr "Operador HardLight(luz fuerte)" +msgid "HardLight operator." +msgstr "Operador HardLight(luz fuerte)." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Lighten operator." @@ -8920,14 +8961,15 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Custom Godot Shader Language expression, which placed on top of the resulted " -"shader. You can place various function definitions inside and call it later " -"in the Expressions. You can also declare varyings, uniforms and constants." +"Custom Godot Shader Language expression, which is placed on top of the " +"resulted shader. You can place various function definitions inside and call " +"it later in the Expressions. You can also declare varyings, uniforms and " +"constants." msgstr "" -"Expresión personalizada del lenguaje de shader de Godot, que se coloca " -"encima del shader resultante. Puedes colocar varias definiciones de " -"funciones dentro y llamarlas más tarde en las Expresiones. También puedes " -"declarar varyings, uniforms y constantes." +"Expresión personalizada del lenguaje de shaders de Godot, que se coloca " +"encima del shader resultante. Podés colocar varias definiciones de funciones " +"dentro y llamarlas más tarde en las Expresiones. También podés declarar " +"varyings, uniforms y constantes." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "(Fragment/Light mode only) Scalar derivative function." @@ -9053,6 +9095,15 @@ msgid "Add..." msgstr "Agregar..." #: editor/project_export.cpp +msgid "" +"If checked, the preset will be available for use in one-click deploy.\n" +"Only one preset per platform may be marked as runnable." +msgstr "" +"Si se selecciona, la plantilla va a estar disponible para su uso en un " +"lanzamiento de “un clickâ€.\n" +"Sólo se puede marcar como ejecutable una plantilla por plataforma." + +#: editor/project_export.cpp msgid "Export Path" msgstr "Ruta de Exportación" @@ -9081,22 +9132,20 @@ msgid "Resources to export:" msgstr "Recursos a exportar:" #: editor/project_export.cpp -#, fuzzy msgid "" "Filters to export non-resource files/folders\n" "(comma-separated, e.g: *.json, *.txt, docs/*)" msgstr "" -"Filtros para exportar archivos que no son recursos (separados por comas, ej: " -"*.json, *.txt)" +"Filtros para exportar archivos/carpetas que no son recursos\n" +"(separado por comas, ej: *.json, *.txt, docs/*)" #: editor/project_export.cpp -#, fuzzy msgid "" "Filters to exclude files/folders from project\n" "(comma-separated, e.g: *.json, *.txt, docs/*)" msgstr "" -"Filtros para excluir archivos del proyecto (separados por comas, ej: *.json, " -"*.txt)" +"Filtros para excluir archivos/carpetas del proyecto\n" +"(separados por comas, ej: *.json, *.txt, docs/*)" #: editor/project_export.cpp msgid "Patches" @@ -9549,18 +9598,6 @@ msgid "Device" msgstr "Dispositivo" #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Shift+" -msgstr "Shift+" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Alt+" -msgstr "Alt+" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Control+" -msgstr "Control+" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "Press a Key..." msgstr "Presionar una Tecla..." @@ -9854,7 +9891,7 @@ msgstr "Archivo..." #: editor/property_editor.cpp msgid "Dir..." -msgstr "Dir..." +msgstr "Directorio..." #: editor/property_editor.cpp msgid "Assign" @@ -10070,7 +10107,7 @@ msgstr "Instanciar Escena Hija" #: editor/scene_tree_dock.cpp msgid "Clear Script" -msgstr "Restablecer Script" +msgstr "Quitar Script" #: editor/scene_tree_dock.cpp msgid "This operation can't be done on the tree root." @@ -10143,13 +10180,13 @@ msgstr "" "vuelvan a sus valores por defecto." #: editor/scene_tree_dock.cpp -#, fuzzy msgid "" "Enabling \"Load As Placeholder\" will disable \"Editable Children\" and " "cause all properties of the node to be reverted to their default." msgstr "" -"Desactivar \"editable_instance\" causara que todas las propiedades del nodo " -"vuelvan a sus valores por defecto." +"Activar \"Cargar como Placeholder\" desactivará \"Hijos Editables\" y " +"causará que todas las propiedades del nodo se reviertan a sus valores por " +"defecto." #: editor/scene_tree_dock.cpp msgid "Make Local" @@ -10258,7 +10295,7 @@ msgstr "Convertir en RaÃz de Escena" #: editor/scene_tree_dock.cpp msgid "Merge From Scene" -msgstr "Mergear Desde Escena" +msgstr "Incorporar Desde Escena" #: editor/scene_tree_dock.cpp editor/script_editor_debugger.cpp msgid "Save Branch as Scene" @@ -10490,19 +10527,16 @@ msgid "Will load an existing script file." msgstr "Se cargará un archivo de script existente." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Class Name:" -msgstr "Nombre de Clase" +msgstr "Nombre de Clase:" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Template:" -msgstr "Plantilla" +msgstr "Plantilla:" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Built-in Script:" -msgstr "Script Integrado (Built-In)" +msgstr "Script Integrado (Built-In):" #: editor/script_create_dialog.cpp msgid "Attach Node Script" @@ -11145,7 +11179,6 @@ msgid "Add Function" msgstr "Agregar Función" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Delete input port" msgstr "Eliminar puerto de entrada" @@ -11158,24 +11191,20 @@ msgid "Add Signal" msgstr "Agregar Señal" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Add Input Port" -msgstr "Agregar puerto de entrada" +msgstr "Agregar Puerto de Entrada" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Add Output Port" -msgstr "Añadir puerto de salida" +msgstr "Agregar Puerto de Salida" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Remove Input Port" -msgstr "Eliminar puerto de entrada" +msgstr "Eliminar Puerto de Entrada" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Remove Output Port" -msgstr "Eliminar puerto de salida" +msgstr "Eliminar Puerto de Salida" #: modules/visual_script/visual_script_editor.cpp msgid "Change Expression" @@ -11224,6 +11253,7 @@ msgstr "Agregar Nodo Preload" #: modules/visual_script/visual_script_editor.cpp msgid "Can't drop nodes because script '%s' is not used in this scene." msgstr "" +"No se pueden soltar nodos porque el script '%s' no es usado en esta escena." #: modules/visual_script/visual_script_editor.cpp msgid "Add Node(s) From Tree" @@ -11234,6 +11264,9 @@ msgid "" "Can't drop properties because script '%s' is not used in this scene.\n" "Drop holding 'Shift' to just copy the signature." msgstr "" +"No se puede soltar propiedades porque el script '%s' no es usado en esta " +"escena.\n" +"Soltá manteniendo 'Shift' para solo copiar la firma." #: modules/visual_script/visual_script_editor.cpp msgid "Add Getter Property" @@ -11260,9 +11293,8 @@ msgid "Connect Nodes" msgstr "Conectar Nodos" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Disconnect Nodes" -msgstr "Desconectar Nodo de Gráfico" +msgstr "Desconectar Nodos" #: modules/visual_script/visual_script_editor.cpp msgid "Connect Node Data" @@ -11297,26 +11329,25 @@ msgid "Paste VisualScript Nodes" msgstr "Pegar Nodos de VisualScript" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Can't create function with a function node." -msgstr "No se puede copiar el nodo de función." +msgstr "No se puede crear una función con un nodo función." #: modules/visual_script/visual_script_editor.cpp msgid "Can't create function of nodes from nodes of multiple functions." msgstr "" +"No se puede crear una función de nodos desde nodos de múltiples funciones." #: modules/visual_script/visual_script_editor.cpp -msgid "Select atleast one node with sequence port." -msgstr "" +msgid "Select at least one node with sequence port." +msgstr "Seleccioná por lo menos un nodo con puerto secuencia." #: modules/visual_script/visual_script_editor.cpp msgid "Try to only have one sequence input in selection." -msgstr "" +msgstr "Tratá de tener solo una secuencia de entrada en la selección." #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Create Function" -msgstr "Renombrar Función" +msgstr "Crear Función" #: modules/visual_script/visual_script_editor.cpp msgid "Remove Function" @@ -11347,9 +11378,8 @@ msgid "Members:" msgstr "Miembros:" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "function_name" -msgstr "Funcion:" +msgstr "nombre_funcion" #: modules/visual_script/visual_script_editor.cpp msgid "Select or create a function to edit its graph." @@ -11372,14 +11402,12 @@ msgid "Cut Nodes" msgstr "Cortar Nodos" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Make Function" -msgstr "Renombrar Función" +msgstr "Crear Función" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Refresh Graph" -msgstr "Refrescar" +msgstr "Refrescar el Gráfico" #: modules/visual_script/visual_script_editor.cpp msgid "Edit Member" @@ -11609,7 +11637,7 @@ msgstr "El icono requerido no esta especificado en el preset." #: platform/javascript/export/export.cpp msgid "Stop HTTP Server" -msgstr "" +msgstr "Detener Servidor HTTP" #: platform/javascript/export/export.cpp msgid "Run in Browser" @@ -11644,10 +11672,18 @@ msgid "Using default boot splash image." msgstr "Usando imagen boot splash por defecto." #: platform/uwp/export/export.cpp +msgid "Invalid package short name." +msgstr "Nombre corto de paquete inválido." + +#: platform/uwp/export/export.cpp msgid "Invalid package unique name." msgstr "Nombre único de paquete inválido." #: platform/uwp/export/export.cpp +msgid "Invalid package publisher display name." +msgstr "Nombre de paquete de publisher inválido." + +#: platform/uwp/export/export.cpp msgid "Invalid product GUID." msgstr "GUID de producto inválido." @@ -12315,6 +12351,18 @@ msgstr "Solo se pueden asignar variaciones en funciones de vértice." msgid "Constants cannot be modified." msgstr "Las constantes no pueden modificarse." +#~ msgid "Pause the scene" +#~ msgstr "Pausar la escena" + +#~ msgid "Shift+" +#~ msgstr "Shift+" + +#~ msgid "Alt+" +#~ msgstr "Alt+" + +#~ msgid "Control+" +#~ msgstr "Control+" + #~ msgid "Snap to Grid" #~ msgstr "Ajustar a la Grilla" diff --git a/editor/translations/et.po b/editor/translations/et.po index a7cb86a27f..82bf543b18 100644 --- a/editor/translations/et.po +++ b/editor/translations/et.po @@ -2767,7 +2767,7 @@ msgid "Play" msgstr "" #: editor/editor_node.cpp -msgid "Pause the scene" +msgid "Pause the scene execution for debugging." msgstr "" #: editor/editor_node.cpp @@ -3432,6 +3432,10 @@ msgid "New Inherited Scene" msgstr "" #: editor/filesystem_dock.cpp +msgid "Set As Main Scene" +msgstr "" + +#: editor/filesystem_dock.cpp msgid "Open Scenes" msgstr "" @@ -4142,6 +4146,21 @@ msgid "" msgstr "" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Anim Clips" +msgstr "Animatsiooni Klipid:" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Audio Clips" +msgstr "Heliklipid:" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Functions" +msgstr "Funktsioonid:" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/animation_state_machine_editor.cpp msgid "Node Renamed" msgstr "" @@ -4809,6 +4828,14 @@ msgid "Grid Step:" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Primary Line Every:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "steps" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotation Offset:" msgstr "" @@ -4817,6 +4844,10 @@ msgid "Rotation Step:" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale Step:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move Vertical Guide" msgstr "" @@ -4900,6 +4931,20 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"Overrides game camera with editor viewport camera." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"No game instance running." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp msgid "Lock Selected" msgstr "" @@ -5034,6 +5079,10 @@ msgid "Use Rotation Snap" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Use Scale Snap" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap Relative" msgstr "" @@ -5173,7 +5222,7 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" -"Auto insert keys when objects are translated, rotated on scaled (based on " +"Auto insert keys when objects are translated, rotated or scaled (based on " "mask).\n" "Keys are only added to existing tracks, no new tracks will be created.\n" "Keys must be inserted manually for the first time." @@ -8004,7 +8053,7 @@ msgid "Dodge operator." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "HardLight operator" +msgid "HardLight operator." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8591,9 +8640,10 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Custom Godot Shader Language expression, which placed on top of the resulted " -"shader. You can place various function definitions inside and call it later " -"in the Expressions. You can also declare varyings, uniforms and constants." +"Custom Godot Shader Language expression, which is placed on top of the " +"resulted shader. You can place various function definitions inside and call " +"it later in the Expressions. You can also declare varyings, uniforms and " +"constants." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8702,6 +8752,12 @@ msgid "Add..." msgstr "" #: editor/project_export.cpp +msgid "" +"If checked, the preset will be available for use in one-click deploy.\n" +"Only one preset per platform may be marked as runnable." +msgstr "" + +#: editor/project_export.cpp msgid "Export Path" msgstr "" @@ -9138,18 +9194,6 @@ msgid "Device" msgstr "" #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Shift+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Alt+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Control+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "Press a Key..." msgstr "" @@ -10841,7 +10885,7 @@ msgid "Can't create function of nodes from nodes of multiple functions." msgstr "" #: modules/visual_script/visual_script_editor.cpp -msgid "Select atleast one node with sequence port." +msgid "Select at least one node with sequence port." msgstr "" #: modules/visual_script/visual_script_editor.cpp @@ -11149,10 +11193,18 @@ msgid "Using default boot splash image." msgstr "" #: platform/uwp/export/export.cpp +msgid "Invalid package short name." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package unique name." msgstr "" #: platform/uwp/export/export.cpp +msgid "Invalid package publisher display name." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid product GUID." msgstr "" diff --git a/editor/translations/eu.po b/editor/translations/eu.po index 6c8834e504..a545199e07 100644 --- a/editor/translations/eu.po +++ b/editor/translations/eu.po @@ -2761,7 +2761,7 @@ msgid "Play" msgstr "" #: editor/editor_node.cpp -msgid "Pause the scene" +msgid "Pause the scene execution for debugging." msgstr "" #: editor/editor_node.cpp @@ -3426,6 +3426,10 @@ msgid "New Inherited Scene" msgstr "" #: editor/filesystem_dock.cpp +msgid "Set As Main Scene" +msgstr "" + +#: editor/filesystem_dock.cpp msgid "Open Scenes" msgstr "" @@ -4135,6 +4139,18 @@ msgid "" msgstr "" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Anim Clips" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Audio Clips" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Functions" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/animation_state_machine_editor.cpp msgid "Node Renamed" msgstr "" @@ -4801,6 +4817,14 @@ msgid "Grid Step:" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Primary Line Every:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "steps" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotation Offset:" msgstr "" @@ -4809,6 +4833,10 @@ msgid "Rotation Step:" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale Step:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move Vertical Guide" msgstr "" @@ -4890,6 +4918,20 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"Overrides game camera with editor viewport camera." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"No game instance running." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp msgid "Lock Selected" msgstr "" @@ -5024,6 +5066,10 @@ msgid "Use Rotation Snap" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Use Scale Snap" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap Relative" msgstr "" @@ -5163,7 +5209,7 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" -"Auto insert keys when objects are translated, rotated on scaled (based on " +"Auto insert keys when objects are translated, rotated or scaled (based on " "mask).\n" "Keys are only added to existing tracks, no new tracks will be created.\n" "Keys must be inserted manually for the first time." @@ -7990,7 +8036,7 @@ msgid "Dodge operator." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "HardLight operator" +msgid "HardLight operator." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8577,9 +8623,10 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Custom Godot Shader Language expression, which placed on top of the resulted " -"shader. You can place various function definitions inside and call it later " -"in the Expressions. You can also declare varyings, uniforms and constants." +"Custom Godot Shader Language expression, which is placed on top of the " +"resulted shader. You can place various function definitions inside and call " +"it later in the Expressions. You can also declare varyings, uniforms and " +"constants." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8688,6 +8735,12 @@ msgid "Add..." msgstr "" #: editor/project_export.cpp +msgid "" +"If checked, the preset will be available for use in one-click deploy.\n" +"Only one preset per platform may be marked as runnable." +msgstr "" + +#: editor/project_export.cpp msgid "Export Path" msgstr "" @@ -9124,18 +9177,6 @@ msgid "Device" msgstr "" #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Shift+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Alt+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Control+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "Press a Key..." msgstr "" @@ -10824,7 +10865,7 @@ msgid "Can't create function of nodes from nodes of multiple functions." msgstr "" #: modules/visual_script/visual_script_editor.cpp -msgid "Select atleast one node with sequence port." +msgid "Select at least one node with sequence port." msgstr "" #: modules/visual_script/visual_script_editor.cpp @@ -11129,10 +11170,18 @@ msgid "Using default boot splash image." msgstr "" #: platform/uwp/export/export.cpp +msgid "Invalid package short name." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package unique name." msgstr "" #: platform/uwp/export/export.cpp +msgid "Invalid package publisher display name." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid product GUID." msgstr "" diff --git a/editor/translations/fa.po b/editor/translations/fa.po index fe614abe09..6ec85e861e 100644 --- a/editor/translations/fa.po +++ b/editor/translations/fa.po @@ -2922,7 +2922,7 @@ msgid "Play" msgstr "پخش" #: editor/editor_node.cpp -msgid "Pause the scene" +msgid "Pause the scene execution for debugging." msgstr "" #: editor/editor_node.cpp @@ -3622,6 +3622,11 @@ msgstr "وارث جدید" #: editor/filesystem_dock.cpp #, fuzzy +msgid "Set As Main Scene" +msgstr "ذخیره سازی صØنه" + +#: editor/filesystem_dock.cpp +#, fuzzy msgid "Open Scenes" msgstr "باز کردن صØنه" @@ -4388,6 +4393,21 @@ msgid "" msgstr "" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Anim Clips" +msgstr "کلیپ های انیمیشن:" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Audio Clips" +msgstr "کلیپ های صوتی:" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Functions" +msgstr "وظایÙ:" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/animation_state_machine_editor.cpp #, fuzzy msgid "Node Renamed" @@ -5091,6 +5111,14 @@ msgid "Grid Step:" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Primary Line Every:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "steps" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotation Offset:" msgstr "" @@ -5100,6 +5128,11 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy +msgid "Scale Step:" +msgstr "نسبت تغییر مقیاس:" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy msgid "Move Vertical Guide" msgstr "برداشتن متغیر" @@ -5188,6 +5221,20 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"Overrides game camera with editor viewport camera." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"No game instance running." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp #, fuzzy msgid "Lock Selected" msgstr "همه‌ی انتخاب ها" @@ -5334,6 +5381,10 @@ msgid "Use Rotation Snap" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Use Scale Snap" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap Relative" msgstr "" @@ -5479,7 +5530,7 @@ msgstr "کلید را در انیمیشن درج Ú©Ù†" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" -"Auto insert keys when objects are translated, rotated on scaled (based on " +"Auto insert keys when objects are translated, rotated or scaled (based on " "mask).\n" "Keys are only added to existing tracks, no new tracks will be created.\n" "Keys must be inserted manually for the first time." @@ -8498,7 +8549,7 @@ msgid "Dodge operator." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "HardLight operator" +msgid "HardLight operator." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -9093,9 +9144,10 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Custom Godot Shader Language expression, which placed on top of the resulted " -"shader. You can place various function definitions inside and call it later " -"in the Expressions. You can also declare varyings, uniforms and constants." +"Custom Godot Shader Language expression, which is placed on top of the " +"resulted shader. You can place various function definitions inside and call " +"it later in the Expressions. You can also declare varyings, uniforms and " +"constants." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -9210,6 +9262,12 @@ msgid "Add..." msgstr "" #: editor/project_export.cpp +msgid "" +"If checked, the preset will be available for use in one-click deploy.\n" +"Only one preset per platform may be marked as runnable." +msgstr "" + +#: editor/project_export.cpp #, fuzzy msgid "Export Path" msgstr "صدور پروژه" @@ -9670,18 +9728,6 @@ msgid "Device" msgstr "دستگاه" #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Shift+" -msgstr "+Shift" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Alt+" -msgstr "+Alt" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Control+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "Press a Key..." msgstr "" @@ -11490,7 +11536,7 @@ msgid "Can't create function of nodes from nodes of multiple functions." msgstr "" #: modules/visual_script/visual_script_editor.cpp -msgid "Select atleast one node with sequence port." +msgid "Select at least one node with sequence port." msgstr "" #: modules/visual_script/visual_script_editor.cpp @@ -11818,11 +11864,21 @@ msgstr "نمی‌تواند یک پوشه ایجاد شود." #: platform/uwp/export/export.cpp #, fuzzy +msgid "Invalid package short name." +msgstr "نام نامعتبر." + +#: platform/uwp/export/export.cpp +#, fuzzy msgid "Invalid package unique name." msgstr "نام نامعتبر." #: platform/uwp/export/export.cpp #, fuzzy +msgid "Invalid package publisher display name." +msgstr "نام نامعتبر." + +#: platform/uwp/export/export.cpp +#, fuzzy msgid "Invalid product GUID." msgstr "اندازه‌ی قلم نامعتبر." @@ -12428,6 +12484,12 @@ msgstr "" msgid "Constants cannot be modified." msgstr "" +#~ msgid "Shift+" +#~ msgstr "+Shift" + +#~ msgid "Alt+" +#~ msgstr "+Alt" + #, fuzzy #~ msgid "Add input +" #~ msgstr "اÙزودن نقطه" diff --git a/editor/translations/fi.po b/editor/translations/fi.po index cad94fd55c..517733d566 100644 --- a/editor/translations/fi.po +++ b/editor/translations/fi.po @@ -13,7 +13,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2019-10-04 03:15+0000\n" +"PO-Revision-Date: 2019-11-29 14:49+0000\n" "Last-Translator: Tapani Niemi <tapani.niemi@kapsi.fi>\n" "Language-Team: Finnish <https://hosted.weblate.org/projects/godot-engine/" "godot/fi/>\n" @@ -22,7 +22,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 3.9-dev\n" +"X-Generator: Weblate 3.10-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -628,9 +628,8 @@ msgid "Scale Ratio:" msgstr "Skaalaussuhde:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Select Tracks to Copy" -msgstr "Valitse kopioitavat raidat:" +msgstr "Valitse kopioitavat raidat" #: editor/animation_track_editor.cpp editor/editor_log.cpp #: editor/editor_properties.cpp @@ -642,9 +641,8 @@ msgid "Copy" msgstr "Kopioi" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Select All/None" -msgstr "Tyhjennä valinta" +msgstr "Valitse kaikki/ei mitään" #: editor/animation_track_editor_plugins.cpp msgid "Add Audio Track Clip" @@ -2877,8 +2875,8 @@ msgid "Play" msgstr "Pelaa" #: editor/editor_node.cpp -msgid "Pause the scene" -msgstr "Keskeytä skenen suorittaminen hetkellisesti" +msgid "Pause the scene execution for debugging." +msgstr "Keskeytä skenen suoritus debuggausta varten." #: editor/editor_node.cpp msgid "Pause Scene" @@ -3569,6 +3567,10 @@ msgid "New Inherited Scene" msgstr "Uusi periytetty skene" #: editor/filesystem_dock.cpp +msgid "Set As Main Scene" +msgstr "Aseta pääskeneksi" + +#: editor/filesystem_dock.cpp msgid "Open Scenes" msgstr "Avaa skenejä" @@ -4299,6 +4301,18 @@ msgstr "" "nimien haku ei onnistu." #: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Anim Clips" +msgstr "Animaatioleikkeet" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Audio Clips" +msgstr "Äänileikkeet" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Functions" +msgstr "Funktiot" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/animation_state_machine_editor.cpp msgid "Node Renamed" msgstr "Solmu uudelleennimetty" @@ -4889,7 +4903,7 @@ msgstr "Kaikki" #: editor/plugins/asset_library_editor_plugin.cpp msgid "No results for \"%s\"." -msgstr "" +msgstr "Ei tuloksia haulle \"%s\"." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Import..." @@ -4978,6 +4992,14 @@ msgid "Grid Step:" msgstr "Ruudukon välistys:" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Primary Line Every:" +msgstr "Pääviivan toistuminen:" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "steps" +msgstr "askelta" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotation Offset:" msgstr "Kierron siirtymä:" @@ -4986,6 +5008,10 @@ msgid "Rotation Step:" msgstr "Kierron välistys:" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale Step:" +msgstr "Skaalauksen välistys:" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move Vertical Guide" msgstr "Siirrä pystysuoraa apuviivaa" @@ -5071,6 +5097,24 @@ msgstr "Muuta ankkureita" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"Overrides game camera with editor viewport camera." +msgstr "" +"Pelikameran ohitus\n" +"Ohittaa pelikameran editorin näyttöruutukameralla." + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"No game instance running." +msgstr "" +"Pelikameran ohitus\n" +"Peli ei ole käynnissä." + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp msgid "Lock Selected" msgstr "Lukitse valitut" @@ -5187,22 +5231,18 @@ msgid "Ruler Mode" msgstr "Viivaintila" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Toggle smart snapping." -msgstr "Aseta tarttuminen." +msgstr "Aseta älykäs tarttuminen." #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Use Smart Snap" -msgstr "Käytä tarttumista" +msgstr "Käytä älykästä tarttumista" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Toggle grid snapping." -msgstr "Aseta tarttuminen." +msgstr "Aseta ruudukkoon tarttuminen." #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Use Grid Snap" msgstr "Tartu ruudukkoon" @@ -5215,6 +5255,10 @@ msgid "Use Rotation Snap" msgstr "Tartu käännettäessä" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Use Scale Snap" +msgstr "Käytä skaalauksen tarttumista" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap Relative" msgstr "Suhteellinen tarttuminen" @@ -5297,9 +5341,8 @@ msgid "View" msgstr "Näytä" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Always Show Grid" -msgstr "Näytä ruudukko" +msgstr "Näytä aina ruudukko" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Show Helpers" @@ -5355,7 +5398,7 @@ msgstr "Lisää avainruutuja (maskiin perustuen)." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" -"Auto insert keys when objects are translated, rotated on scaled (based on " +"Auto insert keys when objects are translated, rotated or scaled (based on " "mask).\n" "Keys are only added to existing tracks, no new tracks will be created.\n" "Keys must be inserted manually for the first time." @@ -5566,9 +5609,8 @@ msgid "Hold Shift to edit tangents individually" msgstr "Pidä shift pohjassa muokataksesi tangentteja yksitellen" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Right click to add point" -msgstr "Oikea painallus: poista piste" +msgstr "Lisää piste napsauttamalla oikeaa" #: editor/plugins/gi_probe_editor_plugin.cpp msgid "Bake GI Probe" @@ -7024,9 +7066,8 @@ msgid "Freelook Speed Modifier" msgstr "Liikkumisen nopeussäädin" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Freelook Slow Modifier" -msgstr "Liikkumisen nopeussäädin" +msgstr "Liikkumisen hitauskerroin" #: editor/plugins/spatial_editor_plugin.cpp msgid "" @@ -7297,9 +7338,8 @@ msgid "Simplification: " msgstr "Yksinkertaistus: " #: editor/plugins/sprite_editor_plugin.cpp -#, fuzzy msgid "Shrink (Pixels): " -msgstr "Suurrennus (pikseleissä): " +msgstr "Kutista (pikseleissä): " #: editor/plugins/sprite_editor_plugin.cpp msgid "Grow (Pixels): " @@ -8087,9 +8127,8 @@ msgid "(GLES3 only)" msgstr "(Vain GLES3)" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Add Output" -msgstr "Lisää lähtö +" +msgstr "Lisää lähtö" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Scalar" @@ -8104,9 +8143,8 @@ msgid "Boolean" msgstr "Totuusarvo" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Sampler" -msgstr "Lisää Sample" +msgstr "Sampleri" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Add input port" @@ -8238,8 +8276,8 @@ msgid "Dodge operator." msgstr "Värinväistöoperaattori." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "HardLight operator" -msgstr "Kovavalo-operaattori" +msgid "HardLight operator." +msgstr "Kovavalo-operaattori." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Lighten operator." @@ -8876,9 +8914,10 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Custom Godot Shader Language expression, which placed on top of the resulted " -"shader. You can place various function definitions inside and call it later " -"in the Expressions. You can also declare varyings, uniforms and constants." +"Custom Godot Shader Language expression, which is placed on top of the " +"resulted shader. You can place various function definitions inside and call " +"it later in the Expressions. You can also declare varyings, uniforms and " +"constants." msgstr "" "Mukautettu Godotin sävytinkielen lauseke, joka sijoitetaan syntyvän " "sävyttimen alkuun. Voit lisätä siihen erilaisia funktiomäärityksiä ja kutsua " @@ -9008,6 +9047,14 @@ msgid "Add..." msgstr "Lisää..." #: editor/project_export.cpp +msgid "" +"If checked, the preset will be available for use in one-click deploy.\n" +"Only one preset per platform may be marked as runnable." +msgstr "" +"Jos päällä, esiasetus on käytettävissä yhden napsautuksen käyttöönotossa.\n" +"Kutakin alustaa kohden voidaan merkitä ajettavaksi vain yksi esiasetus." + +#: editor/project_export.cpp msgid "Export Path" msgstr "Vie polku" @@ -9036,22 +9083,21 @@ msgid "Resources to export:" msgstr "Vietävät resurssit:" #: editor/project_export.cpp -#, fuzzy msgid "" "Filters to export non-resource files/folders\n" "(comma-separated, e.g: *.json, *.txt, docs/*)" msgstr "" -"Suodattimet tiedostojen viemiseen jotka eivät ole resursseja (esim. *.json, " -"*.txt)" +"Suodattimet sellaisten tiedostojen ja kansioiden viemiseen, jotka eivät ole " +"resursseja\n" +"(pilkulla erotettuna, esim. *.json, *.txt, docs/*)" #: editor/project_export.cpp -#, fuzzy msgid "" "Filters to exclude files/folders from project\n" "(comma-separated, e.g: *.json, *.txt, docs/*)" msgstr "" -"Suodattimet tiedostoille jotka jätetään projektista pois (esim. *.json, *." -"txt)" +"Suodattimet tiedostoille ja kansioille, jotka jätetään projektista pois \n" +"(pilkulla erotettuna, esim. *.json, *.txt, docs/*)" #: editor/project_export.cpp msgid "Patches" @@ -9500,18 +9546,6 @@ msgid "Device" msgstr "Laite" #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Shift+" -msgstr "Shift+" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Alt+" -msgstr "Alt+" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Control+" -msgstr "Control+" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "Press a Key..." msgstr "Paina näppäintä..." @@ -10096,13 +10130,13 @@ msgstr "" "solmun ominaisuudet oletusarvoihin." #: editor/scene_tree_dock.cpp -#, fuzzy msgid "" "Enabling \"Load As Placeholder\" will disable \"Editable Children\" and " "cause all properties of the node to be reverted to their default." msgstr "" -"\"editable_instance\" ominaisuuden poistaminen käytöstä palauttaa kaikki " -"solmun ominaisuudet oletusarvoihin." +"\"Lataa paikanpitäjäksi\" ominaisuuden ottaminen käyttöön poistaa " +"\"Muokattavat alisolmut\" ominaisuuden käytöstä ja palauttaa kaikki solmun " +"ominaisuudet oletusarvoihin." #: editor/scene_tree_dock.cpp msgid "Make Local" @@ -10441,19 +10475,16 @@ msgid "Will load an existing script file." msgstr "Lataa olemassaolevan skriptitiedoston." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Class Name:" -msgstr "Luokan nimi" +msgstr "Luokan nimi:" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Template:" -msgstr "Malli" +msgstr "Malli:" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Built-in Script:" -msgstr "Sisäänrakennettu skripti" +msgstr "Sisäänrakennettu skripti:" #: editor/script_create_dialog.cpp msgid "Attach Node Script" @@ -11097,7 +11128,6 @@ msgid "Add Function" msgstr "Lisää funktio" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Delete input port" msgstr "Poista tuloportti" @@ -11110,22 +11140,18 @@ msgid "Add Signal" msgstr "Lisää signaali" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Add Input Port" msgstr "Lisää tuloportti" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Add Output Port" msgstr "Lisää lähtöportti" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Remove Input Port" msgstr "Poista tuloportti" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Remove Output Port" msgstr "Poista lähtöportti" @@ -11177,6 +11203,7 @@ msgstr "Lisää esiladattu solmu" #: modules/visual_script/visual_script_editor.cpp msgid "Can't drop nodes because script '%s' is not used in this scene." msgstr "" +"Ei voida pudottaa solmuja, koska skripti '%s' ei ole käytössä tässä skenessä." #: modules/visual_script/visual_script_editor.cpp msgid "Add Node(s) From Tree" @@ -11187,6 +11214,9 @@ msgid "" "Can't drop properties because script '%s' is not used in this scene.\n" "Drop holding 'Shift' to just copy the signature." msgstr "" +"Ei voida pudottaa ominaisuuksia, koska skripti '%s' ei ole käytössä tässä " +"skenessä.\n" +"Kopioidaksesi vain tunnisteen, pudota pitämällä 'Shift' pohjassa." #: modules/visual_script/visual_script_editor.cpp msgid "Add Getter Property" @@ -11213,9 +11243,8 @@ msgid "Connect Nodes" msgstr "Kytke solmut" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Disconnect Nodes" -msgstr "Erota graafin solmut" +msgstr "Katkaise solmujen kytkennät" #: modules/visual_script/visual_script_editor.cpp msgid "Connect Node Data" @@ -11250,26 +11279,24 @@ msgid "Paste VisualScript Nodes" msgstr "Liitä VisualScript solmut" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Can't create function with a function node." -msgstr "Ei voida kopioida funktiosolmua." +msgstr "Ei voida luoda funktiota funktiosolmulla." #: modules/visual_script/visual_script_editor.cpp msgid "Can't create function of nodes from nodes of multiple functions." -msgstr "" +msgstr "Ei voi luoda solmujen funktiota useamman funktion solmuista." #: modules/visual_script/visual_script_editor.cpp -msgid "Select atleast one node with sequence port." -msgstr "" +msgid "Select at least one node with sequence port." +msgstr "Valitse ainakin yksi solmu, jolla on sarjaportti." #: modules/visual_script/visual_script_editor.cpp msgid "Try to only have one sequence input in selection." -msgstr "" +msgstr "Yritä käyttää vain yhtä sarjatuloa valinnassa." #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Create Function" -msgstr "Nimeä funktio uudelleen" +msgstr "Luo funktio" #: modules/visual_script/visual_script_editor.cpp msgid "Remove Function" @@ -11300,9 +11327,8 @@ msgid "Members:" msgstr "Jäsenet:" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "function_name" -msgstr "Funktio:" +msgstr "function_name" #: modules/visual_script/visual_script_editor.cpp msgid "Select or create a function to edit its graph." @@ -11325,14 +11351,12 @@ msgid "Cut Nodes" msgstr "Leikkaa solmut" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Make Function" -msgstr "Nimeä funktio uudelleen" +msgstr "Tee funktio" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Refresh Graph" -msgstr "Päivitä" +msgstr "Päivitä graafi" #: modules/visual_script/visual_script_editor.cpp msgid "Edit Member" @@ -11552,7 +11576,7 @@ msgstr "Vaadittavaa ikonia ei ole määritetty esiasetuksissa." #: platform/javascript/export/export.cpp msgid "Stop HTTP Server" -msgstr "" +msgstr "Pysäytä HTTP-palvelin" #: platform/javascript/export/export.cpp msgid "Run in Browser" @@ -11587,10 +11611,18 @@ msgid "Using default boot splash image." msgstr "Käytetään oletuskäynnistyskuvaa." #: platform/uwp/export/export.cpp +msgid "Invalid package short name." +msgstr "Paketin lyhyt nimi on virheellinen." + +#: platform/uwp/export/export.cpp msgid "Invalid package unique name." msgstr "Paketin yksilöllinen nimi on virheellinen." #: platform/uwp/export/export.cpp +msgid "Invalid package publisher display name." +msgstr "Paketin julkaisijan näyttönimi on virheellinen." + +#: platform/uwp/export/export.cpp msgid "Invalid product GUID." msgstr "Tuotteen GUID (yleisesti yksilöllinen tunniste) on virheellinen." @@ -12244,6 +12276,18 @@ msgstr "Varying tyypin voi sijoittaa vain vertex-funktiossa." msgid "Constants cannot be modified." msgstr "Vakioita ei voi muokata." +#~ msgid "Pause the scene" +#~ msgstr "Keskeytä skenen suorittaminen hetkellisesti" + +#~ msgid "Shift+" +#~ msgstr "Shift+" + +#~ msgid "Alt+" +#~ msgstr "Alt+" + +#~ msgid "Control+" +#~ msgstr "Control+" + #~ msgid "Snap to Grid" #~ msgstr "Tartu ruudukkoon" diff --git a/editor/translations/fil.po b/editor/translations/fil.po index 11a3f7c0a4..6c9950261b 100644 --- a/editor/translations/fil.po +++ b/editor/translations/fil.po @@ -4,11 +4,12 @@ # This file is distributed under the same license as the Godot source code. # Marco Santos <enum.scima@gmail.com>, 2019. # Amado Wilkins <epicalert68@gmail.com>, 2019. +# Bakainkorp <Ryan.Bautista86@myhunter.cuny.edu>, 2019. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" -"PO-Revision-Date: 2019-10-11 15:07+0000\n" -"Last-Translator: Marco Santos <enum.scima@gmail.com>\n" +"PO-Revision-Date: 2019-11-21 14:24+0000\n" +"Last-Translator: Bakainkorp <Ryan.Bautista86@myhunter.cuny.edu>\n" "Language-Team: Filipino <https://hosted.weblate.org/projects/godot-engine/" "godot/fil/>\n" "Language: fil\n" @@ -16,7 +17,7 @@ msgstr "" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=2; plural=n != 1 && n != 2 && n != 3 && (n % 10 == 4 " "|| n % 10 == 6 || n % 10 == 9);\n" -"X-Generator: Weblate 3.9-dev\n" +"X-Generator: Weblate 3.10-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -312,7 +313,7 @@ msgstr "" #: editor/animation_track_editor.cpp #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Insert Key" -msgstr "" +msgstr "Magpasok Ang Key" #: editor/animation_track_editor.cpp msgid "Duplicate Key(s)" @@ -356,7 +357,7 @@ msgstr "" #: editor/script_create_dialog.cpp #: modules/visual_script/visual_script_editor.cpp msgid "Create" -msgstr "" +msgstr "Lumikha" #: editor/animation_track_editor.cpp msgid "Anim Insert" @@ -448,7 +449,7 @@ msgstr "" #: editor/animation_track_editor.cpp msgid "Clipboard is empty" -msgstr "" +msgstr "Walang laman ang Clipboard" #: editor/animation_track_editor.cpp msgid "Paste Tracks" @@ -502,11 +503,11 @@ msgstr "" #: editor/animation_track_editor.cpp msgid "Seconds" -msgstr "" +msgstr "Segundo" #: editor/animation_track_editor.cpp msgid "FPS" -msgstr "" +msgstr "FPS" #: editor/animation_track_editor.cpp editor/editor_properties.cpp #: editor/plugins/polygon_2d_editor_plugin.cpp @@ -515,7 +516,7 @@ msgstr "" #: editor/project_manager.cpp editor/project_settings_editor.cpp #: editor/property_editor.cpp modules/visual_script/visual_script_editor.cpp msgid "Edit" -msgstr "" +msgstr "I-edit" #: editor/animation_track_editor.cpp msgid "Animation properties." @@ -624,7 +625,7 @@ msgstr "" #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" -msgstr "" +msgstr "Kopya" #: editor/animation_track_editor.cpp msgid "Select All/None" @@ -684,11 +685,11 @@ msgstr "" #: editor/code_editor.cpp editor/rename_dialog.cpp msgid "Replace" -msgstr "" +msgstr "Palitan" #: editor/code_editor.cpp msgid "Replace All" -msgstr "" +msgstr "Palitan ang Lahat" #: editor/code_editor.cpp msgid "Selection Only" @@ -717,7 +718,7 @@ msgstr "" #: editor/code_editor.cpp msgid "Warnings" -msgstr "" +msgstr "Mga Babala" #: editor/code_editor.cpp msgid "Line and column numbers." @@ -753,7 +754,7 @@ msgstr "" #: editor/groups_editor.cpp editor/plugins/item_list_editor_plugin.cpp #: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp msgid "Add" -msgstr "" +msgstr "Maglagay" #: editor/connections_dialog.cpp editor/dependency_editor.cpp #: editor/editor_feature_profile.cpp editor/groups_editor.cpp @@ -764,7 +765,7 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp #: editor/project_settings_editor.cpp msgid "Remove" -msgstr "" +msgstr "Alisin" #: editor/connections_dialog.cpp msgid "Add Extra Call Argument:" @@ -812,7 +813,7 @@ msgstr "" #: editor/run_settings_dialog.cpp editor/settings_config_dialog.cpp #: modules/visual_script/visual_script_editor.cpp msgid "Close" -msgstr "" +msgstr "Isara" #: editor/connections_dialog.cpp msgid "Connect" @@ -869,7 +870,7 @@ msgstr "" #: editor/connections_dialog.cpp msgid "Edit..." -msgstr "" +msgstr "I-edit..." #: editor/connections_dialog.cpp msgid "Go To Method" @@ -881,7 +882,7 @@ msgstr "" #: editor/create_dialog.cpp editor/project_settings_editor.cpp msgid "Change" -msgstr "" +msgstr "Baguhin" #: editor/create_dialog.cpp msgid "Create New %s" @@ -890,17 +891,17 @@ msgstr "" #: editor/create_dialog.cpp editor/editor_file_dialog.cpp #: editor/filesystem_dock.cpp msgid "Favorites:" -msgstr "" +msgstr "Mga Paborito:" #: editor/create_dialog.cpp editor/editor_file_dialog.cpp msgid "Recent:" -msgstr "" +msgstr "Kamakailan:" #: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp #: editor/property_selector.cpp editor/quick_open.cpp #: modules/visual_script/visual_script_property_selector.cpp msgid "Search:" -msgstr "" +msgstr "Paghahanap:" #: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp #: editor/property_selector.cpp editor/quick_open.cpp @@ -2243,11 +2244,11 @@ msgstr "" #: editor/editor_node.cpp msgid "No" -msgstr "" +msgstr "Hindi" #: editor/editor_node.cpp msgid "Yes" -msgstr "" +msgstr "Oo" #: editor/editor_node.cpp msgid "This scene has never been saved. Save before running?" @@ -2767,7 +2768,7 @@ msgid "Play" msgstr "" #: editor/editor_node.cpp -msgid "Pause the scene" +msgid "Pause the scene execution for debugging." msgstr "" #: editor/editor_node.cpp @@ -3433,6 +3434,10 @@ msgid "New Inherited Scene" msgstr "" #: editor/filesystem_dock.cpp +msgid "Set As Main Scene" +msgstr "" + +#: editor/filesystem_dock.cpp msgid "Open Scenes" msgstr "" @@ -4142,6 +4147,18 @@ msgid "" msgstr "" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Anim Clips" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Audio Clips" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Functions" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/animation_state_machine_editor.cpp msgid "Node Renamed" msgstr "" @@ -4809,6 +4826,14 @@ msgid "Grid Step:" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Primary Line Every:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "steps" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotation Offset:" msgstr "" @@ -4817,6 +4842,10 @@ msgid "Rotation Step:" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale Step:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move Vertical Guide" msgstr "" @@ -4899,6 +4928,20 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"Overrides game camera with editor viewport camera." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"No game instance running." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp msgid "Lock Selected" msgstr "" @@ -5033,6 +5076,10 @@ msgid "Use Rotation Snap" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Use Scale Snap" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap Relative" msgstr "" @@ -5172,7 +5219,7 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" -"Auto insert keys when objects are translated, rotated on scaled (based on " +"Auto insert keys when objects are translated, rotated or scaled (based on " "mask).\n" "Keys are only added to existing tracks, no new tracks will be created.\n" "Keys must be inserted manually for the first time." @@ -8004,7 +8051,7 @@ msgid "Dodge operator." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "HardLight operator" +msgid "HardLight operator." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8592,9 +8639,10 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Custom Godot Shader Language expression, which placed on top of the resulted " -"shader. You can place various function definitions inside and call it later " -"in the Expressions. You can also declare varyings, uniforms and constants." +"Custom Godot Shader Language expression, which is placed on top of the " +"resulted shader. You can place various function definitions inside and call " +"it later in the Expressions. You can also declare varyings, uniforms and " +"constants." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8703,6 +8751,12 @@ msgid "Add..." msgstr "" #: editor/project_export.cpp +msgid "" +"If checked, the preset will be available for use in one-click deploy.\n" +"Only one preset per platform may be marked as runnable." +msgstr "" + +#: editor/project_export.cpp msgid "Export Path" msgstr "" @@ -9139,18 +9193,6 @@ msgid "Device" msgstr "" #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Shift+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Alt+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Control+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "Press a Key..." msgstr "" @@ -10843,7 +10885,7 @@ msgid "Can't create function of nodes from nodes of multiple functions." msgstr "" #: modules/visual_script/visual_script_editor.cpp -msgid "Select atleast one node with sequence port." +msgid "Select at least one node with sequence port." msgstr "" #: modules/visual_script/visual_script_editor.cpp @@ -11148,10 +11190,18 @@ msgid "Using default boot splash image." msgstr "" #: platform/uwp/export/export.cpp +msgid "Invalid package short name." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package unique name." msgstr "" #: platform/uwp/export/export.cpp +msgid "Invalid package publisher display name." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid product GUID." msgstr "" diff --git a/editor/translations/fr.po b/editor/translations/fr.po index cecaead406..423452a065 100644 --- a/editor/translations/fr.po +++ b/editor/translations/fr.po @@ -67,12 +67,13 @@ # Romain Paquet <titou.paquet@gmail.com>, 2019. # Xavier Sellier <contact@binogure-studio.com>, 2019. # Sofiane <Sofiane-77@caramail.fr>, 2019. +# Camille Mohr-Daurat <pouleyketchoup@gmail.com>, 2019. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2019-10-06 08:48+0000\n" -"Last-Translator: Sofiane <Sofiane-77@caramail.fr>\n" +"PO-Revision-Date: 2019-11-29 14:49+0000\n" +"Last-Translator: Camille Mohr-Daurat <pouleyketchoup@gmail.com>\n" "Language-Team: French <https://hosted.weblate.org/projects/godot-engine/" "godot/fr/>\n" "Language: fr\n" @@ -80,7 +81,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 3.9-dev\n" +"X-Generator: Weblate 3.10-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -699,9 +700,8 @@ msgid "Scale Ratio:" msgstr "Ratio d'échelle :" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Select Tracks to Copy" -msgstr "Sélectionner les pistes à copier :" +msgstr "Sélectionner les pistes à copier" #: editor/animation_track_editor.cpp editor/editor_log.cpp #: editor/editor_properties.cpp @@ -713,9 +713,8 @@ msgid "Copy" msgstr "Copier" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Select All/None" -msgstr "Tout Désélectionner" +msgstr "Tout Sélectionner/Désélectionner" #: editor/animation_track_editor_plugins.cpp msgid "Add Audio Track Clip" @@ -2976,8 +2975,8 @@ msgid "Play" msgstr "Jouer" #: editor/editor_node.cpp -msgid "Pause the scene" -msgstr "Mettre en pause la scène" +msgid "Pause the scene execution for debugging." +msgstr "Suspend l'exécution de la scène pour le débogage." #: editor/editor_node.cpp msgid "Pause Scene" @@ -3676,6 +3675,10 @@ msgid "New Inherited Scene" msgstr "Nouvelle scène héritée" #: editor/filesystem_dock.cpp +msgid "Set As Main Scene" +msgstr "Définir comme scène principale" + +#: editor/filesystem_dock.cpp msgid "Open Scenes" msgstr "Ouvrir des scènes" @@ -4411,6 +4414,18 @@ msgstr "" "impossible de récupérer les noms des pistes." #: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Anim Clips" +msgstr "Clips d'animation" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Audio Clips" +msgstr "Clips audio" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Functions" +msgstr "Fonctions" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/animation_state_machine_editor.cpp msgid "Node Renamed" msgstr "NÅ“ud renommé" @@ -5002,7 +5017,7 @@ msgstr "Tout" #: editor/plugins/asset_library_editor_plugin.cpp msgid "No results for \"%s\"." -msgstr "" +msgstr "Aucun résultats pour \"%s\"." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Import..." @@ -5092,6 +5107,14 @@ msgid "Grid Step:" msgstr "Pas de la grille :" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Primary Line Every:" +msgstr "Ligne primaire toutes les :" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "steps" +msgstr "étapes" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotation Offset:" msgstr "Décalage de la rotation :" @@ -5100,6 +5123,10 @@ msgid "Rotation Step:" msgstr "Pas de la rotation :" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale Step:" +msgstr "Pas de l'échelle :" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move Vertical Guide" msgstr "Déplacer le guide vertical" @@ -5185,6 +5212,25 @@ msgstr "Modifier les ancres" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"Overrides game camera with editor viewport camera." +msgstr "" +"Remplacement de la Caméra du Jeu\n" +"Remplace la caméra du jeu par la caméra de la fenêtre d'affichage de " +"l'editeur." + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"No game instance running." +msgstr "" +"Remplacement de la Caméra du Jeu\n" +"Aucune instance de jeu en cours d'exécution." + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp msgid "Lock Selected" msgstr "Verrouillage Sélectionné" @@ -5301,22 +5347,18 @@ msgid "Ruler Mode" msgstr "Mode Règle" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Toggle smart snapping." -msgstr "Activer/Désactiver le magnétisme." +msgstr "Activer/Désactiver le magnétisme intelligent." #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Use Smart Snap" -msgstr "Aligner sur la grille" +msgstr "Utiliser le magnétisme intelligent" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Toggle grid snapping." -msgstr "Activer/Désactiver le magnétisme." +msgstr "Activer/Désactiver l'aimantation à la grille." #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Use Grid Snap" msgstr "Aimanter à la grille" @@ -5329,6 +5371,10 @@ msgid "Use Rotation Snap" msgstr "Rotation alignée" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Use Scale Snap" +msgstr "Utiliser le magnétisme d'échelle" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap Relative" msgstr "Alignement relatif" @@ -5411,9 +5457,8 @@ msgid "View" msgstr "Affichage" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Always Show Grid" -msgstr "Afficher la grille" +msgstr "Toujours afficher la grille" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Show Helpers" @@ -5469,7 +5514,7 @@ msgstr "Insérer des clés (en fonction du masque)." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" -"Auto insert keys when objects are translated, rotated on scaled (based on " +"Auto insert keys when objects are translated, rotated or scaled (based on " "mask).\n" "Keys are only added to existing tracks, no new tracks will be created.\n" "Keys must be inserted manually for the first time." @@ -5680,9 +5725,8 @@ msgid "Hold Shift to edit tangents individually" msgstr "Maintenez Maj. appuyée pour modifier les tangentes individuellement" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Right click to add point" -msgstr "Clic droit : Supprimer un point" +msgstr "Clic droit pour ajouter un point" #: editor/plugins/gi_probe_editor_plugin.cpp msgid "Bake GI Probe" @@ -7148,7 +7192,6 @@ msgid "Freelook Speed Modifier" msgstr "Modificateur de vitesse de la vue libre" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Freelook Slow Modifier" msgstr "Modificateur de vitesse de la vue libre" @@ -7424,9 +7467,8 @@ msgid "Simplification: " msgstr "Simplification : " #: editor/plugins/sprite_editor_plugin.cpp -#, fuzzy msgid "Shrink (Pixels): " -msgstr "Croissance (Pixels) : " +msgstr "Rétrécir (Pixels) : " #: editor/plugins/sprite_editor_plugin.cpp msgid "Grow (Pixels): " @@ -8214,9 +8256,8 @@ msgid "(GLES3 only)" msgstr "(GLES3 seulement)" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Add Output" -msgstr "Ajouter une sortie +" +msgstr "Ajouter une sortie" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Scalar" @@ -8232,7 +8273,7 @@ msgstr "Booléen" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Sampler" -msgstr "" +msgstr "Échantillonneur" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Add input port" @@ -8364,8 +8405,8 @@ msgid "Dodge operator." msgstr "Opérateur d'évitement." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "HardLight operator" -msgstr "Opérateur HardLight" +msgid "HardLight operator." +msgstr "Opérateur de lumière forte." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Lighten operator." @@ -8381,7 +8422,7 @@ msgstr "Opérateur d'écran." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "SoftLight operator." -msgstr "Opérateur SoftLight." +msgstr "Opérateur de lumière douce." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Color constant." @@ -9010,10 +9051,12 @@ msgstr "" "et de la direction de la caméra (transmettez-lui les entrées associées)." #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy msgid "" -"Custom Godot Shader Language expression, which placed on top of the resulted " -"shader. You can place various function definitions inside and call it later " -"in the Expressions. You can also declare varyings, uniforms and constants." +"Custom Godot Shader Language expression, which is placed on top of the " +"resulted shader. You can place various function definitions inside and call " +"it later in the Expressions. You can also declare varyings, uniforms and " +"constants." msgstr "" "Expression personnalisée du langage de shader Godot, qui est placée au-" "dessus du shader obtenu. Vous pouvez insérer diverses définitions de " @@ -9144,6 +9187,15 @@ msgid "Add..." msgstr "Ajouter…" #: editor/project_export.cpp +msgid "" +"If checked, the preset will be available for use in one-click deploy.\n" +"Only one preset per platform may be marked as runnable." +msgstr "" +"Si cette option est activée, le pré-réglage sera disponible pour le " +"déploiement en un clic.\n" +"Un seul pré-réglage par plateforme peut être marqué comme exécutable." + +#: editor/project_export.cpp msgid "Export Path" msgstr "Chemin d'exportation" @@ -9172,22 +9224,20 @@ msgid "Resources to export:" msgstr "Ressources à exporter :" #: editor/project_export.cpp -#, fuzzy msgid "" "Filters to export non-resource files/folders\n" "(comma-separated, e.g: *.json, *.txt, docs/*)" msgstr "" -"Filtres d'export de fichiers non ressources (séparés par des virgules, par " -"exemple : *.json, *.txt) :" +"Filtres pour exporter des fichiers/dossiers non-ressources\n" +"(séparés par des virgules, par exemple : *.json, *.txt, docs/*)" #: editor/project_export.cpp -#, fuzzy msgid "" "Filters to exclude files/folders from project\n" "(comma-separated, e.g: *.json, *.txt, docs/*)" msgstr "" -"Filtres pour exclure des fichiers du projet (séparés par des virgules, par " -"exemple: *.json, *.txt) :" +"Filtres pour exclure les fichiers/dossiers du projet\n" +"(séparés par des virgules, par exemple : *.json, *.txt, docs/*)" #: editor/project_export.cpp msgid "Patches" @@ -9642,18 +9692,6 @@ msgid "Device" msgstr "Périphérique" #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Shift+" -msgstr "Maj+" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Alt+" -msgstr "Alt+" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Control+" -msgstr "Contrôle+" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "Press a Key..." msgstr "Appuyez sur une touche…" @@ -10236,13 +10274,12 @@ msgstr "" "propriétés du nÅ“ud." #: editor/scene_tree_dock.cpp -#, fuzzy msgid "" "Enabling \"Load As Placeholder\" will disable \"Editable Children\" and " "cause all properties of the node to be reverted to their default." msgstr "" -"Désactiver \"editable_instance\" implique la remise à zéro de toutes les " -"propriétés du nÅ“ud." +"L'activation de \"Load As Placeholder\" désactivera \"Editable Children\" et " +"ramènera toutes les propriétés du nÅ“ud à leur valeur par défaut." #: editor/scene_tree_dock.cpp msgid "Make Local" @@ -10582,19 +10619,16 @@ msgid "Will load an existing script file." msgstr "Va charger un fichier de script existant." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Class Name:" -msgstr "Nom de classe" +msgstr "Nom de la classe :" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Template:" -msgstr "Modèle" +msgstr "Modèle :" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Built-in Script:" -msgstr "Script intégré" +msgstr "Script intégré :" #: editor/script_create_dialog.cpp msgid "Attach Node Script" @@ -11241,7 +11275,6 @@ msgid "Add Function" msgstr "Ajouter une fonction" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Delete input port" msgstr "Supprimer le port d'entrée" @@ -11254,22 +11287,18 @@ msgid "Add Signal" msgstr "Ajouter un signal" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Add Input Port" msgstr "Ajouter un port d'entrée" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Add Output Port" msgstr "Ajouter un port de sortie" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Remove Input Port" msgstr "Supprimer le port d'entrée" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Remove Output Port" msgstr "Supprimer le port de sortie" @@ -11320,6 +11349,8 @@ msgstr "Ajouter un nÅ“ud préchargé" #: modules/visual_script/visual_script_editor.cpp msgid "Can't drop nodes because script '%s' is not used in this scene." msgstr "" +"Impossible de supprimer les nÅ“uds car le script '% s' n'est pas utilisé dans " +"cette scène." #: modules/visual_script/visual_script_editor.cpp msgid "Add Node(s) From Tree" @@ -11330,6 +11361,9 @@ msgid "" "Can't drop properties because script '%s' is not used in this scene.\n" "Drop holding 'Shift' to just copy the signature." msgstr "" +"Impossible de supprimer les propriétés car le script'%s' n'est pas utilisé " +"dans cette scène.\n" +"Lâchez la touche 'Shift' pour simplement copier la signature." #: modules/visual_script/visual_script_editor.cpp msgid "Add Getter Property" @@ -11356,9 +11390,8 @@ msgid "Connect Nodes" msgstr "Connecter nÅ“ud" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Disconnect Nodes" -msgstr "Connecter nÅ“ud" +msgstr "Déconnecter les nÅ“uds" #: modules/visual_script/visual_script_editor.cpp msgid "Connect Node Data" @@ -11393,26 +11426,27 @@ msgid "Paste VisualScript Nodes" msgstr "Coller les nÅ“uds VisualScript" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Can't create function with a function node." -msgstr "Impossible de copier le nÅ“ud de fonction." +msgstr "Impossible de créer une fonction avec un nÅ“ud de fonction." #: modules/visual_script/visual_script_editor.cpp msgid "Can't create function of nodes from nodes of multiple functions." msgstr "" +"Impossible de créer une fonction de nÅ“uds à partir de nÅ“uds de plusieurs " +"fonctions." #: modules/visual_script/visual_script_editor.cpp -msgid "Select atleast one node with sequence port." -msgstr "" +#, fuzzy +msgid "Select at least one node with sequence port." +msgstr "Sélectionnez au moins un nÅ“ud avec un port de séquence." #: modules/visual_script/visual_script_editor.cpp msgid "Try to only have one sequence input in selection." -msgstr "" +msgstr "Essayez de n'avoir qu'une seule entrée de séquence dans la sélection." #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Create Function" -msgstr "Renommer la fonction" +msgstr "Créer une fonction" #: modules/visual_script/visual_script_editor.cpp msgid "Remove Function" @@ -11443,9 +11477,8 @@ msgid "Members:" msgstr "Membres :" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "function_name" -msgstr "Fonctions :" +msgstr "function_name" #: modules/visual_script/visual_script_editor.cpp msgid "Select or create a function to edit its graph." @@ -11468,14 +11501,12 @@ msgid "Cut Nodes" msgstr "Couper les nÅ“uds" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Make Function" -msgstr "Renommer la fonction" +msgstr "Faire fonction" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Refresh Graph" -msgstr "Rafraîchir" +msgstr "Rafraîchir le graphique" #: modules/visual_script/visual_script_editor.cpp msgid "Edit Member" @@ -11709,7 +11740,7 @@ msgstr "L'icône requise n'est pas spécifiée dans le préréglage." #: platform/javascript/export/export.cpp msgid "Stop HTTP Server" -msgstr "" +msgstr "Arrêter le serveur HTTP" #: platform/javascript/export/export.cpp msgid "Run in Browser" @@ -11744,8 +11775,16 @@ msgid "Using default boot splash image." msgstr "Impossible de lire l'image de démarrage." #: platform/uwp/export/export.cpp +msgid "Invalid package short name." +msgstr "Nom abrégé du paquet invalide." + +#: platform/uwp/export/export.cpp msgid "Invalid package unique name." -msgstr "Nom unique de paquet invalide." +msgstr "Nom unique du paquet invalide." + +#: platform/uwp/export/export.cpp +msgid "Invalid package publisher display name." +msgstr "Nom d'affichage d'éditeur du paquet invalide." #: platform/uwp/export/export.cpp msgid "Invalid product GUID." @@ -12426,6 +12465,18 @@ msgstr "Les variations ne peuvent être affectées que dans la fonction vertex." msgid "Constants cannot be modified." msgstr "Les constantes ne peuvent être modifiées." +#~ msgid "Pause the scene" +#~ msgstr "Mettre en pause la scène" + +#~ msgid "Shift+" +#~ msgstr "Maj+" + +#~ msgid "Alt+" +#~ msgstr "Alt+" + +#~ msgid "Control+" +#~ msgstr "Contrôle+" + #~ msgid "Snap to Grid" #~ msgstr "Aimanter à la grille" diff --git a/editor/translations/ga.po b/editor/translations/ga.po index ea55d235b7..0994c769e1 100644 --- a/editor/translations/ga.po +++ b/editor/translations/ga.po @@ -2763,7 +2763,7 @@ msgid "Play" msgstr "" #: editor/editor_node.cpp -msgid "Pause the scene" +msgid "Pause the scene execution for debugging." msgstr "" #: editor/editor_node.cpp @@ -3428,6 +3428,10 @@ msgid "New Inherited Scene" msgstr "" #: editor/filesystem_dock.cpp +msgid "Set As Main Scene" +msgstr "" + +#: editor/filesystem_dock.cpp msgid "Open Scenes" msgstr "" @@ -4139,6 +4143,19 @@ msgid "" msgstr "" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Anim Clips" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Audio Clips" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Functions" +msgstr "Cruthaigh" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/animation_state_machine_editor.cpp msgid "Node Renamed" msgstr "" @@ -4805,6 +4822,14 @@ msgid "Grid Step:" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Primary Line Every:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "steps" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotation Offset:" msgstr "" @@ -4813,6 +4838,11 @@ msgid "Rotation Step:" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Scale Step:" +msgstr "Scála:" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move Vertical Guide" msgstr "" @@ -4894,6 +4924,20 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"Overrides game camera with editor viewport camera." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"No game instance running." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp msgid "Lock Selected" msgstr "" @@ -5028,6 +5072,10 @@ msgid "Use Rotation Snap" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Use Scale Snap" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap Relative" msgstr "" @@ -5167,7 +5215,7 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" -"Auto insert keys when objects are translated, rotated on scaled (based on " +"Auto insert keys when objects are translated, rotated or scaled (based on " "mask).\n" "Keys are only added to existing tracks, no new tracks will be created.\n" "Keys must be inserted manually for the first time." @@ -7998,7 +8046,7 @@ msgid "Dodge operator." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "HardLight operator" +msgid "HardLight operator." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8585,9 +8633,10 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Custom Godot Shader Language expression, which placed on top of the resulted " -"shader. You can place various function definitions inside and call it later " -"in the Expressions. You can also declare varyings, uniforms and constants." +"Custom Godot Shader Language expression, which is placed on top of the " +"resulted shader. You can place various function definitions inside and call " +"it later in the Expressions. You can also declare varyings, uniforms and " +"constants." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8696,6 +8745,12 @@ msgid "Add..." msgstr "" #: editor/project_export.cpp +msgid "" +"If checked, the preset will be available for use in one-click deploy.\n" +"Only one preset per platform may be marked as runnable." +msgstr "" + +#: editor/project_export.cpp msgid "Export Path" msgstr "" @@ -9132,18 +9187,6 @@ msgid "Device" msgstr "" #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Shift+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Alt+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Control+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "Press a Key..." msgstr "" @@ -10836,7 +10879,7 @@ msgid "Can't create function of nodes from nodes of multiple functions." msgstr "" #: modules/visual_script/visual_script_editor.cpp -msgid "Select atleast one node with sequence port." +msgid "Select at least one node with sequence port." msgstr "" #: modules/visual_script/visual_script_editor.cpp @@ -11142,10 +11185,18 @@ msgid "Using default boot splash image." msgstr "" #: platform/uwp/export/export.cpp +msgid "Invalid package short name." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package unique name." msgstr "" #: platform/uwp/export/export.cpp +msgid "Invalid package publisher display name." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid product GUID." msgstr "" diff --git a/editor/translations/he.po b/editor/translations/he.po index 501c0c731e..b438d8656d 100644 --- a/editor/translations/he.po +++ b/editor/translations/he.po @@ -2923,8 +2923,8 @@ msgid "Play" msgstr "× ×’×™× ×”" #: editor/editor_node.cpp -msgid "Pause the scene" -msgstr "השהיית ×”×¡×¦× ×”" +msgid "Pause the scene execution for debugging." +msgstr "" #: editor/editor_node.cpp msgid "Pause Scene" @@ -3611,6 +3611,11 @@ msgstr "×¡×¦× ×” חדשה בירושה…" #: editor/filesystem_dock.cpp #, fuzzy +msgid "Set As Main Scene" +msgstr "× × ×œ×‘×—×•×¨ ×¡×¦× ×” ר×שית" + +#: editor/filesystem_dock.cpp +#, fuzzy msgid "Open Scenes" msgstr "פתיחת ×¡×¦× ×”" @@ -4385,6 +4390,21 @@ msgid "" msgstr "" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Anim Clips" +msgstr "קטעי ×”× ×¤×©×”:" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Audio Clips" +msgstr "מ×זין לשמע" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Functions" +msgstr "×¤×•× ×§×¦×™×•×ª:" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/animation_state_machine_editor.cpp #, fuzzy msgid "Node Renamed" @@ -5083,6 +5103,14 @@ msgid "Grid Step:" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Primary Line Every:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "steps" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotation Offset:" msgstr "" @@ -5091,6 +5119,11 @@ msgid "Rotation Step:" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Scale Step:" +msgstr "יחס מתיחה:" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move Vertical Guide" msgstr "" @@ -5178,6 +5211,20 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"Overrides game camera with editor viewport camera." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"No game instance running." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp #, fuzzy msgid "Lock Selected" msgstr "בחירת מיקוד" @@ -5325,6 +5372,11 @@ msgid "Use Rotation Snap" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Use Scale Snap" +msgstr "מצב מרחב מקומי (%s)" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap Relative" msgstr "" @@ -5469,7 +5521,7 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" -"Auto insert keys when objects are translated, rotated on scaled (based on " +"Auto insert keys when objects are translated, rotated or scaled (based on " "mask).\n" "Keys are only added to existing tracks, no new tracks will be created.\n" "Keys must be inserted manually for the first time." @@ -8474,8 +8526,9 @@ msgid "Dodge operator." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "HardLight operator" -msgstr "" +#, fuzzy +msgid "HardLight operator." +msgstr "×©×™× ×•×™ ×§× ×” מידה (יחס):" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Lighten operator." @@ -9069,9 +9122,10 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Custom Godot Shader Language expression, which placed on top of the resulted " -"shader. You can place various function definitions inside and call it later " -"in the Expressions. You can also declare varyings, uniforms and constants." +"Custom Godot Shader Language expression, which is placed on top of the " +"resulted shader. You can place various function definitions inside and call " +"it later in the Expressions. You can also declare varyings, uniforms and " +"constants." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -9182,6 +9236,12 @@ msgid "Add..." msgstr "" #: editor/project_export.cpp +msgid "" +"If checked, the preset will be available for use in one-click deploy.\n" +"Only one preset per platform may be marked as runnable." +msgstr "" + +#: editor/project_export.cpp #, fuzzy msgid "Export Path" msgstr "×™×™×¦×•× ×ž×™×–×" @@ -9634,18 +9694,6 @@ msgid "Device" msgstr "התקן" #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Shift+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Alt+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Control+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "Press a Key..." msgstr "× × ×œ×œ×—×•×¥ על מקש…" @@ -11414,7 +11462,7 @@ msgid "Can't create function of nodes from nodes of multiple functions." msgstr "" #: modules/visual_script/visual_script_editor.cpp -msgid "Select atleast one node with sequence port." +msgid "Select at least one node with sequence port." msgstr "" #: modules/visual_script/visual_script_editor.cpp @@ -11728,11 +11776,21 @@ msgstr "× ×¢×©×” שימוש ×‘×ª×ž×•× ×ª הפתיח כבררת מחדל." #: platform/uwp/export/export.cpp #, fuzzy +msgid "Invalid package short name." +msgstr "×©× ×©×’×•×™." + +#: platform/uwp/export/export.cpp +#, fuzzy msgid "Invalid package unique name." msgstr "×©× ×©×’×•×™." #: platform/uwp/export/export.cpp #, fuzzy +msgid "Invalid package publisher display name." +msgstr "×©× ×©×’×•×™." + +#: platform/uwp/export/export.cpp +#, fuzzy msgid "Invalid product GUID." msgstr "×©× ×©×’×•×™." @@ -12276,6 +12334,9 @@ msgstr "" msgid "Constants cannot be modified." msgstr "" +#~ msgid "Pause the scene" +#~ msgstr "השהיית ×”×¡×¦× ×”" + #, fuzzy #~ msgid "Add input +" #~ msgstr "הוספת ×ירוע" diff --git a/editor/translations/hi.po b/editor/translations/hi.po index cd3acd484e..5ea73e6e98 100644 --- a/editor/translations/hi.po +++ b/editor/translations/hi.po @@ -8,12 +8,13 @@ # vkubre <v@kubre.in>, 2019. # Abhay Patel <abhay111patel@gmail.com>, 2019. # Lakshmi-Jayakumar <lakshmi.jayakumar.tkm@gmail.com>, 2019. +# Devashishsingh98 <devashishsingh98@gmail.com>, 2019. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2019-10-17 04:52+0000\n" -"Last-Translator: Lakshmi-Jayakumar <lakshmi.jayakumar.tkm@gmail.com>\n" +"PO-Revision-Date: 2019-11-01 19:50+0000\n" +"Last-Translator: Devashishsingh98 <devashishsingh98@gmail.com>\n" "Language-Team: Hindi <https://hosted.weblate.org/projects/godot-engine/godot/" "hi/>\n" "Language: hi\n" @@ -21,7 +22,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 3.9\n" +"X-Generator: Weblate 3.10-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -71,9 +72,8 @@ msgid "KiB" msgstr "KiB" #: core/ustring.cpp -#, fuzzy msgid "MiB" -msgstr "MiB" +msgstr "MIB" #: core/ustring.cpp msgid "GiB" @@ -105,11 +105,11 @@ msgstr "पà¥à¤°à¤¤à¤¿à¤®à¤¾" #: editor/animation_bezier_editor.cpp editor/editor_profiler.cpp msgid "Time:" -msgstr "समय" +msgstr "समय:" #: editor/animation_bezier_editor.cpp msgid "Value:" -msgstr "" +msgstr "मूलà¥à¤¯ :" #: editor/animation_bezier_editor.cpp msgid "Insert Key Here" @@ -120,9 +120,8 @@ msgid "Duplicate Selected Key(s)" msgstr "चयनित चाबी (फ़ाइलें) डà¥à¤ªà¥à¤²à¤¿à¤•à¥‡à¤Ÿ" #: editor/animation_bezier_editor.cpp -#, fuzzy msgid "Delete Selected Key(s)" -msgstr "चयनित फ़ाइलें हटाà¤à¤‚?" +msgstr "चयनित फ़ाइलें हटाà¤à¤‚" #: editor/animation_bezier_editor.cpp msgid "Add Bezier Point" @@ -130,31 +129,27 @@ msgstr "बेज़ियर पॉइंट तैयार करे" #: editor/animation_bezier_editor.cpp msgid "Move Bezier Points" -msgstr "" +msgstr "बेज़ियर पॉइंटà¥à¤¸ को सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरित करें" #: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp msgid "Anim Duplicate Keys" msgstr "Anim डà¥à¤ªà¥à¤²à¤¿à¤•à¥‡à¤Ÿ चाबी" #: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp -#, fuzzy msgid "Anim Delete Keys" -msgstr "à¤à¤¨à¥€à¤®à¥‡à¤¶à¤¨ को हटाने के लिठकà¥à¤‚जी" +msgstr "Anim को हटाने के लिठकà¥à¤‚जी" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Anim Change Keyframe Time" -msgstr "à¤à¤¨à¥€à¤®à¥‡à¤¶à¤¨ परिवरà¥à¤¤à¤¨ निधि" +msgstr "Anim परिवरà¥à¤¤à¤¨ निधि" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Anim Change Transition" -msgstr "à¤à¤¨à¥€à¤®à¥‡à¤¶à¤¨ परिवरà¥à¤¤à¤¨ बà¥à¤²à¤¾à¤µà¤¾" +msgstr "à¤à¤¨à¥€à¤®à¥‡à¤¶à¤¨ परिवरà¥à¤¤à¤¨ संकà¥à¤°à¥à¤°à¤¾à¤‚ति" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Anim Change Transform" -msgstr "à¤à¤¨à¥€à¤®à¥‡à¤¶à¤¨ परिवरà¥à¤¤à¤¨ परिणत" +msgstr "Anim परिवरà¥à¤¤à¤¨ परिणत" #: editor/animation_track_editor.cpp msgid "Anim Change Keyframe Value" @@ -2873,7 +2868,7 @@ msgid "Play" msgstr "" #: editor/editor_node.cpp -msgid "Pause the scene" +msgid "Pause the scene execution for debugging." msgstr "" #: editor/editor_node.cpp @@ -3553,6 +3548,10 @@ msgid "New Inherited Scene" msgstr "" #: editor/filesystem_dock.cpp +msgid "Set As Main Scene" +msgstr "" + +#: editor/filesystem_dock.cpp #, fuzzy msgid "Open Scenes" msgstr "खोलो इसे" @@ -4289,6 +4288,20 @@ msgid "" msgstr "" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Anim Clips" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Audio Clips" +msgstr "टà¥à¤°à¥ˆà¤• जोड़ें" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Functions" +msgstr "कारà¥à¤¯à¥‹à¤‚:" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/animation_state_machine_editor.cpp msgid "Node Renamed" msgstr "" @@ -4967,6 +4980,14 @@ msgid "Grid Step:" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Primary Line Every:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "steps" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotation Offset:" msgstr "" @@ -4975,6 +4996,10 @@ msgid "Rotation Step:" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale Step:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move Vertical Guide" msgstr "" @@ -5060,6 +5085,20 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"Overrides game camera with editor viewport camera." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"No game instance running." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp msgid "Lock Selected" msgstr "" @@ -5199,6 +5238,10 @@ msgid "Use Rotation Snap" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Use Scale Snap" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap Relative" msgstr "" @@ -5338,7 +5381,7 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" -"Auto insert keys when objects are translated, rotated on scaled (based on " +"Auto insert keys when objects are translated, rotated or scaled (based on " "mask).\n" "Keys are only added to existing tracks, no new tracks will be created.\n" "Keys must be inserted manually for the first time." @@ -8243,7 +8286,7 @@ msgid "Dodge operator." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "HardLight operator" +msgid "HardLight operator." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8836,9 +8879,10 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Custom Godot Shader Language expression, which placed on top of the resulted " -"shader. You can place various function definitions inside and call it later " -"in the Expressions. You can also declare varyings, uniforms and constants." +"Custom Godot Shader Language expression, which is placed on top of the " +"resulted shader. You can place various function definitions inside and call " +"it later in the Expressions. You can also declare varyings, uniforms and " +"constants." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8947,6 +8991,12 @@ msgid "Add..." msgstr "" #: editor/project_export.cpp +msgid "" +"If checked, the preset will be available for use in one-click deploy.\n" +"Only one preset per platform may be marked as runnable." +msgstr "" + +#: editor/project_export.cpp msgid "Export Path" msgstr "" @@ -9389,18 +9439,6 @@ msgid "Device" msgstr "" #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Shift+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Alt+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Control+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "Press a Key..." msgstr "" @@ -11123,7 +11161,7 @@ msgid "Can't create function of nodes from nodes of multiple functions." msgstr "" #: modules/visual_script/visual_script_editor.cpp -msgid "Select atleast one node with sequence port." +msgid "Select at least one node with sequence port." msgstr "" #: modules/visual_script/visual_script_editor.cpp @@ -11434,11 +11472,21 @@ msgstr "" #: platform/uwp/export/export.cpp #, fuzzy +msgid "Invalid package short name." +msgstr "गलत फॉणà¥à¤Ÿ का आकार |" + +#: platform/uwp/export/export.cpp +#, fuzzy msgid "Invalid package unique name." msgstr "गलत फॉणà¥à¤Ÿ का आकार |" #: platform/uwp/export/export.cpp #, fuzzy +msgid "Invalid package publisher display name." +msgstr "गलत फॉणà¥à¤Ÿ का आकार |" + +#: platform/uwp/export/export.cpp +#, fuzzy msgid "Invalid product GUID." msgstr "गलत फॉणà¥à¤Ÿ का आकार |" diff --git a/editor/translations/hr.po b/editor/translations/hr.po index 6322a85090..5467aa1523 100644 --- a/editor/translations/hr.po +++ b/editor/translations/hr.po @@ -2777,7 +2777,7 @@ msgid "Play" msgstr "" #: editor/editor_node.cpp -msgid "Pause the scene" +msgid "Pause the scene execution for debugging." msgstr "" #: editor/editor_node.cpp @@ -3444,6 +3444,10 @@ msgid "New Inherited Scene" msgstr "" #: editor/filesystem_dock.cpp +msgid "Set As Main Scene" +msgstr "" + +#: editor/filesystem_dock.cpp msgid "Open Scenes" msgstr "" @@ -4154,6 +4158,21 @@ msgid "" msgstr "" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Anim Clips" +msgstr "Animacijski Klipovi:" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Audio Clips" +msgstr "Audio Klipovi:" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Functions" +msgstr "Funkcije:" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/animation_state_machine_editor.cpp msgid "Node Renamed" msgstr "" @@ -4820,6 +4839,14 @@ msgid "Grid Step:" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Primary Line Every:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "steps" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotation Offset:" msgstr "" @@ -4828,6 +4855,10 @@ msgid "Rotation Step:" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale Step:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move Vertical Guide" msgstr "" @@ -4910,6 +4941,20 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"Overrides game camera with editor viewport camera." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"No game instance running." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp msgid "Lock Selected" msgstr "" @@ -5045,6 +5090,10 @@ msgid "Use Rotation Snap" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Use Scale Snap" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap Relative" msgstr "" @@ -5184,7 +5233,7 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" -"Auto insert keys when objects are translated, rotated on scaled (based on " +"Auto insert keys when objects are translated, rotated or scaled (based on " "mask).\n" "Keys are only added to existing tracks, no new tracks will be created.\n" "Keys must be inserted manually for the first time." @@ -8028,7 +8077,7 @@ msgid "Dodge operator." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "HardLight operator" +msgid "HardLight operator." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8615,9 +8664,10 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Custom Godot Shader Language expression, which placed on top of the resulted " -"shader. You can place various function definitions inside and call it later " -"in the Expressions. You can also declare varyings, uniforms and constants." +"Custom Godot Shader Language expression, which is placed on top of the " +"resulted shader. You can place various function definitions inside and call " +"it later in the Expressions. You can also declare varyings, uniforms and " +"constants." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8726,6 +8776,12 @@ msgid "Add..." msgstr "" #: editor/project_export.cpp +msgid "" +"If checked, the preset will be available for use in one-click deploy.\n" +"Only one preset per platform may be marked as runnable." +msgstr "" + +#: editor/project_export.cpp msgid "Export Path" msgstr "" @@ -9162,18 +9218,6 @@ msgid "Device" msgstr "" #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Shift+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Alt+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Control+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "Press a Key..." msgstr "" @@ -10875,7 +10919,7 @@ msgid "Can't create function of nodes from nodes of multiple functions." msgstr "" #: modules/visual_script/visual_script_editor.cpp -msgid "Select atleast one node with sequence port." +msgid "Select at least one node with sequence port." msgstr "" #: modules/visual_script/visual_script_editor.cpp @@ -11183,10 +11227,18 @@ msgid "Using default boot splash image." msgstr "" #: platform/uwp/export/export.cpp +msgid "Invalid package short name." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package unique name." msgstr "" #: platform/uwp/export/export.cpp +msgid "Invalid package publisher display name." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid product GUID." msgstr "" diff --git a/editor/translations/hu.po b/editor/translations/hu.po index bc1ab1bdd1..0f20323033 100644 --- a/editor/translations/hu.po +++ b/editor/translations/hu.po @@ -3020,8 +3020,8 @@ msgid "Play" msgstr "Játék" #: editor/editor_node.cpp -msgid "Pause the scene" -msgstr "Szünetelteti a jelenetet" +msgid "Pause the scene execution for debugging." +msgstr "" #: editor/editor_node.cpp msgid "Pause Scene" @@ -3718,6 +3718,11 @@ msgstr "Új örökölt Jelenet..." #: editor/filesystem_dock.cpp #, fuzzy +msgid "Set As Main Scene" +msgstr "Válasszon egy FÅ‘ Jelenetet" + +#: editor/filesystem_dock.cpp +#, fuzzy msgid "Open Scenes" msgstr "Scene megnyitás" @@ -4504,6 +4509,20 @@ msgid "" msgstr "" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Anim Clips" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Audio Clips" +msgstr "Animáció nyomvonal hozzáadás" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Functions" +msgstr "Funkciók:" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/animation_state_machine_editor.cpp #, fuzzy msgid "Node Renamed" @@ -5217,6 +5236,15 @@ msgid "Grid Step:" msgstr "Rács Léptetés:" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Primary Line Every:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "steps" +msgstr "2 lépés" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotation Offset:" msgstr "Forgatási Eltolás:" @@ -5226,6 +5254,11 @@ msgstr "Forgatási Léptetés:" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy +msgid "Scale Step:" +msgstr "Skála:" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy msgid "Move Vertical Guide" msgstr "FüggÅ‘leges vezetÅ‘vonal mozgatása" @@ -5319,6 +5352,20 @@ msgstr "Horgonyok MódosÃtása" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"Overrides game camera with editor viewport camera." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"No game instance running." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp #, fuzzy msgid "Lock Selected" msgstr "Kiválaszt" @@ -5471,6 +5518,11 @@ msgid "Use Rotation Snap" msgstr "Forgatási Illesztés Használata" #: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Use Scale Snap" +msgstr "Illesztés Használata" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap Relative" msgstr "RelatÃv Illesztés" @@ -5621,7 +5673,7 @@ msgstr "Kulcs Beszúrása (MeglévÅ‘ Nyomvonalakra)" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" -"Auto insert keys when objects are translated, rotated on scaled (based on " +"Auto insert keys when objects are translated, rotated or scaled (based on " "mask).\n" "Keys are only added to existing tracks, no new tracks will be created.\n" "Keys must be inserted manually for the first time." @@ -8657,8 +8709,9 @@ msgid "Dodge operator." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "HardLight operator" -msgstr "" +#, fuzzy +msgid "HardLight operator." +msgstr "Skaláris kezelÅ‘ változtatás" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Lighten operator." @@ -9259,9 +9312,10 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Custom Godot Shader Language expression, which placed on top of the resulted " -"shader. You can place various function definitions inside and call it later " -"in the Expressions. You can also declare varyings, uniforms and constants." +"Custom Godot Shader Language expression, which is placed on top of the " +"resulted shader. You can place various function definitions inside and call " +"it later in the Expressions. You can also declare varyings, uniforms and " +"constants." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -9374,6 +9428,12 @@ msgid "Add..." msgstr "" #: editor/project_export.cpp +msgid "" +"If checked, the preset will be available for use in one-click deploy.\n" +"Only one preset per platform may be marked as runnable." +msgstr "" + +#: editor/project_export.cpp #, fuzzy msgid "Export Path" msgstr "Projekt Exportálása" @@ -9825,18 +9885,6 @@ msgid "Device" msgstr "Eszköz" #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Shift+" -msgstr "Shift+" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Alt+" -msgstr "Alt+" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Control+" -msgstr "Control+" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "Press a Key..." msgstr "" @@ -11612,7 +11660,7 @@ msgid "Can't create function of nodes from nodes of multiple functions." msgstr "" #: modules/visual_script/visual_script_editor.cpp -msgid "Select atleast one node with sequence port." +msgid "Select at least one node with sequence port." msgstr "" #: modules/visual_script/visual_script_editor.cpp @@ -11927,11 +11975,21 @@ msgstr "" #: platform/uwp/export/export.cpp #, fuzzy +msgid "Invalid package short name." +msgstr "Érvénytelen név." + +#: platform/uwp/export/export.cpp +#, fuzzy msgid "Invalid package unique name." msgstr "Érvénytelen név." #: platform/uwp/export/export.cpp #, fuzzy +msgid "Invalid package publisher display name." +msgstr "Érvénytelen név." + +#: platform/uwp/export/export.cpp +#, fuzzy msgid "Invalid product GUID." msgstr "Érvénytelen projektnév." @@ -12477,6 +12535,18 @@ msgstr "" msgid "Constants cannot be modified." msgstr "" +#~ msgid "Pause the scene" +#~ msgstr "Szünetelteti a jelenetet" + +#~ msgid "Shift+" +#~ msgstr "Shift+" + +#~ msgid "Alt+" +#~ msgstr "Alt+" + +#~ msgid "Control+" +#~ msgstr "Control+" + #, fuzzy #~ msgid "Snap to Grid" #~ msgstr "Rácshoz illesztés" diff --git a/editor/translations/id.po b/editor/translations/id.po index dc8e5c10d5..cf2c3bb271 100644 --- a/editor/translations/id.po +++ b/editor/translations/id.po @@ -2900,8 +2900,8 @@ msgid "Play" msgstr "Mainkan" #: editor/editor_node.cpp -msgid "Pause the scene" -msgstr "Hentikan sementara skena ini" +msgid "Pause the scene execution for debugging." +msgstr "" #: editor/editor_node.cpp msgid "Pause Scene" @@ -3593,6 +3593,11 @@ msgid "New Inherited Scene" msgstr "Skena Warisan Baru" #: editor/filesystem_dock.cpp +#, fuzzy +msgid "Set As Main Scene" +msgstr "Skena Utama" + +#: editor/filesystem_dock.cpp msgid "Open Scenes" msgstr "Buka Skena" @@ -4319,6 +4324,21 @@ msgstr "" "nama track." #: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Anim Clips" +msgstr "Klip-klip Animasi:" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Audio Clips" +msgstr "Klip-klip Suara:" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Functions" +msgstr "Fungsi-fungsi:" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/animation_state_machine_editor.cpp msgid "Node Renamed" msgstr "Node Telah Diubah Namanya" @@ -4994,6 +5014,15 @@ msgid "Grid Step:" msgstr "Jangkah Kotak-kotak:" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Primary Line Every:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "steps" +msgstr "2 langkah" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotation Offset:" msgstr "Offset Perputaran:" @@ -5002,6 +5031,11 @@ msgid "Rotation Step:" msgstr "Jangkah Perputaran:" #: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Scale Step:" +msgstr "Skala:" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move Vertical Guide" msgstr "Pindahkan Panduan Vertikal" @@ -5087,6 +5121,20 @@ msgstr "Ubah Jangkar-jangkar" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"Overrides game camera with editor viewport camera." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"No game instance running." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp msgid "Lock Selected" msgstr "Kunci yang Dipilih" @@ -5230,6 +5278,11 @@ msgid "Use Rotation Snap" msgstr "Gunakan Snap Rotasi" #: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Use Scale Snap" +msgstr "Gunakan Snap" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap Relative" msgstr "Snap Relatif" @@ -5369,8 +5422,9 @@ msgid "Insert keys (based on mask)." msgstr "Sisipkan Kunci (berdasarkan mask)." #: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy msgid "" -"Auto insert keys when objects are translated, rotated on scaled (based on " +"Auto insert keys when objects are translated, rotated or scaled (based on " "mask).\n" "Keys are only added to existing tracks, no new tracks will be created.\n" "Keys must be inserted manually for the first time." @@ -8251,7 +8305,8 @@ msgid "Dodge operator." msgstr "Operator dodge." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "HardLight operator" +#, fuzzy +msgid "HardLight operator." msgstr "Operator HardLight" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8897,10 +8952,12 @@ msgstr "" "permukaan dan arah pandangan kamera (berikan masukan yang terkait dengannya)." #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy msgid "" -"Custom Godot Shader Language expression, which placed on top of the resulted " -"shader. You can place various function definitions inside and call it later " -"in the Expressions. You can also declare varyings, uniforms and constants." +"Custom Godot Shader Language expression, which is placed on top of the " +"resulted shader. You can place various function definitions inside and call " +"it later in the Expressions. You can also declare varyings, uniforms and " +"constants." msgstr "" "Ekspresi Bahasa Kustom Godot Shader, yang ditempatkan di atas shader yang " "dihasilkan. Anda dapat menempatkan berbagai definisi fungsi di dalamnya dan " @@ -9030,6 +9087,12 @@ msgid "Add..." msgstr "Tambahkan..." #: editor/project_export.cpp +msgid "" +"If checked, the preset will be available for use in one-click deploy.\n" +"Only one preset per platform may be marked as runnable." +msgstr "" + +#: editor/project_export.cpp msgid "Export Path" msgstr "Lokasi Ekspor" @@ -9521,18 +9584,6 @@ msgid "Device" msgstr "Perangkat" #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Shift+" -msgstr "Shift+" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Alt+" -msgstr "Alt+" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Control+" -msgstr "Kontrol+" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "Press a Key..." msgstr "Tekan Tombol..." @@ -11280,7 +11331,7 @@ msgid "Can't create function of nodes from nodes of multiple functions." msgstr "" #: modules/visual_script/visual_script_editor.cpp -msgid "Select atleast one node with sequence port." +msgid "Select at least one node with sequence port." msgstr "" #: modules/visual_script/visual_script_editor.cpp @@ -11608,11 +11659,21 @@ msgstr "Tidak dapat membuat folder." #: platform/uwp/export/export.cpp #, fuzzy +msgid "Invalid package short name." +msgstr "Nama tidak sah." + +#: platform/uwp/export/export.cpp +#, fuzzy msgid "Invalid package unique name." msgstr "Nama tidak sah." #: platform/uwp/export/export.cpp #, fuzzy +msgid "Invalid package publisher display name." +msgstr "Nama tidak sah." + +#: platform/uwp/export/export.cpp +#, fuzzy msgid "Invalid product GUID." msgstr "Ukuran font tidak sah." @@ -12245,6 +12306,18 @@ msgstr "Variasi hanya bisa ditetapkan dalam fungsi vertex." msgid "Constants cannot be modified." msgstr "Konstanta tidak dapat dimodifikasi." +#~ msgid "Pause the scene" +#~ msgstr "Hentikan sementara skena ini" + +#~ msgid "Shift+" +#~ msgstr "Shift+" + +#~ msgid "Alt+" +#~ msgstr "Alt+" + +#~ msgid "Control+" +#~ msgstr "Kontrol+" + #~ msgid "Snap to Grid" #~ msgstr "Kancing ke Kisi" diff --git a/editor/translations/is.po b/editor/translations/is.po index 77ca21f932..6f06c5a142 100644 --- a/editor/translations/is.po +++ b/editor/translations/is.po @@ -2804,7 +2804,7 @@ msgid "Play" msgstr "" #: editor/editor_node.cpp -msgid "Pause the scene" +msgid "Pause the scene execution for debugging." msgstr "" #: editor/editor_node.cpp @@ -3471,6 +3471,10 @@ msgid "New Inherited Scene" msgstr "" #: editor/filesystem_dock.cpp +msgid "Set As Main Scene" +msgstr "" + +#: editor/filesystem_dock.cpp msgid "Open Scenes" msgstr "" @@ -4188,6 +4192,20 @@ msgid "" msgstr "" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Anim Clips" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Audio Clips" +msgstr "Anim bæta við lag" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Functions" +msgstr "Val á kvarða" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/animation_state_machine_editor.cpp msgid "Node Renamed" msgstr "" @@ -4860,6 +4878,14 @@ msgid "Grid Step:" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Primary Line Every:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "steps" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotation Offset:" msgstr "" @@ -4868,6 +4894,11 @@ msgid "Rotation Step:" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Scale Step:" +msgstr "Val á kvarða" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move Vertical Guide" msgstr "" @@ -4951,6 +4982,20 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"Overrides game camera with editor viewport camera." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"No game instance running." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp msgid "Lock Selected" msgstr "" @@ -5089,6 +5134,10 @@ msgid "Use Rotation Snap" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Use Scale Snap" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap Relative" msgstr "" @@ -5228,7 +5277,7 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" -"Auto insert keys when objects are translated, rotated on scaled (based on " +"Auto insert keys when objects are translated, rotated or scaled (based on " "mask).\n" "Keys are only added to existing tracks, no new tracks will be created.\n" "Keys must be inserted manually for the first time." @@ -8094,7 +8143,7 @@ msgid "Dodge operator." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "HardLight operator" +msgid "HardLight operator." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8684,9 +8733,10 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Custom Godot Shader Language expression, which placed on top of the resulted " -"shader. You can place various function definitions inside and call it later " -"in the Expressions. You can also declare varyings, uniforms and constants." +"Custom Godot Shader Language expression, which is placed on top of the " +"resulted shader. You can place various function definitions inside and call " +"it later in the Expressions. You can also declare varyings, uniforms and " +"constants." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8795,6 +8845,12 @@ msgid "Add..." msgstr "" #: editor/project_export.cpp +msgid "" +"If checked, the preset will be available for use in one-click deploy.\n" +"Only one preset per platform may be marked as runnable." +msgstr "" + +#: editor/project_export.cpp msgid "Export Path" msgstr "" @@ -9236,18 +9292,6 @@ msgid "Device" msgstr "" #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Shift+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Alt+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Control+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "Press a Key..." msgstr "" @@ -10952,7 +10996,7 @@ msgid "Can't create function of nodes from nodes of multiple functions." msgstr "" #: modules/visual_script/visual_script_editor.cpp -msgid "Select atleast one node with sequence port." +msgid "Select at least one node with sequence port." msgstr "" #: modules/visual_script/visual_script_editor.cpp @@ -11259,10 +11303,18 @@ msgid "Using default boot splash image." msgstr "" #: platform/uwp/export/export.cpp +msgid "Invalid package short name." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package unique name." msgstr "" #: platform/uwp/export/export.cpp +msgid "Invalid package publisher display name." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid product GUID." msgstr "" diff --git a/editor/translations/it.po b/editor/translations/it.po index 1341981a73..642723f8bb 100644 --- a/editor/translations/it.po +++ b/editor/translations/it.po @@ -39,12 +39,13 @@ # Micila Micillotto <micillotto@gmail.com>, 2019. # Mirko Soppelsa <miknsop@gmail.com>, 2019. # No <kingofwizards.kw7@gmail.com>, 2019. +# StarFang208 <polaritymanx@yahoo.it>, 2019. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2019-10-04 03:15+0000\n" -"Last-Translator: Micila Micillotto <micillotto@gmail.com>\n" +"PO-Revision-Date: 2019-11-20 14:07+0000\n" +"Last-Translator: StarFang208 <polaritymanx@yahoo.it>\n" "Language-Team: Italian <https://hosted.weblate.org/projects/godot-engine/" "godot/it/>\n" "Language: it\n" @@ -52,7 +53,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 3.9-dev\n" +"X-Generator: Weblate 3.10-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -664,9 +665,8 @@ msgid "Scale Ratio:" msgstr "Fattore di scalatura:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Select Tracks to Copy" -msgstr "Seleziona le tracce da copiare:" +msgstr "Seleziona le tracce da copiare" #: editor/animation_track_editor.cpp editor/editor_log.cpp #: editor/editor_properties.cpp @@ -678,9 +678,8 @@ msgid "Copy" msgstr "Copia" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Select All/None" -msgstr "Seleziona Nulla" +msgstr "Seleziona Tutto/Nulla" #: editor/animation_track_editor_plugins.cpp msgid "Add Audio Track Clip" @@ -2935,8 +2934,8 @@ msgid "Play" msgstr "Esegui" #: editor/editor_node.cpp -msgid "Pause the scene" -msgstr "Metti in pausa la scena" +msgid "Pause the scene execution for debugging." +msgstr "" #: editor/editor_node.cpp msgid "Pause Scene" @@ -3633,6 +3632,11 @@ msgid "New Inherited Scene" msgstr "Nuova scena ereditata" #: editor/filesystem_dock.cpp +#, fuzzy +msgid "Set As Main Scene" +msgstr "Scena Principale" + +#: editor/filesystem_dock.cpp msgid "Open Scenes" msgstr "Apri scene" @@ -4365,6 +4369,21 @@ msgstr "" "impossibile recuperare i nomi delle tracce." #: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Anim Clips" +msgstr "Clip Anim:" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Audio Clips" +msgstr "Clip Audio:" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Functions" +msgstr "Funzioni:" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/animation_state_machine_editor.cpp msgid "Node Renamed" msgstr "Nodo Rinominato" @@ -5045,6 +5064,15 @@ msgid "Grid Step:" msgstr "Step Griglia:" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Primary Line Every:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "steps" +msgstr "2 passaggi" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotation Offset:" msgstr "Offset Rotazione:" @@ -5053,6 +5081,11 @@ msgid "Rotation Step:" msgstr "Step Rotazione:" #: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Scale Step:" +msgstr "Scala:" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move Vertical Guide" msgstr "Muovi Guida Verticale" @@ -5138,6 +5171,20 @@ msgstr "Cambia Ancore" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"Overrides game camera with editor viewport camera." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"No game instance running." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp msgid "Lock Selected" msgstr "Blocca selezionato" @@ -5282,6 +5329,11 @@ msgid "Use Rotation Snap" msgstr "Usa lo Snap di Rotazione" #: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Use Scale Snap" +msgstr "Usa lo Snap" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap Relative" msgstr "Snap Relativo" @@ -5421,8 +5473,9 @@ msgid "Insert keys (based on mask)." msgstr "Inserisci chiavi (in base alla maschera)." #: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy msgid "" -"Auto insert keys when objects are translated, rotated on scaled (based on " +"Auto insert keys when objects are translated, rotated or scaled (based on " "mask).\n" "Keys are only added to existing tracks, no new tracks will be created.\n" "Keys must be inserted manually for the first time." @@ -8313,7 +8366,8 @@ msgid "Dodge operator." msgstr "Operatore schivata." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "HardLight operator" +#, fuzzy +msgid "HardLight operator." msgstr "Operatore HardLight" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8953,10 +9007,12 @@ msgstr "" "superfice e direzione della telecamera (passa gli input associati ad essa)." #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy msgid "" -"Custom Godot Shader Language expression, which placed on top of the resulted " -"shader. You can place various function definitions inside and call it later " -"in the Expressions. You can also declare varyings, uniforms and constants." +"Custom Godot Shader Language expression, which is placed on top of the " +"resulted shader. You can place various function definitions inside and call " +"it later in the Expressions. You can also declare varyings, uniforms and " +"constants." msgstr "" "L'espresione Custom Godot Shader Language è piazzata al di sopra dello " "shader risultante. Puoi posizionare varie definizioni di fuzioni e chiamarle " @@ -9087,6 +9143,12 @@ msgid "Add..." msgstr "Aggiungi..." #: editor/project_export.cpp +msgid "" +"If checked, the preset will be available for use in one-click deploy.\n" +"Only one preset per platform may be marked as runnable." +msgstr "" + +#: editor/project_export.cpp msgid "Export Path" msgstr "Percorso di Esportazione" @@ -9582,18 +9644,6 @@ msgid "Device" msgstr "Dispositivo" #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Shift+" -msgstr "Shift+" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Alt+" -msgstr "Alt+" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Control+" -msgstr "Control+" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "Press a Key..." msgstr "Premi un tasto..." @@ -11334,7 +11384,7 @@ msgid "Can't create function of nodes from nodes of multiple functions." msgstr "" #: modules/visual_script/visual_script_editor.cpp -msgid "Select atleast one node with sequence port." +msgid "Select at least one node with sequence port." msgstr "" #: modules/visual_script/visual_script_editor.cpp @@ -11675,10 +11725,20 @@ msgid "Using default boot splash image." msgstr "Utilizzando l'immagine di splash di avvio predefinita." #: platform/uwp/export/export.cpp +#, fuzzy +msgid "Invalid package short name." +msgstr "Nome del pacchetto non valido:" + +#: platform/uwp/export/export.cpp msgid "Invalid package unique name." msgstr "Nome univoco del pacchetto non valido." #: platform/uwp/export/export.cpp +#, fuzzy +msgid "Invalid package publisher display name." +msgstr "Nome univoco del pacchetto non valido." + +#: platform/uwp/export/export.cpp msgid "Invalid product GUID." msgstr "GUID prodotto invalido." @@ -12349,6 +12409,18 @@ msgstr "Varyings può essere assegnato soltanto nella funzione del vertice." msgid "Constants cannot be modified." msgstr "Le constanti non possono essere modificate." +#~ msgid "Pause the scene" +#~ msgstr "Metti in pausa la scena" + +#~ msgid "Shift+" +#~ msgstr "Shift+" + +#~ msgid "Alt+" +#~ msgstr "Alt+" + +#~ msgid "Control+" +#~ msgstr "Control+" + #~ msgid "Snap to Grid" #~ msgstr "Snap alla griglia" diff --git a/editor/translations/ja.po b/editor/translations/ja.po index 319458d634..de6d6822ca 100644 --- a/editor/translations/ja.po +++ b/editor/translations/ja.po @@ -32,7 +32,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2019-10-29 12:49+0000\n" +"PO-Revision-Date: 2019-11-09 22:04+0000\n" "Last-Translator: kazuma kondo <kazmax7@gmail.com>\n" "Language-Team: Japanese <https://hosted.weblate.org/projects/godot-engine/" "godot/ja/>\n" @@ -41,7 +41,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 3.9.1\n" +"X-Generator: Weblate 3.10-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -464,9 +464,8 @@ msgid "Track path is invalid, so can't add a method key." msgstr "トラックã®ãƒ‘スãŒç„¡åŠ¹ãªãŸã‚ã€ãƒ¡ã‚½ãƒƒãƒ‰ã‚ãƒ¼ã‚’è¿½åŠ ã§ãã¾ã›ã‚“。" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Add Method Track Key" -msgstr "メソッド呼出ã—トラック" +msgstr "メソッドトラックã‚ーã®è¿½åŠ " #: editor/animation_track_editor.cpp msgid "Method not found in object: " @@ -656,9 +655,8 @@ msgid "Scale Ratio:" msgstr "スケール比:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Select Tracks to Copy" -msgstr "コピーã™ã‚‹ãƒˆãƒ©ãƒƒã‚¯ã‚’é¸æŠž:" +msgstr "コピーã™ã‚‹ãƒˆãƒ©ãƒƒã‚¯ã‚’é¸æŠž" #: editor/animation_track_editor.cpp editor/editor_log.cpp #: editor/editor_properties.cpp @@ -670,9 +668,8 @@ msgid "Copy" msgstr "コピー" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Select All/None" -msgstr "é¸æŠžè§£é™¤" +msgstr "å…¨ã¦ã‚’é¸æŠž/解除" #: editor/animation_track_editor_plugins.cpp msgid "Add Audio Track Clip" @@ -1266,9 +1263,8 @@ msgid "Delete Bus Effect" msgstr "ãƒã‚¹ã‚¨ãƒ•ã‚§ã‚¯ãƒˆã‚’削除" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Drag & drop to rearrange." -msgstr "オーディオãƒã‚¹ã¯ãƒ‰ãƒ©ãƒƒã‚°ãƒ»ã‚¢ãƒ³ãƒ‰ãƒ»ãƒ‰ãƒãƒƒãƒ—ã§ä¸¦ã¹æ›¿ãˆã‚‰ã‚Œã¾ã™ã€‚" +msgstr "ドラッグ・アンド・ドãƒãƒƒãƒ—ã§ä¸¦ã³æ›¿ãˆã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚" #: editor/editor_audio_buses.cpp msgid "Solo" @@ -1920,9 +1916,8 @@ msgid "Inherited by:" msgstr "継承先:" #: editor/editor_help.cpp -#, fuzzy msgid "Brief Description" -msgstr "è¦ç´„:" +msgstr "è¦ç´„" #: editor/editor_help.cpp msgid "Properties" @@ -2720,9 +2715,8 @@ msgid "Tools" msgstr "ツール" #: editor/editor_node.cpp -#, fuzzy msgid "Orphan Resource Explorer..." -msgstr "å¤ç«‹ãƒªã‚½ãƒ¼ã‚¹ エクスプãƒãƒ¼ãƒ©ãƒ¼" +msgstr "å¤ç«‹ãƒªã‚½ãƒ¼ã‚¹ã‚¨ã‚¯ã‚¹ãƒ—ãƒãƒ¼ãƒ©ãƒ¼..." #: editor/editor_node.cpp msgid "Quit to Project List" @@ -2910,8 +2904,8 @@ msgid "Play" msgstr "実行" #: editor/editor_node.cpp -msgid "Pause the scene" -msgstr "シーンを一時åœæ¢" +msgid "Pause the scene execution for debugging." +msgstr "" #: editor/editor_node.cpp msgid "Pause Scene" @@ -3082,9 +3076,8 @@ msgid "Open the previous Editor" msgstr "å‰ã®ã‚¨ãƒ‡ã‚£ã‚¿ã‚’é–‹ã" #: editor/editor_path.cpp -#, fuzzy msgid "No sub-resources found." -msgstr "サーフェスã®ã‚½ãƒ¼ã‚¹ãŒæŒ‡å®šã•ã‚Œã¦ã„ã¾ã›ã‚“。" +msgstr "サブリソースãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚" #: editor/editor_plugin.cpp msgid "Creating Mesh Previews" @@ -3444,7 +3437,6 @@ msgid "Cannot remove temporary file:" msgstr "一時ファイルを削除ã§ãã¾ã›ã‚“:" #: editor/export_template_manager.cpp -#, fuzzy msgid "" "Templates installation failed.\n" "The problematic templates archives can be found at '%s'." @@ -3605,6 +3597,11 @@ msgid "New Inherited Scene" msgstr "æ–°ã—ã„継承ã—ãŸã‚·ãƒ¼ãƒ³" #: editor/filesystem_dock.cpp +#, fuzzy +msgid "Set As Main Scene" +msgstr "メインシーン" + +#: editor/filesystem_dock.cpp msgid "Open Scenes" msgstr "シーンを開ã" @@ -3682,7 +3679,6 @@ msgid "Re-Scan Filesystem" msgstr "ファイルシステムをå†ã‚¹ã‚ャン" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Toggle Split Mode" msgstr "分割モード切り替ãˆ" @@ -3921,9 +3917,8 @@ msgid "Import As:" msgstr "åå‰ã‚’付ã‘ã¦ã‚¤ãƒ³ãƒãƒ¼ãƒˆ:" #: editor/import_dock.cpp -#, fuzzy msgid "Preset" -msgstr "åˆæœŸè¨å®šå€¤" +msgstr "プリセット" #: editor/import_dock.cpp msgid "Reimport" @@ -4233,9 +4228,8 @@ msgid "No triangles exist, so no blending can take place." msgstr "三角形ãŒå˜åœ¨ã—ãªã„ãŸã‚ã€ãƒ–レンドã§ãã¾ã›ã‚“。" #: editor/plugins/animation_blend_space_2d_editor.cpp -#, fuzzy msgid "Toggle Auto Triangles" -msgstr "ã‚°ãƒãƒ¼ãƒãƒ«ã®è‡ªå‹•èªè¾¼ã¿ã‚’切り替ãˆ" +msgstr "三角形ã®è‡ªå‹•ä½œæˆã«åˆ‡ã‚Šæ›¿ãˆ" #: editor/plugins/animation_blend_space_2d_editor.cpp msgid "Create triangles by connecting points." @@ -4331,6 +4325,21 @@ msgstr "" "å¾—ã§ãã¾ã›ã‚“。" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Anim Clips" +msgstr "アニメーションクリップ:" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Audio Clips" +msgstr "オーディオクリップ:" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Functions" +msgstr "関数:" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/animation_state_machine_editor.cpp msgid "Node Renamed" msgstr "ノードã®åå‰ãŒå¤‰æ›´ã•ã‚Œã¾ã—ãŸ" @@ -4819,9 +4828,8 @@ msgid "Request failed." msgstr "リクエストã¯å¤±æ•—ã—ã¾ã—ãŸã€‚" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Cannot save response to:" -msgstr "ファイルã«ãƒ†ãƒ¼ãƒžã‚’ä¿å˜ã§ãã¾ã›ã‚“:" +msgstr "レスãƒãƒ³ã‚¹ã‚’ä¿å˜ã§ãã¾ã›ã‚“:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Write error." @@ -4832,7 +4840,6 @@ msgid "Request failed, too many redirects" msgstr "リクエスト失敗。リダイレクトéŽå¤š" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Redirect loop." msgstr "リダイレクトã®ãƒ«ãƒ¼ãƒ—。" @@ -4923,7 +4930,7 @@ msgstr "ã™ã¹ã¦" #: editor/plugins/asset_library_editor_plugin.cpp msgid "No results for \"%s\"." -msgstr "" +msgstr "\"%s\" ã®çµæžœã¯ã‚ã‚Šã¾ã›ã‚“。" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Import..." @@ -5012,6 +5019,15 @@ msgid "Grid Step:" msgstr "グリッドã®ã‚¹ãƒ†ãƒƒãƒ—:" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Primary Line Every:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "steps" +msgstr "2ステップ" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotation Offset:" msgstr "回転ã®ã‚ªãƒ•ã‚»ãƒƒãƒˆ:" @@ -5020,6 +5036,11 @@ msgid "Rotation Step:" msgstr "回転ã®ã‚¹ãƒ†ãƒƒãƒ—:" #: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Scale Step:" +msgstr "スケール:" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move Vertical Guide" msgstr "垂直ガイドを移動" @@ -5104,6 +5125,20 @@ msgstr "アンカーを変更" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"Overrides game camera with editor viewport camera." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"No game instance running." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp msgid "Lock Selected" msgstr "é¸æŠžã‚’ãƒãƒƒã‚¯" @@ -5127,9 +5162,8 @@ msgid "Paste Pose" msgstr "ãƒãƒ¼ã‚ºã‚’貼り付ã‘" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Clear Guides" -msgstr "ボーンをクリアã™ã‚‹" +msgstr "ガイドをクリアã™ã‚‹" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Create Custom Bone(s) from Node(s)" @@ -5220,24 +5254,20 @@ msgid "Ruler Mode" msgstr "実行モード:" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Toggle smart snapping." -msgstr "スナッピングを切り替ãˆã‚‹ã€‚" +msgstr "スマートスナッピングを切り替ãˆã‚‹ã€‚" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Use Smart Snap" -msgstr "スナップを使ã†" +msgstr "スマートスナップを使ã†" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Toggle grid snapping." -msgstr "スナッピングを切り替ãˆã‚‹ã€‚" +msgstr "グリッドスナッピングを切り替ãˆã‚‹ã€‚" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Use Grid Snap" -msgstr "グリッドスナップ" +msgstr "グリッドスナップを使ã†" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snapping Options" @@ -5248,6 +5278,11 @@ msgid "Use Rotation Snap" msgstr "回転スナップを使ã†" #: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Use Scale Snap" +msgstr "スマートスナップを使ã†" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap Relative" msgstr "相対スナップ" @@ -5330,9 +5365,8 @@ msgid "View" msgstr "ビュー" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Always Show Grid" -msgstr "グリッドを表示" +msgstr "常ã«ã‚°ãƒªãƒƒãƒ‰ã‚’表示" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Show Helpers" @@ -5387,8 +5421,9 @@ msgid "Insert keys (based on mask)." msgstr "(マスクã«åŸºã¥ã„ã¦)ã‚ーを挿入。" #: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy msgid "" -"Auto insert keys when objects are translated, rotated on scaled (based on " +"Auto insert keys when objects are translated, rotated or scaled (based on " "mask).\n" "Keys are only added to existing tracks, no new tracks will be created.\n" "Keys must be inserted manually for the first time." @@ -5423,9 +5458,8 @@ msgid "Divide grid step by 2" msgstr "グリッドステップをåŠåˆ†ã«ã™ã‚‹" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Pan View" -msgstr "後é¢å›³" +msgstr "ビューをパン" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Add %s" @@ -5559,9 +5593,8 @@ msgid "Modify Curve Point" msgstr "カーブãƒã‚¤ãƒ³ãƒˆã‚’ä¿®æ£" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Modify Curve Tangent" -msgstr "カーブマップを修æ£" +msgstr "カーブ接線を修æ£" #: editor/plugins/curve_editor_plugin.cpp msgid "Load Curve Preset" @@ -5576,14 +5609,12 @@ msgid "Remove Point" msgstr "ãƒã‚¤ãƒ³ãƒˆã‚’削除" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Left Linear" -msgstr "ç‰é€Ÿ" +msgstr "左線形文法" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Right Linear" -msgstr "å³å´é¢å›³" +msgstr "å³ç·šå½¢æ–‡æ³•" #: editor/plugins/curve_editor_plugin.cpp msgid "Load Preset" @@ -5602,9 +5633,8 @@ msgid "Hold Shift to edit tangents individually" msgstr "接線を個別ã«ç·¨é›†ã™ã‚‹ã«ã¯ã‚·ãƒ•ãƒˆã‚’押ã™" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Right click to add point" -msgstr "å³ã‚¯ãƒªãƒƒã‚¯: 点を削除" +msgstr "å³ã‚¯ãƒªãƒƒã‚¯ã§ç‚¹ã‚’è¿½åŠ " #: editor/plugins/gi_probe_editor_plugin.cpp msgid "Bake GI Probe" @@ -5712,9 +5742,8 @@ msgid "Create Trimesh Collision Sibling" msgstr "三角形メッシュ兄弟コリジョンを生æˆ" #: editor/plugins/mesh_instance_editor_plugin.cpp -#, fuzzy msgid "Create Convex Collision Sibling(s)" -msgstr "凸型兄弟コリジョンを生æˆ" +msgstr "凸型兄弟関係コリジョンを生æˆ" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Outline Mesh..." @@ -5889,9 +5918,8 @@ msgid "The geometry's faces don't contain any area." msgstr "ジオメトリã®é¢ã¯é¢ç©ã‚’æŒã¡ã¾ã›ã‚“。" #: editor/plugins/particles_editor_plugin.cpp -#, fuzzy msgid "The geometry doesn't contain any faces." -msgstr "ノードã¯ã‚¸ã‚ªãƒ¡ãƒˆãƒªãƒ¼ (é¢) ã‚’å«ã‚“ã§ã„ã¾ã›ã‚“。" +msgstr "ジオメトリーã¯é¢ã‚’å«ã‚“ã§ã„ã¾ã›ã‚“。" #: editor/plugins/particles_editor_plugin.cpp msgid "\"%s\" doesn't inherit from Spatial." @@ -6592,9 +6620,8 @@ msgid "Search Results" msgstr "検索çµæžœ" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Clear Recent Scripts" -msgstr "最近開ã„ãŸã‚·ãƒ¼ãƒ³ã®å±¥æ´ã‚’クリア" +msgstr "最近開ã„ãŸã‚¹ã‚¯ãƒªãƒ—トã®å±¥æ´ã‚’クリア" #: editor/plugins/script_text_editor.cpp msgid "Connections to method:" @@ -6724,9 +6751,8 @@ msgid "Complete Symbol" msgstr "シンボルを補完" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Evaluate Selection" -msgstr "スケールã®é¸æŠž" +msgstr "é¸æŠžã—ãŸã‚‚ã®ã‚’評価ã™ã‚‹" #: editor/plugins/script_text_editor.cpp msgid "Trim Trailing Whitespace" @@ -7030,9 +7056,8 @@ msgid "Audio Listener" msgstr "オーディオリスナー" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Enable Doppler" -msgstr "フィルタリングを有効化" +msgstr "ドップラー効果を有効化ã™ã‚‹" #: editor/plugins/spatial_editor_plugin.cpp msgid "Cinematic Preview" @@ -8294,7 +8319,8 @@ msgid "Dodge operator." msgstr "Dodge演算å。" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "HardLight operator" +#, fuzzy +msgid "HardLight operator." msgstr "HardLight演算å" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8945,9 +8971,10 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy msgid "" -"Custom Godot Shader Language expression, which placed on top of the resulted " -"shader. You can place various function definitions inside and call it later " -"in the Expressions. You can also declare varyings, uniforms and constants." +"Custom Godot Shader Language expression, which is placed on top of the " +"resulted shader. You can place various function definitions inside and call " +"it later in the Expressions. You can also declare varyings, uniforms and " +"constants." msgstr "" "カスタムGodotシェーダー言語ã®è¡¨ç¾ã¯ã€ã‚·ã‚§ãƒ¼ãƒ‡ã‚£ãƒ³ã‚°çµæžœã®æœ€å¾Œã«ä½ç½®ã—ã¾ã™ã€‚" "様々ãªé–¢æ•°ã‚’ãã®ä¸ã§å®šç¾©ã—ã€è¡¨ç¾ã®ä¸ã§å‘¼ã³å‡ºã™ã“ã¨ãŒã§ãã¾ã™ã€‚ã¾ãŸvarying変" @@ -9077,6 +9104,12 @@ msgid "Add..." msgstr "è¿½åŠ ..." #: editor/project_export.cpp +msgid "" +"If checked, the preset will be available for use in one-click deploy.\n" +"Only one preset per platform may be marked as runnable." +msgstr "" + +#: editor/project_export.cpp msgid "Export Path" msgstr "エクスãƒãƒ¼ãƒˆå…ˆã®ãƒ‘ス" @@ -9568,18 +9601,6 @@ msgid "Device" msgstr "デãƒã‚¤ã‚¹" #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Shift+" -msgstr "Shift+" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Alt+" -msgstr "Alt+" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Control+" -msgstr "Control+" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "Press a Key..." msgstr "ã‚ーを押ã—ã¦ãã ã•ã„..." @@ -9857,9 +9878,8 @@ msgid "Preset..." msgstr "プリセット..." #: editor/property_editor.cpp -#, fuzzy msgid "Zero" -msgstr "(イージング)無ã—" +msgstr "ç„¡ã—" #: editor/property_editor.cpp msgid "Easing In-Out" @@ -10813,7 +10833,7 @@ msgstr "GDNative ライブラリ" #: modules/gdnative/gdnative_library_singleton_editor.cpp msgid "Enabled GDNative Singleton" -msgstr "有効ãªGDNative Singleton" +msgstr "有効ãªGDNativeシングルトン" #: modules/gdnative/gdnative_library_singleton_editor.cpp msgid "Disabled GDNative Singleton" @@ -11231,10 +11251,10 @@ msgstr "" "メタã‚ーをä¿æŒã—ã¦getterã‚’è½ã¨ã™.Shiftã‚ーをä¿æŒã—ã¦ã‚¸ã‚§ãƒãƒªãƒƒã‚¯ã‚’指示ã™ã‚‹." #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Hold Ctrl to drop a Getter. Hold Shift to drop a generic signature." msgstr "" -"Ctrlã‚ーをä¿æŒã—ã¦getterã‚’è½ã¨ã™.Shiftã‚ーをä¿æŒã—ã¦ã‚¸ã‚§ãƒãƒªãƒƒã‚¯ã‚’指示ã™ã‚‹." +"Ctrlを押ã—ãŸã¾ã¾Getterを(ドラッグ&)ドãƒãƒƒãƒ—ã™ã‚‹ã€‚Shiftを押ã—ãŸã¾ã¾æ±Žç”¨ã‚·ã‚°" +"ãƒãƒãƒ£ã‚’(ドラッグ&)ドãƒãƒƒãƒ—ã™ã‚‹." #: modules/visual_script/visual_script_editor.cpp #, fuzzy @@ -11242,9 +11262,10 @@ msgid "Hold %s to drop a simple reference to the node." msgstr "メタã‚ーをä¿æŒã—ã¦å˜ç´”å‚照(simple reference)ã‚’è½ã¨ã™." #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Hold Ctrl to drop a simple reference to the node." -msgstr "Ctrlã‚ーをä¿æŒã—ã¦å˜ç´”å‚照(simple reference)ã‚’è½ã¨ã™." +msgstr "" +"Ctrlを押ã—ãŸã¾ã¾ãƒŽãƒ¼ãƒ‰ã¸å˜ç´”å‚照(simple reference)を(ドラッグ&)ドãƒãƒƒãƒ—ã™" +"る。" #: modules/visual_script/visual_script_editor.cpp #, fuzzy @@ -11252,9 +11273,8 @@ msgid "Hold %s to drop a Variable Setter." msgstr "メタã‚ーをä¿æŒã—ã¦å¤‰æ•°ã®setterã‚’è½ã¨ã™" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Hold Ctrl to drop a Variable Setter." -msgstr "Ctrlã‚ーをä¿æŒã—ã¦å¤‰æ•°ã®setterã‚’è½ã¨ã™." +msgstr "Ctrlを押ã—ãŸã¾ã¾å¤‰æ•°ã®Setterを(ドラッグ&)ドãƒãƒƒãƒ—ã™ã‚‹ã€‚" #: modules/visual_script/visual_script_editor.cpp msgid "Add Preload Node" @@ -11263,24 +11283,31 @@ msgstr "プリãƒãƒ¼ãƒ‰ãƒŽãƒ¼ãƒ‰ã‚’è¿½åŠ " #: modules/visual_script/visual_script_editor.cpp msgid "Can't drop nodes because script '%s' is not used in this scene." msgstr "" +"スクリプト '%s' ã¯ã“ã®ã‚·ãƒ¼ãƒ³ã§ä½¿ã‚ã‚Œã¦ã„ãªã„ãŸã‚ã€ãƒŽãƒ¼ãƒ‰ã‚’(ドラッグ&)ドãƒãƒƒ" +"プã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。" #: modules/visual_script/visual_script_editor.cpp msgid "Add Node(s) From Tree" msgstr "ツリーã‹ã‚‰ãƒŽãƒ¼ãƒ‰ã‚’è¿½åŠ " #: modules/visual_script/visual_script_editor.cpp +#, fuzzy msgid "" "Can't drop properties because script '%s' is not used in this scene.\n" "Drop holding 'Shift' to just copy the signature." msgstr "" +"スクリプト '%s' ã¯ã“ã®ã‚·ãƒ¼ãƒ³ã§ä½¿ã‚ã‚Œã¦ã„ãªã„ãŸã‚ã€ãƒŽãƒ¼ãƒ‰ã‚’è½ã¨ã™ã“ã¨ãŒã§ãã¾" +"ã›ã‚“。\n" +"'shift' ã‚ーを押ã—ãªãŒã‚‰ãƒ‰ãƒãƒƒãƒ—ã™ã‚‹ã“ã¨ã§ã‚·ã‚°ãƒãƒãƒ£ã‚’コピーã™ã‚‹ã“ã¨ãŒã§ãã¾" +"ã™ã€‚" #: modules/visual_script/visual_script_editor.cpp msgid "Add Getter Property" -msgstr "ゲッタープãƒãƒ‘ティã®è¿½åŠ " +msgstr "Getterプãƒãƒ‘ãƒ†ã‚£ã‚’è¿½åŠ " #: modules/visual_script/visual_script_editor.cpp msgid "Add Setter Property" -msgstr "セッタープãƒãƒ‘ティã®è¿½åŠ " +msgstr "setterプãƒãƒ‘ãƒ†ã‚£ã‚’è¿½åŠ " #: modules/visual_script/visual_script_editor.cpp msgid "Change Base Type" @@ -11342,15 +11369,16 @@ msgstr "ファンクションノードをコピーã§ãã¾ã›ã‚“。" #: modules/visual_script/visual_script_editor.cpp msgid "Can't create function of nodes from nodes of multiple functions." -msgstr "" +msgstr "複数ã®é–¢æ•°ã‚’æŒã¤ãƒŽãƒ¼ãƒ‰ã‹ã‚‰ã€ãƒŽãƒ¼ãƒ‰ã®é–¢æ•°ã‚’作るã“ã¨ãŒã§ãã¾ã›ã‚“。" #: modules/visual_script/visual_script_editor.cpp -msgid "Select atleast one node with sequence port." -msgstr "" +#, fuzzy +msgid "Select at least one node with sequence port." +msgstr "シーケンスãƒãƒ¼ãƒˆã§ã¯æœ€ä½Žã§ã‚‚一ã¤ã®ãƒŽãƒ¼ãƒ‰ã‚’é¸æŠžã—ã¦ãã ã•ã„。" #: modules/visual_script/visual_script_editor.cpp msgid "Try to only have one sequence input in selection." -msgstr "" +msgstr "セクションã§ã¯å”¯ä¸€ã¤ã®ã‚·ãƒ¼ã‚±ãƒ³ã‚¹å…¥åŠ›ã‚’æŒã¤ã‚ˆã†ã«ã—ã¦ãã ã•ã„。" #: modules/visual_script/visual_script_editor.cpp #, fuzzy @@ -11446,9 +11474,8 @@ msgid "Base object is not a Node!" msgstr "ベースオブジェクトã¯ãƒŽãƒ¼ãƒ‰ã§ã¯ã‚ã‚Šã¾ã›ã‚“!" #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "Path does not lead Node!" -msgstr "パスãŒãƒŽãƒ¼ãƒ‰ã«é”ã—ã¾ã›ã‚“!" +msgstr "パスãŒãƒŽãƒ¼ãƒ‰ã«é”ã—ã¾ã›ã‚“ï¼" #: modules/visual_script/visual_script_func_nodes.cpp msgid "Invalid index property name '%s' in node %s." @@ -11636,7 +11663,7 @@ msgstr "å¿…é ˆã‚¢ã‚¤ã‚³ãƒ³ãŒãƒ—リセットã«æŒ‡å®šã•ã‚Œã¦ã„ã¾ã›ã‚“。" #: platform/javascript/export/export.cpp msgid "Stop HTTP Server" -msgstr "" +msgstr "HTTPサーãƒãƒ¼ã‚’æ¢ã‚ã‚‹" #: platform/javascript/export/export.cpp msgid "Run in Browser" @@ -11671,10 +11698,20 @@ msgid "Using default boot splash image." msgstr "デフォルトã®ãƒ–ートスプラッシュ画åƒã‚’使用ã—ã¾ã™ã€‚" #: platform/uwp/export/export.cpp +#, fuzzy +msgid "Invalid package short name." +msgstr "無効ãªãƒ‘ッケージå:" + +#: platform/uwp/export/export.cpp msgid "Invalid package unique name." msgstr "パッケージã®ä¸€æ„ã®åå‰ãŒç„¡åŠ¹ã§ã™ã€‚" #: platform/uwp/export/export.cpp +#, fuzzy +msgid "Invalid package publisher display name." +msgstr "パッケージã®ä¸€æ„ã®åå‰ãŒç„¡åŠ¹ã§ã™ã€‚" + +#: platform/uwp/export/export.cpp msgid "Invalid product GUID." msgstr "無効ãªãƒ—ãƒãƒ€ã‚¯ãƒˆ GUIDã§ã™ã€‚" @@ -12161,7 +12198,6 @@ msgstr "" "WorldEnvironmentã¯1ã¤ã ã‘ã§ã™ã€‚" #: scene/3d/world_environment.cpp -#, fuzzy msgid "" "This WorldEnvironment is ignored. Either add a Camera (for 3D scenes) or set " "this environment's Background Mode to Canvas (for 2D scenes)." @@ -12339,6 +12375,18 @@ msgstr "Varyingã¯é ‚点関数ã«ã®ã¿å‰²ã‚Šå½“ã¦ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚" msgid "Constants cannot be modified." msgstr "定数ã¯å¤‰æ›´ã§ãã¾ã›ã‚“。" +#~ msgid "Pause the scene" +#~ msgstr "シーンを一時åœæ¢" + +#~ msgid "Shift+" +#~ msgstr "Shift+" + +#~ msgid "Alt+" +#~ msgstr "Alt+" + +#~ msgid "Control+" +#~ msgstr "Control+" + #~ msgid "Snap to Grid" #~ msgstr "グリッドã«ã‚¹ãƒŠãƒƒãƒ—" diff --git a/editor/translations/ka.po b/editor/translations/ka.po index f703153803..839ad533f5 100644 --- a/editor/translations/ka.po +++ b/editor/translations/ka.po @@ -2880,7 +2880,7 @@ msgid "Play" msgstr "" #: editor/editor_node.cpp -msgid "Pause the scene" +msgid "Pause the scene execution for debugging." msgstr "" #: editor/editor_node.cpp @@ -3554,6 +3554,10 @@ msgid "New Inherited Scene" msgstr "" #: editor/filesystem_dock.cpp +msgid "Set As Main Scene" +msgstr "" + +#: editor/filesystem_dock.cpp #, fuzzy msgid "Open Scenes" msgstr "გáƒáƒ®áƒ¡áƒœáƒ˜áƒšáƒ˜" @@ -4293,6 +4297,21 @@ msgid "" msgstr "" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Anim Clips" +msgstr "áƒáƒœáƒ˜áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ მáƒáƒœáƒáƒ™áƒ•áƒ”თები:" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Audio Clips" +msgstr "ხმáƒáƒ•áƒáƒœáƒ˜ მáƒáƒœáƒáƒ™áƒ•áƒ”თები:" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Functions" +msgstr "ფუნქციები:" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/animation_state_machine_editor.cpp msgid "Node Renamed" msgstr "" @@ -4972,6 +4991,14 @@ msgid "Grid Step:" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Primary Line Every:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "steps" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotation Offset:" msgstr "" @@ -4980,6 +5007,11 @@ msgid "Rotation Step:" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Scale Step:" +msgstr "მáƒáƒ¡áƒ¨áƒ¢áƒáƒ‘ის თáƒáƒœáƒáƒ¤áƒáƒ დáƒáƒ‘áƒ:" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move Vertical Guide" msgstr "" @@ -5065,6 +5097,20 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"Overrides game camera with editor viewport camera." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"No game instance running." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp msgid "Lock Selected" msgstr "" @@ -5206,6 +5252,10 @@ msgid "Use Rotation Snap" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Use Scale Snap" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap Relative" msgstr "" @@ -5347,7 +5397,7 @@ msgstr "áƒáƒœáƒ˜áƒ› გáƒáƒ¡áƒáƒ¦áƒ”ბის ჩáƒáƒ§áƒ”ნებáƒ" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" -"Auto insert keys when objects are translated, rotated on scaled (based on " +"Auto insert keys when objects are translated, rotated or scaled (based on " "mask).\n" "Keys are only added to existing tracks, no new tracks will be created.\n" "Keys must be inserted manually for the first time." @@ -8269,7 +8319,7 @@ msgid "Dodge operator." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "HardLight operator" +msgid "HardLight operator." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8864,9 +8914,10 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Custom Godot Shader Language expression, which placed on top of the resulted " -"shader. You can place various function definitions inside and call it later " -"in the Expressions. You can also declare varyings, uniforms and constants." +"Custom Godot Shader Language expression, which is placed on top of the " +"resulted shader. You can place various function definitions inside and call " +"it later in the Expressions. You can also declare varyings, uniforms and " +"constants." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8975,6 +9026,12 @@ msgid "Add..." msgstr "" #: editor/project_export.cpp +msgid "" +"If checked, the preset will be available for use in one-click deploy.\n" +"Only one preset per platform may be marked as runnable." +msgstr "" + +#: editor/project_export.cpp msgid "Export Path" msgstr "" @@ -9414,18 +9471,6 @@ msgid "Device" msgstr "" #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Shift+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Alt+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Control+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "Press a Key..." msgstr "" @@ -11155,7 +11200,7 @@ msgid "Can't create function of nodes from nodes of multiple functions." msgstr "" #: modules/visual_script/visual_script_editor.cpp -msgid "Select atleast one node with sequence port." +msgid "Select at least one node with sequence port." msgstr "" #: modules/visual_script/visual_script_editor.cpp @@ -11466,11 +11511,21 @@ msgstr "" #: platform/uwp/export/export.cpp #, fuzzy +msgid "Invalid package short name." +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ ი ფáƒáƒœáƒ¢áƒ˜áƒ¡ ზáƒáƒ›áƒ." + +#: platform/uwp/export/export.cpp +#, fuzzy msgid "Invalid package unique name." msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ ი ფáƒáƒœáƒ¢áƒ˜áƒ¡ ზáƒáƒ›áƒ." #: platform/uwp/export/export.cpp #, fuzzy +msgid "Invalid package publisher display name." +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ ი ფáƒáƒœáƒ¢áƒ˜áƒ¡ ზáƒáƒ›áƒ." + +#: platform/uwp/export/export.cpp +#, fuzzy msgid "Invalid product GUID." msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ ი ფáƒáƒœáƒ¢áƒ˜áƒ¡ ზáƒáƒ›áƒ." diff --git a/editor/translations/ko.po b/editor/translations/ko.po index d2e68e1d71..63fd0fe16c 100644 --- a/editor/translations/ko.po +++ b/editor/translations/ko.po @@ -18,7 +18,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2019-10-29 12:49+0000\n" +"PO-Revision-Date: 2019-11-25 04:05+0000\n" "Last-Translator: ì†¡íƒœì„ <xotjq237@gmail.com>\n" "Language-Team: Korean <https://hosted.weblate.org/projects/godot-engine/" "godot/ko/>\n" @@ -27,13 +27,12 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 3.9.1\n" +"X-Generator: Weblate 3.10-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp msgid "Invalid type argument to convert(), use TYPE_* constants." -msgstr "" -"conver() ë©”ì„œë“œì˜ ì¸ìˆ˜ íƒ€ìž…ì´ ìž˜ 못ë˜ì—ˆìŠµë‹ˆë‹¤, TYPE_* ìƒìˆ˜ë¥¼ 사용하세요." +msgstr "conver() ë©”ì„œë“œì˜ ì¸ìˆ˜ ìœ í˜•ì´ ìž˜ëª»ë˜ì—ˆì–´ìš”. TYPE_* ìƒìˆ˜ë¥¼ 사용하세요." #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/mono/glue/gd_glue.cpp @@ -147,47 +146,47 @@ msgstr "ì• ë‹ˆë©”ì´ì…˜ 키 ì‚ì œí•˜ê¸°" #: editor/animation_track_editor.cpp msgid "Anim Change Keyframe Time" -msgstr "ì• ë‹ˆë©”ì´ì…˜ í‚¤í”„ë ˆìž„ 시간 변경하기" +msgstr "ì• ë‹ˆë©”ì´ì…˜ í‚¤í”„ë ˆìž„ 시간 바꾸기" #: editor/animation_track_editor.cpp msgid "Anim Change Transition" -msgstr "ì• ë‹ˆë©”ì´ì…˜ ì „í™˜ 변경하기" +msgstr "ì• ë‹ˆë©”ì´ì…˜ ì „í™˜ 바꾸기" #: editor/animation_track_editor.cpp msgid "Anim Change Transform" -msgstr "ì• ë‹ˆë©”ì´ì…˜ 변형 변경하기" +msgstr "ì• ë‹ˆë©”ì´ì…˜ 변형 바꾸기" #: editor/animation_track_editor.cpp msgid "Anim Change Keyframe Value" -msgstr "ì• ë‹ˆë©”ì´ì…˜ í‚¤í”„ë ˆìž„ ê°’ 변경하기" +msgstr "ì• ë‹ˆë©”ì´ì…˜ í‚¤í”„ë ˆìž„ ê°’ 바꾸기" #: editor/animation_track_editor.cpp msgid "Anim Change Call" -msgstr "ì• ë‹ˆë©”ì´ì…˜ 호출 변경하기" +msgstr "ì• ë‹ˆë©”ì´ì…˜ 호출 바꾸기" #: editor/animation_track_editor.cpp msgid "Anim Multi Change Keyframe Time" -msgstr "ì• ë‹ˆë©”ì´ì…˜ 여러 í‚¤í”„ë ˆìž„ 시간 변경하기" +msgstr "ì• ë‹ˆë©”ì´ì…˜ 여러 í‚¤í”„ë ˆìž„ 시간 바꾸기" #: editor/animation_track_editor.cpp msgid "Anim Multi Change Transition" -msgstr "ì• ë‹ˆë©”ì´ì…˜ 여러 ì „í™˜ 변경하기" +msgstr "ì• ë‹ˆë©”ì´ì…˜ 여러 ì „í™˜ 바꾸기" #: editor/animation_track_editor.cpp msgid "Anim Multi Change Transform" -msgstr "ì• ë‹ˆë©”ì´ì…˜ 여러 변형 변경하기" +msgstr "ì• ë‹ˆë©”ì´ì…˜ 여러 변형 바꾸기" #: editor/animation_track_editor.cpp msgid "Anim Multi Change Keyframe Value" -msgstr "ì• ë‹ˆë©”ì´ì…˜ 여러 í‚¤í”„ë ˆìž„ ê°’ 변경하기" +msgstr "ì• ë‹ˆë©”ì´ì…˜ 여러 í‚¤í”„ë ˆìž„ ê°’ 바꾸기" #: editor/animation_track_editor.cpp msgid "Anim Multi Change Call" -msgstr "ì• ë‹ˆë©”ì´ì…˜ 여러 호출 변경하기" +msgstr "ì• ë‹ˆë©”ì´ì…˜ 여러 호출 바꾸기" #: editor/animation_track_editor.cpp msgid "Change Animation Length" -msgstr "ì• ë‹ˆë©”ì´ì…˜ ê¸¸ì´ ë³€ê²½í•˜ê¸°" +msgstr "ì• ë‹ˆë©”ì´ì…˜ ê¸¸ì´ ë°”ê¾¸ê¸°" #: editor/animation_track_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp @@ -208,7 +207,7 @@ msgstr "호출 메서드 트랙" #: editor/animation_track_editor.cpp msgid "Bezier Curve Track" -msgstr "ë² ì§€ì–´ 커브 트랙" +msgstr "ë² ì§€ì–´ ê³¡ì„ íŠ¸ëž™" #: editor/animation_track_editor.cpp msgid "Audio Playback Track" @@ -249,11 +248,11 @@ msgstr "ì• ë‹ˆë©”ì´ì…˜ í´ë¦½:" #: editor/animation_track_editor.cpp msgid "Change Track Path" -msgstr "트랙 경로 변경하기" +msgstr "트랙 경로 바꾸기" #: editor/animation_track_editor.cpp msgid "Toggle this track on/off." -msgstr "ì´ íŠ¸ëž™ì„ ì¼œê±°ë‚˜ ë•ë‹ˆë‹¤." +msgstr "ì´ íŠ¸ëž™ì„ ì¼œê±°ë‚˜ 꺼요." #: editor/animation_track_editor.cpp msgid "Update Mode (How this property is set)" @@ -265,7 +264,7 @@ msgstr "ë³´ê°„ 모드" #: editor/animation_track_editor.cpp msgid "Loop Wrap Mode (Interpolate end with beginning on loop)" -msgstr "루프 ëž© 모드 (시작 루프와 ëì„ ë³´ê°„)" +msgstr "루프 마무리 모드 (시작 루프와 ëì„ ë³´ê°„)" #: editor/animation_track_editor.cpp msgid "Remove this track." @@ -314,7 +313,7 @@ msgstr "루프 ë³´ê°„ ê³ ì •í•˜ê¸°" #: editor/animation_track_editor.cpp msgid "Wrap Loop Interp" -msgstr "루프 ë³´ê°„ ê°ì¶”기" +msgstr "루프 ë³´ê°„ 마무리하기" #: editor/animation_track_editor.cpp #: editor/plugins/canvas_item_editor_plugin.cpp @@ -331,15 +330,15 @@ msgstr "키 ì‚ì œí•˜ê¸°" #: editor/animation_track_editor.cpp msgid "Change Animation Update Mode" -msgstr "ì• ë‹ˆë©”ì´ì…˜ ì—…ë°ì´íŠ¸ 모드 변경하기" +msgstr "ì• ë‹ˆë©”ì´ì…˜ ì—…ë°ì´íŠ¸ 모드 바꾸기" #: editor/animation_track_editor.cpp msgid "Change Animation Interpolation Mode" -msgstr "ì• ë‹ˆë©”ì´ì…˜ ë³´ê°„ 모드 변경하기" +msgstr "ì• ë‹ˆë©”ì´ì…˜ ë³´ê°„ 모드 바꾸기" #: editor/animation_track_editor.cpp msgid "Change Animation Loop Mode" -msgstr "ì• ë‹ˆë©”ì´ì…˜ 루프 모드 변경하기" +msgstr "ì• ë‹ˆë©”ì´ì…˜ 루프 모드 바꾸기" #: editor/animation_track_editor.cpp msgid "Remove Anim Track" @@ -372,7 +371,7 @@ msgstr "ì• ë‹ˆë©”ì´ì…˜ 삽입하기" #: editor/animation_track_editor.cpp msgid "AnimationPlayer can't animate itself, only other players." msgstr "" -"AnimationPlayer는 ìžì‹ ì—게 ì• ë‹ˆë©”ì´ì…˜ì„ í• ìˆ˜ 없어요, 다른 AnimationPlayer만 " +"AnimationPlayer는 ìžì‹ ì—게 ì• ë‹ˆë©”ì´ì…˜ì„ 줄 수 없어요. 다른 AnimationPlayer만 " "ì• ë‹ˆë©”ì´ì…˜ì„ 줄 수 ìžˆì£ ." #: editor/animation_track_editor.cpp @@ -381,7 +380,7 @@ msgstr "ì• ë‹ˆë©”ì´ì…˜ ìƒì„±í•˜ê¸° & 삽입하기" #: editor/animation_track_editor.cpp msgid "Anim Insert Track & Key" -msgstr "ì• ë‹ˆë©”ì´ì…˜ 트랙과 키 삽입하기" +msgstr "ì• ë‹ˆë©”ì´ì…˜ 트랙 & 키 삽입하기" #: editor/animation_track_editor.cpp msgid "Anim Insert Key" @@ -389,7 +388,7 @@ msgstr "ì• ë‹ˆë©”ì´ì…˜ 키 삽입하기" #: editor/animation_track_editor.cpp msgid "Change Animation Step" -msgstr "ì• ë‹ˆë©”ì´ì…˜ 단계 바꾸기하기" +msgstr "ì• ë‹ˆë©”ì´ì…˜ 단계 바꾸기" #: editor/animation_track_editor.cpp msgid "Rearrange Tracks" @@ -418,12 +417,12 @@ msgstr "ì• ë‹ˆë©”ì´ì…˜ íŠ¸ëž™ì€ ì˜¤ì§ AnimationPlayer 노드만 가리킬 수 #: editor/animation_track_editor.cpp msgid "An animation player can't animate itself, only other players." msgstr "" -"AnimationPlayer는 ìžì‹ ì—게 ì• ë‹ˆë©”ì´ì…˜ì„ í• ìˆ˜ 없어요, 다른 AnimationPlayer만 " +"AnimationPlayer는 ìžì‹ ì—게 ì• ë‹ˆë©”ì´ì…˜ì„ 줄 수 없어요. 다른 AnimationPlayer만 " "ì• ë‹ˆë©”ì´ì…˜ì„ 줄 수 ìžˆì£ ." #: editor/animation_track_editor.cpp msgid "Not possible to add a new track without a root" -msgstr "루트 ì—†ì´ ìƒˆ íŠ¸ëž™ì„ ì¶”ê°€í• ìˆ˜ 없어요" +msgstr "루트 ì—†ì´ ìƒˆ íŠ¸ëž™ì„ ì¶”ê°€í• ìˆ˜ ì—†ìŒ" #: editor/animation_track_editor.cpp msgid "Add Bezier Track" @@ -431,11 +430,11 @@ msgstr "ë² ì§€ì–´ 트랙 추가하기" #: editor/animation_track_editor.cpp msgid "Track path is invalid, so can't add a key." -msgstr "트랙 경로가 잘못ëì–´ìš”, 키를 ì¶”ê°€í• ìˆ˜ 없어요." +msgstr "트랙 경로가 잘못ë˜ì—ˆì–´ìš”. 키를 ì¶”ê°€í• ìˆ˜ 없어요." #: editor/animation_track_editor.cpp msgid "Track is not of type Spatial, can't insert key" -msgstr "íŠ¸ëž™ì´ Spatial ìœ í˜•ì´ ì•„ë‹ˆì—ìš”, 키를 ì‚½ìž…í• ìˆ˜ 없어요" +msgstr "íŠ¸ëž™ì´ Spatial ìœ í˜•ì´ ì•„ë‹ˆì—ìš”. 키를 ì‚½ìž…í• ìˆ˜ 없어요" #: editor/animation_track_editor.cpp msgid "Add Transform Track Key" @@ -447,7 +446,7 @@ msgstr "트랙 키 추가하기" #: editor/animation_track_editor.cpp msgid "Track path is invalid, so can't add a method key." -msgstr "트랙 경로가 잘못ëì–´ìš”, 메서드 키를 ì¶”ê°€í• ìˆ˜ 없어요." +msgstr "트랙 경로가 잘못ëì–´ìš”. 메서드 키를 ì¶”ê°€í• ìˆ˜ 없어요." #: editor/animation_track_editor.cpp msgid "Add Method Track Key" @@ -455,7 +454,7 @@ msgstr "메서드 트랙 키 추가하기" #: editor/animation_track_editor.cpp msgid "Method not found in object: " -msgstr "ê°ì²´ì— 메서드가 없어요: " +msgstr "ê°ì²´ì— 메서드가 ì—†ìŒ: " #: editor/animation_track_editor.cpp msgid "Anim Move Keys" @@ -463,7 +462,7 @@ msgstr "ì• ë‹ˆë©”ì´ì…˜ 키 ì´ë™í•˜ê¸°" #: editor/animation_track_editor.cpp msgid "Clipboard is empty" -msgstr "í´ë¦½ë³´ë“œê°€ 비었어요" +msgstr "í´ë¦½ë³´ë“œê°€ 비었ìŒ" #: editor/animation_track_editor.cpp msgid "Paste Tracks" @@ -490,29 +489,29 @@ msgid "" "Alternatively, use an import preset that imports animations to separate " "files." msgstr "" -"ì´ ì• ë‹ˆë©”ì´ì…˜ì€ ê°€ì ¸ì˜¨ ì”¬ì— ì¢…ì†ë˜ì–´ìžˆì–´ìš”, ê°€ì ¸ì˜¨ íŠ¸ëž™ì˜ ë³€ê²½ 사í•ì€ ì €ìž¥ë˜" -"지 ì•Šì•„ìš”.\n" +"ì´ ì• ë‹ˆë©”ì´ì…˜ì€ ê°€ì ¸ì˜¨ ì”¬ì— ì†í•´ 있어요. ê°€ì ¸ì˜¨ íŠ¸ëž™ì˜ ë³€ê²½ 사í•ì€ ì €ìž¥ë˜ì§€ " +"ì•Šì•„ìš”.\n" "\n" "ì €ìž¥ ê¸°ëŠ¥ì„ ì¼œë ¤ë©´ 맞춤 íŠ¸ëž™ì„ ì¶”ê°€í•˜ê³ , ì”¬ì˜ ê°€ì ¸ì˜¤ê¸° ì„¤ì •ìœ¼ë¡œ 가서\n" "\"Animation > Storage\" ì„¤ì •ì„ \"Files\"ë¡œ, \"Animation > Keep Custom Tracks" "\" ì„¤ì •ì„ ì¼ ë’¤, 다시 ê°€ì ¸ì˜¤ì„¸ìš”.\n" -"ëŒ€ì‹ ê°€ì ¸ì˜¤ê¸° 프리셋으로 ì• ë‹ˆë©”ì´ì…˜ì„ 별ë„ì˜ íŒŒì¼ë¡œ ê°€ì ¸ì˜¬ ìˆ˜ë„ ìžˆì–´ìš”." +"아니면 ê°€ì ¸ì˜¤ê¸° 프리셋으로 ì• ë‹ˆë©”ì´ì…˜ì„ 별ë„ì˜ íŒŒì¼ë¡œ ê°€ì ¸ì˜¬ ìˆ˜ë„ ìžˆì–´ìš”." #: editor/animation_track_editor.cpp msgid "Warning: Editing imported animation" -msgstr "ê²½ê³ : ê°€ì ¸ì˜¨ ì• ë‹ˆë©”ì´ì…˜ì„ 편집 중" +msgstr "ê²½ê³ : ê°€ì ¸ì˜¨ ì• ë‹ˆë©”ì´ì…˜ì„ íŽ¸ì§‘í•˜ê³ ìžˆìŒ" #: editor/animation_track_editor.cpp msgid "Select an AnimationPlayer node to create and edit animations." -msgstr "ì• ë‹ˆë©”ì´ì…˜ì„ ë§Œë“¤ê³ íŽ¸ì§‘í•˜ë ¤ë©´ AnimationPlayer노드를 ì„ íƒí•˜ì„¸ìš”." +msgstr "ì• ë‹ˆë©”ì´ì…˜ì„ ë§Œë“¤ê³ íŽ¸ì§‘í•˜ë ¤ë©´ AnimationPlayer노드를 ì„ íƒí•˜ì„¸ìš”." #: editor/animation_track_editor.cpp msgid "Only show tracks from nodes selected in tree." -msgstr "트리ì—ì„œ ì„ íƒí•œ 노드만 íŠ¸ëž™ì— í‘œì‹œë˜ìš”." +msgstr "ì˜¤ì§ íŠ¸ë¦¬ì—ì„œ ì„ íƒí•œ 노드만 íŠ¸ëž™ì— í‘œì‹œë¼ìš”." #: editor/animation_track_editor.cpp msgid "Group tracks by node or display them as plain list." -msgstr "노드 별로 íŠ¸ëž™ì„ ë¬¶ê±°ë‚˜ 묶지 ì•Šê³ ë‚˜ì—´í•´ì„œ ë³¼ 수 있어요." +msgstr "노드 별로 íŠ¸ëž™ì„ ë¬¶ì–´ì„œ 보거나, 묶지 ì•Šê³ ë‚˜ì—´í•´ì„œ ë³¼ 수 있어요." #: editor/animation_track_editor.cpp msgid "Snap:" @@ -549,11 +548,11 @@ msgstr "트랙 복사하기" #: editor/animation_track_editor.cpp msgid "Scale Selection" -msgstr "ì„ íƒ í•ëª© ê¸¸ì´ ì¡°ì ˆí•˜ê¸°" +msgstr "ì„ íƒ í•ëª© 규모 ì¡°ì ˆí•˜ê¸°" #: editor/animation_track_editor.cpp msgid "Scale From Cursor" -msgstr "커서 위치ì—ì„œ ê¸¸ì´ ì¡°ì ˆí•˜ê¸°" +msgstr "커서 위치ì—ì„œ 규모 ì¡°ì ˆí•˜ê¸°" #: editor/animation_track_editor.cpp modules/gridmap/grid_map_editor_plugin.cpp msgid "Duplicate Selection" @@ -581,7 +580,7 @@ msgstr "ì• ë‹ˆë©”ì´ì…˜ 최ì 화하기" #: editor/animation_track_editor.cpp msgid "Clean-Up Animation" -msgstr "ì• ë‹ˆë©”ì´ì…˜ ì—†ì• ê¸°" +msgstr "ì• ë‹ˆë©”ì´ì…˜ ì •ë¦¬í•˜ê¸°" #: editor/animation_track_editor.cpp msgid "Pick the node that will be animated:" @@ -589,7 +588,7 @@ msgstr "ì• ë‹ˆë©”ì´ì…˜ì„ 줄 노드를 ì„ íƒí•˜ì„¸ìš”:" #: editor/animation_track_editor.cpp msgid "Use Bezier Curves" -msgstr "ë² ì§€ì–´ 커브 사용하기" +msgstr "ë² ì§€ì–´ ê³¡ì„ ì‚¬ìš©í•˜ê¸°" #: editor/animation_track_editor.cpp msgid "Anim. Optimizer" @@ -597,11 +596,11 @@ msgstr "ì• ë‹ˆë©”ì´ì…˜. 최ì í™”" #: editor/animation_track_editor.cpp msgid "Max. Linear Error:" -msgstr "최대 ì„ í˜• 오류:" +msgstr "최대. ì„ í˜• 오류:" #: editor/animation_track_editor.cpp msgid "Max. Angular Error:" -msgstr "최대 ê°ë„ 오류:" +msgstr "최대. ê°ë„ 오류:" #: editor/animation_track_editor.cpp msgid "Max Optimizable Angle:" @@ -621,24 +620,23 @@ msgstr "í•´ê²°ë˜ì§€ ì•Šê³ ë¹ˆ 트랙 ì‚ì œí•˜ê¸°" #: editor/animation_track_editor.cpp msgid "Clean-up all animations" -msgstr "ëª¨ë“ ì• ë‹ˆë©”ì´ì…˜ ì—†ì• ê¸°" +msgstr "ëª¨ë“ ì• ë‹ˆë©”ì´ì…˜ ì •ë¦¬í•˜ê¸°" #: editor/animation_track_editor.cpp msgid "Clean-Up Animation(s) (NO UNDO!)" -msgstr "ì• ë‹ˆë©”ì´ì…˜ ì—†ì• ê¸° (ë˜ëŒë¦´ 수 없어요!)" +msgstr "ì• ë‹ˆë©”ì´ì…˜ ì •ë¦¬í•˜ê¸° (ë˜ëŒë¦´ 수 없어요!)" #: editor/animation_track_editor.cpp msgid "Clean-Up" -msgstr "ì—†ì• ê¸°" +msgstr "ì •ë¦¬í•˜ê¸°" #: editor/animation_track_editor.cpp msgid "Scale Ratio:" -msgstr "ê¸¸ì´ ë¹„ìœ¨:" +msgstr "규모 비율:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Select Tracks to Copy" -msgstr "ë³µì‚¬í• íŠ¸ëž™ì„ ì„ íƒí•˜ì„¸ìš”:" +msgstr "ë³µì‚¬í• íŠ¸ëž™ì„ ì„ íƒí•˜ê¸°" #: editor/animation_track_editor.cpp editor/editor_log.cpp #: editor/editor_properties.cpp @@ -650,9 +648,8 @@ msgid "Copy" msgstr "복사하기" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Select All/None" -msgstr "ëª¨ë‘ ì„ íƒí•˜ì§€ 않기" +msgstr "ëª¨ë‘ ì„ íƒí•˜ê¸°/ì„ íƒí•˜ì§€ 않기" #: editor/animation_track_editor_plugins.cpp msgid "Add Audio Track Clip" @@ -660,23 +657,23 @@ msgstr "오디오 트랙 í´ë¦½ 추가하기" #: editor/animation_track_editor_plugins.cpp msgid "Change Audio Track Clip Start Offset" -msgstr "오디오 트랙 í´ë¦½ 시작 오프셋 변경하기" +msgstr "오디오 트랙 í´ë¦½ 시작 오프셋 바꾸기" #: editor/animation_track_editor_plugins.cpp msgid "Change Audio Track Clip End Offset" -msgstr "오디오 트랙 í´ë¦½ 종료 오프셋 변경하기" +msgstr "오디오 트랙 í´ë¦½ 종료 오프셋 바꾸기" #: editor/array_property_edit.cpp msgid "Resize Array" -msgstr "ë°°ì—´ í¬ê¸° 변경하기" +msgstr "ë°°ì—´ í¬ê¸° 바꾸기" #: editor/array_property_edit.cpp msgid "Change Array Value Type" -msgstr "ë°°ì—´ ê°’ ìœ í˜• 변경하기" +msgstr "ë°°ì—´ ê°’ ìœ í˜• 바꾸기" #: editor/array_property_edit.cpp msgid "Change Array Value" -msgstr "ë°°ì—´ ê°’ 변경하기" +msgstr "ë°°ì—´ ê°’ 바꾸기" #: editor/code_editor.cpp msgid "Go to Line" @@ -688,7 +685,7 @@ msgstr "í–‰ 번호:" #: editor/code_editor.cpp msgid "Replaced %d occurrence(s)." -msgstr "%@ê°œì˜ ë‹¨ì–´ë¥¼ êµì²´í–ˆì–´ìš”." +msgstr "%dê°œì˜ ë‹¨ì–´ë¥¼ êµì²´í–ˆì–´ìš”." #: editor/code_editor.cpp editor/editor_help.cpp msgid "%d match." @@ -712,7 +709,7 @@ msgstr "êµì²´í•˜ê¸°" #: editor/code_editor.cpp msgid "Replace All" -msgstr "ì „ë¶€ êµì²´í•˜ê¸°" +msgstr "ëª¨ë‘ êµì²´í•˜ê¸°" #: editor/code_editor.cpp msgid "Selection Only" @@ -737,7 +734,7 @@ msgstr "축소하기" #: editor/code_editor.cpp msgid "Reset Zoom" -msgstr "줌 리셋" +msgstr "확대 비율 ì›ëž˜ëŒ€ë¡œ" #: editor/code_editor.cpp msgid "Warnings" @@ -749,23 +746,23 @@ msgstr "í–‰ ë° ì—´ 번호." #: editor/connections_dialog.cpp msgid "Method in target node must be specified." -msgstr "ëŒ€ìƒ ë…¸ë“œì˜ ë©”ì„œë“œë¥¼ ì§€ì •í•´ì•¼ í•´ìš”." +msgstr "ëŒ€ìƒ ë…¸ë“œì—ì„œ 메서드를 ì§€ì •í•´ì•¼ í•´ìš”." #: editor/connections_dialog.cpp msgid "" "Target method not found. Specify a valid method or attach a script to the " "target node." msgstr "" -"ëŒ€ìƒ ë©”ì„œë“œë¥¼ ì°¾ì„ ìˆ˜ 없어요! 올바른 메서드를 ì§€ì •í•˜ê±°ë‚˜ ëŒ€ìƒ ë…¸ë“œì— ìŠ¤í¬ë¦½íŠ¸" +"ëŒ€ìƒ ë©”ì„œë“œë¥¼ ì°¾ì„ ìˆ˜ 없어요. 올바른 메서드를 ì§€ì •í•˜ê±°ë‚˜ ëŒ€ìƒ ë…¸ë“œì— ìŠ¤í¬ë¦½íŠ¸" "를 붙여보세요." #: editor/connections_dialog.cpp msgid "Connect to Node:" -msgstr "ì´ ë…¸ë“œì— ì—°ê²°í• ê²Œìš”:" +msgstr "ì´ ë…¸ë“œì— ì—°ê²°ë¨:" #: editor/connections_dialog.cpp msgid "Connect to Script:" -msgstr "ì´ ìŠ¤í¬ë¦½íŠ¸ì— ì—°ê²°í• ê²Œìš”:" +msgstr "ì´ ìŠ¤í¬ë¦½íŠ¸ì— ì—°ê²°ë¨:" #: editor/connections_dialog.cpp msgid "From Signal:" @@ -773,7 +770,7 @@ msgstr "ì´ ì‹œê·¸ë„ì—ì„œ:" #: editor/connections_dialog.cpp msgid "Scene does not contain any script." -msgstr "ì”¬ì´ ì–´ë–¤ 스í¬ë¦½íŠ¸ë„ ê°–ê³ ìžˆì§€ 않네요." +msgstr "ì”¬ì´ ì–´ë–¤ 스í¬ë¦½íŠ¸ë„ ê°–ê³ ìžˆì§€ ì•Šì•„ìš”." #: editor/connections_dialog.cpp editor/editor_autoload_settings.cpp #: editor/groups_editor.cpp editor/plugins/item_list_editor_plugin.cpp @@ -812,7 +809,7 @@ msgstr "지연" msgid "" "Defers the signal, storing it in a queue and only firing it at idle time." msgstr "" -"시그ë„ì„ ì§€ì—°í•˜ë©´ 시그ë„ì€ íì— ì €ìž¥ë˜ê¸° ë•Œë¬¸ì— ëŒ€ê¸° 시간ì—만 방출해요." +"시그ë„ì„ ì§€ì—°í•˜ë©´, 시그ë„ì€ íì— ì €ìž¥ë˜ê¸° ë•Œë¬¸ì— ëŒ€ê¸° 시간ì—만 방출해요." #: editor/connections_dialog.cpp msgid "Oneshot" @@ -824,7 +821,7 @@ msgstr "ì²˜ìŒ ë°©ì¶œí•˜ë©´ ì‹œê·¸ë„ ì—°ê²°ì„ í’€ì–´ë²„ë ¤ìš”." #: editor/connections_dialog.cpp msgid "Cannot connect signal" -msgstr "시그ë„ì„ ì—°ê²°í• ìˆ˜ 없어요" +msgstr "시그ë„ì„ ì—°ê²°í• ìˆ˜ ì—†ìŒ" #: editor/connections_dialog.cpp editor/dependency_editor.cpp #: editor/export_template_manager.cpp editor/groups_editor.cpp @@ -855,11 +852,11 @@ msgstr "'%s'ì„(를) '%s'ì— ì—°ê²°í•˜ê¸°" #: editor/connections_dialog.cpp msgid "Disconnect '%s' from '%s'" -msgstr "'%s'와(ê³¼) '%s'ì˜ ì—°ê²° 풀기" +msgstr "'%s'ì„(를) '%s'ì—ì„œ ì—°ê²° 풀기" #: editor/connections_dialog.cpp msgid "Disconnect all from signal: '%s'" -msgstr "ì „ë¶€ 시그ë„ì—ì„œ ì—°ê²° 풀기: '%s'" +msgstr "ëª¨ë‘ ì‹œê·¸ë„ì—ì„œ ì—°ê²° 풀기: '%s'" #: editor/connections_dialog.cpp msgid "Connect..." @@ -884,7 +881,7 @@ msgstr "\"%s\" 시그ë„ì˜ ëª¨ë“ ì—°ê²°ì„ ì‚ì œí• ê¹Œìš”?" #: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp msgid "Signals" -msgstr "시그ë„" +msgstr "시그ë„(Signal)" #: editor/connections_dialog.cpp msgid "Are you sure you want to remove all connections from this signal?" @@ -908,7 +905,7 @@ msgstr "%s(으)ë¡œ ìœ í˜• 바꾸기" #: editor/create_dialog.cpp editor/project_settings_editor.cpp msgid "Change" -msgstr "변경하기" +msgstr "바꾸기" #: editor/create_dialog.cpp msgid "Create New %s" @@ -933,7 +930,7 @@ msgstr "검색하기:" #: editor/property_selector.cpp editor/quick_open.cpp #: modules/visual_script/visual_script_property_selector.cpp msgid "Matches:" -msgstr "ì¼ì¹˜í•´ìš”:" +msgstr "ì¼ì¹˜í•¨:" #: editor/create_dialog.cpp editor/editor_plugin_settings.cpp #: editor/plugin_config_dialog.cpp @@ -957,7 +954,7 @@ msgid "" "Changes will only take effect when reloaded." msgstr "" "씬 '%s'ì„(를) íŽ¸ì§‘í•˜ê³ ìžˆì–´ìš”.\n" -"다시 불러와야 변경 사í•ì´ ì ìš©ë˜ìš”." +"다시 불러와야 변경 사í•ì´ ì ìš©ë¼ìš”." #: editor/dependency_editor.cpp msgid "" @@ -965,7 +962,7 @@ msgid "" "Changes will only take effect when reloaded." msgstr "" "리소스 '%s'ì„(를) ì‚¬ìš©í•˜ê³ ìžˆì–´ìš”.\n" -"다시 불러와야 변경 사í•ì´ ì ìš©ë˜ìš”." +"다시 불러와야 변경 사í•ì´ ì ìš©ë¼ìš”." #: editor/dependency_editor.cpp #: modules/gdnative/gdnative_library_editor_plugin.cpp @@ -1026,15 +1023,15 @@ msgstr "" #: editor/dependency_editor.cpp msgid "Cannot remove:" -msgstr "ì‚ì œí• ìˆ˜ 없어요:" +msgstr "ì‚ì œí• ìˆ˜ ì—†ìŒ:" #: editor/dependency_editor.cpp msgid "Error loading:" -msgstr "불러오기 중 오류:" +msgstr "불러오는 중 오류:" #: editor/dependency_editor.cpp msgid "Load failed due to missing dependencies:" -msgstr "ì¢…ì† ê´€ê³„ê°€ 누ë½ë˜ì–´ì„œ 불러올 수 없어요:" +msgstr "ì¢…ì† ê´€ê³„ê°€ 누ë½ë˜ì–´ì„œ ë¶ˆëŸ¬ì˜¤ê¸°ì— ì‹¤íŒ¨í•¨:" #: editor/dependency_editor.cpp editor/editor_node.cpp msgid "Open Anyway" @@ -1050,7 +1047,7 @@ msgstr "ì¢…ì† ê´€ê³„ ê³ ì¹˜ê¸°" #: editor/dependency_editor.cpp msgid "Errors loading!" -msgstr "불러오기 중 오류!" +msgstr "불러오는 중 오류!" #: editor/dependency_editor.cpp msgid "Permanently delete %d item(s)? (No undo!)" @@ -1074,11 +1071,11 @@ msgstr "ì‚ì œí•˜ê¸°" #: editor/dependency_editor.cpp msgid "Owns" -msgstr "ì†Œìœ ìž" +msgstr "ì†Œìœ í•¨" #: editor/dependency_editor.cpp msgid "Resources Without Explicit Ownership:" -msgstr "명확한 ì†Œìœ ìžê°€ 없는 리소스:" +msgstr "명확한 ì†Œìœ ê´€ê³„ê°€ 없는 리소스:" #: editor/dictionary_property_edit.cpp msgid "Change Dictionary Key" @@ -1090,7 +1087,7 @@ msgstr "ë””ë ‰í† ë¦¬ ê°’ 변경하기" #: editor/editor_about.cpp msgid "Thanks from the Godot community!" -msgstr "Godot 커뮤니티ì—ì„œ ê³ ë§ˆì›Œìš”!" +msgstr "Godot ì»¤ë®¤ë‹ˆí‹°ì˜ ê°ì‚¬ì˜ ë§ì”€!" #: editor/editor_about.cpp msgid "Godot Engine contributors" @@ -1165,11 +1162,11 @@ msgstr "" #: editor/editor_about.cpp msgid "All Components" -msgstr "ëª¨ë“ ì»´í¬ë„ŒíŠ¸" +msgstr "ëª¨ë“ êµ¬ì„± 요소" #: editor/editor_about.cpp msgid "Components" -msgstr "ì»´í¬ë„ŒíŠ¸" +msgstr "구성 요소" #: editor/editor_about.cpp msgid "Licenses" @@ -1177,7 +1174,7 @@ msgstr "ë¼ì´ì„ 스" #: editor/editor_asset_installer.cpp editor/project_manager.cpp msgid "Error opening package file, not in ZIP format." -msgstr "패키지 파ì´ì„ 여는 중 오류가 ë°œìƒí–ˆì–´ìš”, ZIP 형ì‹ì´ 아니네요." +msgstr "패키지 파ì¼ì„ 여는 중 오류. ZIP 형ì‹ì´ 아니ì—ìš”." #: editor/editor_asset_installer.cpp msgid "Uncompressing Assets" @@ -1271,7 +1268,7 @@ msgstr "ë³µì œí•˜ê¸°" #: editor/editor_audio_buses.cpp msgid "Reset Volume" -msgstr "볼륨 리셋하기" +msgstr "볼륨 리셋" #: editor/editor_audio_buses.cpp msgid "Delete Effect" @@ -1327,7 +1324,7 @@ msgstr "ë ˆì´ì•„웃" #: editor/editor_audio_buses.cpp msgid "Invalid file, not an audio bus layout." -msgstr "ìž˜ëª»ëœ íŒŒì¼ì´ì—ìš”, 오디오 버스 ë ˆì´ì•„ì›ƒì´ ì•„ë‹ˆì—ìš”." +msgstr "ìž˜ëª»ëœ íŒŒì¼. 오디오 버스 ë ˆì´ì•„ì›ƒì´ ì•„ë‹ˆì—ìš”." #: editor/editor_audio_buses.cpp msgid "Add Bus" @@ -1335,7 +1332,7 @@ msgstr "버스 추가하기" #: editor/editor_audio_buses.cpp msgid "Add a new Audio Bus to this layout." -msgstr "ì´ ë ˆì´ì•„ì›ƒì— ìƒˆ 오디오 버스를 ì¶”ê°€í• ê²Œìš”." +msgstr "ì´ ë ˆì´ì•„ì›ƒì— ìƒˆ 오디오 버스를 추가해요." #: editor/editor_audio_buses.cpp editor/editor_properties.cpp #: editor/plugins/animation_player_editor_plugin.cpp editor/property_editor.cpp @@ -1345,7 +1342,7 @@ msgstr "불러오기" #: editor/editor_audio_buses.cpp msgid "Load an existing Bus Layout." -msgstr "기존 버스 ë ˆì´ì•„ì›ƒì„ ë¶ˆëŸ¬ì˜¬ê²Œìš”." +msgstr "존재하는 버스 ë ˆì´ì•„ì›ƒì„ ë¶ˆëŸ¬ì™€ìš”." #: editor/editor_audio_buses.cpp msgid "Save As" @@ -1353,7 +1350,7 @@ msgstr "다른 ì´ë¦„으로 ì €ìž¥í•˜ê¸°" #: editor/editor_audio_buses.cpp msgid "Save this Bus Layout to a file." -msgstr "ì´ ë²„ìŠ¤ ë ˆì´ì•„ì›ƒì„ íŒŒì¼ë¡œ ì €ìž¥í• ê²Œìš”..." +msgstr "ì´ ë²„ìŠ¤ ë ˆì´ì•„ì›ƒì„ íŒŒì¼ë¡œ ì €ìž¥í•´ìš”..." #: editor/editor_audio_buses.cpp editor/import_dock.cpp msgid "Load Default" @@ -1361,7 +1358,7 @@ msgstr "기본값 불러오기" #: editor/editor_audio_buses.cpp msgid "Load the default Bus Layout." -msgstr "기본 버스 ë ˆì´ì•„ì›ƒì„ ë¶ˆëŸ¬ì˜¬ê²Œìš”." +msgstr "기본 버스 ë ˆì´ì•„ì›ƒì„ ë¶ˆëŸ¬ì™€ìš”." #: editor/editor_audio_buses.cpp msgid "Create a new Bus Layout." @@ -1477,11 +1474,11 @@ msgstr "[ì €ìž¥ë˜ì§€ ì•ŠìŒ]" #: editor/editor_dir_dialog.cpp msgid "Please select a base directory first." -msgstr "ë¨¼ì € 기본 ë””ë ‰í† ë¦¬ë¥¼ ì„ íƒí•˜ê¸°í•´ì£¼ì„¸ìš”." +msgstr "ë¨¼ì € 기본 ë””ë ‰í† ë¦¬ë¥¼ ì„ íƒí•´ì£¼ì„¸ìš”." #: editor/editor_dir_dialog.cpp msgid "Choose a Directory" -msgstr "ë””ë ‰í† ë¦¬ ì„ íƒí•˜ê¸°" +msgstr "ë””ë ‰í† ë¦¬ë¥¼ ì„ íƒí•˜ì„¸ìš”" #: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp #: editor/filesystem_dock.cpp editor/project_manager.cpp @@ -1562,7 +1559,7 @@ msgstr "템플릿 파ì¼ì„ ì°¾ì„ ìˆ˜ 없어요:" #: editor/editor_export.cpp msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." -msgstr "32비트 환경ì—서는 4GiB보다 í° ë‚´ìž¥ëœ PCK를 내보낼 수 없어요." +msgstr "32비트 환경ì—서는 4 GiB보다 í° ë‚´ìž¥ëœ PCK를 내보낼 수 없어요." #: editor/editor_feature_profile.cpp msgid "3D Editor" @@ -1638,7 +1635,7 @@ msgstr "켜진 í´ëž˜ìŠ¤:" #: editor/editor_feature_profile.cpp msgid "File '%s' format is invalid, import aborted." -msgstr "íŒŒì¼ '%s' 형ì‹ì´ 잘못ë¬ì–´ìš”, ê°€ì ¸ì˜¬ 수 없어요." +msgstr "íŒŒì¼ '%s' 형ì‹ì´ 잘못ë˜ì—ˆì–´ìš”. ê°€ì ¸ì˜¬ 수 없어요." #: editor/editor_feature_profile.cpp msgid "" @@ -1646,7 +1643,7 @@ msgid "" "aborted." msgstr "" "프로필 '%s'ì´(ê°€) ì´ë¯¸ 있어요. ê°€ì ¸ì˜¤ê¸° ì „ì— ì´ë¯¸ 있는 í”„ë¡œí•„ì„ ë¨¼ì € ì‚ì œí•˜ì„¸" -"ìš”, ê°€ì ¸ì˜¬ 수 없어요." +"ìš”. ê°€ì ¸ì˜¬ 수 없어요." #: editor/editor_feature_profile.cpp msgid "Error saving profile to path: '%s'." @@ -1713,7 +1710,7 @@ msgstr "현재 í´ë” ì„ íƒí•˜ê¸°" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "File Exists, Overwrite?" -msgstr "파ì¼ì´ 존재합니다. ë®ì–´ì“°ì‹œê² 습니까?" +msgstr "파ì¼ì´ ì´ë¯¸ 있어요. ë®ì–´ì“¸ê¹Œìš”?" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Select This Folder" @@ -1834,7 +1831,7 @@ msgstr "현재 í´ë”를 ì¦ê²¨ì°¾ê¸°í•˜ê±°ë‚˜ 하지 ì•Šì•„ìš”." #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Toggle the visibility of hidden files." -msgstr "ê°ì¶˜ 파ì¼ì˜ 표시 여부 í† ê¸€." +msgstr "숨긴 파ì¼ì˜ 표시 여부 í† ê¸€." #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp msgid "View items as a grid of thumbnails." @@ -1870,7 +1867,7 @@ msgstr "소스 조사" msgid "" "There are multiple importers for different types pointing to file %s, import " "aborted" -msgstr "íŒŒì¼ %sì„(를) 가리키는 다른 ìœ í˜•ì˜ ê°€ì ¸ì˜¤ê¸°ê°€ 많아요, ê°€ì ¸ì˜¬ 수 없어요" +msgstr "íŒŒì¼ %sì„(를) 가리키는 다른 ìœ í˜•ì˜ ê°€ì ¸ì˜¤ê¸°ê°€ 많아요. ê°€ì ¸ì˜¬ 수 없어요" #: editor/editor_file_system.cpp msgid "(Re)Importing Assets" @@ -1948,7 +1945,7 @@ msgid "" "There is currently no description for this property. Please help us by " "[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" -"현재 ì´ ì†ì„±ì˜ ì„¤ëª…ì´ ì—†ì–´ìš”[color=$color][url=$url]ê´€ë ¨ ì •ë³´ë¥¼ 기여하여[/" +"현재 ì´ ì†ì„±ì˜ ì„¤ëª…ì´ ì—†ì–´ìš”. [color=$color][url=$url]ê´€ë ¨ ì •ë³´ë¥¼ 기여하여[/" "url][/color] ê°œì„ í• ìˆ˜ 있ë„ë¡ ë„와주세요!" #: editor/editor_help.cpp @@ -2014,7 +2011,7 @@ msgstr "ì„¤ì •" #: editor/editor_inspector.cpp msgid "Set Multiple:" -msgstr "다중 ì„¤ì •:" +msgstr "여러 ì„¤ì •:" #: editor/editor_log.cpp msgid "Output:" @@ -2046,7 +2043,7 @@ msgstr "중단하기" #: editor/editor_network_profiler.cpp editor/editor_profiler.cpp #: editor/plugins/animation_state_machine_editor.cpp editor/rename_dialog.cpp msgid "Start" -msgstr "시작" +msgstr "시작하기" #: editor/editor_network_profiler.cpp msgid "%s/s" @@ -2086,7 +2083,7 @@ msgstr "새 ì°½" #: editor/editor_node.cpp msgid "Project export failed with error code %d." -msgstr "프로ì 트를 내보낼 수 없었어요 오류 코드%d." +msgstr "프로ì 트 ë‚´ë³´ë‚´ê¸°ì— ì‹¤íŒ¨í–ˆì–´ìš”. 오류 코드%d." #: editor/editor_node.cpp msgid "Imported resources can't be saved." @@ -2115,11 +2112,11 @@ msgstr "리소스를 다른 ì´ë¦„으로 ì €ìž¥í•˜ê¸°..." #: editor/editor_node.cpp msgid "Can't open file for writing:" -msgstr "파ì¼ì„ ìž‘ì„±í•˜ë ¤ê³ ì—´ 수 없어요:" +msgstr "파ì¼ì„ ìž‘ì„±í•˜ë ¤ê³ ì—´ 수 ì—†ìŒ:" #: editor/editor_node.cpp msgid "Requested file format unknown:" -msgstr "ìš”ì²í•œ íŒŒì¼ í˜•ì‹ì„ ì•Œ 수 없어요:" +msgstr "ìš”ì²í•œ íŒŒì¼ í˜•ì‹ì„ ì•Œ 수 ì—†ìŒ:" #: editor/editor_node.cpp msgid "Error while saving." @@ -2127,7 +2124,7 @@ msgstr "ì €ìž¥ 중 오류." #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp msgid "Can't open '%s'. The file could have been moved or deleted." -msgstr "'%s'ì„(를) ì—´ 수 없어요. 파ì¼ì´ ì´ë™í–ˆê±°ë‚˜ ì‚ì œë나ë´ìš”." +msgstr "'%s'ì„(를) ì—´ 수 없어요. 파ì¼ì´ ì´ë™í–ˆê±°ë‚˜ ì‚ì œëœ ëª¨ì–‘ì´ì—ìš”." #: editor/editor_node.cpp msgid "Error while parsing '%s'." @@ -2174,11 +2171,12 @@ msgid "" "Couldn't save scene. Likely dependencies (instances or inheritance) couldn't " "be satisfied." msgstr "" -"ì”¬ì„ ì €ìž¥í• ìˆ˜ 없어요. ì¢…ì† ê´€ê³„ (ì¸ìŠ¤í„´ìŠ¤ ë˜ëŠ” ìƒì†)ê°€ 만족스럽지 않나ë´ìš”." +"ì”¬ì„ ì €ìž¥í• ìˆ˜ 없어요. (ì¸ìŠ¤í„´ìŠ¤ ë˜ëŠ” ìƒì†ê³¼ ê°™ì€) ì¢…ì† ê´€ê³„ê°€ 만족스럽지 ì•Š" +"ì€ ëª¨ì–‘ì´ì—ìš”." #: editor/editor_node.cpp editor/scene_tree_dock.cpp msgid "Can't overwrite scene that is still open!" -msgstr "ì—´ë ¤ìžˆëŠ” ì”¬ì€ ë®ì–´ 쓸 수 없어요!" +msgstr "ì—´ë ¤ìžˆëŠ” ì”¬ì€ ë®ì–´ì“¸ 수 없어요!" #: editor/editor_node.cpp msgid "Can't load MeshLibrary for merging!" @@ -2261,7 +2259,7 @@ msgstr "" #: editor/editor_node.cpp msgid "There is no defined scene to run." -msgstr "실행하기로 ì •ì˜ëœ ì”¬ì´ ì—†ì–´ìš”." +msgstr "실행하기로 ì •ì˜í•œ ì”¬ì´ ì—†ì–´ìš”." #: editor/editor_node.cpp msgid "Current scene was never saved, please save it prior to running." @@ -2293,7 +2291,7 @@ msgstr "ë¹ ë¥¸ 스í¬ë¦½íŠ¸ 열기..." #: editor/editor_node.cpp msgid "Save & Close" -msgstr "ì €ìž¥ & 닫기" +msgstr "ì €ìž¥í•˜ê¸° & 닫기" #: editor/editor_node.cpp msgid "Save changes to '%s' before closing?" @@ -2321,7 +2319,7 @@ msgstr "네" #: editor/editor_node.cpp msgid "This scene has never been saved. Save before running?" -msgstr "ì´ ì”¬ì€ ì•„ì§ ì €ìž¥í•˜ì§€ 않았네요. 실행하기 ì „ì— ì €ìž¥í• ê¹Œìš”?" +msgstr "ì´ ì”¬ì€ ì•„ì§ ì €ìž¥í•˜ì§€ 않았어요. 실행하기 ì „ì— ì €ìž¥í• ê¹Œìš”?" #: editor/editor_node.cpp editor/scene_tree_dock.cpp msgid "This operation can't be done without a scene." @@ -2333,7 +2331,7 @@ msgstr "메시 ë¼ì´ë¸ŒëŸ¬ë¦¬ 내보내기" #: editor/editor_node.cpp msgid "This operation can't be done without a root node." -msgstr "ì´ ìž‘ì—…ì€ ë£¨íŠ¸ 노드가 ì—†ì´ëŠ” 불가능합니다." +msgstr "ì´ ìž‘ì—…ì—는 루트 노드가 필요해요." #: editor/editor_node.cpp msgid "Export Tile Set" @@ -2341,15 +2339,15 @@ msgstr "타ì¼ì…‹ 내보내기" #: editor/editor_node.cpp msgid "This operation can't be done without a selected node." -msgstr "ì´ ìž‘ì—…ì—는 노드를 ì„ íƒí•´ 놓아야 í•´ìš”." +msgstr "ì´ ìž‘ì—…ì—는 ì„ íƒí•œ 노드가 필요해요." #: editor/editor_node.cpp msgid "Current scene not saved. Open anyway?" -msgstr "현재 ì”¬ì„ ì €ìž¥í•˜ì§€ 않았네요. ë¬´ì‹œí•˜ê³ ì—´ê¹Œìš”?" +msgstr "현재 ì”¬ì„ ì €ìž¥í•˜ì§€ 않았어요. ë¬´ì‹œí•˜ê³ ì—´ê¹Œìš”?" #: editor/editor_node.cpp msgid "Can't reload a scene that was never saved." -msgstr "ì €ìž¥í•˜ì§€ ì•Šì€ ì”¬ì„ ë‹¤ì‹œ 불러올 수는 없어요." +msgstr "ì €ìž¥í•˜ì§€ ì•Šì€ ì”¬ì€ ë‹¤ì‹œ 불러올 수 없어요." #: editor/editor_node.cpp msgid "Revert" @@ -2365,7 +2363,7 @@ msgstr "ë¹ ë¥¸ 씬 실행하기..." #: editor/editor_node.cpp msgid "Quit" -msgstr "종료" +msgstr "종료하기" #: editor/editor_node.cpp msgid "Exit the editor?" @@ -2377,7 +2375,7 @@ msgstr "프로ì 트 ë§¤ë‹ˆì €ë¥¼ 열까요?" #: editor/editor_node.cpp msgid "Save & Quit" -msgstr "ì €ìž¥í•˜ê³ ì¢…ë£Œí•˜ê¸°" +msgstr "ì €ìž¥í•˜ê¸° & 종료하기" #: editor/editor_node.cpp msgid "Save changes to the following scene(s) before quitting?" @@ -2410,7 +2408,7 @@ msgstr "ë‹«ì€ ì”¬ 다시 열기" #: editor/editor_node.cpp msgid "Unable to enable addon plugin at: '%s' parsing of config failed." msgstr "" -"ì• ë“œì˜¨ 플러그ì¸ì„ 여기서 켤 수 ì—†ìŒ: '%s' ì„¤ì •ì„ êµ¬ë¬¸ 분ì„í• ìˆ˜ 없어요." +"ì• ë“œì˜¨ 플러그ì¸ì„ 여기서 켤 수 ì—†ìŒ: '%s' ì„¤ì •ì„ êµ¬ë¬¸ 분ì„í• ìˆ˜ 없어요." #: editor/editor_node.cpp msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." @@ -2425,8 +2423,8 @@ msgid "" "Unable to load addon script from path: '%s' There seems to be an error in " "the code, please check the syntax." msgstr "" -"ë‹¤ìŒ ê²½ë¡œì—ì„œ ì• ë“œì˜¨ 스í¬ë¦½íŠ¸ë¥¼ 불러올 수 ì—†ìŒ: '%s' ì½”ë“œì˜ ì˜¤ë¥˜ê°€ 있는 것 ê°™" -"ì€ë°, ë¬¸ë²•ì„ í™•ì¸í•´ë´ìš”." +"ë‹¤ìŒ ê²½ë¡œì—ì„œ ì• ë“œì˜¨ 스í¬ë¦½íŠ¸ë¥¼ 불러올 수 ì—†ìŒ: '%s' ì½”ë“œì— ì˜¤ë¥˜ê°€ 있는 모양" +"ì´ì—ìš”. ë¬¸ë²•ì„ í™•ì¸í•´ë³´ì„¸ìš”." #: editor/editor_node.cpp msgid "" @@ -2447,19 +2445,19 @@ msgid "" "To make changes to it, a new inherited scene can be created." msgstr "" "씬 '%s'ì„(를) ìžë™ìœ¼ë¡œ ê°€ì ¸ì™”ê¸° 때문ì—, ìˆ˜ì •í• ìˆ˜ 없어요.\n" -"ì´ ì”¬ì„ íŽ¸ì§‘í•˜ë ¤ë©´, 새로운 ìƒì† ì”¬ì„ ë§Œë“¤ì–´ì•¼ í•´ìš”." +"ì´ ì”¬ì„ íŽ¸ì§‘í•˜ë ¤ë©´ 새로운 ìƒì† ì”¬ì„ ë§Œë“¤ì–´ì•¼ í•´ìš”." #: editor/editor_node.cpp msgid "" "Error loading scene, it must be inside the project path. Use 'Import' to " "open the scene, then save it inside the project path." msgstr "" -"ì”¬ì„ ë¶ˆëŸ¬ì˜¤ëŠ” 중 오류가 ë°œìƒí–ˆì–´ìš”, 프로ì 트 ê²½ë¡œì— ìžˆì„ ê±°ì˜ˆìš”. 'ê°€ì ¸ì˜¤" +"ì”¬ì„ ë¶ˆëŸ¬ì˜¤ëŠ” 중 오류가 ë°œìƒí–ˆì–´ìš”. ì”¬ì€ í”„ë¡œì 트 ê²½ë¡œì— ìžˆì„ ê±°ì˜ˆìš”. 'ê°€ì ¸ì˜¤" "기'를 사용해서 ì”¬ì„ ì—´ê³ , ê·¸ ì”¬ì„ í”„ë¡œì 트 경로 ì•ˆì— ì €ìž¥í•˜ì„¸ìš”." #: editor/editor_node.cpp msgid "Scene '%s' has broken dependencies:" -msgstr "씬 '%s'ì˜ ì¢…ì† í•ëª©ì´ 깨ì§:" +msgstr "씬 '%s'ì˜ ì¢…ì† í•ëª©ì´ ë§ê°€ì§:" #: editor/editor_node.cpp msgid "Clear Recent Scenes" @@ -2489,7 +2487,7 @@ msgid "" "You can change it later in \"Project Settings\" under the 'application' " "category." msgstr "" -"ì„ íƒí•œ 씬 '%s'ì€(는) 씬 파ì¼ì´ 아니네요, 다른 씬으로 ì •í• ê¹Œìš”?\n" +"ì„ íƒí•œ 씬 '%s'ì€(는) 씬 파ì¼ì´ 아니ì—ìš”, 다른 씬으로 ì •í• ê¹Œìš”?\n" "ì´ê±´ ë‚˜ì¤‘ì— \"프로ì 트 ì„¤ì •\"ì˜ 'application' ì¹´í…Œê³ ë¦¬ì—ì„œ 바꿀 수 있어요." #: editor/editor_node.cpp @@ -2540,15 +2538,15 @@ msgstr "씬 íƒ ì „í™˜í•˜ê¸°" #: editor/editor_node.cpp msgid "%d more files or folders" -msgstr "ê·¸ 외 %dê°œì˜ íŒŒì¼ ë˜ëŠ” í´ë”" +msgstr "외 %dê°œì˜ íŒŒì¼ ë˜ëŠ” í´ë”" #: editor/editor_node.cpp msgid "%d more folders" -msgstr "ê·¸ 외 %dê°œì˜ í´ë”" +msgstr "외 %dê°œì˜ í´ë”" #: editor/editor_node.cpp msgid "%d more files" -msgstr "ê·¸ 외 %dê°œì˜ íŒŒì¼" +msgstr "외 %dê°œì˜ íŒŒì¼" #: editor/editor_node.cpp msgid "Dock Position" @@ -2564,7 +2562,7 @@ msgstr "집중 모드 í† ê¸€." #: editor/editor_node.cpp msgid "Add a new scene." -msgstr "새 씬 추가하기." +msgstr "새 ì”¬ì„ ì¶”ê°€í•´ìš”." #: editor/editor_node.cpp msgid "Scene" @@ -2572,7 +2570,7 @@ msgstr "씬" #: editor/editor_node.cpp msgid "Go to previously opened scene." -msgstr "ì´ì „ì— ì—´ì—ˆë˜ ì”¬ìœ¼ë¡œ 가기." +msgstr "ì´ì „ì— ì—´ì—ˆë˜ ì”¬ìœ¼ë¡œ 가요." #: editor/editor_node.cpp msgid "Copy Text" @@ -2592,7 +2590,7 @@ msgstr "íŒŒì¼ í•„í„°..." #: editor/editor_node.cpp msgid "Operations with scene files." -msgstr "씬 파ì¼ë¡œ 작업하기." +msgstr "씬 파ì¼ë¡œ ìž‘ì—…í•´ìš”." #: editor/editor_node.cpp msgid "New Scene" @@ -2863,15 +2861,15 @@ msgstr "ì •ë³´" #: editor/editor_node.cpp msgid "Play the project." -msgstr "프로ì 트 실행하기." +msgstr "프로ì 트를 실행해요." #: editor/editor_node.cpp msgid "Play" msgstr "실행하기" #: editor/editor_node.cpp -msgid "Pause the scene" -msgstr "씬 멈추기" +msgid "Pause the scene execution for debugging." +msgstr "ë””ë²„ê¹…ì„ í•˜ê¸° 위해 씬 ì‹¤í–‰ì„ ë©ˆì¶°ìš”." #: editor/editor_node.cpp msgid "Pause Scene" @@ -2879,11 +2877,11 @@ msgstr "씬 멈추기" #: editor/editor_node.cpp msgid "Stop the scene." -msgstr "씬 중단하기." +msgstr "ì”¬ì„ ë©ˆì¶°ìš”." #: editor/editor_node.cpp msgid "Play the edited scene." -msgstr "편집 ì¤‘ì¸ ì”¬ 실행하기." +msgstr "íŽ¸ì§‘í•˜ê³ ìžˆë˜ ì”¬ì„ ì‹¤í–‰í•´ìš”." #: editor/editor_node.cpp msgid "Play Scene" @@ -2891,15 +2889,15 @@ msgstr "씬 실행하기" #: editor/editor_node.cpp msgid "Play custom scene" -msgstr "다른 씬 실행하기" +msgstr "맞춤 씬 실행하기" #: editor/editor_node.cpp msgid "Play Custom Scene" -msgstr "맞춤 씬 실행하기" +msgstr "ì”¬ì„ ì§€ì •í•´ì„œ 실행해요" #: editor/editor_node.cpp msgid "Changing the video driver requires restarting the editor." -msgstr "비디오 ë“œë¼ì´ë²„를 ë³€ê²½í•˜ë ¤ë©´ 편집기를 다시 실행해야 í•´ìš”." +msgstr "비디오 ë“œë¼ì´ë²„를 ë³€ê²½í•˜ë ¤ë©´ 편집기를 다시 ê»ë‹¤ 켜야 í•´ìš”." #: editor/editor_node.cpp editor/project_settings_editor.cpp #: editor/settings_config_dialog.cpp @@ -2908,11 +2906,11 @@ msgstr "ì €ìž¥ & 다시 시작하기" #: editor/editor_node.cpp msgid "Spins when the editor window redraws." -msgstr "편집기 ì°½ì´ ë³€í• ë•Œë§ˆë‹¤ ëŒ ê±°ì˜ˆìš”." +msgstr "편집기 ì°½ì— ë³€í™”ê°€ ìžˆì„ ë•Œë§ˆë‹¤ ëŒì•„ìš”." #: editor/editor_node.cpp msgid "Update Continuously" -msgstr "지ì†ì ì—…ë°ì´íŠ¸" +msgstr "ìƒì‹œ ì—…ë°ì´íŠ¸" #: editor/editor_node.cpp msgid "Update When Changed" @@ -2961,7 +2959,7 @@ msgid "" "preset." msgstr "" "\"res://android/build\"ì— ì†ŒìŠ¤ í…œí”Œë¦¿ì„ ì„¤ì¹˜í•´ì„œ, 프로ì 트를 맞춤 안드로ì´ë“œ " -"ë¹Œë“œì— ë§žê²Œ ì„¤ì •í• ê±°ì—ìš”.\n" +"ë¹Œë“œì— ë§žê²Œ ì„¤ì •í• ê±°ì˜ˆìš”.\n" "그런 ë‹¤ìŒ ìˆ˜ì • 사í•ì„ ì ìš©í•˜ê³ ë§žì¶¤ APK를 만들어 내보낼 수 있어요 (모듈 추가" "하기, AndroidManifest.xml 바꾸기 등).\n" "미리 ë¹Œë“œëœ APK를 사용하는 ëŒ€ì‹ ë§žì¶¤ 빌드를 ë§Œë“¤ë ¤ë©´, 안드로ì´ë“œ 내보내기 프" @@ -2974,7 +2972,7 @@ msgid "" "Remove the \"res://android/build\" directory manually before attempting this " "operation again." msgstr "" -"안드로ì´ë“œ 빌드 í…œí”Œë¦¿ì„ ì´ë¯¸ 설치한 ë°ë‹¤ê°€ ë®ì–´ 쓸 수 없네요.\n" +"안드로ì´ë“œ 빌드 í…œí”Œë¦¿ì´ ì´ë¯¸ ì´ í”„ë¡œì íŠ¸ì— ì„¤ì¹˜í–ˆê³ , ë®ì–´ 쓸 수 없어요.\n" "ì´ ëª…ë ¹ì„ ë‹¤ì‹œ 실행하기 ì „ì— \"res://android/build\" ë””ë ‰í† ë¦¬ë¥¼ ì‚ì œí•˜ì„¸ìš”." #: editor/editor_node.cpp @@ -2999,7 +2997,7 @@ msgstr "암호:" #: editor/editor_node.cpp msgid "Open & Run a Script" -msgstr "스í¬ë¦½íŠ¸ë¥¼ ì—´ê³ ì‹¤í–‰í•˜ê¸°" +msgstr "스í¬ë¦½íŠ¸ 열기 & 실행하기" #: editor/editor_node.cpp msgid "New Inherited" @@ -3043,7 +3041,7 @@ msgstr "하위 리소스를 ì°¾ì„ ìˆ˜ 없어요." #: editor/editor_plugin.cpp msgid "Creating Mesh Previews" -msgstr "메시 미리보기 ìƒì„± 중" +msgstr "메시 미리 보기 만들기" #: editor/editor_plugin.cpp msgid "Thumbnail..." @@ -3161,7 +3159,7 @@ msgid "" "Can't create a ViewportTexture on resources saved as a file.\n" "Resource needs to belong to a scene." msgstr "" -"파ì¼ë¡œ ì €ìž¥í•œ ë¦¬ì†ŒìŠ¤ì— ViewportTexture를 만들 수는 없어요.\n" +"파ì¼ë¡œ ì €ìž¥í•œ ë¦¬ì†ŒìŠ¤ì— ViewportTexture를 만들 수 없어요.\n" "리소스가 ì”¬ì— ì†í•´ 있어야 í•´ìš”." #: editor/editor_properties.cpp @@ -3178,7 +3176,7 @@ msgstr "" #: editor/editor_properties.cpp editor/property_editor.cpp msgid "Pick a Viewport" -msgstr "ë·°í¬íŠ¸ ì„ íƒí•˜ê¸°" +msgstr "ë·°í¬íŠ¸ë¥¼ ì„ íƒí•˜ì„¸ìš”" #: editor/editor_properties.cpp editor/property_editor.cpp msgid "New Script" @@ -3322,7 +3320,7 @@ msgstr "(현재)" #: editor/export_template_manager.cpp msgid "Retrieving mirrors, please wait..." -msgstr "미러를 검색 중ì´ì—ìš”, ê¸°ë‹¤ë ¤ì£¼ì„¸ìš”..." +msgstr "미러를 검색 중ì´ì—ìš”. ê¸°ë‹¤ë ¤ì£¼ì„¸ìš”..." #: editor/export_template_manager.cpp msgid "Remove template version '%s'?" @@ -3363,12 +3361,12 @@ msgstr "" #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp msgid "Can't resolve." -msgstr "í•´ê²°í• ìˆ˜ ì—†ìŒ." +msgstr "í•´ê²°í• ìˆ˜ 없어요." #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp msgid "Can't connect." -msgstr "ì—°ê²°í• ìˆ˜ ì—†ìŒ." +msgstr "ì—°ê²°í• ìˆ˜ 없어요." #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -3386,7 +3384,7 @@ msgstr "리다ì´ë ‰íŠ¸ 루프." #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp msgid "Failed:" -msgstr "실패:" +msgstr "실패함:" #: editor/export_template_manager.cpp msgid "Download Complete." @@ -3497,7 +3495,7 @@ msgstr "ì¦ê²¨ì°¾ê¸°" #: editor/filesystem_dock.cpp msgid "Status: Import of file failed. Please fix file and reimport manually." msgstr "" -"ìƒíƒœ: íŒŒì¼ ê°€ì ¸ì˜¤ê¸°ì— ì‹¤íŒ¨í–ˆì–´ìš”. 수ë™ìœ¼ë¡œ 파ì¼ì„ ìˆ˜ì •í•˜ê³ ë‹¤ì‹œ ê°€ì ¸ì™€ 주세" +"ìƒíƒœ: íŒŒì¼ ê°€ì ¸ì˜¤ê¸°ì— ì‹¤íŒ¨í–ˆì–´ìš”. 수ë™ìœ¼ë¡œ 파ì¼ì„ ìˆ˜ì •í•˜ê³ ë‹¤ì‹œ ê°€ì ¸ 와주세" "ìš”." #: editor/filesystem_dock.cpp @@ -3557,12 +3555,16 @@ msgid "New Inherited Scene" msgstr "새 ìƒì† 씬" #: editor/filesystem_dock.cpp +msgid "Set As Main Scene" +msgstr "ë©”ì¸ ì”¬ìœ¼ë¡œ ì„¤ì •í•˜ê¸°" + +#: editor/filesystem_dock.cpp msgid "Open Scenes" msgstr "씬 열기" #: editor/filesystem_dock.cpp msgid "Instance" -msgstr "ì¸ìŠ¤í„´ìŠ¤" +msgstr "ì¸ìŠ¤í„´ìŠ¤í•˜ê¸°" #: editor/filesystem_dock.cpp msgid "Add to Favorites" @@ -3646,7 +3648,7 @@ msgid "" "Scanning Files,\n" "Please Wait..." msgstr "" -"íŒŒì¼ ìŠ¤ìº” 중,\n" +"íŒŒì¼ ìŠ¤ìº” 중ì´ì—ìš”.\n" "ê¸°ë‹¤ë ¤ì£¼ì„¸ìš”..." #: editor/filesystem_dock.cpp @@ -3690,8 +3692,8 @@ msgid "" "Include the files with the following extensions. Add or remove them in " "ProjectSettings." msgstr "" -"해당 확장ìžëª…으로 ëœ íŒŒì¼ì´ 있어요. 프로ì 트 ì„¤ì •ì— íŒŒì¼ì„ 추가하거나 ì‚ì œí•˜" -"세요." +"해당 í™•ìž¥ìž ì´ë¦„ì„ ê°–ëŠ” 파ì¼ì´ 있어요. 프로ì 트 ì„¤ì •ì— íŒŒì¼ì„ 추가하거나 ì‚ì œ" +"하세요." #: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp @@ -3716,7 +3718,7 @@ msgstr "바꾸기: " #: editor/find_in_files.cpp msgid "Replace all (no undo)" -msgstr "ì „ë¶€ 바꾸기 (ë˜ëŒë¦´ 수 없어요)" +msgstr "ëª¨ë‘ ë°”ê¾¸ê¸° (ë˜ëŒë¦´ 수 없어요)" #: editor/find_in_files.cpp msgid "Searching..." @@ -3740,7 +3742,7 @@ msgstr "ì´ ê·¸ë£¹ ì´ë¦„ì€ ì´ë¯¸ 누가 ì“°ê³ ìžˆì–´ìš”." #: editor/groups_editor.cpp msgid "Invalid group name." -msgstr "ì´ ê·¸ë£¹ ì´ë¦„ì€ ìž˜ëª»ë˜ì—ˆì–´ìš”." +msgstr "ì´ ê·¸ë£¹ ì´ë¦„ì€ ìž˜ëª»ëì–´ìš”." #: editor/groups_editor.cpp msgid "Rename Group" @@ -3752,7 +3754,7 @@ msgstr "그룹 ì‚ì œí•˜ê¸°" #: editor/groups_editor.cpp editor/node_dock.cpp msgid "Groups" -msgstr "그룹(Group)" +msgstr "그룹" #: editor/groups_editor.cpp msgid "Nodes Not in Group" @@ -3769,7 +3771,7 @@ msgstr "ê·¸ë£¹ì— ì†í•œ 노드" #: editor/groups_editor.cpp msgid "Empty groups will be automatically removed." -msgstr "빈 ê·¸ë£¹ì€ ìžë™ìœ¼ë¡œ ì‚ì œë˜ìš”." +msgstr "빈 ê·¸ë£¹ì€ ìžë™ìœ¼ë¡œ ì‚ì œë¼ìš”." #: editor/groups_editor.cpp msgid "Group Editor" @@ -3842,15 +3844,15 @@ msgstr "맞춤 스í¬ë¦½íŠ¸ 실행 중..." #: editor/import/resource_importer_scene.cpp msgid "Couldn't load post-import script:" -msgstr "ê°€ì ¸ì˜¤ê¸° 후 스í¬ë¦½íŠ¸ë¥¼ 불러올 수 ì—†ìŒ:" +msgstr "후 ê°€ì ¸ì˜¤ê¸° 스í¬ë¦½íŠ¸ë¥¼ 불러올 수 ì—†ìŒ:" #: editor/import/resource_importer_scene.cpp msgid "Invalid/broken script for post-import (check console):" -msgstr "ê°€ì ¸ì˜¤ê¸° 후 스í¬ë¦½íŠ¸ê°€ 잘못ë˜ê±°ë‚˜ ê³ ìž¥ë‚¨ (ì½˜ì†”ì„ í™•ì¸í•˜ì„¸ìš”):" +msgstr "후 ê°€ì ¸ì˜¤ê¸° ìš© 스í¬ë¦½íŠ¸ê°€ 잘못ë¨/ë§ê°€ì§ (ì½˜ì†”ì„ í™•ì¸í•˜ì„¸ìš”):" #: editor/import/resource_importer_scene.cpp msgid "Error running post-import script:" -msgstr "ê°€ì ¸ì˜¤ê¸° 후 스í¬ë¦½íŠ¸ 실행 중 오류:" +msgstr "후 ê°€ì ¸ì˜¤ê¸° 스í¬ë¦½íŠ¸ 실행 중 오류:" #: editor/import/resource_importer_scene.cpp msgid "Saving..." @@ -3892,7 +3894,7 @@ msgstr "ê°€ì ¸ì˜¨ 파ì¼ì˜ ìœ í˜•ì„ ë°”ê¾¸ë ¤ë©´ 편집기를 다시 켜아 í• msgid "" "WARNING: Assets exist that use this resource, they may stop loading properly." msgstr "" -"ê²½ê³ : ì´ ë¦¬ì†ŒìŠ¤ë¥¼ 사용하는 ì• ì…‹ì´ ìžˆì–´ìš”, ì •ìƒì 으로 불러오지 ëª»í• ìˆ˜ë„ ìžˆì–´" +"ê²½ê³ : ì´ ë¦¬ì†ŒìŠ¤ë¥¼ 사용하는 ì• ì…‹ì´ ìžˆì–´ìš”. ì •ìƒì 으로 불러오지 ëª»í• ìˆ˜ë„ ìžˆì–´" "ìš”." #: editor/inspector_dock.cpp @@ -3914,11 +3916,11 @@ msgstr "다른 ì´ë¦„으로 ì €ìž¥..." #: editor/inspector_dock.cpp msgid "Copy Params" -msgstr "ì†ì„± 복사하기" +msgstr "매개변수 복사하기" #: editor/inspector_dock.cpp msgid "Paste Params" -msgstr "ì†ì„± 붙여넣기" +msgstr "매개변수 붙여넣기" #: editor/inspector_dock.cpp msgid "Edit Resource Clipboard" @@ -3942,27 +3944,27 @@ msgstr "ë„움ë§ì—ì„œ 열기" #: editor/inspector_dock.cpp msgid "Create a new resource in memory and edit it." -msgstr "새 리소스를 메모리ì—ì„œ ë§Œë“¤ê³ íŽ¸ì§‘í•˜ê¸°." +msgstr "새 리소스를 메모리ì—ì„œ ë§Œë“¤ê³ íŽ¸ì§‘í•´ìš”." #: editor/inspector_dock.cpp msgid "Load an existing resource from disk and edit it." -msgstr "디스í¬ì—ì„œ 기존 리소스를 ë¶ˆëŸ¬ì˜¤ê³ íŽ¸ì§‘í•˜ê¸°." +msgstr "디스í¬ì—ì„œ 기존 리소스를 ë¶ˆëŸ¬ì˜¤ê³ íŽ¸ì§‘í•´ìš”." #: editor/inspector_dock.cpp msgid "Save the currently edited resource." -msgstr "현재 편집하는 리소스를 ì €ìž¥í•˜ê¸°." +msgstr "현재 편집하는 리소스를 ì €ìž¥í•´ìš”." #: editor/inspector_dock.cpp msgid "Go to the previous edited object in history." -msgstr "기ë¡ì—ì„œ ì´ì „ì— íŽ¸ì§‘í•œ ê°ì²´ë¡œ 가기." +msgstr "기ë¡ì—ì„œ ì´ì „ì— íŽ¸ì§‘í•œ ê°ì²´ë¡œ 가요." #: editor/inspector_dock.cpp msgid "Go to the next edited object in history." -msgstr "기ë¡ì—ì„œ 다ìŒì— 편집한 ê°ì²´ë¡œ 가기." +msgstr "기ë¡ì—ì„œ 다ìŒì— 편집한 ê°ì²´ë¡œ 가요." #: editor/inspector_dock.cpp msgid "History of recently edited objects." -msgstr "ìµœê·¼ì— íŽ¸ì§‘í•œ ê°ì²´ 기ë¡." +msgstr "ìµœê·¼ì— íŽ¸ì§‘í•œ ê°ì²´ 기ë¡ì´ì—ìš”." #: editor/inspector_dock.cpp msgid "Object properties." @@ -3974,7 +3976,7 @@ msgstr "í•„í„° ì†ì„±" #: editor/inspector_dock.cpp msgid "Changes may be lost!" -msgstr "변경사í•ì„ ìžƒì„ ìˆ˜ë„ ìžˆì–´ìš”!" +msgstr "변경 사í•ì„ ìžƒì„ ìˆ˜ë„ ìžˆì–´ìš”!" #: editor/multi_node_edit.cpp msgid "MultiNode Set" @@ -4114,7 +4116,7 @@ msgid "" "AnimationTree is inactive.\n" "Activate to enable playback, check node warnings if activation fails." msgstr "" -"AnimationTree ê°€ êº¼ì ¸ 있어요.\n" +"AnimationTreeê°€ êº¼ì ¸ 있어요.\n" "재ìƒí•˜ë ¤ë©´ AnimationTree를 ì¼œê³ , ì‹¤í–‰ì— ì‹¤íŒ¨í•˜ë©´ 노드 ê²½ê³ ë¥¼ 확ì¸í•˜ì„¸ìš”." #: editor/plugins/animation_blend_space_1d_editor.cpp @@ -4125,12 +4127,12 @@ msgstr "공간 ë‚´ì˜ í˜¼í•© 지ì ì„¤ì •í•˜ê¸°" #: editor/plugins/animation_blend_space_1d_editor.cpp #: editor/plugins/animation_blend_space_2d_editor.cpp msgid "Select and move points, create points with RMB." -msgstr "ì ì„ ì„ íƒí•˜ê³ ì´ë™í•´ìš”, ìš°í´ë¦ìœ¼ë¡œ ì ì„ ë§Œë“œì„¸ìš”." +msgstr "ì ì„ ì„ íƒí•˜ê³ ì´ë™í•´ìš”. ìš°í´ë¦ìœ¼ë¡œ ì ì„ ë§Œë“œì„¸ìš”." #: editor/plugins/animation_blend_space_1d_editor.cpp #: editor/plugins/animation_blend_space_2d_editor.cpp scene/gui/graph_edit.cpp msgid "Enable snap and show grid." -msgstr "ìŠ¤ëƒ…ì„ ì¼œë©´ì„œ 격ìžë¥¼ ë³´ì´ê¸°." +msgstr "ìŠ¤ëƒ…ì„ ì¼œê³ ê²©ìžë¥¼ ë³´ì´ê²Œ í•´ìš”." #: editor/plugins/animation_blend_space_1d_editor.cpp #: editor/plugins/animation_blend_space_2d_editor.cpp @@ -4176,11 +4178,11 @@ msgstr "BlendSpace2D 삼ê°í˜• ì‚ì œí•˜ê¸°" #: editor/plugins/animation_blend_space_2d_editor.cpp msgid "BlendSpace2D does not belong to an AnimationTree node." -msgstr "BlendSpace2Dê°€ AnimationTree ë…¸ë“œì— ì†í•´ìžˆì§€ 않네요." +msgstr "BlendSpace2Dê°€ AnimationTree ë…¸ë“œì— ì†í•´ìžˆì§€ ì•Šì•„ìš”." #: editor/plugins/animation_blend_space_2d_editor.cpp msgid "No triangles exist, so no blending can take place." -msgstr "삼ê°í˜•ì´ 없어요, í˜¼í•©ì´ ì¼ì–´ë‚˜ì§€ ì•Šì„ ê±°ì˜ˆìš”." +msgstr "삼ê°í˜•ì´ 없어요. í˜¼í•©ì´ ì¼ì–´ë‚˜ì§€ ì•Šì„ ê±°ì˜ˆìš”." #: editor/plugins/animation_blend_space_2d_editor.cpp msgid "Toggle Auto Triangles" @@ -4188,7 +4190,7 @@ msgstr "ìžë™ 삼ê°í˜• í† ê¸€" #: editor/plugins/animation_blend_space_2d_editor.cpp msgid "Create triangles by connecting points." -msgstr "ì ì„ ì—°ê²°í•˜ì—¬ 삼ê°í˜• 만들기." +msgstr "ì ì„ ì—°ê²°í•´ì„œ 삼ê°í˜•ì„ 만들어요." #: editor/plugins/animation_blend_space_2d_editor.cpp msgid "Erase points and triangles." @@ -4227,7 +4229,7 @@ msgstr "노드 ì´ë™ë¨" #: editor/plugins/animation_blend_tree_editor_plugin.cpp msgid "Unable to connect, port may be in use or connection may be invalid." -msgstr "ì—°ê²°í• ìˆ˜ 없어요, í¬íŠ¸ê°€ 사용 중ì´ê±°ë‚˜ ìž˜ëª»ëœ ì—°ê²°ì¼ ê±°ì˜ˆìš”." +msgstr "ì—°ê²°í• ìˆ˜ 없어요. í¬íŠ¸ê°€ 사용 중ì´ê±°ë‚˜ ì—°ê²°ì´ ìž˜ëª»ëœ ëª¨ì–‘ì´ì—ìš”." #: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/visual_shader_editor_plugin.cpp @@ -4264,11 +4266,11 @@ msgstr "í•„í„° 바꾸기" #: editor/plugins/animation_blend_tree_editor_plugin.cpp msgid "No animation player set, so unable to retrieve track names." msgstr "" -"ì• ë‹ˆë©”ì´ì…˜ í”Œë ˆì´ì–´ê°€ ì„¤ì •ë˜ì§€ 않았어요, 그래서 트랙 ì´ë¦„ì„ ê²€ìƒ‰í• ìˆ˜ 없어요." +"ì• ë‹ˆë©”ì´ì…˜ í”Œë ˆì´ì–´ê°€ ì„¤ì •ë˜ì§€ 않았어요. 그래서 트랙 ì´ë¦„ì„ ê²€ìƒ‰í• ìˆ˜ 없어요." #: editor/plugins/animation_blend_tree_editor_plugin.cpp msgid "Player path set is invalid, so unable to retrieve track names." -msgstr "í”Œë ˆì´ì–´ 경로 ì„¤ì •ì´ ìž˜ëª»ëì–´ìš”, 그래서 트랙 ì´ë¦„ì„ ê²€ìƒ‰í• ìˆ˜ 없어요." +msgstr "í”Œë ˆì´ì–´ 경로 ì„¤ì •ì´ ìž˜ëª»ëì–´ìš”. 그래서 트랙 ì´ë¦„ì„ ê²€ìƒ‰í• ìˆ˜ 없어요." #: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/root_motion_editor_plugin.cpp @@ -4276,10 +4278,22 @@ msgid "" "Animation player has no valid root node path, so unable to retrieve track " "names." msgstr "" -"ì• ë‹ˆë©”ì´ì…˜ í”Œë ˆì´ì–´ê°€ ìž˜ëª»ëœ ë£¨íŠ¸ 경로를 ê°–ê³ ìžˆì–´ìš”, 그래서 트랙 ì´ë¦„ì„ ê²€ìƒ‰" +"ì• ë‹ˆë©”ì´ì…˜ í”Œë ˆì´ì–´ê°€ ìž˜ëª»ëœ ë£¨íŠ¸ 경로를 ê°–ê³ ìžˆì–´ìš”. 그래서 트랙 ì´ë¦„ì„ ê²€ìƒ‰" "í• ìˆ˜ 없어요." #: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Anim Clips" +msgstr "ì• ë‹ˆë©”ì´ì…˜ í´ë¦½" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Audio Clips" +msgstr "오디오 í´ë¦½" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Functions" +msgstr "함수" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/animation_state_machine_editor.cpp msgid "Node Renamed" msgstr "노드 ì´ë¦„ 바뀜" @@ -4375,23 +4389,23 @@ msgstr "íŽ¸ì§‘í• ì• ë‹ˆë©”ì´ì…˜ì´ 없어요!" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Play selected animation backwards from current pos. (A)" -msgstr "ì„ íƒí•œ ì• ë‹ˆë©”ì´ì…˜ì„ 현재 위치ì—ì„œ 거꾸로 재ìƒí•˜ê¸°. (A)" +msgstr "ì„ íƒí•œ ì• ë‹ˆë©”ì´ì…˜ì„ 현재 위치ì—ì„œ 거꾸로 재ìƒí•´ìš”. (A)" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Play selected animation backwards from end. (Shift+A)" -msgstr "ì„ íƒí•œ ì• ë‹ˆë©”ì´ì…˜ì„ ëì—ì„œ 거꾸로 재ìƒí•˜ê¸°. (Shift+A)" +msgstr "ì„ íƒí•œ ì• ë‹ˆë©”ì´ì…˜ì„ ëì—ì„œ 거꾸로 재ìƒí•´ìš”. (Shift+A)" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Stop animation playback. (S)" -msgstr "ì• ë‹ˆë©”ì´ì…˜ ìž¬ìƒ ì •ì§€í•˜ê¸°. (S)" +msgstr "ì• ë‹ˆë©”ì´ì…˜ 재ìƒì„ 멈춰요. (S)" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Play selected animation from start. (Shift+D)" -msgstr "ì„ íƒí•œ ì• ë‹ˆë©”ì´ì…˜ì„ 처ìŒë¶€í„° 재ìƒí•˜ê¸°. (Shift+D)" +msgstr "ì„ íƒí•œ ì• ë‹ˆë©”ì´ì…˜ì„ 처ìŒë¶€í„° 재ìƒí•´ìš”. (Shift+D)" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Play selected animation from current pos. (D)" -msgstr "ì„ íƒí•œ ì• ë‹ˆë©”ì´ì…˜ì„ 현재 위치부터 재ìƒí•˜ê¸°. (D)" +msgstr "ì„ íƒí•œ ì• ë‹ˆë©”ì´ì…˜ì„ 현재 위치부터 재ìƒí•´ìš”. (D)" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation position (in seconds)." @@ -4399,7 +4413,7 @@ msgstr "ì• ë‹ˆë©”ì´ì…˜ 위치 (ì´ˆ)." #: editor/plugins/animation_player_editor_plugin.cpp msgid "Scale animation playback globally for the node." -msgstr "ë…¸ë“œì˜ ì• ë‹ˆë©”ì´ì…˜ ìž¬ìƒ ê¸¸ì´ë¥¼ ì „ì²´ì 으로 ì¡°ì ˆí•˜ê¸°." +msgstr "ë…¸ë“œì˜ ì• ë‹ˆë©”ì´ì…˜ ìž¬ìƒ ê¸¸ì´ë¥¼ ì „ì²´ì 으로 ì¡°ì ˆí•´ìš”." #: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation Tools" @@ -4420,7 +4434,7 @@ msgstr "ì¸ìŠ¤íŽ™í„°ì—ì„œ 열기" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Display list of animations in player." -msgstr "ì• ë‹ˆë©”ì´ì…˜ ëª©ë¡ í‘œì‹œí•˜ê¸°." +msgstr "ì• ë‹ˆë©”ì´ì…˜ 목ë¡ì„ 표시해요." #: editor/plugins/animation_player_editor_plugin.cpp msgid "Autoplay on Load" @@ -4536,7 +4550,7 @@ msgstr "ëì—ì„œ" #: editor/plugins/animation_state_machine_editor.cpp msgid "Travel" -msgstr "ì´ë™í•˜ê¸°" +msgstr "진행" #: editor/plugins/animation_state_machine_editor.cpp msgid "Start and end nodes are needed for a sub-transition." @@ -4570,20 +4584,19 @@ msgstr "" #: editor/plugins/animation_state_machine_editor.cpp msgid "Create new nodes." -msgstr "새 노드 만들기." +msgstr "새 노드를 만들어요." #: editor/plugins/animation_state_machine_editor.cpp msgid "Connect nodes." -msgstr "노드 연결하기." +msgstr "노드를 ì—°ê²°í•´ìš”." #: editor/plugins/animation_state_machine_editor.cpp msgid "Remove selected node or transition." -msgstr "ì„ íƒí•œ 노드나 ì „í™˜ ì‚ì œí•˜ê¸°." +msgstr "ì„ íƒí•œ 노드나 ì „í™˜ì„ ì‚ì œí•´ìš”." #: editor/plugins/animation_state_machine_editor.cpp msgid "Toggle autoplay this animation on start, restart or seek to zero." -msgstr "" -"ì´ ì• ë‹ˆë©”ì´ì…˜ì„ 시작, 다시 시작 í˜¹ì€ 0으로 ê°€ë„ë¡ ìžë™ìœ¼ë¡œ 재ìƒì„ í† ê¸€." +msgstr "ì´ ì• ë‹ˆë©”ì´ì…˜ì„ 시작, 재시작, í˜¹ì€ 0으로 ê°€ë„ë¡ ìžë™ 재ìƒì„ í† ê¸€í•´ìš”." #: editor/plugins/animation_state_machine_editor.cpp msgid "Set the end animation. This is useful for sub-transitions." @@ -4744,7 +4757,7 @@ msgstr "íŒŒì¼ ë³´ê¸°" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Connection error, please try again." -msgstr "ì—°ê²° 오류, 다시 ì‹œë„해주세요." +msgstr "ì—°ê²° 오류. 다시 ì‹œë„해주세요." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Can't connect to host:" @@ -4760,7 +4773,7 @@ msgstr "호스트 ì´ë¦„ì„ ì°¾ì„ ìˆ˜ ì—†ìŒ:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Request failed, return code:" -msgstr "ìš”ì² ì‹¤íŒ¨, 반환 코드:" +msgstr "ìš”ì² ì‹¤íŒ¨. 반환 코드:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Request failed." @@ -4776,7 +4789,7 @@ msgstr "작성 오류." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Request failed, too many redirects" -msgstr "ìš”ì² ì‹¤íŒ¨, 너무 ë§Žì€ ë¦¬ë‹¤ì´ë ‰íŠ¸" +msgstr "ìš”ì² ì‹¤íŒ¨. 너무 ë§Žì€ ë¦¬ë‹¤ì´ë ‰íŠ¸" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Redirect loop." @@ -4784,7 +4797,7 @@ msgstr "리다ì´ë ‰íŠ¸ 루프." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Request failed, timeout" -msgstr "ìš”ì² ì‹¤íŒ¨, 시간 초과" +msgstr "ìš”ì² ì‹¤íŒ¨. 시간 초과" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Timeout." @@ -4792,7 +4805,7 @@ msgstr "시간 초과." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Bad download hash, assuming file has been tampered with." -msgstr "ìž˜ëª»ëœ ë‹¤ìš´ë¡œë“œ í•´ì‹œ, 파ì¼ì´ ë³€ì¡°ëœ ê²ƒ 같아요." +msgstr "ìž˜ëª»ëœ ë‹¤ìš´ë¡œë“œ í•´ì‹œ. 파ì¼ì´ ë³€ì¡°ëœ ê²ƒ 같아요." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Expected:" @@ -4824,7 +4837,7 @@ msgstr "í•´ê²° 중..." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Error making request" -msgstr "ìš”ì² ì˜¤ë¥˜" +msgstr "ìš”ì² ë§Œë“œëŠ” 중 오류" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Idle" @@ -4868,7 +4881,7 @@ msgstr "모ë‘" #: editor/plugins/asset_library_editor_plugin.cpp msgid "No results for \"%s\"." -msgstr "" +msgstr "\"%s\"ì— ëŒ€í•œ 결과가 없어요." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Import..." @@ -4901,7 +4914,7 @@ msgstr "ê³µì‹" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Testing" -msgstr "실험" +msgstr "시험" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Loading..." @@ -4917,7 +4930,7 @@ msgid "" "Save your scene (for images to be saved in the same dir), or pick a save " "path from the BakedLightmap properties." msgstr "" -"ë¼ì´íŠ¸ë§µ ì´ë¯¸ì§€ì˜ ì €ìž¥ 경로를 íŒŒì•…í• ìˆ˜ 없네요.\n" +"ë¼ì´íŠ¸ë§µ ì´ë¯¸ì§€ì˜ ì €ìž¥ 경로를 íŒŒì•…í• ìˆ˜ 없어요.\n" "(ê°™ì€ ê²½ë¡œì— ì´ë¯¸ì§€ë¥¼ ì €ìž¥í• ìˆ˜ 있ë„ë¡) ì”¬ì„ ì €ìž¥í•˜ê±°ë‚˜, BakedLightmap ì†ì„±ì—" "ì„œ ì €ìž¥ 경로를 ì§€ì •í•˜ì„¸ìš”." @@ -4931,7 +4944,7 @@ msgstr "" #: editor/plugins/baked_lightmap_editor_plugin.cpp msgid "Failed creating lightmap images, make sure path is writable." -msgstr "ë¼ì´íŠ¸ë§µ ì´ë¯¸ì§€ ìƒì„± 실패, 작성 가능한 경로ì¸ì§€ 확ì¸í•´ì£¼ì„¸ìš”." +msgstr "ë¼ì´íŠ¸ë§µ ì´ë¯¸ì§€ ìƒì„± 실패. 작성 가능한 경로ì¸ì§€ 확ì¸í•´ì£¼ì„¸ìš”." #: editor/plugins/baked_lightmap_editor_plugin.cpp msgid "Bake Lightmaps" @@ -4955,6 +4968,14 @@ msgid "Grid Step:" msgstr "ê²©ìž ë‹¨ê³„:" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Primary Line Every:" +msgstr "매 첫 ë¼ì¸:" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "steps" +msgstr "단계" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotation Offset:" msgstr "íšŒì „ 오프셋:" @@ -4963,6 +4984,10 @@ msgid "Rotation Step:" msgstr "íšŒì „ 단계:" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale Step:" +msgstr "í¬ê¸° ì¡°ì ˆ 단계:" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move Vertical Guide" msgstr "ìˆ˜ì§ ê°€ì´ë“œ ì´ë™í•˜ê¸°" @@ -5028,7 +5053,7 @@ msgstr "Control ë…¸ë“œì˜ ì•µì»¤ì™€ 여백 ê°’ì˜ í”„ë¦¬ì…‹." msgid "" "When active, moving Control nodes changes their anchors instead of their " "margins." -msgstr "켜게 ë˜ë©´, 움ì§ì´ëŠ” Control 노드는 ì—¬ë°±ì´ ì•„ë‹Œ 앵커를 변경합니다." +msgstr "켜면, Control 노드는 움ì§ì´ë©´ì„œ ì—¬ë°±ì´ ì•„ë‹Œ 앵커를 바꿔요." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Anchors only" @@ -5044,6 +5069,24 @@ msgstr "앵커 바꾸기" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"Overrides game camera with editor viewport camera." +msgstr "" +"게임 ì¹´ë©”ë¼ ë‹¤ì‹œ ì •ì˜í•˜ê¸°\n" +"편집기 ë·°í¬íŠ¸ ì¹´ë©”ë¼ë¡œ 게임 ì¹´ë©”ë¼ë¥¼ 다시 ì •ì˜í•´ìš”." + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"No game instance running." +msgstr "" +"게임 ì¹´ë©”ë¼ ë‹¤ì‹œ ì •ì˜í•˜ê¸°\n" +"ì‹¤í–‰í•˜ê³ ìžˆëŠ” 게임 ì¸ìŠ¤í„´ìŠ¤ê°€ 없어요." + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp msgid "Lock Selected" msgstr "ì„ íƒ í•ëª© ìž ê·¸ê¸°" @@ -5072,7 +5115,7 @@ msgstr "ê°€ì´ë“œ 지우기" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Create Custom Bone(s) from Node(s)" -msgstr "노드ì—ì„œ 커스텀 본 만들기" +msgstr "노드ì—ì„œ 맞춤 본 만들기" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Clear Bones" @@ -5090,7 +5133,7 @@ msgstr "IK ì²´ì¸ ì§€ìš°ê¸°" msgid "" "Warning: Children of a container get their position and size determined only " "by their parent." -msgstr "ê²½ê³ : 컨테ì´ë„ˆì˜ ìžì‹ 규모와 위치는 ë¶€ëª¨ì— ì˜í•´ ê²°ì •ë˜ì–´ìš”." +msgstr "ê²½ê³ : 컨테ì´ë„ˆì˜ ìžì‹ 규모와 위치는 ë¶€ëª¨ì— ì˜í•´ ê²°ì •ë¼ìš”." #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/texture_region_editor_plugin.cpp @@ -5113,7 +5156,7 @@ msgstr "Alt+드래그: ì´ë™í•˜ê¸°" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Press 'v' to Change Pivot, 'Shift+v' to Drag Pivot (while moving)." -msgstr "'v'키로 피벗 바꾸기, 'Shift+v'키로 피벗 드래그 (ì´ë™í•˜ëŠ” ë™ì•ˆ)." +msgstr "'v'키로 피벗 바꾸기. 'Shift+v'키로 피벗 드래그 (ì´ë™í•˜ëŠ” ë™ì•ˆ)." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Alt+RMB: Depth list selection" @@ -5156,24 +5199,20 @@ msgid "Ruler Mode" msgstr "ìž ëª¨ë“œ" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Toggle smart snapping." -msgstr "스냅 í† ê¸€." +msgstr "스마트 스냅 í† ê¸€." #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Use Smart Snap" -msgstr "스냅 사용하기" +msgstr "스마트 스냅 사용하기" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Toggle grid snapping." -msgstr "스냅 í† ê¸€." +msgstr "ê²©ìž ìŠ¤ëƒ… í† ê¸€." #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Use Grid Snap" -msgstr "ê²©ìž ìŠ¤ëƒ…" +msgstr "ê²©ìž ìŠ¤ëƒ… 사용하기" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snapping Options" @@ -5184,6 +5223,10 @@ msgid "Use Rotation Snap" msgstr "íšŒì „ 스냅 사용하기" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Use Scale Snap" +msgstr "스마트 스냅 사용하기" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap Relative" msgstr "ìƒëŒ€ì ì¸ ìŠ¤ëƒ…" @@ -5198,7 +5241,7 @@ msgstr "스마트 스냅" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp msgid "Configure Snap..." -msgstr "스냅 ì„¤ì •..." +msgstr "스냅 ì„¤ì •í•˜ê¸°..." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap to Parent" @@ -5232,7 +5275,7 @@ msgstr "ì„ íƒí•œ ê°ì²´ë¥¼ ê·¸ ìžë¦¬ì— ìž ê°€ìš” (움ì§ì¼ 수 없어요)." #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp msgid "Unlock the selected object (can be moved)." -msgstr "ì„ íƒí•œ ê°ì²´ë¥¼ ìž ê¸ˆ í•´ì œí•´ìš” (움ì§ì¼ 수 있어요)." +msgstr "ì„ íƒí•œ ê°ì²´ë¥¼ ìž ê¸ˆì—ì„œ 풀어요 (움ì§ì¼ 수 있어요)." #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -5266,29 +5309,28 @@ msgid "View" msgstr "보기" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Always Show Grid" -msgstr "ê²©ìž ë³´ê¸°" +msgstr "í•ìƒ ê²©ìž ë³´ì´ê¸°" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Show Helpers" -msgstr "í—¬í¼ ë³´ê¸°" +msgstr "ë„우미 ë³´ì´ê¸°" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Show Rulers" -msgstr "ìž ë³´ê¸°" +msgstr "ìž ë³´ì´ê¸°" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Show Guides" -msgstr "ê°€ì´ë“œ 보기" +msgstr "ê°€ì´ë“œ ë³´ì´ê¸°" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Show Origin" -msgstr "ì›ì 보기" +msgstr "ì›ì ë³´ì´ê¸°" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Show Viewport" -msgstr "ë·°í¬íŠ¸ 보기" +msgstr "ë·°í¬íŠ¸ ë³´ì´ê¸°" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Show Group And Lock Icons" @@ -5324,7 +5366,7 @@ msgstr "키 삽입하기 (ë§ˆìŠ¤í¬ ê¸°ì¤€)." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" -"Auto insert keys when objects are translated, rotated on scaled (based on " +"Auto insert keys when objects are translated, rotated or scaled (based on " "mask).\n" "Keys are only added to existing tracks, no new tracks will be created.\n" "Keys must be inserted manually for the first time." @@ -5422,7 +5464,7 @@ msgstr "방출 ë§ˆìŠ¤í¬ ë¶ˆëŸ¬ì˜¤ê¸°" #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp msgid "Restart" -msgstr "다시 시작" +msgstr "다시 시작하기" #: editor/plugins/cpu_particles_2d_editor_plugin.cpp #: editor/plugins/particles_2d_editor_plugin.cpp @@ -5487,19 +5529,19 @@ msgstr "ê°€ì†" #: editor/plugins/curve_editor_plugin.cpp msgid "Smoothstep" -msgstr "부드러운단계" +msgstr "부드러운 단계" #: editor/plugins/curve_editor_plugin.cpp msgid "Modify Curve Point" -msgstr "커브 ì ìˆ˜ì •í•˜ê¸°" +msgstr "ê³¡ì„ ì ìˆ˜ì •í•˜ê¸°" #: editor/plugins/curve_editor_plugin.cpp msgid "Modify Curve Tangent" -msgstr "커브 탄ì 트 ìˆ˜ì •í•˜ê¸°" +msgstr "ê³¡ì„ íƒ„ì 트 ìˆ˜ì •í•˜ê¸°" #: editor/plugins/curve_editor_plugin.cpp msgid "Load Curve Preset" -msgstr "커브 프리셋 불러오기" +msgstr "ê³¡ì„ í”„ë¦¬ì…‹ 불러오기" #: editor/plugins/curve_editor_plugin.cpp msgid "Add Point" @@ -5523,20 +5565,19 @@ msgstr "프리셋 불러오기" #: editor/plugins/curve_editor_plugin.cpp msgid "Remove Curve Point" -msgstr "커브 ì ì‚ì œí•˜ê¸°" +msgstr "ê³¡ì„ ì ì‚ì œí•˜ê¸°" #: editor/plugins/curve_editor_plugin.cpp msgid "Toggle Curve Linear Tangent" -msgstr "커브 ì„ í˜• 탄ì 트 í† ê¸€" +msgstr "ê³¡ì„ ì„ í˜• 탄ì 트 í† ê¸€" #: editor/plugins/curve_editor_plugin.cpp msgid "Hold Shift to edit tangents individually" msgstr "Shift키를 눌러서 탄ì 트를 개별ì 으로 편집하기" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Right click to add point" -msgstr "ìš°í´ë¦: ì ì‚ì œí•˜ê¸°" +msgstr "ì ì„ ì¶”ê°€í•˜ë ¤ë©´ ìš°í´ë¦" #: editor/plugins/gi_probe_editor_plugin.cpp msgid "Bake GI Probe" @@ -5600,7 +5641,7 @@ msgstr "ê°–ê³ ìžˆëŠ” 메시가 ArrayMesh ìœ í˜•ì´ ì•„ë‹ˆì—ìš”." #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "UV Unwrap failed, mesh may not be manifold?" -msgstr "UV 펼치기를 실패했어요, 메시가 다양한 것 ê°™ì€ë°ìš”?" +msgstr "UV 펼치기를 실패했어요. 메시가 다양한 것 ê°™ì€ë°ìš”?" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "No mesh to debug." @@ -5695,11 +5736,11 @@ msgstr "씬ì—ì„œ ì—…ë°ì´íŠ¸í•˜ê¸°" #: editor/plugins/multimesh_editor_plugin.cpp msgid "No mesh source specified (and no MultiMesh set in node)." msgstr "" -"메시 소스를 ì§€ì •í•˜ì§€ 않았네요 (ê·¸ë¦¬ê³ ë…¸ë“œì— MultiMesh를 ì„¤ì •í•˜ì§€ ì•Šì•˜ê³ ìš”)." +"메시 소스를 ì§€ì •í•˜ì§€ 않았어요 (ê·¸ë¦¬ê³ ë…¸ë“œì— MultiMesh를 ì„¤ì •í•˜ì§€ 않았어요)." #: editor/plugins/multimesh_editor_plugin.cpp msgid "No mesh source specified (and MultiMesh contains no Mesh)." -msgstr "메시 소스를 ì§€ì •í•˜ì§€ 않았네요 (ê·¸ë¦¬ê³ MultiMeshì— ë©”ì‹œê°€ ì—†ê³ ìš”)." +msgstr "메시 소스를 ì§€ì •í•˜ì§€ 않았어요 (ê·¸ë¦¬ê³ MultiMeshì— ë©”ì‹œê°€ 없어요)." #: editor/plugins/multimesh_editor_plugin.cpp msgid "Mesh source is invalid (invalid path)." @@ -5715,7 +5756,7 @@ msgstr "메시 소스가 잘못ëì–´ìš” (Mesh 리소스가 ì—†ìŒ)." #: editor/plugins/multimesh_editor_plugin.cpp msgid "No surface source specified." -msgstr "표면 소스를 ì§€ì •í•˜ì§€ 않았네요." +msgstr "표면 소스를 ì§€ì •í•˜ì§€ 않았어요." #: editor/plugins/multimesh_editor_plugin.cpp msgid "Surface source is invalid (invalid path)." @@ -5751,7 +5792,7 @@ msgstr "ëŒ€ìƒ í‘œë©´:" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Source Mesh:" -msgstr "소스 메시:" +msgstr "ì›ë³¸ 메시:" #: editor/plugins/multimesh_editor_plugin.cpp msgid "X-Axis" @@ -5793,7 +5834,7 @@ msgstr "내비게ì´ì…˜ í´ë¦¬ê³¤ 만들기" #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp msgid "Convert to CPUParticles" -msgstr "CPU파티í´ë¡œ 변환" +msgstr "CPU파티í´ë¡œ 변환하기" #: editor/plugins/particles_2d_editor_plugin.cpp msgid "Generating Visibility Rect" @@ -5801,11 +5842,11 @@ msgstr "가시성 ì§ì‚¬ê°í˜• 만들기" #: editor/plugins/particles_2d_editor_plugin.cpp msgid "Generate Visibility Rect" -msgstr "가시성 ì§ì‚¬ê°í˜•ì„ 만들기" +msgstr "가시성 ì§ì‚¬ê°í˜•ì„ 만들어요" #: editor/plugins/particles_2d_editor_plugin.cpp msgid "Can only set point into a ParticlesMaterial process material" -msgstr "ParticlesMaterial 프로세스 머티리얼 안ì—만 ì ì„ ì„¤ì •í• ìˆ˜ 있ìŒ" +msgstr "ParticlesMaterial 프로세스 머티리얼 안ì—만 ì ì„ ì„¤ì •í• ìˆ˜ 있어요" #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp @@ -5814,11 +5855,11 @@ msgstr "ìƒì„± 시간 (ì´ˆ):" #: editor/plugins/particles_editor_plugin.cpp msgid "The geometry's faces don't contain any area." -msgstr "í˜•íƒœì˜ í‘œë©´ì´ ì˜ì—ì„ ê°–ê³ ìžˆì§€ ì•Šì•„ìš”." +msgstr "í˜•íƒœì˜ í‘œë©´ì— ì˜ì—ì´ ì—†ì–´ìš”." #: editor/plugins/particles_editor_plugin.cpp msgid "The geometry doesn't contain any faces." -msgstr "형태가 ë©´ì„ ê°–ê³ ìžˆì§€ ì•Šì•„ìš”." +msgstr "í˜•íƒœì— ë©´ì´ ì—†ì–´ìš”." #: editor/plugins/particles_editor_plugin.cpp msgid "\"%s\" doesn't inherit from Spatial." @@ -5826,11 +5867,11 @@ msgstr "\"%s\"ì€(는) Spatialì„ ìƒì†ë°›ì§€ ì•Šì•„ìš”." #: editor/plugins/particles_editor_plugin.cpp msgid "\"%s\" doesn't contain geometry." -msgstr "\"%s\"ì´(ê°€) 형태를 ê°–ê³ ìžˆì§€ ì•Šì•„ìš”." +msgstr "\"%s\"ì— í˜•íƒœê°€ 없어요." #: editor/plugins/particles_editor_plugin.cpp msgid "\"%s\" doesn't contain face geometry." -msgstr "\"%s\"ì´(ê°€) ë©´ 형태를 ê°–ê³ ìžˆì§€ ì•Šì•„ìš”." +msgstr "\"%s\"ì— ë©´ 형태가 없어요." #: editor/plugins/particles_editor_plugin.cpp msgid "Create Emitter" @@ -5846,7 +5887,7 @@ msgstr "표면 ì " #: editor/plugins/particles_editor_plugin.cpp msgid "Surface Points+Normal (Directed)" -msgstr "표면 ì +노멀 (지시ëœ)" +msgstr "표면 ì +노멀 (ì§ì ‘)" #: editor/plugins/particles_editor_plugin.cpp msgid "Volume" @@ -5862,7 +5903,7 @@ msgstr "'ParticlesMaterial' ìœ í˜•ì˜ í”„ë¡œì„¸ì„œ ë¨¸í‹°ë¦¬ì–¼ì´ í•„ìš”í•´ìš”. #: editor/plugins/particles_editor_plugin.cpp msgid "Generating AABB" -msgstr "AABB ìƒì„± 중" +msgstr "AABB 만드는 중" #: editor/plugins/particles_editor_plugin.cpp msgid "Generate Visibility AABB" @@ -5874,36 +5915,36 @@ msgstr "AABB 만들기" #: editor/plugins/path_2d_editor_plugin.cpp msgid "Remove Point from Curve" -msgstr "커브ì—ì„œ ì ì‚ì œí•˜ê¸°" +msgstr "ê³¡ì„ ì—ì„œ ì ì‚ì œí•˜ê¸°" #: editor/plugins/path_2d_editor_plugin.cpp msgid "Remove Out-Control from Curve" -msgstr "ì»¤ë¸Œì˜ ì•„ì›ƒ-컨트롤 ì‚ì œí•˜ê¸°" +msgstr "ê³¡ì„ ì˜ ì•„ì›ƒ-컨트롤 ì‚ì œí•˜ê¸°" #: editor/plugins/path_2d_editor_plugin.cpp msgid "Remove In-Control from Curve" -msgstr "ì»¤ë¸Œì˜ ì¸-컨트롤 ì‚ì œí•˜ê¸°" +msgstr "ê³¡ì„ ì˜ ì¸-컨트롤 ì‚ì œí•˜ê¸°" #: editor/plugins/path_2d_editor_plugin.cpp #: editor/plugins/path_editor_plugin.cpp msgid "Add Point to Curve" -msgstr "ì»¤ë¸Œì— ì 추가하기" +msgstr "ê³¡ì„ ì— ì 추가하기" #: editor/plugins/path_2d_editor_plugin.cpp msgid "Split Curve" -msgstr "커브 가르기" +msgstr "ê³¡ì„ ê°€ë¥´ê¸°" #: editor/plugins/path_2d_editor_plugin.cpp msgid "Move Point in Curve" -msgstr "ì»¤ë¸Œì˜ ì ì´ë™í•˜ê¸°" +msgstr "ê³¡ì„ ì˜ ì ì´ë™í•˜ê¸°" #: editor/plugins/path_2d_editor_plugin.cpp msgid "Move In-Control in Curve" -msgstr "ì»¤ë¸Œì˜ ì¸-컨트롤 ì´ë™í•˜ê¸°" +msgstr "ê³¡ì„ ì˜ ì¸-컨트롤 ì´ë™í•˜ê¸°" #: editor/plugins/path_2d_editor_plugin.cpp msgid "Move Out-Control in Curve" -msgstr "ì»¤ë¸Œì˜ ì•„ì›ƒ-컨트롤 ì´ë™í•˜ê¸°" +msgstr "ê³¡ì„ ì˜ ì•„ì›ƒ-컨트롤 ì´ë™í•˜ê¸°" #: editor/plugins/path_2d_editor_plugin.cpp #: editor/plugins/path_editor_plugin.cpp @@ -5922,7 +5963,7 @@ msgstr "í´ë¦: ì 추가하기" #: editor/plugins/path_2d_editor_plugin.cpp msgid "Left Click: Split Segment (in curve)" -msgstr "좌í´ë¦: (커브로) ì„ ë¶„ 가르기" +msgstr "좌í´ë¦: (ê³¡ì„ ì—ì„œ) ì„ ë¶„ 가르기" #: editor/plugins/path_2d_editor_plugin.cpp #: editor/plugins/path_editor_plugin.cpp @@ -5946,7 +5987,7 @@ msgstr "ì ì‚ì œí•˜ê¸°" #: editor/plugins/path_2d_editor_plugin.cpp #: editor/plugins/path_editor_plugin.cpp msgid "Close Curve" -msgstr "커브 닫기" +msgstr "ê³¡ì„ ë‹«ê¸°" #: editor/plugins/path_2d_editor_plugin.cpp #: editor/plugins/path_editor_plugin.cpp editor/plugins/theme_editor_plugin.cpp @@ -5966,19 +6007,19 @@ msgstr "핸들 ê¸¸ì´ ê±°ìš¸" #: editor/plugins/path_editor_plugin.cpp msgid "Curve Point #" -msgstr "커브 ì #" +msgstr "ê³¡ì„ ì #" #: editor/plugins/path_editor_plugin.cpp msgid "Set Curve Point Position" -msgstr "커브 ì 위치 ì„¤ì •í•˜ê¸°" +msgstr "ê³¡ì„ ì 위치 ì„¤ì •í•˜ê¸°" #: editor/plugins/path_editor_plugin.cpp msgid "Set Curve In Position" -msgstr "ì»¤ë¸Œì˜ ì¸ ìœ„ì¹˜ ì„¤ì •í•˜ê¸°" +msgstr "ê³¡ì„ ì˜ ì¸ ìœ„ì¹˜ ì„¤ì •í•˜ê¸°" #: editor/plugins/path_editor_plugin.cpp msgid "Set Curve Out Position" -msgstr "ì»¤ë¸Œì˜ ì•„ì›ƒ 위치 ì„¤ì •í•˜ê¸°" +msgstr "ê³¡ì„ ì˜ ì•„ì›ƒ 위치 ì„¤ì •í•˜ê¸°" #: editor/plugins/path_editor_plugin.cpp msgid "Split Path" @@ -5998,7 +6039,7 @@ msgstr "ì¸-컨트롤 ì ì‚ì œí•˜ê¸°" #: editor/plugins/path_editor_plugin.cpp msgid "Split Segment (in curve)" -msgstr "(커브로) ì„ ë¶„ 가르기" +msgstr "(ê³¡ì„ ì—ì„œ) ì„ ë¶„ 가르기" #: editor/plugins/physical_bone_plugin.cpp msgid "Move Joint" @@ -6029,7 +6070,7 @@ msgstr "UV 맵 만들기" msgid "" "Polygon 2D has internal vertices, so it can no longer be edited in the " "viewport." -msgstr "Polygon2Dì— ë‚´ë¶€ ê¼ì§“ì ì´ ìžˆì–´ìš”, ë” ì´ìƒ ë·°í¬íŠ¸ì—ì„œ íŽ¸ì§‘í• ìˆ˜ 없어요." +msgstr "Polygon2Dì— ë‚´ë¶€ ê¼ì§“ì ì´ ìžˆì–´ìš”. ë” ì´ìƒ ë·°í¬íŠ¸ì—ì„œ íŽ¸ì§‘í• ìˆ˜ 없어요." #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Create Polygon & UV" @@ -6045,7 +6086,7 @@ msgstr "내부 ê¼ì§“ì ì‚ì œí•˜ê¸°" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Invalid Polygon (need 3 different vertices)" -msgstr "ìž˜ëª»ëœ í´ë¦¬ê³¤ (3ê°œì˜ ë‹¤ë¥¸ ê¼ì§“ì ì´ í•„ìš”í•¨)" +msgstr "ìž˜ëª»ëœ í´ë¦¬ê³¤ (3ê°œì˜ ë‹¤ë¥¸ ê¼ì§“ì ì´ í•„ìš”í•´ìš”)" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Add Custom Polygon" @@ -6061,7 +6102,7 @@ msgstr "UV 맵 변형하기" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Transform Polygon" -msgstr "변형 í´ë¦¬ê³¤" +msgstr "í´ë¦¬ê³¤ 변형하기" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Paint Bone Weights" @@ -6101,7 +6142,7 @@ msgstr "Ctrl: íšŒì „í•˜ê¸°" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Shift: Move All" -msgstr "Shift: ì „ë¶€ ì´ë™í•˜ê¸°" +msgstr "Shift: ëª¨ë‘ ì´ë™í•˜ê¸°" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Shift+Ctrl: Scale" @@ -6121,23 +6162,23 @@ msgstr "í´ë¦¬ê³¤ í¬ê¸° ì¡°ì ˆí•˜ê¸°" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Create a custom polygon. Enables custom polygon rendering." -msgstr "맞춤 í´ë¦¬ê³¤ì„ 만들어요. 맞춤 í´ë¦¬ê³¤ ë Œë”ë§ì„ 켤게요." +msgstr "맞춤 í´ë¦¬ê³¤ì„ 만들어요. 맞춤 í´ë¦¬ê³¤ ë Œë”ë§ì„ 켜세요." #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "" "Remove a custom polygon. If none remain, custom polygon rendering is " "disabled." msgstr "" -"맞춤 í´ë¦¬ê³¤ì„ ì‚ì œí•´ìš”. 남아있는 맞춤 í´ë¦¬ê³¤ì´ 없으면, 맞춤 í´ë¦¬ê³¤ ë Œë”ë§ì„ " -"ëŒê²Œìš”." +"맞춤 í´ë¦¬ê³¤ì„ ì‚ì œí•´ìš”. 남아있는 맞춤 í´ë¦¬ê³¤ì´ 없으면, 맞춤 í´ë¦¬ê³¤ ë Œë”ë§ì€ " +"êº¼ì ¸ìš”." #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Paint weights with specified intensity." -msgstr "ì§€ì •í•œ ê°•ë„ë¡œ 가중치를 ì¹ í•˜ê¸°." +msgstr "ì§€ì •í•œ ê°•ë„ë¡œ 가중치를 ì¹ í•´ìš”." #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Unpaint weights with specified intensity." -msgstr "ì§€ì •í•œ ê°•ë„ë¡œ 가중치를 지우기." +msgstr "ì§€ì •í•œ ê°•ë„ë¡œ 가중치를 지워요." #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Radius:" @@ -6173,7 +6214,7 @@ msgstr "격ìž" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Show Grid" -msgstr "ê²©ìž ë³´ê¸°" +msgstr "ê²©ìž ë³´ì´ê¸°" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Configure Grid:" @@ -6303,7 +6344,7 @@ msgstr "íŒŒì¼ ì—´ê¸°" #: editor/plugins/script_editor_plugin.cpp msgid "Save File As..." -msgstr "다른 ì´ë¦„으로 ì €ìž¥..." +msgstr "다른 ì´ë¦„으로 ì €ìž¥í•˜ê¸°..." #: editor/plugins/script_editor_plugin.cpp msgid "Import Theme" @@ -6319,7 +6360,7 @@ msgstr "ì €ìž¥ 중 오류" #: editor/plugins/script_editor_plugin.cpp msgid "Save Theme As..." -msgstr "테마를 다른 ì´ë¦„으로 ì €ìž¥..." +msgstr "테마를 다른 ì´ë¦„으로 ì €ìž¥í•˜ê¸°..." #: editor/plugins/script_editor_plugin.cpp msgid "%s Class Reference" @@ -6463,7 +6504,7 @@ msgstr "외부 편집기로 디버깅" #: editor/plugins/script_editor_plugin.cpp msgid "Open Godot online documentation." -msgstr "Godot 온ë¼ì¸ 문서 열기." +msgstr "Godot 온ë¼ì¸ 문서를 ì—´ì–´ìš”." #: editor/plugins/script_editor_plugin.cpp msgid "Request Docs" @@ -6479,15 +6520,15 @@ msgstr "참조 문서 검색하기." #: editor/plugins/script_editor_plugin.cpp msgid "Go to previous edited document." -msgstr "ì´ì „ì— íŽ¸ì§‘í•œ 문서로 ì´ë™í•˜ê¸°." +msgstr "ì´ì „ì— íŽ¸ì§‘í•œ 문서로 ì´ë™í•´ìš”." #: editor/plugins/script_editor_plugin.cpp msgid "Go to next edited document." -msgstr "다ìŒì— 편집한 문서로 ì´ë™í•˜ê¸°." +msgstr "다ìŒì— 편집한 문서로 ì´ë™í•´ìš”." #: editor/plugins/script_editor_plugin.cpp msgid "Discard" -msgstr "ì €ìž¥ 안함" +msgstr "버리기" #: editor/plugins/script_editor_plugin.cpp msgid "" @@ -6495,7 +6536,7 @@ msgid "" "What action should be taken?:" msgstr "" "해당 파ì¼ì€ 디스í¬ì— 있는 게 ë” ìµœì‹ ì´ì—ìš”.\n" -"어떻게 하실래요?:" +"어떻게 í• ê±´ê°€ìš”?:" #: editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp @@ -6656,11 +6697,11 @@ msgstr "후행 공백 ë¬¸ìž ì‚ì œí•˜ê¸°" #: editor/plugins/script_text_editor.cpp msgid "Convert Indent to Spaces" -msgstr "들여쓰기를 공백으로 변환하기" +msgstr "공백으로 들여쓰ë„ë¡ ë³€í™˜í•˜ê¸°" #: editor/plugins/script_text_editor.cpp msgid "Convert Indent to Tabs" -msgstr "들여쓰기를 íƒìœ¼ë¡œ 변환하기" +msgstr "íƒìœ¼ë¡œ 들여쓰ë„ë¡ ë³€í™˜í•˜ê¸°" #: editor/plugins/script_text_editor.cpp msgid "Auto Indent" @@ -6720,7 +6761,7 @@ msgid "" "This shader has been modified on on disk.\n" "What action should be taken?" msgstr "" -"ì´ ì…°ì´ë”는 디스í¬ì—ì„œ ìˆ˜ì •í–ˆë„¤ìš”.\n" +"ì´ ì…°ì´ë”는 디스í¬ì—ì„œ ìˆ˜ì •í–ˆì–´ìš”.\n" "ì–´ë–¤ í–‰ë™ì„ í• ê±´ê°€ìš”?" #: editor/plugins/shader_editor_plugin.cpp @@ -6729,7 +6770,7 @@ msgstr "ì…°ì´ë”" #: editor/plugins/skeleton_2d_editor_plugin.cpp msgid "This skeleton has no bones, create some children Bone2D nodes." -msgstr "ì´ ìŠ¤ì¼ˆë ˆí†¤ì—는 ë³¸ì´ ì—†ì–´ìš”, Bone2D노드를 ìžì‹ìœ¼ë¡œ 만드세요." +msgstr "ì´ ìŠ¤ì¼ˆë ˆí†¤ì—는 ë³¸ì´ ì—†ì–´ìš”. Bone2D노드를 ìžì‹ìœ¼ë¡œ 만드세요." #: editor/plugins/skeleton_2d_editor_plugin.cpp msgid "Create Rest Pose from Bones" @@ -6765,7 +6806,7 @@ msgstr "물리ì ìŠ¤ì¼ˆë ˆí†¤ 만들기" #: editor/plugins/skeleton_ik_editor_plugin.cpp msgid "Play IK" -msgstr "IK 실행" +msgstr "IK 실행하기" #: editor/plugins/spatial_editor_plugin.cpp msgid "Orthogonal" @@ -6777,7 +6818,7 @@ msgstr "ì›ê·¼ë³´ê¸°" #: editor/plugins/spatial_editor_plugin.cpp msgid "Transform Aborted." -msgstr "변형 중단." +msgstr "변형 중단ë¨." #: editor/plugins/spatial_editor_plugin.cpp msgid "X-Axis Transform." @@ -6805,7 +6846,7 @@ msgstr "ì´ë™ 중: " #: editor/plugins/spatial_editor_plugin.cpp msgid "Rotating %s degrees." -msgstr "%së„ë¡œ íšŒì „." +msgstr "%së„ë¡œ íšŒì „í•˜ê¸°." #: editor/plugins/spatial_editor_plugin.cpp msgid "Keying is disabled (no key inserted)." @@ -6953,7 +6994,7 @@ msgstr "오디오 리스너" #: editor/plugins/spatial_editor_plugin.cpp msgid "Enable Doppler" -msgstr "ì§„ë™ ì™œê³¡ 켜기" +msgstr "íŒŒë™ ì™œê³¡ 켜기" #: editor/plugins/spatial_editor_plugin.cpp msgid "Cinematic Preview" @@ -6988,16 +7029,15 @@ msgid "Freelook Speed Modifier" msgstr "ìžìœ ì‹œì ì†ë„ ìˆ˜ì •ìž" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Freelook Slow Modifier" -msgstr "ìžìœ ì‹œì ì†ë„ ìˆ˜ì •ìž" +msgstr "ìžìœ ì‹œì ëŠë¦° ìˆ˜ì •ìž" #: editor/plugins/spatial_editor_plugin.cpp msgid "" "Note: The FPS value displayed is the editor's framerate.\n" "It cannot be used as a reliable indication of in-game performance." msgstr "" -"ì°¸ê³ : FPS ê°’ì€ íŽ¸ì§‘ê¸°ì˜ í”„ë ˆìž„ìœ¼ë¡œ 표시ë˜ìš”.\n" +"ì°¸ê³ : FPS ê°’ì€ íŽ¸ì§‘ê¸°ì˜ í”„ë ˆìž„ìœ¼ë¡œ 표시ë¼ìš”.\n" "ì´ê²ƒì´ 게임 ë‚´ ì„±ëŠ¥ì„ ë³´ìž¥í• ìˆ˜ 없어요." #: editor/plugins/spatial_editor_plugin.cpp @@ -7024,7 +7064,7 @@ msgid "" msgstr "" "드래그: íšŒì „í•˜ê¸°\n" "Alt+드래그: ì´ë™í•˜ê¸°\n" -"Alt+ìš°í´ë¦: 겹친 ëª©ë¡ ì„ íƒê¸°í•˜ê¸°" +"Alt+ìš°í´ë¦: 겹친 ëª©ë¡ ì„ íƒí•˜ê¸°" #: editor/plugins/spatial_editor_plugin.cpp msgid "Use Local Space" @@ -7222,7 +7262,7 @@ msgstr "ì• ë‹ˆë©”ì´ì…˜ í”„ë ˆìž„ì„ ì‚¬ìš©í•˜ëŠ” 스프ë¼ì´íŠ¸ë¥¼ 메시로 ë #: editor/plugins/sprite_editor_plugin.cpp msgid "Invalid geometry, can't replace by mesh." -msgstr "ìž˜ëª»ëœ í˜•íƒœ, 메시로 ëŒ€ì²´í• ìˆ˜ 없어요." +msgstr "ìž˜ëª»ëœ í˜•íƒœ. 메시로 ëŒ€ì²´í• ìˆ˜ 없어요." #: editor/plugins/sprite_editor_plugin.cpp msgid "Convert to Mesh2D" @@ -7230,7 +7270,7 @@ msgstr "Mesh2Dë¡œ 변환하기" #: editor/plugins/sprite_editor_plugin.cpp msgid "Invalid geometry, can't create polygon." -msgstr "ìž˜ëª»ëœ í˜•íƒœ, í´ë¦¬ê³¤ì„ 만들 수 없어요." +msgstr "ìž˜ëª»ëœ í˜•íƒœ. í´ë¦¬ê³¤ì„ 만들 수 없어요." #: editor/plugins/sprite_editor_plugin.cpp msgid "Convert to Polygon2D" @@ -7238,7 +7278,7 @@ msgstr "Polygon2Dë¡œ 변환하기" #: editor/plugins/sprite_editor_plugin.cpp msgid "Invalid geometry, can't create collision polygon." -msgstr "ìž˜ëª»ëœ í˜•íƒœ, ì¶©ëŒ í´ë¦¬ê³¤ì„ 만들 수 없어요." +msgstr "ìž˜ëª»ëœ í˜•íƒœ. ì¶©ëŒ í´ë¦¬ê³¤ì„ 만들 수 없어요." #: editor/plugins/sprite_editor_plugin.cpp msgid "Create CollisionPolygon2D Sibling" @@ -7261,9 +7301,8 @@ msgid "Simplification: " msgstr "단순화: " #: editor/plugins/sprite_editor_plugin.cpp -#, fuzzy msgid "Shrink (Pixels): " -msgstr "성장 (픽셀): " +msgstr "수축 (픽셀): " #: editor/plugins/sprite_editor_plugin.cpp msgid "Grow (Pixels): " @@ -7532,7 +7571,7 @@ msgstr "많ì€" #: editor/plugins/theme_editor_plugin.cpp msgid "Disabled LineEdit" -msgstr "ë¹„í™œì„±í™”ëœ LineEdit" +msgstr "꺼진 LineEdit" #: editor/plugins/theme_editor_plugin.cpp msgid "Tab 1" @@ -7548,7 +7587,7 @@ msgstr "íƒ 3" #: editor/plugins/theme_editor_plugin.cpp msgid "Editable Item" -msgstr "편집 가능한 í•ëª©" +msgstr "íŽ¸ì§‘í• ìˆ˜ 있는 í•ëª©" #: editor/plugins/theme_editor_plugin.cpp msgid "Subtree" @@ -7572,7 +7611,7 @@ msgstr "스타ì¼" #: editor/plugins/theme_editor_plugin.cpp msgid "Font" -msgstr "í°íŠ¸" +msgstr "글꼴" #: editor/plugins/theme_editor_plugin.cpp msgid "Color" @@ -7629,7 +7668,7 @@ msgstr "ì˜¤í† íƒ€ì¼ ë„기" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Enable Priority" -msgstr "ìš°ì„ ìˆœìœ„ 편집" +msgstr "ìš°ì„ ìˆœìœ„ 켜기" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Filter tiles" @@ -7780,7 +7819,7 @@ msgstr "" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Remove selected texture? This will remove all tiles which use it." msgstr "" -"ì„ íƒí•œ í…스처를 ì‚ì œí• ê¹Œìš”? ì´ í…스처를 사용하는 ëª¨ë“ íƒ€ì¼ë„ ì‚ì œë ê±°ì—ìš”." +"ì„ íƒí•œ í…스처를 ì‚ì œí• ê¹Œìš”? ì´ í…스처를 사용하는 ëª¨ë“ íƒ€ì¼ë„ ì‚ì œë 거예요." #: editor/plugins/tile_set_editor_plugin.cpp msgid "You haven't selected a texture to remove." @@ -7788,7 +7827,7 @@ msgstr "ì‚ì œí• í…스처를 ì„ íƒí•˜ì§€ 않았어요." #: editor/plugins/tile_set_editor_plugin.cpp msgid "Create from scene? This will overwrite all current tiles." -msgstr "씬ì—ì„œ 만들까요? ëª¨ë“ í˜„ìž¬ 파ì¼ì„ ë®ì–´ 씌울 ê±°ì—ìš”." +msgstr "씬ì—ì„œ 만들까요? ëª¨ë“ í˜„ìž¬ 파ì¼ì„ ë®ì–´ 씌울 거예요." #: editor/plugins/tile_set_editor_plugin.cpp msgid "Merge from scene?" @@ -7819,7 +7858,7 @@ msgid "" "Select current edited sub-tile.\n" "Click on another Tile to edit it." msgstr "" -"현재 편집한 하위 íƒ€ì¼ ì„ íƒí•˜ê¸°.\n" +"현재 편집한 하위 타ì¼ì„ ì„ íƒí•´ìš”.\n" "다른 타ì¼ì„ íŽ¸ì§‘í•˜ë ¤ë©´ í´ë¦í•˜ì„¸ìš”." #: editor/plugins/tile_set_editor_plugin.cpp @@ -7833,9 +7872,9 @@ msgid "" "Shift+LMB: Set wildcard bit.\n" "Click on another Tile to edit it." msgstr "" -"좌í´ë¦: 비트를 켬.\n" -"ìš°í´ë¦: 비트를 ë”.\n" -"Shift+좌í´ë¦: 와ì¼ë“œì¹´ë“œ 비트를 ì„¤ì •.\n" +"좌í´ë¦: 비트를 켜요.\n" +"ìš°í´ë¦: 비트를 꺼요.\n" +"Shift+좌í´ë¦: 와ì¼ë“œì¹´ë“œ 비트를 ì„¤ì •í•´ìš”.\n" "다른 타ì¼ì„ íŽ¸ì§‘í•˜ë ¤ë©´ í´ë¦í•˜ì„¸ìš”." #: editor/plugins/tile_set_editor_plugin.cpp @@ -7844,8 +7883,8 @@ msgid "" "bindings.\n" "Click on another Tile to edit it." msgstr "" -"ì•„ì´ì½˜ìœ¼ë¡œ 쓸 하위 타ì¼ì„ ì„ íƒí•˜ì„¸ìš”, ìž˜ëª»ëœ ì˜¤í† íƒ€ì¼ ë°”ì¸ë”©ì—ë„ ì“°ì¼ ê±°ì—" -"ìš”.\n" +"ì•„ì´ì½˜ìœ¼ë¡œ 쓸 하위 타ì¼ì„ ì„ íƒí•˜ì„¸ìš”. ì´ê²ƒì€ ìž˜ëª»ëœ ì˜¤í† íƒ€ì¼ ë°”ì¸ë”©ì—ë„ ì‚¬ìš©" +"ë¼ìš”.\n" "다른 타ì¼ì„ íŽ¸ì§‘í•˜ë ¤ë©´ í´ë¦í•˜ì„¸ìš”." #: editor/plugins/tile_set_editor_plugin.cpp @@ -8010,7 +8049,7 @@ msgstr "타입체ì¸ì§€" #: editor/plugins/version_control_editor_plugin.cpp msgid "Stage Selected" -msgstr "ì„ íƒ í•ëª© 스테ì´ì§€ë¡œ 보내기" +msgstr "ì„ íƒ í•ëª© 스테ì´ì§€ë¡œ 보내기" #: editor/plugins/version_control_editor_plugin.cpp msgid "Stage All" @@ -8046,9 +8085,8 @@ msgid "(GLES3 only)" msgstr "(GLES3만 가능)" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Add Output" -msgstr "ì¶œë ¥ 추가하기 +" +msgstr "ì¶œë ¥ 추가하기" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Scalar" @@ -8063,9 +8101,8 @@ msgid "Boolean" msgstr "불리언" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Sampler" -msgstr "샘플" +msgstr "샘플러" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Add input port" @@ -8197,8 +8234,8 @@ msgid "Dodge operator." msgstr "닷지 ì—°ì‚°ìž." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "HardLight operator" -msgstr "하드 ë¼ì´íŠ¸ ì—°ì‚°ìž" +msgid "HardLight operator." +msgstr "하드 ë¼ì´íŠ¸ ì—°ì‚°ìž." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Lighten operator." @@ -8222,7 +8259,7 @@ msgstr "ìƒ‰ìƒ ìƒìˆ˜." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Color uniform." -msgstr "ìƒ‰ìƒ ìœ ë‹ˆí¼." +msgstr "ìƒ‰ìƒ Uniform." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the boolean result of the %s comparison between two parameters." @@ -8299,7 +8336,7 @@ msgstr "불리언 ìƒìˆ˜." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Boolean uniform." -msgstr "불리언 ìœ ë‹ˆí¼." +msgstr "불리언 Uniform." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "'%s' input parameter for all shader modes." @@ -8424,7 +8461,7 @@ msgstr "ë§¤ê°œë³€ìˆ˜ì˜ ìŒê³¡ì½”ì‚¬ì¸ ê°’ì„ ë°˜í™˜í•´ìš”." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Converts a quantity in radians to degrees." -msgstr "ê°ë„ 단위를 ë¼ë””안ì—ì„œ ë„ë¡œ 변환합니다." +msgstr "ê°ë„ 단위를 ë¼ë””안ì—ì„œ ë„ë¡œ 변환해요." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Base-e Exponential." @@ -8576,7 +8613,7 @@ msgstr "ìŠ¤ì¹¼ë¼ ìƒìˆ˜." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Scalar uniform." -msgstr "ìŠ¤ì¹¼ë¼ ìœ ë‹ˆí¼." +msgstr "ìŠ¤ì¹¼ë¼ Uniform." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Perform the cubic texture lookup." @@ -8588,15 +8625,15 @@ msgstr "í…스처 ë£©ì—…ì„ ìˆ˜í–‰í•´ìš”." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Cubic texture uniform lookup." -msgstr "ì„¸ì œê³± í…스처 ìœ ë‹ˆí¼ ë£©ì—…." +msgstr "ì„¸ì œê³± í…스처 Uniform 룩업." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "2D texture uniform lookup." -msgstr "2D í…스처 ìœ ë‹ˆí¼ ë£©ì—…." +msgstr "2D í…스처 Uniform 룩업." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "2D texture uniform lookup with triplanar." -msgstr "Triplanarê°€ ì ìš©ëœ 2D í…스처 ìœ ë‹ˆí¼ ë£©ì—… ." +msgstr "Triplanarê°€ ì ìš©ëœ 2D í…스처 Uniform 룩업 ." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Transform function." @@ -8653,7 +8690,7 @@ msgstr "변형 ìƒìˆ˜." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Transform uniform." -msgstr "변형 ìœ ë‹ˆí¼." +msgstr "변형 Uniform." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Vector function." @@ -8692,8 +8729,8 @@ msgid "" msgstr "" "ê°™ì€ ë°©í–¥ì„ ê°€ë¦¬í‚¤ëŠ” 벡터를 참조 벡터로 반환해요. 함수ì—는 세 ê°œì˜ ë²¡í„° 매개" "변수가 있어요 : ë°©í–¥ì„ ì§€ì •í•˜ëŠ” 벡터 N, ì¸ì‹œë˜íŠ¸ 벡터 I, ê·¸ë¦¬ê³ ì°¸ì¡° 벡터 " -"Nref. 만약 I와 Nrefê°€ 0ì˜ ë²¡í„°ê³±ì´ 0보다 작다면 ë°˜í™˜ê°’ì€ Nì´ ë˜ìš”. ê·¸ë ‡ì§€ ì•Š" -"으면 -Nì´ ë°˜í™˜ë˜ê³ ìš”." +"Nref. 만약 I와 Nrefê°€ 0ì˜ ë²¡í„°ê³±ì´ 0보다 작다면 ë°˜í™˜ê°’ì€ Nì´ ë¼ìš”. ê·¸ë ‡ì§€ ì•Š" +"으면 -Nì´ ë°˜í™˜ë¼ìš”." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Calculates the length of a vector." @@ -8802,7 +8839,7 @@ msgstr "벡터 ìƒìˆ˜." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Vector uniform." -msgstr "벡터 ìœ ë‹ˆí¼." +msgstr "벡터 Uniform." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -8824,13 +8861,14 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Custom Godot Shader Language expression, which placed on top of the resulted " -"shader. You can place various function definitions inside and call it later " -"in the Expressions. You can also declare varyings, uniforms and constants." +"Custom Godot Shader Language expression, which is placed on top of the " +"resulted shader. You can place various function definitions inside and call " +"it later in the Expressions. You can also declare varyings, uniforms and " +"constants." msgstr "" -"ê²°ê³¼ ì…°ì´ë” ìœ„ì— ë°°ì¹˜ëœ, 맞춤 Godot ì…°ì´ë” 언어 ëª…ë ¹ë¬¸. 다양한 함수 ì„ ì–¸ì„ ë†“" -"ì€ ë’¤ ë‚˜ì¤‘ì— ëª…ë ¹ë¬¸ì—ì„œ í˜¸ì¶œí• ìˆ˜ 있어요. 변화, ìœ ë‹ˆí¼, ìƒìˆ˜ë„ ì •ì˜í• 수 있어" -"ìš”." +"ê²°ê³¼ ì…°ì´ë” ìœ„ì— ë°°ì¹˜ëœ, 맞춤 Godot ì…°ì´ë” 언어 표현ì‹. 다양한 함수 ì„ ì–¸ì„ ë†“" +"ì€ ë’¤ ë‚˜ì¤‘ì— í‘œí˜„ì‹ì—ì„œ í˜¸ì¶œí• ìˆ˜ 있어요. Varying, Uniform, ìƒìˆ˜ë„ ì •ì˜í• 수 " +"있어요." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "(Fragment/Light mode only) Scalar derivative function." @@ -8908,7 +8946,7 @@ msgid "" "Export templates seem to be missing or invalid." msgstr "" "'%s' 플랫í¼ì— 프로ì 트를 내보낼 수 없어요.\n" -"내보내기 í…œí”Œë¦¿ì´ ëˆ„ë½ë˜ê±°ë‚˜ ìž˜ëª»ëœ ë“¯ í•´ìš”." +"내보내기 í…œí”Œë¦¿ì´ ëˆ„ë½ë˜ê±°ë‚˜ ìž˜ëª»ëœ ëª¨ì–‘ì´ì—ìš”." #: editor/project_export.cpp msgid "" @@ -8917,7 +8955,7 @@ msgid "" "export settings." msgstr "" "'%s' 플랫í¼ì— 프로ì 트를 내보낼 수 없어요.\n" -"내보내기 프리셋ì´ë‚˜ 내보내기 ì„¤ì • ìƒì˜ ë¬¸ì œ ë•Œë¬¸ì¸ ê²ƒ 같아요." +"내보내기 프리셋ì´ë‚˜ 내보내기 ì„¤ì •ì˜ ë¬¸ì œë¡œ 보여요." #: editor/project_export.cpp msgid "Release" @@ -8944,6 +8982,14 @@ msgid "Add..." msgstr "추가하기..." #: editor/project_export.cpp +msgid "" +"If checked, the preset will be available for use in one-click deploy.\n" +"Only one preset per platform may be marked as runnable." +msgstr "" +"ì²´í¬í•˜ë©´ í”„ë¦¬ì…‹ì€ ì› í´ë¦ ë°°í¬ë¡œ ì‚¬ìš©í• ìˆ˜ 있게 ë¼ìš”.\n" +"í”Œëž«í¼ ë‹¹ í•˜ë‚˜ì˜ í”„ë¦¬ì…‹ë§Œ 실행 ê°€ëŠ¥í•˜ë‹¤ê³ í‘œì‹œë ê±°ì—ìš”." + +#: editor/project_export.cpp msgid "Export Path" msgstr "경로 내보내기" @@ -8969,21 +9015,22 @@ msgstr "내보내기 모드:" #: editor/project_export.cpp msgid "Resources to export:" -msgstr "내보낼 리소스:" +msgstr "내보내는 리소스:" #: editor/project_export.cpp -#, fuzzy msgid "" "Filters to export non-resource files/folders\n" "(comma-separated, e.g: *.json, *.txt, docs/*)" -msgstr "리소스가 ì•„ë‹Œ íŒŒì¼ ë‚´ë³´ë‚´ê¸° í•„í„° (쉼표로 구분, 예: *.json, *.txt)" +msgstr "" +"리소스가 ì•„ë‹Œ 파ì¼/í´ë” 내보내기 í•„í„° (쉼표로 구분, 예: *.json, *.txt, docs/" +"*)" #: editor/project_export.cpp -#, fuzzy msgid "" "Filters to exclude files/folders from project\n" "(comma-separated, e.g: *.json, *.txt, docs/*)" -msgstr "프로ì 트ì—ì„œ ì œì™¸ì‹œí‚¬ íŒŒì¼ í•„í„° (쉼표로 구분, 예: *.json, *.txt)" +msgstr "" +"프로ì 트ì—ì„œ ì œì™¸í• íŒŒì¼/í´ë” í•„í„° (쉼표로 구분, 예: *.json, *.txt, docs/*)" #: editor/project_export.cpp msgid "Patches" @@ -9023,11 +9070,11 @@ msgstr "컴파ì¼ë¨" #: editor/project_export.cpp msgid "Encrypted (Provide Key Below)" -msgstr "암호화 (ì•„ëž˜ì— í‚¤ê°’ í•„ìš”)" +msgstr "암호화 (ì•„ëž˜ì— í‚¤ê°€ 필요해요)" #: editor/project_export.cpp msgid "Invalid Encryption Key (must be 64 characters long)" -msgstr "ìž˜ëª»ëœ ì•”í˜¸í™” 키 (64ìž ê¸¸ì´ì—¬ì•¼ 함)" +msgstr "ìž˜ëª»ëœ ì•”í˜¸í™” 키 (길ì´ê°€ 64ìžì´ì–´ì•¼ í•´ìš”)" #: editor/project_export.cpp msgid "Script Encryption Key (256-bits as hex):" @@ -9064,15 +9111,15 @@ msgstr "경로가 없어요." #: editor/project_manager.cpp msgid "Invalid '.zip' project file, does not contain a 'project.godot' file." msgstr "" -"ìž˜ëª»ëœ '.zip' 프로ì 트 파ì¼ì´ì—ìš”, 'project.godot' 파ì¼ì„ ê°–ê³ ìžˆì§€ ì•Šì•„ìš”." +"ìž˜ëª»ëœ '.zip' 프로ì 트 파ì¼ì´ì—ìš”. 'project.godot' 파ì¼ì„ ê°–ê³ ìžˆì§€ ì•Šì•„ìš”." #: editor/project_manager.cpp msgid "Please choose an empty folder." -msgstr "비어있는 í´ë”를 ì„ íƒí•˜ì„¸ìš”." +msgstr "비어있는 í´ë”를 ì„ íƒí•´ì£¼ì„¸ìš”." #: editor/project_manager.cpp msgid "Please choose a 'project.godot' or '.zip' file." -msgstr "'project.godot' íŒŒì¼ ë˜ëŠ” '.zip' 파ì¼ì„ ì„ íƒí•˜ì„¸ìš”." +msgstr "'project.godot' íŒŒì¼ ë˜ëŠ” '.zip' 파ì¼ì„ ì„ íƒí•´ì£¼ì„¸ìš”." #: editor/project_manager.cpp msgid "Directory already contains a Godot project." @@ -9100,7 +9147,7 @@ msgstr "ì´ë¯¸ ì´ ê²½ë¡œì— ì´ ì´ë¦„ê³¼ ê°™ì€ í´ë”ê°€ 있어요." #: editor/project_manager.cpp msgid "It would be a good idea to name your project." -msgstr "프로ì 트 ì´ë¦„ì„ ì •í•˜ëŠ” 게 ì¢‹ì„ ê±°ì—ìš”." +msgstr "프로ì 트 ì´ë¦„ì„ ì •í•˜ëŠ” 게 ì¢‹ì„ ê±°ì˜ˆìš”." #: editor/project_manager.cpp msgid "Invalid project path (changed anything?)." @@ -9111,8 +9158,8 @@ msgid "" "Couldn't load project.godot in project path (error %d). It may be missing or " "corrupted." msgstr "" -"프로ì 트 경로ì—ì„œ project.godotì„ ë¶ˆëŸ¬ì˜¬ 수 없어요 (오류 %d). 누ë½ë˜ê±°ë‚˜ ì†ìƒ" -"ë˜ì—ˆë‚˜ ë´ìš”." +"프로ì 트 경로ì—ì„œ project.godotì„ ë¶ˆëŸ¬ì˜¬ 수 없어요 (error %d). 누ë½ë˜ê±°ë‚˜ ì†" +"ìƒëœ 모양ì´ì—ìš”." #: editor/project_manager.cpp msgid "Couldn't edit project.godot in project path." @@ -9152,7 +9199,7 @@ msgstr "프로ì 트 설치:" #: editor/project_manager.cpp msgid "Install & Edit" -msgstr "설치 & 편집하기" +msgstr "설치하기 & 편집하기" #: editor/project_manager.cpp msgid "Project Name:" @@ -9224,7 +9271,7 @@ msgstr "'%s'ì—ì„œ 프로ì 트를 ì—´ 수 없어요." #: editor/project_manager.cpp msgid "Are you sure to open more than one project?" -msgstr "ë‘ ê°œ ì´ìƒì˜ 프로ì 트를 여는 건가요?" +msgstr "ë‘ ê°œ ì´ìƒì˜ 프로ì 트를 ì—´ 건가요?" #: editor/project_manager.cpp msgid "" @@ -9238,12 +9285,12 @@ msgid "" "Warning: You won't be able to open the project with previous versions of the " "engine anymore." msgstr "" -"ë‹¤ìŒ í”„ë¡œì 트 ì„¤ì • 파ì¼ì€ 현재 ë²„ì „ì˜ Godotì—ì„œ ë§Œë“ ê²ƒì´ ì•„ë‹ˆë„¤ìš”.\n" +"ë‹¤ìŒ í”„ë¡œì 트 ì„¤ì • 파ì¼ì€ 현재 ë²„ì „ì˜ Godotì—ì„œ ë§Œë“ ê²ƒì´ ì•„ë‹ˆì—ìš”.\n" "↵\n" "%s↵\n" "↵\n" -"íŒŒì¼ ì—´ê¸°ë¥¼ 계ì†í•œë‹¤ë©´, 현재 Godotì˜ êµ¬ì„± íŒŒì¼ í˜•ì‹ìœ¼ë¡œ 변환ë ê±°ì—ìš”.\n" -"ê²½ê³ : ë” ì´ìƒ ì´ í”„ë¡œì 트를 ì´ì „ ë²„ì „ì˜ ì—”ì§„ì—ì„œ ì—´ 수 ì—†ì„ ê±°ì—ìš”." +"íŒŒì¼ ì—´ê¸°ë¥¼ 계ì†í•œë‹¤ë©´, 현재 Godotì˜ êµ¬ì„± íŒŒì¼ í˜•ì‹ìœ¼ë¡œ 변환ë 거예요.\n" +"ê²½ê³ : ë” ì´ìƒ ì´ í”„ë¡œì 트를 ì´ì „ ë²„ì „ì˜ ì—”ì§„ì—ì„œ ì—´ 수 ì—†ì„ ê±°ì˜ˆìš”." #: editor/project_manager.cpp msgid "" @@ -9262,14 +9309,14 @@ msgstr "" "%s\n" "\n" "ë³€í™˜í• ê¹Œìš”?\n" -"ê²½ê³ : ë” ì´ìƒ ì´ í”„ë¡œì 트를 ì´ì „ ë²„ì „ì˜ ì—”ì§„ì—ì„œ ì—´ 수 ì—†ì„ ê±°ì—ìš”." +"ê²½ê³ : ë” ì´ìƒ ì´ í”„ë¡œì 트를 ì´ì „ ë²„ì „ì˜ ì—”ì§„ì—ì„œ ì—´ 수 ì—†ì„ ê±°ì˜ˆìš”." #: editor/project_manager.cpp msgid "" "The project settings were created by a newer engine version, whose settings " "are not compatible with this version." msgstr "" -"프로ì 트 ì„¤ì •ì´ ìƒˆ ë²„ì „ì— ë§žê²Œ 만들어졌어요, ì´ ë²„ì „ì—서는 호환하지 ì•Šì•„ìš”." +"프로ì 트 ì„¤ì •ì´ ìƒˆ ë²„ì „ì— ë§žê²Œ 만들어졌어요. ì´ ë²„ì „ì—서는 호환하지 ì•Šì•„ìš”." #: editor/project_manager.cpp msgid "" @@ -9291,7 +9338,7 @@ msgstr "" #: editor/project_manager.cpp msgid "Are you sure to run %d projects at once?" -msgstr "í•œ ë²ˆì— %dê°œì˜ í”„ë¡œì 트를 ì‹¤í–‰í• ê¹Œìš”?" +msgstr "í•œ ë²ˆì— %dê°œì˜ í”„ë¡œì 트를 ì‹¤í–‰í• ê±´ê°€ìš”?" #: editor/project_manager.cpp msgid "" @@ -9314,7 +9361,7 @@ msgid "" "Remove all missing projects from the list?\n" "The project folders' contents won't be modified." msgstr "" -"%dê°œì˜ í”„ë¡œì 트를 ì‚ì œí• ê¹Œìš”?\n" +"ëª¨ë“ ëˆ„ë½ëœ 프로ì 트를 ì‚ì œí• ê¹Œìš”?\n" "프로ì 트 í´ë”ì˜ ë‚´ìš©ì€ ìˆ˜ì •ë˜ì§€ ì•Šì•„ìš”." #: editor/project_manager.cpp @@ -9363,18 +9410,18 @@ msgstr "템플릿" #: editor/project_manager.cpp msgid "Restart Now" -msgstr "지금 재시작" +msgstr "지금 다시 시작" #: editor/project_manager.cpp msgid "Can't run project" -msgstr "프로ì 트를 ì‹¤í–‰í• ìˆ˜ ì—†ìŒ" +msgstr "프로ì 트를 ì‹¤í–‰í• ìˆ˜ 없어요" #: editor/project_manager.cpp msgid "" "You currently don't have any projects.\n" "Would you like to explore official example projects in the Asset Library?" msgstr "" -"현재 프로ì 트가 í•˜ë‚˜ë„ ì—†ë„¤ìš”.\n" +"현재 프로ì 트가 í•˜ë‚˜ë„ ì—†ì–´ìš”.\n" "ì• ì…‹ ë¼ì´ë¸ŒëŸ¬ë¦¬ì—ì„œ ê³µì‹ ì˜ˆì œ 프로ì 트를 찾아볼까요?" #: editor/project_settings_editor.cpp @@ -9425,18 +9472,6 @@ msgid "Device" msgstr "기기" #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Shift+" -msgstr "Shift+" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Alt+" -msgstr "Alt+" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Control+" -msgstr "Control+" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "Press a Key..." msgstr "키를 눌러주세요..." @@ -9542,7 +9577,7 @@ msgstr "'%s' ì†ì„±ì´ 없어요." #: editor/project_settings_editor.cpp msgid "Setting '%s' is internal, and it can't be deleted." -msgstr "'%s' ì„¤ì •ì€ ë‚´ë¶€ì ì¸ ê²ƒì´ê³ , ì‚ì œí• ìˆ˜ 없어요." +msgstr "'%s' ì„¤ì •ì€ ë‚´ë¶€ì ì¸ ê²ƒì´ì—ìš”. ì‚ì œí• ìˆ˜ 없어요." #: editor/project_settings_editor.cpp msgid "Delete Item" @@ -9601,7 +9636,7 @@ msgstr "리소스 리맵핑 ì‚ì œí•˜ê¸°" #: editor/project_settings_editor.cpp msgid "Remove Resource Remap Option" -msgstr "리소스 리맵핑 옵션 ì‚ì œí•˜ê¸°" +msgstr "리소스 리맵핑 ì„¤ì • ì‚ì œí•˜ê¸°" #: editor/project_settings_editor.cpp msgid "Changed Locale Filter" @@ -9745,7 +9780,7 @@ msgstr "íŒŒì¼ ë¶ˆëŸ¬ì˜¤ê¸° 오류: 리소스가 아니ì—ìš”!" #: editor/property_editor.cpp msgid "Pick a Node" -msgstr "노드 ì„ íƒí•˜ê¸°" +msgstr "노드를 ì„ íƒí•˜ì„¸ìš”" #: editor/property_editor.cpp msgid "Bit %d, val %d." @@ -9813,11 +9848,11 @@ msgstr "" #: editor/rename_dialog.cpp msgid "Per Level counter" -msgstr "수준 별 ì¹´ìš´í„°" +msgstr "단계 별 ì¹´ìš´í„°" #: editor/rename_dialog.cpp msgid "If set the counter restarts for each group of child nodes" -msgstr "ì„¤ì •í•œë‹¤ë©´ ê° ê·¸ë£¹ì˜ ìžì‹ ë…¸ë“œì˜ ì¹´ìš´í„°ë¥¼ 다시 시작해요" +msgstr "ì„¤ì •í•˜ë©´ ê° ê·¸ë£¹ì˜ ìžì‹ ë…¸ë“œì˜ ì¹´ìš´í„°ë¥¼ 다시 시작해요" #: editor/rename_dialog.cpp msgid "Initial value for the counter" @@ -9841,7 +9876,7 @@ msgid "" "Missing digits are padded with leading zeros." msgstr "" "ì¹´ìš´í„°ì˜ ìµœì†Œ ìžë¦¿ìˆ˜.\n" -"빈 ìžë¦¬ëŠ” 0으로 채워집니다." +"빈 ìžë¦¬ëŠ” 0으로 채워요." #: editor/rename_dialog.cpp msgid "Regular Expressions" @@ -9917,7 +9952,7 @@ msgstr "씬 실행 ì„¤ì •" #: editor/scene_tree_dock.cpp msgid "No parent to instance the scenes at." -msgstr "ì”¬ì„ ì¸ìŠ¤í„´ìŠ¤í• 수 있는 부모가 없습니다." +msgstr "ì”¬ì„ ì¸ìŠ¤í„´ìŠ¤í• 수 있는 부모가 없어요." #: editor/scene_tree_dock.cpp msgid "Error loading scene from %s" @@ -9931,7 +9966,7 @@ msgstr "í•œ ë…¸ë“œì— í˜„ìž¬ ì”¬ì´ ìžˆê¸° 때문ì—, '%s' ì”¬ì„ ì¸ìŠ¤í„´ìŠ¤í• #: editor/scene_tree_dock.cpp msgid "Instance Scene(s)" -msgstr "씬 ì¸ìŠ¤í„´ìŠ¤" +msgstr "씬 ì¸ìŠ¤í„´ìŠ¤í•˜ê¸°" #: editor/scene_tree_dock.cpp msgid "Replace with Branch Scene" @@ -9939,7 +9974,7 @@ msgstr "분기 씬으로 êµì²´í•˜ê¸°" #: editor/scene_tree_dock.cpp msgid "Instance Child Scene" -msgstr "ìžì‹ 씬 추가하기" +msgstr "ìžì‹ 씬 ì¸ìŠ¤í„´ìŠ¤í•˜ê¸°" #: editor/scene_tree_dock.cpp msgid "Clear Script" @@ -9964,7 +9999,7 @@ msgstr "노드 ë³µì œí•˜ê¸°" #: editor/scene_tree_dock.cpp msgid "Can't reparent nodes in inherited scenes, order of nodes can't change." msgstr "" -"ìƒì†í•œ 씬ì—ì„œ ë…¸ë“œì˜ ë¶€ëª¨ë¥¼ 다시 ì§€ì •í• ìˆ˜ 없어요, 노드 순서는 바뀌지 ì•Šì•„ìš”." +"ìƒì†í•œ 씬ì—ì„œ ë…¸ë“œì˜ ë¶€ëª¨ë¥¼ 다시 ì§€ì •í• ìˆ˜ 없어요. 노드 순서는 바뀌지 ì•Šì•„ìš”." #: editor/scene_tree_dock.cpp msgid "Node must belong to the edited scene to become root." @@ -10004,7 +10039,7 @@ msgstr "ì´ ìž‘ì—…ì€ ì¸ìŠ¤í„´ìŠ¤ëœ 씬ì—ì„œ í• ìˆ˜ 없어요." #: editor/scene_tree_dock.cpp msgid "Save New Scene As..." -msgstr "새 ì”¬ì„ ë‹¤ë¥¸ ì´ë¦„으로 ì €ìž¥..." +msgstr "새 ì”¬ì„ ë‹¤ë¥¸ ì´ë¦„으로 ì €ìž¥í•˜ê¸°..." #: editor/scene_tree_dock.cpp msgid "" @@ -10014,12 +10049,12 @@ msgstr "" "\"editable_instance\"를 ë„게 ë˜ë©´ ë…¸ë“œì˜ ëª¨ë“ ì†ì„±ì´ 기본 값으로 ë˜ëŒì•„와요." #: editor/scene_tree_dock.cpp -#, fuzzy msgid "" "Enabling \"Load As Placeholder\" will disable \"Editable Children\" and " "cause all properties of the node to be reverted to their default." msgstr "" -"\"editable_instance\"를 ë„게 ë˜ë©´ ë…¸ë“œì˜ ëª¨ë“ ì†ì„±ì´ 기본 값으로 ë˜ëŒì•„와요." +"\"ìžë¦¬ 표시ìžë¡œ 불러오기\"를 켜면 \"íŽ¸ì§‘í• ìˆ˜ 있는 ìžì‹\" ì„¤ì •ì´ êº¼ì§€ê³ , 그러" +"ë©´ ê·¸ ë…¸ë“œì˜ ëª¨ë“ ì†ì„±ì´ 기본값으로 ëŒì•„와요." #: editor/scene_tree_dock.cpp msgid "Make Local" @@ -10082,11 +10117,11 @@ msgstr "씬 ì €ìž¥ 중 오류." #: editor/scene_tree_dock.cpp msgid "Error duplicating scene to save it." -msgstr "ì €ìž¥í•˜ê¸° 위해 ì”¬ì„ ë³µì œí•˜ëŠ” ì¤‘ì— ì˜¤ë¥˜ê°€ ë°œìƒí–ˆìŠµë‹ˆë‹¤." +msgstr "ì €ìž¥í•˜ê¸° 위해 씬 ë³µì œ 중 오류." #: editor/scene_tree_dock.cpp msgid "Sub-Resources" -msgstr "하위-리소스" +msgstr "하위 리소스" #: editor/scene_tree_dock.cpp msgid "Clear Inheritance" @@ -10094,7 +10129,7 @@ msgstr "ìƒì† 지우기" #: editor/scene_tree_dock.cpp msgid "Editable Children" -msgstr "ìžì‹ë…¸ë“œ 편집 가능" +msgstr "íŽ¸ì§‘í• ìˆ˜ 있는 ìžì‹" #: editor/scene_tree_dock.cpp msgid "Load As Placeholder" @@ -10309,7 +10344,7 @@ msgstr "'%s' 스í¬ë¦½íŠ¸ 불러오는 중 오류" #: editor/script_create_dialog.cpp msgid "Overrides" -msgstr "ìž¬ì •ì˜í•˜ê¸°" +msgstr "다시 ì •ì˜í•˜ê¸°" #: editor/script_create_dialog.cpp msgid "N/A" @@ -10325,7 +10360,7 @@ msgstr "스í¬ë¦½íŠ¸ 열기" #: editor/script_create_dialog.cpp msgid "File exists, it will be reused." -msgstr "파ì¼ì´ 있어요, 다시 ì‚¬ìš©í• ê²Œìš”." +msgstr "파ì¼ì´ 있어요. 다시 ì‚¬ìš©í• ê±°ì˜ˆìš”." #: editor/script_create_dialog.cpp msgid "Invalid class name." @@ -10356,19 +10391,16 @@ msgid "Will load an existing script file." msgstr "기존 스í¬ë¦½íŠ¸ 파ì¼ì„ 불러와요." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Class Name:" -msgstr "í´ëž˜ìŠ¤ ì´ë¦„" +msgstr "í´ëž˜ìŠ¤ ì´ë¦„:" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Template:" -msgstr "템플릿" +msgstr "템플릿:" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Built-in Script:" -msgstr "내장 스í¬ë¦½íŠ¸" +msgstr "내장 스í¬ë¦½íŠ¸:" #: editor/script_create_dialog.cpp msgid "Attach Node Script" @@ -10388,7 +10420,7 @@ msgstr "ê²½ê³ :" #: editor/script_editor_debugger.cpp msgid "Error:" -msgstr "ì—러:" +msgstr "오류:" #: editor/script_editor_debugger.cpp msgid "C++ Error" @@ -10432,11 +10464,11 @@ msgstr "중단ì 넘기기" #: editor/script_editor_debugger.cpp msgid "Inspect Previous Instance" -msgstr "ì´ì „ ì¸ìŠ¤í„´ìŠ¤ 검사" +msgstr "ì´ì „ ì¸ìŠ¤í„´ìŠ¤ 검사하기" #: editor/script_editor_debugger.cpp msgid "Inspect Next Instance" -msgstr "ë‹¤ìŒ ì¸ìŠ¤í„´ìŠ¤ 검사" +msgstr "ë‹¤ìŒ ì¸ìŠ¤í„´ìŠ¤ 검사하기" #: editor/script_editor_debugger.cpp msgid "Stack Frames" @@ -10464,7 +10496,7 @@ msgstr "모니터" #: editor/script_editor_debugger.cpp msgid "Pick one or more items from the list to display the graph." -msgstr "목ë¡ì—ì„œ í•œ ê°œ ì´ìƒì˜ í•ëª©ì„ 집어 그래프로 표시해요." +msgstr "목ë¡ì—ì„œ í•œ ê°œ ì´ìƒì˜ í•ëª©ì„ 집어 그래프로 표시하세요." #: editor/script_editor_debugger.cpp msgid "List of Video Memory Usage by Resource:" @@ -10608,19 +10640,19 @@ msgstr "ì›ê¸°ë‘¥ ë†’ì´ ë°”ê¾¸ê¸°" #: modules/csg/csg_gizmos.cpp msgid "Change Torus Inner Radius" -msgstr "í† ëŸ¬ìŠ¤ 내부 반지름 바꾸기" +msgstr "ë„ë„› 내부 반지름 바꾸기" #: modules/csg/csg_gizmos.cpp msgid "Change Torus Outer Radius" -msgstr "í† ëŸ¬ìŠ¤ 외부 반지름 바꾸기" +msgstr "ë„ë„› 외부 반지름 바꾸기" #: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "Select the dynamic library for this entry" -msgstr "ì´ ì—”íŠ¸ë¦¬ì— ëŒ€í•œ 다ì´ë‚˜ë¯¹ ë¼ì´ë¸ŒëŸ¬ë¦¬ë¥¼ ì„ íƒí•˜ê¸°" +msgstr "ì´ í•ëª©ì˜ ë™ì ë¼ì´ë¸ŒëŸ¬ë¦¬ ì„ íƒí•˜ê¸°" #: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "Select dependencies of the library for this entry" -msgstr "ì´ ì—”íŠ¸ë¦¬ì— ëŒ€í•œ ë¼ì´ë¸ŒëŸ¬ë¦¬ì˜ 종ì†ì„ ì„ íƒí•˜ê¸°" +msgstr "ì´ í•ëª©ì˜ ë™ì ë¼ì´ë¸ŒëŸ¬ë¦¬ì˜ ì¢…ì† ê´€ê³„ë¥¼ ì„ íƒí•˜ê¸°" #: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "Remove current entry" @@ -10628,7 +10660,7 @@ msgstr "현재 엔트리 ì‚ì œí•˜ê¸°" #: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "Double click to create a new entry" -msgstr "ë”블 í´ë¦ìœ¼ë¡œ 새로운 엔트리를 만들기" +msgstr "ë”블 í´ë¦ìœ¼ë¡œ 새 í•ëª© 만들기" #: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "Platform:" @@ -10640,23 +10672,23 @@ msgstr "플랫í¼" #: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "Dynamic Library" -msgstr "다ì´ë‚˜ë¯¹ ë¼ì´ë¸ŒëŸ¬ë¦¬" +msgstr "ë™ì ë¼ì´ë¸ŒëŸ¬ë¦¬" #: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "Add an architecture entry" -msgstr "구조 엔트리를 추가" +msgstr "구조 í•ëª©ì„ 추가하기" #: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "GDNativeLibrary" -msgstr "GD네ì´í‹°ë¸Œ ë¼ì´ë¸ŒëŸ¬ë¦¬" +msgstr "GDNative ë¼ì´ë¸ŒëŸ¬ë¦¬" #: modules/gdnative/gdnative_library_singleton_editor.cpp msgid "Enabled GDNative Singleton" -msgstr "í™œì„±í™”ëœ GDNative 싱글톤" +msgstr "켜진 GDNative 싱글톤" #: modules/gdnative/gdnative_library_singleton_editor.cpp msgid "Disabled GDNative Singleton" -msgstr "ë¹„í™œì„±í™”ëœ GDNative 싱글톤" +msgstr "꺼진 GDNative 싱글톤" #: modules/gdnative/gdnative_library_singleton_editor.cpp msgid "Library" @@ -10664,7 +10696,7 @@ msgstr "ë¼ì´ë¸ŒëŸ¬ë¦¬" #: modules/gdnative/gdnative_library_singleton_editor.cpp msgid "Libraries: " -msgstr "ë¼ì´ë¸ŒëŸ¬ë¦¬ë“¤: " +msgstr "ë¼ì´ë¸ŒëŸ¬ë¦¬: " #: modules/gdnative/register_types.cpp msgid "GDNative" @@ -10676,7 +10708,7 @@ msgstr "길ì´ê°€ 1ì¸ ë¬¸ìžì—´ (문ìž)ì´ í•„ìš”í•´ìš”." #: modules/gdscript/gdscript_functions.cpp msgid "Step argument is zero!" -msgstr "ìŠ¤í… ì¸ìˆ˜ê°€ 0입니다!" +msgstr "ìŠ¤í… ì¸ìˆ˜ê°€ 0ì´ì—ìš”!" #: modules/gdscript/gdscript_functions.cpp msgid "Not a script with an instance" @@ -10708,7 +10740,7 @@ msgstr "ìž˜ëª»ëœ ì¸ìŠ¤í„´ìŠ¤ Dictionary (하위 í´ëž˜ìŠ¤ê°€ 올바르지 ì•Šì #: modules/gdscript/gdscript_functions.cpp msgid "Object can't provide a length." -msgstr "오브ì 트는 길ì´ë¥¼ ì œê³µí• ìˆ˜ 없습니다." +msgstr "ê°ì²´ëŠ” 길ì´ë¥¼ ì œê³µí• ìˆ˜ 없어요." #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Next Plane" @@ -10736,11 +10768,11 @@ msgstr "층:" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "GridMap Delete Selection" -msgstr "그리드맵 ì„ íƒ ì‚ì œí•˜ê¸°" +msgstr "그리드맵 ì„ íƒ í•ëª© ì‚ì œí•˜ê¸°" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "GridMap Fill Selection" -msgstr "그리드맵 채우기 ì„ íƒí•˜ê¸°" +msgstr "그리드맵 ì„ íƒ í•ëª© 채우기" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "GridMap Paste Selection" @@ -10760,7 +10792,7 @@ msgstr "스냅 ë·°" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Clip Disabled" -msgstr "í´ë¦½ 사용 안함" +msgstr "í´ë¦½ 꺼ì§" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Clip Above" @@ -10812,11 +10844,11 @@ msgstr "커서 íšŒì „ 지우기" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Clear Selection" -msgstr "ì„ íƒ ì§€ìš°ê¸°" +msgstr "ì„ íƒ í•ëª© 지우기" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Fill Selection" -msgstr "채우기 ì„ íƒí•˜ê¸°" +msgstr "ì„ íƒ í•ëª© 채우기" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "GridMap Settings" @@ -10836,7 +10868,7 @@ msgstr "메시를 ì‚¬ìš©í•˜ë ¤ë©´ ì´ GridMapì— MeshLibrary 리소스를 주세 #: modules/mono/csharp_script.cpp msgid "Class name can't be a reserved keyword" -msgstr "í´ëž˜ìŠ¤ ì´ë¦„ì€ í‚¤ì›Œë“œê°€ ë 수 없습니다" +msgstr "í´ëž˜ìŠ¤ ì´ë¦„ì€ í‚¤ì›Œë“œê°€ ë 수 없어요" #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" @@ -10860,11 +10892,11 @@ msgstr "그리드 í¬ê¸° 계산 중..." #: modules/recast/navigation_mesh_generator.cpp msgid "Creating heightfield..." -msgstr "Heightfield ìƒì„± 중..." +msgstr "Heightfield 만드는 중..." #: modules/recast/navigation_mesh_generator.cpp msgid "Marking walkable triangles..." -msgstr "걷기 가능한 트ë¼ì´ì•µê¸€ 표시 중..." +msgstr "걷기 가능한 삼ê°í˜• 표시 중..." #: modules/recast/navigation_mesh_generator.cpp msgid "Constructing compact heightfield..." @@ -10876,15 +10908,15 @@ msgstr "걷기 가능한 ì˜ì— 계산 중..." #: modules/recast/navigation_mesh_generator.cpp msgid "Partitioning..." -msgstr "ë¶„í• ì¤‘..." +msgstr "파티션 중..." #: modules/recast/navigation_mesh_generator.cpp msgid "Creating contours..." -msgstr "ìœ¤ê³½ì„ ìƒì„± 중..." +msgstr "ìœ¤ê³½ì„ ë§Œë“œëŠ” 중..." #: modules/recast/navigation_mesh_generator.cpp msgid "Creating polymesh..." -msgstr "í´ë¦¬ 메시 ìƒì„± 중..." +msgstr "Polymesh 만드는 중..." #: modules/recast/navigation_mesh_generator.cpp msgid "Converting to native navigation mesh..." @@ -10907,24 +10939,23 @@ msgid "" "A node yielded without working memory, please read the docs on how to yield " "properly!" msgstr "" -"ìž‘ì—… 메모리 ì—†ì´ ì£¼ì–´ì§„ 노드입니다, 문서ì—ì„œ 노드ì—게 ì ì ˆížˆ 주는 ë°©ë²•ì„ ì½ì–´" -"보세요!" +"ìž‘ì—… 메모리 ì—†ì´ Yieldëœ ë…¸ë“œì´ì—ìš” 문서ì—ì„œ 노드ì—게 ì ì ˆížˆ Yield하는 방법" +"ì„ ì½ì–´ì£¼ì„¸ìš”!" #: modules/visual_script/visual_script.cpp msgid "" "Node yielded, but did not return a function state in the first working " "memory." msgstr "" -"ìž‘ì—… 메모리가 주어진 노드지만, 첫번째 ìž‘ì—… ë©”ëª¨ë¦¬ì˜ í•¨ìˆ˜ ìƒíƒœë¥¼ 반환하지 않았" -"습니다." +"노드가 Yieldë˜ì—ˆì§€ë§Œ, 첫번째 ìž‘ì—… ë©”ëª¨ë¦¬ì˜ í•¨ìˆ˜ ìƒíƒœë¥¼ 반환하지 않았어요." #: modules/visual_script/visual_script.cpp msgid "" "Return value must be assigned to first element of node working memory! Fix " "your node please." msgstr "" -"ë°˜í™˜ëœ ê°’ì€ ë°˜ë“œì‹œ 노드 ìž‘ì—… ë©”ëª¨ë¦¬ì˜ ì²«ë²ˆì§¸ 요소로 í• ë‹¹í•´ì•¼ 합니다! 노드를 " -"ê³ ì³ì£¼ì„¸ìš”." +"반환 ê°’ì€ ë°˜ë“œì‹œ 노드 ìž‘ì—… ë©”ëª¨ë¦¬ì˜ ì²« 번째 요소로 ì§€ì •í•´ì•¼ í•´ìš”! 노드를 ê³ ì³" +"주세요." #: modules/visual_script/visual_script.cpp msgid "Node returned an invalid sequence output: " @@ -10932,8 +10963,7 @@ msgstr "ìž˜ëª»ëœ ì‹œí€€ìŠ¤ ì¶œë ¥ì„ ë°˜í™˜í•œ 노드: " #: modules/visual_script/visual_script.cpp msgid "Found sequence bit but not the node in the stack, report bug!" -msgstr "" -"시퀀스 비트를 발견했지만 ìŠ¤íƒ ì•ˆì˜ ë…¸ë“œì—는 없습니다, 버그 리í¬íŠ¸ë¥¼ 해주세요!" +msgstr "시퀀스 비트를 발견했지만 ìŠ¤íƒ ì•ˆì˜ ë…¸ë“œì—는 없어요. 버그를 ì‹ ê³ í•˜ì„¸ìš”!" #: modules/visual_script/visual_script.cpp msgid "Stack overflow with stack depth: " @@ -10961,11 +10991,11 @@ msgstr "변수 ìœ í˜• ì„¤ì •" #: modules/visual_script/visual_script_editor.cpp msgid "Override an existing built-in function." -msgstr "존재하는 내장 함수 다시 ì •ì˜í•˜ê¸°." +msgstr "존재하는 내장 함수를 다시 ì •ì˜í•´ìš”." #: modules/visual_script/visual_script_editor.cpp msgid "Create a new function." -msgstr "새 함수 만들기." +msgstr "새 함수를 만들어요." #: modules/visual_script/visual_script_editor.cpp msgid "Variables:" @@ -10973,7 +11003,7 @@ msgstr "변수:" #: modules/visual_script/visual_script_editor.cpp msgid "Create a new variable." -msgstr "새 변수 만들기." +msgstr "새 변수를 만들어요." #: modules/visual_script/visual_script_editor.cpp msgid "Signals:" @@ -10981,11 +11011,11 @@ msgstr "시그ë„:" #: modules/visual_script/visual_script_editor.cpp msgid "Create a new signal." -msgstr "새 ì‹œê·¸ë„ ë§Œë“¤ê¸°." +msgstr "새 시그ë„ì„ ë§Œë“¤ì–´ìš”." #: modules/visual_script/visual_script_editor.cpp msgid "Name is not a valid identifier:" -msgstr "ì´ë¦„ì´ ì˜¬ë°”ë¥¸ ì‹ë³„ìžê°€ 아닙니다:" +msgstr "ì´ë¦„ì´ ì˜¬ë°”ë¥¸ ì‹ë³„ìžê°€ 아님:" #: modules/visual_script/visual_script_editor.cpp msgid "Name already in use by another func/var/signal:" @@ -11008,7 +11038,6 @@ msgid "Add Function" msgstr "함수 추가하기" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Delete input port" msgstr "ìž…ë ¥ í¬íŠ¸ ì‚ì œí•˜ê¸°" @@ -11021,22 +11050,18 @@ msgid "Add Signal" msgstr "ì‹œê·¸ë„ ì¶”ê°€í•˜ê¸°" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Add Input Port" msgstr "ìž…ë ¥ í¬íŠ¸ 추가하기" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Add Output Port" msgstr "ì¶œë ¥ í¬íŠ¸ 추가하기" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Remove Input Port" msgstr "ìž…ë ¥ í¬íŠ¸ ì‚ì œí•˜ê¸°" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Remove Output Port" msgstr "ì¶œë ¥ í¬íŠ¸ ì‚ì œí•˜ê¸°" @@ -11055,8 +11080,8 @@ msgstr "비주얼 스í¬ë¦½íŠ¸ 노드 ë³µì œí•˜ê¸°" #: modules/visual_script/visual_script_editor.cpp msgid "Hold %s to drop a Getter. Hold Shift to drop a generic signature." msgstr "" -"%sì„(를) ëˆ„ë¥´ê³ ìžˆìœ¼ë©´ Getter를 ë“œë¡í•´ìš”. Shiftì„(를) ëˆ„ë¥´ê³ ìžˆìœ¼ë©´ ì¼ë°˜ì ì¸ " -"시그니처를 ë“œë¡í•´ìš”." +"%sì„(를) ëˆ„ë¥´ê³ ìžˆìœ¼ë©´ Getter를 ë“œë¡í•´ìš”. Shift를 ëˆ„ë¥´ê³ ìžˆìœ¼ë©´ ì¼ë°˜ì ì¸ ì‹œê·¸" +"니처를 ë“œë¡í•´ìš”." #: modules/visual_script/visual_script_editor.cpp msgid "Hold Ctrl to drop a Getter. Hold Shift to drop a generic signature." @@ -11087,6 +11112,7 @@ msgstr "Preload 노드 추가하기" #: modules/visual_script/visual_script_editor.cpp msgid "Can't drop nodes because script '%s' is not used in this scene." msgstr "" +"스í¬ë¦½íŠ¸ '%s'ì´(ê°€) ì´ ì”¬ì—ì„œ 사용ë˜ì§€ ì•Šê³ ìžˆì–´ì„œ 노드를 ë“œë¡í• 수 없어요." #: modules/visual_script/visual_script_editor.cpp msgid "Add Node(s) From Tree" @@ -11097,6 +11123,8 @@ msgid "" "Can't drop properties because script '%s' is not used in this scene.\n" "Drop holding 'Shift' to just copy the signature." msgstr "" +"스í¬ë¦½íŠ¸ '%s'ì´(ê°€) ì´ ì”¬ì—ì„œ 사용ë˜ì§€ ì•Šê³ ìžˆì–´ì„œ ì†ì„±ì„ ë“œë¡í• 수 없어요.\n" +"'Shift' 키를 누른 채로 ë“œë¡í•˜ë©´ 시그니처를 복사해요." #: modules/visual_script/visual_script_editor.cpp msgid "Add Getter Property" @@ -11123,9 +11151,8 @@ msgid "Connect Nodes" msgstr "노드 연결하기" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Disconnect Nodes" -msgstr "그래프 노드 ì—°ê²° í•´ì œ" +msgstr "그래프 노드 ì—°ê²° 풀기" #: modules/visual_script/visual_script_editor.cpp msgid "Connect Node Data" @@ -11160,26 +11187,24 @@ msgid "Paste VisualScript Nodes" msgstr "비주얼 스í¬ë¦½íŠ¸ 노드 붙여넣기" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Can't create function with a function node." -msgstr "함수 노드를 ë³µì‚¬í• ìˆ˜ 없어요." +msgstr "함수 노드가 있으면 함수를 만들 수 없어요." #: modules/visual_script/visual_script_editor.cpp msgid "Can't create function of nodes from nodes of multiple functions." -msgstr "" +msgstr "ë§Žì€ í•¨ìˆ˜ì˜ ë…¸ë“œì—ì„œ ë…¸ë“œì˜ í•¨ìˆ˜ë¥¼ 만들 수 없어요." #: modules/visual_script/visual_script_editor.cpp -msgid "Select atleast one node with sequence port." -msgstr "" +msgid "Select at least one node with sequence port." +msgstr "Sequence í¬íŠ¸ì—ì„œ ì ì–´ë„ í•˜ë‚˜ì˜ ë…¸ë“œë¥¼ ì„ íƒí•˜ì„¸ìš”." #: modules/visual_script/visual_script_editor.cpp msgid "Try to only have one sequence input in selection." -msgstr "" +msgstr "ì„ íƒ í•ëª©ì—ì„œ Sequence ìž…ë ¥ì´ í•˜ë‚˜ë§Œ 있ë„ë¡ í•˜ì„¸ìš”." #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Create Function" -msgstr "함수명 바꾸기" +msgstr "함수 만들기" #: modules/visual_script/visual_script_editor.cpp msgid "Remove Function" @@ -11210,13 +11235,12 @@ msgid "Members:" msgstr "멤버:" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "function_name" -msgstr "함수:" +msgstr "function_name" #: modules/visual_script/visual_script_editor.cpp msgid "Select or create a function to edit its graph." -msgstr "그래프를 편집하기 위한 함수를 ì„ íƒí•˜ê±°ë‚˜ 만들어요." +msgstr "그래프를 편집하기 위한 함수를 ì„ íƒí•˜ê±°ë‚˜ 만드세요." #: modules/visual_script/visual_script_editor.cpp msgid "Delete Selected" @@ -11235,14 +11259,12 @@ msgid "Cut Nodes" msgstr "노드 잘ë¼ë‚´ê¸°" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Make Function" -msgstr "함수명 바꾸기" +msgstr "함수 만들기" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Refresh Graph" -msgstr "ìƒˆë¡œê³ ì¹¨" +msgstr "그래프 ìƒˆë¡œê³ ì¹¨" #: modules/visual_script/visual_script_editor.cpp msgid "Edit Member" @@ -11254,11 +11276,11 @@ msgstr "ë°˜ë³µí• ìˆ˜ 없는 ìž…ë ¥ ìœ í˜•: " #: modules/visual_script/visual_script_flow_control.cpp msgid "Iterator became invalid" -msgstr "반복ìžê°€ 잘못ë˜ì—ˆì–´ìš”" +msgstr "Iteratorê°€ 잘못ëì–´ìš”" #: modules/visual_script/visual_script_flow_control.cpp msgid "Iterator became invalid: " -msgstr "반복ìžê°€ 잘못ë¨: " +msgstr "Iteratorê°€ 잘못ë¨: " #: modules/visual_script/visual_script_func_nodes.cpp msgid "Invalid index property name." @@ -11266,7 +11288,7 @@ msgstr "ìž˜ëª»ëœ ì¸ë±ìŠ¤ ì†ì„± ì´ë¦„." #: modules/visual_script/visual_script_func_nodes.cpp msgid "Base object is not a Node!" -msgstr "기본 ê°ì²´ëŠ” 노드가 아닙니다!" +msgstr "기본 ê°ì²´ëŠ” 노드가 아니ì—ìš”!" #: modules/visual_script/visual_script_func_nodes.cpp msgid "Path does not lead Node!" @@ -11274,7 +11296,7 @@ msgstr "노드를 ì§€ì •í•˜ëŠ” 경로가 아니ì—ìš”!" #: modules/visual_script/visual_script_func_nodes.cpp msgid "Invalid index property name '%s' in node %s." -msgstr "노드 %s ì•ˆì— ì¸ë±ìŠ¤ ì†ì„± ì´ë¦„ '%s'ì´(ê°€) 잘못ë¬ì–´ìš”." +msgstr "노드 %s ì•ˆì— ì¸ë±ìŠ¤ ì†ì„± ì´ë¦„ '%s'ì´(ê°€) 잘못ëì–´ìš”." #: modules/visual_script/visual_script_nodes.cpp msgid ": Invalid argument of type: " @@ -11294,14 +11316,14 @@ msgstr "VariableSetì„ ìŠ¤í¬ë¦½íŠ¸ì—ì„œ ì°¾ì„ ìˆ˜ ì—†ìŒ: " #: modules/visual_script/visual_script_nodes.cpp msgid "Custom node has no _step() method, can't process graph." -msgstr "맞춤 ë…¸ë“œì— _step() 메서드가 없어요, 그래프를 ì²˜ë¦¬í• ìˆ˜ 없어요." +msgstr "맞춤 ë…¸ë“œì— _step() 메서드가 없어요. 그래프를 ì²˜ë¦¬í• ìˆ˜ 없어요." #: modules/visual_script/visual_script_nodes.cpp msgid "" "Invalid return value from _step(), must be integer (seq out), or string " "(error)." msgstr "" -"_step()ì—ì„œ ìž˜ëª»ëœ ë°˜í™˜ ê°’ì´ì—ìš”, ì •ìˆ˜ (seq out), ë˜ëŠ” 문ìžì—´ (error)ì´ì–´ì•¼ " +"_step()ì—ì„œ ìž˜ëª»ëœ ë°˜í™˜ ê°’ì´ì—ìš”. ì •ìˆ˜ (seq out), ë˜ëŠ” 문ìžì—´ (error)ì´ì–´ì•¼ " "í•´ìš”." #: modules/visual_script/visual_script_property_selector.cpp @@ -11342,7 +11364,7 @@ msgstr "패키지는 ì ì–´ë„ í•˜ë‚˜ì˜ '.' 분리 기호가 있어야 í•´ìš”." #: platform/android/export/export.cpp msgid "Select device from the list" -msgstr "목ë¡ì—ì„œ 기기를 ì„ íƒí•˜ì„¸ìš”" +msgstr "목ë¡ì—ì„œ 기기 ì„ íƒí•˜ê¸°" #: platform/android/export/export.cpp msgid "ADB executable not configured in the Editor Settings." @@ -11374,7 +11396,7 @@ msgstr "" #: platform/android/export/export.cpp msgid "Invalid public key for APK expansion." -msgstr "APK í™•ìž¥ì— ìž˜ëª»ëœ ê³µê°œ 키ì´ì—ìš”." +msgstr "APK í™•ìž¥ì— ìž˜ëª»ëœ ê³µê°œ 키ì—ìš”." #: platform/android/export/export.cpp msgid "Invalid package name:" @@ -11435,7 +11457,7 @@ msgstr "숫ìžëŠ” ì‹ë³„ìž ì„¸ê·¸ë¨¼íŠ¸ì˜ ì²« 문ìžë¡œ 쓸 수 없어요." #: platform/iphone/export/export.cpp msgid "" "The character '%s' cannot be the first character in a Identifier segment." -msgstr "ë¬¸ìž '%s'ì€(는) ì‹ë³„ìž ì„¸ê·¸ë¨¼íŠ¸ì˜ ì²« 문ìžë¡œ 쓸 수 없어요." +msgstr "ë¬¸ìž '%s'ì€(는) ì‹ë³„ìž ë¶„ë¦¬ì˜ ì²« 문ìžë¡œ 쓸 수 없어요." #: platform/iphone/export/export.cpp msgid "The Identifier must have at least one '.' separator." @@ -11455,7 +11477,7 @@ msgstr "요구하는 ì•„ì´ì½˜ì„ 프리셋ì—ì„œ ì§€ì •í•˜ì§€ 않았어요." #: platform/javascript/export/export.cpp msgid "Stop HTTP Server" -msgstr "" +msgstr "HTTP 서버 멈추기" #: platform/javascript/export/export.cpp msgid "Run in Browser" @@ -11463,7 +11485,7 @@ msgstr "브ë¼ìš°ì €ì—ì„œ 실행하기" #: platform/javascript/export/export.cpp msgid "Run exported HTML in the system's default browser." -msgstr "내보낸 HTMLì„ ì‹œìŠ¤í…œì˜ ê¸°ë³¸ 브ë¼ìš°ì €ë¥¼ 사용하여 실행하기." +msgstr "내보낸 HTMLì„ ì‹œìŠ¤í…œì˜ ê¸°ë³¸ 브ë¼ìš°ì €ë¥¼ 사용하여 실행해요." #: platform/javascript/export/export.cpp msgid "Could not write file:" @@ -11490,10 +11512,18 @@ msgid "Using default boot splash image." msgstr "기본 부트 스플래시 ì´ë¯¸ì§€ 사용하기." #: platform/uwp/export/export.cpp +msgid "Invalid package short name." +msgstr "ìž˜ëª»ëœ íŒ¨í‚¤ì§€ 단축 ì´ë¦„." + +#: platform/uwp/export/export.cpp msgid "Invalid package unique name." msgstr "ìž˜ëª»ëœ íŒ¨í‚¤ì§€ ê³ ìœ ì´ë¦„." #: platform/uwp/export/export.cpp +msgid "Invalid package publisher display name." +msgstr "ìž˜ëª»ëœ íŒ¨í‚¤ì§€ ê²Œì‹œìž í‘œì‹œ ì´ë¦„." + +#: platform/uwp/export/export.cpp msgid "Invalid product GUID." msgstr "ìž˜ëª»ëœ ì œí’ˆ GUID." @@ -11555,7 +11585,7 @@ msgid "" "Consider adding a CollisionShape2D or CollisionPolygon2D as a child to " "define its shape." msgstr "" -"ì´ ë…¸ë“œëŠ” Shapeê°€ 없어요, 다른 물체와 충ëŒí•˜ê±°ë‚˜ ìƒí˜¸ìž‘ìš©í• ìˆ˜ 없어요.\n" +"ì´ ë…¸ë“œëŠ” Shapeê°€ 없어요, 다른 물체와 충ëŒí•˜ê±°ë‚˜ ìƒí˜¸ ìž‘ìš©í• ìˆ˜ 없어요.\n" "CollisionShape2D ë˜ëŠ” CollisionPolygon2D를 ìžì‹ 노드로 추가하여 Shape를 ì •ì˜" "하세요." @@ -11565,7 +11595,7 @@ msgid "" "CollisionObject2D derived node. Please only use it as a child of Area2D, " "StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape." msgstr "" -"CollisionPolygon2D는 CollisionObject2Dì— ì¶©ëŒ ëª¨ì–‘ì„ ì§€ì •í•˜ê¸° 위해서만 사용ë˜" +"CollisionPolygon2D는 CollisionObject2Dì— ì¶©ëŒ ëª¨ì–‘ì„ ì§€ì •í•˜ëŠ” ìš©ë„로만 사용ë¼" "ìš”. Shape를 ì •ì˜í•´ì•¼ 하는 Area2D, StaticBody2D, RigidBody2D, KinematicBody2D " "ë“±ì˜ ìžì‹ìœ¼ë¡œë§Œ 사용해주세요." @@ -11579,7 +11609,7 @@ msgid "" "CollisionObject2D derived node. Please only use it as a child of Area2D, " "StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape." msgstr "" -"CollisionShape2D는 CollisionObject2Dì— ì¶©ëŒ ëª¨ì–‘ì„ ì§€ì •í•˜ê¸° 위해서만 사용ë˜" +"CollisionShape2D는 CollisionObject2Dì— ì¶©ëŒ ëª¨ì–‘ì„ ì§€ì •í•˜ëŠ” ìš©ë„로만 사용ë¼" "ìš”. Shape를 ì •ì˜í•´ì•¼ 하는 Area2D, StaticBody2D, RigidBody2D, KinematicBody2D " "ë“±ì˜ ìžì‹ìœ¼ë¡œë§Œ 사용해주세요." @@ -11609,7 +11639,7 @@ msgstr "ì¡°ëª…ì˜ ëª¨ì–‘ì„ ë‚˜íƒ€ë‚¼ í…스처를 \"Texture\" ì†ì„±ì— ì§€ì •í msgid "" "An occluder polygon must be set (or drawn) for this occluder to take effect." msgstr "" -"ì´ Occluderê°€ ì˜í–¥ì„ 주게 í•˜ë ¤ë©´ Occluder í´ë¦¬ê³¤ì„ ì„¤ì •í•´ì•¼ (í˜¹ì€ ê·¸ë ¤ì•¼)í•´" +"ì´ Occluderê°€ ì˜í–¥ì„ 주게 í•˜ë ¤ë©´ Occluder í´ë¦¬ê³¤ì„ ì„¤ì •í•´ì•¼ (í˜¹ì€ ê·¸ë ¤ì•¼) í•´" "ìš”." #: scene/2d/light_occluder_2d.cpp @@ -11645,15 +11675,15 @@ msgid "" "CPUParticles\" option for this purpose." msgstr "" "GPU 기반 파티í´ì€ GLES2 비디오 ë“œë¼ì´ë²„ì—ì„œ 지ì›í•˜ì§€ ì•Šì•„ìš”.\n" -"ëŒ€ì‹ CPUParticles2D 노드를 사용하세요. ì´ ê²½ìš° \"CPU파티í´ë¡œ 변환\" ì˜µì…˜ì„ ì‚¬" -"ìš©í• ìˆ˜ 있어요." +"ëŒ€ì‹ CPUParticles2D 노드를 사용하세요. ì´ ê²½ìš° \"CPU파티í´ë¡œ 변환하기\" 옵션" +"ì„ ì‚¬ìš©í• ìˆ˜ 있어요." #: scene/2d/particles_2d.cpp scene/3d/particles.cpp msgid "" "A material to process the particles is not assigned, so no behavior is " "imprinted." msgstr "" -"파티í´ì„ ì²˜ë¦¬í• ë¨¸í‹°ë¦¬ì–¼ì„ ì§€ì •í•˜ì§€ ì•Šì•„ì„œ, 아무런 ë™ìž‘ë„ ì°ížˆì§€ 않았어요." +"파티í´ì„ ì²˜ë¦¬í• ë¨¸í‹°ë¦¬ì–¼ì„ ì§€ì •í•˜ì§€ 않았어요. 아무런 ë™ìž‘ë„ ì°ížˆì§€ ì•Šì•„ìš”." #: scene/2d/particles_2d.cpp msgid "" @@ -11674,7 +11704,7 @@ msgid "" "Change the size in children collision shapes instead." msgstr "" "(ìºë¦í„°ë‚˜ 리지드 모드ì—ì„œ) RigidBody2Dì˜ í¬ê¸° ë³€ê²½ì€ ë¬¼ë¦¬ ì—”ì§„ì´ ìž‘ë™í•˜ëŠ” ë™" -"안 í° ë¶€ë‹´ì´ ë˜ìš”.\n" +"안 í° ë¶€ë‹´ì´ ë¼ìš”.\n" "ëŒ€ì‹ ìžì‹ ì¶©ëŒ í˜•íƒœì˜ í¬ê¸°ë¥¼ 변경해보세요." #: scene/2d/remote_transform_2d.cpp @@ -11693,8 +11723,8 @@ msgstr "Bone2D는 Skeleton2D나 다른 Bone2Dê°€ 부모 노드로 있어야만 ì msgid "" "This bone lacks a proper REST pose. Go to the Skeleton2D node and set one." msgstr "" -"ì´ ë³¸ì— ì ì ˆí•œ 대기 ìžì„¸ê°€ 없습니다. Skeleton2D 노드로 가서 대기 ìžì„¸ë¥¼ ì„¤ì •" -"하세요." +"ì´ ë³¸ì— ì ì ˆí•œ 대기 ìžì„¸ê°€ 없어요. Skeleton2D 노드로 가서 대기 ìžì„¸ë¥¼ ì„¤ì •í•˜" +"세요." #: scene/2d/tile_map.cpp msgid "" @@ -11702,9 +11732,9 @@ msgid "" "to. Please use it as a child of Area2D, StaticBody2D, RigidBody2D, " "KinematicBody2D, etc. to give them a shape." msgstr "" -"Use Parentê°€ 켜진 TileMapì€ í˜•íƒœë¥¼ 주기 위한 부모 CollisionObject2Dê°€ 필요합" -"니다. 형태를 주기 위해 Area2D, StaticBody2D, RigidBody2D, KinematicBody2D 등" -"ì„ ìžì‹ 노드로 사용해주세요." +"Use Parentê°€ 켜진 TileMapì€ í˜•íƒœë¥¼ 주는 부모 CollisionObject2Dê°€ 필요해요. 형" +"태를 주기 위해 Area2D, StaticBody2D, RigidBody2D, KinematicBody2D ë“±ì„ ìžì‹ " +"노드로 사용해주세요." #: scene/2d/visibility_notifier_2d.cpp msgid "" @@ -11749,15 +11779,15 @@ msgstr "%d%%" #: scene/3d/baked_lightmap.cpp msgid "(Time Left: %d:%02d s)" -msgstr "(ë‚¨ì€ ì‹œê°„: %d:%02d s)" +msgstr "(ë‚¨ì€ ì‹œê°„: %d:%02d ì´ˆ)" #: scene/3d/baked_lightmap.cpp msgid "Plotting Meshes: " -msgstr "메시 구분 중: " +msgstr "구분하는 메시: " #: scene/3d/baked_lightmap.cpp msgid "Plotting Lights:" -msgstr "조명 구분 중:" +msgstr "구분하는 조명:" #: scene/3d/baked_lightmap.cpp scene/3d/gi_probe.cpp msgid "Finishing Plot" @@ -11765,7 +11795,7 @@ msgstr "구분 ë남" #: scene/3d/baked_lightmap.cpp msgid "Lighting Meshes: " -msgstr "ë©”ì‹œì— ì¡°ëª… 중: " +msgstr "조명 메시: " #: scene/3d/collision_object.cpp msgid "" @@ -11773,7 +11803,7 @@ msgid "" "Consider adding a CollisionShape or CollisionPolygon as a child to define " "its shape." msgstr "" -"ì´ ë…¸ë“œëŠ” Shapeê°€ 없어요, 다른 물체와 충ëŒí•˜ê±°ë‚˜ ìƒí˜¸ìž‘ìš©í• ìˆ˜ 없어요.\n" +"ì´ ë…¸ë“œëŠ” Shapeê°€ 없어요. 다른 물체와 충ëŒí•˜ê±°ë‚˜ ìƒí˜¸ ìž‘ìš©í• ìˆ˜ 없어요.\n" "CollisionShape ë˜ëŠ” CollisionPolygonì„ ìžì‹ 노드로 추가해서 Shapeì„ ì •ì˜í•´ë³´" "세요." @@ -11783,7 +11813,7 @@ msgid "" "CollisionObject derived node. Please only use it as a child of Area, " "StaticBody, RigidBody, KinematicBody, etc. to give them a shape." msgstr "" -"CollisionPolygonì€ CollisionObjectì— ì¶©ëŒ Shapeì„ ì§€ì •í•˜ê¸° 위해서만 사용ë¼" +"CollisionPolygonì€ CollisionObjectì— ì¶©ëŒ Shape를 ì§€ì •í•˜ëŠ” ìš©ë„로만 사용ë¼" "ìš”. Area, StaticBody, RigidBody, KinematicBody ë“±ì— ìžì‹ 노드로 추가해서 사용" "해주세요." @@ -11797,7 +11827,7 @@ msgid "" "derived node. Please only use it as a child of Area, StaticBody, RigidBody, " "KinematicBody, etc. to give them a shape." msgstr "" -"CollisionShapeì€ CollisionObjectì— ì¶©ëŒ Shapeì„ ì§€ì •í•˜ê¸° 위해서만 사용ë¼ìš”. " +"CollisionShapeì€ CollisionObjectì— ì¶©ëŒ Shape를 ì§€ì •í•˜ëŠ” ìš©ë„로만 사용ë¼ìš”. " "Area, StaticBody, RigidBody, KinematicBody ë“±ì— ìžì‹ 노드로 추가해서 사용해주" "세요." @@ -11831,7 +11861,7 @@ msgstr "" #: scene/3d/gi_probe.cpp msgid "Plotting Meshes" -msgstr "메시 구분 중" +msgstr "메시 구분하기" #: scene/3d/gi_probe.cpp msgid "" @@ -11854,8 +11884,8 @@ msgid "" "NavigationMeshInstance must be a child or grandchild to a Navigation node. " "It only provides navigation data." msgstr "" -"NavigationMeshInstance는 Navigation ë…¸ë“œì˜ ìžì‹ì´ë‚˜ ê·¸ ì•„ëž˜ì— ìžˆì–´ì•¼ í•´ìš”. ì´" -"ê²ƒì€ ë‚´ë¹„ê²Œì´ì…˜ ë°ì´í„°ë§Œì„ ì œê³µí•´ìš”." +"NavigationMeshInstance는 Navigation ë…¸ë“œì˜ ìžì‹ì´ë‚˜ ë” í•˜ìœ„ì— ìžˆì–´ì•¼ í•´ìš”. ì´" +"ê²ƒì€ ë‚´ë¹„ê²Œì´ì…˜ ë°ì´í„°ë§Œ ì œê³µí•´ìš”." #: scene/3d/particles.cpp msgid "" @@ -11864,13 +11894,13 @@ msgid "" "\" option for this purpose." msgstr "" "GPU 기반 파티í´ì€ GLES2 비디오 ë“œë¼ì´ë²„ì—ì„œ 지ì›í•˜ì§€ ì•Šì•„ìš”.\n" -"ëŒ€ì‹ CPUParticles 노드를 사용하세요. ì´ ê²½ìš° \"CPU파티í´ë¡œ 변환\" ì„¤ì •ì„ ì‚¬ìš©" -"í• ìˆ˜ 있어요." +"ëŒ€ì‹ CPUParticles 노드를 사용하세요. ì´ ê²½ìš° \"CPU파티í´ë¡œ 변환하기\" ì„¤ì •ì„ " +"ì‚¬ìš©í• ìˆ˜ 있어요." #: scene/3d/particles.cpp msgid "" "Nothing is visible because meshes have not been assigned to draw passes." -msgstr "ë©”ì‹œë“¤ì„ íŒ¨ìŠ¤ë¥¼ 그리ë„ë¡ ì§€ì •í•˜ì§€ ì•Šì•„ì„œ, 아무 ê²ƒë„ ë³´ì´ì§€ ì•Šì•„ìš”." +msgstr "메시가 패스를 그리ë„ë¡ ì§€ì •í•˜ì§€ ì•Šì•„ì„œ, 아무 ê²ƒë„ ë³´ì´ì§€ ì•Šì•„ìš”." #: scene/3d/particles.cpp msgid "" @@ -11900,7 +11930,7 @@ msgid "" msgstr "" "(ìºë¦í„°ë‚˜ 리지드 모드ì—ì„œ) RigidBodyì˜ í¬ê¸° ë³€ê²½ì€ ë¬¼ë¦¬ ì—”ì§„ì´ ìž‘ë™í•˜ëŠ” ë™ì•ˆ " "í° ë¶€ë‹´ì´ ë¼ìš”.\n" -"ëŒ€ì‹ ìžì‹ ì¶©ëŒ í˜•íƒœì˜ í¬ê¸°ë¥¼ 변경해보세요." +"ëŒ€ì‹ ìžì‹ ì¶©ëŒ ëª¨ì–‘ì˜ í¬ê¸°ë¥¼ 변경하세요." #: scene/3d/remote_transform.cpp msgid "" @@ -11951,7 +11981,7 @@ msgstr "" msgid "" "Only one WorldEnvironment is allowed per scene (or set of instanced scenes)." msgstr "" -"씬마다 (í˜¹ì€ ì¸ìŠ¤í„´ìŠ¤ëœ 씬 묶ìŒë§ˆë‹¤) WorldEnvironment는 하나만 허용ë˜ìš”." +"씬마다 (í˜¹ì€ ì¸ìŠ¤í„´ìŠ¤ëœ 씬 세트마다) WorldEnvironment는 하나만 허용ë¼ìš”." #: scene/3d/world_environment.cpp msgid "" @@ -11979,7 +12009,7 @@ msgstr "ìž˜ëª»ëœ ì• ë‹ˆë©”ì´ì…˜: '%s'." #: scene/animation/animation_tree.cpp msgid "Nothing connected to input '%s' of node '%s'." -msgstr "노드 '%s'ì˜ '%s' ìž…ë ¥ì— ì•„ë¬´ê²ƒë„ ì—°ê²°ë˜ì§€ ì•ŠìŒ." +msgstr "노드 '%s'ì˜ '%s' ìž…ë ¥ì— ì•„ë¬´ê²ƒë„ ì—°ê²°ë˜ì§€ 않았어요." #: scene/animation/animation_tree.cpp msgid "No root AnimationNode for the graph is set." @@ -12030,7 +12060,7 @@ msgid "" "If you don't intend to add a script, use a plain Control node instead." msgstr "" "Container ìžì²´ëŠ” ìžì‹ 배치 ìž‘ì—…ì„ êµ¬ì„±í•˜ëŠ” 스í¬ë¦½íŠ¸ 외ì—는 목ì ì´ ì—†ì–´ìš”.\n" -"스í¬ë¦½íŠ¸ë¥¼ 추가하지 않는 경우, 순수한 Control 노드를 사용해주세요." +"스í¬ë¦½íŠ¸ë¥¼ 추가하는 ì˜ë„ê°€ 없으면, 순수한 Control 노드를 사용해주세요." #: scene/gui/control.cpp msgid "" @@ -12038,7 +12068,7 @@ msgid "" "\"Ignore\". To solve this, set the Mouse Filter to \"Stop\" or \"Pass\"." msgstr "" "Hint Tooltipì€ Controlì˜ Mouse Filterê°€ \"Ignore\"으로 ì„¤ì •ë˜ì–´ 있기 ë•Œë¬¸ì— " -"ë³´ì´ì§€ ì•Šì•„ìš”. í•´ê²°í•˜ë ¤ë©´, Mouse Filter를 \"Stop\"ì´ë‚˜ \"Pass\"ë¡œ ì„¤ì •í•˜ì„¸ìš”." +"ë³´ì´ì§€ ì•Šì•„ìš”. í•´ê²°í•˜ë ¤ë©´ Mouse Filter를 \"Stop\"ì´ë‚˜ \"Pass\"ë¡œ ì„¤ì •í•˜ì„¸ìš”." #: scene/gui/dialogs.cpp msgid "Alert!" @@ -12068,8 +12098,8 @@ msgid "" "minimum size manually." msgstr "" "ScrollContainer는 ë‹¨ì¼ ìžì‹ Controlì„ ìž‘ì—…í•˜ê¸° 위한 것ì´ì—ìš”.\n" -"컨테ì´ë„ˆë¥¼ ìžì‹ìœ¼ë¡œ 사용하거나 (VBox, HBox 등), Controlì„ ì‚¬ìš©í•˜ê³ ë§žì¶¤ 최소 " -"수치를 수ë™ìœ¼ë¡œ ì„¤ì •í•˜ì„¸ì˜¤." +"(VBox, HBox 등) 컨테ì´ë„ˆë¥¼ ìžì‹ìœ¼ë¡œ 사용하거나, Controlì„ ì‚¬ìš©í•˜ê³ ë§žì¶¤ 최소 " +"수치를 수ë™ìœ¼ë¡œ ì„¤ì •í•˜ì„¸ìš”." #: scene/gui/tree.cpp msgid "(Other)" @@ -12081,7 +12111,7 @@ msgid "" "Environment -> Default Environment) could not be loaded." msgstr "" "프로ì 트 ì„¤ì • (Rendering -> Environment -> Default Environment)ì— ì§€ì •í•œ 기" -"본 í™˜ê²½ì€ ë¶ˆëŸ¬ì˜¬ 수 없어요." +"본 í™˜ê²½ì„ ë¶ˆëŸ¬ì˜¬ 수 없어요." #: scene/main/viewport.cpp msgid "" @@ -12091,8 +12121,8 @@ msgid "" "texture to some node for display." msgstr "" "ë·°í¬íŠ¸ë¥¼ ë Œë” ëŒ€ìƒìœ¼ë¡œ ì„¤ì •í•˜ì§€ 않았어요. ë·°í¬íŠ¸ì˜ ë‚´ìš©ì„ í™”ë©´ì— ì§ì ‘ 표시하" -"ë ¤ë©´, í¬ê¸°ë¥¼ 얻기 위해서 Controlì˜ ìžì‹ 노드로 만들어야 í•´ìš”. ê·¸ë ‡ì§€ ì•Šì„ ê²½" -"ìš°, í™”ë©´ì— í‘œì‹œí•˜ê¸° 위해서는 RenderTarget으로 ì„¤ì •í•˜ê³ ë‚´ë¶€ì ì¸ í…스처를 다" +"ë ¤ë©´, Controlì˜ ìžì‹ 노드로 만들어서 í¬ê¸°ë¥¼ 얻어야 í•´ìš”. ê·¸ë ‡ì§€ ì•Šì„ ê²½ìš°, í™”" +"ë©´ì— í‘œì‹œí•˜ê¸° 위해서는 ë·°í¬íŠ¸ë¥¼ RenderTarget으로 ë§Œë“¤ê³ ë‚´ë¶€ì ì¸ í…스처를 다" "른 ë…¸ë“œì— ì§€ì •í•´ì•¼ í•´ìš”." #: scene/resources/visual_shader_nodes.cpp @@ -12109,20 +12139,32 @@ msgstr "해당 ìœ í˜•ì— ìž˜ëª»ëœ ë¹„êµ í•¨ìˆ˜." #: servers/visual/shader_language.cpp msgid "Assignment to function." -msgstr "í•¨ìˆ˜ì— ë°°ì¹˜í•¨." +msgstr "í•¨ìˆ˜ì— ëŒ€ìž…." #: servers/visual/shader_language.cpp msgid "Assignment to uniform." -msgstr "ìœ ë‹ˆí¼ì— 배치함." +msgstr "Uniformì— ëŒ€ìž…." #: servers/visual/shader_language.cpp msgid "Varyings can only be assigned in vertex function." -msgstr "Varyings는 ì˜¤ì§ ê¼ì§“ì 함수ì—서만 ì§€ì •í• ìˆ˜ 있어요." +msgstr "Varyingì€ ê¼ì§“ì 함수ì—만 ì§€ì •í• ìˆ˜ 있어요." #: servers/visual/shader_language.cpp msgid "Constants cannot be modified." msgstr "ìƒìˆ˜ëŠ” ìˆ˜ì •í• ìˆ˜ 없어요." +#~ msgid "Pause the scene" +#~ msgstr "씬 ì¼ì‹œ ì •ì§€" + +#~ msgid "Shift+" +#~ msgstr "Shift+" + +#~ msgid "Alt+" +#~ msgstr "Alt+" + +#~ msgid "Control+" +#~ msgstr "Control+" + #~ msgid "Snap to Grid" #~ msgstr "격ìžì— 스냅" diff --git a/editor/translations/lt.po b/editor/translations/lt.po index 3d9a7bdd68..681bae9d5a 100644 --- a/editor/translations/lt.po +++ b/editor/translations/lt.po @@ -2847,7 +2847,7 @@ msgid "Play" msgstr "" #: editor/editor_node.cpp -msgid "Pause the scene" +msgid "Pause the scene execution for debugging." msgstr "" #: editor/editor_node.cpp @@ -3531,6 +3531,10 @@ msgid "New Inherited Scene" msgstr "" #: editor/filesystem_dock.cpp +msgid "Set As Main Scene" +msgstr "" + +#: editor/filesystem_dock.cpp #, fuzzy msgid "Open Scenes" msgstr "Atidaryti Skriptų Editorių" @@ -4269,6 +4273,20 @@ msgid "" msgstr "" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Anim Clips" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Audio Clips" +msgstr "Animacija: PridÄ—ti Takelį" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Functions" +msgstr "(Esama)" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/animation_state_machine_editor.cpp #, fuzzy msgid "Node Renamed" @@ -4959,6 +4977,14 @@ msgid "Grid Step:" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Primary Line Every:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "steps" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotation Offset:" msgstr "" @@ -4967,6 +4993,11 @@ msgid "Rotation Step:" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Scale Step:" +msgstr "SkalÄ—:" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move Vertical Guide" msgstr "" @@ -5052,6 +5083,20 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"Overrides game camera with editor viewport camera." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"No game instance running." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp msgid "Lock Selected" msgstr "" @@ -5193,6 +5238,10 @@ msgid "Use Rotation Snap" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Use Scale Snap" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap Relative" msgstr "" @@ -5332,7 +5381,7 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" -"Auto insert keys when objects are translated, rotated on scaled (based on " +"Auto insert keys when objects are translated, rotated or scaled (based on " "mask).\n" "Keys are only added to existing tracks, no new tracks will be created.\n" "Keys must be inserted manually for the first time." @@ -8255,7 +8304,7 @@ msgid "Dodge operator." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "HardLight operator" +msgid "HardLight operator." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8848,9 +8897,10 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Custom Godot Shader Language expression, which placed on top of the resulted " -"shader. You can place various function definitions inside and call it later " -"in the Expressions. You can also declare varyings, uniforms and constants." +"Custom Godot Shader Language expression, which is placed on top of the " +"resulted shader. You can place various function definitions inside and call " +"it later in the Expressions. You can also declare varyings, uniforms and " +"constants." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8960,6 +9010,12 @@ msgid "Add..." msgstr "" #: editor/project_export.cpp +msgid "" +"If checked, the preset will be available for use in one-click deploy.\n" +"Only one preset per platform may be marked as runnable." +msgstr "" + +#: editor/project_export.cpp #, fuzzy msgid "Export Path" msgstr "Importuoti iÅ¡ Nodo:" @@ -9405,18 +9461,6 @@ msgid "Device" msgstr "" #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Shift+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Alt+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Control+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "Press a Key..." msgstr "" @@ -11145,7 +11189,7 @@ msgid "Can't create function of nodes from nodes of multiple functions." msgstr "" #: modules/visual_script/visual_script_editor.cpp -msgid "Select atleast one node with sequence port." +msgid "Select at least one node with sequence port." msgstr "" #: modules/visual_script/visual_script_editor.cpp @@ -11456,11 +11500,21 @@ msgstr "" #: platform/uwp/export/export.cpp #, fuzzy +msgid "Invalid package short name." +msgstr "Netinkamas Å¡rifto dydis." + +#: platform/uwp/export/export.cpp +#, fuzzy msgid "Invalid package unique name." msgstr "Netinkamas Å¡rifto dydis." #: platform/uwp/export/export.cpp #, fuzzy +msgid "Invalid package publisher display name." +msgstr "Netinkamas Å¡rifto dydis." + +#: platform/uwp/export/export.cpp +#, fuzzy msgid "Invalid product GUID." msgstr "Netinkamas Å¡rifto dydis." diff --git a/editor/translations/lv.po b/editor/translations/lv.po index 26a3d6d7d1..a0b68a3a64 100644 --- a/editor/translations/lv.po +++ b/editor/translations/lv.po @@ -2847,7 +2847,7 @@ msgid "Play" msgstr "" #: editor/editor_node.cpp -msgid "Pause the scene" +msgid "Pause the scene execution for debugging." msgstr "" #: editor/editor_node.cpp @@ -3521,6 +3521,11 @@ msgstr "" #: editor/filesystem_dock.cpp #, fuzzy +msgid "Set As Main Scene" +msgstr "SaglabÄt KÄ" + +#: editor/filesystem_dock.cpp +#, fuzzy msgid "Open Scenes" msgstr "Atjaunina Ainu" @@ -4258,6 +4263,21 @@ msgid "" msgstr "" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Anim Clips" +msgstr "AnimÄcijas klipi:" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Audio Clips" +msgstr "Audio klipi:" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Functions" +msgstr "Funkcijas:" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/animation_state_machine_editor.cpp msgid "Node Renamed" msgstr "" @@ -4935,6 +4955,14 @@ msgid "Grid Step:" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Primary Line Every:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "steps" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotation Offset:" msgstr "" @@ -4943,6 +4971,11 @@ msgid "Rotation Step:" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Scale Step:" +msgstr "MÄ“roga AttiecÄ«ba:" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move Vertical Guide" msgstr "" @@ -5028,6 +5061,20 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"Overrides game camera with editor viewport camera." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"No game instance running." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp msgid "Lock Selected" msgstr "" @@ -5168,6 +5215,10 @@ msgid "Use Rotation Snap" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Use Scale Snap" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap Relative" msgstr "" @@ -5307,7 +5358,7 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" -"Auto insert keys when objects are translated, rotated on scaled (based on " +"Auto insert keys when objects are translated, rotated or scaled (based on " "mask).\n" "Keys are only added to existing tracks, no new tracks will be created.\n" "Keys must be inserted manually for the first time." @@ -8228,7 +8279,7 @@ msgid "Dodge operator." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "HardLight operator" +msgid "HardLight operator." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8820,9 +8871,10 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Custom Godot Shader Language expression, which placed on top of the resulted " -"shader. You can place various function definitions inside and call it later " -"in the Expressions. You can also declare varyings, uniforms and constants." +"Custom Godot Shader Language expression, which is placed on top of the " +"resulted shader. You can place various function definitions inside and call " +"it later in the Expressions. You can also declare varyings, uniforms and " +"constants." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8931,6 +8983,12 @@ msgid "Add..." msgstr "" #: editor/project_export.cpp +msgid "" +"If checked, the preset will be available for use in one-click deploy.\n" +"Only one preset per platform may be marked as runnable." +msgstr "" + +#: editor/project_export.cpp msgid "Export Path" msgstr "" @@ -9369,18 +9427,6 @@ msgid "Device" msgstr "" #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Shift+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Alt+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Control+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "Press a Key..." msgstr "" @@ -11108,7 +11154,7 @@ msgid "Can't create function of nodes from nodes of multiple functions." msgstr "" #: modules/visual_script/visual_script_editor.cpp -msgid "Select atleast one node with sequence port." +msgid "Select at least one node with sequence port." msgstr "" #: modules/visual_script/visual_script_editor.cpp @@ -11419,11 +11465,21 @@ msgstr "" #: platform/uwp/export/export.cpp #, fuzzy +msgid "Invalid package short name." +msgstr "NederÄ«gs nosaukums." + +#: platform/uwp/export/export.cpp +#, fuzzy msgid "Invalid package unique name." msgstr "NederÄ«gs nosaukums." #: platform/uwp/export/export.cpp #, fuzzy +msgid "Invalid package publisher display name." +msgstr "NederÄ«gs nosaukums." + +#: platform/uwp/export/export.cpp +#, fuzzy msgid "Invalid product GUID." msgstr "NederÄ«gs nosaukums." diff --git a/editor/translations/mi.po b/editor/translations/mi.po index f78d6f5259..dbd85cdd3a 100644 --- a/editor/translations/mi.po +++ b/editor/translations/mi.po @@ -2754,7 +2754,7 @@ msgid "Play" msgstr "" #: editor/editor_node.cpp -msgid "Pause the scene" +msgid "Pause the scene execution for debugging." msgstr "" #: editor/editor_node.cpp @@ -3419,6 +3419,10 @@ msgid "New Inherited Scene" msgstr "" #: editor/filesystem_dock.cpp +msgid "Set As Main Scene" +msgstr "" + +#: editor/filesystem_dock.cpp msgid "Open Scenes" msgstr "" @@ -4128,6 +4132,18 @@ msgid "" msgstr "" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Anim Clips" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Audio Clips" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Functions" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/animation_state_machine_editor.cpp msgid "Node Renamed" msgstr "" @@ -4794,6 +4810,14 @@ msgid "Grid Step:" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Primary Line Every:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "steps" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotation Offset:" msgstr "" @@ -4802,6 +4826,10 @@ msgid "Rotation Step:" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale Step:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move Vertical Guide" msgstr "" @@ -4883,6 +4911,20 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"Overrides game camera with editor viewport camera." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"No game instance running." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp msgid "Lock Selected" msgstr "" @@ -5017,6 +5059,10 @@ msgid "Use Rotation Snap" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Use Scale Snap" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap Relative" msgstr "" @@ -5156,7 +5202,7 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" -"Auto insert keys when objects are translated, rotated on scaled (based on " +"Auto insert keys when objects are translated, rotated or scaled (based on " "mask).\n" "Keys are only added to existing tracks, no new tracks will be created.\n" "Keys must be inserted manually for the first time." @@ -7983,7 +8029,7 @@ msgid "Dodge operator." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "HardLight operator" +msgid "HardLight operator." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8570,9 +8616,10 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Custom Godot Shader Language expression, which placed on top of the resulted " -"shader. You can place various function definitions inside and call it later " -"in the Expressions. You can also declare varyings, uniforms and constants." +"Custom Godot Shader Language expression, which is placed on top of the " +"resulted shader. You can place various function definitions inside and call " +"it later in the Expressions. You can also declare varyings, uniforms and " +"constants." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8681,6 +8728,12 @@ msgid "Add..." msgstr "" #: editor/project_export.cpp +msgid "" +"If checked, the preset will be available for use in one-click deploy.\n" +"Only one preset per platform may be marked as runnable." +msgstr "" + +#: editor/project_export.cpp msgid "Export Path" msgstr "" @@ -9117,18 +9170,6 @@ msgid "Device" msgstr "" #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Shift+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Alt+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Control+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "Press a Key..." msgstr "" @@ -10817,7 +10858,7 @@ msgid "Can't create function of nodes from nodes of multiple functions." msgstr "" #: modules/visual_script/visual_script_editor.cpp -msgid "Select atleast one node with sequence port." +msgid "Select at least one node with sequence port." msgstr "" #: modules/visual_script/visual_script_editor.cpp @@ -11122,10 +11163,18 @@ msgid "Using default boot splash image." msgstr "" #: platform/uwp/export/export.cpp +msgid "Invalid package short name." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package unique name." msgstr "" #: platform/uwp/export/export.cpp +msgid "Invalid package publisher display name." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid product GUID." msgstr "" diff --git a/editor/translations/ml.po b/editor/translations/ml.po index d4b49c12cc..255a961ea7 100644 --- a/editor/translations/ml.po +++ b/editor/translations/ml.po @@ -4,12 +4,13 @@ # This file is distributed under the same license as the Godot source code. # christy james <jkuttu@gmail.com>, 2018. # Lakshmi-Jayakumar <lakshmi.jayakumar.tkm@gmail.com>, 2019. +# Anvar Nazar <anvarnasar@ymail.com>, 2019. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2019-10-17 04:52+0000\n" -"Last-Translator: Lakshmi-Jayakumar <lakshmi.jayakumar.tkm@gmail.com>\n" +"PO-Revision-Date: 2019-11-09 22:04+0000\n" +"Last-Translator: Anvar Nazar <anvarnasar@ymail.com>\n" "Language-Team: Malayalam <https://hosted.weblate.org/projects/godot-engine/" "godot/ml/>\n" "Language: ml\n" @@ -17,7 +18,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 3.9\n" +"X-Generator: Weblate 3.10-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -48,201 +49,201 @@ msgstr "à´…à´Ÿà´¿à´¸àµà´¥à´¾à´¨ തരം% sഇനൠഅസാധàµà´µà´¾à´¯ #: core/math/expression.cpp msgid "Invalid named index '%s' for base type %s" -msgstr "" +msgstr "'%s' à´…à´Ÿà´¿à´¸àµà´¥à´¾à´¨ തരതàµà´¤à´¿àµ»à´±àµ† '%s' à´Žà´¨àµà´¨ സൂചിക ശരിയലàµà´²" #: core/math/expression.cpp msgid "Invalid arguments to construct '%s'" -msgstr "" +msgstr "'%s' നിർമികàµà´•àµà´µà´¾àµ» à´•à´¿à´Ÿàµà´Ÿà´¿à´¯ വിവരങàµà´™àµ¾ തെറàµà´±à´¾à´£àµ" #: core/math/expression.cpp msgid "On call to '%s':" -msgstr "" +msgstr "'%s' വിളിചàµà´šà´ªàµà´ªàµ‹àµ¾:" #: core/ustring.cpp msgid "B" -msgstr "" +msgstr "ബൈറàµà´±àµ" #: core/ustring.cpp msgid "KiB" -msgstr "" +msgstr "കിലോബൈറàµà´±àµ" #: core/ustring.cpp msgid "MiB" -msgstr "" +msgstr "മെഗാബൈറàµà´±àµ" #: core/ustring.cpp msgid "GiB" -msgstr "" +msgstr "ജിഗാബൈറàµà´±àµ" #: core/ustring.cpp msgid "TiB" -msgstr "" +msgstr "ടെറാബൈറàµà´±àµ" #: core/ustring.cpp msgid "PiB" -msgstr "" +msgstr "പീറàµà´±à´¾à´¬àµˆà´±àµà´±àµ" #: core/ustring.cpp msgid "EiB" -msgstr "" +msgstr "à´Žà´•àµà´¸à´¿à´¬àµˆà´±àµà´±àµ" #: editor/animation_bezier_editor.cpp msgid "Free" -msgstr "" +msgstr "സൗജനàµà´¯à´‚" #: editor/animation_bezier_editor.cpp msgid "Balanced" -msgstr "" +msgstr "സമതàµà´²à´¿à´¤à´‚" #: editor/animation_bezier_editor.cpp msgid "Mirror" -msgstr "" +msgstr "à´•à´£àµà´£à´¾à´Ÿà´¿" #: editor/animation_bezier_editor.cpp editor/editor_profiler.cpp msgid "Time:" -msgstr "" +msgstr "സമയം:" #: editor/animation_bezier_editor.cpp msgid "Value:" -msgstr "" +msgstr "വില:" #: editor/animation_bezier_editor.cpp msgid "Insert Key Here" -msgstr "" +msgstr "സൂചിക ഇവിടെയിടàµà´•" #: editor/animation_bezier_editor.cpp msgid "Duplicate Selected Key(s)" -msgstr "" +msgstr "സൂചികകളàµà´Ÿàµ† പകർപàµà´ªàµ†à´Ÿàµà´•àµà´•àµà´•" #: editor/animation_bezier_editor.cpp msgid "Delete Selected Key(s)" -msgstr "" +msgstr "സൂചികകൾ നീകàµà´•à´‚ ചെയàµà´¯àµà´•" #: editor/animation_bezier_editor.cpp msgid "Add Bezier Point" -msgstr "" +msgstr "ബെസിയർ ബിനàµà´¦àµ ചേർകàµà´•àµà´•" #: editor/animation_bezier_editor.cpp msgid "Move Bezier Points" -msgstr "" +msgstr "ബെസിയർ ബിനàµà´¦àµ നീകàµà´•àµà´•" #: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp msgid "Anim Duplicate Keys" -msgstr "" +msgstr "ചലനസൂചികകൾ പകർതàµà´¤àµà´•" #: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp msgid "Anim Delete Keys" -msgstr "" +msgstr "ചലനസൂചികകൾ കളയàµà´•" #: editor/animation_track_editor.cpp msgid "Anim Change Keyframe Time" -msgstr "" +msgstr "ചലനസൂചികയàµà´Ÿàµ† സമയം മാറàµà´±àµà´•" #: editor/animation_track_editor.cpp msgid "Anim Change Transition" -msgstr "" +msgstr "സംകàµà´°à´®à´£à´‚ ചലിപàµà´ªà´¿à´•àµà´•àµà´•" #: editor/animation_track_editor.cpp msgid "Anim Change Transform" -msgstr "" +msgstr "പരിവർതàµà´¤à´¨à´‚ ചലിപàµà´ªà´¿à´•àµà´•àµà´•" #: editor/animation_track_editor.cpp msgid "Anim Change Keyframe Value" -msgstr "" +msgstr "ചലന തിരസൂചനയàµà´Ÿàµ† വില മാറàµà´±àµà´•" #: editor/animation_track_editor.cpp msgid "Anim Change Call" -msgstr "" +msgstr "മാറàµà´±à´‚ വിളി ചലിപàµà´ªà´¿à´•àµà´•àµà´•" #: editor/animation_track_editor.cpp msgid "Anim Multi Change Keyframe Time" -msgstr "" +msgstr "പല മാറàµà´±à´‚ തിരസൂചനയàµà´Ÿàµ† സമയം ചലിപàµà´ªà´¿à´•àµà´•àµà´•" #: editor/animation_track_editor.cpp msgid "Anim Multi Change Transition" -msgstr "" +msgstr "പലമാറàµà´± സംകàµà´°à´®à´£à´‚ ചലിപàµà´ªà´¿à´•àµà´•àµà´•" #: editor/animation_track_editor.cpp msgid "Anim Multi Change Transform" -msgstr "" +msgstr "പലമാറàµà´± പരിവർതàµà´¤à´¨à´‚ ചലിപàµà´ªà´¿à´•àµà´•àµà´•" #: editor/animation_track_editor.cpp msgid "Anim Multi Change Keyframe Value" -msgstr "" +msgstr "പലമാറàµà´± ചാവിതàµà´¤à´¿à´°à´¯àµà´Ÿàµ† വില ചലിപàµà´ªà´¿à´•àµà´•àµà´•" #: editor/animation_track_editor.cpp msgid "Anim Multi Change Call" -msgstr "" +msgstr "പലമാറàµà´± വിളി ചലിപàµà´ªà´¿à´•àµà´•àµà´•" #: editor/animation_track_editor.cpp msgid "Change Animation Length" -msgstr "" +msgstr "ചലനതàµà´¤à´¿àµ»à´±àµ† നേരം മാറàµà´±àµà´•" #: editor/animation_track_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Change Animation Loop" -msgstr "" +msgstr "ചലനാവർതàµà´¤à´¨à´‚ മാറàµà´±àµà´•" #: editor/animation_track_editor.cpp msgid "Property Track" -msgstr "" +msgstr "à´—àµà´£à´‚ നോകàµà´•àµà´•" #: editor/animation_track_editor.cpp msgid "3D Transform Track" -msgstr "" +msgstr "à´¤àµà´°à´¿à´®à´¾à´¨ പരിവർതàµà´¤à´¨à´‚ നോകàµà´•àµà´•" #: editor/animation_track_editor.cpp msgid "Call Method Track" -msgstr "" +msgstr "വിളി രീതി നോകàµà´•àµà´•" #: editor/animation_track_editor.cpp msgid "Bezier Curve Track" -msgstr "" +msgstr "ബെസിയർ വളവൠനോകàµà´•àµà´•" #: editor/animation_track_editor.cpp msgid "Audio Playback Track" -msgstr "" +msgstr "ശബàµà´¦à´‚ പാടàµà´¨àµà´¨à´¤àµ നോകàµà´•àµà´•" #: editor/animation_track_editor.cpp msgid "Animation Playback Track" -msgstr "" +msgstr "ചലനം à´“à´Ÿàµà´¨àµà´¨à´¤àµ നോകàµà´•àµà´•" #: editor/animation_track_editor.cpp msgid "Animation length (frames)" -msgstr "" +msgstr "ചലന നേരം (തിരകൾ)" #: editor/animation_track_editor.cpp msgid "Animation length (seconds)" -msgstr "" +msgstr "ചലന നേരം (ഞൊടികൾ)" #: editor/animation_track_editor.cpp msgid "Add Track" -msgstr "" +msgstr "വഴി ചേർകàµà´•àµà´•" #: editor/animation_track_editor.cpp msgid "Animation Looping" -msgstr "" +msgstr "ചലനം à´šàµà´±àµà´±àµ½" #: editor/animation_track_editor.cpp #: modules/visual_script/visual_script_editor.cpp msgid "Functions:" -msgstr "" +msgstr "à´ªàµà´°à´µàµƒà´¤àµà´¤à´¿à´•àµ¾:" #: editor/animation_track_editor.cpp msgid "Audio Clips:" -msgstr "" +msgstr "ശബàµà´¦à´°àµ‡à´–കൾ:" #: editor/animation_track_editor.cpp msgid "Anim Clips:" -msgstr "" +msgstr "ചലനരേഖകൾ:" #: editor/animation_track_editor.cpp msgid "Change Track Path" -msgstr "" +msgstr "നോകàµà´•à´²à´¿àµ»à´±àµ† വഴി മാറàµà´±àµà´•" #: editor/animation_track_editor.cpp msgid "Toggle this track on/off." -msgstr "" +msgstr "à´ˆ വഴി à´“(ണോ/ഫോ) ആകàµà´•àµà´•." #: editor/animation_track_editor.cpp msgid "Update Mode (How this property is set)" @@ -2763,7 +2764,7 @@ msgid "Play" msgstr "" #: editor/editor_node.cpp -msgid "Pause the scene" +msgid "Pause the scene execution for debugging." msgstr "" #: editor/editor_node.cpp @@ -3428,6 +3429,10 @@ msgid "New Inherited Scene" msgstr "" #: editor/filesystem_dock.cpp +msgid "Set As Main Scene" +msgstr "" + +#: editor/filesystem_dock.cpp msgid "Open Scenes" msgstr "" @@ -4137,6 +4142,21 @@ msgid "" msgstr "" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Anim Clips" +msgstr "ചലനരേഖകൾ:" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Audio Clips" +msgstr "ശബàµà´¦à´°àµ‡à´–കൾ:" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Functions" +msgstr "à´ªàµà´°à´µàµƒà´¤àµà´¤à´¿à´•àµ¾:" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/animation_state_machine_editor.cpp msgid "Node Renamed" msgstr "" @@ -4803,6 +4823,14 @@ msgid "Grid Step:" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Primary Line Every:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "steps" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotation Offset:" msgstr "" @@ -4811,6 +4839,10 @@ msgid "Rotation Step:" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale Step:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move Vertical Guide" msgstr "" @@ -4892,6 +4924,20 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"Overrides game camera with editor viewport camera." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"No game instance running." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp msgid "Lock Selected" msgstr "" @@ -5026,6 +5072,10 @@ msgid "Use Rotation Snap" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Use Scale Snap" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap Relative" msgstr "" @@ -5165,7 +5215,7 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" -"Auto insert keys when objects are translated, rotated on scaled (based on " +"Auto insert keys when objects are translated, rotated or scaled (based on " "mask).\n" "Keys are only added to existing tracks, no new tracks will be created.\n" "Keys must be inserted manually for the first time." @@ -7992,7 +8042,7 @@ msgid "Dodge operator." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "HardLight operator" +msgid "HardLight operator." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8579,9 +8629,10 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Custom Godot Shader Language expression, which placed on top of the resulted " -"shader. You can place various function definitions inside and call it later " -"in the Expressions. You can also declare varyings, uniforms and constants." +"Custom Godot Shader Language expression, which is placed on top of the " +"resulted shader. You can place various function definitions inside and call " +"it later in the Expressions. You can also declare varyings, uniforms and " +"constants." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8690,6 +8741,12 @@ msgid "Add..." msgstr "" #: editor/project_export.cpp +msgid "" +"If checked, the preset will be available for use in one-click deploy.\n" +"Only one preset per platform may be marked as runnable." +msgstr "" + +#: editor/project_export.cpp msgid "Export Path" msgstr "" @@ -9126,18 +9183,6 @@ msgid "Device" msgstr "" #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Shift+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Alt+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Control+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "Press a Key..." msgstr "" @@ -10826,7 +10871,7 @@ msgid "Can't create function of nodes from nodes of multiple functions." msgstr "" #: modules/visual_script/visual_script_editor.cpp -msgid "Select atleast one node with sequence port." +msgid "Select at least one node with sequence port." msgstr "" #: modules/visual_script/visual_script_editor.cpp @@ -11131,10 +11176,18 @@ msgid "Using default boot splash image." msgstr "" #: platform/uwp/export/export.cpp +msgid "Invalid package short name." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package unique name." msgstr "" #: platform/uwp/export/export.cpp +msgid "Invalid package publisher display name." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid product GUID." msgstr "" diff --git a/editor/translations/ms.po b/editor/translations/ms.po index 74ade07fc8..7ff31a456c 100644 --- a/editor/translations/ms.po +++ b/editor/translations/ms.po @@ -2786,7 +2786,7 @@ msgid "Play" msgstr "" #: editor/editor_node.cpp -msgid "Pause the scene" +msgid "Pause the scene execution for debugging." msgstr "" #: editor/editor_node.cpp @@ -3451,6 +3451,10 @@ msgid "New Inherited Scene" msgstr "" #: editor/filesystem_dock.cpp +msgid "Set As Main Scene" +msgstr "" + +#: editor/filesystem_dock.cpp msgid "Open Scenes" msgstr "" @@ -4165,6 +4169,20 @@ msgid "" msgstr "" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Anim Clips" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Audio Clips" +msgstr "Anim Tambah Trek" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Functions" +msgstr "Semua Pilihan" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/animation_state_machine_editor.cpp msgid "Node Renamed" msgstr "" @@ -4835,6 +4853,14 @@ msgid "Grid Step:" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Primary Line Every:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "steps" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotation Offset:" msgstr "" @@ -4843,6 +4869,10 @@ msgid "Rotation Step:" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale Step:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move Vertical Guide" msgstr "" @@ -4925,6 +4955,20 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"Overrides game camera with editor viewport camera." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"No game instance running." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp msgid "Lock Selected" msgstr "" @@ -5063,6 +5107,10 @@ msgid "Use Rotation Snap" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Use Scale Snap" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap Relative" msgstr "" @@ -5202,7 +5250,7 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" -"Auto insert keys when objects are translated, rotated on scaled (based on " +"Auto insert keys when objects are translated, rotated or scaled (based on " "mask).\n" "Keys are only added to existing tracks, no new tracks will be created.\n" "Keys must be inserted manually for the first time." @@ -8048,7 +8096,7 @@ msgid "Dodge operator." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "HardLight operator" +msgid "HardLight operator." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8637,9 +8685,10 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Custom Godot Shader Language expression, which placed on top of the resulted " -"shader. You can place various function definitions inside and call it later " -"in the Expressions. You can also declare varyings, uniforms and constants." +"Custom Godot Shader Language expression, which is placed on top of the " +"resulted shader. You can place various function definitions inside and call " +"it later in the Expressions. You can also declare varyings, uniforms and " +"constants." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8748,6 +8797,12 @@ msgid "Add..." msgstr "" #: editor/project_export.cpp +msgid "" +"If checked, the preset will be available for use in one-click deploy.\n" +"Only one preset per platform may be marked as runnable." +msgstr "" + +#: editor/project_export.cpp msgid "Export Path" msgstr "" @@ -9184,18 +9239,6 @@ msgid "Device" msgstr "" #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Shift+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Alt+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Control+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "Press a Key..." msgstr "" @@ -10897,7 +10940,7 @@ msgid "Can't create function of nodes from nodes of multiple functions." msgstr "" #: modules/visual_script/visual_script_editor.cpp -msgid "Select atleast one node with sequence port." +msgid "Select at least one node with sequence port." msgstr "" #: modules/visual_script/visual_script_editor.cpp @@ -11202,10 +11245,18 @@ msgid "Using default boot splash image." msgstr "" #: platform/uwp/export/export.cpp +msgid "Invalid package short name." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package unique name." msgstr "" #: platform/uwp/export/export.cpp +msgid "Invalid package publisher display name." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid product GUID." msgstr "" diff --git a/editor/translations/nb.po b/editor/translations/nb.po index d7a63a7f8c..b7422a2f92 100644 --- a/editor/translations/nb.po +++ b/editor/translations/nb.po @@ -3041,8 +3041,8 @@ msgid "Play" msgstr "Spill" #: editor/editor_node.cpp -msgid "Pause the scene" -msgstr "Pause scenen" +msgid "Pause the scene execution for debugging." +msgstr "" #: editor/editor_node.cpp msgid "Pause Scene" @@ -3770,6 +3770,11 @@ msgstr "Ny Arvet Scene..." #: editor/filesystem_dock.cpp #, fuzzy +msgid "Set As Main Scene" +msgstr "Velg en HovedScene" + +#: editor/filesystem_dock.cpp +#, fuzzy msgid "Open Scenes" msgstr "Ã…pne Scene" @@ -4565,6 +4570,21 @@ msgid "" msgstr "" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Anim Clips" +msgstr "Anim-klipp:" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Audio Clips" +msgstr "Lydklipp:" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Functions" +msgstr "Funksjoner:" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/animation_state_machine_editor.cpp #, fuzzy msgid "Node Renamed" @@ -5281,6 +5301,15 @@ msgid "Grid Step:" msgstr "Rutenett Steg:" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Primary Line Every:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "steps" +msgstr "2 steg" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotation Offset:" msgstr "Rotasjon Offset:" @@ -5290,6 +5319,11 @@ msgstr "Rotasjon Steg:" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy +msgid "Scale Step:" +msgstr "Skala:" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy msgid "Move Vertical Guide" msgstr "Flytt vertikal veileder" @@ -5383,6 +5417,20 @@ msgstr "Endre Anker" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"Overrides game camera with editor viewport camera." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"No game instance running." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp #, fuzzy msgid "Lock Selected" msgstr "Slett Valgte" @@ -5536,6 +5584,11 @@ msgid "Use Rotation Snap" msgstr "Bruk Rotasjons-Snap" #: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Use Scale Snap" +msgstr "Bruk Snap" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap Relative" msgstr "Snap Relativt" @@ -5689,7 +5742,7 @@ msgstr "Sett inn Nøkkel (Eksisterende Spor)" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" -"Auto insert keys when objects are translated, rotated on scaled (based on " +"Auto insert keys when objects are translated, rotated or scaled (based on " "mask).\n" "Keys are only added to existing tracks, no new tracks will be created.\n" "Keys must be inserted manually for the first time." @@ -8739,7 +8792,7 @@ msgid "Dodge operator." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "HardLight operator" +msgid "HardLight operator." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -9335,9 +9388,10 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Custom Godot Shader Language expression, which placed on top of the resulted " -"shader. You can place various function definitions inside and call it later " -"in the Expressions. You can also declare varyings, uniforms and constants." +"Custom Godot Shader Language expression, which is placed on top of the " +"resulted shader. You can place various function definitions inside and call " +"it later in the Expressions. You can also declare varyings, uniforms and " +"constants." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -9449,6 +9503,12 @@ msgid "Add..." msgstr "" #: editor/project_export.cpp +msgid "" +"If checked, the preset will be available for use in one-click deploy.\n" +"Only one preset per platform may be marked as runnable." +msgstr "" + +#: editor/project_export.cpp #, fuzzy msgid "Export Path" msgstr "Eksporter Prosjekt" @@ -9914,18 +9974,6 @@ msgid "Device" msgstr "" #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Shift+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Alt+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Control+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "Press a Key..." msgstr "" @@ -11734,7 +11782,7 @@ msgid "Can't create function of nodes from nodes of multiple functions." msgstr "" #: modules/visual_script/visual_script_editor.cpp -msgid "Select atleast one node with sequence port." +msgid "Select at least one node with sequence port." msgstr "" #: modules/visual_script/visual_script_editor.cpp @@ -12056,11 +12104,21 @@ msgstr "" #: platform/uwp/export/export.cpp #, fuzzy +msgid "Invalid package short name." +msgstr "Ugyldig navn." + +#: platform/uwp/export/export.cpp +#, fuzzy msgid "Invalid package unique name." msgstr "Ugyldig navn." #: platform/uwp/export/export.cpp #, fuzzy +msgid "Invalid package publisher display name." +msgstr "Ugyldig navn." + +#: platform/uwp/export/export.cpp +#, fuzzy msgid "Invalid product GUID." msgstr "Prosjektnavn:" @@ -12599,6 +12657,9 @@ msgstr "" msgid "Constants cannot be modified." msgstr "Konstanter kan ikke endres." +#~ msgid "Pause the scene" +#~ msgstr "Pause scenen" + #, fuzzy #~ msgid "Snap to Grid" #~ msgstr "Snap til rutenett" diff --git a/editor/translations/nl.po b/editor/translations/nl.po index 950e7f4573..10d32da522 100644 --- a/editor/translations/nl.po +++ b/editor/translations/nl.po @@ -37,12 +37,14 @@ # Hector Peeters <hector.peeters@gmail.com>, 2019. # Shawn Gyina <gyina.shawn@gmail.com>, 2019. # ebbe <ebbesteenhoudt@gmail.com>, 2019. +# Tirrin <lensenjoe@gmail.com>, 2019. +# Filip Van Raemdonck <arrawn@gmail.com>, 2019. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2019-10-18 18:02+0000\n" -"Last-Translator: ebbe <ebbesteenhoudt@gmail.com>\n" +"PO-Revision-Date: 2019-11-29 14:49+0000\n" +"Last-Translator: Filip Van Raemdonck <arrawn@gmail.com>\n" "Language-Team: Dutch <https://hosted.weblate.org/projects/godot-engine/godot/" "nl/>\n" "Language: nl\n" @@ -50,12 +52,12 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 3.9.1-dev\n" +"X-Generator: Weblate 3.10-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp msgid "Invalid type argument to convert(), use TYPE_* constants." -msgstr "Ongeldig argumenttype aan convert(), gebruik TYPE_* constanten." +msgstr "Ongeldig argumenttype voor convert(), gebruik TYPE_* constanten." #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/mono/glue/gd_glue.cpp @@ -189,29 +191,24 @@ msgid "Anim Change Call" msgstr "Anim Wijzig Aanroep" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Anim Multi Change Keyframe Time" -msgstr "Anim Wijzig Keyframe Waarde" +msgstr "anim-multi-change keyframe tijd" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Anim Multi Change Transition" -msgstr "Anim Wijzig Overgang" +msgstr "anim-multi-change overgang" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Anim Multi Change Transform" -msgstr "Anim Wijzig Transform" +msgstr "anim-multi-change transformatie" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Anim Multi Change Keyframe Value" -msgstr "Anim Wijzig Keyframe Waarde" +msgstr "Anim-Multi-Change keyframe waarde" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Anim Multi Change Call" -msgstr "Anim Wijzig Aanroep" +msgstr "Anim-Multi-Change aanroep" #: editor/animation_track_editor.cpp msgid "Change Animation Length" @@ -251,9 +248,8 @@ msgid "Animation length (frames)" msgstr "Animatielengte (in frames)" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Animation length (seconds)" -msgstr "Animatielengte (in seconden)" +msgstr "Animatielengte (seconden)" #: editor/animation_track_editor.cpp msgid "Add Track" @@ -478,7 +474,6 @@ msgid "Track path is invalid, so can't add a method key." msgstr "Track path is niet geldig, dus kan geen methode key toevoegen." #: editor/animation_track_editor.cpp -#, fuzzy msgid "Add Method Track Key" msgstr "Voeg Methode Track sleutel toe" @@ -536,7 +531,6 @@ msgid "Warning: Editing imported animation" msgstr "Waarschuwing: Geïmporteerde animatie bewerken" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Select an AnimationPlayer node to create and edit animations." msgstr "" "Selecteer een AnimationPlayer uit de Scene Tree om animaties te wijzigen." @@ -550,9 +544,8 @@ msgid "Group tracks by node or display them as plain list." msgstr "Sporen weergeven op basis van nodes of als lijst." #: editor/animation_track_editor.cpp -#, fuzzy msgid "Snap:" -msgstr "Snap:" +msgstr "Uitlijnen:" #: editor/animation_track_editor.cpp msgid "Animation step value." @@ -672,9 +665,8 @@ msgid "Scale Ratio:" msgstr "Schaal Ratio:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Select Tracks to Copy" -msgstr "Selecteer sporen om te kopieren:" +msgstr "Selecteer sporen om te kopieren" #: editor/animation_track_editor.cpp editor/editor_log.cpp #: editor/editor_properties.cpp @@ -686,9 +678,8 @@ msgid "Copy" msgstr "Kopiëren" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Select All/None" -msgstr "Niets Selecteren" +msgstr "Selectie leegmaken" #: editor/animation_track_editor_plugins.cpp msgid "Add Audio Track Clip" @@ -727,12 +718,10 @@ msgid "Replaced %d occurrence(s)." msgstr "%d voorgekomen waarde(s) vervangen." #: editor/code_editor.cpp editor/editor_help.cpp -#, fuzzy msgid "%d match." msgstr "%d overeenkomst(en) gevonden." #: editor/code_editor.cpp editor/editor_help.cpp -#, fuzzy msgid "%d matches." msgstr "%d overeenkomst(en) gevonden." @@ -798,24 +787,20 @@ msgstr "" "script aan de doel Node." #: editor/connections_dialog.cpp -#, fuzzy msgid "Connect to Node:" -msgstr "Verbind Aan Node:" +msgstr "Vasthechten aan knooppunt:" #: editor/connections_dialog.cpp -#, fuzzy msgid "Connect to Script:" -msgstr "Kan niet verbinden met host:" +msgstr "Koppelen met script:" #: editor/connections_dialog.cpp -#, fuzzy msgid "From Signal:" -msgstr "Signalen:" +msgstr "Vanuit signaal:" #: editor/connections_dialog.cpp -#, fuzzy msgid "Scene does not contain any script." -msgstr "Node bevat geen geometrie." +msgstr "Scene bevat geen script." #: editor/connections_dialog.cpp editor/editor_autoload_settings.cpp #: editor/groups_editor.cpp editor/plugins/item_list_editor_plugin.cpp @@ -843,9 +828,8 @@ msgid "Extra Call Arguments:" msgstr "Extra Aanroep Argumenten:" #: editor/connections_dialog.cpp -#, fuzzy msgid "Advanced" -msgstr "Uitlijnen opties" +msgstr "Geavanceerd" #: editor/connections_dialog.cpp msgid "Deferred" @@ -855,14 +839,16 @@ msgstr "Uitgesteld" msgid "" "Defers the signal, storing it in a queue and only firing it at idle time." msgstr "" +"Stelt het signaal uit, bewaart het in een wachtrij en activeert het pas op " +"een dood moment." #: editor/connections_dialog.cpp msgid "Oneshot" -msgstr "Eénschots" +msgstr "Eenmalig" #: editor/connections_dialog.cpp msgid "Disconnects the signal after its first emission." -msgstr "" +msgstr "Ontkoppelt het signaal na eerste keer uitzenden." #: editor/connections_dialog.cpp msgid "Cannot connect signal" @@ -917,9 +903,8 @@ msgid "Connect a Signal to a Method" msgstr "Verbind een Signaal met een Methode" #: editor/connections_dialog.cpp -#, fuzzy msgid "Edit Connection:" -msgstr "Verbinding bewerken: " +msgstr "Verbinding bewerken:" #: editor/connections_dialog.cpp msgid "Are you sure you want to remove all connections from the \"%s\" signal?" @@ -997,22 +982,20 @@ msgid "Dependencies For:" msgstr "Afhankelijkheden Voor:" #: editor/dependency_editor.cpp -#, fuzzy msgid "" "Scene '%s' is currently being edited.\n" "Changes will only take effect when reloaded." msgstr "" -"Scene '%s' wordt op dit moment gewijzigd.\n" -"Wijzigingen hebben geen effect tenzij de scene herladen worden." +"Scene '%s' wordt momenteel gewijzigd.\n" +"Wijzigingen hebben pas effect na herladen." #: editor/dependency_editor.cpp -#, fuzzy msgid "" "Resource '%s' is in use.\n" "Changes will only take effect when reloaded." msgstr "" "Resource '%s' is in gebruik.\n" -"Wijzigingen zullen effect hebben wanneer herladen." +"Wijzigingen hebben pas effect na herladen." #: editor/dependency_editor.cpp #: modules/gdnative/gdnative_library_editor_plugin.cpp @@ -1059,11 +1042,10 @@ msgid "Owners Of:" msgstr "Eigenaren Van:" #: editor/dependency_editor.cpp -#, fuzzy msgid "Remove selected files from the project? (Can't be restored)" msgstr "" "Verwijder geselecteerde bestanden van het project? (Kan niet ongedaan " -"worden.)" +"gemaakt worden.)" #: editor/dependency_editor.cpp msgid "" @@ -1108,13 +1090,12 @@ msgid "Permanently delete %d item(s)? (No undo!)" msgstr "%d item(s) permanent verwijderen? (Kan niet ongedaan worden!)" #: editor/dependency_editor.cpp -#, fuzzy msgid "Show Dependencies" -msgstr "Afhankelijkheden" +msgstr "Toon Afhankelijkheden" #: editor/dependency_editor.cpp msgid "Orphan Resource Explorer" -msgstr "Wees Resource Verkenner" +msgstr "Verweesde hulpbronnen verkenner" #: editor/dependency_editor.cpp editor/editor_audio_buses.cpp #: editor/editor_file_dialog.cpp editor/editor_node.cpp @@ -1201,22 +1182,20 @@ msgid "License" msgstr "Licentie" #: editor/editor_about.cpp -#, fuzzy msgid "Third-party Licenses" -msgstr "Derde partijslicentie" +msgstr "Licentie van derden" #: editor/editor_about.cpp -#, fuzzy msgid "" "Godot Engine relies on a number of third-party free and open source " "libraries, all compatible with the terms of its MIT license. The following " "is an exhaustive list of all such third-party components with their " "respective copyright statements and license terms." msgstr "" -"Godot Engine maakt gebruik van enkele gratis en open-source bibliotheken, " -"ontwikkeld door derden, die compatibel zijn met onze MIT licentie. Wat volgt " -"is een exhaustieve lijst van alle componenten van een derde partij met hun " -"respectievelijke copyrightberichten en licentietermen." +"Godot Engine maakt gebruik van een aantal gratis en open-source " +"bibliotheken, ontwikkeld door derden, die compatibel zijn met onze MIT " +"licentie. Wat volgt is een exhaustieve lijst van alle componenten van een " +"derde partij met hun respectievelijke copyrightberichten en licentietermen." #: editor/editor_about.cpp msgid "All Components" @@ -1231,7 +1210,6 @@ msgid "Licenses" msgstr "Licenties" #: editor/editor_asset_installer.cpp editor/project_manager.cpp -#, fuzzy msgid "Error opening package file, not in ZIP format." msgstr "Fout bij het openen van het pakketbestand, geen zip-formaat." @@ -1246,7 +1224,7 @@ msgstr "Pakket succesvol geïnstalleerd!" #: editor/editor_asset_installer.cpp #: editor/plugins/asset_library_editor_plugin.cpp msgid "Success!" -msgstr "Geslaagd!" +msgstr "Gelukt!" #: editor/editor_asset_installer.cpp editor/editor_node.cpp msgid "Install" @@ -1301,9 +1279,8 @@ msgid "Delete Bus Effect" msgstr "Verwijder audiobuseffect" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Drag & drop to rearrange." -msgstr "Audiobus, versleep om volgorde te veranderen." +msgstr "Versleep om volgorde te veranderen." #: editor/editor_audio_buses.cpp msgid "Solo" @@ -1376,7 +1353,7 @@ msgstr "Open Audio Bus Lay-out" #: editor/editor_audio_buses.cpp msgid "There is no '%s' file." -msgstr "" +msgstr "Het '%s' bestand bestaat niet." #: editor/editor_audio_buses.cpp editor/plugins/canvas_item_editor_plugin.cpp msgid "Layout" @@ -1391,7 +1368,6 @@ msgid "Add Bus" msgstr "Bus Toevoegen" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Add a new Audio Bus to this layout." msgstr "Voeg een nieuwe Audio Bus toe aan deze layout." @@ -1434,26 +1410,20 @@ msgid "Valid characters:" msgstr "Geldige karakters:" #: editor/editor_autoload_settings.cpp -#, fuzzy msgid "Must not collide with an existing engine class name." -msgstr "Ongeldige naam. Moet niet botsen met een bestaande engine klasse naam." +msgstr "Mag niet conflicteren met bestaande engine klasse naam." #: editor/editor_autoload_settings.cpp -#, fuzzy msgid "Must not collide with an existing built-in type name." -msgstr "" -"Ongeldige naam. Mag niet botsen met een bestaande ingebouwde type naam." +msgstr "Mag niet conflicteren met een bestaande ingebouwde type naam." #: editor/editor_autoload_settings.cpp -#, fuzzy msgid "Must not collide with an existing global constant name." -msgstr "" -"Ongeldige naam. Mag niet botsen met de naam van een bestaande globale " -"constante." +msgstr "Mag niet conflicteren met de naam van een bestaande globale constante." #: editor/editor_autoload_settings.cpp msgid "Keyword cannot be used as an autoload name." -msgstr "" +msgstr "Sleutelwoorden mogen niet gebruikt worden als autoload naam." #: editor/editor_autoload_settings.cpp msgid "Autoload '%s' already exists!" @@ -1484,9 +1454,8 @@ msgid "Rearrange Autoloads" msgstr "Herschik Autoloads" #: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp -#, fuzzy msgid "Invalid path." -msgstr "Ongeldig Pad." +msgstr "Ongeldig pad." #: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp msgid "File does not exist." @@ -1541,9 +1510,8 @@ msgid "[unsaved]" msgstr "[niet opgeslagen]" #: editor/editor_dir_dialog.cpp -#, fuzzy msgid "Please select a base directory first." -msgstr "Kies eerst een basisfolder" +msgstr "Kies eerst een basismap." #: editor/editor_dir_dialog.cpp msgid "Choose a Directory" @@ -1596,6 +1564,8 @@ msgid "" "Target platform requires 'ETC2' texture compression for GLES3. Enable " "'Import Etc 2' in Project Settings." msgstr "" +"Doelplatform vereist 'ETC2' textuurcompressie voor GLES3. Schakel 'Import " +"Etc 2' in bij de Projectinstellingen." #: editor/editor_export.cpp msgid "" @@ -1604,6 +1574,10 @@ msgid "" "Enable 'Import Etc' in Project Settings, or disable 'Driver Fallback " "Enabled'." msgstr "" +"Doelplatform vereist 'ETC' textuurcompressie zodat het stuurprogramma kan " +"terugvallen op GLES2.\n" +"Schakel 'Import Etc' in bij de Projectinstellingen, of schakel de optie " +"'Driver Fallback Enabled' uit." #: editor/editor_export.cpp platform/android/export/export.cpp #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp @@ -1623,124 +1597,107 @@ msgstr "Template bestand niet gevonden:" #: editor/editor_export.cpp msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." -msgstr "" +msgstr "Bij 32-bit export mag de ingebouwde PCK niet groter zijn dan 4 GiB." #: editor/editor_feature_profile.cpp -#, fuzzy msgid "3D Editor" -msgstr "Verwerker" +msgstr "3D Editor" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Script Editor" -msgstr "Open Script Bewerker" +msgstr "Script Editor" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Asset Library" -msgstr "Open Asset Bibliotheek" +msgstr "Asset bibliotheek" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Scene Tree Editing" -msgstr "Scene Uitvoerinstellingen" +msgstr "Scene structuur bewerking" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Import Dock" -msgstr "Importeren" +msgstr "Dock importeren" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Node Dock" -msgstr "Verplaatsingsmodus" +msgstr "Knooppunt dock" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "FileSystem and Import Docks" -msgstr "Bestandssysteem" +msgstr "Bestandssysteem en Docks importeren" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Erase profile '%s'? (no undo)" -msgstr "Alle vervangen (geen ongedaan maken)" +msgstr "Profiel '%s' verwijderen? (kan niet ongedaan gemaakt worden)" #: editor/editor_feature_profile.cpp msgid "Profile must be a valid filename and must not contain '.'" -msgstr "" +msgstr "Profiel moet een geldige bestandsnaam hebben en mag geen '.' bevatten" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Profile with this name already exists." -msgstr "Er bestaat al een bestand of map met deze naam." +msgstr "Er bestaat al een profiel met deze naam." #: editor/editor_feature_profile.cpp msgid "(Editor Disabled, Properties Disabled)" -msgstr "" +msgstr "(Editor uitgeschakeld, eigenschappen uitgeschakeld)" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "(Properties Disabled)" -msgstr "Alleen Eigenschappen" +msgstr "(Eigenschappen uitgeschakeld)" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "(Editor Disabled)" -msgstr "Uitgeschakeld" +msgstr "(Editor uitgeschakeld)" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Class Options:" -msgstr "Klassebeschrijving:" +msgstr "Klasse opties:" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Enable Contextual Editor" -msgstr "Open de volgende Editor" +msgstr "Open de Contextbewuste Editor" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Enabled Properties:" -msgstr "Eigenschappen:" +msgstr "Ingeschakelde Eigenschappen:" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Enabled Features:" -msgstr "Kenmerken" +msgstr "Ingeschakelde Functionaliteit:" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Enabled Classes:" -msgstr "Zoek Klasses" +msgstr "Ingeschakelde Klassen:" #: editor/editor_feature_profile.cpp msgid "File '%s' format is invalid, import aborted." -msgstr "" +msgstr "'%s' bestandsformaat is ongeldig, het importeren is afgebroken." #: editor/editor_feature_profile.cpp msgid "" "Profile '%s' already exists. Remove it first before importing, import " "aborted." msgstr "" +"Profiel '%s' bestaat al. Verwijder het eerst vooraleer te importeren. " +"Importeren afgebroken." #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Error saving profile to path: '%s'." -msgstr "Error bij het laden van sjabloon '%s'" +msgstr "Error bij het opslaan van profiel naar pad: '%s'." #: editor/editor_feature_profile.cpp msgid "Unset" -msgstr "" +msgstr "Ongezet" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Current Profile:" -msgstr "Huidige Versie:" +msgstr "Huidig Profiel:" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Make Current" -msgstr "Huidig:" +msgstr "Aktualiseren" #: editor/editor_feature_profile.cpp #: editor/plugins/animation_player_editor_plugin.cpp @@ -1758,39 +1715,32 @@ msgid "Export" msgstr "Exporteren" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Available Profiles:" -msgstr "Beschikbare Nodes:" +msgstr "Beschikbare Profielen:" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Class Options" -msgstr "Klassebeschrijving" +msgstr "Klasse-opties" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "New profile name:" -msgstr "Nieuwe naam:" +msgstr "Nieuwe profielnaam:" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Erase Profile" -msgstr "Wis TileMap" +msgstr "Wis Profiel" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Import Profile(s)" -msgstr "Geïmporteerd Project" +msgstr "Profiel(en) importeren" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Export Profile" -msgstr "Project Exporteren" +msgstr "Profiel exporteren" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Manage Editor Feature Profiles" -msgstr "Beheer Export Templates" +msgstr "Editor Profielen beheren" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Select Current Folder" @@ -1814,7 +1764,6 @@ msgstr "Openen in Bestandsbeheer" #: editor/editor_file_dialog.cpp editor/editor_node.cpp #: editor/filesystem_dock.cpp editor/project_manager.cpp -#, fuzzy msgid "Show in File Manager" msgstr "Weergeven in Bestandsbeheer" @@ -1899,33 +1848,28 @@ msgid "Move Favorite Down" msgstr "Verplaats Favoriet Naar Beneden" #: editor/editor_file_dialog.cpp -#, fuzzy msgid "Go to previous folder." -msgstr "Ga naar bovenliggende folder" +msgstr "Ga naar de voorafgaande map." #: editor/editor_file_dialog.cpp -#, fuzzy msgid "Go to next folder." -msgstr "Ga naar bovenliggende folder" +msgstr "Ga naar de volgende map." #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp -#, fuzzy msgid "Go to parent folder." -msgstr "Ga naar bovenliggende folder" +msgstr "Ga naar de bovenliggende map." #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp -#, fuzzy msgid "Refresh files." -msgstr "Zoek bestanden" +msgstr "Ververs bestandslijst." #: editor/editor_file_dialog.cpp msgid "(Un)favorite current folder." msgstr "(On)favoriet huidige map." #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp -#, fuzzy msgid "Toggle the visibility of hidden files." -msgstr "Toggle Verborgen Bestanden" +msgstr "Maak verborgen bestanden (on)zichtbaar." #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp msgid "View items as a grid of thumbnails." @@ -1962,6 +1906,8 @@ msgid "" "There are multiple importers for different types pointing to file %s, import " "aborted" msgstr "" +"Er zijn meerdere importers gevonden voor verschillende typen voor bestand " +"%s, import afgebroken" #: editor/editor_file_system.cpp msgid "(Re)Importing Assets" @@ -1985,9 +1931,8 @@ msgid "Inherited by:" msgstr "Geërfd door:" #: editor/editor_help.cpp -#, fuzzy msgid "Brief Description" -msgstr "Korte Beschrijving:" +msgstr "Korte Omschrijving" #: editor/editor_help.cpp msgid "Properties" @@ -2018,9 +1963,8 @@ msgid "Class Description" msgstr "Klassebeschrijving" #: editor/editor_help.cpp -#, fuzzy msgid "Online Tutorials" -msgstr "Online Documentatie:" +msgstr "Online Zelfstudie" #: editor/editor_help.cpp msgid "" @@ -2033,9 +1977,8 @@ msgstr "" "$color][url=$url2]een aan te vragen[/url][/color]." #: editor/editor_help.cpp -#, fuzzy msgid "Property Descriptions" -msgstr "Eigenschap Beschrijving:" +msgstr "Eigenschap Beschrijvingen" #: editor/editor_help.cpp msgid "" @@ -2046,9 +1989,8 @@ msgstr "" "door [color=$color][url=$url]een toe te voegen[/url][/color]!" #: editor/editor_help.cpp -#, fuzzy msgid "Method Descriptions" -msgstr "Methode Beschrijving:" +msgstr "Methode Beschrijvingen" #: editor/editor_help.cpp msgid "" @@ -2088,14 +2030,12 @@ msgid "Properties Only" msgstr "Alleen Eigenschappen" #: editor/editor_help_search.cpp -#, fuzzy msgid "Theme Properties Only" -msgstr "Eigenschappen" +msgstr "Enkel Thema Eigenschappen" #: editor/editor_help_search.cpp -#, fuzzy msgid "Member Type" -msgstr "Leden" +msgstr "Type Lid" #: editor/editor_help_search.cpp msgid "Class" @@ -2147,16 +2087,15 @@ msgstr "Start" #: editor/editor_network_profiler.cpp msgid "%s/s" -msgstr "" +msgstr "%s/s" #: editor/editor_network_profiler.cpp -#, fuzzy msgid "Down" -msgstr "Download" +msgstr "Omlaag" #: editor/editor_network_profiler.cpp msgid "Up" -msgstr "" +msgstr "Omhoog" #: editor/editor_network_profiler.cpp editor/editor_node.cpp msgid "Node" @@ -2164,23 +2103,23 @@ msgstr "Knooppunt" #: editor/editor_network_profiler.cpp msgid "Incoming RPC" -msgstr "" +msgstr "Inkomende RPC" #: editor/editor_network_profiler.cpp msgid "Incoming RSET" -msgstr "" +msgstr "Inkomende RSET" #: editor/editor_network_profiler.cpp msgid "Outgoing RPC" -msgstr "" +msgstr "Uitgaande RPC" #: editor/editor_network_profiler.cpp msgid "Outgoing RSET" -msgstr "" +msgstr "Uitgaande RSET" #: editor/editor_node.cpp editor/project_manager.cpp msgid "New Window" -msgstr "" +msgstr "Nieuw Venster" #: editor/editor_node.cpp msgid "Project export failed with error code %d." @@ -2200,13 +2139,12 @@ msgid "Error saving resource!" msgstr "Error bij het opslaan van resource!" #: editor/editor_node.cpp -#, fuzzy msgid "" "This resource can't be saved because it does not belong to the edited scene. " "Make it unique first." msgstr "" -"Deze bron kan niet worden opgeslagen omdat het niet bij de bewerkte scene " -"behoort. Maak het eerst uniek." +"Deze hulpbron kan niet bewaard worden omdat ze geen deel uitmaakt van de " +"bewerkte scene. Maak ze eerst alleenstaand." #: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp msgid "Save Resource As..." @@ -2324,13 +2262,12 @@ msgstr "" "beter te begrijpen." #: editor/editor_node.cpp -#, fuzzy msgid "" "This resource belongs to a scene that was instanced or inherited.\n" "Changes to it won't be kept when saving the current scene." msgstr "" -"Dit bestand hoort bij een scene die geïnstantieerd of overgeërfd werd.\n" -"Aanpassingen zullen niet worden bijgehouden bij het opslaan van de huidige " +"Dit bestand hoort bij een scene die geïnstantieerd of overgeërfd werd.\n" +"Aanpassingen zullen niet worden behouden bij het opslaan van de huidige " "scene." #: editor/editor_node.cpp @@ -2342,30 +2279,27 @@ msgstr "" "instellingen aan in het importeerpaneel en importeer het nadien opnieuw." #: editor/editor_node.cpp -#, fuzzy msgid "" "This scene was imported, so changes to it won't be kept.\n" "Instancing it or inheriting will allow making changes to it.\n" "Please read the documentation relevant to importing scenes to better " "understand this workflow." msgstr "" -"Deze scene werd geïmporteerd, dus aanpassingen zullen niet worden " -"opgeslagen.\n" -"Instantieer het of erf het over om er aanpassingen aan te maken.\n" -"Lees de documentatie over scenes importeren om deze workflow beter te " -"begrijpen." +"Deze scene werd geïmporteerd, dus aanpassingen zullen niet worden behouden.\n" +"Door het te instantieren of over te erven kunnen er wijzigingen worden " +"aangebracht.\n" +"Lees de documentatie met betrekking tot importeren van scenes om deze " +"workflow beter te begrijpen." #: editor/editor_node.cpp -#, fuzzy msgid "" "This is a remote object, so changes to it won't be kept.\n" "Please read the documentation relevant to debugging to better understand " "this workflow." msgstr "" -"Dit bestand hoort bij een scene die geïmporteerd werd, dus het is niet " -"bewerkbaar.\n" -"Lees de documentatie over scenes importeren om deze workflow beter te " -"begrijpen." +"Dit is een object op afstand, dus aanpassingen zullen niet worden behouden.\n" +"Lees de documentatie met betrekking tot remote debugging om deze workflow " +"beter te begrijpen." #: editor/editor_node.cpp msgid "There is no defined scene to run." @@ -2388,9 +2322,8 @@ msgid "Open Base Scene" msgstr "Open Basisscene" #: editor/editor_node.cpp -#, fuzzy msgid "Quick Open..." -msgstr "Open Scene Snel..." +msgstr "Snel Openen..." #: editor/editor_node.cpp msgid "Quick Open Scene..." @@ -2409,9 +2342,8 @@ msgid "Save changes to '%s' before closing?" msgstr "Sla wijzigen aan '%s' op voor het afsluiten?" #: editor/editor_node.cpp -#, fuzzy msgid "Saved %s modified resource(s)." -msgstr "Mislukt om resource te laden." +msgstr "Gewijzigde bron(en) %s opgeslagen." #: editor/editor_node.cpp msgid "A root node is required to save the scene." @@ -2518,9 +2450,8 @@ msgid "Close Scene" msgstr "Scene Sluiten" #: editor/editor_node.cpp -#, fuzzy msgid "Reopen Closed Scene" -msgstr "Scene Sluiten" +msgstr "Gesloten Scène Opnieuw Openen" #: editor/editor_node.cpp msgid "Unable to enable addon plugin at: '%s' parsing of config failed." @@ -2626,23 +2557,20 @@ msgstr "Standaard" #: editor/editor_node.cpp editor/editor_properties.cpp #: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp -#, fuzzy msgid "Show in FileSystem" -msgstr "Toon in Bestandsbeheer" +msgstr "Weergeven in Bestandssysteem" #: editor/editor_node.cpp -#, fuzzy msgid "Play This Scene" -msgstr "Speel Scene" +msgstr "Speel deze scène af" #: editor/editor_node.cpp msgid "Close Tab" msgstr "Tabblad sluiten" #: editor/editor_node.cpp -#, fuzzy msgid "Undo Close Tab" -msgstr "Tabblad sluiten" +msgstr "Tabblad Sluiten Ongedaan Maken" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp msgid "Close Other Tabs" @@ -2650,12 +2578,11 @@ msgstr "Sluit Andere Tabbladen" #: editor/editor_node.cpp msgid "Close Tabs to the Right" -msgstr "" +msgstr "Sluit de Tabbladen aan de Rechterkant" #: editor/editor_node.cpp -#, fuzzy msgid "Close All Tabs" -msgstr "Sluit Alles" +msgstr "Sluit Alle Tabbladen" #: editor/editor_node.cpp msgid "Switch Scene Tab" @@ -2698,9 +2625,8 @@ msgid "Go to previously opened scene." msgstr "Ga naar de vorige geopende scene." #: editor/editor_node.cpp -#, fuzzy msgid "Copy Text" -msgstr "Kopieer Pad" +msgstr "Tekst Kopiëren" #: editor/editor_node.cpp msgid "Next tab" @@ -2739,7 +2665,6 @@ msgid "Save Scene" msgstr "Scene Opslaan" #: editor/editor_node.cpp -#, fuzzy msgid "Save All Scenes" msgstr "Alle Scenes Opslaan" @@ -2748,12 +2673,10 @@ msgid "Convert To..." msgstr "Converteer Naar..." #: editor/editor_node.cpp -#, fuzzy msgid "MeshLibrary..." msgstr "MeshBibilotheek..." #: editor/editor_node.cpp -#, fuzzy msgid "TileSet..." msgstr "TileSet..." @@ -2780,45 +2703,40 @@ msgid "Project" msgstr "Project" #: editor/editor_node.cpp -#, fuzzy msgid "Project Settings..." -msgstr "Projectinstellingen" +msgstr "Projectinstellingen..." #: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Version Control" -msgstr "Versie:" +msgstr "Versiebeheer" #: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp msgid "Set Up Version Control" -msgstr "" +msgstr "Versiebeheer Instellen" #: editor/editor_node.cpp msgid "Shut Down Version Control" -msgstr "" +msgstr "Versiebeheer Afsluiten" #: editor/editor_node.cpp -#, fuzzy msgid "Export..." -msgstr "Exporteren" +msgstr "Exporteren..." #: editor/editor_node.cpp msgid "Install Android Build Template..." -msgstr "" +msgstr "Android Build-sjabloon Installeren ..." #: editor/editor_node.cpp -#, fuzzy msgid "Open Project Data Folder" -msgstr "Open de Project Manager?" +msgstr "Open de Project datamap" #: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp msgid "Tools" msgstr "Gereedschappen" #: editor/editor_node.cpp -#, fuzzy msgid "Orphan Resource Explorer..." -msgstr "Wees Resource Verkenner" +msgstr "Verweesde hulpbronnen verkenner..." #: editor/editor_node.cpp msgid "Quit to Project List" @@ -2831,7 +2749,7 @@ msgstr "Debuggen" #: editor/editor_node.cpp msgid "Deploy with Remote Debug" -msgstr "Start met Debuggen op Afstand" +msgstr "Opstarten met debugging op afstand" #: editor/editor_node.cpp msgid "" @@ -2843,7 +2761,7 @@ msgstr "" #: editor/editor_node.cpp msgid "Small Deploy with Network FS" -msgstr "Kleine Deployatie over het Netwerk" +msgstr "Klein uitvoerbaar bestand opstarten met netwerk bestandsserver" #: editor/editor_node.cpp msgid "" @@ -2863,7 +2781,7 @@ msgstr "" #: editor/editor_node.cpp msgid "Visible Collision Shapes" -msgstr "Collision Shapes Zichtbaar" +msgstr "Toon collision shapes" #: editor/editor_node.cpp msgid "" @@ -2918,37 +2836,32 @@ msgstr "" "efficiënter met het netwerk bestandssysteem." #: editor/editor_node.cpp editor/script_create_dialog.cpp -#, fuzzy msgid "Editor" -msgstr "Verwerker" +msgstr "Editor" #: editor/editor_node.cpp -#, fuzzy msgid "Editor Settings..." -msgstr "Editor Instellingen" +msgstr "Editor Instellingen..." #: editor/editor_node.cpp msgid "Editor Layout" msgstr "Editor Layout" #: editor/editor_node.cpp -#, fuzzy msgid "Take Screenshot" -msgstr "Klinkt logisch!" +msgstr "Schermafdruk Maken" #: editor/editor_node.cpp -#, fuzzy msgid "Screenshots are stored in the Editor Data/Settings Folder." -msgstr "Open Editor Data/Instellingen Map" +msgstr "Screenshots worden bewaard in de Editor Data/Instellingen map." #: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "Schakel Volledig Scherm" #: editor/editor_node.cpp -#, fuzzy msgid "Toggle System Console" -msgstr "Gesplitste modus omschakelen" +msgstr "Systeemconsole (on)zichtbaar maken" #: editor/editor_node.cpp msgid "Open Editor Data/Settings Folder" @@ -2963,14 +2876,12 @@ msgid "Open Editor Settings Folder" msgstr "Open Editor Instellingen Map" #: editor/editor_node.cpp -#, fuzzy msgid "Manage Editor Features..." -msgstr "Beheer Export Templates" +msgstr "Editor-functionaliteiten Beheren..." #: editor/editor_node.cpp -#, fuzzy msgid "Manage Export Templates..." -msgstr "Beheer Export Templates" +msgstr "Export Sjablonen Beheren..." #: editor/editor_node.cpp editor/plugins/shader_editor_plugin.cpp msgid "Help" @@ -2992,7 +2903,7 @@ msgstr "Online Documentatie" #: editor/editor_node.cpp msgid "Q&A" -msgstr "Vraag en Antwoord" +msgstr "Vragen en antwoorden" #: editor/editor_node.cpp msgid "Issue Tracker" @@ -3015,8 +2926,8 @@ msgid "Play" msgstr "Speel" #: editor/editor_node.cpp -msgid "Pause the scene" -msgstr "Pauzeer de scene" +msgid "Pause the scene execution for debugging." +msgstr "Pauzeer de uitvoering van de scène voor foutopsporing." #: editor/editor_node.cpp msgid "Pause Scene" @@ -3028,19 +2939,19 @@ msgstr "Stop de scene." #: editor/editor_node.cpp msgid "Play the edited scene." -msgstr "Speel de bewerkte scene." +msgstr "Speel de bewerkte scène af." #: editor/editor_node.cpp msgid "Play Scene" -msgstr "Speel Scene" +msgstr "Speel scène" #: editor/editor_node.cpp msgid "Play custom scene" -msgstr "Speel aangepaste scene" +msgstr "Speel aangepaste scène af" #: editor/editor_node.cpp msgid "Play Custom Scene" -msgstr "Speel Aangepaste Scene" +msgstr "Speel aangepaste scène af" #: editor/editor_node.cpp msgid "Changing the video driver requires restarting the editor." @@ -3052,24 +2963,20 @@ msgid "Save & Restart" msgstr "Opslaan & Herstarten" #: editor/editor_node.cpp -#, fuzzy msgid "Spins when the editor window redraws." -msgstr "Draait wanneer het editor venster opnieuw ververst wordt!" +msgstr "Draait wanneer het editor venster wordt hertekend." #: editor/editor_node.cpp -#, fuzzy msgid "Update Continuously" -msgstr "Doorlopend" +msgstr "Continu Bijwerken" #: editor/editor_node.cpp -#, fuzzy msgid "Update When Changed" -msgstr "Update Veranderingen" +msgstr "Bijwerken indien gewijzigd" #: editor/editor_node.cpp -#, fuzzy msgid "Hide Update Spinner" -msgstr "Schakel Update Draaier Uit" +msgstr "Update spinner verbergen" #: editor/editor_node.cpp msgid "FileSystem" @@ -3094,11 +3001,12 @@ msgstr "Niet Opslaan" #: editor/editor_node.cpp msgid "Android build template is missing, please install relevant templates." msgstr "" +"Android build-sjabloon ontbreekt, gelieve de relevante sjablonen te " +"installeren." #: editor/editor_node.cpp -#, fuzzy msgid "Manage Templates" -msgstr "Beheer Export Templates" +msgstr "Sjablonen beheren" #: editor/editor_node.cpp msgid "" @@ -3110,6 +3018,13 @@ msgid "" "the \"Use Custom Build\" option should be enabled in the Android export " "preset." msgstr "" +"Hiermee wordt je project ingesteld voor aangepaste Android-builds door de " +"bronsjabloon te installeren naar \"res://android/build\".\n" +"Je kan vervolgens wijzigingen toepassen en je eigen aangepaste APK maken bij " +"export (modules toevoegen, de AndroidManifest.xml aanpassen, enz.).\n" +"Houd er rekening mee dat om aangepaste builds te maken in plaats van vooraf " +"gebouwde APK's te gebruiken, de optie \"Use Custom Build\" moet ingeschakeld " +"zijn in de Android-export preset." #: editor/editor_node.cpp msgid "" @@ -3118,6 +3033,10 @@ msgid "" "Remove the \"res://android/build\" directory manually before attempting this " "operation again." msgstr "" +"De sjabloon voor Android-build is al in dit project geïnstalleerd en zal " +"niet overschreven worden.\n" +"Verwijder de map \"res://android/build\" handmatig voordat je deze bewerking " +"opnieuw probeert." #: editor/editor_node.cpp msgid "Import Templates From ZIP File" @@ -3180,9 +3099,8 @@ msgid "Open the previous Editor" msgstr "Open de vorige Editor" #: editor/editor_path.cpp -#, fuzzy msgid "No sub-resources found." -msgstr "Geen oppervlakte bron gespecificeerd." +msgstr "Geen deel-hulpbronnen gevonden." #: editor/editor_plugin.cpp msgid "Creating Mesh Previews" @@ -3193,9 +3111,8 @@ msgid "Thumbnail..." msgstr "Voorbeeld..." #: editor/editor_plugin_settings.cpp -#, fuzzy msgid "Main Script:" -msgstr "Omschrijving:" +msgstr "Hoofdscript:" #: editor/editor_plugin_settings.cpp msgid "Edit Plugin" @@ -3267,9 +3184,8 @@ msgid "Calls" msgstr "Aanroepen" #: editor/editor_properties.cpp -#, fuzzy msgid "Edit Text:" -msgstr "Bewerk Thema..." +msgstr "Tekst bewerken:" #: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" @@ -3333,9 +3249,8 @@ msgid "New Script" msgstr "Nieuw Script" #: editor/editor_properties.cpp editor/scene_tree_dock.cpp -#, fuzzy msgid "Extend Script" -msgstr "Omschrijving:" +msgstr "Script uitbreiden" #: editor/editor_properties.cpp editor/property_editor.cpp msgid "New %s" @@ -3441,9 +3356,8 @@ msgid "Import From Node:" msgstr "Importeer Vanuit Node:" #: editor/export_template_manager.cpp -#, fuzzy msgid "Redownload" -msgstr "Opnieuw Downloaden" +msgstr "Opnieuw downloaden" #: editor/export_template_manager.cpp msgid "Uninstall" @@ -3461,6 +3375,7 @@ msgstr "Download" #: editor/export_template_manager.cpp msgid "Official export templates aren't available for development builds." msgstr "" +"Officiële export sjablonen zijn niet beschikbaar voor ontwikkel builds." #: editor/export_template_manager.cpp msgid "(Missing)" @@ -3543,23 +3458,20 @@ msgid "Download Complete." msgstr "Download Voltooid." #: editor/export_template_manager.cpp -#, fuzzy msgid "Cannot remove temporary file:" -msgstr "Kan thema niet opslaan in bestand:" +msgstr "Kan het tijdelijke bestand niet verwijderen:" #: editor/export_template_manager.cpp -#, fuzzy msgid "" "Templates installation failed.\n" "The problematic templates archives can be found at '%s'." msgstr "" -"Installatie van templates mislukt. De problematische template archieven " -"kunnen gevonden worden op '%s'." +"Installatie van sjablonen mislukt.\n" +"De problematische sjabloon-archieven kunnen gevonden worden op '%s'." #: editor/export_template_manager.cpp -#, fuzzy msgid "Error requesting URL:" -msgstr "Fout bij het opvragen van een URL: " +msgstr "Fout bij het opvragen van de URL:" #: editor/export_template_manager.cpp msgid "Connecting to Mirror..." @@ -3608,9 +3520,8 @@ msgid "SSL Handshake Error" msgstr "SSL Handshake Foutmelding" #: editor/export_template_manager.cpp -#, fuzzy msgid "Uncompressing Android Build Sources" -msgstr "Bronnen aan het uitpakken" +msgstr "Android build-sjablonen aan het uitpakken" #: editor/export_template_manager.cpp msgid "Current Version:" @@ -3629,7 +3540,6 @@ msgid "Remove Template" msgstr "Verwijder Sjabloon" #: editor/export_template_manager.cpp -#, fuzzy msgid "Select Template File" msgstr "Selecteer sjabloonbestand" @@ -3680,9 +3590,8 @@ msgid "No name provided." msgstr "Geen naam opgegeven." #: editor/filesystem_dock.cpp -#, fuzzy msgid "Provided name contains invalid characters." -msgstr "De opgegeven naam bevat ongeldige tekens" +msgstr "De opgegeven naam bevat ongeldige tekens." #: editor/filesystem_dock.cpp msgid "A file or folder with this name already exists." @@ -3709,26 +3618,26 @@ msgid "Duplicating folder:" msgstr "Folder dupliceren:" #: editor/filesystem_dock.cpp -#, fuzzy msgid "New Inherited Scene" -msgstr "Nieuwe Geërfde Scene..." +msgstr "Nieuwe overgeërfde scene" + +#: editor/filesystem_dock.cpp +msgid "Set As Main Scene" +msgstr "Instellen als hoofdscène" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Open Scenes" -msgstr "Scene Openen" +msgstr "Scènes openen" #: editor/filesystem_dock.cpp msgid "Instance" msgstr "Instantie" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Add to Favorites" msgstr "Aan favorieten toevoegen" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Remove from Favorites" msgstr "Uit favorieten verwijderen" @@ -3753,9 +3662,8 @@ msgid "Move To..." msgstr "Verplaats Naar..." #: editor/filesystem_dock.cpp -#, fuzzy msgid "New Scene..." -msgstr "Nieuwe Scene" +msgstr "Nieuwe scène..." #: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp msgid "New Script..." @@ -3783,23 +3691,20 @@ msgid "Rename" msgstr "Hernoemen" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Previous Folder/File" -msgstr "Vorige Folder" +msgstr "Vorig(e) map/bestand" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Next Folder/File" -msgstr "Volgende Folder" +msgstr "Volgend(e) map/bestand" #: editor/filesystem_dock.cpp msgid "Re-Scan Filesystem" msgstr "Bestandssysteem Opnieuw Scannen" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Toggle Split Mode" -msgstr "Gesplitste modus omschakelen" +msgstr "Split-modus in-/uitschakelen" #: editor/filesystem_dock.cpp msgid "Search files" @@ -3826,27 +3731,24 @@ msgid "Overwrite" msgstr "Overschrijven" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Create Scene" -msgstr "Creëer vanuit Scene" +msgstr "Scène maken" #: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp msgid "Create Script" msgstr "Creëer Script" #: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Find in Files" -msgstr "Vind Tegel" +msgstr "Zoeken in bestanden" #: editor/find_in_files.cpp msgid "Find:" msgstr "Zoeken:" #: editor/find_in_files.cpp -#, fuzzy msgid "Folder:" -msgstr "Map Maken" +msgstr "Map:" #: editor/find_in_files.cpp msgid "Filters:" @@ -4040,7 +3942,7 @@ msgstr " Bestanden" #: editor/import_dock.cpp msgid "Import As:" -msgstr "Importereen Als:" +msgstr "Importeer als:" #: editor/import_dock.cpp #, fuzzy @@ -4152,7 +4054,7 @@ msgstr "Wijzigingen kunnen verloren gaan!" #: editor/multi_node_edit.cpp msgid "MultiNode Set" -msgstr "MultiNode Set" +msgstr "MultiNode groep" #: editor/node_dock.cpp #, fuzzy @@ -4449,9 +4351,8 @@ msgstr "Alles Selecteren" #: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Delete Node(s)" -msgstr "Verwijder knooppunt(en)" +msgstr "Knooppunt(en) verwijderen" #: editor/plugins/animation_blend_tree_editor_plugin.cpp #, fuzzy @@ -4473,13 +4374,26 @@ msgstr "Animatiespelerpad is ongeldig, spoornamen konden niet worden gevonden." #: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/root_motion_editor_plugin.cpp -#, fuzzy msgid "" "Animation player has no valid root node path, so unable to retrieve track " "names." msgstr "" -"Animatiespeler heeft geen geldig pad voor de wortelknoop, spoornamen konden " -"niet worden gevonden." +"AnimationPlayer object heeft geen geldig pad voor het root knooppunt, " +"waardoor de spoornamen niet konden gevonden worden." + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Anim Clips" +msgstr "Animatieclips:" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Audio Clips" +msgstr "Audioclips:" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Functions" +msgstr "Functies" #: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/animation_state_machine_editor.cpp @@ -4542,7 +4456,6 @@ msgid "Rename Animation" msgstr "Animatie Hernoemen" #: editor/plugins/animation_player_editor_plugin.cpp -#, fuzzy msgid "Blend Next Changed" msgstr "Meng met volgende aanpassing" @@ -4620,9 +4533,8 @@ msgid "Edit Transitions..." msgstr "Bewerk overgangen..." #: editor/plugins/animation_player_editor_plugin.cpp -#, fuzzy msgid "Open in Inspector" -msgstr "In Inspecteur openen" +msgstr "Openen in de Inspecteur" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Display list of animations in player." @@ -4748,9 +4660,8 @@ msgid "Travel" msgstr "Verplaats" #: editor/plugins/animation_state_machine_editor.cpp -#, fuzzy msgid "Start and end nodes are needed for a sub-transition." -msgstr "Start- en eindknopen zijn nodig voor een sub-overgang" +msgstr "Start- en eindknopen zijn nodig voor een sub-overgang." #: editor/plugins/animation_state_machine_editor.cpp #, fuzzy @@ -4906,35 +4817,33 @@ msgstr "Animatie Node" #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "OneShot Node" -msgstr "OneShot Node" +msgstr "OneShot knooppunt" #: editor/plugins/animation_tree_player_editor_plugin.cpp -#, fuzzy msgid "Mix Node" -msgstr "Meng Node" +msgstr "Meng knooppunt" #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "Blend2 Node" -msgstr "Blend2 Node" +msgstr "Blend2 knooppunt" #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "Blend3 Node" -msgstr "Blend3 Node" +msgstr "Blend3 knooppunt" #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "Blend4 Node" -msgstr "Blend4 Node" +msgstr "Blend4 knooppunt" #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "TimeScale Node" -msgstr "TimeScale Node" +msgstr "TimeScale knooppunt" #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "TimeSeek Node" -msgstr "TimeSeek Node" +msgstr "TimeSeek knooppunt" #: editor/plugins/animation_tree_player_editor_plugin.cpp -#, fuzzy msgid "Transition Node" msgstr "Overgangsknoop" @@ -5183,6 +5092,15 @@ msgid "Grid Step:" msgstr "Raster Stap:" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Primary Line Every:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "steps" +msgstr "2 stappen" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotation Offset:" msgstr "Rotatie Verplaatsing:" @@ -5192,6 +5110,11 @@ msgstr "Rotatie Stap:" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy +msgid "Scale Step:" +msgstr "Schaal:" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy msgid "Move Vertical Guide" msgstr "Verplaats vertical gids" @@ -5283,6 +5206,20 @@ msgstr "Wijzig Ankers" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"Overrides game camera with editor viewport camera." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"No game instance running." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp #, fuzzy msgid "Lock Selected" msgstr "Gereedschappen" @@ -5315,9 +5252,9 @@ msgid "Clear Guides" msgstr "Maak Houding Leeg" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Create Custom Bone(s) from Node(s)" -msgstr "Maak één of meerdere op maat gemaakte botten van één of meerdere Nodes" +msgstr "" +"Maak één of meerdere op maat gemaakte botten van één of meerdere knooppunten" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy @@ -5435,6 +5372,11 @@ msgid "Use Rotation Snap" msgstr "Gebruik Rotatie Snap" #: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Use Scale Snap" +msgstr "Gebruik Uitlijnen" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap Relative" msgstr "Snap Relatief" @@ -5570,17 +5512,14 @@ msgid "Preview Canvas Scale" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Translation mask for inserting keys." -msgstr "Vertaalmasker voor het invoegen van sleutels." +msgstr "Vertaalomslag voor het invoegen van sleutels." #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Rotation mask for inserting keys." msgstr "Rotatiemasker voor het invoegen van sleutels." #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Scale mask for inserting keys." msgstr "Schaalmasker voor het invoegen van sleutels." @@ -5592,7 +5531,7 @@ msgstr "Voeg Sleutel in (Bestaande Banen)" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy msgid "" -"Auto insert keys when objects are translated, rotated on scaled (based on " +"Auto insert keys when objects are translated, rotated or scaled (based on " "mask).\n" "Keys are only added to existing tracks, no new tracks will be created.\n" "Keys must be inserted manually for the first time." @@ -5648,7 +5587,7 @@ msgstr "Kan niet meerdere knooppunten instantiëren zonder een wortel." #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "Create Node" -msgstr "Creëer Node" +msgstr "Knooppunt maken" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp @@ -5727,7 +5666,7 @@ msgstr "Neem uit Pixel" #: editor/plugins/cpu_particles_2d_editor_plugin.cpp #: editor/plugins/particles_2d_editor_plugin.cpp msgid "Emission Colors" -msgstr "Kleuren Emissie" +msgstr "Emissie Kleuren" #: editor/plugins/cpu_particles_editor_plugin.cpp #, fuzzy @@ -5742,7 +5681,7 @@ msgstr "Creëer Emissie Punten Vanuit Mesh" #: editor/plugins/cpu_particles_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp msgid "Create Emission Points From Node" -msgstr "Creëer Emissie Punten Vanuit Node" +msgstr "Emissiepunten maken vanuit knooppunt" #: editor/plugins/curve_editor_plugin.cpp #, fuzzy @@ -5821,9 +5760,8 @@ msgid "Right click to add point" msgstr "Rechter Klik: Verwijder Punt" #: editor/plugins/gi_probe_editor_plugin.cpp -#, fuzzy msgid "Bake GI Probe" -msgstr "Bak GI Probe" +msgstr "Maak een GI (Global Illumination) Probe" #: editor/plugins/gradient_editor_plugin.cpp msgid "Gradient Edited" @@ -5850,14 +5788,12 @@ msgid "Mesh is empty!" msgstr "Mesh is leeg!" #: editor/plugins/mesh_instance_editor_plugin.cpp -#, fuzzy msgid "Create Static Trimesh Body" -msgstr "Creëer Statisch Trimesh Lichaam" +msgstr "Creëer een statisch tri-mesh lichaam" #: editor/plugins/mesh_instance_editor_plugin.cpp -#, fuzzy msgid "Create Static Convex Body" -msgstr "Creëer Statisch Convex Lichaam" +msgstr "Creëer een statisch convex lichaam" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "This doesn't work on scene root!" @@ -5890,7 +5826,6 @@ msgid "UV Unwrap failed, mesh may not be manifold?" msgstr "UV Uitpakken is gefaald, wellicht is de mesh niet manifold?" #: editor/plugins/mesh_instance_editor_plugin.cpp -#, fuzzy msgid "No mesh to debug." msgstr "Geen mesh om te debuggen." @@ -5954,9 +5889,8 @@ msgid "Unwrap UV2 for Lightmap/AO" msgstr "Pak UV2 uit voor Lichtmap/AO" #: editor/plugins/mesh_instance_editor_plugin.cpp -#, fuzzy msgid "Create Outline Mesh" -msgstr "Creëer Omlijning Mesh" +msgstr "Creëer een contour mesh" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Outline Size:" @@ -6016,7 +5950,6 @@ msgid "Surface source is invalid (no geometry)." msgstr "Oppervlakte bron is ongeldig (geen geometrie)." #: editor/plugins/multimesh_editor_plugin.cpp -#, fuzzy msgid "Surface source is invalid (no faces)." msgstr "Oppervlakte bron is ongeldig (geen vlakken)." @@ -6477,7 +6410,7 @@ msgstr "Instellingen" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Snap" -msgstr "Snap" +msgstr "Uitlijnen" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Enable Snap" @@ -6485,7 +6418,7 @@ msgstr "Zet Snap Aan" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Grid" -msgstr "Grid" +msgstr "Raster" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Show Grid" @@ -6770,7 +6703,7 @@ msgstr "Sluit Docs" #: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp msgid "Run" -msgstr "Starten" +msgstr "Opstarten" #: editor/plugins/script_editor_plugin.cpp msgid "Toggle Scripts Panel" @@ -6808,9 +6741,8 @@ msgid "Open Godot online documentation." msgstr "Open Godot online documentatie" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Request Docs" -msgstr "Verzoek Documenten" +msgstr "Verzoek documentatie" #: editor/plugins/script_editor_plugin.cpp #, fuzzy @@ -7093,10 +7025,9 @@ msgid "Shader" msgstr "Shader" #: editor/plugins/skeleton_2d_editor_plugin.cpp -#, fuzzy msgid "This skeleton has no bones, create some children Bone2D nodes." msgstr "" -"Dit skelet heeft geen botten, creëer enkele Bone2D-knooppunten als kinderen." +"Dit skelet heeft geen botten, maak een aantal secundaire Bone2D knooppunten." #: editor/plugins/skeleton_2d_editor_plugin.cpp #, fuzzy @@ -7126,9 +7057,8 @@ msgid "Create physical bones" msgstr "Creëer Navigatie Mesh" #: editor/plugins/skeleton_editor_plugin.cpp -#, fuzzy msgid "Skeleton" -msgstr "Singleton" +msgstr "Skelet" #: editor/plugins/skeleton_editor_plugin.cpp #, fuzzy @@ -7219,7 +7149,7 @@ msgstr "Teken Aanroepingen" #: editor/plugins/spatial_editor_plugin.cpp msgid "Vertices" -msgstr "Vertices" +msgstr "Hoekpunten" #: editor/plugins/spatial_editor_plugin.cpp msgid "Top View." @@ -7802,9 +7732,8 @@ msgid "SpriteFrames" msgstr "Sprite-Frames" #: editor/plugins/texture_region_editor_plugin.cpp -#, fuzzy msgid "Set Region Rect" -msgstr "Stel Gebied Vierkant in" +msgstr "Stel een rechthoekig oppervlak in" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Set Margin" @@ -8205,9 +8134,8 @@ msgid "Create a new polygon." msgstr "Nieuwe veelhoek aanmaken." #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Keep polygon inside region Rect." -msgstr "Hou veelhoek in Rect bereik" +msgstr "Hou de veelhoek binnen een rechthoekig bereik." #: editor/plugins/tile_set_editor_plugin.cpp msgid "Enable snap and show grid (configurable via the Inspector)." @@ -8252,13 +8180,12 @@ msgid "%s file(s) were not added because was already on the list." msgstr "%s bestand(en) niet toegevoegd omdat deze al op de lijst staan." #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "" "Drag handles to edit Rect.\n" "Click on another Tile to edit it." msgstr "" -"Versleep handles om Vierkant te bewerken.\n" -"Klik op een andere Tegel om deze te bewerken." +"Sleep de hendels om de rechthoek aan te passen.\n" +"Klik op een andere Tegel om die te bewerken." #: editor/plugins/tile_set_editor_plugin.cpp #, fuzzy @@ -8532,9 +8459,8 @@ msgid "Scalar" msgstr "Schaal:" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Vector" -msgstr "Inspecteur" +msgstr "Vector" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Boolean" @@ -8594,7 +8520,6 @@ msgid "Resize VisualShader node" msgstr "Shader" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Set Uniform Name" msgstr "Uniforme naam instellen" @@ -8648,9 +8573,8 @@ msgid "Show resulted shader code." msgstr "Creëer Node" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Create Shader Node" -msgstr "Creëer Node" +msgstr "Maak een Shader knooppunt" #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy @@ -8697,8 +8621,9 @@ msgid "Dodge operator." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "HardLight operator" -msgstr "" +#, fuzzy +msgid "HardLight operator." +msgstr "Verander Scalar Operator" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Lighten operator." @@ -9302,9 +9227,10 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Custom Godot Shader Language expression, which placed on top of the resulted " -"shader. You can place various function definitions inside and call it later " -"in the Expressions. You can also declare varyings, uniforms and constants." +"Custom Godot Shader Language expression, which is placed on top of the " +"resulted shader. You can place various function definitions inside and call " +"it later in the Expressions. You can also declare varyings, uniforms and " +"constants." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -9424,6 +9350,12 @@ msgid "Add..." msgstr "Toevoegen..." #: editor/project_export.cpp +msgid "" +"If checked, the preset will be available for use in one-click deploy.\n" +"Only one preset per platform may be marked as runnable." +msgstr "" + +#: editor/project_export.cpp #, fuzzy msgid "Export Path" msgstr "Project Exporteren" @@ -9453,22 +9385,20 @@ msgid "Resources to export:" msgstr "Bronnen te exporteren:" #: editor/project_export.cpp -#, fuzzy msgid "" "Filters to export non-resource files/folders\n" "(comma-separated, e.g: *.json, *.txt, docs/*)" msgstr "" -"Filters voor het exporteren van bestanden dat geen bron zijn (scheiden met " -"een komma, bijv.: *.json, *.txt)" +"Filters voor de export van bestanden en mappen die geen hulpbron zijn\n" +"(scheiden met een komma, bijv.: *.json, *.txt, docs/*)" #: editor/project_export.cpp -#, fuzzy msgid "" "Filters to exclude files/folders from project\n" "(comma-separated, e.g: *.json, *.txt, docs/*)" msgstr "" -"Filters voor het uitsluiten van bestanden van het project (scheiden met een " -"komma, bijv.: *.json, *.txt)" +"Filters om bestanden uit te sluiten van het project\n" +"(scheiden met een komma, bijv.: *.json, *.txt, docs/*)" #: editor/project_export.cpp msgid "Patches" @@ -9480,7 +9410,7 @@ msgstr "Maak Patch" #: editor/project_export.cpp msgid "Features" -msgstr "Kenmerken" +msgstr "Functionaliteiten" #: editor/project_export.cpp msgid "Custom (comma-separated):" @@ -9617,9 +9547,8 @@ msgid "The following files failed extraction from package:" msgstr "De volgende bestanden konden niet worden uitgepakt:" #: editor/project_manager.cpp -#, fuzzy msgid "Rename Project" -msgstr "Hernoem Functie" +msgstr "Project hernoemen" #: editor/project_manager.cpp msgid "Import Existing Project" @@ -9634,9 +9563,8 @@ msgid "Create New Project" msgstr "Creëer Nieuw Project" #: editor/project_manager.cpp -#, fuzzy msgid "Create & Edit" -msgstr "Creëer Node" +msgstr "Creëer en bewerk" #: editor/project_manager.cpp msgid "Install Project:" @@ -9799,28 +9727,28 @@ msgid "Are you sure to run %d projects at once?" msgstr "Weet je zeker dat je meerdere projecten wilt uitvoeren?" #: editor/project_manager.cpp -#, fuzzy msgid "" "Remove %d projects from the list?\n" "The project folders' contents won't be modified." msgstr "" -"Project uit de lijst verwijderen? (Inhoud van map wordt niet gewijzigd)" +"%d projecten uit de lijst verwijderen?\n" +"De inhoud van de projectmappen wordt niet geraakt." #: editor/project_manager.cpp -#, fuzzy msgid "" "Remove this project from the list?\n" "The project folder's contents won't be modified." msgstr "" -"Project uit de lijst verwijderen? (Inhoud van map wordt niet gewijzigd)" +"Project uit de lijst verwijderen?\n" +"De inhoud van de projectmap wordt niet geraakt." #: editor/project_manager.cpp -#, fuzzy msgid "" "Remove all missing projects from the list?\n" "The project folders' contents won't be modified." msgstr "" -"Project uit de lijst verwijderen? (Inhoud van map wordt niet gewijzigd)" +"Alle ontbrekende project uit de lijst verwijderen?\n" +"De inhoud van de projectmap wordt niet geraakt." #: editor/project_manager.cpp #, fuzzy @@ -9832,13 +9760,12 @@ msgstr "" "de editor of projectmanager wordt gestart." #: editor/project_manager.cpp -#, fuzzy msgid "" "Are you sure to scan %s folders for existing Godot projects?\n" "This could take a while." msgstr "" -"U staat op het punt om %s folders te scannen voor bestaande Godot projecten. " -"Akkoord?" +"Wil je zoeken naar Godot projecten in de mappen %s?\n" +"Dit kan een tijdje duren." #: editor/project_manager.cpp msgid "Project Manager" @@ -9940,18 +9867,6 @@ msgid "Device" msgstr "Apparaat" #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Shift+" -msgstr "Shift+" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Alt+" -msgstr "Alt+" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Control+" -msgstr "Control+" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "Press a Key..." msgstr "Druk op een toets..." @@ -10112,14 +10027,12 @@ msgid "Add Remapped Path" msgstr "Voeg Remapped Path toe" #: editor/project_settings_editor.cpp -#, fuzzy msgid "Resource Remap Add Remap" -msgstr "Bron Remap Toevoegen" +msgstr "Voeg hulpbron Remap toe" #: editor/project_settings_editor.cpp -#, fuzzy msgid "Change Resource Remap Language" -msgstr "Wijzig Bron Remap Taal" +msgstr "Wijzig hulpbron Remap taal" #: editor/project_settings_editor.cpp msgid "Remove Resource Remap" @@ -10163,13 +10076,12 @@ msgid "Action:" msgstr "Action:" #: editor/project_settings_editor.cpp -#, fuzzy msgid "Action" -msgstr "Verplaats Actie" +msgstr "Actie" #: editor/project_settings_editor.cpp msgid "Deadzone" -msgstr "Deadzone" +msgstr "Dode zone" #: editor/project_settings_editor.cpp msgid "Device:" @@ -10200,18 +10112,16 @@ msgid "Resources:" msgstr "Bronnen:" #: editor/project_settings_editor.cpp -#, fuzzy msgid "Remaps by Locale:" -msgstr "Remaps door Locale:" +msgstr "Remaps per lokalisatie:" #: editor/project_settings_editor.cpp msgid "Locale" -msgstr "Locale" +msgstr "Localisatie" #: editor/project_settings_editor.cpp -#, fuzzy msgid "Locales Filter" -msgstr "Lokalen Filter" +msgstr "Lokalisatie filter" #: editor/project_settings_editor.cpp #, fuzzy @@ -10357,10 +10267,10 @@ msgid "Per Level counter" msgstr "Per Niveau teller" #: editor/rename_dialog.cpp -#, fuzzy msgid "If set the counter restarts for each group of child nodes" msgstr "" -"Herstart de teller voor iedere groep van secundaire Nodes indien ingesteld" +"Indien ingesteld: herstart de teller voor iedere groep van secundaire " +"knooppunten" #: editor/rename_dialog.cpp msgid "Initial value for the counter" @@ -10410,7 +10320,7 @@ msgstr "under_scored naar CamelCase" #: editor/rename_dialog.cpp msgid "Case" -msgstr "Case" +msgstr "Kapitalisatie" #: editor/rename_dialog.cpp #, fuzzy @@ -10494,19 +10404,16 @@ msgid "Clear Script" msgstr "Script vrijmaken" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "This operation can't be done on the tree root." -msgstr "Deze bewerking kan niet worden uitgevoerd op de tree root." +msgstr "Deze bewerking kan niet worden uitgevoerd op het root knooppunt." #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Move Node In Parent" -msgstr "Verplaats knooppunt naar ouder" +msgstr "Verander knooppunt van ouder" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Move Nodes In Parent" -msgstr "Verplaats knooppunten naar ouder" +msgstr "Verander knooppunten van ouder" #: editor/scene_tree_dock.cpp msgid "Duplicate Node(s)" @@ -10583,9 +10490,8 @@ msgid "New Scene Root" msgstr "Klinkt logisch!" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Create Root Node:" -msgstr "Creëer Node" +msgstr "Hoofdknooppunt maken:" #: editor/scene_tree_dock.cpp #, fuzzy @@ -10599,7 +10505,7 @@ msgstr "Scène" #: editor/scene_tree_dock.cpp msgid "User Interface" -msgstr "" +msgstr "Gebruikersomgeving" #: editor/scene_tree_dock.cpp #, fuzzy @@ -10634,9 +10540,8 @@ msgid "" msgstr "" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Error saving scene." -msgstr "Fout scene opslaan." +msgstr "Fout bij het opslaan van de scene." #: editor/scene_tree_dock.cpp msgid "Error duplicating scene to save it." @@ -10666,7 +10571,7 @@ msgstr "Open Godot online documentatie" #: editor/scene_tree_dock.cpp msgid "Add Child Node" -msgstr "" +msgstr "Kindknooppunt toevoegen" #: editor/scene_tree_dock.cpp #, fuzzy @@ -10674,9 +10579,8 @@ msgid "Expand/Collapse All" msgstr "Alles inklappen" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Change Type" -msgstr "Verander Type" +msgstr "Verander het type" #: editor/scene_tree_dock.cpp #, fuzzy @@ -10702,20 +10606,20 @@ msgid "Copy Node Path" msgstr "Kopiëer Nodes" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Delete (No Confirm)" msgstr "Verwijder (Geen bevestiging)" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Add/Create a New Node." -msgstr "Voeg nieuwe knooppunt aan" +msgstr "Nieuw knooppunt maken/toevoegen." #: editor/scene_tree_dock.cpp msgid "" "Instance a scene file as a Node. Creates an inherited scene if no root node " "exists." msgstr "" +"Een scène-bestand instantiëren als knooppunt. Maakt een overgeërfde scène " +"als geen hoofdknooppunt bestaat." #: editor/scene_tree_dock.cpp msgid "Attach a new or existing script for the selected node." @@ -10731,7 +10635,6 @@ msgid "Remote" msgstr "Verwijderen" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Local" msgstr "Lokaal" @@ -10760,9 +10663,8 @@ msgid "(Connecting From)" msgstr "Verbindingsfout" #: editor/scene_tree_editor.cpp -#, fuzzy msgid "Node configuration warning:" -msgstr "Knooppunt configuratie waarschuwing:" +msgstr "Waarschuwing over knooppunt configuratie:" #: editor/scene_tree_editor.cpp msgid "" @@ -11037,9 +10939,8 @@ msgid "Profiler" msgstr "" #: editor/script_editor_debugger.cpp -#, fuzzy msgid "Network Profiler" -msgstr "Project Exporteren" +msgstr "Netwerk Profiler" #: editor/script_editor_debugger.cpp msgid "Monitor" @@ -11242,7 +11143,7 @@ msgstr "" #: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "GDNativeLibrary" -msgstr "GDInheemsBibliotheek" +msgstr "GDNativeBibliotheek" #: modules/gdnative/gdnative_library_singleton_editor.cpp msgid "Enabled GDNative Singleton" @@ -11263,7 +11164,7 @@ msgstr "Bibliotheken: " #: modules/gdnative/register_types.cpp msgid "GDNative" -msgstr "GDInheems" +msgstr "GDNative" #: modules/gdscript/gdscript_functions.cpp msgid "Expected a string of length 1 (a character)." @@ -11474,9 +11375,8 @@ msgid "Marking walkable triangles..." msgstr "Markeer loopbare driehoeken..." #: modules/recast/navigation_mesh_generator.cpp -#, fuzzy msgid "Constructing compact heightfield..." -msgstr "Compact hoogteveld aan het bouwen..." +msgstr "Bezig met opbouw van compact hoogteveld..." #: modules/recast/navigation_mesh_generator.cpp msgid "Eroding walkable area..." @@ -11794,14 +11694,15 @@ msgstr "Plak Nodes" #: modules/visual_script/visual_script_editor.cpp msgid "Can't create function with a function node." -msgstr "" +msgstr "Kan geen functie maken met een functie-knooppunt." #: modules/visual_script/visual_script_editor.cpp msgid "Can't create function of nodes from nodes of multiple functions." msgstr "" +"Kan geen functie van knooppunten maken van knooppunten met meerdere functies." #: modules/visual_script/visual_script_editor.cpp -msgid "Select atleast one node with sequence port." +msgid "Select at least one node with sequence port." msgstr "" #: modules/visual_script/visual_script_editor.cpp @@ -12127,10 +12028,20 @@ msgstr "Map kon niet gemaakt worden." #: platform/uwp/export/export.cpp #, fuzzy +msgid "Invalid package short name." +msgstr "Ongeldige klassenaam" + +#: platform/uwp/export/export.cpp +#, fuzzy msgid "Invalid package unique name." msgstr "Ongeldige unieke naam." #: platform/uwp/export/export.cpp +#, fuzzy +msgid "Invalid package publisher display name." +msgstr "Ongeldige unieke naam." + +#: platform/uwp/export/export.cpp msgid "Invalid product GUID." msgstr "Ongeldig product GUID." @@ -12201,6 +12112,10 @@ msgid "" "Consider adding a CollisionShape2D or CollisionPolygon2D as a child to " "define its shape." msgstr "" +"Dit knooppunt heeft geen vorm, dus het kan niet met andere objecten botsen " +"of interactie hebben.\n" +"Overweeg om als kind een CollisionShape2D of CollisionPolygon2D toe te " +"voegen om de vorm ervan vast te leggen." #: scene/2d/collision_polygon_2d.cpp msgid "" @@ -12270,8 +12185,8 @@ msgid "" "A NavigationPolygon resource must be set or created for this node to work. " "Please set a property or draw a polygon." msgstr "" -"Een NavigatorPolygon resource moet gegeven of gemaakt worden om deze node te " -"laten werken. Geef alsjeblieft een eigenschap of teken een polygoon." +"Een NavigatorPolygon hulpbron is nodig om dit knooppunt te laten werken. " +"Gelieve een bron te selecteren of een polygoon te tekenen." #: scene/2d/navigation_polygon.cpp msgid "" @@ -12415,6 +12330,10 @@ msgid "" "Consider adding a CollisionShape or CollisionPolygon as a child to define " "its shape." msgstr "" +"Dit knooppunt heeft geen vorm, dus het kan niet met andere objecten botsen " +"of interactie hebben.\n" +"Overweeg om als kind een CollisionShape of CollisionPolygon toe te voegen om " +"de vorm ervan vast te leggen." #: scene/3d/collision_polygon.cpp msgid "" @@ -12482,8 +12401,7 @@ msgstr "" #: scene/3d/navigation_mesh.cpp msgid "A NavigationMesh resource must be set or created for this node to work." msgstr "" -"Een NavigationMesh resource moet gegeven of gemaakt worden om deze node te " -"laten werken." +"Een NavigationMesh hulpbron is nodig om dit knooppunt te laten functioneren." #: scene/3d/navigation_mesh.cpp msgid "" @@ -12610,10 +12528,10 @@ msgid "No root AnimationNode for the graph is set." msgstr "" #: scene/animation/animation_tree.cpp -#, fuzzy msgid "Path to an AnimationPlayer node containing animations is not set." msgstr "" -"Selecteer een AnimationPlayer uit de Scene Tree om animaties te wijzigen." +"Er is geen pad opgegeven naar een AnimationPlayer knooppunt dat de animaties " +"bevat." #: scene/animation/animation_tree.cpp msgid "Path set for AnimationPlayer does not lead to an AnimationPlayer node." @@ -12656,6 +12574,10 @@ msgid "" "children placement behavior.\n" "If you don't intend to add a script, use a plain Control node instead." msgstr "" +"Container op zich dient geen doel, tenzij een script de plaatsing van de " +"kindknooppunten bepaalt.\n" +"Als je niet van plan bent om een script toe te voegen, gebruik dan een " +"gewone Control node." #: scene/gui/control.cpp msgid "" @@ -12748,6 +12670,18 @@ msgstr "" msgid "Constants cannot be modified." msgstr "" +#~ msgid "Pause the scene" +#~ msgstr "Pauzeer de scene" + +#~ msgid "Shift+" +#~ msgstr "Shift+" + +#~ msgid "Alt+" +#~ msgstr "Alt+" + +#~ msgid "Control+" +#~ msgstr "Control+" + #, fuzzy #~ msgid "Snap to Grid" #~ msgstr "Uitlijnen op raster" diff --git a/editor/translations/or.po b/editor/translations/or.po index 19fbf71453..6b52bb709a 100644 --- a/editor/translations/or.po +++ b/editor/translations/or.po @@ -2760,7 +2760,7 @@ msgid "Play" msgstr "" #: editor/editor_node.cpp -msgid "Pause the scene" +msgid "Pause the scene execution for debugging." msgstr "" #: editor/editor_node.cpp @@ -3425,6 +3425,10 @@ msgid "New Inherited Scene" msgstr "" #: editor/filesystem_dock.cpp +msgid "Set As Main Scene" +msgstr "" + +#: editor/filesystem_dock.cpp msgid "Open Scenes" msgstr "" @@ -4134,6 +4138,18 @@ msgid "" msgstr "" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Anim Clips" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Audio Clips" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Functions" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/animation_state_machine_editor.cpp msgid "Node Renamed" msgstr "" @@ -4800,6 +4816,14 @@ msgid "Grid Step:" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Primary Line Every:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "steps" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotation Offset:" msgstr "" @@ -4808,6 +4832,10 @@ msgid "Rotation Step:" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale Step:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move Vertical Guide" msgstr "" @@ -4889,6 +4917,20 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"Overrides game camera with editor viewport camera." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"No game instance running." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp msgid "Lock Selected" msgstr "" @@ -5023,6 +5065,10 @@ msgid "Use Rotation Snap" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Use Scale Snap" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap Relative" msgstr "" @@ -5162,7 +5208,7 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" -"Auto insert keys when objects are translated, rotated on scaled (based on " +"Auto insert keys when objects are translated, rotated or scaled (based on " "mask).\n" "Keys are only added to existing tracks, no new tracks will be created.\n" "Keys must be inserted manually for the first time." @@ -7989,7 +8035,7 @@ msgid "Dodge operator." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "HardLight operator" +msgid "HardLight operator." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8576,9 +8622,10 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Custom Godot Shader Language expression, which placed on top of the resulted " -"shader. You can place various function definitions inside and call it later " -"in the Expressions. You can also declare varyings, uniforms and constants." +"Custom Godot Shader Language expression, which is placed on top of the " +"resulted shader. You can place various function definitions inside and call " +"it later in the Expressions. You can also declare varyings, uniforms and " +"constants." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8687,6 +8734,12 @@ msgid "Add..." msgstr "" #: editor/project_export.cpp +msgid "" +"If checked, the preset will be available for use in one-click deploy.\n" +"Only one preset per platform may be marked as runnable." +msgstr "" + +#: editor/project_export.cpp msgid "Export Path" msgstr "" @@ -9123,18 +9176,6 @@ msgid "Device" msgstr "" #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Shift+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Alt+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Control+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "Press a Key..." msgstr "" @@ -10823,7 +10864,7 @@ msgid "Can't create function of nodes from nodes of multiple functions." msgstr "" #: modules/visual_script/visual_script_editor.cpp -msgid "Select atleast one node with sequence port." +msgid "Select at least one node with sequence port." msgstr "" #: modules/visual_script/visual_script_editor.cpp @@ -11128,10 +11169,18 @@ msgid "Using default boot splash image." msgstr "" #: platform/uwp/export/export.cpp +msgid "Invalid package short name." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package unique name." msgstr "" #: platform/uwp/export/export.cpp +msgid "Invalid package publisher display name." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid product GUID." msgstr "" diff --git a/editor/translations/pl.po b/editor/translations/pl.po index cd7c033cb0..fc8ae9f5dc 100644 --- a/editor/translations/pl.po +++ b/editor/translations/pl.po @@ -37,11 +37,12 @@ # RafaÅ‚ Wyszomirski <rawyszo@gmail.com>, 2019. # Myver <igormakarowicz@gmail.com>, 2019. # Maciej Chamera <chameramaciej@gmail.com>, 2019. +# Cezary Stasiak <cezary.p.stasiak@gmail.com>, 2019. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2019-10-29 12:49+0000\n" +"PO-Revision-Date: 2019-11-25 04:05+0000\n" "Last-Translator: Tomek <kobewi4e@gmail.com>\n" "Language-Team: Polish <https://hosted.weblate.org/projects/godot-engine/" "godot/pl/>\n" @@ -51,7 +52,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 3.9.1\n" +"X-Generator: Weblate 3.10-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -662,9 +663,8 @@ msgid "Scale Ratio:" msgstr "Współczynnik skali:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Select Tracks to Copy" -msgstr "Wybierz Å›cieżki do skopiowania:" +msgstr "Wybierz Å›cieżki do skopiowania" #: editor/animation_track_editor.cpp editor/editor_log.cpp #: editor/editor_properties.cpp @@ -676,9 +676,8 @@ msgid "Copy" msgstr "Kopiuj" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Select All/None" -msgstr "Wybierz wÄ™zeÅ‚" +msgstr "Wybierz wszystkie/żadne" #: editor/animation_track_editor_plugins.cpp msgid "Add Audio Track Clip" @@ -2908,8 +2907,8 @@ msgid "Play" msgstr "Uruchom" #: editor/editor_node.cpp -msgid "Pause the scene" -msgstr "Zapauzuj scenÄ™" +msgid "Pause the scene execution for debugging." +msgstr "Zapauzuj wykonywanie sceny, żeby debugować." #: editor/editor_node.cpp msgid "Pause Scene" @@ -3602,6 +3601,10 @@ msgid "New Inherited Scene" msgstr "Nowa scena dziedziczÄ…ca" #: editor/filesystem_dock.cpp +msgid "Set As Main Scene" +msgstr "Ustaw jako głównÄ… scenÄ™" + +#: editor/filesystem_dock.cpp msgid "Open Scenes" msgstr "Otwórz sceny" @@ -4332,6 +4335,18 @@ msgstr "" "uzyskać nazw Å›cieżek." #: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Anim Clips" +msgstr "Klipy animacji" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Audio Clips" +msgstr "Klipy dźwiÄ™kowe" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Functions" +msgstr "Funkcje" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/animation_state_machine_editor.cpp msgid "Node Renamed" msgstr "WÄ™zeÅ‚ przemianowany" @@ -4923,7 +4938,7 @@ msgstr "Wszystko" #: editor/plugins/asset_library_editor_plugin.cpp msgid "No results for \"%s\"." -msgstr "" +msgstr "Brak rezultatów dla \"%s\"." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Import..." @@ -5012,6 +5027,14 @@ msgid "Grid Step:" msgstr "Krok siatki:" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Primary Line Every:" +msgstr "Główna linia co każde:" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "steps" +msgstr "kroki" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotation Offset:" msgstr "Offset obrotu:" @@ -5020,6 +5043,10 @@ msgid "Rotation Step:" msgstr "Krok obrotu:" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale Step:" +msgstr "Krok skali:" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move Vertical Guide" msgstr "PrzesuÅ„ pionowÄ… prowadnicÄ™" @@ -5106,6 +5133,24 @@ msgstr "ZmieÅ„ zakotwiczenie" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"Overrides game camera with editor viewport camera." +msgstr "" +"Przejmij kamerÄ™ gry\n" +"ZastÄ™puje kamerÄ™ gry kamerÄ… z widoku edytora." + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"No game instance running." +msgstr "" +"Przejmij kamerÄ™ gry\n" +"Brak uruchomionej instancji gry." + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp msgid "Lock Selected" msgstr "Zablokuj wybrane" @@ -5222,24 +5267,20 @@ msgid "Ruler Mode" msgstr "Tryb linijki" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Toggle smart snapping." -msgstr "PrzeÅ‚Ä…cz przyciÄ…ganie." +msgstr "PrzeÅ‚Ä…cz inteligentne przyciÄ…ganie." #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Use Smart Snap" -msgstr "Użyj przyciÄ…gania" +msgstr "Użyj inteligentnego przyciÄ…gania" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Toggle grid snapping." -msgstr "PrzeÅ‚Ä…cz przyciÄ…ganie." +msgstr "PrzeÅ‚Ä…cz przyciÄ…ganie do siatki." #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Use Grid Snap" -msgstr "PrzyciÄ…gaj do siatki" +msgstr "Użyj przyciÄ…gania do siatki" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snapping Options" @@ -5250,6 +5291,10 @@ msgid "Use Rotation Snap" msgstr "Użyj kroków obrotu" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Use Scale Snap" +msgstr "Użyj przyciÄ…gania skali" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap Relative" msgstr "PrzyciÄ…gaj wzglÄ™dnie" @@ -5332,9 +5377,8 @@ msgid "View" msgstr "Widok" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Always Show Grid" -msgstr "Pokaż siatkÄ™" +msgstr "Zawsze pokaż siatkÄ™" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Show Helpers" @@ -5390,7 +5434,7 @@ msgstr "Wstaw klucze (w oparciu o maskÄ™)." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" -"Auto insert keys when objects are translated, rotated on scaled (based on " +"Auto insert keys when objects are translated, rotated or scaled (based on " "mask).\n" "Keys are only added to existing tracks, no new tracks will be created.\n" "Keys must be inserted manually for the first time." @@ -5601,9 +5645,8 @@ msgid "Hold Shift to edit tangents individually" msgstr "Przytrzymaj Shift aby edytować styczne indywidualnie" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Right click to add point" -msgstr "Prawy Klik: UsuÅ„ Punkt" +msgstr "Prawy klik, aby dodać punkt" #: editor/plugins/gi_probe_editor_plugin.cpp msgid "Bake GI Probe" @@ -7053,12 +7096,11 @@ msgstr "\"Wolny widok\" w dół" #: editor/plugins/spatial_editor_plugin.cpp msgid "Freelook Speed Modifier" -msgstr "Zmiennik prÄ™dkoÅ›ci \"Wolnego widoku\"" +msgstr "Modyfikator prÄ™dkoÅ›ci swobodnego widoku" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Freelook Slow Modifier" -msgstr "Zmiennik prÄ™dkoÅ›ci \"Wolnego widoku\"" +msgstr "Wolny modyfikator swobodnego widoku" #: editor/plugins/spatial_editor_plugin.cpp msgid "" @@ -7330,13 +7372,12 @@ msgid "Simplification: " msgstr "Uproszczenie: " #: editor/plugins/sprite_editor_plugin.cpp -#, fuzzy msgid "Shrink (Pixels): " -msgstr "Wzrost (piksele): " +msgstr "Zmniejsz (piksele): " #: editor/plugins/sprite_editor_plugin.cpp msgid "Grow (Pixels): " -msgstr "Wzrost (piksele): " +msgstr "ZwiÄ™ksz (piksele): " #: editor/plugins/sprite_editor_plugin.cpp msgid "Update Preview" @@ -8117,9 +8158,8 @@ msgid "(GLES3 only)" msgstr "(Tylko GLES3)" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Add Output" -msgstr "Dodaj wyjÅ›cie+" +msgstr "Dodaj wyjÅ›cie" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Scalar" @@ -8134,9 +8174,8 @@ msgid "Boolean" msgstr "Prawda/faÅ‚sz" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Sampler" -msgstr "Sample" +msgstr "Próbnik (sampler)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Add input port" @@ -8268,8 +8307,8 @@ msgid "Dodge operator." msgstr "Operator uniku." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "HardLight operator" -msgstr "Operator twardego Å›wiatÅ‚a" +msgid "HardLight operator." +msgstr "Operator twardego Å›wiatÅ‚a." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Lighten operator." @@ -8910,9 +8949,10 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Custom Godot Shader Language expression, which placed on top of the resulted " -"shader. You can place various function definitions inside and call it later " -"in the Expressions. You can also declare varyings, uniforms and constants." +"Custom Godot Shader Language expression, which is placed on top of the " +"resulted shader. You can place various function definitions inside and call " +"it later in the Expressions. You can also declare varyings, uniforms and " +"constants." msgstr "" "WÅ‚asne wyrażenie w jÄ™zyku shaderów Godota, znajdujÄ…ce siÄ™ na górze " "wynikowego shadera. Możesz wewnÄ…trz utworzyć różne definicje funkcji i " @@ -9042,6 +9082,14 @@ msgid "Add..." msgstr "Dodaj..." #: editor/project_export.cpp +msgid "" +"If checked, the preset will be available for use in one-click deploy.\n" +"Only one preset per platform may be marked as runnable." +msgstr "" +"Kiedy zaznaczone, profil bÄ™dzie dostÄ™pny do szybkiego wdrażania.\n" +"Tylko jeden profil na platformÄ™ może być zaznaczony jako uruchamiany." + +#: editor/project_export.cpp msgid "Export Path" msgstr "Åšcieżka eksportu" @@ -9070,22 +9118,20 @@ msgid "Resources to export:" msgstr "Zasoby do eksportu:" #: editor/project_export.cpp -#, fuzzy msgid "" "Filters to export non-resource files/folders\n" "(comma-separated, e.g: *.json, *.txt, docs/*)" msgstr "" -"Filtry do eksportowania plików nie bÄ™dÄ…cych zasobami (oddzielone " +"Filtry do eksportowania plików/folderów nie bÄ™dÄ…cych zasobami (oddzielone " "przecinkami, np. *.json, *.txt)" #: editor/project_export.cpp -#, fuzzy msgid "" "Filters to exclude files/folders from project\n" "(comma-separated, e.g: *.json, *.txt, docs/*)" msgstr "" -"Filtry do wykluczenia plików z projektu (rozdzielone przecinkami, np. *." -"json, *.txt)" +"Filtry do wykluczenia plików/folderów z projektu (rozdzielone przecinkami, " +"np. *.json, *.txt)" #: editor/project_export.cpp msgid "Patches" @@ -9536,18 +9582,6 @@ msgid "Device" msgstr "UrzÄ…dzenie" #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Shift+" -msgstr "Shift+" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Alt+" -msgstr "Alt+" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Control+" -msgstr "Control+" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "Press a Key..." msgstr "NaciÅ›nij klawisz..." @@ -10130,12 +10164,11 @@ msgstr "" "zostanÄ… przywrócone do domyÅ›lnych." #: editor/scene_tree_dock.cpp -#, fuzzy msgid "" "Enabling \"Load As Placeholder\" will disable \"Editable Children\" and " "cause all properties of the node to be reverted to their default." msgstr "" -"WyÅ‚Ä…czenie \"edytowalnej instancji\" sprawi, że wszystkie wÅ‚aÅ›ciwoÅ›ci wÄ™zÅ‚a " +"WÅ‚Ä…czenie \"edytowalnej instancji\" sprawi, że wszystkie wÅ‚aÅ›ciwoÅ›ci wÄ™zÅ‚a " "zostanÄ… przywrócone do domyÅ›lnych." #: editor/scene_tree_dock.cpp @@ -10236,7 +10269,7 @@ msgstr "ZmieÅ„ typ" #: editor/scene_tree_dock.cpp msgid "Reparent to New Node" -msgstr "ZmieÅ„ nadrzÄ™dny wÄ™zeÅ‚" +msgstr "ZmieÅ„ nadrzÄ™dny wÄ™zeÅ‚ na nowy" #: editor/scene_tree_dock.cpp msgid "Make Scene Root" @@ -10475,19 +10508,16 @@ msgid "Will load an existing script file." msgstr "Wczytaj istniejÄ…cy plik skryptu." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Class Name:" -msgstr "Nazwa klasy" +msgstr "Nazwa klasy:" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Template:" -msgstr "Szablon" +msgstr "Szablon:" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Built-in Script:" -msgstr "Wbudowany skrypt" +msgstr "Skrypt wbudowany:" #: editor/script_create_dialog.cpp msgid "Attach Node Script" @@ -11128,7 +11158,6 @@ msgid "Add Function" msgstr "Dodaj funkcjÄ™" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Delete input port" msgstr "UsuÅ„ port wejÅ›ciowy" @@ -11141,22 +11170,18 @@ msgid "Add Signal" msgstr "Dodaj sygnaÅ‚" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Add Input Port" msgstr "Dodaj port wejÅ›ciowy" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Add Output Port" msgstr "Dodaj port wyjÅ›ciowy" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Remove Input Port" msgstr "UsuÅ„ port wejÅ›ciowy" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Remove Output Port" msgstr "UsuÅ„ port wyjÅ›ciowy" @@ -11207,6 +11232,7 @@ msgstr "Dodaj wstÄ™pnie wczytany wÄ™zeÅ‚" #: modules/visual_script/visual_script_editor.cpp msgid "Can't drop nodes because script '%s' is not used in this scene." msgstr "" +"Nie można upuÅ›cić wÄ™złów, ponieważ \"%s\" nie jest używany na tej scenie." #: modules/visual_script/visual_script_editor.cpp msgid "Add Node(s) From Tree" @@ -11217,6 +11243,9 @@ msgid "" "Can't drop properties because script '%s' is not used in this scene.\n" "Drop holding 'Shift' to just copy the signature." msgstr "" +"Nie można upuÅ›cić wÅ‚aÅ›ciwoÅ›ci, ponieważ \"%s\" nie jest używany na tej " +"scenie.\n" +"Upuść trzymajÄ…c \"Shift\", by skopiować samÄ… sygnaturÄ™." #: modules/visual_script/visual_script_editor.cpp msgid "Add Getter Property" @@ -11243,9 +11272,8 @@ msgid "Connect Nodes" msgstr "PodÅ‚Ä…cz wÄ™zÅ‚y" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Disconnect Nodes" -msgstr "OdÅ‚Ä…cz wÄ™zÅ‚y grafu" +msgstr "OdÅ‚Ä…cz wÄ™zÅ‚y" #: modules/visual_script/visual_script_editor.cpp msgid "Connect Node Data" @@ -11280,26 +11308,24 @@ msgid "Paste VisualScript Nodes" msgstr "Wklej wÄ™zeÅ‚ VisualScript" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Can't create function with a function node." -msgstr "Nie można skopiować wÄ™zÅ‚a funkcji." +msgstr "Nie można utworzyć funkcji z wÄ™zÅ‚em funkcji." #: modules/visual_script/visual_script_editor.cpp msgid "Can't create function of nodes from nodes of multiple functions." -msgstr "" +msgstr "Nie można utworzyć funkcji wÄ™złów z wÄ™złów wielu funkcji." #: modules/visual_script/visual_script_editor.cpp -msgid "Select atleast one node with sequence port." -msgstr "" +msgid "Select at least one node with sequence port." +msgstr "Wybierz co najmniej jeden wÄ™zeÅ‚ z portem sekwencyjnym." #: modules/visual_script/visual_script_editor.cpp msgid "Try to only have one sequence input in selection." -msgstr "" +msgstr "Spróbuj mieć tylko jedno wejÅ›cie sekwencyjne w zaznaczeniu." #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Create Function" -msgstr "ZmieÅ„ nazwÄ™ funkcji" +msgstr "Utwórz funkcjÄ™" #: modules/visual_script/visual_script_editor.cpp msgid "Remove Function" @@ -11330,9 +11356,8 @@ msgid "Members:" msgstr "CzÅ‚onkowie:" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "function_name" -msgstr "Funkcja:" +msgstr "nazwa_funkcji" #: modules/visual_script/visual_script_editor.cpp msgid "Select or create a function to edit its graph." @@ -11355,14 +11380,12 @@ msgid "Cut Nodes" msgstr "Wytnij WÄ™zÅ‚y" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Make Function" -msgstr "ZmieÅ„ nazwÄ™ funkcji" +msgstr "ZmieÅ„ na funkcjÄ™" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Refresh Graph" -msgstr "OdÅ›wież" +msgstr "OdÅ›wież graf" #: modules/visual_script/visual_script_editor.cpp msgid "Edit Member" @@ -11582,7 +11605,7 @@ msgstr "Wymagana ikona nie jest podana w profilu eksportu." #: platform/javascript/export/export.cpp msgid "Stop HTTP Server" -msgstr "" +msgstr "Zatrzymaj serwer HTTP" #: platform/javascript/export/export.cpp msgid "Run in Browser" @@ -11617,10 +11640,18 @@ msgid "Using default boot splash image." msgstr "Używam domyÅ›lnego obrazka powitalnego." #: platform/uwp/export/export.cpp +msgid "Invalid package short name." +msgstr "Niepoprawna krótka nazwa paczki." + +#: platform/uwp/export/export.cpp msgid "Invalid package unique name." msgstr "NiewÅ‚aÅ›ciwa unikalna nazwa paczki." #: platform/uwp/export/export.cpp +msgid "Invalid package publisher display name." +msgstr "Niepoprawna wyÅ›wietlana nazwa wydawcy paczki." + +#: platform/uwp/export/export.cpp msgid "Invalid product GUID." msgstr "NieprawidÅ‚owy GUID produktu." @@ -11727,8 +11758,8 @@ msgid "" "A shape must be provided for CollisionShape2D to function. Please create a " "shape resource for it!" msgstr "" -"Zasób shape jest niezbÄ™dny do dziaÅ‚ania CollisionPolygon2D. ProszÄ™ utworzyć " -"zasób shape!" +"KsztaÅ‚t jest niezbÄ™dny do dziaÅ‚ania CollisionShape2D. ProszÄ™ utworzyć zasób " +"Shape!" #: scene/2d/cpu_particles_2d.cpp msgid "" @@ -12281,6 +12312,18 @@ msgstr "Varying może być przypisane tylko w funkcji wierzchoÅ‚ków." msgid "Constants cannot be modified." msgstr "StaÅ‚e nie mogÄ… być modyfikowane." +#~ msgid "Pause the scene" +#~ msgstr "Zapauzuj scenÄ™" + +#~ msgid "Shift+" +#~ msgstr "Shift+" + +#~ msgid "Alt+" +#~ msgstr "Alt+" + +#~ msgid "Control+" +#~ msgstr "Control+" + #~ msgid "Snap to Grid" #~ msgstr "PrzyciÄ…gaj do siatki" diff --git a/editor/translations/pr.po b/editor/translations/pr.po index 7f3761e68d..f20178f8bb 100644 --- a/editor/translations/pr.po +++ b/editor/translations/pr.po @@ -2846,7 +2846,7 @@ msgid "Play" msgstr "" #: editor/editor_node.cpp -msgid "Pause the scene" +msgid "Pause the scene execution for debugging." msgstr "" #: editor/editor_node.cpp @@ -3532,6 +3532,10 @@ msgid "New Inherited Scene" msgstr "" #: editor/filesystem_dock.cpp +msgid "Set As Main Scene" +msgstr "" + +#: editor/filesystem_dock.cpp msgid "Open Scenes" msgstr "" @@ -4277,6 +4281,19 @@ msgid "" msgstr "" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Anim Clips" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Audio Clips" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Functions" +msgstr "Yer functions:" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/animation_state_machine_editor.cpp msgid "Node Renamed" msgstr "" @@ -4952,6 +4969,14 @@ msgid "Grid Step:" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Primary Line Every:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "steps" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotation Offset:" msgstr "" @@ -4961,6 +4986,11 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy +msgid "Scale Step:" +msgstr "Slit th' Node" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy msgid "Move Vertical Guide" msgstr "Discharge ye' Variable" @@ -5048,6 +5078,20 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"Overrides game camera with editor viewport camera." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"No game instance running." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp #, fuzzy msgid "Lock Selected" msgstr "Yar, Blow th' Selected Down!" @@ -5192,6 +5236,10 @@ msgid "Use Rotation Snap" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Use Scale Snap" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap Relative" msgstr "" @@ -5333,7 +5381,7 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" -"Auto insert keys when objects are translated, rotated on scaled (based on " +"Auto insert keys when objects are translated, rotated or scaled (based on " "mask).\n" "Keys are only added to existing tracks, no new tracks will be created.\n" "Keys must be inserted manually for the first time." @@ -8281,7 +8329,7 @@ msgid "Dodge operator." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "HardLight operator" +msgid "HardLight operator." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8871,9 +8919,10 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Custom Godot Shader Language expression, which placed on top of the resulted " -"shader. You can place various function definitions inside and call it later " -"in the Expressions. You can also declare varyings, uniforms and constants." +"Custom Godot Shader Language expression, which is placed on top of the " +"resulted shader. You can place various function definitions inside and call " +"it later in the Expressions. You can also declare varyings, uniforms and " +"constants." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8985,6 +9034,12 @@ msgid "Add..." msgstr "" #: editor/project_export.cpp +msgid "" +"If checked, the preset will be available for use in one-click deploy.\n" +"Only one preset per platform may be marked as runnable." +msgstr "" + +#: editor/project_export.cpp msgid "Export Path" msgstr "" @@ -9427,18 +9482,6 @@ msgid "Device" msgstr "" #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Shift+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Alt+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Control+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "Press a Key..." msgstr "" @@ -11210,7 +11253,7 @@ msgid "Can't create function of nodes from nodes of multiple functions." msgstr "" #: modules/visual_script/visual_script_editor.cpp -msgid "Select atleast one node with sequence port." +msgid "Select at least one node with sequence port." msgstr "" #: modules/visual_script/visual_script_editor.cpp @@ -11528,10 +11571,20 @@ msgstr "" #: platform/uwp/export/export.cpp #, fuzzy +msgid "Invalid package short name." +msgstr "Yer unique name be evil." + +#: platform/uwp/export/export.cpp +#, fuzzy msgid "Invalid package unique name." msgstr "Yer unique name be evil." #: platform/uwp/export/export.cpp +#, fuzzy +msgid "Invalid package publisher display name." +msgstr "Yer unique name be evil." + +#: platform/uwp/export/export.cpp msgid "Invalid product GUID." msgstr "Yer product GUID be evil." diff --git a/editor/translations/pt_BR.po b/editor/translations/pt_BR.po index ee6244fb84..88953ef6e5 100644 --- a/editor/translations/pt_BR.po +++ b/editor/translations/pt_BR.po @@ -12,7 +12,7 @@ # Guilherme Felipe C G Silva <guilhermefelipecgs@gmail.com>, 2017, 2018, 2019. # João Victor Lima <victordevtb@outlook.com>, 2018. # João Vitor de Oliveira Carlos <lopogax@gmail.com>, 2018. -# Joaquim Ferreira <joaquimferreira1996@bol.com.br>, 2016. +# Joaquim Ferreira <joaquimferreira1996@bol.com.br>, 2016, 2019. # jonathan railarem <railarem@gmail.com>, 2017. # Lucas Silva <lucasb.hpp@gmail.com>, 2018. # Luiz G. Correia <luizgabriell2.0@gmail.com>, 2017. @@ -71,12 +71,13 @@ # Perrottacooking <perrottacooking@gmail.com>, 2019. # Wow Bitch <hahaj@itmailr.com>, 2019. # Alan Tavares <alan1tavares@gmail.com>, 2019. +# Rafael Silveira <res883@gmail.com>, 2019. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: 2016-05-30\n" -"PO-Revision-Date: 2019-10-11 15:07+0000\n" -"Last-Translator: Alan Tavares <alan1tavares@gmail.com>\n" +"PO-Revision-Date: 2019-11-20 14:07+0000\n" +"Last-Translator: Joaquim Ferreira <joaquimferreira1996@bol.com.br>\n" "Language-Team: Portuguese (Brazil) <https://hosted.weblate.org/projects/" "godot-engine/godot/pt_BR/>\n" "Language: pt_BR\n" @@ -84,7 +85,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 3.9-dev\n" +"X-Generator: Weblate 3.10-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -696,9 +697,8 @@ msgid "Scale Ratio:" msgstr "Razão de Escala:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Select Tracks to Copy" -msgstr "Selecionar trilhas para copiar:" +msgstr "Selecionar Trilhas para Copiar" #: editor/animation_track_editor.cpp editor/editor_log.cpp #: editor/editor_properties.cpp @@ -710,9 +710,8 @@ msgid "Copy" msgstr "Copiar" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Select All/None" -msgstr "Remover Seleção" +msgstr "Selecionar Todos/Nenhum" #: editor/animation_track_editor_plugins.cpp msgid "Add Audio Track Clip" @@ -751,7 +750,6 @@ msgid "Replaced %d occurrence(s)." msgstr "%d ocorrência(s) substituÃda(s)." #: editor/code_editor.cpp editor/editor_help.cpp -#, fuzzy msgid "%d match." msgstr "%d correspondência." @@ -2136,15 +2134,15 @@ msgstr "Incoming RPC" #: editor/editor_network_profiler.cpp msgid "Incoming RSET" -msgstr "" +msgstr "RSET recebido" #: editor/editor_network_profiler.cpp msgid "Outgoing RPC" -msgstr "" +msgstr "RPC enviado" #: editor/editor_network_profiler.cpp msgid "Outgoing RSET" -msgstr "" +msgstr "RSET enviado" #: editor/editor_node.cpp editor/project_manager.cpp msgid "New Window" @@ -2953,8 +2951,8 @@ msgid "Play" msgstr "Tocar" #: editor/editor_node.cpp -msgid "Pause the scene" -msgstr "Pausar a cena" +msgid "Pause the scene execution for debugging." +msgstr "" #: editor/editor_node.cpp msgid "Pause Scene" @@ -3646,6 +3644,11 @@ msgid "New Inherited Scene" msgstr "Nova Cena Herdada" #: editor/filesystem_dock.cpp +#, fuzzy +msgid "Set As Main Scene" +msgstr "Cena Principal" + +#: editor/filesystem_dock.cpp msgid "Open Scenes" msgstr "Abrir Cenas" @@ -4377,6 +4380,21 @@ msgstr "" "possÃvel obter os nomes das trilhas." #: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Anim Clips" +msgstr "Clipes de Animação:" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Audio Clips" +msgstr "Clipes de Ãudio:" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Functions" +msgstr "Funções:" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/animation_state_machine_editor.cpp msgid "Node Renamed" msgstr "Nó Renomeado" @@ -4969,7 +4987,7 @@ msgstr "Todos" #: editor/plugins/asset_library_editor_plugin.cpp msgid "No results for \"%s\"." -msgstr "" +msgstr "Sem resultados para \"%s\"." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Import..." @@ -5058,6 +5076,15 @@ msgid "Grid Step:" msgstr "Passo de grade:" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Primary Line Every:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "steps" +msgstr "2 passos" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotation Offset:" msgstr "Deslocamento de rotação:" @@ -5066,6 +5093,11 @@ msgid "Rotation Step:" msgstr "Passo de Rotação:" #: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Scale Step:" +msgstr "Escala:" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move Vertical Guide" msgstr "Mover Guia Vertical" @@ -5152,6 +5184,20 @@ msgstr "Alterar Âncoras" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"Overrides game camera with editor viewport camera." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"No game instance running." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp msgid "Lock Selected" msgstr "Fixar Seleção" @@ -5297,6 +5343,11 @@ msgid "Use Rotation Snap" msgstr "Usar Snap de Rotação" #: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Use Scale Snap" +msgstr "Usar Snap" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap Relative" msgstr "Snap Relativo" @@ -5436,8 +5487,9 @@ msgid "Insert keys (based on mask)." msgstr "Inserir Chaves (baseado na máscara)" #: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy msgid "" -"Auto insert keys when objects are translated, rotated on scaled (based on " +"Auto insert keys when objects are translated, rotated or scaled (based on " "mask).\n" "Keys are only added to existing tracks, no new tracks will be created.\n" "Keys must be inserted manually for the first time." @@ -8119,7 +8171,7 @@ msgstr "Alterar" #: editor/plugins/version_control_editor_plugin.cpp msgid "Modified" -msgstr "" +msgstr "Modificado" #: editor/plugins/version_control_editor_plugin.cpp #, fuzzy @@ -8329,7 +8381,8 @@ msgid "Dodge operator." msgstr "Operador de desvio." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "HardLight operator" +#, fuzzy +msgid "HardLight operator." msgstr "Operador HardLight" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -9004,9 +9057,10 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Custom Godot Shader Language expression, which placed on top of the resulted " -"shader. You can place various function definitions inside and call it later " -"in the Expressions. You can also declare varyings, uniforms and constants." +"Custom Godot Shader Language expression, which is placed on top of the " +"resulted shader. You can place various function definitions inside and call " +"it later in the Expressions. You can also declare varyings, uniforms and " +"constants." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -9122,6 +9176,12 @@ msgid "Add..." msgstr "Adicionar..." #: editor/project_export.cpp +msgid "" +"If checked, the preset will be available for use in one-click deploy.\n" +"Only one preset per platform may be marked as runnable." +msgstr "" + +#: editor/project_export.cpp msgid "Export Path" msgstr "Caminho de Exportação" @@ -9621,18 +9681,6 @@ msgid "Device" msgstr "Dispositivo" #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Shift+" -msgstr "Shift+" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Alt+" -msgstr "Alt+" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Control+" -msgstr "Control+" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "Press a Key..." msgstr "Pressione uma Tecla..." @@ -11430,7 +11478,7 @@ msgid "Can't create function of nodes from nodes of multiple functions." msgstr "" #: modules/visual_script/visual_script_editor.cpp -msgid "Select atleast one node with sequence port." +msgid "Select at least one node with sequence port." msgstr "" #: modules/visual_script/visual_script_editor.cpp @@ -11674,10 +11722,13 @@ msgid "" "Building of Android project failed, check output for the error.\n" "Alternatively visit docs.godotengine.org for Android build documentation." msgstr "" +"A compilação do projeto Android falhou, verifique a saÃda pelo erro.\n" +"Alternativamente, visite docs.godotengine.org para ver a documentação de " +"compilação do Android." #: platform/android/export/export.cpp msgid "No build apk generated at: " -msgstr "" +msgstr "Nenhuma compilação apk gerada em: " #: platform/iphone/export/export.cpp msgid "Identifier is missing." @@ -11722,7 +11773,7 @@ msgstr "Ãcone necessário não especificado na predefinição." #: platform/javascript/export/export.cpp msgid "Stop HTTP Server" -msgstr "" +msgstr "Parar Servidor HTTP" #: platform/javascript/export/export.cpp msgid "Run in Browser" @@ -11757,10 +11808,20 @@ msgid "Using default boot splash image." msgstr "Usando imagem boot splash padrão." #: platform/uwp/export/export.cpp +#, fuzzy +msgid "Invalid package short name." +msgstr "Nome de pacote inválido:" + +#: platform/uwp/export/export.cpp msgid "Invalid package unique name." msgstr "Nome único de pacote inválido." #: platform/uwp/export/export.cpp +#, fuzzy +msgid "Invalid package publisher display name." +msgstr "Nome único de pacote inválido." + +#: platform/uwp/export/export.cpp msgid "Invalid product GUID." msgstr "GUID de produto inválido." @@ -12136,7 +12197,7 @@ msgstr "" #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." -msgstr "" +msgstr "Um SpotLight com um ângulo maior que 90 graus não pode criar sombras." #: scene/3d/navigation_mesh.cpp msgid "A NavigationMesh resource must be set or created for this node to work." @@ -12244,6 +12305,8 @@ msgid "" "WorldEnvironment requires its \"Environment\" property to contain an " "Environment to have a visible effect." msgstr "" +"O WorldEnvironment requer que sua propriedade \"Environment\" contenha um " +"Ambiente para ter um efeito visÃvel." #: scene/3d/world_environment.cpp msgid "" @@ -12311,7 +12374,7 @@ msgstr "Escolha uma cor da tela." #: scene/gui/color_picker.cpp msgid "HSV" -msgstr "" +msgstr "HSV" #: scene/gui/color_picker.cpp #, fuzzy @@ -12433,6 +12496,18 @@ msgstr "Variáveis só podem ser atribuÃdas na função de vértice." msgid "Constants cannot be modified." msgstr "Constantes não podem serem modificadas." +#~ msgid "Pause the scene" +#~ msgstr "Pausar a cena" + +#~ msgid "Shift+" +#~ msgstr "Shift+" + +#~ msgid "Alt+" +#~ msgstr "Alt+" + +#~ msgid "Control+" +#~ msgstr "Control+" + #~ msgid "Snap to Grid" #~ msgstr "Encaixar na grade" diff --git a/editor/translations/pt_PT.po b/editor/translations/pt_PT.po index 41de4d76bd..03976ebf0c 100644 --- a/editor/translations/pt_PT.po +++ b/editor/translations/pt_PT.po @@ -18,7 +18,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2019-10-04 03:16+0000\n" +"PO-Revision-Date: 2019-11-29 14:49+0000\n" "Last-Translator: João Lopes <linux-man@hotmail.com>\n" "Language-Team: Portuguese (Portugal) <https://hosted.weblate.org/projects/" "godot-engine/godot/pt_PT/>\n" @@ -27,7 +27,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 3.9-dev\n" +"X-Generator: Weblate 3.10-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -639,9 +639,8 @@ msgid "Scale Ratio:" msgstr "Proporção de Escala:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Select Tracks to Copy" -msgstr "Selecionar pistas a copiar:" +msgstr "Selecionar Pistas a Copiar" #: editor/animation_track_editor.cpp editor/editor_log.cpp #: editor/editor_properties.cpp @@ -653,9 +652,8 @@ msgid "Copy" msgstr "Copiar" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Select All/None" -msgstr "Selecionar Nenhum" +msgstr "Selecionar Tudo/Nada" #: editor/animation_track_editor_plugins.cpp msgid "Add Audio Track Clip" @@ -2896,8 +2894,8 @@ msgid "Play" msgstr "Executar" #: editor/editor_node.cpp -msgid "Pause the scene" -msgstr "Pausa a cena" +msgid "Pause the scene execution for debugging." +msgstr "Pausar a execução da cena para depuração." #: editor/editor_node.cpp msgid "Pause Scene" @@ -3590,6 +3588,10 @@ msgid "New Inherited Scene" msgstr "Nova Cena Herdada" #: editor/filesystem_dock.cpp +msgid "Set As Main Scene" +msgstr "Definir Como Cena Principal" + +#: editor/filesystem_dock.cpp msgid "Open Scenes" msgstr "Abrir Cenas" @@ -4164,7 +4166,7 @@ msgstr "Selecionar e mover pontos, criar pontos com RMB." #: editor/plugins/animation_blend_space_1d_editor.cpp #: editor/plugins/animation_blend_space_2d_editor.cpp scene/gui/graph_edit.cpp msgid "Enable snap and show grid." -msgstr "Habilita a grelha snap and show." +msgstr "Ativar ajuste e mostrar a grelha." #: editor/plugins/animation_blend_space_1d_editor.cpp #: editor/plugins/animation_blend_space_2d_editor.cpp @@ -4317,6 +4319,18 @@ msgstr "" "de recolher nome das faixas." #: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Anim Clips" +msgstr "Clips Anim" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Audio Clips" +msgstr "Clips Ãudio" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Functions" +msgstr "Funções" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/animation_state_machine_editor.cpp msgid "Node Renamed" msgstr "Nó Renomeado" @@ -4906,7 +4920,7 @@ msgstr "Todos" #: editor/plugins/asset_library_editor_plugin.cpp msgid "No results for \"%s\"." -msgstr "" +msgstr "Nenhum resultado para \"%s\"." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Import..." @@ -4993,6 +5007,14 @@ msgid "Grid Step:" msgstr "Passo da grelha:" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Primary Line Every:" +msgstr "Linha Primária Cada:" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "steps" +msgstr "passos" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotation Offset:" msgstr "Compensação da rotação:" @@ -5001,6 +5023,10 @@ msgid "Rotation Step:" msgstr "Passo da rotação:" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale Step:" +msgstr "Passo de Escala:" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move Vertical Guide" msgstr "Mover Guia Vertical" @@ -5086,6 +5112,24 @@ msgstr "Mudar âncoras" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"Overrides game camera with editor viewport camera." +msgstr "" +"Sobreposição de Câmara de Jogo\n" +"Sobrepõe câmara de jogo com câmara do editor." + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"No game instance running." +msgstr "" +"Sobreposição de Câmara de Jogo\n" +"Nenhuma instância de jogo em execução." + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp msgid "Lock Selected" msgstr "Bloquear Seleção" @@ -5201,24 +5245,20 @@ msgid "Ruler Mode" msgstr "Modo Régua" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Toggle smart snapping." -msgstr "Alternar Ajuste." +msgstr "Alternar ajuste inteligente." #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Use Smart Snap" -msgstr "Usar Ajuste" +msgstr "Usar Ajuste Inteligente" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Toggle grid snapping." -msgstr "Alternar Ajuste." +msgstr "Alternar ajuste de grelha." #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Use Grid Snap" -msgstr "Ajuste de grelha" +msgstr "Usar Ajuste de Grelha" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snapping Options" @@ -5226,11 +5266,15 @@ msgstr "Opções de Ajuste" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Use Rotation Snap" -msgstr "Usar Ajuste de rotação" +msgstr "Usar Ajuste de Rotação" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Use Scale Snap" +msgstr "Usar Ajuste de Escala" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap Relative" -msgstr "Ajuste relativo" +msgstr "Ajuste Relativo" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Use Pixel Snap" @@ -5311,9 +5355,8 @@ msgid "View" msgstr "Vista" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Always Show Grid" -msgstr "Mostrar grelha" +msgstr "Mostrar Grelha Sempre" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Show Helpers" @@ -5369,7 +5412,7 @@ msgstr "Inserir chaves (baseado na máscara)." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" -"Auto insert keys when objects are translated, rotated on scaled (based on " +"Auto insert keys when objects are translated, rotated or scaled (based on " "mask).\n" "Keys are only added to existing tracks, no new tracks will be created.\n" "Keys must be inserted manually for the first time." @@ -5580,9 +5623,8 @@ msgid "Hold Shift to edit tangents individually" msgstr "Pressione Shift para editar tangentes individualmente" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Right click to add point" -msgstr "Clique direito: Apagar Ponto" +msgstr "Clique direito para adicionar ponto" #: editor/plugins/gi_probe_editor_plugin.cpp msgid "Bake GI Probe" @@ -5650,7 +5692,7 @@ msgstr "Falhou o desempacotamento UV, a Malha pode não ser múltipla?" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "No mesh to debug." -msgstr "Nenhuma Malha para depurar." +msgstr "Nenhuma malha para depurar." #: editor/plugins/mesh_instance_editor_plugin.cpp #: editor/plugins/sprite_editor_plugin.cpp @@ -6502,7 +6544,7 @@ msgstr "Continuar" #: editor/plugins/script_editor_plugin.cpp msgid "Keep Debugger Open" -msgstr "Manter depurador aberto" +msgstr "Manter Depurador Aberto" #: editor/plugins/script_editor_plugin.cpp msgid "Debug with External Editor" @@ -7033,9 +7075,8 @@ msgid "Freelook Speed Modifier" msgstr "Modificador de velocidade Freelook" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Freelook Slow Modifier" -msgstr "Modificador de velocidade Freelook" +msgstr "Modificador de Velocidade Freelook" #: editor/plugins/spatial_editor_plugin.cpp msgid "" @@ -7059,7 +7100,7 @@ msgstr "Ajustar Nós ao Fundo" #: editor/plugins/spatial_editor_plugin.cpp msgid "Couldn't find a solid floor to snap the selection to." -msgstr "Não foi encontrado um chão sólido para encaixar a seleção." +msgstr "Não foi encontrado um chão sólido para ajustar a seleção." #: editor/plugins/spatial_editor_plugin.cpp msgid "" @@ -7130,7 +7171,7 @@ msgstr "Transformar" #: editor/plugins/spatial_editor_plugin.cpp msgid "Snap Object to Floor" -msgstr "Alinhar Objetos ao Chão" +msgstr "Ajustar Objetos ao Chão" #: editor/plugins/spatial_editor_plugin.cpp msgid "Transform Dialog..." @@ -7183,15 +7224,15 @@ msgstr "Configuração do Ajuste" #: editor/plugins/spatial_editor_plugin.cpp msgid "Translate Snap:" -msgstr "Ajuste de translação:" +msgstr "Ajuste de Translação:" #: editor/plugins/spatial_editor_plugin.cpp msgid "Rotate Snap (deg.):" -msgstr "Ajuste de rotação (graus):" +msgstr "Ajuste de Rotação (graus):" #: editor/plugins/spatial_editor_plugin.cpp msgid "Scale Snap (%):" -msgstr "Ajuste de escala (%):" +msgstr "Ajuste de Escala (%):" #: editor/plugins/spatial_editor_plugin.cpp msgid "Viewport Settings" @@ -7306,9 +7347,8 @@ msgid "Simplification: " msgstr "Simplificação: " #: editor/plugins/sprite_editor_plugin.cpp -#, fuzzy msgid "Shrink (Pixels): " -msgstr "Crescer (Pixeis): " +msgstr "Encolher (Pixeis): " #: editor/plugins/sprite_editor_plugin.cpp msgid "Grow (Pixels): " @@ -7449,11 +7489,11 @@ msgstr "Nenhum" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Pixel Snap" -msgstr "Ajuste de pixel" +msgstr "Ajuste de Pixel" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Grid Snap" -msgstr "Ajuste de grelha" +msgstr "Ajuste de Grelha" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Auto Slice" @@ -7541,7 +7581,7 @@ msgstr "Verificar item" #: editor/plugins/theme_editor_plugin.cpp msgid "Checked Item" -msgstr "Item verificado" +msgstr "Item Marcado" #: editor/plugins/theme_editor_plugin.cpp msgid "Radio Item" @@ -7549,7 +7589,7 @@ msgstr "Item Rádio" #: editor/plugins/theme_editor_plugin.cpp msgid "Checked Radio Item" -msgstr "Item Rádio marcado" +msgstr "Item Rádio Marcado" #: editor/plugins/theme_editor_plugin.cpp msgid "Named Sep." @@ -7810,7 +7850,7 @@ msgstr "Manter polÃgono dentro da região Rect." #: editor/plugins/tile_set_editor_plugin.cpp msgid "Enable snap and show grid (configurable via the Inspector)." -msgstr "Ativar o snap and show grid (configurável através do Inspector)." +msgstr "Ativar ajuste e mostrar a grelha (configurável através do Inspetor)." #: editor/plugins/tile_set_editor_plugin.cpp msgid "Display Tile Names (Hold Alt Key)" @@ -8092,9 +8132,8 @@ msgid "(GLES3 only)" msgstr "(Apenas GLES3)" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Add Output" -msgstr "Adicionar saÃda +" +msgstr "Adicionar SaÃda" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Scalar" @@ -8110,7 +8149,7 @@ msgstr "Lógico" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Sampler" -msgstr "" +msgstr "Mostrador" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Add input port" @@ -8158,7 +8197,7 @@ msgstr "Definir Nome do Uniform" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Set Input Default Port" -msgstr "Definir Porta de Entrada por Defeito" +msgstr "Definir Porta de Entrada Padrão" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Add Node to Visual Shader" @@ -8242,8 +8281,8 @@ msgid "Dodge operator." msgstr "Operador Desvio." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "HardLight operator" -msgstr "Operador HardLight" +msgid "HardLight operator." +msgstr "Operador HardLight." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Lighten operator." @@ -8881,13 +8920,14 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Custom Godot Shader Language expression, which placed on top of the resulted " -"shader. You can place various function definitions inside and call it later " -"in the Expressions. You can also declare varyings, uniforms and constants." +"Custom Godot Shader Language expression, which is placed on top of the " +"resulted shader. You can place various function definitions inside and call " +"it later in the Expressions. You can also declare varyings, uniforms and " +"constants." msgstr "" "Expressão personalizada em Linguagem Godot Shader, colocada sobre o shader " "resultante. Pode colocar várias definições de função e chamá-las depois nas " -"Expressões. Pode também declarar variantes, uniformes e constantes." +"Expressões. Também pode declarar variantes, uniformes e constantes." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "(Fragment/Light mode only) Scalar derivative function." @@ -9010,6 +9050,15 @@ msgid "Add..." msgstr "Adicionar..." #: editor/project_export.cpp +msgid "" +"If checked, the preset will be available for use in one-click deploy.\n" +"Only one preset per platform may be marked as runnable." +msgstr "" +"Se marcada, a predefinição estará disponÃvel para uso em distribuição um-" +"clique.\n" +"Apenas uma predefinição por plataforma pode ser marcada como executável." + +#: editor/project_export.cpp msgid "Export Path" msgstr "Exportar Caminho" @@ -9038,22 +9087,20 @@ msgid "Resources to export:" msgstr "Recursos a exportar:" #: editor/project_export.cpp -#, fuzzy msgid "" "Filters to export non-resource files/folders\n" "(comma-separated, e.g: *.json, *.txt, docs/*)" msgstr "" -"Filtros para exportar Ficheiros não-recursos (separados por vÃrgula, ex: *." -"json, *.txt)" +"Filtros para exportar ficheiros/pastas não-recursos\n" +"(separados por vÃrgula, ex: *.json, *.txt, docs/*)" #: editor/project_export.cpp -#, fuzzy msgid "" "Filters to exclude files/folders from project\n" "(comma-separated, e.g: *.json, *.txt, docs/*)" msgstr "" -"Filtros para excluir Ficheiros do Projeto (separados por vÃrgula, ex: *." -"json, *.txt)" +"Filtros para excluir ficheiros/pastas do projeto\n" +"(separados por vÃrgula, ex: *.json, *.txt, docs/*)" #: editor/project_export.cpp msgid "Patches" @@ -9125,7 +9172,7 @@ msgstr "Gerir Modelos de Exportação" #: editor/project_export.cpp msgid "Export With Debug" -msgstr "Exportar com depuração" +msgstr "Exportar com Depuração" #: editor/project_manager.cpp msgid "The path does not exist." @@ -9504,18 +9551,6 @@ msgid "Device" msgstr "Dispositivo" #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Shift+" -msgstr "Shift+" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Alt+" -msgstr "Alt+" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Control+" -msgstr "Control+" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "Press a Key..." msgstr "Pressione uma tecla..." @@ -9653,7 +9688,7 @@ msgstr "Evento Ação de Entrada movido" #: editor/project_settings_editor.cpp msgid "Override for Feature" -msgstr "Sobrepor por caracterÃstica" +msgstr "Sobrepor por CaracterÃstica" #: editor/project_settings_editor.cpp msgid "Add Translation" @@ -9701,7 +9736,7 @@ msgstr "Geral" #: editor/project_settings_editor.cpp msgid "Override For..." -msgstr "Sobrepor por..." +msgstr "Sobrepor Por..." #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "The editor must be restarted for changes to take effect." @@ -10096,13 +10131,12 @@ msgstr "" "para os seus valores padrão." #: editor/scene_tree_dock.cpp -#, fuzzy msgid "" "Enabling \"Load As Placeholder\" will disable \"Editable Children\" and " "cause all properties of the node to be reverted to their default." msgstr "" -"Desativar \"editable_instance\" irá reverter todas as propriedades do Nó " -"para os seus valores padrão." +"Ativar \"Carregar como Espaço Reservado\" vai desativar \"Filhos Editáveis\" " +"e fazer com que todas as propriedades do nó revertam para valores padrão." #: editor/scene_tree_dock.cpp msgid "Make Local" @@ -10441,19 +10475,16 @@ msgid "Will load an existing script file." msgstr "Vai carregar ficheiro de script existente." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Class Name:" -msgstr "Nome de classe" +msgstr "Nome de Classe:" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Template:" -msgstr "Modelo" +msgstr "Modelo:" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Built-in Script:" -msgstr "Script incorporado" +msgstr "Script Incorporado:" #: editor/script_create_dialog.cpp msgid "Attach Node Script" @@ -11047,7 +11078,7 @@ msgstr "Definir tipo de variável" #: modules/visual_script/visual_script_editor.cpp msgid "Override an existing built-in function." -msgstr "Sobrepõe-se a função incorporada." +msgstr "Sobrepõe-se a função incorporada existente." #: modules/visual_script/visual_script_editor.cpp msgid "Create a new function." @@ -11094,7 +11125,6 @@ msgid "Add Function" msgstr "Adicionar Função" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Delete input port" msgstr "Remover porta de entrada" @@ -11107,24 +11137,20 @@ msgid "Add Signal" msgstr "Adicionar Sinal" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Add Input Port" -msgstr "Adicionar porta de entrada" +msgstr "Adicionar Porta de Entrada" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Add Output Port" -msgstr "Adicionar porta de saÃda" +msgstr "Adicionar Porta de SaÃda" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Remove Input Port" -msgstr "Remover porta de entrada" +msgstr "Remover Porta de Entrada" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Remove Output Port" -msgstr "Remover porta de saÃda" +msgstr "Remover Porta de SaÃda" #: modules/visual_script/visual_script_editor.cpp msgid "Change Expression" @@ -11172,7 +11198,7 @@ msgstr "Adicionar Nó de Pré-carregamento" #: modules/visual_script/visual_script_editor.cpp msgid "Can't drop nodes because script '%s' is not used in this scene." -msgstr "" +msgstr "ImpossÃvel largar nós porque o script '%s' não é usado neste cena." #: modules/visual_script/visual_script_editor.cpp msgid "Add Node(s) From Tree" @@ -11183,6 +11209,8 @@ msgid "" "Can't drop properties because script '%s' is not used in this scene.\n" "Drop holding 'Shift' to just copy the signature." msgstr "" +"ImpossÃvel largar propriedades porque o script '%s' não é usado neste cena.\n" +"Largue com 'Shift' para copiar apenas a assinatura." #: modules/visual_script/visual_script_editor.cpp msgid "Add Getter Property" @@ -11209,9 +11237,8 @@ msgid "Connect Nodes" msgstr "Conectar Nós" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Disconnect Nodes" -msgstr "Desconectar Nós do gráfico" +msgstr "Desconectar Nós" #: modules/visual_script/visual_script_editor.cpp msgid "Connect Node Data" @@ -11246,26 +11273,24 @@ msgid "Paste VisualScript Nodes" msgstr "Colar Nós VisualScript" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Can't create function with a function node." -msgstr "ImpossÃvel copiar o Nó Função." +msgstr "ImpossÃvel criar função com um nó função." #: modules/visual_script/visual_script_editor.cpp msgid "Can't create function of nodes from nodes of multiple functions." -msgstr "" +msgstr "ImpossÃvel criar função de nós com nós de várias funções." #: modules/visual_script/visual_script_editor.cpp -msgid "Select atleast one node with sequence port." -msgstr "" +msgid "Select at least one node with sequence port." +msgstr "Selecione pelo menos um nó com porta de sequência." #: modules/visual_script/visual_script_editor.cpp msgid "Try to only have one sequence input in selection." -msgstr "" +msgstr "Tente ter apenas uma entrada de sequência na seleção." #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Create Function" -msgstr "Mudar nome da Função" +msgstr "Criar Função" #: modules/visual_script/visual_script_editor.cpp msgid "Remove Function" @@ -11296,9 +11321,8 @@ msgid "Members:" msgstr "Membros:" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "function_name" -msgstr "Função:" +msgstr "function_name" #: modules/visual_script/visual_script_editor.cpp msgid "Select or create a function to edit its graph." @@ -11321,14 +11345,12 @@ msgid "Cut Nodes" msgstr "Cortar Nós" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Make Function" -msgstr "Mudar nome da Função" +msgstr "Criar Função" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Refresh Graph" -msgstr "Atualizar" +msgstr "Atualizar Gráfico" #: modules/visual_script/visual_script_editor.cpp msgid "Edit Member" @@ -11554,7 +11576,7 @@ msgstr "O Ãcone obrigatório não está especificado na predefinição." #: platform/javascript/export/export.cpp msgid "Stop HTTP Server" -msgstr "" +msgstr "Parar Servidor HTTP" #: platform/javascript/export/export.cpp msgid "Run in Browser" @@ -11589,10 +11611,18 @@ msgid "Using default boot splash image." msgstr "A usar imagem padrão de inicialização." #: platform/uwp/export/export.cpp +msgid "Invalid package short name." +msgstr "Nome curto de pacote inválido." + +#: platform/uwp/export/export.cpp msgid "Invalid package unique name." msgstr "Nome único de pacote inválido." #: platform/uwp/export/export.cpp +msgid "Invalid package publisher display name." +msgstr "Nome de autor de pacote inválido." + +#: platform/uwp/export/export.cpp msgid "Invalid product GUID." msgstr "GUID do produto inválido." @@ -12247,6 +12277,18 @@ msgstr "Variações só podem ser atribuÃdas na função vértice." msgid "Constants cannot be modified." msgstr "Constantes não podem ser modificadas." +#~ msgid "Pause the scene" +#~ msgstr "Pausa a cena" + +#~ msgid "Shift+" +#~ msgstr "Shift+" + +#~ msgid "Alt+" +#~ msgstr "Alt+" + +#~ msgid "Control+" +#~ msgstr "Control+" + #~ msgid "Snap to Grid" #~ msgstr "Ajustar à Grelha" diff --git a/editor/translations/ro.po b/editor/translations/ro.po index e3f53a56f3..266f95691e 100644 --- a/editor/translations/ro.po +++ b/editor/translations/ro.po @@ -8,12 +8,13 @@ # TigerxWood <TigerxWood@gmail.com>, 2018. # Grigore Antoniuc <grisa181@gmail.com>, 2018. # Boby Ilea <boby.ilea@gmail.com>, 2019. +# EVOKZH <avip.ady@gmail.com>, 2019. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2019-10-26 03:53+0000\n" -"Last-Translator: Boby Ilea <boby.ilea@gmail.com>\n" +"PO-Revision-Date: 2019-11-09 22:04+0000\n" +"Last-Translator: EVOKZH <avip.ady@gmail.com>\n" "Language-Team: Romanian <https://hosted.weblate.org/projects/godot-engine/" "godot/ro/>\n" "Language: ro\n" @@ -22,12 +23,12 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " "20)) ? 1 : 2;\n" -"X-Generator: Weblate 3.9.1-dev\n" +"X-Generator: Weblate 3.10-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp msgid "Invalid type argument to convert(), use TYPE_* constants." -msgstr "" +msgstr "Argument de tip invalid pentru convert(), folosiÈ›i constante TYPE_*" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/mono/glue/gd_glue.cpp @@ -160,19 +161,16 @@ msgid "Anim Change Call" msgstr "Anim Schimbare apelare" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Anim Multi Change Keyframe Time" -msgstr "Anim SchimbaÈ›i Timpul Cadru Cheie" +msgstr "Anim Timpul multifuncÈ›ional pentru modificarea cheii" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Anim Multi Change Transition" -msgstr "Anim SchimbaÈ›i TranziÈ›ie" +msgstr "Anim TranziÈ›ie multifuncÈ›ională" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Anim Multi Change Transform" -msgstr "Anim Schimbare transformare" +msgstr "Anim Transformare multifuncÈ›ională" #: editor/animation_track_editor.cpp #, fuzzy @@ -192,7 +190,7 @@ msgstr "Schimbă Numele AnimaÈ›iei:" #: editor/animation_track_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Change Animation Loop" -msgstr "" +msgstr "SchimbaÈ›i Bucla AnimaÈ›iei" #: editor/animation_track_editor.cpp msgid "Property Track" @@ -221,9 +219,8 @@ msgid "Animation Playback Track" msgstr "OpreÈ™te rularea animaÈ›iei. (S)" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Animation length (frames)" -msgstr "Lungime AnimaÈ›ie (în secunde)." +msgstr "Lungime AnimaÈ›ie (în frame-uri)." #: editor/animation_track_editor.cpp #, fuzzy @@ -3015,8 +3012,8 @@ msgid "Play" msgstr "Rulează" #: editor/editor_node.cpp -msgid "Pause the scene" -msgstr "ÃŽntrerupe scena" +msgid "Pause the scene execution for debugging." +msgstr "" #: editor/editor_node.cpp msgid "Pause Scene" @@ -3713,6 +3710,11 @@ msgstr "Scenă Derivată Nouă..." #: editor/filesystem_dock.cpp #, fuzzy +msgid "Set As Main Scene" +msgstr "Alege o Scenă Principală" + +#: editor/filesystem_dock.cpp +#, fuzzy msgid "Open Scenes" msgstr "Deschide o scenă" @@ -4499,6 +4501,20 @@ msgid "" msgstr "" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Anim Clips" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Audio Clips" +msgstr "Anim AdăugaÈ›i Pistă" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Functions" +msgstr "FaceÈ›i FuncÈ›ia" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/animation_state_machine_editor.cpp #, fuzzy msgid "Node Renamed" @@ -5208,6 +5224,15 @@ msgid "Grid Step:" msgstr "Pas Grilă:" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Primary Line Every:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "steps" +msgstr "2 paÈ™i" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotation Offset:" msgstr "Compensare RotaÈ›ie:" @@ -5217,6 +5242,11 @@ msgstr "Pas RotaÈ›ie:" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy +msgid "Scale Step:" +msgstr "Dimensiune:" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy msgid "Move Vertical Guide" msgstr "Mută ghidul vertical" @@ -5310,6 +5340,20 @@ msgstr "Modifică Ancorele" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"Overrides game camera with editor viewport camera." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"No game instance running." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp #, fuzzy msgid "Lock Selected" msgstr "Selectează" @@ -5462,6 +5506,11 @@ msgid "Use Rotation Snap" msgstr "FoloseÈ™te RotaÈ›ia Snap" #: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Use Scale Snap" +msgstr "Utilizează Snap" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap Relative" msgstr "Snap Relativ" @@ -5612,7 +5661,7 @@ msgstr "Inserează Notă (Melodii existente)" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" -"Auto insert keys when objects are translated, rotated on scaled (based on " +"Auto insert keys when objects are translated, rotated or scaled (based on " "mask).\n" "Keys are only added to existing tracks, no new tracks will be created.\n" "Keys must be inserted manually for the first time." @@ -8635,8 +8684,9 @@ msgid "Dodge operator." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "HardLight operator" -msgstr "" +#, fuzzy +msgid "HardLight operator." +msgstr "Dimensiune (raport):" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Lighten operator." @@ -9232,9 +9282,10 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Custom Godot Shader Language expression, which placed on top of the resulted " -"shader. You can place various function definitions inside and call it later " -"in the Expressions. You can also declare varyings, uniforms and constants." +"Custom Godot Shader Language expression, which is placed on top of the " +"resulted shader. You can place various function definitions inside and call " +"it later in the Expressions. You can also declare varyings, uniforms and " +"constants." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -9345,6 +9396,12 @@ msgid "Add..." msgstr "" #: editor/project_export.cpp +msgid "" +"If checked, the preset will be available for use in one-click deploy.\n" +"Only one preset per platform may be marked as runnable." +msgstr "" + +#: editor/project_export.cpp #, fuzzy msgid "Export Path" msgstr "Exportă Proiectul" @@ -9803,18 +9860,6 @@ msgid "Device" msgstr "" #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Shift+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Alt+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Control+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "Press a Key..." msgstr "" @@ -11584,7 +11629,7 @@ msgid "Can't create function of nodes from nodes of multiple functions." msgstr "" #: modules/visual_script/visual_script_editor.cpp -msgid "Select atleast one node with sequence port." +msgid "Select at least one node with sequence port." msgstr "" #: modules/visual_script/visual_script_editor.cpp @@ -11898,11 +11943,21 @@ msgstr "" #: platform/uwp/export/export.cpp #, fuzzy +msgid "Invalid package short name." +msgstr "Nume nevalid." + +#: platform/uwp/export/export.cpp +#, fuzzy msgid "Invalid package unique name." msgstr "Nume nevalid." #: platform/uwp/export/export.cpp #, fuzzy +msgid "Invalid package publisher display name." +msgstr "Nume nevalid." + +#: platform/uwp/export/export.cpp +#, fuzzy msgid "Invalid product GUID." msgstr "Nume de Proiect Nevalid." @@ -12439,6 +12494,9 @@ msgstr "" msgid "Constants cannot be modified." msgstr "" +#~ msgid "Pause the scene" +#~ msgstr "ÃŽntrerupe scena" + #, fuzzy #~ msgid "Snap to Grid" #~ msgstr "Snap pe grilă" diff --git a/editor/translations/ru.po b/editor/translations/ru.po index 4e6bd592b3..0f8b7da452 100644 --- a/editor/translations/ru.po +++ b/editor/translations/ru.po @@ -57,11 +57,13 @@ # Maxim Samburskiy <alpacones@outlook.com>, 2019. # Dima Koshel <form.eater@gmail.com>, 2019. # Danil Alexeev <danil@alexeev.xyz>, 2019. +# Ravager <al.porkhunov@gmail.com>, 2019. +# ÐлекÑандр <akonn7@mail.ru>, 2019. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2019-10-22 02:53+0000\n" +"PO-Revision-Date: 2019-11-29 14:48+0000\n" "Last-Translator: Danil Alexeev <danil@alexeev.xyz>\n" "Language-Team: Russian <https://hosted.weblate.org/projects/godot-engine/" "godot/ru/>\n" @@ -71,7 +73,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 3.9.1-dev\n" +"X-Generator: Weblate 3.10-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -210,9 +212,8 @@ msgid "Anim Change Call" msgstr "Изменить вызов анимации" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Anim Multi Change Keyframe Time" -msgstr "Изменить Ð²Ñ€ÐµÐ¼Ñ ÐºÐ»ÑŽÑ‡ÐµÐ²Ð¾Ð³Ð¾ кадра" +msgstr "Ð’Ñ€ÐµÐ¼Ñ Ñмены ключевых кадров анимации" #: editor/animation_track_editor.cpp #, fuzzy @@ -527,7 +528,6 @@ msgstr "" "один трек." #: editor/animation_track_editor.cpp -#, fuzzy msgid "" "This animation belongs to an imported scene, so changes to imported tracks " "will not be saved.\n" @@ -539,25 +539,24 @@ msgid "" "Alternatively, use an import preset that imports animations to separate " "files." msgstr "" -"Ðта Ð°Ð½Ð¸Ð¼Ð°Ñ†Ð¸Ñ Ð¾Ñ‚Ð½Ð¾ÑитÑÑ Ðº импортированной Ñцене, поÑтому Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² " -"импортированных дорожках не ÑохранÑÑŽÑ‚ÑÑ.\n" +"Ð”Ð°Ð½Ð½Ð°Ñ Ð°Ð½Ð¸Ð¼Ð°Ñ†Ð¸Ñ Ð¿Ñ€Ð¸Ð½Ð°Ð´Ð»ÐµÐ¶Ð¸Ñ‚ импортированной Ñцене, поÑтому изменениÑ, " +"внеÑенные в импортированные треки, не будут Ñохранены.\n" "\n" -"Чтобы включить возможноÑÑ‚ÑŒ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÑŒÑких дорожек, перейдите к " -"наÑтройкам импорта Ñцены и уÑтановите Ñледующие параметры\n" -"\"ÐÐ½Ð¸Ð¼Ð°Ñ†Ð¸Ñ > Хранение(Animation > Storage)\" в меню \"Файлы(Files)\", " -"выберите \"ÐÐ½Ð¸Ð¼Ð°Ñ†Ð¸Ñ > СохранÑÑ‚ÑŒ пользовательÑкие дорожки(Animation > Keep " -"Custom Tracks)\", а затем импортируйте заново.\n" -"Кроме того, можно иÑпользовать предуÑтановку импорта, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð¸Ð¼Ð¿Ð¾Ñ€Ñ‚Ð¸Ñ€ÑƒÐµÑ‚ " -"анимацию Ð´Ð»Ñ Ñ€Ð°Ð·Ð´ÐµÐ»ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð²." +"Чтобы активировать возможноÑÑ‚ÑŒ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÑŒÑких треков, перейдите " +"к наÑтройкам импорта Ñцены и уÑтановите\n" +"\"ÐÐ½Ð¸Ð¼Ð°Ñ†Ð¸Ñ > Хранилище\" в значение \"Файлы\", а также включите пункт " +"\"ÐÐ½Ð¸Ð¼Ð°Ñ†Ð¸Ñ > СохранÑÑ‚ÑŒ пользовательÑкие треки\", и заново импортируйте " +"Ñцену.\n" +"Ð’ качеÑтве альтернативы иÑпользуйте преÑет импорта, который импортирует " +"анимации в отдельные файлы." #: editor/animation_track_editor.cpp msgid "Warning: Editing imported animation" msgstr "Предупреждение: Редактирование импортированной анимации" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Select an AnimationPlayer node to create and edit animations." -msgstr "Путь к узлу AnimationPlayer, Ñодержащему анимацию, не задан." +msgstr "Выберите узел AnimationPlayer Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¸ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð°Ð½Ð¸Ð¼Ð°Ñ†Ð¸Ð¹." #: editor/animation_track_editor.cpp msgid "Only show tracks from nodes selected in tree." @@ -689,9 +688,8 @@ msgid "Scale Ratio:" msgstr "КоÑффициент маÑштабированиÑ:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Select Tracks to Copy" -msgstr "Выбрать треки Ð´Ð»Ñ ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ:" +msgstr "Выбрать треки Ð´Ð»Ñ ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ" #: editor/animation_track_editor.cpp editor/editor_log.cpp #: editor/editor_properties.cpp @@ -703,9 +701,8 @@ msgid "Copy" msgstr "Копировать" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Select All/None" -msgstr "СброÑить выделение" +msgstr "Выбрать вÑÑ‘/СброÑить" #: editor/animation_track_editor_plugins.cpp msgid "Add Audio Track Clip" @@ -744,14 +741,12 @@ msgid "Replaced %d occurrence(s)." msgstr "Заменено %d Ñовпадений." #: editor/code_editor.cpp editor/editor_help.cpp -#, fuzzy msgid "%d match." -msgstr "Ðайдено %d Ñовпадений." +msgstr "%d Ñовпадение." #: editor/code_editor.cpp editor/editor_help.cpp -#, fuzzy msgid "%d matches." -msgstr "Ðайдено %d Ñовпадений." +msgstr "%d ÑовпадениÑ(ий)." #: editor/code_editor.cpp editor/find_in_files.cpp msgid "Match Case" @@ -820,12 +815,11 @@ msgstr "ПриÑоединить к Узлу:" #: editor/connections_dialog.cpp msgid "Connect to Script:" -msgstr "Соединить Ñо Ñкриптом:" +msgstr "ПриÑоединить к Ñкрипту:" #: editor/connections_dialog.cpp -#, fuzzy msgid "From Signal:" -msgstr "Сигналы:" +msgstr "От Ñигнала:" #: editor/connections_dialog.cpp msgid "Scene does not contain any script." @@ -857,9 +851,8 @@ msgid "Extra Call Arguments:" msgstr "Дополнительные параметры вызова:" #: editor/connections_dialog.cpp -#, fuzzy msgid "Advanced" -msgstr "Дополнительные параметры" +msgstr "Дополнительно" #: editor/connections_dialog.cpp msgid "Deferred" @@ -1207,12 +1200,10 @@ msgid "License" msgstr "ЛицензиÑ" #: editor/editor_about.cpp -#, fuzzy msgid "Third-party Licenses" -msgstr "Сторонние Лицензии" +msgstr "Сторонние лицензии" #: editor/editor_about.cpp -#, fuzzy msgid "" "Godot Engine relies on a number of third-party free and open source " "libraries, all compatible with the terms of its MIT license. The following " @@ -1221,8 +1212,8 @@ msgid "" msgstr "" "Движок Godot опираетÑÑ Ð½Ð° Ñ€Ñд Ñторонних беÑплатных и открытых библиотек, " "ÑовмеÑтимых Ñ ÑƒÑловиÑми лицензии MIT. Ðиже приводитÑÑ Ð¸Ñчерпывающий ÑпиÑок " -"вÑех Ñторонних компонентов вмеÑте Ñ Ð¸Ñ… авторÑкими правами и уÑловиÑми " -"лицензионного ÑоглашениÑ." +"вÑех Ñторонних компонентов вмеÑте Ñ Ð¸Ñ… ÑоответÑтвующими заÑвлениÑми об " +"авторÑких правах и уÑловиÑми лицензии." #: editor/editor_about.cpp msgid "All Components" @@ -1237,7 +1228,6 @@ msgid "Licenses" msgstr "Лицензии" #: editor/editor_asset_installer.cpp editor/project_manager.cpp -#, fuzzy msgid "Error opening package file, not in ZIP format." msgstr "Ошибка при открытии файла пакета, не в формате zip." @@ -1307,9 +1297,8 @@ msgid "Delete Bus Effect" msgstr "Удалить Ñффект шины" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Drag & drop to rearrange." -msgstr "Ðудио шина, перетащите Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ³Ñ€ÑƒÐ¿Ð¿Ð¸Ñ€Ð¾Ð²ÐºÐ¸." +msgstr "Перетащите чтобы изменить порÑдок." #: editor/editor_audio_buses.cpp msgid "Solo" @@ -1585,16 +1574,16 @@ msgid "" "Target platform requires 'ETC' texture compression for GLES2. Enable 'Import " "Etc' in Project Settings." msgstr "" -"Ð¦ÐµÐ»ÐµÐ²Ð°Ñ Ð¿Ð»Ð°Ñ‚Ñ„Ð¾Ñ€Ð¼Ð° требует Ñжатие текÑтур 'ETC' Ð´Ð»Ñ GLES2. Включите 'Импорт " -"Etc' в наÑтройках проекта." +"Ð¦ÐµÐ»ÐµÐ²Ð°Ñ Ð¿Ð»Ð°Ñ‚Ñ„Ð¾Ñ€Ð¼Ð° требует Ñжатие текÑтур «ETC» Ð´Ð»Ñ GLES2. Включите «Import " +"Etc» в ÐаÑтройках проекта." #: editor/editor_export.cpp msgid "" "Target platform requires 'ETC2' texture compression for GLES3. Enable " "'Import Etc 2' in Project Settings." msgstr "" -"Ð¦ÐµÐ»ÐµÐ²Ð°Ñ Ð¿Ð»Ð°Ñ‚Ñ„Ð¾Ñ€Ð¼Ð° требует компреÑÑию текÑтур 'ETC2' Ð´Ð»Ñ GLES2. Включите " -"'Import Etc 2' в наÑтройках проекта." +"Ð¦ÐµÐ»ÐµÐ²Ð°Ñ Ð¿Ð»Ð°Ñ‚Ñ„Ð¾Ñ€Ð¼Ð° требует компреÑÑию текÑтур «ETC2» Ð´Ð»Ñ GLES2. Включите " +"«Import Etc 2» в ÐаÑтройках проекта." #: editor/editor_export.cpp msgid "" @@ -1603,9 +1592,9 @@ msgid "" "Enable 'Import Etc' in Project Settings, or disable 'Driver Fallback " "Enabled'." msgstr "" -"Ð¦ÐµÐ»ÐµÐ²Ð°Ñ Ð¿Ð»Ð°Ñ‚Ñ„Ð¾Ñ€Ð¼Ð° требует ÑÐ¶Ð°Ñ‚Ð¸Ñ Ñ‚ÐµÐºÑтур 'ETC' Ð´Ð»Ñ Ð¾Ñ‚ÐºÐ°Ñ‚Ð° драйвера к GLES2.\n" -"Включите 'Импорт Etc' в ÐаÑтройках Проекта или отключите 'Откат Драйвера " -"Включен'." +"Ð¦ÐµÐ»ÐµÐ²Ð°Ñ Ð¿Ð»Ð°Ñ‚Ñ„Ð¾Ñ€Ð¼Ð° требует ÑÐ¶Ð°Ñ‚Ð¸Ñ Ñ‚ÐµÐºÑтур «ETC» Ð´Ð»Ñ Ð¾Ñ‚ÐºÐ°Ñ‚Ð° драйвера к GLES2.\n" +"Включите «Import Etc» в ÐаÑтройках проекта или отключите «Driver Fallback " +"Enabled»." #: editor/editor_export.cpp platform/android/export/export.cpp #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp @@ -1641,29 +1630,24 @@ msgid "Asset Library" msgstr "Библиотека реÑурÑов" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Scene Tree Editing" -msgstr "Дерево Ñцены (Узлы):" +msgstr "Редактирование дерева Ñцены" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Import Dock" -msgstr "Импорт" +msgstr "Панель «Импорт»" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Node Dock" -msgstr "Режим перемещениÑ" +msgstr "Панель «Узел»" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "FileSystem and Import Docks" -msgstr "Ð¤Ð°Ð¹Ð»Ð¾Ð²Ð°Ñ ÑиÑтема" +msgstr "Панели Â«Ð¤Ð°Ð¹Ð»Ð¾Ð²Ð°Ñ ÑиÑтема» и «Импорт»" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Erase profile '%s'? (no undo)" -msgstr "Заменить вÑÑ‘ (без возможноÑти отмены)" +msgstr "Стереть профиль «%s»? (Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‚Ð¼ÐµÐ½Ð¸Ñ‚ÑŒ)" #: editor/editor_feature_profile.cpp msgid "Profile must be a valid filename and must not contain '.'" @@ -1687,14 +1671,12 @@ msgid "(Editor Disabled)" msgstr "(Редактор отключен)" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Class Options:" -msgstr "ОпиÑание клаÑÑа:" +msgstr "Параметры клаÑÑа:" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Enable Contextual Editor" -msgstr "Открыть Ñледующий редактор" +msgstr "Включить контекÑтный редактор" #: editor/editor_feature_profile.cpp msgid "Enabled Properties:" @@ -1710,33 +1692,31 @@ msgstr "ДоÑтупные клаÑÑÑ‹:" #: editor/editor_feature_profile.cpp msgid "File '%s' format is invalid, import aborted." -msgstr "Ðеверный формат файла \"% s\", импорт прерван." +msgstr "Ðеверный формат файла \"%s\", импорт прерван." #: editor/editor_feature_profile.cpp msgid "" "Profile '%s' already exists. Remove it first before importing, import " "aborted." msgstr "" -"Профиль '%s' уже ÑущеÑтвует. Удалите его перед импортом, импорт отменен." +"Профиль \"%s\" уже ÑущеÑтвует. Удалите его перед импортированием, импорт " +"прерван." #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Error saving profile to path: '%s'." -msgstr "Ошибка при загрузке шаблона '%s'" +msgstr "Ошибка ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ Ð² \"%s\"." #: editor/editor_feature_profile.cpp msgid "Unset" msgstr "СброÑить" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Current Profile:" -msgstr "Ð¢ÐµÐºÑƒÑ‰Ð°Ñ Ð²ÐµÑ€ÑиÑ:" +msgstr "Текущий профиль:" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Make Current" -msgstr "Выбранный:" +msgstr "Сделать текущим" #: editor/editor_feature_profile.cpp #: editor/plugins/animation_player_editor_plugin.cpp @@ -1754,37 +1734,32 @@ msgid "Export" msgstr "ÐкÑпорт" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Available Profiles:" -msgstr "ДоÑтупные узлы:" +msgstr "ДоÑтупные профили:" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Class Options" -msgstr "ОпиÑание клаÑÑа" +msgstr "Параметры клаÑÑа" #: editor/editor_feature_profile.cpp msgid "New profile name:" msgstr "Ðовое имÑ:" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Erase Profile" -msgstr "Стереть облаÑÑ‚ÑŒ" +msgstr "Стереть профиль" #: editor/editor_feature_profile.cpp msgid "Import Profile(s)" msgstr "Импортировать проект" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Export Profile" -msgstr "ÐкÑпортировать проект" +msgstr "ÐкÑпортировать профиль" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Manage Editor Feature Profiles" -msgstr "Управление шаблонами ÑкÑпорта" +msgstr "Управление профилÑми редактора" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Select Current Folder" @@ -1893,30 +1868,27 @@ msgstr "ПеремеÑтить избранное вниз" #: editor/editor_file_dialog.cpp msgid "Go to previous folder." -msgstr "Перейти к родительÑкой папке." +msgstr "Перейти к предыдущей папке." #: editor/editor_file_dialog.cpp -#, fuzzy msgid "Go to next folder." -msgstr "Перейти к родительÑкой папке." +msgstr "Перейти к Ñледующей папке." #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder." msgstr "Перейти к родительÑкой папке." #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp -#, fuzzy msgid "Refresh files." -msgstr "ПоиÑк файлов" +msgstr "Обновить файлы." #: editor/editor_file_dialog.cpp msgid "(Un)favorite current folder." msgstr "Добавить или удалить текущую папку из избранных." #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp -#, fuzzy msgid "Toggle the visibility of hidden files." -msgstr "Скрыть файлы" +msgstr "Переключить видимоÑÑ‚ÑŒ Ñкрытых файлов." #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp msgid "View items as a grid of thumbnails." @@ -1978,9 +1950,8 @@ msgid "Inherited by:" msgstr "УнаÑледован:" #: editor/editor_help.cpp -#, fuzzy msgid "Brief Description" -msgstr "Краткое опиÑание:" +msgstr "Краткое опиÑание" #: editor/editor_help.cpp msgid "Properties" @@ -2011,9 +1982,8 @@ msgid "Class Description" msgstr "ОпиÑание клаÑÑа" #: editor/editor_help.cpp -#, fuzzy msgid "Online Tutorials" -msgstr "Онлайн уроки:" +msgstr "Онлайн-уроки" #: editor/editor_help.cpp msgid "" @@ -2167,9 +2137,8 @@ msgid "Outgoing RSET" msgstr "ИÑходÑщий RSET" #: editor/editor_node.cpp editor/project_manager.cpp -#, fuzzy msgid "New Window" -msgstr "Окно" +msgstr "Ðовое окно" #: editor/editor_node.cpp msgid "Project export failed with error code %d." @@ -2313,13 +2282,13 @@ msgstr "" "чтобы лучше понÑÑ‚ÑŒ Ñтот процеÑÑ." #: editor/editor_node.cpp -#, fuzzy msgid "" "This resource belongs to a scene that was instanced or inherited.\n" "Changes to it won't be kept when saving the current scene." msgstr "" -"Ðтот реÑÑƒÑ€Ñ Ð¿Ñ€Ð¸Ð½Ð°Ð´Ð»ÐµÐ¶Ð¸Ñ‚ к Ñцене, инÑтанцированной или унаÑледованной.\n" -"Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð½Ðµ будут Ñохранены при Ñохранении текущей Ñцены." +"Ðтот реÑÑƒÑ€Ñ Ð¿Ñ€Ð¸Ð½Ð°Ð´Ð»ÐµÐ¶Ð¸Ñ‚ Ñцене, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±Ñ‹Ð»Ð° инÑтанцирована или " +"унаÑледована.\n" +"Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² нём не будут Ñохранены при Ñохранении текущей Ñцены." #: editor/editor_node.cpp msgid "" @@ -2330,7 +2299,6 @@ msgstr "" "наÑтройки в панеле импорта, а затем повторно импортируйте." #: editor/editor_node.cpp -#, fuzzy msgid "" "This scene was imported, so changes to it won't be kept.\n" "Instancing it or inheriting will allow making changes to it.\n" @@ -2338,28 +2306,27 @@ msgid "" "understand this workflow." msgstr "" "Ðта Ñцена была импортирована, так что Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð½Ðµ будут Ñохранены.\n" -"ИнÑтанÑинг или наÑледование позволит внеÑти Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² неё.\n" -"ПожалуйÑта, прочитайте документацию, имеющую отношение к импорту Ñцены, " -"чтобы лучше понÑÑ‚ÑŒ Ñтот процеÑÑ." +"ИнÑтанцирование или наÑледование позволит внеÑти в неё изменениÑ.\n" +"ПожалуйÑта, прочитайте документацию об импортировании Ñцен, чтобы лучше " +"понÑÑ‚ÑŒ Ñтот процеÑÑ." #: editor/editor_node.cpp -#, fuzzy msgid "" "This is a remote object, so changes to it won't be kept.\n" "Please read the documentation relevant to debugging to better understand " "this workflow." msgstr "" "Ðто удаленный объект, поÑтому Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð½Ðµ будут Ñохранены.\n" -"ПожалуйÑта, прочитайте документацию отноÑÑщуюÑÑ Ðº отладке, чтобы лучше " -"понÑÑ‚ÑŒ Ñтот процеÑÑ." +"ПожалуйÑта, прочитайте документацию, каÑающуюÑÑ Ð¾Ñ‚Ð»Ð°Ð´ÐºÐ¸, чтобы лучше понÑÑ‚ÑŒ " +"Ñтот процеÑÑ." #: editor/editor_node.cpp msgid "There is no defined scene to run." -msgstr "Ðет определённой Ñцены, чтобы работать." +msgstr "Ðет открытой Ñцены Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑка." #: editor/editor_node.cpp msgid "Current scene was never saved, please save it prior to running." -msgstr "Ð¢ÐµÐºÑƒÑ‰Ð°Ñ Ñцена никогда не была Ñохранена, Ñохраните его до выполнениÑ." +msgstr "Ð¢ÐµÐºÑƒÑ‰Ð°Ñ Ñцена никогда не была Ñохранена, Ñохраните её перед запуÑком." #: editor/editor_node.cpp msgid "Could not start subprocess!" @@ -2499,9 +2466,8 @@ msgid "Close Scene" msgstr "Закрыть Ñцену" #: editor/editor_node.cpp -#, fuzzy msgid "Reopen Closed Scene" -msgstr "Закрыть Ñцену" +msgstr "Открыть ранее закрытую Ñцену" #: editor/editor_node.cpp msgid "Unable to enable addon plugin at: '%s' parsing of config failed." @@ -2567,9 +2533,8 @@ msgid "" "You can change it later in \"Project Settings\" under the 'application' " "category." msgstr "" -"Ðе назначена Ð³Ð»Ð°Ð²Ð½Ð°Ñ Ñцена. Хотите выбрать?\n" -"Позже вы можете указать её в параметре \"main_scene\" раÑположенном\n" -"в \"ÐаÑтройки проекта - ОÑновное - application\"." +"Ðе назначена Ð³Ð»Ð°Ð²Ð½Ð°Ñ Ñцена, хотите выбрать?\n" +"Ð’Ñ‹ можете изменить её позже в ÐаÑтройках проекта (ÐºÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ Â«application»)." #: editor/editor_node.cpp msgid "" @@ -2577,9 +2542,8 @@ msgid "" "You can change it later in \"Project Settings\" under the 'application' " "category." msgstr "" -"Ð’Ñ‹Ð±Ñ€Ð°Ð½Ð½Ð°Ñ Ñцена '%s' не ÑущеÑтвует. Хотите выбрать другую?\n" -"Позже вы можете указать её в параметре \"main_scene\" раÑположенном\n" -"в \"ÐаÑтройки проекта - ОÑновное - application\"." +"Ð’Ñ‹Ð±Ñ€Ð°Ð½Ð½Ð°Ñ Ñцена «%s» не ÑущеÑтвует, хотите выбрать другую?\n" +"Ð’Ñ‹ можете изменить её позже в ÐаÑтройках проекта (ÐºÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ Â«application»)." #: editor/editor_node.cpp msgid "" @@ -2587,9 +2551,9 @@ msgid "" "You can change it later in \"Project Settings\" under the 'application' " "category." msgstr "" -"Выбранный файл '%s' не ÑвлÑетÑÑ Ñ„Ð°Ð¹Ð»Ð¾Ð¼ Ñцены. Хотите выбрать другой файл?\n" -"Позже вы можете указать её в параметре \"main_scene\" раÑположенном\n" -"в \"ÐаÑтройки проекта - ОÑновное - application\"." +"Выбранный файл «%s» не ÑвлÑетÑÑ Ñ„Ð°Ð¹Ð»Ð¾Ð¼ Ñцены, хотите выбрать другой?\n" +"Ð’Ñ‹ можете изменить главную Ñцену позже в ÐаÑтройках проекта (ÐºÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ " +"«application»)." #: editor/editor_node.cpp msgid "Save Layout" @@ -2618,9 +2582,8 @@ msgid "Close Tab" msgstr "Закрыть вкладку" #: editor/editor_node.cpp -#, fuzzy msgid "Undo Close Tab" -msgstr "Закрыть вкладку" +msgstr "Отменить закрытие вкладки" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp msgid "Close Other Tabs" @@ -2675,9 +2638,8 @@ msgid "Go to previously opened scene." msgstr "Перейти к предыдущей открытой Ñцене." #: editor/editor_node.cpp -#, fuzzy msgid "Copy Text" -msgstr "Копировать путь" +msgstr "Копировать текÑÑ‚" #: editor/editor_node.cpp msgid "Next tab" @@ -2754,33 +2716,28 @@ msgid "Project" msgstr "Проект" #: editor/editor_node.cpp -#, fuzzy msgid "Project Settings..." -msgstr "Параметры проекта" +msgstr "ÐаÑтройки проекта..." #: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Version Control" -msgstr "ВерÑиÑ:" +msgstr "Контроль верÑий" #: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Set Up Version Control" -msgstr "ÐаÑтроить управление верÑиÑми" +msgstr "ÐаÑтроить контроль верÑий" #: editor/editor_node.cpp -#, fuzzy msgid "Shut Down Version Control" -msgstr "Выключить управление верÑиÑми" +msgstr "Выключить контроль верÑий" #: editor/editor_node.cpp msgid "Export..." msgstr "ÐкÑпортировать..." #: editor/editor_node.cpp -#, fuzzy msgid "Install Android Build Template..." -msgstr "УÑтановить шаблон Ñборки Android" +msgstr "УÑтановить шаблон Ñборки Android..." #: editor/editor_node.cpp msgid "Open Project Data Folder" @@ -2791,9 +2748,8 @@ msgid "Tools" msgstr "ИнÑтрументы" #: editor/editor_node.cpp -#, fuzzy msgid "Orphan Resource Explorer..." -msgstr "Обзор подключённых реÑурÑов" +msgstr "Обзор реÑурÑов-Ñирот..." #: editor/editor_node.cpp msgid "Quit to Project List" @@ -2896,9 +2852,8 @@ msgid "Editor" msgstr "Редактор" #: editor/editor_node.cpp -#, fuzzy msgid "Editor Settings..." -msgstr "ÐаÑтройки редактора" +msgstr "ÐаÑтройки редактора..." #: editor/editor_node.cpp msgid "Editor Layout" @@ -2909,40 +2864,36 @@ msgid "Take Screenshot" msgstr "Сделать Ñнимок Ñкрана" #: editor/editor_node.cpp -#, fuzzy msgid "Screenshots are stored in the Editor Data/Settings Folder." -msgstr "Открыть папку Данные/ÐаÑтройки редактора" +msgstr "Снимки Ñкрана хранÑÑ‚ÑÑ Ð² папке данных/наÑтроек редактора." #: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "Переключить полноÑкранный режим" #: editor/editor_node.cpp -#, fuzzy msgid "Toggle System Console" -msgstr "Переключить видимоÑÑ‚ÑŒ CanvasItem" +msgstr "Переключить ÑиÑтемную конÑоль" #: editor/editor_node.cpp msgid "Open Editor Data/Settings Folder" -msgstr "Открыть папку Данные/ÐаÑтройки редактора" +msgstr "Открыть папку данных/наÑтроек редактора" #: editor/editor_node.cpp msgid "Open Editor Data Folder" -msgstr "Открыть папку редактора данных" +msgstr "Открыть папку данных редактора" #: editor/editor_node.cpp msgid "Open Editor Settings Folder" msgstr "Открыть папку наÑтроек редактора" #: editor/editor_node.cpp -#, fuzzy msgid "Manage Editor Features..." -msgstr "Управление шаблонами ÑкÑпорта" +msgstr "Управление возможноÑÑ‚Ñми редактора..." #: editor/editor_node.cpp -#, fuzzy msgid "Manage Export Templates..." -msgstr "Управление шаблонами ÑкÑпорта" +msgstr "Управление шаблонами ÑкÑпорта..." #: editor/editor_node.cpp editor/plugins/shader_editor_plugin.cpp msgid "Help" @@ -2987,8 +2938,8 @@ msgid "Play" msgstr "ВоÑпроизвеÑти" #: editor/editor_node.cpp -msgid "Pause the scene" -msgstr "ПриоÑтановить Ñцену" +msgid "Pause the scene execution for debugging." +msgstr "ПриоÑтановить выполнение Ñцены Ð´Ð»Ñ Ð¾Ñ‚Ð»Ð°Ð´ÐºÐ¸." #: editor/editor_node.cpp msgid "Pause Scene" @@ -3032,7 +2983,6 @@ msgid "Update Continuously" msgstr "Ðепрерывное обновление" #: editor/editor_node.cpp -#, fuzzy msgid "Update When Changed" msgstr "ОбновлÑÑ‚ÑŒ при изменениÑÑ…" @@ -3067,9 +3017,8 @@ msgstr "" "шаблоны." #: editor/editor_node.cpp -#, fuzzy msgid "Manage Templates" -msgstr "Управление шаблонами ÑкÑпорта" +msgstr "Управление шаблонами" #: editor/editor_node.cpp msgid "" @@ -3091,15 +3040,15 @@ msgstr "" "включена Ð¾Ð¿Ñ†Ð¸Ñ Â«Ð˜Ñпользовать пользовательÑкую Ñборку»." #: editor/editor_node.cpp -#, fuzzy msgid "" "The Android build template is already installed in this project and it won't " "be overwritten.\n" "Remove the \"res://android/build\" directory manually before attempting this " "operation again." msgstr "" -"Шаблон Ñборки Android уже уÑтановлен и не будет перезапиÑан.\n" -"Перед повторной попыткой удалите каталог \"build\" вручную." +"Шаблон Ñборки Android уже уÑтановлен в Ñтом проекте и не будет перезапиÑан.\n" +"Удалите директорию \"res://android/build\" вручную прежде чем выполнÑÑ‚ÑŒ Ñту " +"операцию Ñнова." #: editor/editor_node.cpp msgid "Import Templates From ZIP File" @@ -3162,9 +3111,8 @@ msgid "Open the previous Editor" msgstr "Открыть предыдущий редактор" #: editor/editor_path.cpp -#, fuzzy msgid "No sub-resources found." -msgstr "ПоверхноÑÑ‚ÑŒ иÑточника не определена." +msgstr "Вложенные реÑурÑÑ‹ не найдены." #: editor/editor_plugin.cpp msgid "Creating Mesh Previews" @@ -3175,13 +3123,12 @@ msgid "Thumbnail..." msgstr "Миниатюра..." #: editor/editor_plugin_settings.cpp -#, fuzzy msgid "Main Script:" -msgstr "Открыть Ñкрипт" +msgstr "ОÑновной Ñкрипт:" #: editor/editor_plugin_settings.cpp msgid "Edit Plugin" -msgstr "Редактировать дополнение" +msgstr "Редактировать плагин" #: editor/editor_plugin_settings.cpp msgid "Installed Plugins:" @@ -3249,9 +3196,8 @@ msgid "Calls" msgstr "Вызовы" #: editor/editor_properties.cpp -#, fuzzy msgid "Edit Text:" -msgstr "Редактировать тему..." +msgstr "Редактировать текÑÑ‚:" #: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" @@ -3421,7 +3367,6 @@ msgid "Import From Node:" msgstr "Импортировать из Узла:" #: editor/export_template_manager.cpp -#, fuzzy msgid "Redownload" msgstr "Перезагрузить" @@ -3523,26 +3468,24 @@ msgid "Download Complete." msgstr "Загрузка завершена." #: editor/export_template_manager.cpp -#, fuzzy msgid "Cannot remove temporary file:" -msgstr "Ðевозможно Ñохранить тему в файл:" +msgstr "Ðевозможно удалить временный файл:" #: editor/export_template_manager.cpp -#, fuzzy msgid "" "Templates installation failed.\n" "The problematic templates archives can be found at '%s'." msgstr "" -"Ошибка уÑтановки шаблона. Ðрхив Ñ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼Ð½Ñ‹Ð¼ шаблоном можно найти в '%s'." +"Ошибка уÑтановки шаблонов.\n" +"Ðрхивы Ñ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼Ð½Ñ‹Ð¼Ð¸ шаблонами можно найти в \"%s\"." #: editor/export_template_manager.cpp -#, fuzzy msgid "Error requesting URL:" -msgstr "Ошибка запроÑа адреÑа ÑÑылки: " +msgstr "Ошибка при запроÑе URL:" #: editor/export_template_manager.cpp msgid "Connecting to Mirror..." -msgstr "Подключение к зеркалам..." +msgstr "Подключение к зеркалу..." #: editor/export_template_manager.cpp msgid "Disconnected" @@ -3587,9 +3530,8 @@ msgid "SSL Handshake Error" msgstr "Ошибка Ñ€ÑƒÐºÐ¾Ð¿Ð¾Ð¶Ð°Ñ‚Ð¸Ñ SSH" #: editor/export_template_manager.cpp -#, fuzzy msgid "Uncompressing Android Build Sources" -msgstr "РаÑпаковка аÑÑетов" +msgstr "РаÑпаковка иÑходников Ñборки Android" #: editor/export_template_manager.cpp msgid "Current Version:" @@ -3690,6 +3632,11 @@ msgid "New Inherited Scene" msgstr "ÐÐ¾Ð²Ð°Ñ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ð°Ñ Ñцена" #: editor/filesystem_dock.cpp +#, fuzzy +msgid "Set As Main Scene" +msgstr "Ð“Ð»Ð°Ð²Ð½Ð°Ñ Ñцена" + +#: editor/filesystem_dock.cpp msgid "Open Scenes" msgstr "Открыть Ñцены" @@ -3726,9 +3673,8 @@ msgid "Move To..." msgstr "ПеремеÑтить в..." #: editor/filesystem_dock.cpp -#, fuzzy msgid "New Scene..." -msgstr "ÐÐ¾Ð²Ð°Ñ Ñцена" +msgstr "ÐÐ¾Ð²Ð°Ñ Ñцена..." #: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp msgid "New Script..." @@ -3796,9 +3742,8 @@ msgid "Overwrite" msgstr "ПерезапиÑать" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Create Scene" -msgstr "Создать из Ñцены" +msgstr "Создать Ñцену" #: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp msgid "Create Script" @@ -3821,13 +3766,12 @@ msgid "Filters:" msgstr "Фильтры:" #: editor/find_in_files.cpp -#, fuzzy msgid "" "Include the files with the following extensions. Add or remove them in " "ProjectSettings." msgstr "" -"Включает в ÑÐµÐ±Ñ Ñ„Ð°Ð¹Ð»Ñ‹ Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð½Ñ‹Ð¼Ð¸ раÑширениÑми. Добавьте или удалите их в " -"ProjectSettings." +"Включать файлы Ñо Ñледующими раÑширениÑми. Добавьте или удалите их в " +"ÐаÑтройках проекта." #: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp @@ -3879,23 +3823,20 @@ msgid "Invalid group name." msgstr "Ðеверное название группы." #: editor/groups_editor.cpp -#, fuzzy msgid "Rename Group" -msgstr "Управление Группами" +msgstr "Переименовать группу" #: editor/groups_editor.cpp -#, fuzzy msgid "Delete Group" -msgstr "Удалено изображение группы" +msgstr "Удалить группу" #: editor/groups_editor.cpp editor/node_dock.cpp msgid "Groups" msgstr "Группы" #: editor/groups_editor.cpp -#, fuzzy msgid "Nodes Not in Group" -msgstr "Узлы не в Группе" +msgstr "Узлы не в группе" #: editor/groups_editor.cpp editor/scene_tree_dock.cpp #: editor/scene_tree_editor.cpp @@ -4012,9 +3953,8 @@ msgid "Import As:" msgstr "Импортировать как:" #: editor/import_dock.cpp -#, fuzzy msgid "Preset" -msgstr "ПредуÑтановки" +msgstr "ПреÑет" #: editor/import_dock.cpp msgid "Reimport" @@ -4121,9 +4061,8 @@ msgid "MultiNode Set" msgstr "Мульти-узловый набор" #: editor/node_dock.cpp -#, fuzzy msgid "Select a single node to edit its signals and groups." -msgstr "Выберите узел Ð´Ð»Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñигналов и групп." +msgstr "Выберите один узел Ð´Ð»Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñигналов и групп." #: editor/plugin_config_dialog.cpp msgid "Edit a Plugin" @@ -4423,6 +4362,20 @@ msgstr "" "удаетÑÑ Ð¿Ð¾Ð»ÑƒÑ‡Ð¸Ñ‚ÑŒ отÑлеживаемые имена." #: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Anim Clips" +msgstr "Дорожки Ðнимации:" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Audio Clips" +msgstr "Ðудиодорожки:" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Functions" +msgstr "Функции" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/animation_state_machine_editor.cpp msgid "Node Renamed" msgstr "Узел переименован" @@ -4578,9 +4531,8 @@ msgid "Enable Onion Skinning" msgstr "Включить режим кальки" #: editor/plugins/animation_player_editor_plugin.cpp -#, fuzzy msgid "Onion Skinning Options" -msgstr "Режим кальки" +msgstr "Параметры режима кальки" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Directions" @@ -4912,14 +4864,12 @@ msgid "Request failed, return code:" msgstr "Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð½Ðµ удалÑÑ, код:" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Request failed." msgstr "Ðе удалоÑÑŒ выполнить запроÑ." #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Cannot save response to:" -msgstr "Ðевозможно Ñохранить тему в файл:" +msgstr "Ðевозможно Ñохранить ответ в:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Write error." @@ -4930,19 +4880,16 @@ msgid "Request failed, too many redirects" msgstr "Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð½Ðµ прошёл, Ñлишком много перенаправлений" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Redirect loop." msgstr "ЦикличеÑкое перенаправление." #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Request failed, timeout" -msgstr "Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð½Ðµ удалÑÑ, код:" +msgstr "Ошибка запроÑа, превышено Ð²Ñ€ÐµÐ¼Ñ Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Timeout." -msgstr "ВремÑ" +msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Bad download hash, assuming file has been tampered with." @@ -4950,11 +4897,11 @@ msgstr "ÐеÑовпадение Ñ…Ñша загрузки, возможно Ñ„Ð #: editor/plugins/asset_library_editor_plugin.cpp msgid "Expected:" -msgstr "ОжидаетÑÑ:" +msgstr "ОжидалоÑÑŒ:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Got:" -msgstr "Получил:" +msgstr "Получено:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Failed sha256 hash check" @@ -5002,15 +4949,15 @@ msgstr "Загрузка Ñтого шаблона уже идёт!" #: editor/plugins/asset_library_editor_plugin.cpp msgid "First" -msgstr "Первый" +msgstr "ПерваÑ" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Previous" -msgstr "Ðазад" +msgstr "ПредыдущаÑ" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Next" -msgstr "Следующий" +msgstr "СледующаÑ" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Last" @@ -5022,17 +4969,15 @@ msgstr "Ð’Ñе" #: editor/plugins/asset_library_editor_plugin.cpp msgid "No results for \"%s\"." -msgstr "" +msgstr "Ðет результатов Ð´Ð»Ñ \"%s\"." #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Import..." -msgstr "Переимпортировать..." +msgstr "Импорт..." #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Plugins..." -msgstr "Плагины" +msgstr "Плагины..." #: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp msgid "Sort:" @@ -5048,9 +4993,8 @@ msgid "Site:" msgstr "Сайт:" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Support" -msgstr "Поддержка..." +msgstr "Поддержка" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Official" @@ -5061,7 +5005,6 @@ msgid "Testing" msgstr "ТеÑтируемые" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Loading..." msgstr "Загрузка..." @@ -5114,6 +5057,15 @@ msgid "Grid Step:" msgstr "Шаг Ñетки:" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Primary Line Every:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "steps" +msgstr "2 шага" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotation Offset:" msgstr "ОтÑтуп поворота:" @@ -5123,8 +5075,12 @@ msgstr "Шаг поворота:" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy +msgid "Scale Step:" +msgstr "МаÑштаб:" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move Vertical Guide" -msgstr "Перемещение вертикальной направлÑющей" +msgstr "Перемещать вертикальную направлÑющую" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Create Vertical Guide" @@ -5135,9 +5091,8 @@ msgid "Remove Vertical Guide" msgstr "Удалить вертикальную направлÑющую" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Move Horizontal Guide" -msgstr "ПеремеÑтить горизонтальную направлÑющую" +msgstr "Перемещать горизонтальную направлÑющую" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Create Horizontal Guide" @@ -5208,6 +5163,20 @@ msgstr "Изменить привÑзку" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"Overrides game camera with editor viewport camera." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"No game instance running." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp msgid "Lock Selected" msgstr "Заблокировать выбранное" @@ -5231,19 +5200,16 @@ msgid "Paste Pose" msgstr "Ð’Ñтавить позу" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Clear Guides" -msgstr "ОчиÑтить позу" +msgstr "ОчиÑтить направлÑющие" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Create Custom Bone(s) from Node(s)" -msgstr "Сделать ПользовательÑкие КоÑÑ‚ÑŒ(и) от Узла(ов)" +msgstr "Создать пользовательÑкую(ие) коÑÑ‚ÑŒ(и) из узла(ов)" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Clear Bones" -msgstr "ОчиÑтить позу" +msgstr "ОчиÑтить коÑти" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Make IK Chain" @@ -5323,29 +5289,24 @@ msgid "Pan Mode" msgstr "Режим оÑмотра" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Ruler Mode" -msgstr "Режим запуÑка:" +msgstr "Режим линейки" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Toggle smart snapping." -msgstr "Переключить привÑзки." +msgstr "Переключить умную привÑзку." #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Use Smart Snap" -msgstr "ИÑпользовать привÑзку" +msgstr "ИÑпользовать умную привÑзку" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Toggle grid snapping." -msgstr "Переключить привÑзки." +msgstr "Переключить привÑзку к Ñетке." #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Use Grid Snap" -msgstr "ПривÑзка по Ñетке" +msgstr "ИÑпользовать привÑзку к Ñетке" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snapping Options" @@ -5356,6 +5317,11 @@ msgid "Use Rotation Snap" msgstr "ИÑпользовать привÑзку вращениÑ" #: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Use Scale Snap" +msgstr "ИÑпользовать умную привÑзку" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap Relative" msgstr "ОтноÑÐ¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð¿Ñ€Ð¸Ð²Ñзка" @@ -5377,22 +5343,18 @@ msgid "Snap to Parent" msgstr "ПривÑзка к родителю" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Snap to Node Anchor" msgstr "ПривÑзка к Ñкорю узла" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Snap to Node Sides" msgstr "ПривÑзка к Ñторонам узла" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Snap to Node Center" msgstr "ПривÑзка к центру узла" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Snap to Other Nodes" msgstr "ПривÑзка к другим узлам" @@ -5442,9 +5404,8 @@ msgid "View" msgstr "Обзор" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Always Show Grid" -msgstr "Показать Ñетку" +msgstr "Ð’Ñегда показать Ñетку" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Show Helpers" @@ -5484,29 +5445,25 @@ msgid "Preview Canvas Scale" msgstr "ПредпроÑмотр маÑштаба холÑта" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Translation mask for inserting keys." msgstr "МаÑка Ð¿ÐµÑ€ÐµÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»Ñемых ключей." #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Rotation mask for inserting keys." msgstr "МаÑка поворота Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»Ñемых ключей." #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Scale mask for inserting keys." msgstr "МаÑка маÑштаба Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»Ñемых ключей." #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Insert keys (based on mask)." -msgstr "Ð’Ñтавить ключи (в завиÑимоÑти от маÑки)" +msgstr "Ð’Ñтавить ключи (на оÑнове маÑки)." #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy msgid "" -"Auto insert keys when objects are translated, rotated on scaled (based on " +"Auto insert keys when objects are translated, rotated or scaled (based on " "mask).\n" "Keys are only added to existing tracks, no new tracks will be created.\n" "Keys must be inserted manually for the first time." @@ -5515,12 +5472,11 @@ msgstr "" "размер изменён (завиÑит от маÑки).\n" "Ключи добавлÑÑŽÑ‚ÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ в ÑущеÑтвующие дорожки, новые дорожки не будут " "Ñозданы.\n" -"Первые ключи должны быть добавлены вручную." +"Ð’ первый раз ключи должны быть добавлены вручную." #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Auto Insert Key" -msgstr "ÐвтоматичеÑки вÑтавлÑÑ‚ÑŒ ключ" +msgstr "ÐвтовÑтавка ключа" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Insert Key (Existing Tracks)" @@ -5570,7 +5526,6 @@ msgid "Error instancing scene from %s" msgstr "Ошибка Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ñцены из %s" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Change Default Type" msgstr "Изменить тип по умолчанию" @@ -5698,19 +5653,16 @@ msgid "Remove Point" msgstr "Удалить точку" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Left Linear" msgstr "Левый линейный" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Right Linear" msgstr "Правый линейный" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Load Preset" -msgstr "Загрузить заготовку" +msgstr "Загрузить преÑет" #: editor/plugins/curve_editor_plugin.cpp msgid "Remove Curve Point" @@ -5725,9 +5677,8 @@ msgid "Hold Shift to edit tangents individually" msgstr "Удерживайте Shift, чтобы изменить каÑательные индивидуально" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Right click to add point" -msgstr "ПКМ: Удалить точку" +msgstr "ПКМ: Добавить точку" #: editor/plugins/gi_probe_editor_plugin.cpp msgid "Bake GI Probe" @@ -6005,7 +5956,6 @@ msgid "Generation Time (sec):" msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ð¸ (Ñек):" #: editor/plugins/particles_editor_plugin.cpp -#, fuzzy msgid "The geometry's faces don't contain any area." msgstr "Грани данной геометрии не Ñодержат никакой облаÑти." @@ -6195,7 +6145,6 @@ msgid "Split Segment (in curve)" msgstr "Разделить Ñегмент (в кривой)" #: editor/plugins/physical_bone_plugin.cpp -#, fuzzy msgid "Move Joint" msgstr "Передвинуть ÑуÑтав" @@ -6468,9 +6417,8 @@ msgid "Error writing TextFile:" msgstr "Ошибка при запиÑи:" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Could not load file at:" -msgstr "Ðевозможно найти тайл:" +msgstr "Ðе удалоÑÑŒ загрузить файл:" #: editor/plugins/script_editor_plugin.cpp msgid "Error saving file!" @@ -6493,9 +6441,8 @@ msgid "Error Importing" msgstr "Ошибка Импорта" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "New Text File..." -msgstr "Создать текÑтовый файл..." +msgstr "Ðовый текÑтовый файл..." #: editor/plugins/script_editor_plugin.cpp msgid "Open File" @@ -6522,7 +6469,6 @@ msgid "Save Theme As..." msgstr "Сохранить тему как..." #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "%s Class Reference" msgstr "%s Справка по клаÑÑу" @@ -6537,18 +6483,16 @@ msgid "Find Previous" msgstr "Ðайти предыдущее" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Filter scripts" -msgstr "СвойÑтва фильтра" +msgstr "Фильтр Ñкриптов" #: editor/plugins/script_editor_plugin.cpp msgid "Toggle alphabetical sorting of the method list." msgstr "Включить Ñортировку по алфавиту в ÑпиÑке методов." #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Filter methods" -msgstr "Режим фильтра:" +msgstr "Фильтр методов" #: editor/plugins/script_editor_plugin.cpp msgid "Sort" @@ -6583,9 +6527,8 @@ msgid "Open..." msgstr "Открыть..." #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Reopen Closed Script" -msgstr "Открыть Ñкрипт" +msgstr "Открыть ранее закрытый Ñкрипт" #: editor/plugins/script_editor_plugin.cpp msgid "Save All" @@ -6666,18 +6609,16 @@ msgid "Debug with External Editor" msgstr "Отладка Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ внешнего редактора" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Open Godot online documentation." -msgstr "Открыть онлайн документацию Godot" +msgstr "Открыть онлайн-документацию Godot." #: editor/plugins/script_editor_plugin.cpp msgid "Request Docs" msgstr "Проблема" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Help improve the Godot documentation by giving feedback." -msgstr "Помогите улучшить документацию Godot, предоÑтавив обратную ÑвÑзь" +msgstr "Помогите улучшить документацию Godot, оÑтавьте Ñообщение об ошибке." #: editor/plugins/script_editor_plugin.cpp msgid "Search the reference documentation." @@ -6722,14 +6663,12 @@ msgid "Search Results" msgstr "Результаты поиÑка" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Clear Recent Scripts" -msgstr "ОчиÑтить поÑледние Ñцены" +msgstr "ОчиÑтить недавние Ñкрипты" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Connections to method:" -msgstr "ПриÑоединить к узлу:" +msgstr "ÐŸÐ¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ðº методу:" #: editor/plugins/script_text_editor.cpp editor/script_editor_debugger.cpp msgid "Source" @@ -6744,10 +6683,11 @@ msgid "Target" msgstr "Цель" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "" "Missing connected method '%s' for signal '%s' from node '%s' to node '%s'." -msgstr "Ðичего не подключено к входу \"%s\" узла \"%s\"." +msgstr "" +"ОтÑутÑтвует подключённый метод '%s' Ð´Ð»Ñ Ñигнала '%s' от узла '%s' к узлу " +"'%s'." #: editor/plugins/script_text_editor.cpp msgid "Line" @@ -6854,9 +6794,8 @@ msgid "Complete Symbol" msgstr "СпиÑок автозавершениÑ" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Evaluate Selection" -msgstr "МаÑштабировать выбранное" +msgstr "ВычиÑлить выделеннное" #: editor/plugins/script_text_editor.cpp msgid "Trim Trailing Whitespace" @@ -6883,9 +6822,8 @@ msgid "Contextual Help" msgstr "КонтекÑÑ‚Ð½Ð°Ñ Ñправка" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Toggle Bookmark" -msgstr "Переключить Ñвободный обзор" +msgstr "Переключить закладку" #: editor/plugins/script_text_editor.cpp msgid "Go to Next Bookmark" @@ -6925,13 +6863,12 @@ msgid "Go to Previous Breakpoint" msgstr "Перейти к предыдущей точке оÑтановки" #: editor/plugins/shader_editor_plugin.cpp -#, fuzzy msgid "" "This shader has been modified on on disk.\n" "What action should be taken?" msgstr "" -"Следующие файлы новее на диÑке.\n" -"Какие меры должны быть принÑÑ‚Ñ‹?:" +"Ðтот шейдер был изменён на диÑке.\n" +"Какое дейÑтвие должно быть предпринÑто?" #: editor/plugins/shader_editor_plugin.cpp msgid "Shader" @@ -6942,14 +6879,12 @@ msgid "This skeleton has no bones, create some children Bone2D nodes." msgstr "У Ñтого Ñкелета нет коÑтей, Ñоздайте дочерние Bone2D узлы." #: editor/plugins/skeleton_2d_editor_plugin.cpp -#, fuzzy msgid "Create Rest Pose from Bones" -msgstr "Создать Позу ÐŸÐ¾ÐºÐ¾Ñ Ð¸Ð· КоÑтей" +msgstr "Создать позу Ð¿Ð¾ÐºÐ¾Ñ Ð¸Ð· коÑтей" #: editor/plugins/skeleton_2d_editor_plugin.cpp -#, fuzzy msgid "Set Rest Pose to Bones" -msgstr "Задать Позу ÐŸÐ¾ÐºÐ¾Ñ ÐšÐ¾ÑÑ‚Ñм" +msgstr "Задать позу Ð¿Ð¾ÐºÐ¾Ñ ÐºÐ¾ÑÑ‚Ñм" #: editor/plugins/skeleton_2d_editor_plugin.cpp msgid "Skeleton2D" @@ -7225,12 +7160,10 @@ msgid "XForm Dialog" msgstr "XForm диалоговое окно" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Snap Nodes To Floor" -msgstr "ПодравнÑÑ‚ÑŒ Узел Ñ ÐŸÐ¾Ð»Ð¾Ð¼" +msgstr "ПривÑзать узлы к полу" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Couldn't find a solid floor to snap the selection to." msgstr "Ðе удалоÑÑŒ найти Ñплошной пол, к которому можно привÑзать выделение." @@ -7245,9 +7178,8 @@ msgstr "" "Alt+ПКМ: Выбор по ÑпиÑку" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Use Local Space" -msgstr "Режим локального проÑтранÑтва (%s)" +msgstr "ИÑпользовать локальное проÑтранÑтво" #: editor/plugins/spatial_editor_plugin.cpp msgid "Use Snap" @@ -7278,7 +7210,6 @@ msgid "Right View" msgstr "Вид Ñправа" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Switch Perspective/Orthogonal View" msgstr "Переключить перÑпективный/ортогональный вид" @@ -7304,7 +7235,6 @@ msgid "Transform" msgstr "Преобразование" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Snap Object to Floor" msgstr "ПривÑзать объект к полу" @@ -7350,9 +7280,8 @@ msgstr "Отображать Ñетку" #: editor/plugins/spatial_editor_plugin.cpp #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Settings..." -msgstr "ÐаÑтройки" +msgstr "ÐаÑтройки..." #: editor/plugins/spatial_editor_plugin.cpp msgid "Snap Settings" @@ -7419,9 +7348,8 @@ msgid "Nameless gizmo" msgstr "БезымÑÐ½Ð½Ð°Ñ ÑˆÑ‚ÑƒÐºÐ¾Ð²Ð¸Ð½Ð°" #: editor/plugins/sprite_editor_plugin.cpp -#, fuzzy msgid "Create Mesh2D" -msgstr "Создать 2D Mesh" +msgstr "Создать Mesh2D" #: editor/plugins/sprite_editor_plugin.cpp msgid "Create Polygon2D" @@ -7489,9 +7417,8 @@ msgid "Simplification: " msgstr "Упрощение: " #: editor/plugins/sprite_editor_plugin.cpp -#, fuzzy msgid "Shrink (Pixels): " -msgstr "РоÑÑ‚ (пикÑели): " +msgstr "Сжатие (пикÑели): " #: editor/plugins/sprite_editor_plugin.cpp msgid "Grow (Pixels): " @@ -7506,9 +7433,8 @@ msgid "Settings:" msgstr "Параметры:" #: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy msgid "No Frames Selected" -msgstr "Кадрировать выбранное" +msgstr "Ðе выбраны кадры" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Add %d Frame(s)" @@ -7543,9 +7469,8 @@ msgid "(empty)" msgstr "(пуÑто)" #: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy msgid "Move Frame" -msgstr "Ð’Ñтавить кадр" +msgstr "ПеремеÑтить кадр" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Animations:" @@ -7592,29 +7517,24 @@ msgid "Move (After)" msgstr "ПеремеÑтить (поÑле)" #: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy msgid "Select Frames" -msgstr "Стек" +msgstr "Выбрать кадры" #: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy msgid "Horizontal:" -msgstr "Отразить по горизонтали" +msgstr "Горизонтальные:" #: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy msgid "Vertical:" -msgstr "Вершины" +msgstr "Вертикальные:" #: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy msgid "Select/Clear All Frames" -msgstr "Выбрать вÑе" +msgstr "Выбрать/очиÑтить вÑе кадры" #: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy msgid "Create Frames from Sprite Sheet" -msgstr "Создать из Ñцены" +msgstr "Создать кадры из Ñпрайт-лиÑта" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "SpriteFrames" @@ -7682,9 +7602,8 @@ msgid "Remove All" msgstr "Удалить вÑе" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Edit Theme" -msgstr "Редактировать тему..." +msgstr "Редактировать тему" #: editor/plugins/theme_editor_plugin.cpp msgid "Theme editing menu." @@ -7711,23 +7630,20 @@ msgid "Create From Current Editor Theme" msgstr "Создать из текущей темы редактора" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Toggle Button" -msgstr "Кнопка мыши" +msgstr "Кнопка-переключатель" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Disabled Button" -msgstr "СреднÑÑ ÐºÐ½Ð¾Ð¿ÐºÐ° мыши" +msgstr "Ð—Ð°Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð½Ð°Ñ ÐºÐ½Ð¾Ð¿ÐºÐ°" #: editor/plugins/theme_editor_plugin.cpp msgid "Item" msgstr "Ðлемент" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Disabled Item" -msgstr "Отключено" +msgstr "Отключённый Ñлемент" #: editor/plugins/theme_editor_plugin.cpp msgid "Check Item" @@ -7754,14 +7670,12 @@ msgid "Submenu" msgstr "Подменю" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Subitem 1" -msgstr "Ðлемент" +msgstr "ПодÑлемент 1" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Subitem 2" -msgstr "Ðлемент" +msgstr "ПодÑлемент 2" #: editor/plugins/theme_editor_plugin.cpp msgid "Has" @@ -7772,9 +7686,8 @@ msgid "Many" msgstr "Много" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Disabled LineEdit" -msgstr "Отключено" +msgstr "Отключённое текÑтовое поле" #: editor/plugins/theme_editor_plugin.cpp msgid "Tab 1" @@ -7789,9 +7702,8 @@ msgid "Tab 3" msgstr "Вкладка 3" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Editable Item" -msgstr "Редактируемые потомки" +msgstr "Редактируемый Ñлемент" #: editor/plugins/theme_editor_plugin.cpp msgid "Subtree" @@ -7867,19 +7779,16 @@ msgid "Transpose" msgstr "ТранÑпонировать" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Disable Autotile" -msgstr "Ðвтотайлы" +msgstr "Отключить автотайлы" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Enable Priority" -msgstr "Редактировать приоритет тайла" +msgstr "Включить приоритет" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Filter tiles" -msgstr "ОтÑортировать файлы..." +msgstr "Фильтр тайлов" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Give a TileSet resource to this TileMap to use its tiles." @@ -7890,40 +7799,34 @@ msgid "Paint Tile" msgstr "РиÑовать тайл" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "" "Shift+LMB: Line Draw\n" "Shift+Ctrl+LMB: Rectangle Paint" msgstr "" -"Shift+RMB: ÐариÑовать линию\n" -"Shift+Ctrl+RMB: ÐариÑовать прÑмоугольник" +"Shift+ЛКМ: ÐариÑовать линию\n" +"Shift+Ctrl+ЛКМ: ÐариÑовать прÑмоугольник" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Pick Tile" msgstr "Выбрать тайл" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Rotate Left" msgstr "Повернуть влево" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Rotate Right" msgstr "Повернуть вправо" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Flip Horizontally" msgstr "Отразить по горизонтали" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Flip Vertically" msgstr "Отразить по вертикали" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Clear Transform" msgstr "ОчиÑтить преобразование" @@ -7960,44 +7863,36 @@ msgid "Select the previous shape, subtile, or Tile." msgstr "Выберите предыдущую форму, Ñлемент тайла или тайл." #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Region Mode" -msgstr "Режим запуÑка:" +msgstr "Режим региона" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Collision Mode" -msgstr "Режим Перехода" +msgstr "Режим ÑтолкновениÑ" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Occlusion Mode" -msgstr "Редактировать полигон перекрытиÑ" +msgstr "Режим перекрытиÑ" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Navigation Mode" -msgstr "Создать полиÑетку навигации" +msgstr "Режим навигации" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Bitmask Mode" -msgstr "Режим поворота" +msgstr "Режим битовой маÑки" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Priority Mode" -msgstr "Режим ÑкÑпортированиÑ:" +msgstr "Режим приоритета" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Icon Mode" -msgstr "Режим оÑмотра" +msgstr "Режим иконки" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Z Index Mode" -msgstr "Режим оÑмотра" +msgstr "Режим Z индекÑа" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Copy bitmask." @@ -8210,9 +8105,8 @@ msgid "TileSet" msgstr "Ðабор Тайлов" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "No VCS addons are available." -msgstr "Ð˜Ð¼Ñ Ñ€Ð¾Ð´Ð¸Ñ‚ÐµÐ»ÑŒÑкого узла, еÑли оно доÑтупно" +msgstr "Ðет доÑтупных VCS плагинов." #: editor/plugins/version_control_editor_plugin.cpp editor/rename_dialog.cpp msgid "Error" @@ -8243,14 +8137,12 @@ msgid "Initialize" msgstr "Инициализировать" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Staging area" msgstr "ОблаÑÑ‚ÑŒ коммита" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Detect new changes" -msgstr "Обнаружить новые изменениÑ" +msgstr "Проверить изменениÑ" #: editor/plugins/version_control_editor_plugin.cpp msgid "Changes" @@ -8258,15 +8150,15 @@ msgstr "ИзменениÑ" #: editor/plugins/version_control_editor_plugin.cpp msgid "Modified" -msgstr "Изменено" +msgstr "Изменён" #: editor/plugins/version_control_editor_plugin.cpp msgid "Renamed" -msgstr "Переименовано" +msgstr "Переименован" #: editor/plugins/version_control_editor_plugin.cpp msgid "Deleted" -msgstr "Удалено" +msgstr "Удалён" #: editor/plugins/version_control_editor_plugin.cpp #, fuzzy @@ -8274,23 +8166,20 @@ msgid "Typechange" msgstr "Изменить" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Stage Selected" -msgstr "Удалить выделенное" +msgstr "ИндекÑ. выбранные" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Stage All" -msgstr "Сохранить вÑÑ‘" +msgstr "ИндекÑ. вÑÑ‘" #: editor/plugins/version_control_editor_plugin.cpp msgid "Add a commit message" msgstr "Добавьте Ñообщение коммита" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Commit Changes" -msgstr "Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ÐºÐ¾Ð¼Ð¼Ð¸Ñ‚Ð°" +msgstr "Закоммитить изменениÑ" #: editor/plugins/version_control_editor_plugin.cpp #: modules/gdnative/gdnative_library_singleton_editor.cpp @@ -8316,9 +8205,8 @@ msgid "(GLES3 only)" msgstr "(только GLES3)" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Add Output" -msgstr "Добавить выход +" +msgstr "Добавить выход" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Scalar" @@ -8333,9 +8221,8 @@ msgid "Boolean" msgstr "ЛогичеÑкое" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Sampler" -msgstr "СÑмплы" +msgstr "СÑмплер" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Add input port" @@ -8346,24 +8233,20 @@ msgid "Add output port" msgstr "Добавить выходной порт" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Change input port type" -msgstr "Изменить тип по умолчанию" +msgstr "Изменить тип входного порта" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Change output port type" -msgstr "Изменить тип по умолчанию" +msgstr "Изменить тип выходного порта" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Change input port name" -msgstr "Изменить Ð¸Ð¼Ñ Ð²Ñ…Ð¾Ð´Ð°" +msgstr "Изменить Ð¸Ð¼Ñ Ð²Ñ…Ð¾Ð´Ð½Ð¾Ð³Ð¾ порта" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Change output port name" -msgstr "Изменить Ð¸Ð¼Ñ Ð²Ñ…Ð¾Ð´Ð°" +msgstr "Изменить Ð¸Ð¼Ñ Ð²Ñ‹Ñ…Ð¾Ð´Ð½Ð¾Ð³Ð¾ порта" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Remove input port" @@ -8374,14 +8257,12 @@ msgid "Remove output port" msgstr "Удалить выходной порт" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Set expression" -msgstr "Изменить выражение" +msgstr "Задать выражение" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Resize VisualShader node" -msgstr "Визуальный Шейдер" +msgstr "Изменить размеры узла визуального шейдера" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Set Uniform Name" @@ -8425,14 +8306,12 @@ msgid "Light" msgstr "Свет" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Show resulted shader code." -msgstr "Создать узел" +msgstr "Показать полученный код шейдера." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Create Shader Node" -msgstr "Создать узел" +msgstr "Создать узел шейдера" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Color function." @@ -8443,9 +8322,8 @@ msgid "Color operator." msgstr "Оператор цвета." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Grayscale function." -msgstr "Сделать функцию" +msgstr "Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ Ð¾Ñ‚Ñ‚ÐµÐ½ÐºÐ¾Ð² Ñерого." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Converts HSV vector to RGB equivalent." @@ -8456,12 +8334,10 @@ msgid "Converts RGB vector to HSV equivalent." msgstr "Конвертирует вектор RGB в HSV Ñквивалент." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Sepia function." -msgstr "Переименовать функцию" +msgstr "Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ Ñепии." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Burn operator." msgstr "Оператор выгораниÑ." @@ -8470,22 +8346,19 @@ msgid "Darken operator." msgstr "Оператор затемнениÑ." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Difference operator." msgstr "Оператор разницы." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Dodge operator." msgstr "Оператор выцветаниÑ." #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy -msgid "HardLight operator" -msgstr "Оператор жёÑткого Ñвета." +msgid "HardLight operator." +msgstr "Оператор жёÑткого Ñвета" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Lighten operator." msgstr "Оператор оÑветлениÑ." @@ -8494,22 +8367,18 @@ msgid "Overlay operator." msgstr "Оператор наложениÑ." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Screen operator." msgstr "Оператор Ñкрана." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "SoftLight operator." msgstr "Оператор мÑгкого Ñвета." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Color constant." msgstr "Ð¦Ð²ÐµÑ‚Ð¾Ð²Ð°Ñ ÐºÐ¾Ð½Ñтанта." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Color uniform." msgstr "Ð¦Ð²ÐµÑ‚Ð¾Ð²Ð°Ñ uniform." @@ -8530,7 +8399,6 @@ msgid "Greater Than or Equal (>=)" msgstr "Больше или равно (>=)" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "Returns an associated vector if the provided scalars are equal, greater or " "less." @@ -8539,14 +8407,12 @@ msgstr "" "меньше." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "Returns the boolean result of the comparison between INF and a scalar " "parameter." msgstr "Возвращает логичеÑкий результат ÑÑ€Ð°Ð²Ð½ÐµÐ½Ð¸Ñ INF и ÑкалÑрного параметра." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "Returns the boolean result of the comparison between NaN and a scalar " "parameter." @@ -8565,7 +8431,6 @@ msgid "Not Equal (!=)" msgstr "Ðе равно (!=)" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "Returns an associated vector if the provided boolean value is true or false." msgstr "" @@ -8573,7 +8438,6 @@ msgstr "" "true или false." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "Returns an associated scalar if the provided boolean value is true or false." msgstr "" @@ -8581,12 +8445,10 @@ msgstr "" "true или false." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the boolean result of the comparison between two parameters." msgstr "Возвращает логичеÑкий результат ÑÑ€Ð°Ð²Ð½ÐµÐ½Ð¸Ñ Ð´Ð²ÑƒÑ… параметров." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "Returns the boolean result of the comparison between INF (or NaN) and a " "scalar parameter." @@ -8595,12 +8457,10 @@ msgstr "" "параметра." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Boolean constant." msgstr "ЛогичеÑÐºÐ°Ñ ÐºÐ¾Ð½Ñтанта." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Boolean uniform." msgstr "ЛогичеÑÐºÐ°Ñ uniform." @@ -8609,16 +8469,14 @@ msgid "'%s' input parameter for all shader modes." msgstr "Входной параметр «%s» Ð´Ð»Ñ Ð²Ñех режимов шейдера." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Input parameter." -msgstr "ПривÑзка к родителю" +msgstr "Входной параметр." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "'%s' input parameter for vertex and fragment shader modes." msgstr "Входной параметр «%s» Ð´Ð»Ñ Ñ€ÐµÐ¶Ð¸Ð¼Ð¾Ð² вершинного и фрагментного шейдеров." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "'%s' input parameter for fragment and light shader modes." msgstr "" "Входной параметр «%s» Ð´Ð»Ñ Ñ€ÐµÐ¶Ð¸Ð¼Ð¾Ð² фрагментного шейдера и шейдера оÑвещениÑ." @@ -8718,7 +8576,6 @@ msgid "" msgstr "ВычиÑлÑет ближайшее целое чиÑло, большее или равное аргументу." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Constrains a value to lie between two further values." msgstr "Ограничивает значение лежать между Ð´Ð²ÑƒÐ¼Ñ Ð´Ñ€ÑƒÐ³Ð¸Ð¼Ð¸ значениÑми." @@ -8831,9 +8688,13 @@ msgid "" "'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 " "using Hermite polynomials." msgstr "" +"SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n" +"\n" +"Возвращает 0.0, еÑли 'x' меньше, чем 'edge0', и 1.0, еÑли x больше, чем " +"'edge1'. Ð’ оÑтальных ÑлучаÑÑ… возвращаемое значение интерполируетÑÑ " +"полиномами Ðрмита в промежутке от 0.0 до 1.0." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "Step function( scalar(edge), scalar(x) ).\n" "\n" @@ -8841,7 +8702,7 @@ msgid "" msgstr "" "Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ Ð¨Ð°Ð³( ÑкалÑÑ€(граница), ÑкалÑÑ€(Ñ…) ).\n" "\n" -"Возвращает 0.0, еÑли x меньше чем граница, иначе — 1.0." +"Возвращает 0.0, еÑли «x» меньше чем «граница», иначе — 1.0." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the tangent of the parameter." @@ -8852,7 +8713,6 @@ msgid "Returns the hyperbolic tangent of the parameter." msgstr "Возвращает гиперболичеÑкий Ñ‚Ð°Ð½Ð³ÐµÐ½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð°." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Finds the truncated value of the parameter." msgstr "Ðаходит уÑечённое до целого значение параметра." @@ -8869,7 +8729,6 @@ msgid "Multiplies scalar by scalar." msgstr "Умножает ÑкалÑÑ€ на ÑкалÑÑ€." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the remainder of the two scalars." msgstr "Возвращает оÑтаток от двух ÑкалÑров." @@ -8878,22 +8737,18 @@ msgid "Subtracts scalar from scalar." msgstr "Вычитает ÑкалÑÑ€ из ÑкалÑра." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Scalar constant." -msgstr "Изменить чиÑловую конÑтанту" +msgstr "СкалÑÑ€Ð½Ð°Ñ ÐºÐ¾Ð½Ñтанта." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Scalar uniform." -msgstr "Изменить чиÑловую единицу" +msgstr "СкалÑÑ€Ð½Ð°Ñ uniform." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Perform the cubic texture lookup." msgstr "ВыполнÑет поиÑк кубичеÑкой текÑтуры." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Perform the texture lookup." msgstr "ВыполнÑет поиÑк текÑтуры." @@ -8913,9 +8768,8 @@ msgid "2D texture uniform lookup with triplanar." msgstr "Изменить текÑтурную единицу" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Transform function." -msgstr "Окно преобразованиÑ..." +msgstr "Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -8937,18 +8791,16 @@ msgstr "" "Ñтолбцов — количеÑтву компонентов в «r»." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Composes transform from four vectors." msgstr "СоÑтавлÑет преобразование из четырёх векторов." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Decomposes transform to four vectors." msgstr "РаÑкладывает преобразование на четыре вектора." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Calculates the determinant of a transform." -msgstr "ВычиÑлÑет детерминант Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ (матрицы транÑформации)." +msgstr "ВычиÑлÑет детерминант преобразованиÑ." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Calculates the inverse of a transform." @@ -8967,24 +8819,20 @@ msgid "Multiplies vector by transform." msgstr "Умножает вектор на преобразование." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Transform constant." -msgstr "Преобразование прервано." +msgstr "Преобразование-конÑтанта." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Transform uniform." -msgstr "Преобразование прервано." +msgstr "Преобразование-uniform." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Vector function." -msgstr "Ðазначение функции." +msgstr "Ð’ÐµÐºÑ‚Ð¾Ñ€Ð½Ð°Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Vector operator." -msgstr "Изменить векторный оператор" +msgstr "Векторный оператор." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Composes vector from three scalars." @@ -9063,6 +8911,11 @@ msgid "" "'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 " "using Hermite polynomials." msgstr "" +"SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n" +"\n" +"Возвращает 0.0, еÑли 'x' меньше, чем 'edge0', и 1.0, еÑли 'x' больше, чем " +"'edge1'. Ð’ оÑтальных ÑлучаÑÑ… возвращаемое значение интерполируетÑÑ " +"полиномами Ðрмита в промежутке от 0.0 до 1.0." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -9072,6 +8925,11 @@ msgid "" "'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 " "using Hermite polynomials." msgstr "" +"SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n" +"\n" +"Возвращает 0.0, еÑли 'x' меньше, чем 'edge0', и 1.0, еÑли 'x' больше, чем " +"'edge1'. Ð’ оÑтальных ÑлучаÑÑ… возвращаемое значение интерполируетÑÑ " +"полиномами Ðрмита в промежутке от 0.0 до 1.0." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -9079,6 +8937,9 @@ msgid "" "\n" "Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0." msgstr "" +"Step function( vector(edge), vector(x) ).\n" +"\n" +"Возвращает 0.0, еÑли 'x' меньше, чем 'edge', и 1.0 в противном Ñлучае." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -9086,6 +8947,9 @@ msgid "" "\n" "Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0." msgstr "" +"Step function( scalar(edge), vector(x) ).\n" +"\n" +"Возвращает 0.0, еÑли 'x' меньше, чем 'edge', и 1.0 в противном Ñлучае." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Adds vector to vector." @@ -9108,14 +8972,12 @@ msgid "Subtracts vector from vector." msgstr "Вычитает вектор из вектора." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Vector constant." -msgstr "Изменить векторную конÑтанту" +msgstr "Векторную конÑтанта." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Vector uniform." -msgstr "Ðазначить форму." +msgstr "Ð’ÐµÐºÑ‚Ð¾Ñ€Ð½Ð°Ñ uniform." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -9134,15 +8996,17 @@ msgid "" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy msgid "" -"Custom Godot Shader Language expression, which placed on top of the resulted " -"shader. You can place various function definitions inside and call it later " -"in the Expressions. You can also declare varyings, uniforms and constants." +"Custom Godot Shader Language expression, which is placed on top of the " +"resulted shader. You can place various function definitions inside and call " +"it later in the Expressions. You can also declare varyings, uniforms and " +"constants." msgstr "" -"ПользовательÑкое выражение Ñзыка шейдеров Godot, которое помещаетÑÑ Ð² " -"верхней чаÑти шейдера. Ð’Ñ‹ можете размеÑтить внутри различные объÑÐ²Ð»ÐµÐ½Ð¸Ñ " -"функций и вызвать их позже в ВыражениÑÑ…. Ð’Ñ‹ также можете объÑвить varyings, " -"uniforms и конÑтанты." +"ПользовательÑкое выражение Ñзыка шейдеров Godot, которое помещаетÑÑ Ð¿Ð¾Ð²ÐµÑ€Ñ… " +"шейдера. Ð’Ñ‹ можете размеÑтить внутри различные объÑÐ²Ð»ÐµÐ½Ð¸Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¹ и вызвать " +"их позже в ВыражениÑÑ…. Ð’Ñ‹ также можете объÑвить varyings, uniforms и " +"конÑтанты." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "(Fragment/Light mode only) Scalar derivative function." @@ -9153,7 +9017,6 @@ msgid "(Fragment/Light mode only) Vector derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "(Fragment/Light mode only) (Vector) Derivative in 'x' using local " "differencing." @@ -9162,7 +9025,6 @@ msgstr "" "локального дифференцированиÑ." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "(Fragment/Light mode only) (Scalar) Derivative in 'x' using local " "differencing." @@ -9171,7 +9033,6 @@ msgstr "" "локального дифференцированиÑ." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "(Fragment/Light mode only) (Vector) Derivative in 'y' using local " "differencing." @@ -9180,7 +9041,6 @@ msgstr "" "локального дифференцированиÑ." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "(Fragment/Light mode only) (Scalar) Derivative in 'y' using local " "differencing." @@ -9189,7 +9049,6 @@ msgstr "" "локального дифференцированиÑ." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and " "'y'." @@ -9198,7 +9057,6 @@ msgstr "" "производных по «x» и «y»." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and " "'y'." @@ -9211,12 +9069,10 @@ msgid "VisualShader" msgstr "Визуальный Шейдер" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Edit Visual Property" msgstr "Редактировать Визуальное СвойÑтво" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Visual Shader Mode Changed" msgstr "Режим Визуального Шейдера был изменен" @@ -9246,7 +9102,7 @@ msgid "" "This might be due to a configuration issue in the export preset or your " "export settings." msgstr "" -"Ðе удалоÑÑŒ ÑкÑпортировать проект Ð´Ð»Ñ Ð¿Ð»Ð°Ñ‚Ñ„Ð¾Ñ€Ð¼Ñ‹ '%s'.\n" +"Ðе удалоÑÑŒ ÑкÑпортировать проект Ð´Ð»Ñ Ð¿Ð»Ð°Ñ‚Ñ„Ð¾Ñ€Ð¼Ñ‹ «%s».\n" "Ðто может быть ÑвÑзано Ñ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼Ð¾Ð¹ конфигурации в предуÑтановке ÑкÑпорта или " "наÑтройках ÑкÑпорта." @@ -9259,7 +9115,6 @@ msgid "Exporting All" msgstr "ÐкÑпорт вÑех" #: editor/project_export.cpp -#, fuzzy msgid "The given export path doesn't exist:" msgstr "Данный путь ÑкÑпорта не ÑущеÑтвует:" @@ -9276,6 +9131,12 @@ msgid "Add..." msgstr "Добавить..." #: editor/project_export.cpp +msgid "" +"If checked, the preset will be available for use in one-click deploy.\n" +"Only one preset per platform may be marked as runnable." +msgstr "" + +#: editor/project_export.cpp msgid "Export Path" msgstr "Путь ÑкÑпорта" @@ -9304,20 +9165,20 @@ msgid "Resources to export:" msgstr "РеÑурÑÑ‹ Ð´Ð»Ñ ÑкÑпорта:" #: editor/project_export.cpp -#, fuzzy msgid "" "Filters to export non-resource files/folders\n" "(comma-separated, e.g: *.json, *.txt, docs/*)" msgstr "" -"Фильтр Ð´Ð»Ñ ÑкÑпорта не реÑурÑных файлов (через запÑтую, например: *.json, *." -"txt)" +"Фильтры Ð´Ð»Ñ ÑкÑпорта нереÑурÑных файлов/папок\n" +"(через запÑтую, например: *.json, *.txt, docs/*)" #: editor/project_export.cpp -#, fuzzy msgid "" "Filters to exclude files/folders from project\n" "(comma-separated, e.g: *.json, *.txt, docs/*)" -msgstr "Фильтр Ð´Ð»Ñ Ð¸ÑÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ (через запÑтую, например: *.json, *.txt)" +msgstr "" +"Фильтры Ð´Ð»Ñ Ð¸ÑÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð²/папок из проекта\n" +"(через запÑтую, например: *.json, *.txt, docs/*)" #: editor/project_export.cpp msgid "Patches" @@ -9548,9 +9409,8 @@ msgid "Unnamed Project" msgstr "БезымÑнный проект" #: editor/project_manager.cpp -#, fuzzy msgid "Missing Project" -msgstr "Импортировать ÑущеÑтвующий проект" +msgstr "ОтÑутÑтвующий проект" #: editor/project_manager.cpp msgid "Error: Project is missing on the filesystem." @@ -9558,14 +9418,13 @@ msgstr "Ошибка: Проект отÑутÑтвует в файловой Ñ #: editor/project_manager.cpp msgid "Can't open project at '%s'." -msgstr "ÐÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚ÑŒ проект в \"%s\"." +msgstr "Ðе удаётÑÑ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚ÑŒ проект в \"%s\"." #: editor/project_manager.cpp msgid "Are you sure to open more than one project?" msgstr "Ð’Ñ‹ уверены, что хотите открыть более одного проекта?" #: editor/project_manager.cpp -#, fuzzy msgid "" "The following project settings file does not specify the version of Godot " "through which it was created.\n" @@ -9577,8 +9436,8 @@ msgid "" "Warning: You won't be able to open the project with previous versions of the " "engine anymore." msgstr "" -"Файл наÑтроек проекта не указывает верÑию верÑии движка, на котором он был " -"Ñгенерирован:\n" +"Ð’ Ñледующем файле наÑтроек проекта не указана верÑÐ¸Ñ Godot, в которой данный " +"проект был Ñоздан.\n" "\n" "%s\n" "\n" @@ -9587,7 +9446,6 @@ msgstr "" "Внимание: Ð’Ñ‹ больше не Ñможете открыть проект предыдущими верÑиÑми движка." #: editor/project_manager.cpp -#, fuzzy msgid "" "The following project settings file was generated by an older engine " "version, and needs to be converted for this version:\n" @@ -9615,58 +9473,59 @@ msgstr "" "неÑовмеÑтимы Ñ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ¹ верÑией." #: editor/project_manager.cpp -#, fuzzy msgid "" "Can't run project: no main scene defined.\n" "Please edit the project and set the main scene in the Project Settings under " "the \"Application\" category." msgstr "" -"Ðе могу запуÑтить проект: не назначена Ð³Ð»Ð°Ð²Ð½Ð°Ñ Ñцена.\n" -"ПожалуйÑта, отредактируйте проект и уÑтановите главную Ñцену в «ÐаÑтройки " -"проекта» в категории «Приложение»." +"Ðевозможно запуÑтить проект: не назначена Ð³Ð»Ð°Ð²Ð½Ð°Ñ Ñцена.\n" +"ПожалуйÑта, отредактируйте проект и уÑтановите главную Ñцену в ÐаÑтройках " +"проекта в категории Application." #: editor/project_manager.cpp msgid "" "Can't run project: Assets need to be imported.\n" "Please edit the project to trigger the initial import." msgstr "" -"Ðе могу запуÑтить проект: аÑÑеты должны быть импортированы.\n" -"ПожалуйÑта, отредактируйте проект, Ñто инициирует начальный импорт." +"Ðевозможно запуÑтить проект: реÑурÑÑ‹ должны быть импортированы.\n" +"ПожалуйÑта, откройте проект Ð´Ð»Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ, Ñто Ñпровоцирует начальный " +"импорт." #: editor/project_manager.cpp -#, fuzzy msgid "Are you sure to run %d projects at once?" -msgstr "Ð’Ñ‹ уверены, что хотите запуÑтить более одного проекта?" +msgstr "Ð’Ñ‹ уверены, что хотите запуÑтить %d проектов одновременно?" #: editor/project_manager.cpp -#, fuzzy msgid "" "Remove %d projects from the list?\n" "The project folders' contents won't be modified." -msgstr "Удалить проект из ÑпиÑка? (Содержимое папки не будет изменено)" +msgstr "" +"Удалить %d проектов из ÑпиÑка?\n" +"Содержимое папок проектов не будет изменено." #: editor/project_manager.cpp -#, fuzzy msgid "" "Remove this project from the list?\n" "The project folder's contents won't be modified." -msgstr "Удалить проект из ÑпиÑка? (Содержимое папки не будет изменено)" +msgstr "" +"Удалить данный проект из ÑпиÑка?\n" +"Содержимое папки проекта не будет изменено." #: editor/project_manager.cpp -#, fuzzy msgid "" "Remove all missing projects from the list?\n" "The project folders' contents won't be modified." -msgstr "Удалить проект из ÑпиÑка? (Содержимое папки не будет изменено)" +msgstr "" +"Удалить вÑе отÑутÑтвующие проекты из ÑпиÑка?\n" +"Содержимое папок проектов не будет изменено." #: editor/project_manager.cpp -#, fuzzy msgid "" "Language changed.\n" "The interface will update after restarting the editor or project manager." msgstr "" -"Язык изменилÑÑ.\n" -"ПользовательÑкий Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð±ÑƒÐ´ÐµÑ‚ обновлен при Ñледующем запуÑке редактора." +"Язык изменён.\n" +"Ð˜Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð¾Ð±Ð½Ð¾Ð²Ð¸Ñ‚ÑÑ Ð¿Ð¾Ñле перезапуÑка редактора или менеджера проектов." #: editor/project_manager.cpp msgid "" @@ -9681,9 +9540,8 @@ msgid "Project Manager" msgstr "Менеджер проектов" #: editor/project_manager.cpp -#, fuzzy msgid "Projects" -msgstr "Проект" +msgstr "Проекты" #: editor/project_manager.cpp msgid "Scan" @@ -9698,9 +9556,8 @@ msgid "New Project" msgstr "Ðовый проект" #: editor/project_manager.cpp -#, fuzzy msgid "Remove Missing" -msgstr "Удалить точку" +msgstr "Удалить отÑутÑтвующие" #: editor/project_manager.cpp msgid "Templates" @@ -9715,13 +9572,12 @@ msgid "Can't run project" msgstr "Ðе удаётÑÑ Ð·Ð°Ð¿ÑƒÑтить проект" #: editor/project_manager.cpp -#, fuzzy msgid "" "You currently don't have any projects.\n" "Would you like to explore official example projects in the Asset Library?" msgstr "" -"Ð’ наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ñƒ Ð²Ð°Ñ Ð½ÐµÑ‚ каких-либо проектов.\n" -"Хотите изучить официальные примеры в библиотеке шаблонов?" +"Ð’ наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ñƒ Ð²Ð°Ñ Ð½ÐµÑ‚ никаких проектов.\n" +"Хотите изучить официальные примеры в Библиотеке реÑурÑов?" #: editor/project_settings_editor.cpp msgid "Key " @@ -9772,18 +9628,6 @@ msgid "Device" msgstr "УÑтройÑтво" #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Shift+" -msgstr "Shift+" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Alt+" -msgstr "Alt+" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Control+" -msgstr "Control+" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "Press a Key..." msgstr "Ðажмите любую клавишу..." @@ -10022,24 +9866,23 @@ msgstr "РеÑурÑÑ‹:" #: editor/project_settings_editor.cpp msgid "Remaps by Locale:" -msgstr "Заменить на Ñзык:" +msgstr "Переназначить в локали:" #: editor/project_settings_editor.cpp msgid "Locale" -msgstr "Язык" +msgstr "Локаль" #: editor/project_settings_editor.cpp msgid "Locales Filter" -msgstr "Фильтры локализации" +msgstr "Фильтр локалей" #: editor/project_settings_editor.cpp msgid "Show All Locales" -msgstr "Показать вÑе Ñзыки" +msgstr "Показать вÑе локали" #: editor/project_settings_editor.cpp -#, fuzzy msgid "Show Selected Locales Only" -msgstr "Показать только выбранные Ñзыки" +msgstr "Показать только выбранные локали" #: editor/project_settings_editor.cpp msgid "Filter mode:" @@ -10047,7 +9890,7 @@ msgstr "Режим фильтра:" #: editor/project_settings_editor.cpp msgid "Locales:" -msgstr "Языки:" +msgstr "Локали:" #: editor/project_settings_editor.cpp msgid "AutoLoad" @@ -10126,7 +9969,6 @@ msgid "Suffix" msgstr "СуффикÑ" #: editor/rename_dialog.cpp -#, fuzzy msgid "Advanced Options" msgstr "Дополнительные параметры" @@ -10329,30 +10171,27 @@ msgstr "Узел должен принадлежать редактируемоР#: editor/scene_tree_dock.cpp msgid "Instantiated scenes can't become root" -msgstr "Мгновенные Ñцены не могут быть корневыми" +msgstr "ИнÑтанцированные Ñцены не могут Ñтать корневыми" #: editor/scene_tree_dock.cpp msgid "Make node as Root" msgstr "Сделать узел корневым" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Delete %d nodes?" -msgstr "Удалить узлы" +msgstr "Удалить %d узлов?" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Delete the root node \"%s\"?" -msgstr "Удалить узел(Ñ‹) графа шейдера" +msgstr "Удалить корневой узел «%s»?" #: editor/scene_tree_dock.cpp msgid "Delete node \"%s\" and its children?" msgstr "Удалить узел «%s» и его дочерние Ñлементы?" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Delete node \"%s\"?" -msgstr "Удалить узлы" +msgstr "Удалить узел «%s»?" #: editor/scene_tree_dock.cpp msgid "Can not perform with the root node." @@ -10375,22 +10214,21 @@ msgstr "" "узла будут возвращены к значениÑм по умолчанию." #: editor/scene_tree_dock.cpp -#, fuzzy msgid "" "Enabling \"Load As Placeholder\" will disable \"Editable Children\" and " "cause all properties of the node to be reverted to their default." msgstr "" -"Отключение параметра \"editable_instance\" приведет к тому, что вÑе ÑвойÑтва " -"узла будут возвращены к значениÑм по умолчанию." +"Включение опции «Загрузить как заполнитель» отключит опцию «Редактируемые " +"потомки» и приведет к тому, что вÑе ÑвойÑтва узла будут возвращены к " +"значениÑм по умолчанию." #: editor/scene_tree_dock.cpp msgid "Make Local" msgstr "Сделать локальным" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "New Scene Root" -msgstr "Ðовый Корневой Узел Сцены" +msgstr "Ðовый корень Ñцены" #: editor/scene_tree_dock.cpp msgid "Create Root Node:" @@ -10429,9 +10267,8 @@ msgid "Remove Node(s)" msgstr "Удалить узел(узлы)" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Change type of node(s)" -msgstr "Изменить Ð¸Ð¼Ñ Ð²Ñ…Ð¾Ð´Ð°" +msgstr "Изменить тип узла(ов)" #: editor/scene_tree_dock.cpp msgid "" @@ -10482,9 +10319,8 @@ msgid "Change Type" msgstr "Изменить тип" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Reparent to New Node" -msgstr "Переподчинить узел" +msgstr "Переподчинить на новый узел" #: editor/scene_tree_dock.cpp msgid "Make Scene Root" @@ -10507,9 +10343,8 @@ msgid "Delete (No Confirm)" msgstr "Удалить (без подтверждениÑ)" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Add/Create a New Node." -msgstr "Добавить/Ñоздать новый узел" +msgstr "Добавить/Ñоздать новый узел." #: editor/scene_tree_dock.cpp msgid "" @@ -10544,55 +10379,48 @@ msgid "Toggle Visible" msgstr "Переключить видимоÑÑ‚ÑŒ" #: editor/scene_tree_editor.cpp -#, fuzzy msgid "Unlock Node" -msgstr "Выбрать узел" +msgstr "Разблокировать узел" #: editor/scene_tree_editor.cpp -#, fuzzy msgid "Button Group" -msgstr "Кнопка 7" +msgstr "Группа кнопок" #: editor/scene_tree_editor.cpp -#, fuzzy msgid "(Connecting From)" -msgstr "Ошибка подключениÑ" +msgstr "(Подключение от)" #: editor/scene_tree_editor.cpp msgid "Node configuration warning:" msgstr "Конфигурации узла, предупреждение:" #: editor/scene_tree_editor.cpp -#, fuzzy msgid "" "Node has %s connection(s) and %s group(s).\n" "Click to show signals dock." msgstr "" -"Узел Ñодержит ÑвÑзи и группы\n" +"Узел имеет %s ÑвÑзей и %s групп.\n" "Ðажмите, чтобы показать панель Ñигналов." #: editor/scene_tree_editor.cpp -#, fuzzy msgid "" "Node has %s connection(s).\n" "Click to show signals dock." msgstr "" -"Узел Ñодержит ÑвÑзи.\n" +"Узел Ñодержит %s ÑвÑзей.\n" "Ðажмите, чтобы показать панель Ñигналов." #: editor/scene_tree_editor.cpp -#, fuzzy msgid "" "Node is in %s group(s).\n" "Click to show groups dock." msgstr "" -"Узел принадлежит к группе.\n" +"Узел находитÑÑ Ð² %s группе(ах).\n" "Ðажмите, чтобы показать панель групп." #: editor/scene_tree_editor.cpp -#, fuzzy msgid "Open Script:" -msgstr "Открыть Ñкрипт" +msgstr "Открыть Ñкрипт:" #: editor/scene_tree_editor.cpp msgid "" @@ -10643,39 +10471,32 @@ msgid "Select a Node" msgstr "Выбрать узел" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Path is empty." -msgstr "Ðе указан путь" +msgstr "Ðе указан путь." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Filename is empty." -msgstr "ПуÑтое Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°" +msgstr "ПуÑтое Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Path is not local." -msgstr "Путь не локальный" +msgstr "Путь не локальный." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Invalid base path." -msgstr "ÐедопуÑтимый базовый путь" +msgstr "ÐедопуÑтимый базовый путь." #: editor/script_create_dialog.cpp -#, fuzzy msgid "A directory with the same name exists." -msgstr "Каталог Ñ Ñ‚Ð°ÐºÐ¸Ð¼ же именем ÑущеÑтвует" +msgstr "Каталог Ñ Ñ‚Ð°ÐºÐ¸Ð¼ же именем ÑущеÑтвует." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Invalid extension." -msgstr "ÐедопуÑтимое раÑширение" +msgstr "ÐедопуÑтимое раÑширение." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Wrong extension chosen." -msgstr "Выбрано неверное раÑширение" +msgstr "Выбрано неверное раÑширение." #: editor/script_create_dialog.cpp msgid "Error loading template '%s'" @@ -10699,68 +10520,56 @@ msgid "N/A" msgstr "Ð/Д" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Open Script / Choose Location" -msgstr "Открыть Скрипт/Выбрать МеÑто" +msgstr "Открыть Скрипт / Выбрать МеÑто" #: editor/script_create_dialog.cpp msgid "Open Script" msgstr "Открыть Ñкрипт" #: editor/script_create_dialog.cpp -#, fuzzy msgid "File exists, it will be reused." -msgstr "Файл ÑущеÑтвует, будет иÑпользован повторно" +msgstr "Файл ÑущеÑтвует, будет иÑпользован повторно." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Invalid class name." -msgstr "ÐедопуÑтимое Ð¸Ð¼Ñ ÐºÐ»Ð°ÑÑа" +msgstr "ÐедопуÑтимое Ð¸Ð¼Ñ ÐºÐ»Ð°ÑÑа." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Invalid inherited parent name or path." -msgstr "Ðеверное Ð¸Ð¼Ñ Ð¸Ð»Ð¸ путь наÑледуемого предка" +msgstr "Ðеверное Ð¸Ð¼Ñ Ð¸Ð»Ð¸ путь наÑледуемого предка." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Script is valid." -msgstr "Скрипт корректен" +msgstr "Скрипт корректен." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Allowed: a-z, A-Z, 0-9, _ and ." -msgstr "ДопуÑкаютÑÑ: a-z, A-Z, 0-9 и _" +msgstr "ДопуÑкаютÑÑ: a-z, A-Z, 0-9, _ и ." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Built-in script (into scene file)." -msgstr "Ð’Ñтроенный Ñкрипт (в файл Ñцены)" +msgstr "Ð’Ñтроенный Ñкрипт (в файл Ñцены)." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Will create a new script file." -msgstr "Создать новый Ñкрипт" +msgstr "Будет Ñоздан новый файл Ñкрипта." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Will load an existing script file." -msgstr "Загрузить ÑущеÑтвующий Ñкрипт" +msgstr "Будет загружен ÑущеÑтвующий Ñкрипт." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Class Name:" -msgstr "Ð˜Ð¼Ñ ÐšÐ»Ð°ÑÑа" +msgstr "Ð˜Ð¼Ñ ÐºÐ»Ð°ÑÑа:" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Template:" -msgstr "Шаблон" +msgstr "Шаблон:" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Built-in Script:" -msgstr "Ð’Ñтроенный Скрипт" +msgstr "Ð’Ñтроенный Ñкрипт:" #: editor/script_create_dialog.cpp msgid "Attach Node Script" @@ -10775,38 +10584,32 @@ msgid "Bytes:" msgstr "Байты:" #: editor/script_editor_debugger.cpp -#, fuzzy msgid "Warning:" -msgstr "ПредупреждениÑ:" +msgstr "Предупреждение:" #: editor/script_editor_debugger.cpp msgid "Error:" msgstr "Ошибка:" #: editor/script_editor_debugger.cpp -#, fuzzy msgid "C++ Error" -msgstr "Копировать ошибку" +msgstr "Ошибка C++" #: editor/script_editor_debugger.cpp -#, fuzzy msgid "C++ Error:" -msgstr "Ошибка:" +msgstr "Ошибка C++:" #: editor/script_editor_debugger.cpp -#, fuzzy msgid "C++ Source" -msgstr "ИÑточник" +msgstr "ИÑходный код C++" #: editor/script_editor_debugger.cpp -#, fuzzy msgid "Source:" -msgstr "ИÑточник" +msgstr "ИÑходный код:" #: editor/script_editor_debugger.cpp -#, fuzzy msgid "C++ Source:" -msgstr "ИÑточник" +msgstr "ИÑходный код C++:" #: editor/script_editor_debugger.cpp msgid "Stack Trace" @@ -10817,18 +10620,16 @@ msgid "Errors" msgstr "Ошибки" #: editor/script_editor_debugger.cpp -#, fuzzy msgid "Child process connected." -msgstr "Дочерний процеÑÑ ÑвÑзан" +msgstr "Дочерний процеÑÑ ÑвÑзан." #: editor/script_editor_debugger.cpp msgid "Copy Error" msgstr "Копировать ошибку" #: editor/script_editor_debugger.cpp -#, fuzzy msgid "Skip Breakpoints" -msgstr "Точки оÑтанова" +msgstr "ПропуÑтить точки оÑтанова" #: editor/script_editor_debugger.cpp msgid "Inspect Previous Instance" @@ -10847,9 +10648,8 @@ msgid "Profiler" msgstr "Профайлер" #: editor/script_editor_debugger.cpp -#, fuzzy msgid "Network Profiler" -msgstr "ÐкÑпортировать проект" +msgstr "Сетевой профайлер" #: editor/script_editor_debugger.cpp msgid "Monitor" @@ -11143,12 +10943,12 @@ msgstr "Удалить выделенную Ñетку" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "GridMap Fill Selection" -msgstr "Злить выделенную GridMap" +msgstr "Залить выделенную GridMap" #: modules/gridmap/grid_map_editor_plugin.cpp #, fuzzy msgid "GridMap Paste Selection" -msgstr "Удалить выделенную Ñетку" +msgstr "Ð’Ñтавить выделенную Ñетку" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "GridMap Paint" @@ -11233,7 +11033,7 @@ msgstr "РаÑÑтоÑние выбора:" #: modules/gridmap/grid_map_editor_plugin.cpp #, fuzzy msgid "Filter meshes" -msgstr "Режим фильтра:" +msgstr "Фильтр полиÑеток" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Give a MeshLibrary resource to this GridMap to use its meshes." @@ -11365,32 +11165,28 @@ msgid "Set Variable Type" msgstr "УÑтановить тип переменной" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Override an existing built-in function." -msgstr "Ðе должно конфликтовать Ñ ÑущеÑтвующим вÑтроенным именем типа." +msgstr "Переопределить ÑущеÑтвующую вÑтроенную функцию." #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Create a new function." -msgstr "Создать новый прÑмоугольник." +msgstr "Создать новую функцию." #: modules/visual_script/visual_script_editor.cpp msgid "Variables:" msgstr "Переменные:" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Create a new variable." -msgstr "Создать новый прÑмоугольник." +msgstr "Создать новую переменную." #: modules/visual_script/visual_script_editor.cpp msgid "Signals:" msgstr "Сигналы:" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Create a new signal." -msgstr "Создать новый полигон." +msgstr "Создать новый Ñигнал." #: modules/visual_script/visual_script_editor.cpp msgid "Name is not a valid identifier:" @@ -11417,7 +11213,6 @@ msgid "Add Function" msgstr "Добавить функцию" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Delete input port" msgstr "Удалить входной порт" @@ -11430,22 +11225,18 @@ msgid "Add Signal" msgstr "Добавить Ñигнал" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Add Input Port" msgstr "Добавить входной порт" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Add Output Port" msgstr "Добавить выходной порт" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Remove Input Port" msgstr "Удалить входной порт" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Remove Output Port" msgstr "Удалить выходной порт" @@ -11509,11 +11300,11 @@ msgstr "" #: modules/visual_script/visual_script_editor.cpp msgid "Add Getter Property" -msgstr "Добавить получающее ÑвойÑтво" +msgstr "Добавить геттер" #: modules/visual_script/visual_script_editor.cpp msgid "Add Setter Property" -msgstr "Добавить уÑтанавливающее ÑвойÑтво" +msgstr "Добавить Ñеттер" #: modules/visual_script/visual_script_editor.cpp msgid "Change Base Type" @@ -11532,9 +11323,8 @@ msgid "Connect Nodes" msgstr "ПриÑоединить узлы" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Disconnect Nodes" -msgstr "Разъединить узлы графа" +msgstr "Разъединить узлы" #: modules/visual_script/visual_script_editor.cpp msgid "Connect Node Data" @@ -11574,21 +11364,23 @@ msgid "Can't create function with a function node." msgstr "Ðе удаётÑÑ Ñкопировать узел функцию." #: modules/visual_script/visual_script_editor.cpp +#, fuzzy msgid "Can't create function of nodes from nodes of multiple functions." msgstr "" +"Ðевозможно Ñоздать функцию из узлов, принадлежащим неÑкольким функциÑм." #: modules/visual_script/visual_script_editor.cpp -msgid "Select atleast one node with sequence port." -msgstr "" +#, fuzzy +msgid "Select at least one node with sequence port." +msgstr "Выберите по крайней мере один узел Ñ Ð¿Ð¾Ñледовательным портом." #: modules/visual_script/visual_script_editor.cpp msgid "Try to only have one sequence input in selection." msgstr "" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Create Function" -msgstr "Переименовать функцию" +msgstr "Создать функцию" #: modules/visual_script/visual_script_editor.cpp msgid "Remove Function" @@ -11613,7 +11405,7 @@ msgstr "Редактирование Ñигнала:" #: modules/visual_script/visual_script_editor.cpp #, fuzzy msgid "Make Tool:" -msgstr "Сделать локальным" +msgstr "Сделать инÑтрумент:" #: modules/visual_script/visual_script_editor.cpp msgid "Members:" @@ -11622,12 +11414,11 @@ msgstr "СвойÑтва:" #: modules/visual_script/visual_script_editor.cpp #, fuzzy msgid "function_name" -msgstr "ФункциÑ:" +msgstr "имÑ_функции" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Select or create a function to edit its graph." -msgstr "Выберите или Ñоздайте функцию Ð´Ð»Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð³Ñ€Ð°Ñ„Ð°" +msgstr "Выберите или Ñоздайте функцию Ð´Ð»Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð³Ñ€Ð°Ñ„Ð°." #: modules/visual_script/visual_script_editor.cpp msgid "Delete Selected" @@ -11646,14 +11437,12 @@ msgid "Cut Nodes" msgstr "Вырезать узлы" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Make Function" -msgstr "Переименовать функцию" +msgstr "Сделать функцию" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Refresh Graph" -msgstr "Обновить" +msgstr "Обновить граф" #: modules/visual_script/visual_script_editor.cpp msgid "Edit Member" @@ -11783,13 +11572,11 @@ msgstr "" "редактора." #: platform/android/export/export.cpp -#, fuzzy msgid "" "Android build template not installed in the project. Install it from the " "Project menu." msgstr "" -"Шаблон Ñборки Android отÑутÑтвует, пожалуйÑта, уÑтановите ÑоответÑтвующие " -"шаблоны." +"Шаблон Ñборки Android не уÑтановлен в проекте. УÑтановите его в меню проекта." #: platform/android/export/export.cpp msgid "Invalid public key for APK expansion." @@ -11876,7 +11663,7 @@ msgstr "Требуемый значок не указан в предуÑтанР#: platform/javascript/export/export.cpp msgid "Stop HTTP Server" -msgstr "" +msgstr "ОÑтановить HTTP-Ñервер" #: platform/javascript/export/export.cpp msgid "Run in Browser" @@ -11911,10 +11698,20 @@ msgid "Using default boot splash image." msgstr "ИÑпользовать Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð·Ð°Ñтавки по умолчанию." #: platform/uwp/export/export.cpp +#, fuzzy +msgid "Invalid package short name." +msgstr "ÐедопуÑтимое Ð¸Ð¼Ñ Ð¿Ð°ÐºÐµÑ‚Ð°:" + +#: platform/uwp/export/export.cpp msgid "Invalid package unique name." msgstr "Ðеверное уникальное Ð¸Ð¼Ñ Ð¿Ð°ÐºÐµÑ‚Ð°." #: platform/uwp/export/export.cpp +#, fuzzy +msgid "Invalid package publisher display name." +msgstr "Ðеверное уникальное Ð¸Ð¼Ñ Ð¿Ð°ÐºÐµÑ‚Ð°." + +#: platform/uwp/export/export.cpp msgid "Invalid product GUID." msgstr "Ðеверный GUID продукта." @@ -12154,42 +11951,36 @@ msgstr "" "редактируемой Ñцены, как прÑмого родителÑ." #: scene/3d/arvr_nodes.cpp -#, fuzzy msgid "ARVRCamera must have an ARVROrigin node as its parent." -msgstr "ARVRCamera должна иметь узел ARVROrigin в качеÑтве предка" +msgstr "ARVRCamera должна иметь узел ARVROrigin в качеÑтве предка." #: scene/3d/arvr_nodes.cpp -#, fuzzy msgid "ARVRController must have an ARVROrigin node as its parent." -msgstr "ARVRController должен иметь узел ARVROrigin в качеÑтве предка" +msgstr "ARVRController должен иметь узел ARVROrigin в качеÑтве предка." #: scene/3d/arvr_nodes.cpp -#, fuzzy msgid "" "The controller ID must not be 0 or this controller won't be bound to an " "actual controller." msgstr "" "Идентификатор контроллера не должен быть равен 0 или Ñтот контроллер не " -"будет привÑзан к фактичеÑкому контроллеру" +"будет привÑзан к фактичеÑкому контроллеру." #: scene/3d/arvr_nodes.cpp -#, fuzzy msgid "ARVRAnchor must have an ARVROrigin node as its parent." -msgstr "ARVRAnchor должен иметь узел ARVROrigin в качеÑтве предка" +msgstr "ARVRAnchor должен иметь узел ARVROrigin в качеÑтве предка." #: scene/3d/arvr_nodes.cpp -#, fuzzy msgid "" "The anchor ID must not be 0 or this anchor won't be bound to an actual " "anchor." msgstr "" "Идентификатор ÑÐºÐ¾Ñ€Ñ Ð½Ðµ должен быть равен 0 или Ñтот Ñкорь не будет привÑзан " -"к фактичеÑкому Ñкорю" +"к фактичеÑкому Ñкорю." #: scene/3d/arvr_nodes.cpp -#, fuzzy msgid "ARVROrigin requires an ARVRCamera child node." -msgstr "ARVROrigin требует дочерний узел ARVRCamera" +msgstr "ARVROrigin требует дочерний узел ARVRCamera." #: scene/3d/baked_lightmap.cpp msgid "%d%%" @@ -12293,8 +12084,9 @@ msgstr "" "ВмеÑто Ñтого иÑпользуйте BakedLightmap." #: scene/3d/light.cpp +#, fuzzy msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." -msgstr "" +msgstr "SpotLight Ñ ÑƒÐ³Ð»Ð¾Ð¼ более 90 градуÑов не может отбраÑывать тени." #: scene/3d/navigation_mesh.cpp msgid "A NavigationMesh resource must be set or created for this node to work." @@ -12357,16 +12149,16 @@ msgstr "" "Измените размер дочерней формы коллизии." #: scene/3d/remote_transform.cpp -#, fuzzy msgid "" "The \"Remote Path\" property must point to a valid Spatial or Spatial-" "derived node to work." -msgstr "СвойÑтво Path должно указывать на дейÑтвительный Spatial узел." +msgstr "" +"СвойÑтво «Remote Path» должно указывать на дейÑтвительный Spatial или " +"унаÑледованный от Spatial узел." #: scene/3d/soft_body.cpp -#, fuzzy msgid "This body will be ignored until you set a mesh." -msgstr "Ðто тело будет игнорироватьÑÑ, пока вы не уÑтановите Ñетку" +msgstr "Ðто тело будет игнорироватьÑÑ, пока вы не уÑтановите Ñетку." #: scene/3d/soft_body.cpp msgid "" @@ -12477,9 +12269,8 @@ msgid "Switch between hexadecimal and code values." msgstr "Переключение между шеÑтнадцатеричными и кодовыми значениÑми." #: scene/gui/color_picker.cpp -#, fuzzy msgid "Add current color as a preset." -msgstr "Добавить текущий цвет как преÑет" +msgstr "Добавить текущий цвет как преÑет." #: scene/gui/container.cpp #, fuzzy @@ -12522,9 +12313,8 @@ msgstr "" "Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ - нормально, но они будут Ñкрыты при запуÑке." #: scene/gui/range.cpp -#, fuzzy msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0." -msgstr "ЕÑли exp_edit равен true min_value должно быть > 0." +msgstr "ЕÑли «Exp Edit» включён, «Min Value» должно быть больше 0." #: scene/gui/scroll_container.cpp #, fuzzy @@ -12548,8 +12338,8 @@ msgid "" "Default Environment as specified in Project Settings (Rendering -> " "Environment -> Default Environment) could not be loaded." msgstr "" -"Среда по умолчанию, как определено в наÑтройках проекта (Rendering -> " -"Environment -> Default Environment) не может быть загружена." +"Окружение по умолчанию, указанное в ÐаÑтройках проекта (Rendering -> " +"Environment -> Default Environment) не может быть загружено." #: scene/main/viewport.cpp msgid "" @@ -12592,6 +12382,18 @@ msgstr "Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð³ÑƒÑ‚ быть назначены только Ð msgid "Constants cannot be modified." msgstr "КонÑтанты не могут быть изменены." +#~ msgid "Pause the scene" +#~ msgstr "ПриоÑтановить Ñцену" + +#~ msgid "Shift+" +#~ msgstr "Shift+" + +#~ msgid "Alt+" +#~ msgstr "Alt+" + +#~ msgid "Control+" +#~ msgstr "Control+" + #~ msgid "Snap to Grid" #~ msgstr "ПривÑзка к Ñетке" diff --git a/editor/translations/si.po b/editor/translations/si.po index a5775be438..85973b455c 100644 --- a/editor/translations/si.po +++ b/editor/translations/si.po @@ -2783,7 +2783,7 @@ msgid "Play" msgstr "" #: editor/editor_node.cpp -msgid "Pause the scene" +msgid "Pause the scene execution for debugging." msgstr "" #: editor/editor_node.cpp @@ -3449,6 +3449,10 @@ msgid "New Inherited Scene" msgstr "" #: editor/filesystem_dock.cpp +msgid "Set As Main Scene" +msgstr "" + +#: editor/filesystem_dock.cpp msgid "Open Scenes" msgstr "" @@ -4165,6 +4169,21 @@ msgid "" msgstr "" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Anim Clips" +msgstr "Anim පසුරු:" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Audio Clips" +msgstr "à·à·Šâ€à¶»à·€à·Šâ€à¶º පසුරු:" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Functions" +msgstr "à·à·Šâ€à¶»à·’à¶:" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/animation_state_machine_editor.cpp msgid "Node Renamed" msgstr "" @@ -4832,6 +4851,14 @@ msgid "Grid Step:" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Primary Line Every:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "steps" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotation Offset:" msgstr "" @@ -4840,6 +4867,10 @@ msgid "Rotation Step:" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale Step:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move Vertical Guide" msgstr "" @@ -4923,6 +4954,20 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"Overrides game camera with editor viewport camera." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"No game instance running." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp msgid "Lock Selected" msgstr "" @@ -5060,6 +5105,10 @@ msgid "Use Rotation Snap" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Use Scale Snap" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap Relative" msgstr "" @@ -5199,7 +5248,7 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" -"Auto insert keys when objects are translated, rotated on scaled (based on " +"Auto insert keys when objects are translated, rotated or scaled (based on " "mask).\n" "Keys are only added to existing tracks, no new tracks will be created.\n" "Keys must be inserted manually for the first time." @@ -8048,7 +8097,7 @@ msgid "Dodge operator." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "HardLight operator" +msgid "HardLight operator." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8639,9 +8688,10 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Custom Godot Shader Language expression, which placed on top of the resulted " -"shader. You can place various function definitions inside and call it later " -"in the Expressions. You can also declare varyings, uniforms and constants." +"Custom Godot Shader Language expression, which is placed on top of the " +"resulted shader. You can place various function definitions inside and call " +"it later in the Expressions. You can also declare varyings, uniforms and " +"constants." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8750,6 +8800,12 @@ msgid "Add..." msgstr "" #: editor/project_export.cpp +msgid "" +"If checked, the preset will be available for use in one-click deploy.\n" +"Only one preset per platform may be marked as runnable." +msgstr "" + +#: editor/project_export.cpp msgid "Export Path" msgstr "" @@ -9186,18 +9242,6 @@ msgid "Device" msgstr "" #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Shift+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Alt+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Control+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "Press a Key..." msgstr "" @@ -10897,7 +10941,7 @@ msgid "Can't create function of nodes from nodes of multiple functions." msgstr "" #: modules/visual_script/visual_script_editor.cpp -msgid "Select atleast one node with sequence port." +msgid "Select at least one node with sequence port." msgstr "" #: modules/visual_script/visual_script_editor.cpp @@ -11205,10 +11249,18 @@ msgid "Using default boot splash image." msgstr "" #: platform/uwp/export/export.cpp +msgid "Invalid package short name." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package unique name." msgstr "" #: platform/uwp/export/export.cpp +msgid "Invalid package publisher display name." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid product GUID." msgstr "" diff --git a/editor/translations/sk.po b/editor/translations/sk.po index 88eddf57db..62811488f9 100644 --- a/editor/translations/sk.po +++ b/editor/translations/sk.po @@ -2856,7 +2856,7 @@ msgid "Play" msgstr "" #: editor/editor_node.cpp -msgid "Pause the scene" +msgid "Pause the scene execution for debugging." msgstr "" #: editor/editor_node.cpp @@ -3539,6 +3539,11 @@ msgstr "Popis:" #: editor/filesystem_dock.cpp #, fuzzy +msgid "Set As Main Scene" +msgstr "UložiÅ¥ súbor" + +#: editor/filesystem_dock.cpp +#, fuzzy msgid "Open Scenes" msgstr "OtvoriÅ¥ súbor(y)" @@ -4284,6 +4289,21 @@ msgid "" msgstr "" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Anim Clips" +msgstr "Klipy Animácie:" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Audio Clips" +msgstr "Zvukové Klipy:" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Functions" +msgstr "Funkcie:" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/animation_state_machine_editor.cpp msgid "Node Renamed" msgstr "" @@ -4966,6 +4986,14 @@ msgid "Grid Step:" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Primary Line Every:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "steps" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotation Offset:" msgstr "" @@ -4975,6 +5003,11 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy +msgid "Scale Step:" +msgstr "ZmeniÅ¥ veľkosÅ¥ výberu" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy msgid "Move Vertical Guide" msgstr "Popis:" @@ -5063,6 +5096,20 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"Overrides game camera with editor viewport camera." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"No game instance running." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp #, fuzzy msgid "Lock Selected" msgstr "VÅ¡etky vybrané" @@ -5204,6 +5251,10 @@ msgid "Use Rotation Snap" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Use Scale Snap" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap Relative" msgstr "" @@ -5345,7 +5396,7 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" -"Auto insert keys when objects are translated, rotated on scaled (based on " +"Auto insert keys when objects are translated, rotated or scaled (based on " "mask).\n" "Keys are only added to existing tracks, no new tracks will be created.\n" "Keys must be inserted manually for the first time." @@ -8305,7 +8356,7 @@ msgid "Dodge operator." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "HardLight operator" +msgid "HardLight operator." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8898,9 +8949,10 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Custom Godot Shader Language expression, which placed on top of the resulted " -"shader. You can place various function definitions inside and call it later " -"in the Expressions. You can also declare varyings, uniforms and constants." +"Custom Godot Shader Language expression, which is placed on top of the " +"resulted shader. You can place various function definitions inside and call " +"it later in the Expressions. You can also declare varyings, uniforms and " +"constants." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -9010,6 +9062,12 @@ msgid "Add..." msgstr "" #: editor/project_export.cpp +msgid "" +"If checked, the preset will be available for use in one-click deploy.\n" +"Only one preset per platform may be marked as runnable." +msgstr "" + +#: editor/project_export.cpp msgid "Export Path" msgstr "" @@ -9455,18 +9513,6 @@ msgid "Device" msgstr "Zariadenie" #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Shift+" -msgstr "Shift+" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Alt+" -msgstr "Alt+" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Control+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "Press a Key..." msgstr "" @@ -11215,7 +11261,7 @@ msgid "Can't create function of nodes from nodes of multiple functions." msgstr "" #: modules/visual_script/visual_script_editor.cpp -msgid "Select atleast one node with sequence port." +msgid "Select at least one node with sequence port." msgstr "" #: modules/visual_script/visual_script_editor.cpp @@ -11532,11 +11578,21 @@ msgstr "" #: platform/uwp/export/export.cpp #, fuzzy +msgid "Invalid package short name." +msgstr "Nesprávna veľkosÅ¥ pÃsma." + +#: platform/uwp/export/export.cpp +#, fuzzy msgid "Invalid package unique name." msgstr "Nesprávna veľkosÅ¥ pÃsma." #: platform/uwp/export/export.cpp #, fuzzy +msgid "Invalid package publisher display name." +msgstr "Nesprávna veľkosÅ¥ pÃsma." + +#: platform/uwp/export/export.cpp +#, fuzzy msgid "Invalid product GUID." msgstr "Nesprávna veľkosÅ¥ pÃsma." @@ -12086,6 +12142,12 @@ msgstr "" msgid "Constants cannot be modified." msgstr "" +#~ msgid "Shift+" +#~ msgstr "Shift+" + +#~ msgid "Alt+" +#~ msgstr "Alt+" + #, fuzzy #~ msgid "Theme Properties:" #~ msgstr "Filter:" diff --git a/editor/translations/sl.po b/editor/translations/sl.po index 8b9ed3f61a..238d4da365 100644 --- a/editor/translations/sl.po +++ b/editor/translations/sl.po @@ -3006,8 +3006,8 @@ msgid "Play" msgstr "Zaženi" #: editor/editor_node.cpp -msgid "Pause the scene" -msgstr "Zaustavi prizor" +msgid "Pause the scene execution for debugging." +msgstr "" #: editor/editor_node.cpp msgid "Pause Scene" @@ -3702,6 +3702,11 @@ msgstr "Nov Podedovan Prizor..." #: editor/filesystem_dock.cpp #, fuzzy +msgid "Set As Main Scene" +msgstr "Izberi Glavno Sceno" + +#: editor/filesystem_dock.cpp +#, fuzzy msgid "Open Scenes" msgstr "Odpri Sceno" @@ -4489,6 +4494,20 @@ msgid "" msgstr "" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Anim Clips" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Audio Clips" +msgstr "Animacija Dodaj sled" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Functions" +msgstr "Funkcije:" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/animation_state_machine_editor.cpp #, fuzzy msgid "Node Renamed" @@ -5198,6 +5217,15 @@ msgid "Grid Step:" msgstr "Mrežni Korak:" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Primary Line Every:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "steps" +msgstr "2 koraka" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotation Offset:" msgstr "Rotacijski Odmik:" @@ -5207,6 +5235,11 @@ msgstr "Rotacijski Korak:" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy +msgid "Scale Step:" +msgstr "Prilagodi Velikost:" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy msgid "Move Vertical Guide" msgstr "Premakni navpiÄni vodnik" @@ -5300,6 +5333,20 @@ msgstr "Spremeni SidriÅ¡Äa" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"Overrides game camera with editor viewport camera." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"No game instance running." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp #, fuzzy msgid "Lock Selected" msgstr "Izbira Orodja" @@ -5453,6 +5500,11 @@ msgid "Use Rotation Snap" msgstr "Uporabi Rotacijsko Pripenjanje" #: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Use Scale Snap" +msgstr "Uporabi Pripenjanje" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap Relative" msgstr "Pripni Relativno" @@ -5602,7 +5654,7 @@ msgstr "V Animacijo Vstavi KljuÄ" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" -"Auto insert keys when objects are translated, rotated on scaled (based on " +"Auto insert keys when objects are translated, rotated or scaled (based on " "mask).\n" "Keys are only added to existing tracks, no new tracks will be created.\n" "Keys must be inserted manually for the first time." @@ -8608,7 +8660,7 @@ msgid "Dodge operator." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "HardLight operator" +msgid "HardLight operator." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -9204,9 +9256,10 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Custom Godot Shader Language expression, which placed on top of the resulted " -"shader. You can place various function definitions inside and call it later " -"in the Expressions. You can also declare varyings, uniforms and constants." +"Custom Godot Shader Language expression, which is placed on top of the " +"resulted shader. You can place various function definitions inside and call " +"it later in the Expressions. You can also declare varyings, uniforms and " +"constants." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -9318,6 +9371,12 @@ msgid "Add..." msgstr "" #: editor/project_export.cpp +msgid "" +"If checked, the preset will be available for use in one-click deploy.\n" +"Only one preset per platform may be marked as runnable." +msgstr "" + +#: editor/project_export.cpp #, fuzzy msgid "Export Path" msgstr "Izvozi Projekt" @@ -9774,18 +9833,6 @@ msgid "Device" msgstr "" #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Shift+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Alt+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Control+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "Press a Key..." msgstr "" @@ -11560,7 +11607,7 @@ msgid "Can't create function of nodes from nodes of multiple functions." msgstr "" #: modules/visual_script/visual_script_editor.cpp -msgid "Select atleast one node with sequence port." +msgid "Select at least one node with sequence port." msgstr "" #: modules/visual_script/visual_script_editor.cpp @@ -11878,11 +11925,21 @@ msgstr "" #: platform/uwp/export/export.cpp #, fuzzy +msgid "Invalid package short name." +msgstr "Neveljavno ime." + +#: platform/uwp/export/export.cpp +#, fuzzy msgid "Invalid package unique name." msgstr "Neveljaven indeks lastnosti imena." #: platform/uwp/export/export.cpp #, fuzzy +msgid "Invalid package publisher display name." +msgstr "Neveljaven indeks lastnosti imena." + +#: platform/uwp/export/export.cpp +#, fuzzy msgid "Invalid product GUID." msgstr "Neveljavno Ime Projekta." @@ -12448,6 +12505,9 @@ msgstr "" msgid "Constants cannot be modified." msgstr "Konstante ni možno spreminjati." +#~ msgid "Pause the scene" +#~ msgstr "Zaustavi prizor" + #, fuzzy #~ msgid "Snap to Grid" #~ msgstr "Pripni na mrežo" diff --git a/editor/translations/sq.po b/editor/translations/sq.po index dbea1057fc..49b45241ed 100644 --- a/editor/translations/sq.po +++ b/editor/translations/sq.po @@ -2930,8 +2930,8 @@ msgid "Play" msgstr "Luaj" #: editor/editor_node.cpp -msgid "Pause the scene" -msgstr "Pusho skenën" +msgid "Pause the scene execution for debugging." +msgstr "" #: editor/editor_node.cpp msgid "Pause Scene" @@ -3628,6 +3628,11 @@ msgstr "Skenë e Re e Trashëguar..." #: editor/filesystem_dock.cpp #, fuzzy +msgid "Set As Main Scene" +msgstr "Zgjidh një Skenë Kryesore" + +#: editor/filesystem_dock.cpp +#, fuzzy msgid "Open Scenes" msgstr "Hap Skenën" @@ -4360,6 +4365,21 @@ msgid "" msgstr "" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Anim Clips" +msgstr "Klipe Audio:" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Audio Clips" +msgstr "Klipe Audio:" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Functions" +msgstr "Funksionet:" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/animation_state_machine_editor.cpp msgid "Node Renamed" msgstr "" @@ -5035,6 +5055,14 @@ msgid "Grid Step:" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Primary Line Every:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "steps" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotation Offset:" msgstr "" @@ -5043,6 +5071,10 @@ msgid "Rotation Step:" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale Step:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move Vertical Guide" msgstr "" @@ -5128,6 +5160,20 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"Overrides game camera with editor viewport camera." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"No game instance running." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp #, fuzzy msgid "Lock Selected" msgstr "Zgjidh" @@ -5267,6 +5313,10 @@ msgid "Use Rotation Snap" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Use Scale Snap" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap Relative" msgstr "" @@ -5406,7 +5456,7 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" -"Auto insert keys when objects are translated, rotated on scaled (based on " +"Auto insert keys when objects are translated, rotated or scaled (based on " "mask).\n" "Keys are only added to existing tracks, no new tracks will be created.\n" "Keys must be inserted manually for the first time." @@ -8292,7 +8342,7 @@ msgid "Dodge operator." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "HardLight operator" +msgid "HardLight operator." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8881,9 +8931,10 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Custom Godot Shader Language expression, which placed on top of the resulted " -"shader. You can place various function definitions inside and call it later " -"in the Expressions. You can also declare varyings, uniforms and constants." +"Custom Godot Shader Language expression, which is placed on top of the " +"resulted shader. You can place various function definitions inside and call " +"it later in the Expressions. You can also declare varyings, uniforms and " +"constants." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8992,6 +9043,12 @@ msgid "Add..." msgstr "" #: editor/project_export.cpp +msgid "" +"If checked, the preset will be available for use in one-click deploy.\n" +"Only one preset per platform may be marked as runnable." +msgstr "" + +#: editor/project_export.cpp msgid "Export Path" msgstr "" @@ -9436,18 +9493,6 @@ msgid "Device" msgstr "" #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Shift+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Alt+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Control+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "Press a Key..." msgstr "" @@ -11178,7 +11223,7 @@ msgid "Can't create function of nodes from nodes of multiple functions." msgstr "" #: modules/visual_script/visual_script_editor.cpp -msgid "Select atleast one node with sequence port." +msgid "Select at least one node with sequence port." msgstr "" #: modules/visual_script/visual_script_editor.cpp @@ -11487,10 +11532,20 @@ msgid "Using default boot splash image." msgstr "" #: platform/uwp/export/export.cpp +#, fuzzy +msgid "Invalid package short name." +msgstr "Emër i palejuar." + +#: platform/uwp/export/export.cpp msgid "Invalid package unique name." msgstr "" #: platform/uwp/export/export.cpp +#, fuzzy +msgid "Invalid package publisher display name." +msgstr "Emër i palejuar." + +#: platform/uwp/export/export.cpp msgid "Invalid product GUID." msgstr "" @@ -12020,6 +12075,9 @@ msgstr "" msgid "Constants cannot be modified." msgstr "" +#~ msgid "Pause the scene" +#~ msgstr "Pusho skenën" + #~ msgid "Properties:" #~ msgstr "Vetitë:" diff --git a/editor/translations/sr_Cyrl.po b/editor/translations/sr_Cyrl.po index fd8f5d95b3..e868067d39 100644 --- a/editor/translations/sr_Cyrl.po +++ b/editor/translations/sr_Cyrl.po @@ -3015,8 +3015,8 @@ msgid "Play" msgstr "Покрени" #: editor/editor_node.cpp -msgid "Pause the scene" -msgstr "Паузирај Ñцену" +msgid "Pause the scene execution for debugging." +msgstr "" #: editor/editor_node.cpp msgid "Pause Scene" @@ -3727,6 +3727,11 @@ msgstr "Ðова наÑлеђена Ñцена..." #: editor/filesystem_dock.cpp #, fuzzy +msgid "Set As Main Scene" +msgstr "Одабери главну Ñцену" + +#: editor/filesystem_dock.cpp +#, fuzzy msgid "Open Scenes" msgstr "Отвори Ñцену" @@ -4515,6 +4520,21 @@ msgid "" msgstr "" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Anim Clips" +msgstr "Звучни Ñлушалац" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Audio Clips" +msgstr "Звучни Ñлушалац" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Functions" +msgstr "Промени векторÑку функцију" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/animation_state_machine_editor.cpp #, fuzzy msgid "Node Renamed" @@ -5217,6 +5237,15 @@ msgid "Grid Step:" msgstr "Корак мреже:" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Primary Line Every:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "steps" +msgstr "2 корака" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotation Offset:" msgstr "Ротација офÑета:" @@ -5226,6 +5255,11 @@ msgstr "Ротације корака:" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy +msgid "Scale Step:" +msgstr "Скала:" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy msgid "Move Vertical Guide" msgstr "Помери вертикални водич" @@ -5319,6 +5353,20 @@ msgstr "Промени Ñидра" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"Overrides game camera with editor viewport camera." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"No game instance running." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp #, fuzzy msgid "Lock Selected" msgstr "Избор алатки" @@ -5471,6 +5519,11 @@ msgid "Use Rotation Snap" msgstr "КориÑти лепљење ротације" #: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Use Scale Snap" +msgstr "КориÑти лепљење" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap Relative" msgstr "Залепи релативно" @@ -5623,7 +5676,7 @@ msgstr "Убаци кључ (поÑтојеће траке)" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" -"Auto insert keys when objects are translated, rotated on scaled (based on " +"Auto insert keys when objects are translated, rotated or scaled (based on " "mask).\n" "Keys are only added to existing tracks, no new tracks will be created.\n" "Keys must be inserted manually for the first time." @@ -8703,8 +8756,9 @@ msgid "Dodge operator." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "HardLight operator" -msgstr "" +#, fuzzy +msgid "HardLight operator." +msgstr "Промени Ñкаларни оператор" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Lighten operator." @@ -9308,9 +9362,10 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Custom Godot Shader Language expression, which placed on top of the resulted " -"shader. You can place various function definitions inside and call it later " -"in the Expressions. You can also declare varyings, uniforms and constants." +"Custom Godot Shader Language expression, which is placed on top of the " +"resulted shader. You can place various function definitions inside and call " +"it later in the Expressions. You can also declare varyings, uniforms and " +"constants." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -9426,6 +9481,12 @@ msgid "Add..." msgstr "Додај..." #: editor/project_export.cpp +msgid "" +"If checked, the preset will be available for use in one-click deploy.\n" +"Only one preset per platform may be marked as runnable." +msgstr "" + +#: editor/project_export.cpp #, fuzzy msgid "Export Path" msgstr "Извези пројекат" @@ -9888,18 +9949,6 @@ msgid "Device" msgstr "" #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Shift+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Alt+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Control+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "Press a Key..." msgstr "" @@ -11684,7 +11733,7 @@ msgid "Can't create function of nodes from nodes of multiple functions." msgstr "" #: modules/visual_script/visual_script_editor.cpp -msgid "Select atleast one node with sequence port." +msgid "Select at least one node with sequence port." msgstr "" #: modules/visual_script/visual_script_editor.cpp @@ -12004,11 +12053,21 @@ msgstr "ÐеуÑпех при учитавању датотеке Ñа ÑличР#: platform/uwp/export/export.cpp #, fuzzy +msgid "Invalid package short name." +msgstr "Ðеважеће име." + +#: platform/uwp/export/export.cpp +#, fuzzy msgid "Invalid package unique name." msgstr "Ðеважеће име." #: platform/uwp/export/export.cpp #, fuzzy +msgid "Invalid package publisher display name." +msgstr "Ðеважеће име." + +#: platform/uwp/export/export.cpp +#, fuzzy msgid "Invalid product GUID." msgstr "Ðеважеће име." @@ -12548,6 +12607,9 @@ msgstr "" msgid "Constants cannot be modified." msgstr "" +#~ msgid "Pause the scene" +#~ msgstr "Паузирај Ñцену" + #, fuzzy #~ msgid "Snap to Grid" #~ msgstr "Залепи за мрежу" diff --git a/editor/translations/sr_Latn.po b/editor/translations/sr_Latn.po index 5a1d545141..e4298b2aa5 100644 --- a/editor/translations/sr_Latn.po +++ b/editor/translations/sr_Latn.po @@ -2799,7 +2799,7 @@ msgid "Play" msgstr "" #: editor/editor_node.cpp -msgid "Pause the scene" +msgid "Pause the scene execution for debugging." msgstr "" #: editor/editor_node.cpp @@ -3466,6 +3466,10 @@ msgid "New Inherited Scene" msgstr "" #: editor/filesystem_dock.cpp +msgid "Set As Main Scene" +msgstr "" + +#: editor/filesystem_dock.cpp msgid "Open Scenes" msgstr "" @@ -4185,6 +4189,21 @@ msgid "" msgstr "" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Anim Clips" +msgstr "Anim Klipovi:" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Audio Clips" +msgstr "Audio Klipovi:" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Functions" +msgstr "Funkcije:" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/animation_state_machine_editor.cpp msgid "Node Renamed" msgstr "" @@ -4857,6 +4876,14 @@ msgid "Grid Step:" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Primary Line Every:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "steps" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotation Offset:" msgstr "" @@ -4865,6 +4892,11 @@ msgid "Rotation Step:" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Scale Step:" +msgstr "Skaliraj Selekciju" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move Vertical Guide" msgstr "" @@ -4949,6 +4981,20 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"Overrides game camera with editor viewport camera." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"No game instance running." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp msgid "Lock Selected" msgstr "" @@ -5087,6 +5133,10 @@ msgid "Use Rotation Snap" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Use Scale Snap" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap Relative" msgstr "" @@ -5227,7 +5277,7 @@ msgstr "Animacija dodaj kljuÄ" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" -"Auto insert keys when objects are translated, rotated on scaled (based on " +"Auto insert keys when objects are translated, rotated or scaled (based on " "mask).\n" "Keys are only added to existing tracks, no new tracks will be created.\n" "Keys must be inserted manually for the first time." @@ -8116,7 +8166,7 @@ msgid "Dodge operator." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "HardLight operator" +msgid "HardLight operator." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8710,9 +8760,10 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Custom Godot Shader Language expression, which placed on top of the resulted " -"shader. You can place various function definitions inside and call it later " -"in the Expressions. You can also declare varyings, uniforms and constants." +"Custom Godot Shader Language expression, which is placed on top of the " +"resulted shader. You can place various function definitions inside and call " +"it later in the Expressions. You can also declare varyings, uniforms and " +"constants." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8821,6 +8872,12 @@ msgid "Add..." msgstr "" #: editor/project_export.cpp +msgid "" +"If checked, the preset will be available for use in one-click deploy.\n" +"Only one preset per platform may be marked as runnable." +msgstr "" + +#: editor/project_export.cpp msgid "Export Path" msgstr "" @@ -9259,18 +9316,6 @@ msgid "Device" msgstr "" #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Shift+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Alt+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Control+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "Press a Key..." msgstr "" @@ -10981,7 +11026,7 @@ msgid "Can't create function of nodes from nodes of multiple functions." msgstr "" #: modules/visual_script/visual_script_editor.cpp -msgid "Select atleast one node with sequence port." +msgid "Select at least one node with sequence port." msgstr "" #: modules/visual_script/visual_script_editor.cpp @@ -11289,10 +11334,18 @@ msgid "Using default boot splash image." msgstr "" #: platform/uwp/export/export.cpp +msgid "Invalid package short name." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package unique name." msgstr "" #: platform/uwp/export/export.cpp +msgid "Invalid package publisher display name." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid product GUID." msgstr "" diff --git a/editor/translations/sv.po b/editor/translations/sv.po index e62eadd859..c1cc6a8a62 100644 --- a/editor/translations/sv.po +++ b/editor/translations/sv.po @@ -16,7 +16,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2019-10-22 02:53+0000\n" +"PO-Revision-Date: 2019-11-25 04:05+0000\n" "Last-Translator: Mattias Münster <mattiasmun@gmail.com>\n" "Language-Team: Swedish <https://hosted.weblate.org/projects/godot-engine/" "godot/sv/>\n" @@ -25,7 +25,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 3.9.1-dev\n" +"X-Generator: Weblate 3.10-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -57,15 +57,15 @@ msgstr "Ogiltigt index av typ %s för bastyp %s" #: core/math/expression.cpp msgid "Invalid named index '%s' for base type %s" -msgstr "" +msgstr "Ogiltigt namn pÃ¥ index '%s' för bastyp %s" #: core/math/expression.cpp msgid "Invalid arguments to construct '%s'" -msgstr "" +msgstr "Ogiltiga argument för att bygga '%s'" #: core/math/expression.cpp msgid "On call to '%s':" -msgstr "" +msgstr "I anrop till '%s':" #: core/ustring.cpp msgid "B" @@ -137,7 +137,7 @@ msgstr "Flytta Bezierpunkt" #: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp msgid "Anim Duplicate Keys" -msgstr "Anim Duplicera Nycklar" +msgstr "Anim Duplicera Nycklarna" #: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp msgid "Anim Delete Keys" @@ -432,22 +432,20 @@ msgid "Not possible to add a new track without a root" msgstr "" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Add Bezier Track" -msgstr "Anim Lägg till spÃ¥r" +msgstr "Lägg till Bezier-spÃ¥r" #: editor/animation_track_editor.cpp msgid "Track path is invalid, so can't add a key." -msgstr "" +msgstr "Kurva är felaktig sÃ¥ det gÃ¥r inte att skapa en nyckel." #: editor/animation_track_editor.cpp msgid "Track is not of type Spatial, can't insert key" -msgstr "" +msgstr "Kurvan är inte av rumstyp sÃ¥ det gÃ¥r inte att skapa en nyckel" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Add Transform Track Key" -msgstr "Transformera" +msgstr "Lägg till kurvförändringsnyckel" #: editor/animation_track_editor.cpp #, fuzzy @@ -1141,7 +1139,7 @@ msgstr "Projektgrundare" #: editor/editor_about.cpp msgid "Lead Developer" -msgstr "Lead Developer" +msgstr "Ledande utvecklare" #: editor/editor_about.cpp #, fuzzy @@ -1305,7 +1303,7 @@ msgstr "Dämpa" #: editor/editor_audio_buses.cpp msgid "Bypass" -msgstr "Bypass" +msgstr "GÃ¥ förbi" #: editor/editor_audio_buses.cpp msgid "Bus options" @@ -1531,7 +1529,7 @@ msgstr "(tom)" #: editor/editor_data.cpp msgid "[unsaved]" -msgstr "" +msgstr "[osparad]" #: editor/editor_dir_dialog.cpp #, fuzzy @@ -1996,7 +1994,7 @@ msgstr "Egenskaper" #: editor/editor_help.cpp msgid "Enumerations" -msgstr "Enumerations" +msgstr "Uppräkningar" #: editor/editor_help.cpp msgid "enum " @@ -2527,7 +2525,7 @@ msgstr "Kan inte hitta skriptfältet för addon plugin vid: 'res://addons/%s'." #: editor/editor_node.cpp msgid "Unable to load addon script from path: '%s'." -msgstr "Kunde inte ladda addon script frÃ¥n sökväg: '%s'" +msgstr "Kunde inte ladda addon script frÃ¥n sökväg: '%s'." #: editor/editor_node.cpp #, fuzzy @@ -2860,7 +2858,7 @@ msgstr "" #: editor/editor_node.cpp msgid "Visible Navigation" -msgstr "" +msgstr "Synlig Navigation" #: editor/editor_node.cpp msgid "" @@ -2916,7 +2914,7 @@ msgstr "" #: editor/editor_node.cpp msgid "Toggle Fullscreen" -msgstr "" +msgstr "Fullskärm" #: editor/editor_node.cpp #, fuzzy @@ -2980,15 +2978,15 @@ msgstr "Om" #: editor/editor_node.cpp msgid "Play the project." -msgstr "" +msgstr "Spela projektet." #: editor/editor_node.cpp msgid "Play" msgstr "Spela" #: editor/editor_node.cpp -msgid "Pause the scene" -msgstr "Pausa scenen" +msgid "Pause the scene execution for debugging." +msgstr "" #: editor/editor_node.cpp msgid "Pause Scene" @@ -3044,7 +3042,7 @@ msgstr "" #: editor/editor_node.cpp msgid "FileSystem" -msgstr "" +msgstr "FilSystem" #: editor/editor_node.cpp msgid "Inspector" @@ -3093,7 +3091,7 @@ msgstr "" #: editor/editor_node.cpp msgid "Import Templates From ZIP File" -msgstr "" +msgstr "Importera Mall frÃ¥n ZIP fil" #: editor/editor_node.cpp editor/project_export.cpp msgid "Export Project" @@ -3105,7 +3103,7 @@ msgstr "Exportera Bibliotek" #: editor/editor_node.cpp msgid "Merge With Existing" -msgstr "" +msgstr "Sammanfoga Med Existerande" #: editor/editor_node.cpp msgid "Password:" @@ -3121,7 +3119,7 @@ msgstr "" #: editor/editor_node.cpp msgid "Load Errors" -msgstr "" +msgstr "Ladda Felmeddelanden" #: editor/editor_node.cpp editor/plugins/tile_map_editor_plugin.cpp msgid "Select" @@ -3129,11 +3127,11 @@ msgstr "Välj" #: editor/editor_node.cpp msgid "Open 2D Editor" -msgstr "" +msgstr "Öppna 2D Redigeraren" #: editor/editor_node.cpp msgid "Open 3D Editor" -msgstr "" +msgstr "Öppna 3D Redigeraren" #: editor/editor_node.cpp msgid "Open Script Editor" @@ -3177,7 +3175,7 @@ msgstr "Redigera Polygon" #: editor/editor_plugin_settings.cpp msgid "Installed Plugins:" -msgstr "" +msgstr "Installerade Plugins:" #: editor/editor_plugin_settings.cpp editor/plugin_config_dialog.cpp msgid "Update" @@ -3223,7 +3221,7 @@ msgstr "" #: editor/editor_profiler.cpp msgid "Inclusive" -msgstr "" +msgstr "Inkluderande" #: editor/editor_profiler.cpp msgid "Self" @@ -3403,7 +3401,7 @@ msgstr "Bläddra" #: editor/editor_sub_scene.cpp msgid "Scene Path:" -msgstr "" +msgstr "Scen Filsökväg:" #: editor/editor_sub_scene.cpp msgid "Import From Node:" @@ -3481,7 +3479,7 @@ msgstr "" #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp msgid "Can't resolve." -msgstr "" +msgstr "Kan inte lösa." #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -3491,7 +3489,7 @@ msgstr "Kan inte ansluta." #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp msgid "No response." -msgstr "" +msgstr "Inget svar." #: editor/export_template_manager.cpp msgid "Request Failed." @@ -3685,6 +3683,11 @@ msgstr "Ny Ärvd Scen..." #: editor/filesystem_dock.cpp #, fuzzy +msgid "Set As Main Scene" +msgstr "Välj en Huvudscen" + +#: editor/filesystem_dock.cpp +#, fuzzy msgid "Open Scenes" msgstr "Öppna Scen" @@ -3772,7 +3775,7 @@ msgstr "Skapa Mapp" #: editor/filesystem_dock.cpp msgid "Re-Scan Filesystem" -msgstr "" +msgstr "Scanna Om Filsystemet" #: editor/filesystem_dock.cpp #, fuzzy @@ -3941,7 +3944,7 @@ msgstr "Grupper" #: editor/import/resource_importer_scene.cpp msgid "Import as Single Scene" -msgstr "" +msgstr "Importera som enstaka scen" #: editor/import/resource_importer_scene.cpp msgid "Import with Separate Animations" @@ -3953,15 +3956,15 @@ msgstr "Importera med Separata Material" #: editor/import/resource_importer_scene.cpp msgid "Import with Separate Objects" -msgstr "" +msgstr "Importera med Separata Objekt" #: editor/import/resource_importer_scene.cpp msgid "Import with Separate Objects+Materials" -msgstr "" +msgstr "Importera med Seperata Objekt+Material" #: editor/import/resource_importer_scene.cpp msgid "Import with Separate Objects+Animations" -msgstr "" +msgstr "Importera med Separata Objekt+Animationer" #: editor/import/resource_importer_scene.cpp msgid "Import with Separate Materials+Animations" @@ -3969,15 +3972,15 @@ msgstr "Importera med Separata Material+Animationer" #: editor/import/resource_importer_scene.cpp msgid "Import with Separate Objects+Materials+Animations" -msgstr "" +msgstr "Importera med Separata Objekt+Material+Animationer" #: editor/import/resource_importer_scene.cpp msgid "Import as Multiple Scenes" -msgstr "" +msgstr "Importera som Flera Scener" #: editor/import/resource_importer_scene.cpp msgid "Import as Multiple Scenes+Materials" -msgstr "" +msgstr "Importera som Flera Scener+Material" #: editor/import/resource_importer_scene.cpp #: editor/plugins/mesh_library_editor_plugin.cpp @@ -3991,7 +3994,7 @@ msgstr "Importerar Scen..." #: editor/import/resource_importer_scene.cpp msgid "Generating Lightmaps" -msgstr "" +msgstr "Genererar Lightmaps" #: editor/import/resource_importer_scene.cpp msgid "Generating for Mesh: " @@ -4011,7 +4014,7 @@ msgstr "" #: editor/import/resource_importer_scene.cpp msgid "Error running post-import script:" -msgstr "" +msgstr "Fel uppstod efter importering av skript:" #: editor/import/resource_importer_scene.cpp msgid "Saving..." @@ -4019,11 +4022,11 @@ msgstr "Sparar..." #: editor/import_dock.cpp msgid "Set as Default for '%s'" -msgstr "" +msgstr "Ange som Standard för '%s'" #: editor/import_dock.cpp msgid "Clear Default for '%s'" -msgstr "" +msgstr "Rensa Standarden för '%s'" #: editor/import_dock.cpp msgid " Files" @@ -4040,7 +4043,7 @@ msgstr "Ã…terställ Zoom" #: editor/import_dock.cpp msgid "Reimport" -msgstr "" +msgstr "Importera om" #: editor/import_dock.cpp msgid "Save scenes, re-import and restart" @@ -4105,7 +4108,7 @@ msgstr "Öppna i Hjälp" #: editor/inspector_dock.cpp msgid "Create a new resource in memory and edit it." -msgstr "" +msgstr "Skapa en ny resurs i minnet och ändra den." #: editor/inspector_dock.cpp msgid "Load an existing resource from disk and edit it." @@ -4139,7 +4142,7 @@ msgstr "Filtrera noder" #: editor/inspector_dock.cpp msgid "Changes may be lost!" -msgstr "" +msgstr "Ändringar kan gÃ¥ förlorade!" #: editor/multi_node_edit.cpp msgid "MultiNode Set" @@ -4468,6 +4471,20 @@ msgid "" msgstr "" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Anim Clips" +msgstr "Animklipp:" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Audio Clips" +msgstr "Ljudklipp:" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Functions" +msgstr "Funktioner" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/animation_state_machine_editor.cpp #, fuzzy msgid "Node Renamed" @@ -4492,7 +4509,7 @@ msgstr "Redigerbara Barn" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Toggle Autoplay" -msgstr "" +msgstr "SlÃ¥ pÃ¥/av Autoplay" #: editor/plugins/animation_player_editor_plugin.cpp msgid "New Animation Name:" @@ -5169,6 +5186,14 @@ msgid "Grid Step:" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Primary Line Every:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "steps" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotation Offset:" msgstr "" @@ -5177,6 +5202,11 @@ msgid "Rotation Step:" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Scale Step:" +msgstr "Skala:" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move Vertical Guide" msgstr "" @@ -5264,6 +5294,20 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"Overrides game camera with editor viewport camera." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"No game instance running." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp #, fuzzy msgid "Lock Selected" msgstr "Välj" @@ -5408,6 +5452,10 @@ msgid "Use Rotation Snap" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Use Scale Snap" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap Relative" msgstr "" @@ -5550,7 +5598,7 @@ msgstr "Anim Infoga Nyckel" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" -"Auto insert keys when objects are translated, rotated on scaled (based on " +"Auto insert keys when objects are translated, rotated or scaled (based on " "mask).\n" "Keys are only added to existing tracks, no new tracks will be created.\n" "Keys must be inserted manually for the first time." @@ -7137,7 +7185,7 @@ msgstr "Vy OvanifrÃ¥n." #: editor/plugins/spatial_editor_plugin.cpp msgid "Bottom View." -msgstr "Vy UnderifrÃ¥n" +msgstr "Vy UnderifrÃ¥n." #: editor/plugins/spatial_editor_plugin.cpp msgid "Bottom" @@ -7628,7 +7676,7 @@ msgstr "" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Loop" -msgstr "Loop" +msgstr "Slinga" #: editor/plugins/sprite_frames_editor_plugin.cpp #, fuzzy @@ -8552,7 +8600,7 @@ msgid "Dodge operator." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "HardLight operator" +msgid "HardLight operator." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -9147,9 +9195,10 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Custom Godot Shader Language expression, which placed on top of the resulted " -"shader. You can place various function definitions inside and call it later " -"in the Expressions. You can also declare varyings, uniforms and constants." +"Custom Godot Shader Language expression, which is placed on top of the " +"resulted shader. You can place various function definitions inside and call " +"it later in the Expressions. You can also declare varyings, uniforms and " +"constants." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -9261,6 +9310,12 @@ msgid "Add..." msgstr "Lägg till..." #: editor/project_export.cpp +msgid "" +"If checked, the preset will be available for use in one-click deploy.\n" +"Only one preset per platform may be marked as runnable." +msgstr "" + +#: editor/project_export.cpp #, fuzzy msgid "Export Path" msgstr "Exportera Projekt" @@ -9719,18 +9774,6 @@ msgid "Device" msgstr "Enhet" #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Shift+" -msgstr "Skift+" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Alt+" -msgstr "Alt+" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Control+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp #, fuzzy msgid "Press a Key..." msgstr "Tryck pÃ¥ en Knapp..." @@ -10779,9 +10822,8 @@ msgid "Profiler" msgstr "" #: editor/script_editor_debugger.cpp -#, fuzzy msgid "Network Profiler" -msgstr "Exportera Projekt" +msgstr "Nätverksprofilerare" #: editor/script_editor_debugger.cpp msgid "Monitor" @@ -11509,7 +11551,7 @@ msgid "Can't create function of nodes from nodes of multiple functions." msgstr "" #: modules/visual_script/visual_script_editor.cpp -msgid "Select atleast one node with sequence port." +msgid "Select at least one node with sequence port." msgstr "" #: modules/visual_script/visual_script_editor.cpp @@ -11828,11 +11870,21 @@ msgstr "" #: platform/uwp/export/export.cpp #, fuzzy +msgid "Invalid package short name." +msgstr "Ogiltigt namn." + +#: platform/uwp/export/export.cpp +#, fuzzy msgid "Invalid package unique name." msgstr "Ogiltigt namn." #: platform/uwp/export/export.cpp #, fuzzy +msgid "Invalid package publisher display name." +msgstr "Ogiltigt namn." + +#: platform/uwp/export/export.cpp +#, fuzzy msgid "Invalid product GUID." msgstr "Projektnamn:" @@ -12352,7 +12404,7 @@ msgstr "" #: scene/gui/tree.cpp msgid "(Other)" -msgstr "" +msgstr "(Annat)" #: scene/main/scene_tree.cpp msgid "" @@ -12399,6 +12451,15 @@ msgstr "" msgid "Constants cannot be modified." msgstr "" +#~ msgid "Pause the scene" +#~ msgstr "Pausa scenen" + +#~ msgid "Shift+" +#~ msgstr "Skift+" + +#~ msgid "Alt+" +#~ msgstr "Alt+" + #, fuzzy #~ msgid "Add input +" #~ msgstr "Lägg till Signal" diff --git a/editor/translations/ta.po b/editor/translations/ta.po index 08faf73931..5035e886c5 100644 --- a/editor/translations/ta.po +++ b/editor/translations/ta.po @@ -2788,7 +2788,7 @@ msgid "Play" msgstr "" #: editor/editor_node.cpp -msgid "Pause the scene" +msgid "Pause the scene execution for debugging." msgstr "" #: editor/editor_node.cpp @@ -3454,6 +3454,10 @@ msgid "New Inherited Scene" msgstr "" #: editor/filesystem_dock.cpp +msgid "Set As Main Scene" +msgstr "" + +#: editor/filesystem_dock.cpp msgid "Open Scenes" msgstr "" @@ -4169,6 +4173,20 @@ msgid "" msgstr "" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Anim Clips" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Audio Clips" +msgstr "அசைவூடà¯à®Ÿà¯ பாதை சேரà¯" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Functions" +msgstr "அனைதà¯à®¤à¯ தேரà¯à®µà¯à®•à®³à¯" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/animation_state_machine_editor.cpp msgid "Node Renamed" msgstr "" @@ -4840,6 +4858,14 @@ msgid "Grid Step:" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Primary Line Every:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "steps" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotation Offset:" msgstr "" @@ -4848,6 +4874,10 @@ msgid "Rotation Step:" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale Step:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move Vertical Guide" msgstr "" @@ -4930,6 +4960,20 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"Overrides game camera with editor viewport camera." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"No game instance running." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp msgid "Lock Selected" msgstr "" @@ -5068,6 +5112,10 @@ msgid "Use Rotation Snap" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Use Scale Snap" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap Relative" msgstr "" @@ -5207,7 +5255,7 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" -"Auto insert keys when objects are translated, rotated on scaled (based on " +"Auto insert keys when objects are translated, rotated or scaled (based on " "mask).\n" "Keys are only added to existing tracks, no new tracks will be created.\n" "Keys must be inserted manually for the first time." @@ -8055,7 +8103,7 @@ msgid "Dodge operator." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "HardLight operator" +msgid "HardLight operator." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8644,9 +8692,10 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Custom Godot Shader Language expression, which placed on top of the resulted " -"shader. You can place various function definitions inside and call it later " -"in the Expressions. You can also declare varyings, uniforms and constants." +"Custom Godot Shader Language expression, which is placed on top of the " +"resulted shader. You can place various function definitions inside and call " +"it later in the Expressions. You can also declare varyings, uniforms and " +"constants." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8755,6 +8804,12 @@ msgid "Add..." msgstr "" #: editor/project_export.cpp +msgid "" +"If checked, the preset will be available for use in one-click deploy.\n" +"Only one preset per platform may be marked as runnable." +msgstr "" + +#: editor/project_export.cpp msgid "Export Path" msgstr "" @@ -9191,18 +9246,6 @@ msgid "Device" msgstr "" #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Shift+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Alt+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Control+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "Press a Key..." msgstr "" @@ -10905,7 +10948,7 @@ msgid "Can't create function of nodes from nodes of multiple functions." msgstr "" #: modules/visual_script/visual_script_editor.cpp -msgid "Select atleast one node with sequence port." +msgid "Select at least one node with sequence port." msgstr "" #: modules/visual_script/visual_script_editor.cpp @@ -11210,10 +11253,18 @@ msgid "Using default boot splash image." msgstr "" #: platform/uwp/export/export.cpp +msgid "Invalid package short name." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package unique name." msgstr "" #: platform/uwp/export/export.cpp +msgid "Invalid package publisher display name." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid product GUID." msgstr "" diff --git a/editor/translations/te.po b/editor/translations/te.po index 617809b62d..4ad5ae8777 100644 --- a/editor/translations/te.po +++ b/editor/translations/te.po @@ -2762,7 +2762,7 @@ msgid "Play" msgstr "" #: editor/editor_node.cpp -msgid "Pause the scene" +msgid "Pause the scene execution for debugging." msgstr "" #: editor/editor_node.cpp @@ -3427,6 +3427,10 @@ msgid "New Inherited Scene" msgstr "" #: editor/filesystem_dock.cpp +msgid "Set As Main Scene" +msgstr "" + +#: editor/filesystem_dock.cpp msgid "Open Scenes" msgstr "" @@ -4136,6 +4140,18 @@ msgid "" msgstr "" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Anim Clips" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Audio Clips" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Functions" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/animation_state_machine_editor.cpp msgid "Node Renamed" msgstr "" @@ -4802,6 +4818,14 @@ msgid "Grid Step:" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Primary Line Every:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "steps" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotation Offset:" msgstr "" @@ -4810,6 +4834,10 @@ msgid "Rotation Step:" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale Step:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move Vertical Guide" msgstr "" @@ -4891,6 +4919,20 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"Overrides game camera with editor viewport camera." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"No game instance running." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp msgid "Lock Selected" msgstr "" @@ -5025,6 +5067,10 @@ msgid "Use Rotation Snap" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Use Scale Snap" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap Relative" msgstr "" @@ -5164,7 +5210,7 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" -"Auto insert keys when objects are translated, rotated on scaled (based on " +"Auto insert keys when objects are translated, rotated or scaled (based on " "mask).\n" "Keys are only added to existing tracks, no new tracks will be created.\n" "Keys must be inserted manually for the first time." @@ -7992,7 +8038,7 @@ msgid "Dodge operator." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "HardLight operator" +msgid "HardLight operator." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8579,9 +8625,10 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Custom Godot Shader Language expression, which placed on top of the resulted " -"shader. You can place various function definitions inside and call it later " -"in the Expressions. You can also declare varyings, uniforms and constants." +"Custom Godot Shader Language expression, which is placed on top of the " +"resulted shader. You can place various function definitions inside and call " +"it later in the Expressions. You can also declare varyings, uniforms and " +"constants." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8690,6 +8737,12 @@ msgid "Add..." msgstr "" #: editor/project_export.cpp +msgid "" +"If checked, the preset will be available for use in one-click deploy.\n" +"Only one preset per platform may be marked as runnable." +msgstr "" + +#: editor/project_export.cpp msgid "Export Path" msgstr "" @@ -9126,18 +9179,6 @@ msgid "Device" msgstr "" #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Shift+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Alt+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Control+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "Press a Key..." msgstr "" @@ -10826,7 +10867,7 @@ msgid "Can't create function of nodes from nodes of multiple functions." msgstr "" #: modules/visual_script/visual_script_editor.cpp -msgid "Select atleast one node with sequence port." +msgid "Select at least one node with sequence port." msgstr "" #: modules/visual_script/visual_script_editor.cpp @@ -11131,10 +11172,18 @@ msgid "Using default boot splash image." msgstr "" #: platform/uwp/export/export.cpp +msgid "Invalid package short name." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package unique name." msgstr "" #: platform/uwp/export/export.cpp +msgid "Invalid package publisher display name." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid product GUID." msgstr "" diff --git a/editor/translations/th.po b/editor/translations/th.po index 2bd671a4f4..af1bb53b9e 100644 --- a/editor/translations/th.po +++ b/editor/translations/th.po @@ -2981,8 +2981,8 @@ msgid "Play" msgstr "เล่น" #: editor/editor_node.cpp -msgid "Pause the scene" -msgstr "หยุดชั่วคราว" +msgid "Pause the scene execution for debugging." +msgstr "" #: editor/editor_node.cpp msgid "Pause Scene" @@ -3678,6 +3678,11 @@ msgstr "สืบทà¸à¸”ฉาà¸à¹ƒà¸«à¸¡à¹ˆ..." #: editor/filesystem_dock.cpp #, fuzzy +msgid "Set As Main Scene" +msgstr "ฉาà¸à¸«à¸¥à¸±à¸" + +#: editor/filesystem_dock.cpp +#, fuzzy msgid "Open Scenes" msgstr "เปิดไฟล์ฉาà¸" @@ -4468,6 +4473,21 @@ msgid "" msgstr "" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Anim Clips" +msgstr "คลิป" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Audio Clips" +msgstr "ตัวรับเสียง" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Functions" +msgstr "ฟังà¸à¹Œà¸Šà¸±à¸™:" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/animation_state_machine_editor.cpp #, fuzzy msgid "Node Renamed" @@ -5174,6 +5194,15 @@ msgid "Grid Step:" msgstr "ระยะห่างเส้น:" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Primary Line Every:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "steps" +msgstr "2 ระดับ" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotation Offset:" msgstr "à¸à¸‡à¸¨à¸²à¹€à¸£à¸´à¹ˆà¸¡à¸•à¹‰à¸™:" @@ -5183,6 +5212,11 @@ msgstr "ช่วงà¸à¸‡à¸¨à¸²:" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy +msgid "Scale Step:" +msgstr "à¸à¸±à¸•à¸£à¸²à¸ªà¹ˆà¸§à¸™:" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy msgid "Move Vertical Guide" msgstr "เลื่à¸à¸™à¹€à¸ªà¹‰à¸™à¸™à¸³à¹à¸™à¸§à¸•à¸±à¹‰à¸‡" @@ -5276,6 +5310,20 @@ msgstr "à¹à¸à¹‰à¹„ขà¸à¸²à¸£à¸•à¸£à¸¶à¸‡" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"Overrides game camera with editor viewport camera." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"No game instance running." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp #, fuzzy msgid "Lock Selected" msgstr "เครื่à¸à¸‡à¸¡à¸·à¸à¹€à¸¥à¸·à¸à¸" @@ -5427,6 +5475,11 @@ msgid "Use Rotation Snap" msgstr "จำà¸à¸±à¸”à¸à¸²à¸£à¸«à¸¡à¸¸à¸™" #: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Use Scale Snap" +msgstr "จำà¸à¸±à¸”à¸à¸²à¸£à¹€à¸„ลื่à¸à¸™à¸¢à¹‰à¸²à¸¢" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap Relative" msgstr "จำà¸à¸±à¸”โดยใช้ตำà¹à¸«à¸™à¹ˆà¸‡à¸›à¸±à¸ˆà¸ˆà¸¸à¸šà¸±à¸™" @@ -5580,7 +5633,7 @@ msgstr "เพิ่มคีย์ (à¹à¸—ร็à¸à¸—ี่มีà¸à¸¢à¸¹à¹ˆà #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" -"Auto insert keys when objects are translated, rotated on scaled (based on " +"Auto insert keys when objects are translated, rotated or scaled (based on " "mask).\n" "Keys are only added to existing tracks, no new tracks will be created.\n" "Keys must be inserted manually for the first time." @@ -8654,8 +8707,9 @@ msgid "Dodge operator." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "HardLight operator" -msgstr "" +#, fuzzy +msgid "HardLight operator." +msgstr "à¹à¸à¹‰à¹„ขเครื่à¸à¸‡à¸«à¸¡à¸²à¸¢à¸ªà¹€à¸à¸¥à¸²à¸£à¹Œ" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Lighten operator." @@ -9259,9 +9313,10 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Custom Godot Shader Language expression, which placed on top of the resulted " -"shader. You can place various function definitions inside and call it later " -"in the Expressions. You can also declare varyings, uniforms and constants." +"Custom Godot Shader Language expression, which is placed on top of the " +"resulted shader. You can place various function definitions inside and call " +"it later in the Expressions. You can also declare varyings, uniforms and " +"constants." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -9376,6 +9431,12 @@ msgid "Add..." msgstr "เพิ่ม..." #: editor/project_export.cpp +msgid "" +"If checked, the preset will be available for use in one-click deploy.\n" +"Only one preset per platform may be marked as runnable." +msgstr "" + +#: editor/project_export.cpp #, fuzzy msgid "Export Path" msgstr "ส่งà¸à¸à¸à¹‚ปรเจà¸à¸•à¹Œ" @@ -9846,18 +9907,6 @@ msgid "Device" msgstr "à¸à¸¸à¸›à¸à¸£à¸“์" #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Shift+" -msgstr "Shift+" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Alt+" -msgstr "Alt+" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Control+" -msgstr "Control+" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "Press a Key..." msgstr "à¸à¸”ปุ่ม..." @@ -11666,7 +11715,7 @@ msgid "Can't create function of nodes from nodes of multiple functions." msgstr "" #: modules/visual_script/visual_script_editor.cpp -msgid "Select atleast one node with sequence port." +msgid "Select at least one node with sequence port." msgstr "" #: modules/visual_script/visual_script_editor.cpp @@ -11983,10 +12032,20 @@ msgstr "ใช้ภาพขณะเริ่มเà¸à¸¡à¸›à¸£à¸´à¸¢à¸²à¸¢" #: platform/uwp/export/export.cpp #, fuzzy +msgid "Invalid package short name." +msgstr "ชื่à¸à¸„ลาสไม่ถูà¸à¸•à¹‰à¸à¸‡" + +#: platform/uwp/export/export.cpp +#, fuzzy msgid "Invalid package unique name." msgstr "ชื่à¸à¹€à¸‰à¸žà¸²à¸°à¹„ม่ถูà¸à¸•à¹‰à¸à¸‡" #: platform/uwp/export/export.cpp +#, fuzzy +msgid "Invalid package publisher display name." +msgstr "ชื่à¸à¹€à¸‰à¸žà¸²à¸°à¹„ม่ถูà¸à¸•à¹‰à¸à¸‡" + +#: platform/uwp/export/export.cpp msgid "Invalid product GUID." msgstr "GUID ขà¸à¸‡à¹‚ปรà¹à¸à¸£à¸¡à¹„ม่ถูà¸à¸•à¹‰à¸à¸‡" @@ -12586,6 +12645,18 @@ msgstr "" msgid "Constants cannot be modified." msgstr "" +#~ msgid "Pause the scene" +#~ msgstr "หยุดชั่วคราว" + +#~ msgid "Shift+" +#~ msgstr "Shift+" + +#~ msgid "Alt+" +#~ msgstr "Alt+" + +#~ msgid "Control+" +#~ msgstr "Control+" + #, fuzzy #~ msgid "Snap to Grid" #~ msgstr "จำà¸à¸±à¸”ด้วยเส้นตาราง" diff --git a/editor/translations/tr.po b/editor/translations/tr.po index 2673676cb8..6ef831b3be 100644 --- a/editor/translations/tr.po +++ b/editor/translations/tr.po @@ -38,12 +38,15 @@ # Bera Koklu <bkoklu001@student.hampton.k12.va.us>, 2019. # Mehmet AKDEMÄ°R <mamoo81@gmail.com>, 2019. # Oguz Ersen <oguzersen@protonmail.com>, 2019. +# isimsiz <isimsiz@mailinator.com>, 2019. +# Muhammet Mustafa Tozlu <m.mustafatozlu@gmail.com>, 2019. +# HALÄ°L ATAÅž <halillatass@gmail.com>, 2019. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2019-10-27 07:47+0000\n" -"Last-Translator: Oguz Ersen <oguzersen@protonmail.com>\n" +"PO-Revision-Date: 2019-11-20 14:07+0000\n" +"Last-Translator: HALÄ°L ATAÅž <halillatass@gmail.com>\n" "Language-Team: Turkish <https://hosted.weblate.org/projects/godot-engine/" "godot/tr/>\n" "Language: tr\n" @@ -51,7 +54,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 3.9.1-dev\n" +"X-Generator: Weblate 3.10-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -530,11 +533,8 @@ msgid "Warning: Editing imported animation" msgstr "Uyarı: İçe aktarılan animasyonu düzenleme" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Select an AnimationPlayer node to create and edit animations." -msgstr "" -"Sahne AÄŸacı'ndan animasyonları düzenleyebilmek için bir AnimationPlayer " -"seçin." +msgstr "Animasyonları düzenleyebilmek için Animasyon Oynatıcı düğümü seçin." #: editor/animation_track_editor.cpp msgid "Only show tracks from nodes selected in tree." @@ -666,9 +666,8 @@ msgid "Scale Ratio:" msgstr "Ölçek Oranı:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Select Tracks to Copy" -msgstr "Kopyalanacak izleri seç:" +msgstr "Kopyalanacak izleri seç" #: editor/animation_track_editor.cpp editor/editor_log.cpp #: editor/editor_properties.cpp @@ -680,9 +679,8 @@ msgid "Copy" msgstr "Tıpkıla" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Select All/None" -msgstr "Hiçbir Åžey Seçilmedi" +msgstr "Tümünü Seç/Seçme" #: editor/animation_track_editor_plugins.cpp msgid "Add Audio Track Clip" @@ -1610,9 +1608,8 @@ msgid "Asset Library" msgstr "Varlık Kütüphanesi" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Scene Tree Editing" -msgstr "Sahne AÄŸacı (Düğümler):" +msgstr "Sahne AÄŸacı Düzenleme" #: editor/editor_feature_profile.cpp msgid "Import Dock" @@ -1900,13 +1897,12 @@ msgid "ScanSources" msgstr "KaynaklarıTara" #: editor/editor_file_system.cpp -#, fuzzy msgid "" "There are multiple importers for different types pointing to file %s, import " "aborted" msgstr "" -"%s dosyasına iÅŸaret eden farklı tipler için birden fazla içe aktarım var, " -"içe aktarma iptal edildi" +"%s dosyasına iÅŸaret eden farklı türlerde içe aktarılabilir öge var, içe " +"aktarım iptal edildi" #: editor/editor_file_system.cpp msgid "(Re)Importing Assets" @@ -2277,7 +2273,6 @@ msgstr "" "panelinden ayarlarını deÄŸiÅŸtirin ve yeniden içe aktarın." #: editor/editor_node.cpp -#, fuzzy msgid "" "This scene was imported, so changes to it won't be kept.\n" "Instancing it or inheriting will allow making changes to it.\n" @@ -2285,9 +2280,8 @@ msgid "" "understand this workflow." msgstr "" "Bu sahne içe aktarılmış, yani yaptığınız deÄŸiÅŸiklikler saklanmayacak.\n" -"Örnekleme veya devretme yapmak, üzerinde deÄŸiÅŸiklik yapmaya izin " -"verecektir.\n" -"Lütfen, bu iÅŸ akışını daha iyi anlamak için dökümantasyondaki sahneleri içe " +"Örnekleme veya Aktarım yaparak deÄŸiÅŸiklik mümkün olacaktır.\n" +"Lütfen, bu iÅŸ akışını daha iyi anlamak için belgelerdeki, sahneleri içe " "aktarma kısmını okuyunuz." #: editor/editor_node.cpp @@ -2717,9 +2711,8 @@ msgid "Export..." msgstr "Dışa Aktar..." #: editor/editor_node.cpp -#, fuzzy msgid "Install Android Build Template..." -msgstr "Android Yapı Åžablonunu Yükle ..." +msgstr "Android Ä°nÅŸa Åžablonunu Yükle ..." #: editor/editor_node.cpp msgid "Open Project Data Folder" @@ -2920,8 +2913,8 @@ msgid "Play" msgstr "Oynat" #: editor/editor_node.cpp -msgid "Pause the scene" -msgstr "Sahneyi duraklat" +msgid "Pause the scene execution for debugging." +msgstr "" #: editor/editor_node.cpp msgid "Pause Scene" @@ -3011,17 +3004,19 @@ msgid "" "the \"Use Custom Build\" option should be enabled in the Android export " "preset." msgstr "" +"Bu, kaynak ÅŸablonlarını \"res://android/build\" yoluna yükleyerek, projenizi " +"isteÄŸe dayalı Android inÅŸasına ayarlayacaktır." #: editor/editor_node.cpp -#, fuzzy msgid "" "The Android build template is already installed in this project and it won't " "be overwritten.\n" "Remove the \"res://android/build\" directory manually before attempting this " "operation again." msgstr "" -"Android yapı ÅŸablonu zaten yüklü ve üzerine yazılmayacak.\n" -"Bu iÅŸlemi tekrar denemeden önce \"build\" dizinini el ile kaldırın." +"Bu projede Android yapı ÅŸablonu zaten yüklü ve üzerine yazılmayacak.\n" +"Bu iÅŸlemi tekrar denemeden önce \"res://android/build\" dizinini el ile " +"kaldırın." #: editor/editor_node.cpp msgid "Import Templates From ZIP File" @@ -3193,7 +3188,6 @@ msgid "Assign..." msgstr "Ata..." #: editor/editor_properties.cpp -#, fuzzy msgid "Invalid RID" msgstr "Geçersiz Yol" @@ -3235,7 +3229,6 @@ msgid "New Script" msgstr "Yeni Betik" #: editor/editor_properties.cpp editor/scene_tree_dock.cpp -#, fuzzy msgid "Extend Script" msgstr "Betik Aç" @@ -3343,9 +3336,8 @@ msgid "Import From Node:" msgstr "Düğümden İçe Aktar:" #: editor/export_template_manager.cpp -#, fuzzy msgid "Redownload" -msgstr "Yeniden Yükle" +msgstr "Yeniden Ä°ndir" #: editor/export_template_manager.cpp msgid "Uninstall" @@ -3451,13 +3443,12 @@ msgid "Cannot remove temporary file:" msgstr "Geçici dosya kaldırılamıyor:" #: editor/export_template_manager.cpp -#, fuzzy msgid "" "Templates installation failed.\n" "The problematic templates archives can be found at '%s'." msgstr "" -"Åžablon yüklemesi baÅŸarısız oldu. Sorunlu ÅŸablon arÅŸivi ÅŸurada bulunabilir: " -"'%s'." +"Åžablon yüklemesi baÅŸarısız oldu.\n" +"Sorunlu ÅŸablon arÅŸivi ÅŸurada bulunabilir: '%s'." #: editor/export_template_manager.cpp msgid "Error requesting URL:" @@ -3580,9 +3571,8 @@ msgid "No name provided." msgstr "SaÄŸlanan isim yok." #: editor/filesystem_dock.cpp -#, fuzzy msgid "Provided name contains invalid characters." -msgstr "SaÄŸlanan isim geçersiz karakterler içeriyor" +msgstr "SaÄŸlanan isim geçersiz karakterler içeriyor." #: editor/filesystem_dock.cpp msgid "A file or folder with this name already exists." @@ -3613,6 +3603,11 @@ msgid "New Inherited Scene" msgstr "Yeni Miras Alınmış Sahne" #: editor/filesystem_dock.cpp +#, fuzzy +msgid "Set As Main Scene" +msgstr "Ana Sahne" + +#: editor/filesystem_dock.cpp msgid "Open Scenes" msgstr "Sahneleri Aç" @@ -3621,12 +3616,10 @@ msgid "Instance" msgstr "Örnek" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Add to Favorites" msgstr "Favorilere ekle" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Remove from Favorites" msgstr "Favorilerden kaldır" @@ -3651,9 +3644,8 @@ msgid "Move To..." msgstr "Åžuraya Taşı..." #: editor/filesystem_dock.cpp -#, fuzzy msgid "New Scene..." -msgstr "Yeni Sahne" +msgstr "Yeni Sahne..." #: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp msgid "New Script..." @@ -3693,7 +3685,6 @@ msgid "Re-Scan Filesystem" msgstr "Dosya Düzenini Yeniden Tara" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Toggle Split Mode" msgstr "Bölme modunu Aç / Kapat" @@ -3746,13 +3737,12 @@ msgid "Filters:" msgstr "Süzgeçler:" #: editor/find_in_files.cpp -#, fuzzy msgid "" "Include the files with the following extensions. Add or remove them in " "ProjectSettings." msgstr "" -"Bu uzantıdaki dosyaları dahil et. Uzantıları ProjeAyarlarından ekle ya da " -"sil." +"Åžu uzantılardaki dosyaları dahil et. Proje Ayarlarından ekleme ya da silme " +"yapılabilir." #: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp @@ -3804,9 +3794,8 @@ msgid "Invalid group name." msgstr "Geçersiz grup adı." #: editor/groups_editor.cpp -#, fuzzy msgid "Rename Group" -msgstr "Grupları Düzenle" +msgstr "Grubu Yeniden Adlandır" #: editor/groups_editor.cpp msgid "Delete Group" @@ -3817,7 +3806,6 @@ msgid "Groups" msgstr "Gruplar" #: editor/groups_editor.cpp -#, fuzzy msgid "Nodes Not in Group" msgstr "Düğümler Grupta DeÄŸil" @@ -4048,9 +4036,8 @@ msgid "MultiNode Set" msgstr "MultiNode Kur" #: editor/node_dock.cpp -#, fuzzy msgid "Select a single node to edit its signals and groups." -msgstr "Sinyalleri ve Grupları düzenlemek için bir Düğüm seçin." +msgstr "Sinyallerini ve Gruplarını düzenlemek için bir Düğüm seçin." #: editor/plugin_config_dialog.cpp msgid "Edit a Plugin" @@ -4167,7 +4154,6 @@ msgid "Add Animation Point" msgstr "Animasyon Noktası Ekle" #: editor/plugins/animation_blend_space_1d_editor.cpp -#, fuzzy msgid "Remove BlendSpace1D Point" msgstr "BlendSpace1D Noktasını Kaldır" @@ -4221,9 +4207,8 @@ msgid "Open Animation Node" msgstr "Animasyon Düğümünü Aç" #: editor/plugins/animation_blend_space_2d_editor.cpp -#, fuzzy msgid "Triangle already exists." -msgstr "Üçgen zaten var" +msgstr "Üçgen zaten var." #: editor/plugins/animation_blend_space_2d_editor.cpp msgid "Add Triangle" @@ -4234,7 +4219,6 @@ msgid "Change BlendSpace2D Limits" msgstr "BlendSpace2D Sınırlarını DeÄŸiÅŸtir" #: editor/plugins/animation_blend_space_2d_editor.cpp -#, fuzzy msgid "Change BlendSpace2D Labels" msgstr "BlendSpace2D Etiketlerini DeÄŸiÅŸtir" @@ -4286,18 +4270,16 @@ msgstr "Süzgeçleri Düzenle" #: editor/plugins/animation_blend_tree_editor_plugin.cpp msgid "Output node can't be added to the blend tree." -msgstr "" +msgstr "Çıktı düğümü iÅŸleme aÄŸacına eklenemiyor." #: editor/plugins/animation_blend_tree_editor_plugin.cpp -#, fuzzy msgid "Add Node to BlendTree" -msgstr "AÄŸaçtan Düğüm(ler) Ekle" +msgstr "Düğümü Ä°ÅŸleme düğümüne ekle" #: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Node Moved" -msgstr "Biçimi Taşı" +msgstr "Düğüm Taşındı" #: editor/plugins/animation_blend_tree_editor_plugin.cpp msgid "Unable to connect, port may be in use or connection may be invalid." @@ -4342,7 +4324,7 @@ msgstr "Animasyon oynatıcısı atanmadı, parça isimleri alınamıyor." #: editor/plugins/animation_blend_tree_editor_plugin.cpp msgid "Player path set is invalid, so unable to retrieve track names." -msgstr "" +msgstr "Oyuncu yolu geçersiz, haliyle iz isimleri alınamadı." #: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/root_motion_editor_plugin.cpp @@ -4350,6 +4332,23 @@ msgid "" "Animation player has no valid root node path, so unable to retrieve track " "names." msgstr "" +"Animasyon oynatıcı geçerli bir kök dizine sahip deÄŸil, haliyle iz isimleri " +"alınamadı." + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Anim Clips" +msgstr "Animasyon Klipleri:" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Audio Clips" +msgstr "Ses Parçası:" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Functions" +msgstr "Ä°ÅŸlevler:" #: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/animation_state_machine_editor.cpp @@ -4426,14 +4425,12 @@ msgid "Duplicate Animation" msgstr "Animasyonu ÇoÄŸalt" #: editor/plugins/animation_player_editor_plugin.cpp -#, fuzzy msgid "No animation to copy!" -msgstr "HATA: Kopyalanacak animasyon yok!" +msgstr "Kopyalanacak animasyon yok!" #: editor/plugins/animation_player_editor_plugin.cpp -#, fuzzy msgid "No animation resource on clipboard!" -msgstr "HATA: panoda animasyon kaynağı yok!" +msgstr "Panoda animasyon kaynağı yok!" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Pasted Animation" @@ -4444,9 +4441,8 @@ msgid "Paste Animation" msgstr "Animasyonu Yapıştır" #: editor/plugins/animation_player_editor_plugin.cpp -#, fuzzy msgid "No animation to edit!" -msgstr "HATA: Düzenlenecek animasyon yok!" +msgstr "Düzenlenecek animasyon yok!" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Play selected animation backwards from current pos. (A)" @@ -4486,14 +4482,12 @@ msgid "Animation" msgstr "Animasyon" #: editor/plugins/animation_player_editor_plugin.cpp -#, fuzzy msgid "Edit Transitions..." -msgstr "GeçiÅŸler" +msgstr "GeçiÅŸleri Düzenle..." #: editor/plugins/animation_player_editor_plugin.cpp -#, fuzzy msgid "Open in Inspector" -msgstr "Düzenleyicide Aç" +msgstr "Gözetmen Bölümünde Aç" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Display list of animations in player." @@ -4508,9 +4502,8 @@ msgid "Enable Onion Skinning" msgstr "Araları Doldurmayı EtkinleÅŸtir" #: editor/plugins/animation_player_editor_plugin.cpp -#, fuzzy msgid "Onion Skinning Options" -msgstr "Araları Doldurma" +msgstr "Araları Doldurma Seçenekleri" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Directions" @@ -4553,9 +4546,8 @@ msgid "Include Gizmos (3D)" msgstr "Gizmoları Dahil Et (3B)" #: editor/plugins/animation_player_editor_plugin.cpp -#, fuzzy msgid "Pin AnimationPlayer" -msgstr "Animasyonu Yapıştır" +msgstr "Animasyon Oynatıcıyı Sabitle" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Create New Animation" @@ -4585,14 +4577,12 @@ msgid "Cross-Animation Blend Times" msgstr "Çapraz-Animasyon Karışma Süreleri" #: editor/plugins/animation_state_machine_editor.cpp -#, fuzzy msgid "Move Node" -msgstr "Biçimi Taşı" +msgstr "Düğümü Taşı" #: editor/plugins/animation_state_machine_editor.cpp -#, fuzzy msgid "Add Transition" -msgstr "Çeviri Ekle" +msgstr "GeçiÅŸ Ekle" #: editor/plugins/animation_state_machine_editor.cpp #: modules/visual_script/visual_script_editor.cpp @@ -4600,9 +4590,8 @@ msgid "Add Node" msgstr "Düğüm Ekle" #: editor/plugins/animation_state_machine_editor.cpp -#, fuzzy msgid "End" -msgstr "Son(lar)" +msgstr "BitiÅŸ" #: editor/plugins/animation_state_machine_editor.cpp msgid "Immediate" @@ -4622,22 +4611,19 @@ msgstr "Seyahat" #: editor/plugins/animation_state_machine_editor.cpp msgid "Start and end nodes are needed for a sub-transition." -msgstr "" +msgstr "Alt geçiÅŸ için baÅŸlangıç ve bitiÅŸ düğümleri gerekli." #: editor/plugins/animation_state_machine_editor.cpp -#, fuzzy msgid "No playback resource set at path: %s." -msgstr "Kaynak yolunda deÄŸil." +msgstr "%s: adresinde arka plan oynatma kaynağı ayarlanmadı." #: editor/plugins/animation_state_machine_editor.cpp -#, fuzzy msgid "Node Removed" -msgstr "Silinen:" +msgstr "Düğüm Silindi" #: editor/plugins/animation_state_machine_editor.cpp -#, fuzzy msgid "Transition Removed" -msgstr "GeçiÅŸ Düğümü" +msgstr "GeçiÅŸ Silindi" #: editor/plugins/animation_state_machine_editor.cpp msgid "Set Start Node (Autoplay)" @@ -4654,32 +4640,32 @@ msgstr "" "Yeni baÄŸlantılar için Shift+LMB." #: editor/plugins/animation_state_machine_editor.cpp -#, fuzzy msgid "Create new nodes." -msgstr "Yeni %s oluÅŸtur" +msgstr "Yeni düğümler oluÅŸtur." #: editor/plugins/animation_state_machine_editor.cpp -#, fuzzy msgid "Connect nodes." -msgstr "Düğümleri BaÄŸla" +msgstr "Düğümleri BaÄŸla." #: editor/plugins/animation_state_machine_editor.cpp -#, fuzzy msgid "Remove selected node or transition." -msgstr "Seçilen izleri sil." +msgstr "Seçilen düğüm ya da geçiÅŸi sil." #: editor/plugins/animation_state_machine_editor.cpp msgid "Toggle autoplay this animation on start, restart or seek to zero." msgstr "" +"Bu animasyonu baÅŸlangıçta otomatik oynat ayarını, yeniden baÅŸlat ya da baÅŸa " +"sar ÅŸeklinde ayarla." #: editor/plugins/animation_state_machine_editor.cpp msgid "Set the end animation. This is useful for sub-transitions." msgstr "" +"Animasyon bitiÅŸini ayarla. Bu alt-geçiÅŸler oluÅŸturmak için kullanışlı " +"olacaktır." #: editor/plugins/animation_state_machine_editor.cpp -#, fuzzy msgid "Transition: " -msgstr "GeçiÅŸ" +msgstr "GeçiÅŸ: " #: editor/plugins/animation_tree_editor_plugin.cpp #: editor/plugins/animation_tree_player_editor_plugin.cpp @@ -4851,14 +4837,12 @@ msgid "Request failed, return code:" msgstr "Ä°stem baÅŸarısız, dönen kod:" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Request failed." -msgstr "Ä°stek BaÅŸarısız Oldu." +msgstr "Ä°stek baÅŸarısız." #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Cannot save response to:" -msgstr "Tema dosyaya kaydedilemiyor:" +msgstr "Yanıt dosyaya kaydedilemiyor:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Write error." @@ -4869,19 +4853,16 @@ msgid "Request failed, too many redirects" msgstr "Ä°stem BaÅŸarısız, çok fazla yönlendirme" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Redirect loop." -msgstr "Yönlendirme Döngüsü." +msgstr "Döngüyü yönlendir." #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Request failed, timeout" -msgstr "Ä°stem baÅŸarısız, dönen kod:" +msgstr "Ä°stem baÅŸarısız, zaman aşımı" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Timeout." -msgstr "Zaman" +msgstr "Zaman aşımı." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Bad download hash, assuming file has been tampered with." @@ -4904,14 +4885,12 @@ msgid "Asset Download Error:" msgstr "Nesne Ä°ndirme Hatası:" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Downloading (%s / %s)..." -msgstr "Ä°ndiriliyor" +msgstr "Ä°ndiriliyor (%s / %s)..." #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Downloading..." -msgstr "Ä°ndiriliyor" +msgstr "Ä°ndiriliyor..." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Resolving..." @@ -4926,9 +4905,8 @@ msgid "Idle" msgstr "BoÅŸta" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Install..." -msgstr "Kur" +msgstr "Kur..." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Retry" @@ -4943,14 +4921,12 @@ msgid "Download for this asset is already in progress!" msgstr "Bu nesne için zaten sürdürülen bir indirme var!" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "First" -msgstr "ilk" +msgstr "Ä°lk" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Previous" -msgstr "Önceki sekme" +msgstr "Önceki" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Next" @@ -4966,17 +4942,15 @@ msgstr "Hepsi" #: editor/plugins/asset_library_editor_plugin.cpp msgid "No results for \"%s\"." -msgstr "" +msgstr "\"%s\" için sonuç yok." #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Import..." -msgstr "Yeniden İçe Aktar..." +msgstr "İçe Aktar..." #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Plugins..." -msgstr "Eklentiler" +msgstr "Eklentiler..." #: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp msgid "Sort:" @@ -4992,9 +4966,8 @@ msgid "Site:" msgstr "Yer:" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Support" -msgstr "Destek..." +msgstr "Destek" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Official" @@ -5005,7 +4978,6 @@ msgid "Testing" msgstr "Deneme" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Loading..." msgstr "Yükle..." @@ -5059,6 +5031,15 @@ msgid "Grid Step:" msgstr "Izgara Adımı:" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Primary Line Every:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "steps" +msgstr "2 kademe" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotation Offset:" msgstr "Dönme Kayması:" @@ -5068,84 +5049,80 @@ msgstr "Dönme Adımı:" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy +msgid "Scale Step:" +msgstr "Ölçekle:" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move Vertical Guide" msgstr "Dikey kılavuzu taşı" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Create Vertical Guide" -msgstr "Yeni dikey kılavuz oluÅŸtur" +msgstr "Dikey Kılavuz OluÅŸtur" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Remove Vertical Guide" msgstr "Dikey kılavuzu kaldır" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Move Horizontal Guide" msgstr "Yatay kılavuzu taşı" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Create Horizontal Guide" msgstr "Yeni yatay kılavuz oluÅŸtur" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Remove Horizontal Guide" msgstr "Yatay kılavuzu kaldır" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Create Horizontal and Vertical Guides" msgstr "Yeni yatay ve dikey kılavuzlar oluÅŸtur" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Move pivot" -msgstr "Ekseni Taşı" +msgstr "Merkezi Taşı" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Rotate CanvasItem" -msgstr "CanvasItem Düzenle" +msgstr "CanvasItem Döndür" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Move anchor" -msgstr "Eylemi Taşı" +msgstr "Çapayı Taşı" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Resize CanvasItem" -msgstr "CanvasItem Düzenle" +msgstr "CanvasItem Yeniden Boyutlandır" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Scale CanvasItem" -msgstr "CanvasItem Düzenle" +msgstr "CanvasItem Esnet" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Move CanvasItem" -msgstr "CanvasItem Düzenle" +msgstr "CanvasItem Taşı" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" "Children of containers have their anchors and margins values overridden by " "their parent." msgstr "" +"Taşıyıcıların çocukları, ebeveyn tarafından deÄŸiÅŸtirilen kendi çapa ve kenar " +"boÅŸlukları deÄŸerlerine sahip." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Presets for the anchors and margins values of a Control node." -msgstr "" +msgstr "Denetim düğümü için çapa ve kenar boÅŸluk deÄŸerleri Ön tanımlıları." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" "When active, moving Control nodes changes their anchors instead of their " "margins." msgstr "" +"Etkin olduÄŸunda, Denetim düğümünü taşımak kenar boÅŸluklarını deÄŸil çapa " +"noktasını deÄŸiÅŸtirir." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Anchors only" @@ -5161,46 +5138,53 @@ msgstr "Çapaları DeÄŸiÅŸtir" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy +msgid "" +"Game Camera Override\n" +"Overrides game camera with editor viewport camera." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"No game instance running." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp msgid "Lock Selected" -msgstr "Seçim Aracı" +msgstr "Seçimi Kilitle" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Unlock Selected" -msgstr "Seçilenleri Sil" +msgstr "Seçim Kilidini Aç" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Group Selected" -msgstr "Seçimi Kaldır" +msgstr "Seçilenleri Grupla" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Ungroup Selected" -msgstr "Seçimi Kaldır" +msgstr "Seçilen Grubu Dağıt" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Paste Pose" msgstr "DuruÅŸu Yapıştır" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Clear Guides" -msgstr "DuruÅŸu Temizle" +msgstr "Kılavuzları Temizle" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Create Custom Bone(s) from Node(s)" -msgstr "Örüntüden Emisyon Noktaları OluÅŸtur" +msgstr "Düğüm[ler]den istenilen biçimde Kemik[ler] oluÅŸtur" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Clear Bones" -msgstr "DuruÅŸu Temizle" +msgstr "Kemikleri Temizle" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Make IK Chain" @@ -5215,11 +5199,12 @@ msgid "" "Warning: Children of a container get their position and size determined only " "by their parent." msgstr "" +"Uyarı: Taşıyıcının alt ögeleri, konum ve büyüklük deÄŸerlerini üst ögeden " +"alırlar." #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/texture_region_editor_plugin.cpp #: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp -#, fuzzy msgid "Zoom Reset" msgstr "YakınlaÅŸmayı Sıfırla" @@ -5258,9 +5243,8 @@ msgstr "Döndürme Biçimi" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Scale Mode" -msgstr "Ölçek Biçimi (R)" +msgstr "Esnetme Åžekli" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -5280,40 +5264,39 @@ msgid "Pan Mode" msgstr "Kaydırma Biçimi" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Ruler Mode" -msgstr "Çalışma Kipi:" +msgstr "Cetvel Åžekli" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Toggle smart snapping." -msgstr "Yapılmayı aç/kapat" +msgstr "Akıllı Hizalama aç/kapat." #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Use Smart Snap" -msgstr "Yapışma Kullan" +msgstr "Akıllı Hizalama Kullan" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Toggle grid snapping." -msgstr "Yapılmayı aç/kapat" +msgstr "Izgara hizalama aç/kapat." #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Use Grid Snap" -msgstr "Izgara Yapışması" +msgstr "Izgara Hizalama" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Snapping Options" -msgstr "Yapışma ayarları" +msgstr "Hizalama Ayarları" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Use Rotation Snap" msgstr "Döndürme Yapışması Kullan" #: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Use Scale Snap" +msgstr "Akıllı Hizalama Kullan" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap Relative" msgstr "Göreceli Yapış" @@ -5322,9 +5305,8 @@ msgid "Use Pixel Snap" msgstr "Piksel Yapışması Kullan" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Smart Snapping" -msgstr "Akıllı yapışma" +msgstr "Akıllı Hizalama" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -5332,34 +5314,28 @@ msgid "Configure Snap..." msgstr "Yapışmayı Yapılandır..." #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Snap to Parent" -msgstr "Ebeveyne yapıştır" +msgstr "Ãœst ögeye Hizala" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Snap to Node Anchor" -msgstr "Düğüm çapasına yapıştır" +msgstr "Düğüm Çapasına hizala" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Snap to Node Sides" -msgstr "Düğüm kenalarına yapış" +msgstr "Düğüm Kenarlarına Hizala" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Snap to Node Center" -msgstr "Düğüm çapasına yapıştır" +msgstr "Düğüm Merkezine hizala" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Snap to Other Nodes" -msgstr "DiÄŸer düğümlere yapıştır" +msgstr "DiÄŸer düğümlere hizala" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Snap to Guides" -msgstr "Kılavuzlara yapış" +msgstr "Kılavuz çizgilere Hizala" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -5382,9 +5358,8 @@ msgid "Restores the object's children's ability to be selected." msgstr "Nesnenin çocuÄŸunun seçilebilme yeteneÄŸini geri kazandırır." #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Skeleton Options" -msgstr "Ä°skelet..." +msgstr "Ä°skelet Ayarları" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Show Bones" @@ -5392,12 +5367,11 @@ msgstr "Kemikleri Göster" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Make Custom Bone(s) from Node(s)" -msgstr "" +msgstr "Düğüm[ler]den istenilen ÅŸekilde kemik[ler] yarat" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Clear Custom Bones" -msgstr "Kemikleri Temizle" +msgstr "Ä°steÄŸe baÄŸlı kemikleri temizle" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -5405,9 +5379,8 @@ msgid "View" msgstr "Görüş" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Always Show Grid" -msgstr "Izgarayı Göster" +msgstr "Daima Izgarayı Göster" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Show Helpers" @@ -5431,7 +5404,7 @@ msgstr "Görüntükapısını Göster" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Show Group And Lock Icons" -msgstr "" +msgstr "Gruplama ve Kilitleme ikonlarını Göster" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Center Selection" @@ -5442,39 +5415,41 @@ msgid "Frame Selection" msgstr "Kafes Seçimi" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Preview Canvas Scale" -msgstr "Atlası Önizle" +msgstr "Tuval Esneme Önizlemesi" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Translation mask for inserting keys." -msgstr "" +msgstr "Anahtar Ekleme Çevirim Maskesi." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotation mask for inserting keys." -msgstr "" +msgstr "Anahtar Ekleme Döndürme Maskesi." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Scale mask for inserting keys." -msgstr "" +msgstr "Anahtar Ekleme Esnetme Maskesi." #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Insert keys (based on mask)." -msgstr "Anahtar Gir (Var Olan Ä°zler)" +msgstr "Anahtar Gir (maskeye dayalı olarak)." #: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy msgid "" -"Auto insert keys when objects are translated, rotated on scaled (based on " +"Auto insert keys when objects are translated, rotated or scaled (based on " "mask).\n" "Keys are only added to existing tracks, no new tracks will be created.\n" "Keys must be inserted manually for the first time." msgstr "" +"Anahtarları otomatik olarak yerleÅŸtir eÄŸer nesne yer deÄŸiÅŸtirdiyse, döndüyse " +"ya da esnetildiyse (maskeye göre).\n" +"Anahtarlar yalnızca mevcut izlere eklenir, yeni izler oluÅŸturulmayacak.\n" +"Ä°lkinde anahtarlar elle girilmeli." #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Auto Insert Key" -msgstr "Animasyon Anahtar Gir" +msgstr "Otomatik Anahtar Gir" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Insert Key (Existing Tracks)" @@ -5497,9 +5472,8 @@ msgid "Divide grid step by 2" msgstr "Izgara basamağını 2'ye böl" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Pan View" -msgstr "Arkadan Görünüm" +msgstr "Görünümü Sürükle" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Add %s" @@ -5524,7 +5498,6 @@ msgid "Error instancing scene from %s" msgstr "Åžundan: %s sahne örnekleme hatası" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Change Default Type" msgstr "Varsayılan tipi deÄŸiÅŸtir" @@ -5537,9 +5510,8 @@ msgstr "" "Sürükle & bırak + Alt: Düğüm türünü deÄŸiÅŸtir" #: editor/plugins/collision_polygon_editor_plugin.cpp -#, fuzzy msgid "Create Polygon3D" -msgstr "Çoklu OluÅŸturun" +msgstr "Polygon3D oluÅŸtur" #: editor/plugins/collision_polygon_editor_plugin.cpp msgid "Edit Poly" @@ -5562,9 +5534,8 @@ msgstr "Yayma Maskesini Yükle" #: editor/plugins/cpu_particles_editor_plugin.cpp #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -#, fuzzy msgid "Restart" -msgstr "Åžimdi Yeniden BaÅŸlat" +msgstr "Yeniden BaÅŸlat" #: editor/plugins/cpu_particles_2d_editor_plugin.cpp #: editor/plugins/particles_2d_editor_plugin.cpp @@ -5598,9 +5569,8 @@ msgid "Emission Colors" msgstr "Emisyon Renkleri" #: editor/plugins/cpu_particles_editor_plugin.cpp -#, fuzzy msgid "CPUParticles" -msgstr "Parçacıklar" +msgstr "CPUParçacıklar" #: editor/plugins/cpu_particles_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp @@ -5613,14 +5583,12 @@ msgid "Create Emission Points From Node" msgstr "Düğümden Emisyon Noktaları OluÅŸtur" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Flat 0" -msgstr "Düz0" +msgstr "Sade 0" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Flat 1" -msgstr "Düz1" +msgstr "Sade 1" #: editor/plugins/curve_editor_plugin.cpp editor/property_editor.cpp msgid "Ease In" @@ -5647,27 +5615,22 @@ msgid "Load Curve Preset" msgstr "EÄŸri Önayarı Yükle" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Add Point" msgstr "Nokta Ekle" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Remove Point" msgstr "Noktayı kaldır" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Left Linear" -msgstr "Sol doÄŸrusal" +msgstr "Sol DoÄŸrusal" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Right Linear" -msgstr "SaÄŸ doÄŸrusal" +msgstr "SaÄŸ DoÄŸrusal" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Load Preset" msgstr "Önayar yükle" @@ -5684,9 +5647,8 @@ msgid "Hold Shift to edit tangents individually" msgstr "Tanjantları tek tek düzenlemek için Shift'e basılı tut" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Right click to add point" -msgstr "SaÄŸ tıkla: Nokta Sil" +msgstr "Nokta eklemek için saÄŸ tıkla" #: editor/plugins/gi_probe_editor_plugin.cpp msgid "Bake GI Probe" @@ -5694,7 +5656,7 @@ msgstr "GI Prob PiÅŸir" #: editor/plugins/gradient_editor_plugin.cpp msgid "Gradient Edited" -msgstr "" +msgstr "Renk GeçiÅŸi Düzenlendi" #: editor/plugins/item_list_editor_plugin.cpp msgid "Item %d" @@ -5729,18 +5691,16 @@ msgid "This doesn't work on scene root!" msgstr "Bu, sahne kökünde çalışmaz!" #: editor/plugins/mesh_instance_editor_plugin.cpp -#, fuzzy msgid "Create Trimesh Static Shape" msgstr "Üçlü Örüntü Yüzeyi OluÅŸtur" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Failed creating shapes!" -msgstr "" +msgstr "Åžekil oluÅŸturma baÅŸarısız!" #: editor/plugins/mesh_instance_editor_plugin.cpp -#, fuzzy msgid "Create Convex Shape(s)" -msgstr "Dışbükey Åžekil OluÅŸtur" +msgstr "Dışbükey Åžekil[ler] OluÅŸtur" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Navigation Mesh" @@ -5796,9 +5756,8 @@ msgid "Create Trimesh Collision Sibling" msgstr "Üçlü Örüntü Çarpışma KardeÅŸi OluÅŸtur" #: editor/plugins/mesh_instance_editor_plugin.cpp -#, fuzzy msgid "Create Convex Collision Sibling(s)" -msgstr "Dışbükey Çarpışma KardeÅŸi OluÅŸtur" +msgstr "Dışbükey Çarpışma KomÅŸusu OluÅŸtur" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Outline Mesh..." @@ -5944,14 +5903,12 @@ msgstr "Yönlendirici Çokgeni OluÅŸtur" #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -#, fuzzy msgid "Convert to CPUParticles" -msgstr "Büyük Harfe Dönüştür" +msgstr "CPUParçacıklar 'a dönüştür" #: editor/plugins/particles_2d_editor_plugin.cpp -#, fuzzy msgid "Generating Visibility Rect" -msgstr "Görünebilirlik Dikdörtgeni Ãœret" +msgstr "Görünebilirlik Dikdörtgeni Ãœretiliyor" #: editor/plugins/particles_2d_editor_plugin.cpp msgid "Generate Visibility Rect" @@ -5968,26 +5925,23 @@ msgstr "Nesil Süresi (sn):" #: editor/plugins/particles_editor_plugin.cpp msgid "The geometry's faces don't contain any area." -msgstr "" +msgstr "Geometrik ÅŸeklin yüzeyleri herhangi bir alana sahip deÄŸiller." #: editor/plugins/particles_editor_plugin.cpp -#, fuzzy msgid "The geometry doesn't contain any faces." -msgstr "Düğüm uzambilgisi (yüzler) içermiyor." +msgstr "Geometrik ÅŸekilde hiç yüzey yok." #: editor/plugins/particles_editor_plugin.cpp msgid "\"%s\" doesn't inherit from Spatial." -msgstr "" +msgstr "\"%s\" Uzamsal ÅŸekilden türetilmemiÅŸ." #: editor/plugins/particles_editor_plugin.cpp -#, fuzzy msgid "\"%s\" doesn't contain geometry." -msgstr "Düğüm uzambilgisi içermiyor." +msgstr "\"%s\" herhangi bir geometriye sahip deÄŸil." #: editor/plugins/particles_editor_plugin.cpp -#, fuzzy msgid "\"%s\" doesn't contain face geometry." -msgstr "Düğüm uzambilgisi içermiyor." +msgstr "\"%s\" yüzey geometrisine sahip deÄŸil." #: editor/plugins/particles_editor_plugin.cpp msgid "Create Emitter" @@ -6047,9 +6001,8 @@ msgid "Add Point to Curve" msgstr "Noktayı EÄŸriye Ekle" #: editor/plugins/path_2d_editor_plugin.cpp -#, fuzzy msgid "Split Curve" -msgstr "EÄŸriyi Kapat" +msgstr "EÄŸriyi Böl" #: editor/plugins/path_2d_editor_plugin.cpp msgid "Move Point in Curve" @@ -6079,9 +6032,8 @@ msgid "Click: Add Point" msgstr "Tıkla: Nokta Ekle" #: editor/plugins/path_2d_editor_plugin.cpp -#, fuzzy msgid "Left Click: Split Segment (in curve)" -msgstr "Parçayı Ayır (eÄŸriye göre)" +msgstr "Sol Tıkla: Parçayı Böl (eÄŸride)" #: editor/plugins/path_2d_editor_plugin.cpp #: editor/plugins/path_editor_plugin.cpp @@ -6116,12 +6068,12 @@ msgstr "Seçenekler" #: editor/plugins/path_2d_editor_plugin.cpp #: editor/plugins/path_editor_plugin.cpp msgid "Mirror Handle Angles" -msgstr "" +msgstr "Tutucu Açılarını Yansıt" #: editor/plugins/path_2d_editor_plugin.cpp #: editor/plugins/path_editor_plugin.cpp msgid "Mirror Handle Lengths" -msgstr "" +msgstr "Tutucu Uzunluklarını Yansıt" #: editor/plugins/path_editor_plugin.cpp msgid "Curve Point #" @@ -6160,25 +6112,25 @@ msgid "Split Segment (in curve)" msgstr "Parçayı Ayır (eÄŸriye göre)" #: editor/plugins/physical_bone_plugin.cpp -#, fuzzy msgid "Move Joint" -msgstr "Noktayı Taşı" +msgstr "KesiÅŸimi Taşı" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "" "The skeleton property of the Polygon2D does not point to a Skeleton2D node" -msgstr "" +msgstr "Polygon2D'nin iskelet niteliÄŸi Skeleton2D düğümü deÄŸil" #: editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Sync Bones" -msgstr "Kemikleri Göster" +msgstr "Kemikleri EÅŸleÅŸtir" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "" "No texture in this polygon.\n" "Set a texture to be able to edit UV." msgstr "" +"Bu çokgende doku yok.\n" +"UV düzenleyebilmek için doku ekleyin." #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Create UV Map" @@ -6189,53 +6141,48 @@ msgid "" "Polygon 2D has internal vertices, so it can no longer be edited in the " "viewport." msgstr "" +"Polygon2D dahili köşelere sahip, haliyle artık görünüm bölümünde " +"düzenlenemez." #: editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Create Polygon & UV" -msgstr "Çoklu OluÅŸturun" +msgstr "Çokgen & UV OluÅŸtur" #: editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Create Internal Vertex" -msgstr "Yeni yatay kılavuz oluÅŸtur" +msgstr "Dahili Köşe OluÅŸtur" #: editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Remove Internal Vertex" -msgstr "GiriÅŸ-Kontrol Noktasını Kaldır" +msgstr "Dahili Köşe Kaldır" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Invalid Polygon (need 3 different vertices)" -msgstr "" +msgstr "Geçersiz çokgen (en az 3 köşeye gerek var)" #: editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Add Custom Polygon" -msgstr "Çokluyu Düzenleyin" +msgstr "Ä°steÄŸe baÄŸlı Çokgen Ekle" #: editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Remove Custom Polygon" -msgstr "Çokluyu ve Noktayı Kaldır" +msgstr "Ä°steÄŸe baÄŸlı Çokgen Kaldır" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Transform UV Map" msgstr "UV Haritasını Dönüştür" #: editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Transform Polygon" -msgstr "Dönüştürme Türü" +msgstr "Çokgeni Dönüştür" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Paint Bone Weights" -msgstr "" +msgstr "Kemik Ağırlık Boyama" #: editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Open Polygon 2D UV editor." -msgstr "Çokgen 2B UV Düzenleyicisi" +msgstr "Çokgen 2D UV Düzenleyicisini aç." #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Polygon 2D UV Editor" @@ -6243,27 +6190,23 @@ msgstr "Çokgen 2B UV Düzenleyicisi" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "UV" -msgstr "" +msgstr "UV" #: editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Points" -msgstr "Noktayı Taşı" +msgstr "Noktalar" #: editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Polygons" -msgstr "Çokgen->UV" +msgstr "Çokgenler" #: editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Bones" -msgstr "Kemik Yap" +msgstr "Kemikler" #: editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Move Points" -msgstr "Noktayı Taşı" +msgstr "Noktaları Taşı" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Ctrl: Rotate" @@ -6291,25 +6234,27 @@ msgstr "Çokgeni Ölçekle" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Create a custom polygon. Enables custom polygon rendering." -msgstr "" +msgstr "Ä°steÄŸe baÄŸlı çokgen oluÅŸtur. Ä°steÄŸe baÄŸlı çokgen görüntü iÅŸleme." #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "" "Remove a custom polygon. If none remain, custom polygon rendering is " "disabled." msgstr "" +"Ä°steÄŸe baÄŸlı çokgen kaldır. EÄŸer hiç çokgen kalmazsa, çokgen görüntü iÅŸleme " +"kapanır." #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Paint weights with specified intensity." -msgstr "" +msgstr "Belirtilen yoÄŸunlukla ağırlık boya." #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Unpaint weights with specified intensity." -msgstr "" +msgstr "Belirtilen yoÄŸunlukla ağırlık boya temizle." #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Radius:" -msgstr "" +msgstr "Yarıçap:" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Polygon->UV" @@ -6324,9 +6269,8 @@ msgid "Clear UV" msgstr "UV yi Temizle" #: editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Grid Settings" -msgstr "IzgaraHaritası Ayarları" +msgstr "Izgara Ayarları" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Snap" @@ -6345,34 +6289,28 @@ msgid "Show Grid" msgstr "Izgarayı Göster" #: editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Configure Grid:" -msgstr "Yapışmayı Yapılandır" +msgstr "Izgarayı Yapılandır:" #: editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Grid Offset X:" -msgstr "Izgarayı Kaydır:" +msgstr "Izgara Çıkıntı X:" #: editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Grid Offset Y:" -msgstr "Izgarayı Kaydır:" +msgstr "Izgara Çıkıntı Y:" #: editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Grid Step X:" -msgstr "Izgara Adımı:" +msgstr "Izgara Adımı X:" #: editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Grid Step Y:" -msgstr "Izgara Adımı:" +msgstr "Izgara Adımı Y:" #: editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Sync Bones to Polygon" -msgstr "Çokgeni Ölçekle" +msgstr "Kemikleri Çokgene EÅŸleÅŸtir" #: editor/plugins/resource_preloader_editor_plugin.cpp msgid "ERROR: Couldn't load resource!" @@ -6426,12 +6364,11 @@ msgstr "KaynakÖnyükleyici" #: editor/plugins/root_motion_editor_plugin.cpp msgid "AnimationTree has no path set to an AnimationPlayer" -msgstr "" +msgstr "Animasyon aÄŸacı AnimasyonOynatıcı'ya atanmış yola sahip deÄŸil" #: editor/plugins/root_motion_editor_plugin.cpp -#, fuzzy msgid "Path to AnimationPlayer is invalid" -msgstr "Animasyon aÄŸacı geçersizdir." +msgstr "Animasyon aÄŸacı yolu geçersizdir" #: editor/plugins/script_editor_plugin.cpp msgid "Clear Recent Files" @@ -6442,52 +6379,42 @@ msgid "Close and save changes?" msgstr "Kapa ve deÄŸiÅŸiklikleri kaydet?" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Error writing TextFile:" -msgstr "Bediz yüklenirken sorun oluÅŸtu:" +msgstr "Metin Dosyası kaydedilirken hata:" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Could not load file at:" -msgstr "Karo Bulunamadı:" +msgstr "Åžu dosya yüklenemedi:" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Error saving file!" -msgstr "TileSet kaydedilirken hata!" +msgstr "Dosya kaydedilirken hata!" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Error while saving theme." -msgstr "Tema kaydedilirken hata" +msgstr "Tema kaydedilirken hata." #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Error Saving" msgstr "Kaydedilirken hata" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Error importing theme." -msgstr "Tema içe aktarılırken hata" +msgstr "Tema içe aktarılırken hata." #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Error Importing" msgstr "İçe aktarılırken hata" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "New Text File..." -msgstr "Yeni Klasör..." +msgstr "Yeni Metin Dosyası..." #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Open File" -msgstr "Bir Dosya Aç" +msgstr "Dosya Aç" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Save File As..." msgstr "Farklı Kaydet..." @@ -6508,9 +6435,8 @@ msgid "Save Theme As..." msgstr "Temayı Farklı Kaydet..." #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "%s Class Reference" -msgstr " Sınıf BaÅŸvurusu" +msgstr "%s Class referansı" #: editor/plugins/script_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp @@ -6523,18 +6449,16 @@ msgid "Find Previous" msgstr "Öncekini Bul" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Filter scripts" -msgstr "Özellikleri süz" +msgstr "Betikleri Süz" #: editor/plugins/script_editor_plugin.cpp msgid "Toggle alphabetical sorting of the method list." -msgstr "" +msgstr "Metot listesini alfabetik sıralamayı aç/kapa." #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Filter methods" -msgstr "Süzgeç kipi:" +msgstr "Metotları filtrele" #: editor/plugins/script_editor_plugin.cpp msgid "Sort" @@ -6565,14 +6489,12 @@ msgid "File" msgstr "Dosya" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Open..." -msgstr "Aç" +msgstr "Aç..." #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Reopen Closed Script" -msgstr "Betik Aç" +msgstr "Kapatılan betiÄŸi tekrar Aç" #: editor/plugins/script_editor_plugin.cpp msgid "Save All" @@ -6587,9 +6509,8 @@ msgid "Copy Script Path" msgstr "Betik Yolunu Kopyala" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "History Previous" -msgstr "Öceki GeçmiÅŸ" +msgstr "GeçmiÅŸ Önceki" #: editor/plugins/script_editor_plugin.cpp msgid "History Next" @@ -6650,22 +6571,20 @@ msgid "Keep Debugger Open" msgstr "Hata Ayıklayıcıyı Açık Tut" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Debug with External Editor" msgstr "Harici düzenleyici ile hata ayıkla" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Open Godot online documentation." -msgstr "Çevrimiçi Godot dökümanlarını aç" +msgstr "Çevrimiçi Godot dökümanlarını aç." #: editor/plugins/script_editor_plugin.cpp msgid "Request Docs" -msgstr "" +msgstr "Belgeleri Ä°ste" #: editor/plugins/script_editor_plugin.cpp msgid "Help improve the Godot documentation by giving feedback." -msgstr "" +msgstr "Dönüt vererek Godot belgelerini iyileÅŸtirmeye yardımcı olun." #: editor/plugins/script_editor_plugin.cpp msgid "Search the reference documentation." @@ -6706,27 +6625,22 @@ msgid "Debugger" msgstr "Hata Ayıklayıcı" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Search Results" -msgstr "Yardım Ara" +msgstr "Arama Sonuçları" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Clear Recent Scripts" -msgstr "En Son Sahneleri Temizle" +msgstr "En Son Betikleri Temizle" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Connections to method:" -msgstr "Düğüme BaÄŸla:" +msgstr "Metotlara baÄŸlantılar:" #: editor/plugins/script_text_editor.cpp editor/script_editor_debugger.cpp -#, fuzzy msgid "Source" -msgstr "Kaynak:" +msgstr "Kaynak" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Signal" msgstr "Sinyaller" @@ -6735,33 +6649,30 @@ msgid "Target" msgstr "Hedef" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "" "Missing connected method '%s' for signal '%s' from node '%s' to node '%s'." -msgstr "Åžunun: '%s' ÅŸununla: '%s' baÄŸlantısını kes" +msgstr "" +"'%s' düğümünden '%s' düğümüne, '%s' sinyali için '%s' baÄŸlantı metodu eksik." #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Line" -msgstr "Satır:" +msgstr "Satır" #: editor/plugins/script_text_editor.cpp msgid "(ignore)" -msgstr "" +msgstr "(gözardı et)" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Go to Function" -msgstr "Ä°ÅŸleve Git..." +msgstr "Ä°ÅŸleve Git" #: editor/plugins/script_text_editor.cpp msgid "Only resources from filesystem can be dropped." msgstr "Sadece dosya sisteminden kaynaklar bırakılabilir." #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Lookup Symbol" -msgstr "Simgeyi Tamamla" +msgstr "Simgeyi AraÅŸtır" #: editor/plugins/script_text_editor.cpp msgid "Pick Color" @@ -6785,22 +6696,21 @@ msgstr "Büyük harfe çevirme" #: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp msgid "Syntax Highlighter" -msgstr "" +msgstr "Yazım Vurgulama" #: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp msgid "Go To" -msgstr "" +msgstr "Åžuna Git" #: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp msgid "Bookmarks" -msgstr "" +msgstr "Yer imleri" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Breakpoints" -msgstr "Noktalar oluÅŸtur." +msgstr "Hata ayıklama noktaları" #: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp @@ -6849,66 +6759,56 @@ msgid "Complete Symbol" msgstr "Simgeyi Tamamla" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Evaluate Selection" -msgstr "Seçimi Ölçekle" +msgstr "Seçimi DeÄŸerlendir" #: editor/plugins/script_text_editor.cpp msgid "Trim Trailing Whitespace" msgstr "Ä°zleyenin BoÅŸluklarını Kırp" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Convert Indent to Spaces" -msgstr "Girintileri BoÅŸluklara Dönüştür" +msgstr "Girintiyi BoÅŸluklara Dönüştür" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Convert Indent to Tabs" -msgstr "Girintileri Sekmelere Dönüştür" +msgstr "Girintiyi Sekmelere Dönüştür" #: editor/plugins/script_text_editor.cpp msgid "Auto Indent" msgstr "Kendinden Girintili" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Find in Files..." -msgstr "Dosyaları Süz..." +msgstr "Dosyalarda Bul..." #: editor/plugins/script_text_editor.cpp msgid "Contextual Help" msgstr "BaÄŸlamsal Yardım" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Toggle Bookmark" -msgstr "Serbestbakış Aç / Kapat" +msgstr "Yer imleri Aç / Kapat" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Go to Next Bookmark" -msgstr "Sonraki Kesme Noktasına Git" +msgstr "Sonraki Yer imine Git" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Go to Previous Bookmark" -msgstr "Önceki Kesme Noktasına Git" +msgstr "Önceki Yer imine Git" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Remove All Bookmarks" -msgstr "Bütün Öğeleri Kaldır" +msgstr "Bütün Yer imlerini Kaldır" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Go to Function..." msgstr "Ä°ÅŸleve Git..." #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Go to Line..." -msgstr "Dizeye Git..." +msgstr "Satıra Git..." #: editor/plugins/script_text_editor.cpp #: modules/visual_script/visual_script_editor.cpp @@ -6920,23 +6820,20 @@ msgid "Remove All Breakpoints" msgstr "Tüm Kesme Noktalarını Kaldır" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Go to Next Breakpoint" msgstr "Sonraki Kesme Noktasına Git" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Go to Previous Breakpoint" msgstr "Önceki Kesme Noktasına Git" #: editor/plugins/shader_editor_plugin.cpp -#, fuzzy msgid "" "This shader has been modified on on disk.\n" "What action should be taken?" msgstr "" -"AÅŸağıdaki dosyalar diskte daha yeni.\n" -"Hangi eylem yapılsın?:" +"Bu shader klasörde deÄŸiÅŸtirilmiÅŸ.\n" +"Hangi eylem yapılsın?" #: editor/plugins/shader_editor_plugin.cpp msgid "Shader" @@ -6944,48 +6841,43 @@ msgstr "Gölgelendirici" #: editor/plugins/skeleton_2d_editor_plugin.cpp msgid "This skeleton has no bones, create some children Bone2D nodes." -msgstr "" +msgstr "Bu iskelette hiç kemik yok, alt öge olarak Kemik2D düğümleri oluÅŸtur." #: editor/plugins/skeleton_2d_editor_plugin.cpp -#, fuzzy msgid "Create Rest Pose from Bones" -msgstr "Örüntüden Emisyon Noktaları OluÅŸtur" +msgstr "Kemiklerle dinlenme duruÅŸu OluÅŸtur" #: editor/plugins/skeleton_2d_editor_plugin.cpp msgid "Set Rest Pose to Bones" -msgstr "" +msgstr "Dinlenme duruÅŸunu Kemiklere ata" #: editor/plugins/skeleton_2d_editor_plugin.cpp -#, fuzzy msgid "Skeleton2D" -msgstr "Ä°skelet..." +msgstr "Ä°skelet2D" #: editor/plugins/skeleton_2d_editor_plugin.cpp msgid "Make Rest Pose (From Bones)" -msgstr "" +msgstr "Dinlenme duruÅŸu oluÅŸtur (kemiklerden)" #: editor/plugins/skeleton_2d_editor_plugin.cpp msgid "Set Bones to Rest Pose" -msgstr "" +msgstr "Kemikleri Dinlenme DuruÅŸuna ata" #: editor/plugins/skeleton_editor_plugin.cpp -#, fuzzy msgid "Create physical bones" -msgstr "Yönlendirici Örüntüsü OluÅŸtur" +msgstr "Fiziki kemikler oluÅŸtur" #: editor/plugins/skeleton_editor_plugin.cpp msgid "Skeleton" msgstr "Ä°skelet" #: editor/plugins/skeleton_editor_plugin.cpp -#, fuzzy msgid "Create physical skeleton" -msgstr "C# Çözümü oluÅŸtur" +msgstr "Fiziki iskelet oluÅŸtur" #: editor/plugins/skeleton_ik_editor_plugin.cpp -#, fuzzy msgid "Play IK" -msgstr "Oynat" +msgstr "Oynat IK" #: editor/plugins/spatial_editor_plugin.cpp msgid "Orthogonal" @@ -7041,7 +6933,7 @@ msgstr "Perde" #: editor/plugins/spatial_editor_plugin.cpp msgid "Yaw" -msgstr "" +msgstr "Yalpala" #: editor/plugins/spatial_editor_plugin.cpp msgid "Objects Drawn" @@ -7112,14 +7004,12 @@ msgid "Rear" msgstr "Arka" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Align Transform with View" -msgstr "Görünüme Ayarla" +msgstr "Dönüşümü Görünümle EÅŸle" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Align Rotation with View" -msgstr "Seçimi Görünüme Ayarla" +msgstr "Dönüşü Görünümle eÅŸle" #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "No parent to instance a child at." @@ -7130,9 +7020,8 @@ msgid "This operation requires a single selected node." msgstr "Bu iÅŸlem, seçilmiÅŸ tek bir düğüm gerektirir." #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Lock View Rotation" -msgstr "Bilgi Göster" +msgstr "Dönüşü Görüntülemeyi kilitle" #: editor/plugins/spatial_editor_plugin.cpp msgid "Display Normal" @@ -7175,14 +7064,12 @@ msgid "Audio Listener" msgstr "Ses Dinleyici" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Enable Doppler" -msgstr "Düzenlenebilir Çocuklar" +msgstr "Doppler'i etkinleÅŸtir" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Cinematic Preview" -msgstr "Mesh Önizlemeleri OluÅŸturuluyor" +msgstr "Sinematik Önizleme" #: editor/plugins/spatial_editor_plugin.cpp msgid "Freelook Left" @@ -7213,7 +7100,6 @@ msgid "Freelook Speed Modifier" msgstr "Serbestbakış Hız DeÄŸiÅŸtirici" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Freelook Slow Modifier" msgstr "Serbestbakış Hız DeÄŸiÅŸtirici" @@ -7222,24 +7108,24 @@ msgid "" "Note: The FPS value displayed is the editor's framerate.\n" "It cannot be used as a reliable indication of in-game performance." msgstr "" +"Not: Gösterilen FPS deÄŸeri editörün çerçeve hızıdır.\n" +"Oyun içi performansın gösteri olarak ele alınamaz." #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "View Rotation Locked" -msgstr "Bilgi Göster" +msgstr "Dönme Kilitli Görünüm" #: editor/plugins/spatial_editor_plugin.cpp msgid "XForm Dialog" msgstr "XForm Ä°letiÅŸim Kutusu" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Snap Nodes To Floor" -msgstr "Izgaraya yapış" +msgstr "Düğümleri zemine hizala" #: editor/plugins/spatial_editor_plugin.cpp msgid "Couldn't find a solid floor to snap the selection to." -msgstr "" +msgstr "Seçimi hizalamak için somut zemin bulunamıyor." #: editor/plugins/spatial_editor_plugin.cpp msgid "" @@ -7252,9 +7138,8 @@ msgstr "" "Alt+RMB: Derin liste seçimi" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Use Local Space" -msgstr "Yerel Uzay Kipi (%s)" +msgstr "Yerel Eksen Kipi (%s)" #: editor/plugins/spatial_editor_plugin.cpp msgid "Use Snap" @@ -7285,9 +7170,8 @@ msgid "Right View" msgstr "SaÄŸdan Görünüm" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Switch Perspective/Orthogonal View" -msgstr "Derinlik / Dikey Görünüme DeÄŸiÅŸtir" +msgstr "Derinlikli / Sığ Görünüme DeÄŸiÅŸtir" #: editor/plugins/spatial_editor_plugin.cpp msgid "Insert Animation Key" @@ -7311,9 +7195,8 @@ msgid "Transform" msgstr "Dönüşüm" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Snap Object to Floor" -msgstr "Izgaraya yapış" +msgstr "Nesneyi zemine hizala" #: editor/plugins/spatial_editor_plugin.cpp msgid "Transform Dialog..." @@ -7344,9 +7227,8 @@ msgid "4 Viewports" msgstr "4 Görüntükapısı" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Gizmos" -msgstr "Gizmoları Göster" +msgstr "Gizmolar" #: editor/plugins/spatial_editor_plugin.cpp msgid "View Origin" @@ -7358,9 +7240,8 @@ msgstr "Izgara Görünümü" #: editor/plugins/spatial_editor_plugin.cpp #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Settings..." -msgstr "Ayarlar" +msgstr "Ayarlar..." #: editor/plugins/spatial_editor_plugin.cpp msgid "Snap Settings" @@ -7424,111 +7305,96 @@ msgstr "Sonrası" #: editor/plugins/spatial_editor_plugin.cpp msgid "Nameless gizmo" -msgstr "" +msgstr "Ä°simsiz Gizmo" #: editor/plugins/sprite_editor_plugin.cpp -#, fuzzy msgid "Create Mesh2D" -msgstr "Anahat Örüntüsü OluÅŸtur" +msgstr "Örüntü2D OluÅŸtur" #: editor/plugins/sprite_editor_plugin.cpp -#, fuzzy msgid "Create Polygon2D" -msgstr "Çoklu OluÅŸturun" +msgstr "Çokgen2D OluÅŸtur" #: editor/plugins/sprite_editor_plugin.cpp -#, fuzzy msgid "Create CollisionPolygon2D" -msgstr "Yönlendirici Çokgeni OluÅŸtur" +msgstr "TemasÇokgen2D OluÅŸtur" #: editor/plugins/sprite_editor_plugin.cpp -#, fuzzy msgid "Create LightOccluder2D" -msgstr "Engelleyici Çokgeni OluÅŸtur" +msgstr "IşıkEngelleyici2D OluÅŸtur" #: editor/plugins/sprite_editor_plugin.cpp -#, fuzzy msgid "Sprite is empty!" -msgstr "Kayıt yolu boÅŸ!" +msgstr "HayaliÇizimlik BoÅŸ!" #: editor/plugins/sprite_editor_plugin.cpp msgid "Can't convert a sprite using animation frames to mesh." msgstr "" +"HayaliÇizimlik, animasyon çerçevelerini kullanarak örüntüye dönüştürülemiyor." #: editor/plugins/sprite_editor_plugin.cpp msgid "Invalid geometry, can't replace by mesh." -msgstr "" +msgstr "Geçersiz geometri, örüntü ile deÄŸiÅŸtirilemiyor." #: editor/plugins/sprite_editor_plugin.cpp -#, fuzzy msgid "Convert to Mesh2D" -msgstr "Åžuna Dönüştür %s" +msgstr "Örüntü2D'ye döüştür" #: editor/plugins/sprite_editor_plugin.cpp msgid "Invalid geometry, can't create polygon." -msgstr "" +msgstr "Geçersiz geometri, çokgen oluÅŸturulamıyor." #: editor/plugins/sprite_editor_plugin.cpp -#, fuzzy msgid "Convert to Polygon2D" -msgstr "Çokgeni Taşı" +msgstr "Çokgen2D'ye dönüştür" #: editor/plugins/sprite_editor_plugin.cpp msgid "Invalid geometry, can't create collision polygon." -msgstr "" +msgstr "Geçersiz geometri, temas çokgeni oluÅŸturulamıyor." #: editor/plugins/sprite_editor_plugin.cpp -#, fuzzy msgid "Create CollisionPolygon2D Sibling" -msgstr "Yönlendirici Çokgeni OluÅŸtur" +msgstr "TemasÇokgen2D akranı oluÅŸturulamıyor" #: editor/plugins/sprite_editor_plugin.cpp msgid "Invalid geometry, can't create light occluder." -msgstr "" +msgstr "Geçersiz geometri, ışık engelleyici oluÅŸturulamıyor." #: editor/plugins/sprite_editor_plugin.cpp -#, fuzzy msgid "Create LightOccluder2D Sibling" -msgstr "Engelleyici Çokgeni OluÅŸtur" +msgstr "Engelleyici Çokgeni akranı OluÅŸtur" #: editor/plugins/sprite_editor_plugin.cpp -#, fuzzy msgid "Sprite" -msgstr "GörüntüKareleri" +msgstr "HayaliÇizimlik" #: editor/plugins/sprite_editor_plugin.cpp msgid "Simplification: " -msgstr "" +msgstr "SadeleÅŸtirme: " #: editor/plugins/sprite_editor_plugin.cpp -#, fuzzy msgid "Shrink (Pixels): " -msgstr "Yapış (Noktalara):" +msgstr "Sıkıştır (Pikselleri): " #: editor/plugins/sprite_editor_plugin.cpp -#, fuzzy msgid "Grow (Pixels): " -msgstr "Yapış (Noktalara):" +msgstr "Büyüt (Pikselleri): " #: editor/plugins/sprite_editor_plugin.cpp -#, fuzzy msgid "Update Preview" -msgstr "Atlas Önizleme" +msgstr "Önizlemeyi Güncelle" #: editor/plugins/sprite_editor_plugin.cpp -#, fuzzy msgid "Settings:" -msgstr "Ayarlar" +msgstr "Ayarlar:" #: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy msgid "No Frames Selected" -msgstr "Kafes Seçimi" +msgstr "Çerçeve seçilmedi" #: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy msgid "Add %d Frame(s)" -msgstr "Çerçeve Ekle" +msgstr "%d Çerçeve[ler]'i ekle" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Add Frame" @@ -7559,19 +7425,16 @@ msgid "(empty)" msgstr "(boÅŸ)" #: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy msgid "Move Frame" -msgstr "Çerçeveyi Yapıştır" +msgstr "Çerçeveyi Taşı" #: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy msgid "Animations:" -msgstr "Animasyonlar" +msgstr "Animasyonlar:" #: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy msgid "New Animation" -msgstr "Animasyon" +msgstr "Yeni Animasyon" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Speed (FPS):" @@ -7582,18 +7445,16 @@ msgid "Loop" msgstr "Döngü" #: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy msgid "Animation Frames:" -msgstr "Animasyon Çerçeveleri" +msgstr "Animasyon Çerçeveleri:" #: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy msgid "Add a Texture from File" -msgstr "AÄŸaçtan Düğüm(ler) Ekle" +msgstr "Dosyadan doku ekle" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Add Frames from a Sprite Sheet" -msgstr "" +msgstr "HayaliÇizimlik'ten Çerçeve Ekle" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Insert Empty (Before)" @@ -7612,28 +7473,24 @@ msgid "Move (After)" msgstr "Taşı (Sonra)" #: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy msgid "Select Frames" -msgstr "Çerçeveleri Yığ" +msgstr "Çerçeveleri Seç" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Horizontal:" -msgstr "" +msgstr "Yatay:" #: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy msgid "Vertical:" -msgstr "Köşenoktalar" +msgstr "Dikey:" #: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy msgid "Select/Clear All Frames" -msgstr "Hepsini seç" +msgstr "Hepsini Seç / Temizle" #: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy msgid "Create Frames from Sprite Sheet" -msgstr "Sahneden OluÅŸtur" +msgstr "HayaliÇizimlik'ten Çerçeveler oluÅŸtur" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "SpriteFrames" @@ -7644,9 +7501,8 @@ msgid "Set Region Rect" msgstr "Dikdörtgen Bölgesini Ayarla" #: editor/plugins/texture_region_editor_plugin.cpp -#, fuzzy msgid "Set Margin" -msgstr "Tutamacı Ayarla" +msgstr "Kenar BoÅŸluk Belirle" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Snap Mode:" @@ -7654,9 +7510,8 @@ msgstr "Yapışma Kipi:" #: editor/plugins/texture_region_editor_plugin.cpp #: scene/resources/visual_shader.cpp -#, fuzzy msgid "None" -msgstr "<Yok>" +msgstr "Düğüm" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Pixel Snap" @@ -7680,12 +7535,11 @@ msgstr "Adım:" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Sep.:" -msgstr "" +msgstr "Ayraç:" #: editor/plugins/texture_region_editor_plugin.cpp -#, fuzzy msgid "TextureRegion" -msgstr "Doku Bölgesi" +msgstr "DokuBölgesi" #: editor/plugins/theme_editor_plugin.cpp msgid "Add All Items" @@ -7704,9 +7558,8 @@ msgid "Remove All" msgstr "Tümünü Kaldır" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Edit Theme" -msgstr "Tema düzenle..." +msgstr "Tema düzenle" #: editor/plugins/theme_editor_plugin.cpp msgid "Theme editing menu." @@ -7733,23 +7586,20 @@ msgid "Create From Current Editor Theme" msgstr "Mevcut Düzenleyici Temasından OluÅŸtur" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Toggle Button" -msgstr "Fare Düğmesi" +msgstr "DeÄŸiÅŸtirme Düğmesi" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Disabled Button" -msgstr "Orta Düğme" +msgstr "Pasif Düğme" #: editor/plugins/theme_editor_plugin.cpp msgid "Item" msgstr "Öğe" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Disabled Item" -msgstr "Devre dışı" +msgstr "Pasif Öge" #: editor/plugins/theme_editor_plugin.cpp msgid "Check Item" @@ -7769,21 +7619,19 @@ msgstr "Seçili Radyo Ögesi" #: editor/plugins/theme_editor_plugin.cpp msgid "Named Sep." -msgstr "" +msgstr "Ä°simli Ayraç." #: editor/plugins/theme_editor_plugin.cpp msgid "Submenu" -msgstr "" +msgstr "Altmenü" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Subitem 1" -msgstr "Öğe" +msgstr "Altöge 1" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Subitem 2" -msgstr "Öğe" +msgstr "Altöge 2" #: editor/plugins/theme_editor_plugin.cpp msgid "Has" @@ -7794,9 +7642,8 @@ msgid "Many" msgstr "Çok" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Disabled LineEdit" -msgstr "Devre dışı" +msgstr "Pasif SatırDüzeltici" #: editor/plugins/theme_editor_plugin.cpp msgid "Tab 1" @@ -7811,13 +7658,12 @@ msgid "Tab 3" msgstr "Sekme 3" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Editable Item" -msgstr "Düzenlenebilir Çocuklar" +msgstr "Düzenlenebilir Öge" #: editor/plugins/theme_editor_plugin.cpp msgid "Subtree" -msgstr "" +msgstr "AltaÄŸaç" #: editor/plugins/theme_editor_plugin.cpp msgid "Has,Many,Options" @@ -7852,15 +7698,13 @@ msgid "Erase Selection" msgstr "Seçimi Sil" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Fix Invalid Tiles" -msgstr "Geçersiz ad." +msgstr "Geçersiz Döşemeleri Düzelt" #: editor/plugins/tile_map_editor_plugin.cpp #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Cut Selection" -msgstr "İçre Seçimi" +msgstr "Seçimi Kes" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Paint TileMap" @@ -7883,32 +7727,30 @@ msgid "Erase TileMap" msgstr "TileMap'i Sil" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Find Tile" -msgstr "Döşentiyi Bul" +msgstr "Dosya Bul" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Transpose" msgstr "Tersine Çevir" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Disable Autotile" -msgstr "Oto-döşemeler" +msgstr "Oto-döşemeleri PasifleÅŸtir" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Enable Priority" -msgstr "Süzgeçleri Düzenle" +msgstr "Önceliklemeyi EtkinleÅŸtir" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Filter tiles" -msgstr "Dosyaları Süz..." +msgstr "Döşemelerde Bul" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Give a TileSet resource to this TileMap to use its tiles." msgstr "" +"Bu DöşemeHaritası için döşemelerini kullanmak üzere DöşemeTakımı kaynağı " +"belirtin." #: editor/plugins/tile_map_editor_plugin.cpp msgid "Paint Tile" @@ -7919,43 +7761,40 @@ msgid "" "Shift+LMB: Line Draw\n" "Shift+Ctrl+LMB: Rectangle Paint" msgstr "" +"Shift+SFT: Çizgi Çiz\n" +"Shift+Ctrl+SFT: Dkidörtgen Boya" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Pick Tile" msgstr "Karo Seç" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Rotate Left" -msgstr "Döndürme Biçimi" +msgstr "Sola Döndür" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Rotate Right" -msgstr "SaÄŸa Taşı" +msgstr "SaÄŸa Döndür" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Flip Horizontally" -msgstr "" +msgstr "Yatay Yansıt" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Flip Vertically" -msgstr "" +msgstr "Dikey Yansıt" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Clear Transform" -msgstr "Dönüşüm" +msgstr "Dönüşümü Temizle" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Add Texture(s) to TileSet." -msgstr "AÄŸaçtan Düğüm(ler) Ekle" +msgstr "DöşemeTakımına doku[lar] ekle." #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Remove selected Texture from TileSet." -msgstr "Mevcut giriyi kaldır" +msgstr "Seçilen dokuyu DöşemeTakımı'ndan kaldır." #: editor/plugins/tile_set_editor_plugin.cpp msgid "Create from Scene" @@ -7966,155 +7805,145 @@ msgid "Merge from Scene" msgstr "Sahneden BirleÅŸtir" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Next Coordinate" -msgstr "Sonraki Zemin" +msgstr "Sonraki Koordinat" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Select the next shape, subtile, or Tile." -msgstr "" +msgstr "Sonraki ÅŸekil, altdöşeme ya da döşemeyi seç." #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Previous Coordinate" -msgstr "Önceki Zemin" +msgstr "Önceki Koordinat" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Select the previous shape, subtile, or Tile." -msgstr "" +msgstr "Önceki ÅŸekil, altdöşeme ya da Döşemeyi Seç." #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Region Mode" -msgstr "Çalışma Kipi:" +msgstr "Bölge Åžekli" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Collision Mode" -msgstr "AradeÄŸerleme Kipi" +msgstr "Temas Åžekli" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Occlusion Mode" -msgstr "Çokluyu Düzenleyin" +msgstr "Örtü Åžekli" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Navigation Mode" -msgstr "Yönlendirici Örüntüsü OluÅŸtur" +msgstr "Gezinim Åžekli" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Bitmask Mode" -msgstr "Döndürme Biçimi" +msgstr "BitMaskeleme Åžekli" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Priority Mode" -msgstr "Dışa Aktarma Biçimi:" +msgstr "Öncelik Åžekli" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Icon Mode" -msgstr "Kaydırma Biçimi" +msgstr "Simge Åžekli" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Z Index Mode" -msgstr "Kaydırma Biçimi" +msgstr "Z Derinlik Åžekli" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Copy bitmask." -msgstr "" +msgstr "Bitmaskesi Kopyala." #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Paste bitmask." -msgstr "Animasyonu Yapıştır" +msgstr "Bitmaskesi yapıştır." #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Erase bitmask." -msgstr "RMB: Noktayı Sil." +msgstr "Bitmaskesi sil." #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Create a new rectangle." -msgstr "Yeni %s oluÅŸtur" +msgstr "Yeni dikdörtgen oluÅŸtur." #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Create a new polygon." -msgstr "Sıfırdan yeni bir çokgen oluÅŸturun." +msgstr "Yeni bir çokgen oluÅŸturun." #: editor/plugins/tile_set_editor_plugin.cpp msgid "Keep polygon inside region Rect." -msgstr "" +msgstr "Çokgeni Dikdörtgen bölgesinde tut." #: editor/plugins/tile_set_editor_plugin.cpp msgid "Enable snap and show grid (configurable via the Inspector)." msgstr "" +"Hizalama ve ızgara görüntülemeyi etkinleÅŸtir (gözetleme aracı ile de " +"deÄŸiÅŸtirilebilir)." #: editor/plugins/tile_set_editor_plugin.cpp msgid "Display Tile Names (Hold Alt Key)" -msgstr "" +msgstr "Döşeme Ä°simlerini Göster (Alt tuÅŸuna basık tutun)" #: editor/plugins/tile_set_editor_plugin.cpp msgid "" "Add or select a texture on the left panel to edit the tiles bound to it." msgstr "" +"Soldaki panelden doku ekle ya da seçerek kendisine baÄŸlı döşemeyi düzenle." #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Remove selected texture? This will remove all tiles which use it." -msgstr "Mevcut giriyi kaldır" +msgstr "" +"Seçilen doku kaldırılsın mı? Bu eylem, dokuyu kullanan tüm döşemeleri de " +"kaldıracaktır." #: editor/plugins/tile_set_editor_plugin.cpp msgid "You haven't selected a texture to remove." -msgstr "" +msgstr "Kaldırmak için doku seçimi yapmadınız." #: editor/plugins/tile_set_editor_plugin.cpp msgid "Create from scene? This will overwrite all current tiles." msgstr "" +"Sahneden oluÅŸtur? Bu eylem tüm döşemelerin üzerlerine yazılmasına yol açacak." #: editor/plugins/tile_set_editor_plugin.cpp msgid "Merge from scene?" msgstr "Sahneden birleÅŸtirilsin mi?" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Remove Texture" -msgstr "Åžablonu Kaldır" +msgstr "Dokuyu Kaldır" #: editor/plugins/tile_set_editor_plugin.cpp msgid "%s file(s) were not added because was already on the list." -msgstr "" +msgstr "%s dosyası eklenmedi çünkü zaten listede idi." #: editor/plugins/tile_set_editor_plugin.cpp msgid "" "Drag handles to edit Rect.\n" "Click on another Tile to edit it." msgstr "" +"Dikdörtgeni düzeltmek için tutamaçlardan tutun.\n" +"Düzeltmek için baÅŸka bir döşemeye tıklayın." #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Delete selected Rect." -msgstr "Seçili dosyalar silinsin mi?" +msgstr "Seçili Dörtgeni Silin." #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "" "Select current edited sub-tile.\n" "Click on another Tile to edit it." -msgstr "Åžuanki düzenlenmiÅŸ alt-döşemeyi seç." +msgstr "" +"Åžuanda düzenlenen döşemeyi seç.\n" +"Düzenlemek için baÅŸka döşemeye tıklayın." #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Delete polygon." -msgstr "Noktaları sil" +msgstr "Çokgeni Sil." #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "" "LMB: Set bit on.\n" "RMB: Set bit off.\n" @@ -8122,220 +7951,195 @@ msgid "" "Click on another Tile to edit it." msgstr "" "LMB: bit'i aç.\n" -"RMB: bit'i kapat." +"RMB: bit'i kapat.\n" +"Shift+LMB: Anahtar Bit belirle.\n" +"Düzenlemek için baÅŸka bir döşemeye tıklayın." #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "" "Select sub-tile to use as icon, this will be also used on invalid autotile " "bindings.\n" "Click on another Tile to edit it." msgstr "" -"Simge olarak kullanmak iÅŸin alt-karo seç, bu aynı zamanda geçersiz oto-karo " -"baÄŸlantılarında kullanılacaktır." +"Simge olarak kullanmak iÅŸin alt-döşeme seç, bu aynı zamanda geçersiz " +"otomatik döşeme deÄŸiÅŸkenlerinde kullanılacaktır.\n" +"Düzenlemek için baÅŸka bir döşemeye tıklayın." #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "" "Select sub-tile to change its priority.\n" "Click on another Tile to edit it." -msgstr "ÖnceliÄŸini deÄŸiÅŸtirmek için alt-karo seçin." +msgstr "" +"ÖnceliÄŸini deÄŸiÅŸtirmek için alt döşeme seçin.\n" +"Düzenlemek için baÅŸka bir döşeme seçiniz." #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "" "Select sub-tile to change its z index.\n" "Click on another Tile to edit it." -msgstr "ÖnceliÄŸini deÄŸiÅŸtirmek için alt-karo seçin." +msgstr "" +"Z derinliÄŸini deÄŸiÅŸtirmek için alt-döşeme seçin.\n" +"Düzenlemek için baÅŸka bir döşeme seçin." #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Set Tile Region" -msgstr "Dikdörtgen Bölgesini Ayarla" +msgstr "Döşeme Bölgesi Ata" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Create Tile" -msgstr "Klasör OluÅŸtur" +msgstr "Döşeme OluÅŸtur" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Set Tile Icon" -msgstr "" +msgstr "Döşeme Simgesi Ayarla" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Edit Tile Bitmask" -msgstr "Süzgeçleri Düzenle" +msgstr "Döşeme Bitmaskesi Düzenle" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Edit Collision Polygon" -msgstr "Var olan çokgeni düzenleyin:" +msgstr "Temas Çokgeni Düzenle" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Edit Occlusion Polygon" -msgstr "Çokluyu Düzenleyin" +msgstr "Engelleyici Çokgeni Düzenle" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Edit Navigation Polygon" -msgstr "Yönlendirici Çokgeni OluÅŸtur" +msgstr "Gezinim Çokgeni Düzenle" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Paste Tile Bitmask" -msgstr "Animasyonu Yapıştır" +msgstr "Döşeme Bitmaskesi Yapıştır" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Clear Tile Bitmask" -msgstr "" +msgstr "Döşeme Maskesini Temizle" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Make Polygon Concave" -msgstr "Çokgeni Taşı" +msgstr "Çokgeni İçbükey Yap" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Make Polygon Convex" -msgstr "Çokgeni Taşı" +msgstr "Çokgeni Dışbükey Yap" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Remove Tile" -msgstr "Åžablonu Kaldır" +msgstr "Döşemeyi Kaldır" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Remove Collision Polygon" -msgstr "Çokluyu ve Noktayı Kaldır" +msgstr "Temas Çokgenini Kaldır" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Remove Occlusion Polygon" -msgstr "Engelleyici Çokgeni OluÅŸtur" +msgstr "Engelleyici Çokgenini Kaldır" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Remove Navigation Polygon" -msgstr "Yönlendirici Çokgeni OluÅŸtur" +msgstr "Yönlendirici Çokgenini Kaldır" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Edit Tile Priority" -msgstr "Süzgeçleri Düzenle" +msgstr "Döşeme ÖnceliÄŸini DeÄŸiÅŸtir" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Edit Tile Z Index" -msgstr "" +msgstr "Döşeme Z DerinliÄŸini DeÄŸiÅŸtir" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Create Collision Polygon" -msgstr "Yönlendirici Çokgeni OluÅŸtur" +msgstr "Temas Çokgeni OluÅŸtur" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Create Occlusion Polygon" msgstr "Engelleyici Çokgeni OluÅŸtur" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "This property can't be changed." -msgstr "Bu iÅŸlem bir sahne olmadan yapılamaz." +msgstr "Bu nitelik deÄŸiÅŸtirilemez." #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "TileSet" -msgstr "Karo Takımı" +msgstr "DöşemeTakımı" #: editor/plugins/version_control_editor_plugin.cpp msgid "No VCS addons are available." -msgstr "" +msgstr "Hiçbir VCS eklentisi mevcut deÄŸil." #: editor/plugins/version_control_editor_plugin.cpp editor/rename_dialog.cpp msgid "Error" msgstr "Hata" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "No commit message was provided" -msgstr "Ä°sim saÄŸlanmadı" +msgstr "Hiçbir iÅŸleme mesajı saÄŸlanmadı" #: editor/plugins/version_control_editor_plugin.cpp msgid "No files added to stage" -msgstr "" +msgstr "Sahneye hiç dosya eklenmedi" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Commit" -msgstr "Topluluk" +msgstr "Ä°ÅŸle" #: editor/plugins/version_control_editor_plugin.cpp msgid "VCS Addon is not initialized" -msgstr "" +msgstr "VCS eklentileri etkinleÅŸtirilmedi" #: editor/plugins/version_control_editor_plugin.cpp msgid "Version Control System" -msgstr "" +msgstr "Versiyon Denetim Sistemi" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Initialize" -msgstr "Büyük harfe çevirme" +msgstr "EtkinleÅŸtir" #: editor/plugins/version_control_editor_plugin.cpp msgid "Staging area" -msgstr "" +msgstr "Sahne Öncesi" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Detect new changes" -msgstr "Yeni %s oluÅŸtur" +msgstr "Yeni deÄŸiÅŸiklikleri tespit et" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Changes" -msgstr "DeÄŸiÅŸtir" +msgstr "DeÄŸiÅŸiklikler" #: editor/plugins/version_control_editor_plugin.cpp msgid "Modified" -msgstr "" +msgstr "DeÄŸiÅŸti" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Renamed" -msgstr "Yeniden Adlandır" +msgstr "Yeniden Adlandırıldı" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Deleted" -msgstr "Sil" +msgstr "Silindi" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Typechange" -msgstr "DeÄŸiÅŸtir" +msgstr "TürdeÄŸiÅŸtir" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Stage Selected" -msgstr "Seçilenleri Sil" +msgstr "Sahne Seçildi" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Stage All" -msgstr "Tümünü kaydet" +msgstr "Tümünü Sahneye Al" #: editor/plugins/version_control_editor_plugin.cpp msgid "Add a commit message" -msgstr "" +msgstr "Ä°ÅŸleme Mesajı Ekle" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Commit Changes" -msgstr "Betik DeÄŸiÅŸikliklerini EÅŸ Zamanla" +msgstr "DeÄŸiÅŸiklikleri Ä°ÅŸle" #: editor/plugins/version_control_editor_plugin.cpp #: modules/gdnative/gdnative_library_singleton_editor.cpp @@ -8344,30 +8148,27 @@ msgstr "Durum" #: editor/plugins/version_control_editor_plugin.cpp msgid "View file diffs before committing them to the latest version" -msgstr "" +msgstr "Son versiyona iÅŸlemeden önce dosya diff 'lerini incele" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "No file diff is active" -msgstr "Hiçbir Dizeç Seçilmedi!" +msgstr "Dosya diff etkin deÄŸil" #: editor/plugins/version_control_editor_plugin.cpp msgid "Detect changes in file diff" -msgstr "" +msgstr "Diff dosyasındaki deÄŸiÅŸiklikleri tespit et" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "(GLES3 only)" -msgstr "" +msgstr "(Yalnızca GLES3)" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Add Output" -msgstr "GiriÅŸ Ekle" +msgstr "Çıkış Ekle" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Scalar" -msgstr "Ölçekle:" +msgstr "Sayısal" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Vector" @@ -8375,80 +8176,67 @@ msgstr "Vektör" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Boolean" -msgstr "" +msgstr "Boolean" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Sampler" -msgstr "Örnekler" +msgstr "Örnekleyici" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Add input port" -msgstr "GiriÅŸ Ekle" +msgstr "GiriÅŸ noktası ekle" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Add output port" -msgstr "" +msgstr "Çıkış noktası ekle" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Change input port type" -msgstr "Varsayılan tipi deÄŸiÅŸtir" +msgstr "GiriÅŸ noktası türü deÄŸiÅŸtir" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Change output port type" -msgstr "Varsayılan tipi deÄŸiÅŸtir" +msgstr "Çıkış noktası türü deÄŸiÅŸtir" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Change input port name" -msgstr "GiriÅŸ Adını DeÄŸiÅŸtir" +msgstr "GiriÅŸ noktası adını deÄŸiÅŸtir" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Change output port name" -msgstr "GiriÅŸ Adını DeÄŸiÅŸtir" +msgstr "Çıkış noktası adını deÄŸiÅŸtir" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Remove input port" -msgstr "Noktayı kaldır" +msgstr "GiriÅŸ noktasını sil" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Remove output port" -msgstr "Noktayı kaldır" +msgstr "Çıkış noktasını sil" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Set expression" -msgstr "Ä°fadeyi DeÄŸiÅŸtir" +msgstr "Ä°fadeyi ayarla" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Resize VisualShader node" -msgstr "Gölgelendirici" +msgstr "VisualShader düğümünü Boyutlandır" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Set Uniform Name" -msgstr "" +msgstr "Uniform ismi ayarla" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Set Input Default Port" -msgstr "'%s' için Varsayılanı Ayarla" +msgstr "Girdi varsayılan noktasını ayarla" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Add Node to Visual Shader" -msgstr "Gölgelendirici" +msgstr "Visual Shader'a düğüm ekle" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Duplicate Nodes" -msgstr "Düğüm(leri) ÇoÄŸalt" +msgstr "Düğümleri Çokla" #: editor/plugins/visual_shader_editor_plugin.cpp #: modules/visual_script/visual_script_editor.cpp @@ -8456,403 +8244,396 @@ msgid "Paste Nodes" msgstr "Düğümleri Yapıştır" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Delete Nodes" msgstr "Düğümleri Sil" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Visual Shader Input Type Changed" -msgstr "" +msgstr "Visual Shader giriÅŸ Türü DeÄŸiÅŸti" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Vertex" -msgstr "Köşenoktalar" +msgstr "Köşe" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Fragment" msgstr "Bölümlenme" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Light" -msgstr "SaÄŸ" +msgstr "Işık" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Show resulted shader code." -msgstr "Düğüm OluÅŸtur" +msgstr "Shader kodunu görüntüle." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Create Shader Node" -msgstr "Düğüm OluÅŸtur" +msgstr "Shader düğümü oluÅŸtur" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Color function." -msgstr "Ä°ÅŸleve Git..." +msgstr "Renk iÅŸlevi." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Color operator." -msgstr "" +msgstr "Renk operatörü." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Grayscale function." -msgstr "Ä°ÅŸlev Yap" +msgstr "Gritonlama iÅŸlevi." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Converts HSV vector to RGB equivalent." -msgstr "" +msgstr "HSV vektörünü RGB karşılığına dönüştürür." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Converts RGB vector to HSV equivalent." -msgstr "" +msgstr "RGB vektörünü HSV karşılığına dönüştürür." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Sepia function." -msgstr "Ä°ÅŸlevi Yeniden Adlandır" +msgstr "Sepya Ä°ÅŸlevi." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Burn operator." -msgstr "" +msgstr "Yakma operatörü." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Darken operator." -msgstr "" +msgstr "Koyulayıcı opeartör." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Difference operator." -msgstr "Sadece Farklılıklar" +msgstr "Fark etkisi opeartörü." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Dodge operator." -msgstr "" +msgstr "Dodge operatörü." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "HardLight operator" -msgstr "" +#, fuzzy +msgid "HardLight operator." +msgstr "HardLight opeartörü" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Lighten operator." -msgstr "" +msgstr "Aydınlatıcı operatör." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Overlay operator." -msgstr "" +msgstr "Kaplama opeartörü." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Screen operator." -msgstr "" +msgstr "Screen Etkisi operatörü." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "SoftLight operator." -msgstr "" +msgstr "SoftLight operatörü." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Color constant." -msgstr "Sabit" +msgstr "Renk Sabiti." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Color uniform." -msgstr "Dönüşüm" +msgstr "Renk uniform'u." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the boolean result of the %s comparison between two parameters." -msgstr "" +msgstr "iki parametre arasındaki %s kıyaslamasının boolean sonucunu döndürür." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Equal (==)" -msgstr "" +msgstr "EÅŸit (==)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Greater Than (>)" -msgstr "" +msgstr "Büyüktür (>)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Greater Than or Equal (>=)" -msgstr "" +msgstr "Büyük EÅŸit (>=)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns an associated vector if the provided scalars are equal, greater or " "less." msgstr "" +"EÄŸer saÄŸlanan sayısal deÄŸeler eÅŸit, büyük ya da küçük ise " +"iliÅŸikilendirildikleri vekötürünü döndürür." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns the boolean result of the comparison between INF and a scalar " "parameter." msgstr "" +"INF ve sayısal parametre arasındaki kıyaslamanın boolean sonucunu döndürür." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns the boolean result of the comparison between NaN and a scalar " "parameter." msgstr "" +"NaN ve sayısal parametre arasındaki kıyaslamanın boolean sonucunu döndürür." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Less Than (<)" -msgstr "" +msgstr "Küçüktür (<)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Less Than or Equal (<=)" -msgstr "" +msgstr "Küçük EÅŸit (<=)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Not Equal (!=)" -msgstr "" +msgstr "EÅŸit DeÄŸil (!=)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns an associated vector if the provided boolean value is true or false." -msgstr "" +msgstr "SaÄŸlanan boolean deÄŸer doÄŸru ya da yanlışsa ilgili vektörünü döndürür." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns an associated scalar if the provided boolean value is true or false." msgstr "" +"SaÄŸlanan boolean deÄŸer doÄŸru ya da yanlışsa ilgili sayısal deÄŸeri döndürür." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the boolean result of the comparison between two parameters." -msgstr "" +msgstr "iki parametre arasındaki kıyaslamanın boolean sonucunu döndürür." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns the boolean result of the comparison between INF (or NaN) and a " "scalar parameter." msgstr "" +"INF (ya da NaN) ve sayısal bir deÄŸerin kıyaslamasının sonucunu boolean " +"olarak döndürür." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Boolean constant." -msgstr "Vec Sabitini DeÄŸiÅŸtir" +msgstr "Boolean sabit." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Boolean uniform." -msgstr "" +msgstr "DoÄŸru/Yanlış uniform." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "'%s' input parameter for all shader modes." -msgstr "" +msgstr "'%s' giriÅŸ parametresi tüm shader modları içindir." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Input parameter." -msgstr "Ebeveyne yapıştır" +msgstr "GiriÅŸ parametresi." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "'%s' input parameter for vertex and fragment shader modes." -msgstr "" +msgstr "'%s' giriÅŸ parametresi vertex ve fragment shader modları içindir." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "'%s' input parameter for fragment and light shader modes." -msgstr "" +msgstr "'%s' giriÅŸ parametresi fragment ve light shader modları içindir." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "'%s' input parameter for fragment shader mode." -msgstr "" +msgstr "'%s' giriÅŸ parametresi fragment shader modu içindir." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "'%s' input parameter for light shader mode." -msgstr "" +msgstr "'%s' giriÅŸ parametresi light shader modu içindir." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "'%s' input parameter for vertex shader mode." -msgstr "" +msgstr "'%s' giriÅŸ parametresi vertex shader modu içindir." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "'%s' input parameter for vertex and fragment shader mode." -msgstr "" +msgstr "'%s' giriÅŸ parametresi fragment ve vertex shader modu içindir." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Scalar function." -msgstr "Basamaklı Ä°ÅŸlevi DeÄŸiÅŸtir" +msgstr "Katsayı iÅŸlevi." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Scalar operator." -msgstr "Skaler Operatörünü DeÄŸiÅŸtir" +msgstr "Katsayı operatörü." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "E constant (2.718282). Represents the base of the natural logarithm." -msgstr "" +msgstr "E sabiti (2.718282). DoÄŸal algoritmanın tabanını ifade eder." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Epsilon constant (0.00001). Smallest possible scalar number." -msgstr "" +msgstr "Epsilon sabiti (0.00001). Mümkün olan en küçük katsayı deÄŸeri." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Phi constant (1.618034). Golden ratio." -msgstr "" +msgstr "Phi sabiti (1.618034). Altın oran." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Pi/4 constant (0.785398) or 45 degrees." -msgstr "" +msgstr "Pi/4 sabiti (0.785398) ya da 45 derece." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Pi/2 constant (1.570796) or 90 degrees." -msgstr "" +msgstr "Pi/2 sabiti (1.570796) ya da 90 derece." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Pi constant (3.141593) or 180 degrees." -msgstr "" +msgstr "Pi sabiti (3.141593) ya da 180 derece." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Tau constant (6.283185) or 360 degrees." -msgstr "" +msgstr "Tau sabiti (6.283185) ya da 360 derece." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Sqrt2 constant (1.414214). Square root of 2." -msgstr "" +msgstr "Sqrt2 sabiti (1.414214). 2'nin karekökü." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the absolute value of the parameter." -msgstr "" +msgstr "Parametrenin mutlak deÄŸerini döndürür." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the arc-cosine of the parameter." -msgstr "" +msgstr "Cosinüs deÄŸeri verilen parametrenin arc-cos; açı deÄŸerini, döndürür." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the inverse hyperbolic cosine of the parameter." -msgstr "" +msgstr "Verilen bir deÄŸerin ters hiperbolik cosisnüsünü döndürür." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the arc-sine of the parameter." -msgstr "" +msgstr "Verilen deÄŸerin arc-sinüsünü döndürür." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the inverse hyperbolic sine of the parameter." -msgstr "" +msgstr "Verilen parametrenin ters hiperbolik sinüsünü döndürür." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the arc-tangent of the parameter." -msgstr "" +msgstr "Parametrenin arc-tanjantını döndürür." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the arc-tangent of the parameters." -msgstr "" +msgstr "Parametrelerin arc-tanjantını döndürür." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the inverse hyperbolic tangent of the parameter." -msgstr "" +msgstr "Parametrelerin ters hiperbolik tanjantını döndürür." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Finds the nearest integer that is greater than or equal to the parameter." -msgstr "" +msgstr "parametreye eÅŸit ya da büyük eÅŸit olan en yakın tam sayıyı bulur." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Constrains a value to lie between two further values." -msgstr "" +msgstr "Bir deÄŸerin belirtilen iki deÄŸer arasına yerleÅŸtirilmesini saÄŸlar." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the cosine of the parameter." -msgstr "" +msgstr "Parametrenin cosinüsünü döndürür." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the hyperbolic cosine of the parameter." -msgstr "" +msgstr "Parametrenin hiperbolik cosinüsünü döndürür." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Converts a quantity in radians to degrees." -msgstr "" +msgstr "Radian ÅŸeklindeki açıyı derece tipine çevirir." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Base-e Exponential." -msgstr "" +msgstr "e-tabanlı Ãœstel." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Base-2 Exponential." -msgstr "" +msgstr "2 Tabanlı Ãœstel." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Finds the nearest integer less than or equal to the parameter." -msgstr "" +msgstr "Parametreye eÅŸit ya da küçük eÅŸit olan en yakın tam sayıyı bulur." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Computes the fractional part of the argument." -msgstr "" +msgstr "Verilen deÄŸerin küsüratlı kısmını hesaplar." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the inverse of the square root of the parameter." -msgstr "" +msgstr "Verilen deÄŸerin karekökünün tersini döndürür." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Natural logarithm." -msgstr "" +msgstr "DoÄŸal Algoritma." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Base-2 logarithm." -msgstr "" +msgstr "2-Tabanında algoritma." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the greater of two values." -msgstr "" +msgstr "Ä°ki parametreden büyük olanı döndürür." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the lesser of two values." -msgstr "" +msgstr "Ä°ki parametreden küçük olanı döndürür." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Linear interpolation between two scalars." -msgstr "" +msgstr "Ä°ki katsayı arasında doÄŸrusal geçiÅŸ deÄŸerleri yaratımı." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the opposite value of the parameter." -msgstr "" +msgstr "Verilen deÄŸerin zıt deÄŸerini döndürür." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "1.0 - scalar" -msgstr "" +msgstr "1.0 - katsayı" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns the value of the first parameter raised to the power of the second." -msgstr "" +msgstr "Ä°lk sayı üzeri ikinci sayı deÄŸerini döndürür." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Converts a quantity in degrees to radians." -msgstr "" +msgstr "Derece deÄŸerini radian deÄŸerine dönüştürür." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "1.0 / scalar" -msgstr "" +msgstr "1.0 / katsayı" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Finds the nearest integer to the parameter." -msgstr "" +msgstr "Verilen deÄŸere en yakın tamsayıyı bulur." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Finds the nearest even integer to the parameter." -msgstr "" +msgstr "Verilen deÄŸere en yakın çift sayıyı bulur." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Clamps the value between 0.0 and 1.0." -msgstr "" +msgstr "DeÄŸeri 0.0 ile 1.0 arasına kısıtlar." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Extracts the sign of the parameter." -msgstr "" +msgstr "Verilen deÄŸerin iÅŸaretini çıkarır." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the sine of the parameter." -msgstr "" +msgstr "Verilen deÄŸerin sinüsünü döndürür." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the hyperbolic sine of the parameter." -msgstr "" +msgstr "verilen deÄŸerin hiperbolik sinüsünü döndürür." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the square root of the parameter." -msgstr "" +msgstr "verilen deÄŸerin karekökünü döndürür." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -8862,6 +8643,11 @@ msgid "" "'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 " "using Hermite polynomials." msgstr "" +"SmoothStep iÅŸlevi( katsayı(köşe0), katsayı(köşe1), katsayı(x) ).\n" +"\n" +"DöndüreceÄŸi deÄŸer 0.0 eÄŸer 'x' 'köşe0' dan küçükse ve 1.0 eÄŸer x 'köşe1' den " +"büyükse. Aksi takdirde dödüreceÄŸi deÄŸer Hermite polinomları ile 0.0 ve 1.0 " +"arasında hesaplanan deÄŸerdir." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -8869,76 +8655,73 @@ msgid "" "\n" "Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0." msgstr "" +"Step iÅŸlevi( scalar(edge), scalar(x) ).\n" +"\n" +"EÄŸer x edge'den küçükse 0.0 aksi durumda ise 1.0 döndürür." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the tangent of the parameter." -msgstr "" +msgstr "Verilen deÄŸerin tanjantını döndürür." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the hyperbolic tangent of the parameter." -msgstr "" +msgstr "Verilen deÄŸerin hiperbolik tanjantını döndürür." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Finds the truncated value of the parameter." -msgstr "" +msgstr "Verilen deÄŸerin budanmış halini bulur." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Adds scalar to scalar." -msgstr "" +msgstr "Katsayıyı baÅŸka bir katsayıya ekler." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Divides scalar by scalar." -msgstr "" +msgstr "Katsayıyı baÅŸka bir katsayıya böler." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Multiplies scalar by scalar." -msgstr "" +msgstr "Katsayıyı baÅŸka bir katsayı ile çarpar." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the remainder of the two scalars." -msgstr "" +msgstr "Ä°ki katsayının kalanını döndürür." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Subtracts scalar from scalar." -msgstr "" +msgstr "Katsayıdan baÅŸka bir katsayıyı çıkarır." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Scalar constant." -msgstr "Basamaklı Sabiti DeÄŸiÅŸtir" +msgstr "Katsayı Sabit." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Scalar uniform." -msgstr "Basamaklı Tekdüzenini DeÄŸiÅŸtir" +msgstr "Katsayı uniform." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Perform the cubic texture lookup." -msgstr "" +msgstr "kübik doku arama iÅŸlemi gerçekleÅŸtir." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Perform the texture lookup." -msgstr "" +msgstr "Doku arama gerçekleÅŸtir." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Cubic texture uniform lookup." -msgstr "Doku Tekdüzenini DeÄŸiÅŸtir" +msgstr "Kübik doku uniformu arama." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "2D texture uniform lookup." -msgstr "Doku Tekdüzenini DeÄŸiÅŸtir" +msgstr "2D doku uniform arama." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "2D texture uniform lookup with triplanar." -msgstr "Doku Tekdüzenini DeÄŸiÅŸtir" +msgstr "üç katlı 2D doku uniformu araması." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Transform function." -msgstr "Dönüştürme Ä°letiÅŸim Kutusu..." +msgstr "Dönüştürme iÅŸlevi." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -8950,74 +8733,77 @@ msgid "" "whose number of rows is the number of components in 'c' and whose number of " "columns is the number of components in 'r'." msgstr "" +"Verilen iki vektörün dışsal ürününü hesaplar.\n" +"\n" +"OuterProduct ilk parametre 'c' 'yi kolon vektör olarak ele alır. (tek " +"sütunlu matrix) ve ikinci parametre 'r' yi ise yatay vektör (tek satırlı " +"matrix) olarak ele alır. doÄŸrusal cebirsel çarpım yapar: 'c * r', 'c' 'nin " +"bileÅŸenleri miktarınca satırı olan bir matrix üretir. Bu matrix'in kolon " +"sayısı ise 'r' 'nin bileÅŸen sayısına eÅŸit olur." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Composes transform from four vectors." -msgstr "" +msgstr "Dört vektör ile dönüşüm tanımlar." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Decomposes transform to four vectors." -msgstr "" +msgstr "Dönüşümü dört vektöre dağıtır." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Calculates the determinant of a transform." -msgstr "" +msgstr "Dönüşümün determinantını hesaplar." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Calculates the inverse of a transform." -msgstr "" +msgstr "Dönüşümün tersini hesaplar." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Calculates the transpose of a transform." -msgstr "" +msgstr "Dönüşümün dikey-yatay dönüşümünü hesaplar." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Multiplies transform by transform." -msgstr "" +msgstr "Dönüşüm ile Dönüşüm çarpımı yapar." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Multiplies vector by transform." -msgstr "" +msgstr "Vektör ile Dönüşüm Çarpımı yapar." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Transform constant." -msgstr "Dönüşüm Durduruldu." +msgstr "Dönüşüm sabiti." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Transform uniform." -msgstr "Dönüşüm Durduruldu." +msgstr "Dönüşüm uniformu." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Vector function." -msgstr "Ä°ÅŸleve Git..." +msgstr "Vektör Ä°ÅŸlevi." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Vector operator." -msgstr "Vec Ä°ÅŸletmenini DeÄŸiÅŸtir" +msgstr "Vektör Operatörü." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Composes vector from three scalars." -msgstr "" +msgstr "Üç katsayıdan vektör üretir." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Decomposes vector to three scalars." -msgstr "" +msgstr "Vektörü üç katsayıya dağıtır." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Calculates the cross product of two vectors." -msgstr "" +msgstr "Ä°ki vektörün Çapraz Ãœrününü hesaplar." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the distance between two points." -msgstr "" +msgstr "Ä°ki nokta arasındaki uzaklığı döndürür." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Calculates the dot product of two vectors." -msgstr "" +msgstr "Ä°ki vektörün Nokta Ãœrününü hesaplar." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -9026,40 +8812,45 @@ msgid "" "incident vector, and Nref, the reference vector. If the dot product of I and " "Nref is smaller than zero the return value is N. Otherwise -N is returned." msgstr "" +"Referans vektörle aynı yöne bakan vektörü döndürür. Ä°ÅŸlev için üç adet " +"vektör parametresi gereklidir : N, odak vektörü, I, olay vektörü ve Nref, " +"referans vektörü. EÄŸer I ve Nref'in Nokta Ãœrünü sıfırdan küçükse Sonuç " +"deÄŸeri N olur. Aksi takdirde -N döndürülür." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Calculates the length of a vector." -msgstr "" +msgstr "Bir vektörün uzunluÄŸunu hesaplar." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Linear interpolation between two vectors." -msgstr "" +msgstr "Ä°ki vektör arasında doÄŸrusal geçiÅŸ deÄŸerleri hesaplama." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Linear interpolation between two vectors using scalar." -msgstr "" +msgstr "Katsayı kullanarak iki vektör arasındaki ara deÄŸerleri hesaplama." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Calculates the normalize product of vector." -msgstr "" +msgstr "Vektör ürünü normalleÅŸtirmesini hesaplar." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "1.0 - vector" -msgstr "" +msgstr "1.0 - vektör" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "1.0 / vector" -msgstr "" +msgstr "1.0 / vektör" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns the vector that points in the direction of reflection ( a : incident " "vector, b : normal vector )." msgstr "" +"Yansıma yönüne bakan vektör döndürür. (a : olay vektörü, b : normal vektör )." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the vector that points in the direction of refraction." -msgstr "" +msgstr "Kırılma yönüne bakan vektör dündürür." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -9069,6 +8860,11 @@ msgid "" "'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 " "using Hermite polynomials." msgstr "" +"SmoothStep iÅŸlevi( vektör(edge0), vektör(edge1), vektör(x) ).\n" +"\n" +"0.0 döndürür eÄŸer 'x' 'edge0''den küçükse, ve 1.0 eÄŸer 'x' 'edge1'' den " +"büyükse. Aksi takdirde dönen deÄŸer 0.0 ve 1.0 arasından Hermite polinom " +"hesabıyla döndürürlür." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -9078,6 +8874,11 @@ msgid "" "'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 " "using Hermite polynomials." msgstr "" +"SmoothStep iÅŸlevi( katsayı(edge0), katsayı(edge1), katsayı(x) ).\n" +"\n" +"0.0 döndürür eÄŸer 'x' 'edge0''den küçükse, ve 1.0 eÄŸer 'x' 'edge1'' den " +"büyükse. Aksi takdirde dönen deÄŸer 0.0 ve 1.0 arasından Hermite polinom " +"hesabıyla döndürülür." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -9085,6 +8886,9 @@ msgid "" "\n" "Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0." msgstr "" +"Step Ä°ÅŸlevi( vektör(edge), vektör(x) ).\n" +"\n" +"0.0 döndürür eÄŸer 'x' 'edge''dan küçükse, deÄŸilse 1.0 döndürür." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -9092,36 +8896,37 @@ msgid "" "\n" "Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0." msgstr "" +"Step function( katsayı(edge), vektör(x) ).\n" +"\n" +"0.0 döndürür eÄŸer 'x' 'edge''den küçükse aksi ise 1.0." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Adds vector to vector." -msgstr "" +msgstr "Vektörü baÅŸka vektöre ekler." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Divides vector by vector." -msgstr "" +msgstr "Vektörü baÅŸka vektörle böler." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Multiplies vector by vector." -msgstr "" +msgstr "Vektörü baÅŸka vektörler çarpar." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the remainder of the two vectors." -msgstr "" +msgstr "iki vektörün kalanını döndürür." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Subtracts vector from vector." -msgstr "" +msgstr "Vektörden baÅŸka bir vektörü çıkarır." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Vector constant." -msgstr "Vec Sabitini DeÄŸiÅŸtir" +msgstr "Vektör Sabit." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Vector uniform." -msgstr "Vec Tekdüzenini DeÄŸiÅŸtir" +msgstr "Vektörel uniform." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -9138,9 +8943,10 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Custom Godot Shader Language expression, which placed on top of the resulted " -"shader. You can place various function definitions inside and call it later " -"in the Expressions. You can also declare varyings, uniforms and constants." +"Custom Godot Shader Language expression, which is placed on top of the " +"resulted shader. You can place various function definitions inside and call " +"it later in the Expressions. You can also declare varyings, uniforms and " +"constants." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -9219,6 +9025,8 @@ msgid "" "Failed to export the project for platform '%s'.\n" "Export templates seem to be missing or invalid." msgstr "" +"'%s' platformu için proje dışa aktarılamadı.\n" +"Dışa aktarma ÅŸablonları eksik veya hatalı görünüyor." #: editor/project_export.cpp msgid "" @@ -9226,16 +9034,17 @@ msgid "" "This might be due to a configuration issue in the export preset or your " "export settings." msgstr "" +"'%s' platformu için proje dışa aktarılamadı.\n" +"Bu, dışa aktarma ön ayarlarındaki ya da dışa aktarma ayarlarınızdaki bir " +"yapılandırma sorunundan kaynaklanıyor olabilir." #: editor/project_export.cpp -#, fuzzy msgid "Release" -msgstr "yeni bırakıldı" +msgstr "Yayınlamak" #: editor/project_export.cpp -#, fuzzy msgid "Exporting All" -msgstr "%s için Dışa Aktarım" +msgstr "Tümünü Dışa Aktarma" #: editor/project_export.cpp #, fuzzy @@ -9255,6 +9064,12 @@ msgid "Add..." msgstr "Ekle..." #: editor/project_export.cpp +msgid "" +"If checked, the preset will be available for use in one-click deploy.\n" +"Only one preset per platform may be marked as runnable." +msgstr "" + +#: editor/project_export.cpp #, fuzzy msgid "Export Path" msgstr "Ön Ayarları Dışa Aktar:" @@ -9734,18 +9549,6 @@ msgid "Device" msgstr "Aygıt" #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Shift+" -msgstr "Shift+" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Alt+" -msgstr "Alt+" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Control+" -msgstr "Denetim+" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "Press a Key..." msgstr "Bir Dokunaca Basın..." @@ -10822,9 +10625,8 @@ msgid "Profiler" msgstr "Kesitçi" #: editor/script_editor_debugger.cpp -#, fuzzy msgid "Network Profiler" -msgstr "Projeyi Dışa Aktar" +msgstr "AÄŸ Profilcisi" #: editor/script_editor_debugger.cpp msgid "Monitor" @@ -11568,7 +11370,7 @@ msgid "Can't create function of nodes from nodes of multiple functions." msgstr "" #: modules/visual_script/visual_script_editor.cpp -msgid "Select atleast one node with sequence port." +msgid "Select at least one node with sequence port." msgstr "" #: modules/visual_script/visual_script_editor.cpp @@ -11888,10 +11690,20 @@ msgstr "Açılış ekranı resim dosyası okunamadı." #: platform/uwp/export/export.cpp #, fuzzy +msgid "Invalid package short name." +msgstr "Geçersiz sınıf ismi" + +#: platform/uwp/export/export.cpp +#, fuzzy msgid "Invalid package unique name." msgstr "Benzersiz Ad Geçersiz." #: platform/uwp/export/export.cpp +#, fuzzy +msgid "Invalid package publisher display name." +msgstr "Benzersiz Ad Geçersiz." + +#: platform/uwp/export/export.cpp msgid "Invalid product GUID." msgstr "Geçersiz ürün GUID'i." @@ -12542,6 +12354,18 @@ msgstr "DeÄŸiÅŸkenler yalnızca tepe iÅŸlevinde atanabilir." msgid "Constants cannot be modified." msgstr "Sabit deÄŸerler deÄŸiÅŸtirilemez." +#~ msgid "Pause the scene" +#~ msgstr "Sahneyi duraklat" + +#~ msgid "Shift+" +#~ msgstr "Shift+" + +#~ msgid "Alt+" +#~ msgstr "Alt+" + +#~ msgid "Control+" +#~ msgstr "Denetim+" + #, fuzzy #~ msgid "Snap to Grid" #~ msgstr "Izgaraya yapış" diff --git a/editor/translations/uk.po b/editor/translations/uk.po index 8b99271a09..881e8f1911 100644 --- a/editor/translations/uk.po +++ b/editor/translations/uk.po @@ -16,8 +16,8 @@ msgid "" msgstr "" "Project-Id-Version: Ukrainian (Godot Engine)\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2019-10-11 15:07+0000\n" -"Last-Translator: Богдан Матвіїв <bomtvv@gmail.com>\n" +"PO-Revision-Date: 2019-11-25 04:04+0000\n" +"Last-Translator: Yuri Chornoivan <yurchor@ukr.net>\n" "Language-Team: Ukrainian <https://hosted.weblate.org/projects/godot-engine/" "godot/uk/>\n" "Language: uk\n" @@ -26,7 +26,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 3.9-dev\n" +"X-Generator: Weblate 3.10-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -641,9 +641,8 @@ msgid "Scale Ratio:" msgstr "Ð¡Ð¿Ñ–Ð²Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ Ð¼Ð°Ñштабу:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Select Tracks to Copy" -msgstr "Виберіть доріжки Ð´Ð»Ñ ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ:" +msgstr "Виберіть доріжки Ð´Ð»Ñ ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ" #: editor/animation_track_editor.cpp editor/editor_log.cpp #: editor/editor_properties.cpp @@ -655,9 +654,8 @@ msgid "Copy" msgstr "Копіювати" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Select All/None" -msgstr "СкаÑувати позначеннÑ" +msgstr "Позначити вÑе/СкаÑувати позначеннÑ" #: editor/animation_track_editor_plugins.cpp msgid "Add Audio Track Clip" @@ -2899,8 +2897,8 @@ msgid "Play" msgstr "Відтворити" #: editor/editor_node.cpp -msgid "Pause the scene" -msgstr "Призупинити Ñцену" +msgid "Pause the scene execution for debugging." +msgstr "Призупинити Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ñцени Ð´Ð»Ñ Ð´Ñ–Ð°Ð³Ð½Ð¾Ñтики." #: editor/editor_node.cpp msgid "Pause Scene" @@ -3593,6 +3591,10 @@ msgid "New Inherited Scene" msgstr "Ðова уÑпадкована Ñцена" #: editor/filesystem_dock.cpp +msgid "Set As Main Scene" +msgstr "Ð’Ñтановити головною Ñценою" + +#: editor/filesystem_dock.cpp msgid "Open Scenes" msgstr "Відкрити Ñцени" @@ -4325,6 +4327,18 @@ msgstr "" "неможливо отримати назви доріжок." #: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Anim Clips" +msgstr "Кліпи анімації" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Audio Clips" +msgstr "Звукові кліпи" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Functions" +msgstr "Функції" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/animation_state_machine_editor.cpp msgid "Node Renamed" msgstr "Перейменовано вузол" @@ -4915,7 +4929,7 @@ msgstr "Ð’Ñе" #: editor/plugins/asset_library_editor_plugin.cpp msgid "No results for \"%s\"." -msgstr "" +msgstr "Ðічого не знайдено Ð´Ð»Ñ Â«%s»." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Import..." @@ -5004,6 +5018,14 @@ msgid "Grid Step:" msgstr "Крок Ñітки:" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Primary Line Every:" +msgstr "ОÑновна Ð»Ñ–Ð½Ñ–Ñ ÐºÐ¾Ð¶Ð½Ñ–:" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "steps" +msgstr "кроки" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotation Offset:" msgstr "ВідÑтуп повороту:" @@ -5012,6 +5034,10 @@ msgid "Rotation Step:" msgstr "Крок повороту:" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale Step:" +msgstr "Крок маÑштабу:" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move Vertical Guide" msgstr "ПереміÑтити вертикальну напрÑмну" @@ -5097,6 +5123,24 @@ msgstr "Змінити прив'Ñзки" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"Overrides game camera with editor viewport camera." +msgstr "" +"ÐŸÐµÑ€ÐµÐ²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ ÐºÐ°Ð¼ÐµÑ€Ð¸ гри\n" +"Замінює камеру гри камерою видимої облаÑÑ‚Ñ– редактора." + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"No game instance running." +msgstr "" +"ÐŸÐµÑ€ÐµÐ²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ ÐºÐ°Ð¼ÐµÑ€Ð¸ гри\n" +"Ðемає запущеного екземплÑра гри." + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp msgid "Lock Selected" msgstr "Заблокувати позначене" @@ -5213,24 +5257,20 @@ msgid "Ruler Mode" msgstr "Режим вимірюваннÑ" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Toggle smart snapping." -msgstr "Увімкнути або вимкнути прив'ÑзуваннÑ." +msgstr "Увімкнути або вимкнути кмітливе прив'ÑзуваннÑ." #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Use Smart Snap" -msgstr "За допомогою функції прив'Ñзки" +msgstr "ВикориÑтати кмітливе прив'ÑзуваннÑ" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Toggle grid snapping." -msgstr "Увімкнути або вимкнути прив'ÑзуваннÑ." +msgstr "Увімкнути або вимкнути Ð¿Ñ€Ð¸Ð»Ð¸Ð¿Ð°Ð½Ð½Ñ Ð´Ð¾ ґратки." #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Use Grid Snap" -msgstr "ÐŸÑ€Ð¸Ð»Ð¸Ð¿Ð°Ð½Ð½Ñ Ð´Ð¾ ґратки" +msgstr "ВикориÑтати Ð¿Ñ€Ð¸Ð»Ð¸Ð¿Ð°Ð½Ð½Ñ Ð´Ð¾ ґратки" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snapping Options" @@ -5241,6 +5281,10 @@ msgid "Use Rotation Snap" msgstr "ВикориÑÑ‚Ð°Ð½Ð½Ñ Ð¾Ð±ÐµÑ€Ñ‚Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¸Ð²'Ñзки" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Use Scale Snap" +msgstr "ВикориÑтати прив'ÑÐ·ÑƒÐ²Ð°Ð½Ð½Ñ Ð¼Ð°Ñштабу" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap Relative" msgstr "ВідноÑна прив'Ñзка" @@ -5323,9 +5367,8 @@ msgid "View" msgstr "ПереглÑд" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Always Show Grid" -msgstr "Показати Ñітку" +msgstr "Завжди показувати ґратку" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Show Helpers" @@ -5381,7 +5424,7 @@ msgstr "Ð’Ñтавити ключові кадри (на оÑнові маÑки #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" -"Auto insert keys when objects are translated, rotated on scaled (based on " +"Auto insert keys when objects are translated, rotated or scaled (based on " "mask).\n" "Keys are only added to existing tracks, no new tracks will be created.\n" "Keys must be inserted manually for the first time." @@ -5593,9 +5636,8 @@ msgid "Hold Shift to edit tangents individually" msgstr "Утримуйте Shift, щоб змінити дотичні окремо" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Right click to add point" -msgstr "Клацніть правою кнопкою миші: видалити точку" +msgstr "Клацніть правою кнопкою миші, щоб додати точку" #: editor/plugins/gi_probe_editor_plugin.cpp msgid "Bake GI Probe" @@ -7050,9 +7092,8 @@ msgid "Freelook Speed Modifier" msgstr "Коефіцієнт швидкоÑÑ‚Ñ– оглÑду" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Freelook Slow Modifier" -msgstr "Коефіцієнт швидкоÑÑ‚Ñ– оглÑду" +msgstr "Модифікатор швидкоÑÑ‚Ñ– довільного оглÑду" #: editor/plugins/spatial_editor_plugin.cpp msgid "" @@ -7326,9 +7367,8 @@ msgid "Simplification: " msgstr "СпрощеннÑ: " #: editor/plugins/sprite_editor_plugin.cpp -#, fuzzy msgid "Shrink (Pixels): " -msgstr "ЗроÑÑ‚Ð°Ð½Ð½Ñ (пікÑелі): " +msgstr "СтиÑÐºÐ°Ð½Ð½Ñ (пікÑелі): " #: editor/plugins/sprite_editor_plugin.cpp msgid "Grow (Pixels): " @@ -8117,9 +8157,8 @@ msgid "(GLES3 only)" msgstr "(лише GLES3)" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Add Output" -msgstr "Додати вихід +" +msgstr "Додати вихід" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Scalar" @@ -8135,7 +8174,7 @@ msgstr "Булеве" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Sampler" -msgstr "" +msgstr "Зразок" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Add input port" @@ -8267,8 +8306,8 @@ msgid "Dodge operator." msgstr "Оператор виÑвітленнÑ." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "HardLight operator" -msgstr "Оператор ÑÑкравого Ñвітла" +msgid "HardLight operator." +msgstr "Оператор ÑÑкравого Ñвітла." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Lighten operator." @@ -8910,9 +8949,10 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Custom Godot Shader Language expression, which placed on top of the resulted " -"shader. You can place various function definitions inside and call it later " -"in the Expressions. You can also declare varyings, uniforms and constants." +"Custom Godot Shader Language expression, which is placed on top of the " +"resulted shader. You can place various function definitions inside and call " +"it later in the Expressions. You can also declare varyings, uniforms and " +"constants." msgstr "" "Ðетиповий вираз мовою шейдерів Godot, Ñкий буде додано над отриманим " "шейдером. Ви можете розташовувати різні Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ„ÑƒÐ½ÐºÑ†Ñ–Ð¹ вÑередині коду Ñ– " @@ -9042,6 +9082,14 @@ msgid "Add..." msgstr "Додати..." #: editor/project_export.cpp +msgid "" +"If checked, the preset will be available for use in one-click deploy.\n" +"Only one preset per platform may be marked as runnable." +msgstr "" +"Якщо позначено, набором можна буде ÑкориÑтатиÑÑ Ð² одне клацаннÑ.\n" +"Придатним до запуÑку можна визначати лише один набір на одну платформу." + +#: editor/project_export.cpp msgid "Export Path" msgstr "ШлÑÑ… екÑпорту" @@ -9070,22 +9118,20 @@ msgid "Resources to export:" msgstr "ЕкÑпортовані реÑурÑи:" #: editor/project_export.cpp -#, fuzzy msgid "" "Filters to export non-resource files/folders\n" "(comma-separated, e.g: *.json, *.txt, docs/*)" msgstr "" -"Фільтри екÑÐ¿Ð¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð², Ñкі не міÑÑ‚ÑÑ‚ÑŒ реÑурÑів (з відокремленнÑм " -"комами, приклад: *.json, *.txt)" +"Фільтри екÑÐ¿Ð¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð² або тек, Ñкі не міÑÑ‚ÑÑ‚ÑŒ реÑурÑів\n" +"(з відокремленнÑм комами, приклад: *.json, *.txt, docs/*)" #: editor/project_export.cpp -#, fuzzy msgid "" "Filters to exclude files/folders from project\n" "(comma-separated, e.g: *.json, *.txt, docs/*)" msgstr "" -"Фільтри Ð²Ð¸ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð² з проєкту (з відокремленнÑм комами, приклад: *." -"json, *.txt)" +"Фільтри Ð²Ð¸ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð² або тек з проєкту\n" +"(з відокремленнÑм комами, приклад: *.json, *.txt, docs/*)" #: editor/project_export.cpp msgid "Patches" @@ -9535,18 +9581,6 @@ msgid "Device" msgstr "ПриÑтрій" #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Shift+" -msgstr "Shift+" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Alt+" -msgstr "Alt+" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Control+" -msgstr "Ctrl+" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "Press a Key..." msgstr "ÐатиÑніть клавішу,..." @@ -10131,13 +10165,12 @@ msgstr "" "уÑÑ–Ñ… влаÑтивоÑтей вузла." #: editor/scene_tree_dock.cpp -#, fuzzy msgid "" "Enabling \"Load As Placeholder\" will disable \"Editable Children\" and " "cause all properties of the node to be reverted to their default." msgstr "" -"Ð’Ð¸Ð¼Ð¸ÐºÐ°Ð½Ð½Ñ Â«editable_instance» призведе до Ð¿Ð¾Ð²ÐµÑ€Ð½ÐµÐ½Ð½Ñ Ñ‚Ð¸Ð¿Ð¾Ð²Ð¸Ñ… значень Ð´Ð»Ñ " -"уÑÑ–Ñ… влаÑтивоÑтей вузла." +"Ð’Ð¼Ð¸ÐºÐ°Ð½Ð½Ñ Â«Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ Ñк заповнювач» призведе до Ð²Ð¸Ð¼Ð¸ÐºÐ°Ð½Ð½Ñ Â«Ð ÐµÐ´Ð°Ð³Ð¾Ð²Ð°Ð½Ñ– " +"дочірні об'єкти» Ñ– Ð¿Ð¾Ð²ÐµÑ€Ð½ÐµÐ½Ð½Ñ Ñ‚Ð¸Ð¿Ð¾Ð²Ð¸Ñ… значень Ð´Ð»Ñ ÑƒÑÑ–Ñ… влаÑтивоÑтей вузла." #: editor/scene_tree_dock.cpp msgid "Make Local" @@ -10476,19 +10509,16 @@ msgid "Will load an existing script file." msgstr "Завантажити наÑвний файл Ñкрипту." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Class Name:" -msgstr "Ðазва клаÑу" +msgstr "Ðазва клаÑу:" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Template:" -msgstr "Шаблон" +msgstr "Шаблон:" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Built-in Script:" -msgstr "Вбудований Ñкрипт" +msgstr "Вбудований Ñкрипт:" #: editor/script_create_dialog.cpp msgid "Attach Node Script" @@ -11130,7 +11160,6 @@ msgid "Add Function" msgstr "Додати функцію" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Delete input port" msgstr "Вилучити вхідний порт" @@ -11143,22 +11172,18 @@ msgid "Add Signal" msgstr "Додати Ñигнал" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Add Input Port" msgstr "Додати вхідний порт" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Add Output Port" msgstr "Додати вихідний порт" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Remove Input Port" msgstr "Вилучити вхідний порт" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Remove Output Port" msgstr "Вилучити вихідний порт" @@ -11209,6 +11234,8 @@ msgstr "Додати попередньо завантажений вузол" #: modules/visual_script/visual_script_editor.cpp msgid "Can't drop nodes because script '%s' is not used in this scene." msgstr "" +"Ð¡ÐºÐ¸Ð´Ð°Ð½Ð½Ñ Ð²ÑƒÐ·Ð»Ñ–Ð² Ñ” неможливим, оÑкільки у цій Ñцені не викориÑтовуєтьÑÑ " +"Ñкрипт «%s»." #: modules/visual_script/visual_script_editor.cpp msgid "Add Node(s) From Tree" @@ -11219,6 +11246,10 @@ msgid "" "Can't drop properties because script '%s' is not used in this scene.\n" "Drop holding 'Shift' to just copy the signature." msgstr "" +"Ð¡ÐºÐ¸Ð´Ð°Ð½Ð½Ñ Ð²Ð»Ð°ÑтивоÑтей неможливе, оÑкільки у цій Ñцені не викориÑтовуєтьÑÑ " +"Ñкрипт «%s».\n" +"Скиньте, утримуючи натиÑнутою клавішу «Shift», Ñкщо проÑто хочете Ñкопіювати " +"підпиÑ." #: modules/visual_script/visual_script_editor.cpp msgid "Add Getter Property" @@ -11245,9 +11276,8 @@ msgid "Connect Nodes" msgstr "Приєднати вузли" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Disconnect Nodes" -msgstr "Роз'єднати вузли графу" +msgstr "Від'єднати вузли" #: modules/visual_script/visual_script_editor.cpp msgid "Connect Node Data" @@ -11282,26 +11312,25 @@ msgid "Paste VisualScript Nodes" msgstr "Ð’Ñтавити вузли (Візуального Ñкриптингу) VisualScript" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Can't create function with a function node." -msgstr "Ðеможливо Ñкопіювати вузол функції." +msgstr "Ðеможливо Ñтворити функцію із вузлом функції." #: modules/visual_script/visual_script_editor.cpp msgid "Can't create function of nodes from nodes of multiple functions." -msgstr "" +msgstr "Ðеможливо Ñтворити функцію вузлів на оÑнові вузлів декількох функцій." #: modules/visual_script/visual_script_editor.cpp -msgid "Select atleast one node with sequence port." -msgstr "" +msgid "Select at least one node with sequence port." +msgstr "Виберіть принаймні один вузол із портом поÑлідовноÑÑ‚Ñ–." #: modules/visual_script/visual_script_editor.cpp msgid "Try to only have one sequence input in selection." msgstr "" +"Спробуйте зробити так, щоб у позначеному був лише один вхід поÑлідовноÑÑ‚Ñ–." #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Create Function" -msgstr "Перейменувати функцію" +msgstr "Створити функцію" #: modules/visual_script/visual_script_editor.cpp msgid "Remove Function" @@ -11332,9 +11361,8 @@ msgid "Members:" msgstr "Члени:" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "function_name" -msgstr "ФункціÑ:" +msgstr "назва_функції" #: modules/visual_script/visual_script_editor.cpp msgid "Select or create a function to edit its graph." @@ -11357,14 +11385,12 @@ msgid "Cut Nodes" msgstr "Вирізати вузли" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Make Function" -msgstr "Перейменувати функцію" +msgstr "Створити функцію" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Refresh Graph" -msgstr "Оновити" +msgstr "Оновити граф" #: modules/visual_script/visual_script_editor.cpp msgid "Edit Member" @@ -11593,7 +11619,7 @@ msgstr "У шаблоні не вказано потрібної піктогрР#: platform/javascript/export/export.cpp msgid "Stop HTTP Server" -msgstr "" +msgstr "Зупинити HTTP-Ñервер" #: platform/javascript/export/export.cpp msgid "Run in Browser" @@ -11628,10 +11654,18 @@ msgid "Using default boot splash image." msgstr "ВикориÑÑ‚Ð°Ð½Ð½Ñ Ñ‚Ð¸Ð¿Ð¾Ð²Ð¾Ð³Ð¾ файлу Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð·Ð°Ñтавки." #: platform/uwp/export/export.cpp +msgid "Invalid package short name." +msgstr "Ðекоректна Ñкорочена назва пакунка." + +#: platform/uwp/export/export.cpp msgid "Invalid package unique name." msgstr "Ðекоректна унікальна назва пакунка." #: platform/uwp/export/export.cpp +msgid "Invalid package publisher display name." +msgstr "Ðекоректна показана назва оприлюднювача пакунка." + +#: platform/uwp/export/export.cpp msgid "Invalid product GUID." msgstr "Ðекоректний GUID продукту." @@ -12296,6 +12330,18 @@ msgstr "Змінні величини можна пов'Ñзувати лише msgid "Constants cannot be modified." msgstr "Сталі не можна змінювати." +#~ msgid "Pause the scene" +#~ msgstr "Призупинити Ñцену" + +#~ msgid "Shift+" +#~ msgstr "Shift+" + +#~ msgid "Alt+" +#~ msgstr "Alt+" + +#~ msgid "Control+" +#~ msgstr "Ctrl+" + #~ msgid "Snap to Grid" #~ msgstr "ÐŸÑ€Ð¸Ð»Ð¸Ð¿Ð°Ð½Ð½Ñ Ð´Ð¾ Ñітки" diff --git a/editor/translations/ur_PK.po b/editor/translations/ur_PK.po index c68843bd77..74a0013d39 100644 --- a/editor/translations/ur_PK.po +++ b/editor/translations/ur_PK.po @@ -2813,7 +2813,7 @@ msgid "Play" msgstr "" #: editor/editor_node.cpp -msgid "Pause the scene" +msgid "Pause the scene execution for debugging." msgstr "" #: editor/editor_node.cpp @@ -3490,6 +3490,11 @@ msgstr "سب سکریپشن بنائیں" #: editor/filesystem_dock.cpp #, fuzzy +msgid "Set As Main Scene" +msgstr "ایک مینو منظر چنیں" + +#: editor/filesystem_dock.cpp +#, fuzzy msgid "Open Scenes" msgstr "سب سکریپشن بنائیں" @@ -4221,6 +4226,19 @@ msgid "" msgstr "" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Anim Clips" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Audio Clips" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Functions" +msgstr ".تمام کا انتخاب" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/animation_state_machine_editor.cpp msgid "Node Renamed" msgstr "" @@ -4896,6 +4914,14 @@ msgid "Grid Step:" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Primary Line Every:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "steps" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotation Offset:" msgstr "" @@ -4905,6 +4931,11 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy +msgid "Scale Step:" +msgstr "ایکشن منتقل کریں" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy msgid "Move Vertical Guide" msgstr "سب سکریپشن بنائیں" @@ -4994,6 +5025,20 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"Overrides game camera with editor viewport camera." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"No game instance running." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp #, fuzzy msgid "Lock Selected" msgstr ".تمام کا انتخاب" @@ -5137,6 +5182,10 @@ msgid "Use Rotation Snap" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Use Scale Snap" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap Relative" msgstr "" @@ -5277,7 +5326,7 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" -"Auto insert keys when objects are translated, rotated on scaled (based on " +"Auto insert keys when objects are translated, rotated or scaled (based on " "mask).\n" "Keys are only added to existing tracks, no new tracks will be created.\n" "Keys must be inserted manually for the first time." @@ -8197,7 +8246,7 @@ msgid "Dodge operator." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "HardLight operator" +msgid "HardLight operator." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8788,9 +8837,10 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Custom Godot Shader Language expression, which placed on top of the resulted " -"shader. You can place various function definitions inside and call it later " -"in the Expressions. You can also declare varyings, uniforms and constants." +"Custom Godot Shader Language expression, which is placed on top of the " +"resulted shader. You can place various function definitions inside and call " +"it later in the Expressions. You can also declare varyings, uniforms and " +"constants." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8899,6 +8949,12 @@ msgid "Add..." msgstr "" #: editor/project_export.cpp +msgid "" +"If checked, the preset will be available for use in one-click deploy.\n" +"Only one preset per platform may be marked as runnable." +msgstr "" + +#: editor/project_export.cpp msgid "Export Path" msgstr "" @@ -9343,18 +9399,6 @@ msgid "Device" msgstr "" #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Shift+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Alt+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Control+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "Press a Key..." msgstr "" @@ -11089,7 +11133,7 @@ msgid "Can't create function of nodes from nodes of multiple functions." msgstr "" #: modules/visual_script/visual_script_editor.cpp -msgid "Select atleast one node with sequence port." +msgid "Select at least one node with sequence port." msgstr "" #: modules/visual_script/visual_script_editor.cpp @@ -11400,10 +11444,18 @@ msgid "Using default boot splash image." msgstr "" #: platform/uwp/export/export.cpp +msgid "Invalid package short name." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid package unique name." msgstr "" #: platform/uwp/export/export.cpp +msgid "Invalid package publisher display name." +msgstr "" + +#: platform/uwp/export/export.cpp msgid "Invalid product GUID." msgstr "" diff --git a/editor/translations/vi.po b/editor/translations/vi.po index f3570ad0ff..d92251b862 100644 --- a/editor/translations/vi.po +++ b/editor/translations/vi.po @@ -2866,8 +2866,8 @@ msgid "Play" msgstr "Chạy" #: editor/editor_node.cpp -msgid "Pause the scene" -msgstr "Tạm dừng cảnh" +msgid "Pause the scene execution for debugging." +msgstr "" #: editor/editor_node.cpp msgid "Pause Scene" @@ -3542,6 +3542,11 @@ msgid "New Inherited Scene" msgstr "Tạo Cảnh kế thừa má»›i" #: editor/filesystem_dock.cpp +#, fuzzy +msgid "Set As Main Scene" +msgstr "Chá»n má»™t Scene chÃnh" + +#: editor/filesystem_dock.cpp msgid "Open Scenes" msgstr "Mở cảnh" @@ -4274,6 +4279,21 @@ msgstr "" "TrÃnh phát hoạt ảnh không có Ä‘Æ°á»ng dẫn nút Gốc, không thể truy xuất tên." #: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Anim Clips" +msgstr "Âm thanh:" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Audio Clips" +msgstr "Âm thanh:" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Functions" +msgstr "Hà m:" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/animation_state_machine_editor.cpp msgid "Node Renamed" msgstr "Nút đã đổi tên" @@ -4956,6 +4976,15 @@ msgid "Grid Step:" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Primary Line Every:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "steps" +msgstr "2 bÆ°á»›c" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotation Offset:" msgstr "" @@ -4964,6 +4993,11 @@ msgid "Rotation Step:" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Scale Step:" +msgstr "Tá»· lệ:" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move Vertical Guide" msgstr "" @@ -5053,6 +5087,20 @@ msgstr "Äổi các Neo" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"Overrides game camera with editor viewport camera." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"No game instance running." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp msgid "Lock Selected" msgstr "Khoá lá»±a chá»n" @@ -5193,6 +5241,11 @@ msgid "Use Rotation Snap" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "Use Scale Snap" +msgstr "Sá» dụng Snap" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap Relative" msgstr "" @@ -5334,7 +5387,7 @@ msgstr "Chèn Key Anim" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" -"Auto insert keys when objects are translated, rotated on scaled (based on " +"Auto insert keys when objects are translated, rotated or scaled (based on " "mask).\n" "Keys are only added to existing tracks, no new tracks will be created.\n" "Keys must be inserted manually for the first time." @@ -8288,7 +8341,7 @@ msgid "Dodge operator." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "HardLight operator" +msgid "HardLight operator." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8883,9 +8936,10 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Custom Godot Shader Language expression, which placed on top of the resulted " -"shader. You can place various function definitions inside and call it later " -"in the Expressions. You can also declare varyings, uniforms and constants." +"Custom Godot Shader Language expression, which is placed on top of the " +"resulted shader. You can place various function definitions inside and call " +"it later in the Expressions. You can also declare varyings, uniforms and " +"constants." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8994,6 +9048,12 @@ msgid "Add..." msgstr "" #: editor/project_export.cpp +msgid "" +"If checked, the preset will be available for use in one-click deploy.\n" +"Only one preset per platform may be marked as runnable." +msgstr "" + +#: editor/project_export.cpp #, fuzzy msgid "Export Path" msgstr "Xuất Tile Set" @@ -9445,18 +9505,6 @@ msgid "Device" msgstr "" #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Shift+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Alt+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Control+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "Press a Key..." msgstr "" @@ -11202,7 +11250,7 @@ msgid "Can't create function of nodes from nodes of multiple functions." msgstr "" #: modules/visual_script/visual_script_editor.cpp -msgid "Select atleast one node with sequence port." +msgid "Select at least one node with sequence port." msgstr "" #: modules/visual_script/visual_script_editor.cpp @@ -11514,11 +11562,21 @@ msgstr "Sá» dụng hình khởi Ä‘á»™ng mặc định." #: platform/uwp/export/export.cpp #, fuzzy +msgid "Invalid package short name." +msgstr "KÃch thÆ°á»›c font không hợp lệ." + +#: platform/uwp/export/export.cpp +#, fuzzy msgid "Invalid package unique name." msgstr "KÃch thÆ°á»›c font không hợp lệ." #: platform/uwp/export/export.cpp #, fuzzy +msgid "Invalid package publisher display name." +msgstr "KÃch thÆ°á»›c font không hợp lệ." + +#: platform/uwp/export/export.cpp +#, fuzzy msgid "Invalid product GUID." msgstr "KÃch thÆ°á»›c font không hợp lệ." @@ -12057,6 +12115,9 @@ msgstr "" msgid "Constants cannot be modified." msgstr "Không thể chỉnh sá»a hằng số." +#~ msgid "Pause the scene" +#~ msgstr "Tạm dừng cảnh" + #~ msgid "Snap to Grid" #~ msgstr "Snap dạng lÆ°á»›i" diff --git a/editor/translations/zh_CN.po b/editor/translations/zh_CN.po index 86aa897888..0436963e5a 100644 --- a/editor/translations/zh_CN.po +++ b/editor/translations/zh_CN.po @@ -58,12 +58,13 @@ # idleman <1524328475@qq.com>, 2019. # king <wangding1992@126.com>, 2019. # silentbird <silentbird520@outlook.com>, 2019. +# Haoyu Qiu <timothyqiu32@gmail.com>, 2019. msgid "" msgstr "" "Project-Id-Version: Chinese (Simplified) (Godot Engine)\n" "POT-Creation-Date: 2018-01-20 12:15+0200\n" -"PO-Revision-Date: 2019-10-22 02:53+0000\n" -"Last-Translator: idleman <1524328475@qq.com>\n" +"PO-Revision-Date: 2019-11-29 14:49+0000\n" +"Last-Translator: Haoyu Qiu <timothyqiu32@gmail.com>\n" "Language-Team: Chinese (Simplified) <https://hosted.weblate.org/projects/" "godot-engine/godot/zh_Hans/>\n" "Language: zh_CN\n" @@ -71,7 +72,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 3.9.1-dev\n" +"X-Generator: Weblate 3.10-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -86,11 +87,11 @@ msgstr "解ç çš„å—节ä¸è¶³ï¼Œæˆ–æ— æ•ˆçš„æ ¼å¼ã€‚" #: core/math/expression.cpp msgid "Invalid input %i (not passed) in expression" -msgstr "表达å¼ä¸æœ‰æ— 效输入 %i (未通过)" +msgstr "表达å¼ä¸çš„输入 %i æ— æ•ˆï¼ˆæœªä¼ é€’ï¼‰" #: core/math/expression.cpp msgid "self can't be used because instance is null (not passed)" -msgstr "selfæ— æ³•ä½¿ç”¨å› ä¸ºå®žä¾‹ä¸ºç©º(未通过)" +msgstr "self æ— æ³•ä½¿ç”¨ï¼Œå› ä¸ºå®žä¾‹ä¸ºç©ºï¼ˆæœªä¼ é€’ï¼‰" #: core/math/expression.cpp msgid "Invalid operands to operator %s, %s and %s." @@ -98,11 +99,11 @@ msgstr "æ“作符 %s çš„æ“作数 %s å’Œ %s æ— æ•ˆã€‚" #: core/math/expression.cpp msgid "Invalid index of type %s for base type %s" -msgstr "类型 %s (基类 %s) çš„ç´¢å¼•æ— æ•ˆ" +msgstr "å°† %s 类型作为 %s åŸºç¡€ç±»åž‹çš„ç´¢å¼•æ— æ•ˆ" #: core/math/expression.cpp msgid "Invalid named index '%s' for base type %s" -msgstr "命å的索引 '%s' 对基类 %s æ— æ•ˆ" +msgstr "å°† '%s' 作为 %s 基础类型的具åç´¢å¼•æ— æ•ˆ" #: core/math/expression.cpp msgid "Invalid arguments to construct '%s'" @@ -110,7 +111,7 @@ msgstr "æž„é€ '%s' çš„å‚æ•°æ— æ•ˆ" #: core/math/expression.cpp msgid "On call to '%s':" -msgstr "对'%s'的调用 :" +msgstr "调用 '%s' 时:" #: core/ustring.cpp msgid "B" @@ -118,27 +119,27 @@ msgstr "B" #: core/ustring.cpp msgid "KiB" -msgstr "KB" +msgstr "KiB" #: core/ustring.cpp msgid "MiB" -msgstr "MB" +msgstr "MiB" #: core/ustring.cpp msgid "GiB" -msgstr "GB" +msgstr "GiB" #: core/ustring.cpp msgid "TiB" -msgstr "TB" +msgstr "TiB" #: core/ustring.cpp msgid "PiB" -msgstr "PB" +msgstr "PiB" #: core/ustring.cpp msgid "EiB" -msgstr "EB" +msgstr "EiB" #: editor/animation_bezier_editor.cpp msgid "Free" @@ -146,7 +147,7 @@ msgstr "自由" #: editor/animation_bezier_editor.cpp msgid "Balanced" -msgstr "平衡的" +msgstr "平衡" #: editor/animation_bezier_editor.cpp msgid "Mirror" @@ -162,15 +163,15 @@ msgstr "值:" #: editor/animation_bezier_editor.cpp msgid "Insert Key Here" -msgstr "æ¤å¤„æ’入帧" +msgstr "æ¤å¤„æ’入关键帧" #: editor/animation_bezier_editor.cpp msgid "Duplicate Selected Key(s)" -msgstr "å¤åˆ¶å·²é€‰å¸§" +msgstr "å¤åˆ¶æ‰€é€‰å…³é”®å¸§" #: editor/animation_bezier_editor.cpp msgid "Delete Selected Key(s)" -msgstr "åˆ é™¤å·²é€‰å¸§" +msgstr "åˆ é™¤æ‰€é€‰å…³é”®å¸§" #: editor/animation_bezier_editor.cpp msgid "Add Bezier Point" @@ -182,15 +183,15 @@ msgstr "移动è´å¡žå°”顶点" #: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp msgid "Anim Duplicate Keys" -msgstr "动画å¤åˆ¶å…³é”®å¸§" +msgstr "å¤åˆ¶åŠ¨ç”»å…³é”®å¸§" #: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp msgid "Anim Delete Keys" -msgstr "åŠ¨ç”»åˆ é™¤å…³é”®å¸§" +msgstr "åˆ é™¤åŠ¨ç”»å…³é”®å¸§" #: editor/animation_track_editor.cpp msgid "Anim Change Keyframe Time" -msgstr "修改动画关键帧的时长" +msgstr "修改动画关键帧的时间" #: editor/animation_track_editor.cpp msgid "Anim Change Transition" @@ -206,11 +207,11 @@ msgstr "修改动画关键帧的值" #: editor/animation_track_editor.cpp msgid "Anim Change Call" -msgstr "修改回调" +msgstr "修改动画回调" #: editor/animation_track_editor.cpp msgid "Anim Multi Change Keyframe Time" -msgstr "修改多个动画关键帧的时长" +msgstr "修改多个动画关键帧的时间" #: editor/animation_track_editor.cpp msgid "Anim Multi Change Transition" @@ -673,9 +674,8 @@ msgid "Scale Ratio:" msgstr "缩放比率:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Select Tracks to Copy" -msgstr "选择è¦å¤åˆ¶çš„轨é“:" +msgstr "选择è¦å¤åˆ¶çš„轨é“" #: editor/animation_track_editor.cpp editor/editor_log.cpp #: editor/editor_properties.cpp @@ -687,9 +687,8 @@ msgid "Copy" msgstr "å¤åˆ¶" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Select All/None" -msgstr "å–消选择" +msgstr "å–消/选择 全部" #: editor/animation_track_editor_plugins.cpp msgid "Add Audio Track Clip" @@ -2870,8 +2869,8 @@ msgid "Play" msgstr "æ’放" #: editor/editor_node.cpp -msgid "Pause the scene" -msgstr "æš‚åœè¿è¡Œåœºæ™¯" +msgid "Pause the scene execution for debugging." +msgstr "æš‚åœè¿è¡Œåœºæ™¯ï¼Œä»¥ä¾¿è¿›è¡Œè°ƒè¯•ã€‚" #: editor/editor_node.cpp msgid "Pause Scene" @@ -3547,6 +3546,10 @@ msgid "New Inherited Scene" msgstr "新继承的场景" #: editor/filesystem_dock.cpp +msgid "Set As Main Scene" +msgstr "设为主场景" + +#: editor/filesystem_dock.cpp msgid "Open Scenes" msgstr "打开场景" @@ -4263,6 +4266,18 @@ msgid "" msgstr "动画æ’放器没有åˆæ³•çš„æ ¹èŠ‚ç‚¹è·¯å¾„ï¼Œå› æ¤æ— 法获å–轨é“å称。" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Anim Clips" +msgstr "动画剪辑" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Audio Clips" +msgstr "音频剪辑" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Functions" +msgstr "函数" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/animation_state_machine_editor.cpp msgid "Node Renamed" msgstr "节点已é‡å‘½å" @@ -4850,7 +4865,7 @@ msgstr "全部" #: editor/plugins/asset_library_editor_plugin.cpp msgid "No results for \"%s\"." -msgstr "" +msgstr "未找到 \"%s\"。" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Import..." @@ -4935,6 +4950,14 @@ msgid "Grid Step:" msgstr "ç½‘æ ¼å¤§å°:" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Primary Line Every:" +msgstr "主线间隔:" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "steps" +msgstr "æ¥" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotation Offset:" msgstr "旋转å移é‡:" @@ -4943,6 +4966,10 @@ msgid "Rotation Step:" msgstr "旋转æ¥é•¿:" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale Step:" +msgstr "缩放æ¥é•¿ï¼š" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move Vertical Guide" msgstr "移动垂直å‚考线" @@ -5024,6 +5051,24 @@ msgstr "编辑锚点" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"Overrides game camera with editor viewport camera." +msgstr "" +"游æˆç›¸æœºè¦†ç›–\n" +"使用编辑器视图相机覆盖游æˆç›¸æœºã€‚" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"No game instance running." +msgstr "" +"游æˆç›¸æœºè¦†ç›–\n" +"没有æ£åœ¨è¿è¡Œçš„游æˆå®žä¾‹ã€‚" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp msgid "Lock Selected" msgstr "é”定选定" @@ -5134,24 +5179,20 @@ msgid "Ruler Mode" msgstr "æ ‡å°ºæ¨¡å¼" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Toggle smart snapping." -msgstr "开关å¸é™„。" +msgstr "å¸é™„开关。" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Use Smart Snap" msgstr "使用å¸é™„" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Toggle grid snapping." -msgstr "开关å¸é™„。" +msgstr "å¼€å…³ç½‘æ ¼å¸é™„。" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Use Grid Snap" -msgstr "ç½‘æ ¼å¸é™„" +msgstr "ä½¿ç”¨ç½‘æ ¼å¸é™„" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snapping Options" @@ -5162,6 +5203,10 @@ msgid "Use Rotation Snap" msgstr "使用旋转å¸é™„" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Use Scale Snap" +msgstr "使用缩放å¸é™„" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap Relative" msgstr "相对å¸é™„" @@ -5244,9 +5289,8 @@ msgid "View" msgstr "视图" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Always Show Grid" -msgstr "æ˜¾ç¤ºç½‘æ ¼" +msgstr "æ€»æ˜¯æ˜¾ç¤ºç½‘æ ¼" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Show Helpers" @@ -5302,13 +5346,13 @@ msgstr "æ’入帧(基于é®ç½©ï¼‰ã€‚" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" -"Auto insert keys when objects are translated, rotated on scaled (based on " +"Auto insert keys when objects are translated, rotated or scaled (based on " "mask).\n" "Keys are only added to existing tracks, no new tracks will be created.\n" "Keys must be inserted manually for the first time." msgstr "" -"当对象ä½ç§»å˜åŒ–,按缩放比例旋转(基于蒙版)时自动æ’入关键帧。\n" -"关键帧键åªä¼šæ·»åŠ 到现有轨é“,ä¸ä¼šåˆ›å»ºæ–°è½¨é“。\n" +"当对象ä½ç§»ã€æ—‹è½¬ã€ç¼©æ”¾ï¼ˆåŸºäºŽè’™ç‰ˆï¼‰æ—¶è‡ªåŠ¨æ’入关键帧。\n" +"关键帧åªä¼šæ·»åŠ 到现有轨é“,ä¸ä¼šåˆ›å»ºæ–°è½¨é“。\n" "第一次必须手动æ’入关键帧。" #: editor/plugins/canvas_item_editor_plugin.cpp @@ -5511,9 +5555,8 @@ msgid "Hold Shift to edit tangents individually" msgstr "æŒ‰ä½ Shift å¯å•ç‹¬ç¼–辑切线" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Right click to add point" -msgstr "é¼ æ ‡å³é”®:åˆ é™¤ç‚¹" +msgstr "é¼ æ ‡å³é”®æ·»åŠ 点" #: editor/plugins/gi_probe_editor_plugin.cpp msgid "Bake GI Probe" @@ -6958,9 +7001,8 @@ msgid "Freelook Speed Modifier" msgstr "自由视图速度调整" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Freelook Slow Modifier" -msgstr "自由视图速度调整" +msgstr "缓慢自由视图速度" #: editor/plugins/spatial_editor_plugin.cpp msgid "" @@ -7231,9 +7273,8 @@ msgid "Simplification: " msgstr "简å•åŒ–: " #: editor/plugins/sprite_editor_plugin.cpp -#, fuzzy msgid "Shrink (Pixels): " -msgstr "扩展(åƒç´ ): " +msgstr "收缩(åƒç´ ): " #: editor/plugins/sprite_editor_plugin.cpp msgid "Grow (Pixels): " @@ -8015,9 +8056,8 @@ msgid "(GLES3 only)" msgstr "åªä½¿ç”¨GLES3" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Add Output" -msgstr "æ·»åŠ è¾“å‡º+" +msgstr "æ·»åŠ è¾“å‡º" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Scalar" @@ -8032,9 +8072,8 @@ msgid "Boolean" msgstr "布尔值" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Sampler" -msgstr "音效" +msgstr "é‡‡æ ·ï¼ˆSampler)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Add input port" @@ -8135,7 +8174,7 @@ msgstr "颜色è¿ç®—符。" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Grayscale function." -msgstr "ç°åº¦åŠŸèƒ½ã€‚" +msgstr "ç°åº¦å‡½æ•°ã€‚" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Converts HSV vector to RGB equivalent." @@ -8147,11 +8186,11 @@ msgstr "å°†RGBå‘é‡è½¬æ¢ä¸ºç‰æ•ˆçš„HSVå‘é‡ã€‚" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Sepia function." -msgstr "棕è¤è‰²åŠŸèƒ½ã€‚" +msgstr "棕è¤è‰²å‡½æ•°ã€‚" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Burn operator." -msgstr "烧录è¿ç®—符。" +msgstr "åŠ æ·±è¿ç®—符。" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Darken operator." @@ -8159,19 +8198,19 @@ msgstr "å˜æš—è¿ç®—符。" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Difference operator." -msgstr "差异è¿ç®—符。" +msgstr "差值è¿ç®—符。" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Dodge operator." -msgstr "Dodge è¿ç®—符。" +msgstr "å‡æ·¡è¿ç®—符。" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "HardLight operator" -msgstr "HardLight æ“作" +msgid "HardLight operator." +msgstr "强光è¿ç®—符。" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Lighten operator." -msgstr "Lightenè¿ç®—." +msgstr "å˜äº®è¿ç®—符。" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Overlay operator." @@ -8179,15 +8218,15 @@ msgstr "å åŠ è¿ç®—符。" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Screen operator." -msgstr "å±å¹•æ“作符。" +msgstr "滤色è¿ç®—符。" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "SoftLight operator." -msgstr "SoftLight æ“作符." +msgstr "柔光è¿ç®—符。" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Color constant." -msgstr "颜色常é‡." +msgstr "颜色常é‡ã€‚" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Color uniform." @@ -8780,12 +8819,13 @@ msgstr "æ ¹æ®è¡¨é¢æ³•çº¿å’Œç›¸æœºè§†å›¾æ–¹å‘的点积返回衰å‡ï¼ˆå°†ç›¸å…³ #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Custom Godot Shader Language expression, which placed on top of the resulted " -"shader. You can place various function definitions inside and call it later " -"in the Expressions. You can also declare varyings, uniforms and constants." +"Custom Godot Shader Language expression, which is placed on top of the " +"resulted shader. You can place various function definitions inside and call " +"it later in the Expressions. You can also declare varyings, uniforms and " +"constants." msgstr "" -"自定义的Godotç€è‰²å™¨è¯è¨€è¡¨è¾¾å¼ï¼Œä½äºŽç”Ÿæˆçš„ç€è‰²å™¨é¡¶éƒ¨ã€‚您å¯ä»¥åœ¨å…¶ä¸æ”¾ç½®å„ç§å‡½æ•°" -"定义,然åŽåœ¨è¡¨è¾¾å¼ä¸è°ƒç”¨å®ƒã€‚您还å¯ä»¥å£°æ˜Žå˜åŒ–,统一和常é‡ã€‚" +"自定义的 Godot ç€è‰²å™¨è¯è¨€è¡¨è¾¾å¼ï¼Œä¼šè¢«æ”¾åˆ°æœ€ç»ˆçš„ç€è‰²å™¨å¼€å¤´ã€‚您å¯ä»¥åœ¨å…¶ä¸æ”¾ç½®å„" +"ç§å‡½æ•°å®šä¹‰ï¼Œç„¶åŽåœ¨è¡¨è¾¾å¼ä¸è°ƒç”¨ã€‚您还å¯ä»¥å£°æ˜Ž varyingã€uniform 和常é‡ã€‚" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "(Fragment/Light mode only) Scalar derivative function." @@ -8897,6 +8937,14 @@ msgid "Add..." msgstr "æ·»åŠ ..." #: editor/project_export.cpp +msgid "" +"If checked, the preset will be available for use in one-click deploy.\n" +"Only one preset per platform may be marked as runnable." +msgstr "" +"选ä¸æ—¶ï¼Œå¯ä»¥åœ¨ä¸€é”®éƒ¨ç½²ä¸ä½¿ç”¨è¯¥é¢„设。\n" +"æ¯ä¸ªå¹³å°åªå¯ä»¥æœ‰ä¸€ä¸ªå¯æ‰§è¡Œçš„预设。" + +#: editor/project_export.cpp msgid "Export Path" msgstr "导出路径" @@ -8925,18 +8973,20 @@ msgid "Resources to export:" msgstr "导出的资æº:" #: editor/project_export.cpp -#, fuzzy msgid "" "Filters to export non-resource files/folders\n" "(comma-separated, e.g: *.json, *.txt, docs/*)" -msgstr "ç›é€‰å¯¼å‡ºéžèµ„æºæ–‡ä»¶ï¼ˆä½¿ç”¨è‹±æ–‡é€—å·åˆ†éš”,如:*.json,*.txt)" +msgstr "" +"ç›é€‰å¯¼å‡ºéžèµ„æºæ–‡ä»¶æˆ–目录\n" +"(使用英文逗å·åˆ†éš”,如: *.json,*.txt docs/* )" #: editor/project_export.cpp -#, fuzzy msgid "" "Filters to exclude files/folders from project\n" "(comma-separated, e.g: *.json, *.txt, docs/*)" -msgstr "过滤从项目ä¸æŽ’除文件(以逗å·åˆ†éš”,例如:*。json,*。txt)" +msgstr "" +"从项目ä¸æŽ’除文件或目录\n" +"(以逗å·åˆ†éš”,例如:*.json,*.txt, docs/*)" #: editor/project_export.cpp msgid "Patches" @@ -9360,18 +9410,6 @@ msgid "Device" msgstr "设备" #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Shift+" -msgstr "Shift+" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Alt+" -msgstr "Alt+" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Control+" -msgstr "Ctrl+" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "Press a Key..." msgstr "按下一个键..." @@ -9946,11 +9984,11 @@ msgid "" msgstr "ç¦ç”¨â€œå¯ç¼–辑实例â€å°†å¯¼è‡´èŠ‚点的所有属性æ¢å¤ä¸ºå…¶é»˜è®¤å€¼ã€‚" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "" "Enabling \"Load As Placeholder\" will disable \"Editable Children\" and " "cause all properties of the node to be reverted to their default." -msgstr "ç¦ç”¨â€œå¯ç¼–辑实例â€å°†å¯¼è‡´èŠ‚点的所有属性æ¢å¤ä¸ºå…¶é»˜è®¤å€¼ã€‚" +msgstr "" +"å¼€å¯â€œåŠ 载为å ä½ç¬¦â€å°†ç¦ç”¨â€œå¯ç¼–辑实例â€å¹¶é‡ç½®è¯¥èŠ‚点的所有属性æ¢å¤ä¸ºå…¶é»˜è®¤å€¼ã€‚" #: editor/scene_tree_dock.cpp msgid "Make Local" @@ -10279,19 +10317,16 @@ msgid "Will load an existing script file." msgstr "å°†åŠ è½½çŽ°æœ‰çš„è„šæœ¬æ–‡ä»¶ã€‚" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Class Name:" -msgstr "ç±»å" +msgstr "ç±»å:" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Template:" -msgstr "模æ¿" +msgstr "模æ¿ï¼š" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Built-in Script:" -msgstr "内置脚本" +msgstr "内置脚本:" #: editor/script_create_dialog.cpp msgid "Attach Node Script" @@ -10371,7 +10406,7 @@ msgstr "性能分æž" #: editor/script_editor_debugger.cpp msgid "Network Profiler" -msgstr "网络é…ç½®" +msgstr "网络检视" #: editor/script_editor_debugger.cpp msgid "Monitor" @@ -10925,9 +10960,8 @@ msgid "Add Function" msgstr "æ·»åŠ å‡½æ•°" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Delete input port" -msgstr "移除输入端å£" +msgstr "åˆ é™¤è¾“å…¥ç«¯å£" #: modules/visual_script/visual_script_editor.cpp msgid "Add Variable" @@ -10938,22 +10972,18 @@ msgid "Add Signal" msgstr "æ·»åŠ ä¿¡å·" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Add Input Port" msgstr "æ·»åŠ è¾“å…¥ç«¯å£" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Add Output Port" msgstr "å¢žåŠ è¾“å‡ºç«¯å£" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Remove Input Port" msgstr "移除输入端å£" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Remove Output Port" msgstr "移除输出端å£" @@ -10999,7 +11029,7 @@ msgstr "æ·»åŠ Preload节点" #: modules/visual_script/visual_script_editor.cpp msgid "Can't drop nodes because script '%s' is not used in this scene." -msgstr "" +msgstr "æ— æ³•æ”¾ç½®è¯¥èŠ‚ç‚¹ï¼Œå› ä¸ºè„šæœ¬ '%s' 未在该场景ä¸ä½¿ç”¨ã€‚" #: modules/visual_script/visual_script_editor.cpp msgid "Add Node(s) From Tree" @@ -11010,6 +11040,8 @@ msgid "" "Can't drop properties because script '%s' is not used in this scene.\n" "Drop holding 'Shift' to just copy the signature." msgstr "" +"æ— æ³•æ”¾ç½®è¯¥å±žæ€§ï¼Œå› ä¸ºè„šæœ¬ '%s' 未在该场景ä¸ä½¿ç”¨ã€‚\n" +"æ”¾ç½®æ—¶æŒ‰ä½ 'Shift' é”®å¯ä»¥ä»…å¤åˆ¶ç¾å。" #: modules/visual_script/visual_script_editor.cpp msgid "Add Getter Property" @@ -11036,9 +11068,8 @@ msgid "Connect Nodes" msgstr "连接节点" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Disconnect Nodes" -msgstr "æ–å¼€Graph Node连接" +msgstr "æ–开连接的节点" #: modules/visual_script/visual_script_editor.cpp msgid "Connect Node Data" @@ -11073,26 +11104,24 @@ msgid "Paste VisualScript Nodes" msgstr "粘贴 VisualScript 节点" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Can't create function with a function node." -msgstr "æ— æ³•å¤åˆ¶å‡½æ•°èŠ‚点。" +msgstr "æ— æ³•é€šè¿‡å‡½æ•°èŠ‚ç‚¹åˆ›å»ºå‡½æ•°ã€‚" #: modules/visual_script/visual_script_editor.cpp msgid "Can't create function of nodes from nodes of multiple functions." msgstr "" #: modules/visual_script/visual_script_editor.cpp -msgid "Select atleast one node with sequence port." -msgstr "" +msgid "Select at least one node with sequence port." +msgstr "选择至少一个拥有顺åºç«¯å£çš„节点。" #: modules/visual_script/visual_script_editor.cpp msgid "Try to only have one sequence input in selection." -msgstr "" +msgstr "请选择å•ä¸€çš„顺åºè¾“入。" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Create Function" -msgstr "é‡å‘½å函数" +msgstr "创建函数" #: modules/visual_script/visual_script_editor.cpp msgid "Remove Function" @@ -11123,9 +11152,8 @@ msgid "Members:" msgstr "æˆå‘˜ï¼š" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "function_name" -msgstr "函数:" +msgstr "函数å" #: modules/visual_script/visual_script_editor.cpp msgid "Select or create a function to edit its graph." @@ -11148,14 +11176,12 @@ msgid "Cut Nodes" msgstr "剪切节点" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Make Function" -msgstr "é‡å‘½å函数" +msgstr "生æˆå‡½æ•°" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Refresh Graph" -msgstr "刷新" +msgstr "刷新图" #: modules/visual_script/visual_script_editor.cpp msgid "Edit Member" @@ -11363,7 +11389,7 @@ msgstr "预设ä¸æœªæŒ‡å®šå¿…éœ€çš„å›¾æ ‡ã€‚" #: platform/javascript/export/export.cpp msgid "Stop HTTP Server" -msgstr "" +msgstr "åœæ¢HTTPæœåŠ¡" #: platform/javascript/export/export.cpp msgid "Run in Browser" @@ -11398,10 +11424,18 @@ msgid "Using default boot splash image." msgstr "使用默认å¯åŠ¨å›¾ç‰‡ã€‚" #: platform/uwp/export/export.cpp +msgid "Invalid package short name." +msgstr "æ— æ•ˆçš„åŒ…çŸå称。" + +#: platform/uwp/export/export.cpp msgid "Invalid package unique name." msgstr "包åå”¯ä¸€æ€§æ— æ•ˆã€‚" #: platform/uwp/export/export.cpp +msgid "Invalid package publisher display name." +msgstr "å‘布者显示åç§°æ— æ•ˆã€‚" + +#: platform/uwp/export/export.cpp msgid "Invalid product GUID." msgstr "产å“GUIDéžæ³•ã€‚" @@ -11991,6 +12025,18 @@ msgstr "å˜é‡åªèƒ½åœ¨é¡¶ç‚¹å‡½æ•°ä¸æŒ‡å®šã€‚" msgid "Constants cannot be modified." msgstr "ä¸å…许修改常é‡ã€‚" +#~ msgid "Pause the scene" +#~ msgstr "æš‚åœè¿è¡Œåœºæ™¯" + +#~ msgid "Shift+" +#~ msgstr "Shift+" + +#~ msgid "Alt+" +#~ msgstr "Alt+" + +#~ msgid "Control+" +#~ msgstr "Ctrl+" + #~ msgid "Snap to Grid" #~ msgstr "å¸é™„åˆ°ç½‘æ ¼" diff --git a/editor/translations/zh_HK.po b/editor/translations/zh_HK.po index 2a343a6590..c05494212b 100644 --- a/editor/translations/zh_HK.po +++ b/editor/translations/zh_HK.po @@ -3009,8 +3009,8 @@ msgid "Play" msgstr "é‹è¡Œ" #: editor/editor_node.cpp -msgid "Pause the scene" -msgstr "æš«åœå ´æ™¯" +msgid "Pause the scene execution for debugging." +msgstr "" #: editor/editor_node.cpp msgid "Pause Scene" @@ -3728,6 +3728,11 @@ msgstr "下一個腳本" #: editor/filesystem_dock.cpp #, fuzzy +msgid "Set As Main Scene" +msgstr "é¸æ“‡ä¸»å ´æ™¯" + +#: editor/filesystem_dock.cpp +#, fuzzy msgid "Open Scenes" msgstr "é–‹å•“å ´æ™¯" @@ -4510,6 +4515,20 @@ msgid "" msgstr "" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Anim Clips" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Audio Clips" +msgstr "新增動畫軌跡" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Functions" +msgstr "行為" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/animation_state_machine_editor.cpp #, fuzzy msgid "Node Renamed" @@ -5219,6 +5238,14 @@ msgid "Grid Step:" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Primary Line Every:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "steps" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotation Offset:" msgstr "" @@ -5228,6 +5255,11 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy +msgid "Scale Step:" +msgstr "縮放比例:" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy msgid "Move Vertical Guide" msgstr "新增" @@ -5317,6 +5349,20 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"Overrides game camera with editor viewport camera." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"No game instance running." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp #, fuzzy msgid "Lock Selected" msgstr "所有é¸é …" @@ -5462,6 +5508,10 @@ msgid "Use Rotation Snap" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Use Scale Snap" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap Relative" msgstr "" @@ -5607,7 +5657,7 @@ msgstr "å‹•æ™æ’入關éµå¹€ï¼Ÿ" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" -"Auto insert keys when objects are translated, rotated on scaled (based on " +"Auto insert keys when objects are translated, rotated or scaled (based on " "mask).\n" "Keys are only added to existing tracks, no new tracks will be created.\n" "Keys must be inserted manually for the first time." @@ -8628,7 +8678,7 @@ msgid "Dodge operator." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "HardLight operator" +msgid "HardLight operator." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -9221,9 +9271,10 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Custom Godot Shader Language expression, which placed on top of the resulted " -"shader. You can place various function definitions inside and call it later " -"in the Expressions. You can also declare varyings, uniforms and constants." +"Custom Godot Shader Language expression, which is placed on top of the " +"resulted shader. You can place various function definitions inside and call " +"it later in the Expressions. You can also declare varyings, uniforms and " +"constants." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -9339,6 +9390,12 @@ msgid "Add..." msgstr "æ·»åŠ ..." #: editor/project_export.cpp +msgid "" +"If checked, the preset will be available for use in one-click deploy.\n" +"Only one preset per platform may be marked as runnable." +msgstr "" + +#: editor/project_export.cpp #, fuzzy msgid "Export Path" msgstr "匯出" @@ -9802,18 +9859,6 @@ msgid "Device" msgstr "è¨å‚™" #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Shift+" -msgstr "Shift+" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Alt+" -msgstr "Alt+" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Control+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "Press a Key..." msgstr "" @@ -11614,7 +11659,7 @@ msgid "Can't create function of nodes from nodes of multiple functions." msgstr "" #: modules/visual_script/visual_script_editor.cpp -msgid "Select atleast one node with sequence port." +msgid "Select at least one node with sequence port." msgstr "" #: modules/visual_script/visual_script_editor.cpp @@ -11938,11 +11983,21 @@ msgstr "無法新增資料夾" #: platform/uwp/export/export.cpp #, fuzzy +msgid "Invalid package short name." +msgstr "無效å稱" + +#: platform/uwp/export/export.cpp +#, fuzzy msgid "Invalid package unique name." msgstr "無效å稱" #: platform/uwp/export/export.cpp #, fuzzy +msgid "Invalid package publisher display name." +msgstr "無效å稱" + +#: platform/uwp/export/export.cpp +#, fuzzy msgid "Invalid product GUID." msgstr "無效å—åž‹" @@ -12481,6 +12536,15 @@ msgstr "" msgid "Constants cannot be modified." msgstr "" +#~ msgid "Pause the scene" +#~ msgstr "æš«åœå ´æ™¯" + +#~ msgid "Shift+" +#~ msgstr "Shift+" + +#~ msgid "Alt+" +#~ msgstr "Alt+" + #~ msgid "Language" #~ msgstr "語言" diff --git a/editor/translations/zh_TW.po b/editor/translations/zh_TW.po index e2d7adf9e7..622e04b34f 100644 --- a/editor/translations/zh_TW.po +++ b/editor/translations/zh_TW.po @@ -17,12 +17,13 @@ # Bluesir Bruce <a5566740293@gmail.com>, 2019. # leela <53352@protonmail.com>, 2019. # Kenneth Lo <closer.tw@gmail.com>, 2019. +# SIYU FU <1002492607@qq.com>, 2019. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2019-08-29 13:35+0000\n" -"Last-Translator: Kenneth Lo <closer.tw@gmail.com>\n" +"PO-Revision-Date: 2019-11-09 22:04+0000\n" +"Last-Translator: SIYU FU <1002492607@qq.com>\n" "Language-Team: Chinese (Traditional) <https://hosted.weblate.org/projects/" "godot-engine/godot/zh_Hant/>\n" "Language: zh_TW\n" @@ -30,7 +31,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 3.9-dev\n" +"X-Generator: Weblate 3.10-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -53,7 +54,7 @@ msgstr "å› è©²å¯¦ä¾‹(instance)為空,self 無法被使用" #: core/math/expression.cpp msgid "Invalid operands to operator %s, %s and %s." -msgstr "æ¤æ•¸å€¼ç„¡æ³•è¢« %sã€%s å’Œ %s é‹ç®—。" +msgstr "æ¤æ•¸å€¼ç„¡æ³•è¢« %sã€%s 和与%s é‹ç®—。" #: core/math/expression.cpp msgid "Invalid index of type %s for base type %s" @@ -73,16 +74,15 @@ msgstr "調用“%sâ€æ™‚:" #: core/ustring.cpp msgid "B" -msgstr "" +msgstr "ä¹™" #: core/ustring.cpp msgid "KiB" -msgstr "" +msgstr "基布" #: core/ustring.cpp -#, fuzzy msgid "MiB" -msgstr "æ··åˆ" +msgstr "MiBå…¬å¸" #: core/ustring.cpp msgid "GiB" @@ -106,7 +106,7 @@ msgstr "释放" #: editor/animation_bezier_editor.cpp msgid "Balanced" -msgstr "平衡的" +msgstr "平衡" #: editor/animation_bezier_editor.cpp msgid "Mirror" @@ -3003,8 +3003,8 @@ msgid "Play" msgstr "é‹è¡Œ" #: editor/editor_node.cpp -msgid "Pause the scene" -msgstr "æš«åœæ¤å ´æ™¯" +msgid "Pause the scene execution for debugging." +msgstr "" #: editor/editor_node.cpp msgid "Pause Scene" @@ -3705,6 +3705,11 @@ msgstr "從ç¾æœ‰å ´æ™¯ä¸å»ºç«‹â€¦" #: editor/filesystem_dock.cpp #, fuzzy +msgid "Set As Main Scene" +msgstr "é¸å–主è¦å ´æ™¯" + +#: editor/filesystem_dock.cpp +#, fuzzy msgid "Open Scenes" msgstr "é–‹å•Ÿå ´æ™¯" @@ -4477,6 +4482,21 @@ msgid "" msgstr "" #: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Anim Clips" +msgstr "動畫剪輯:" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Audio Clips" +msgstr "音訊剪輯:" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy +msgid "Functions" +msgstr "函數:" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/animation_state_machine_editor.cpp #, fuzzy msgid "Node Renamed" @@ -5176,6 +5196,15 @@ msgid "Grid Step:" msgstr "ç¶²æ ¼å¤§å°:" #: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Primary Line Every:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy +msgid "steps" +msgstr "2æ¥" + +#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotation Offset:" msgstr "旋轉å移é‡:" @@ -5185,6 +5214,11 @@ msgstr "旋轉æ¥é©Ÿ:" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy +msgid "Scale Step:" +msgstr "縮放:" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy msgid "Move Vertical Guide" msgstr "垂直移動尺標" @@ -5273,6 +5307,20 @@ msgstr "改變錨點" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"Overrides game camera with editor viewport camera." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"No game instance running." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp #, fuzzy msgid "Lock Selected" msgstr "工具é¸æ“‡" @@ -5422,6 +5470,11 @@ msgstr "使用旋轉å¸é™„" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy +msgid "Use Scale Snap" +msgstr "使用å¸é™„" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy msgid "Snap Relative" msgstr "相å°å¸é™„" @@ -5574,7 +5627,7 @@ msgstr "æ’入幀 (ç¾æœ‰è»Œé“)" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" -"Auto insert keys when objects are translated, rotated on scaled (based on " +"Auto insert keys when objects are translated, rotated or scaled (based on " "mask).\n" "Keys are only added to existing tracks, no new tracks will be created.\n" "Keys must be inserted manually for the first time." @@ -8589,8 +8642,9 @@ msgid "Dodge operator." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "HardLight operator" -msgstr "" +#, fuzzy +msgid "HardLight operator." +msgstr "縮放(比例):" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Lighten operator." @@ -9186,9 +9240,10 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Custom Godot Shader Language expression, which placed on top of the resulted " -"shader. You can place various function definitions inside and call it later " -"in the Expressions. You can also declare varyings, uniforms and constants." +"Custom Godot Shader Language expression, which is placed on top of the " +"resulted shader. You can place various function definitions inside and call " +"it later in the Expressions. You can also declare varyings, uniforms and " +"constants." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -9298,6 +9353,12 @@ msgid "Add..." msgstr "æ·»åŠ â€¦" #: editor/project_export.cpp +msgid "" +"If checked, the preset will be available for use in one-click deploy.\n" +"Only one preset per platform may be marked as runnable." +msgstr "" + +#: editor/project_export.cpp msgid "Export Path" msgstr "導出路徑" @@ -9765,18 +9826,6 @@ msgid "Device" msgstr "" #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Shift+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Alt+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Control+" -msgstr "" - -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "Press a Key..." msgstr "" @@ -11584,7 +11633,7 @@ msgid "Can't create function of nodes from nodes of multiple functions." msgstr "" #: modules/visual_script/visual_script_editor.cpp -msgid "Select atleast one node with sequence port." +msgid "Select at least one node with sequence port." msgstr "" #: modules/visual_script/visual_script_editor.cpp @@ -11903,11 +11952,21 @@ msgstr "無法新增資料夾" #: platform/uwp/export/export.cpp #, fuzzy +msgid "Invalid package short name." +msgstr "ä¸èƒ½ä½¿ç”¨çš„å稱。" + +#: platform/uwp/export/export.cpp +#, fuzzy msgid "Invalid package unique name." msgstr "ä¸èƒ½ä½¿ç”¨çš„å稱。" #: platform/uwp/export/export.cpp #, fuzzy +msgid "Invalid package publisher display name." +msgstr "ä¸èƒ½ä½¿ç”¨çš„å稱。" + +#: platform/uwp/export/export.cpp +#, fuzzy msgid "Invalid product GUID." msgstr "ä¸èƒ½ä½¿ç”¨çš„å稱。" @@ -12465,6 +12524,9 @@ msgstr "" msgid "Constants cannot be modified." msgstr "" +#~ msgid "Pause the scene" +#~ msgstr "æš«åœæ¤å ´æ™¯" + #, fuzzy #~ msgid "Snap to Grid" #~ msgstr "å¸é™„åˆ°ç¶²æ ¼" diff --git a/main/gamecontrollerdb.txt b/main/gamecontrollerdb.txt index 0e30cfe8d0..5793ebd92d 100644 --- a/main/gamecontrollerdb.txt +++ b/main/gamecontrollerdb.txt @@ -1,18 +1,44 @@ -# Game Controller DB for SDL in 2.0.9 format +# Game Controller DB for SDL in 2.0.10 format # Source: https://github.com/gabomdq/SDL_GameControllerDB # Windows 03000000fa2d00000100000000000000,3DRUDDER,leftx:a0,lefty:a1,rightx:a5,righty:a2,platform:Windows, 03000000c82d00002038000000000000,8bitdo,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d000011ab000000000000,8BitDo F30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00001038000000000000,8BitDo F30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000090000000000000,8BitDo FC30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000650000000000000,8BitDo M30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:a4,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,start:b11,x:b3,y:b4,platform:Windows, +03000000c82d00000310000000000000,8BitDo N30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Windows, +03000000c82d00002028000000000000,8BitDo N30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00008010000000000000,8BitDo N30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Windows, +03000000c82d00000190000000000000,8BitDo N30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00001590000000000000,8BitDo N30 Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00006528000000000000,8BitDo N30 Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00015900000000000000,8BitDo N30 Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00065280000000000000,8BitDo N30 Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Windows, 03000000022000000090000000000000,8Bitdo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, 03000000203800000900000000000000,8Bitdo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000130000000000000,8BitDo SF30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Windows, 03000000c82d00000060000000000000,8Bitdo SF30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, 03000000c82d00000061000000000000,8Bitdo SF30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d000021ab000000000000,8BitDo SFC30,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows, 03000000102800000900000000000000,8Bitdo SFC30 GamePad,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows, 03000000c82d00003028000000000000,8Bitdo SFC30 GamePad,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000030000000000000,8BitDo SN30,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000351000000000000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00001290000000000000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d000020ab000000000000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00004028000000000000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00006228000000000000,8BitDo SN30 GP,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000160000000000000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000161000000000000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000260000000000000,8BitDo SN30 Pro+,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000261000000000000,8BitDo SN30 Pro+,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000031000000000000,8BitDo Wireless Adapter,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, 03000000a00500003232000000000000,8Bitdo Zero GamePad,a:b0,b:b1,back:b10,dpdown:+a2,dpleft:-a0,dpright:+a0,dpup:-a2,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Windows, 030000008f0e00001200000000000000,Acme GA-02,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b2,y:b3,platform:Windows, 03000000fa190000f0ff000000000000,Acteck AGJ-3200,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +030000006f0e00001413000000000000,Afterglow,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, 03000000341a00003608000000000000,Afterglow PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, 030000006f0e00000263000000000000,Afterglow PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, 030000006f0e00001101000000000000,Afterglow PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, @@ -21,6 +47,7 @@ 030000006f0e00001901000000000000,Afterglow PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, 030000006f0e00001a01000000000000,Afterglow PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, 03000000d62000001d57000000000000,Airflo PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000869800002400000000007801,Astro C40 TR,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, 03000000d6200000e557000000000000,Batarang,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, 03000000c01100001352000000000000,Battalife Joystick,a:b6,b:b7,back:b2,leftshoulder:b0,leftx:a0,lefty:a1,rightshoulder:b1,start:b3,x:b4,y:b5,platform:Windows, 030000006f0e00003201000000000000,Battlefield 4 PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, @@ -38,6 +65,7 @@ 0300000066f700000500000000000000,BrutalLegendTest,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b3,platform:Windows, 03000000d81d00000b00000000000000,BUFFALO BSGP1601 Series ,a:b5,b:b3,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b9,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b13,x:b4,y:b2,platform:Windows, 03000000e82000006058000000000000,Cideko AK08b,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000457500000401000000000000,Cobra,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, 030000005e0400008e02000000000000,Controller (XBOX 360 For Windows),a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:+a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:-a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, 030000005e040000a102000000000000,Controller (Xbox 360 Wireless Receiver for Windows),a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:+a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:-a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, 030000005e040000ff02000000000000,Controller (Xbox One For Windows) - Wired,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:+a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:-a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, @@ -50,6 +78,7 @@ 030000006f0e00003001000000000000,EA SPORTS PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, 03000000b80500000410000000000000,Elecom Gamepad,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b1,platform:Windows, 03000000b80500000610000000000000,Elecom Gamepad,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b1,platform:Windows, +03000000120c0000f61c000000000000,Elite,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, 030000008f0e00000f31000000000000,EXEQ,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Windows, 03000000341a00000108000000000000,EXEQ RF USB Gamepad 8206,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, 03000000852100000201000000000000,FF-GP1,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, @@ -83,6 +112,7 @@ 030000000d0f00004900000000000000,Hatsune Miku Sho Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, 03000000d81400000862000000000000,HitBox Edition Cthulhu+,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b5,lefttrigger:b4,rightshoulder:b7,righttrigger:b6,start:b9,x:b0,y:b3,platform:Windows, 03000000632500002605000000000000,HJD-X,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +030000000d0f00002d00000000000000,Hori Fighting Commander 3 Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, 030000000d0f00005f00000000000000,Hori Fighting Commander 4 (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, 030000000d0f00005e00000000000000,Hori Fighting Commander 4 (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, 030000000d0f00004000000000000000,Hori Fighting Stick Mini 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b5,lefttrigger:b4,rightshoulder:b7,righttrigger:b6,start:b9,x:b0,y:b3,platform:Windows, @@ -90,9 +120,12 @@ 030000000d0f00000900000000000000,Hori Pad 3 Turbo,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, 030000000d0f00004d00000000000000,Hori Pad A,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, 030000000d0f00009200000000000000,Hori Pokken Tournament DX Pro Pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00001600000000007803,HORI Real Arcade Pro EX-SE (Xbox 360),a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,start:b7,x:b2,y:b3,platform:Windows, +030000000d0f00009c00000000000000,Hori TAC Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, 030000000d0f0000c100000000000000,Horipad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, 030000000d0f00006e00000000000000,HORIPAD 4 (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, 030000000d0f00006600000000000000,HORIPAD 4 (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00005500000000000000,Horipad 4 FPS,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, 030000000d0f0000ee00000000000000,HORIPAD mini4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, 03000000250900000017000000000000,HRAP2 on PS/SS/N64 Joypad to USB BOX,a:b2,b:b1,back:b9,leftshoulder:b5,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b6,start:b8,x:b3,y:b0,platform:Windows, 030000008f0e00001330000000000000,HuiJia SNES Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b9,x:b3,y:b0,platform:Windows, @@ -138,9 +171,13 @@ 03000000250900000128000000000000,Mayflash Arcade Stick,a:b1,b:b2,back:b8,leftshoulder:b0,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b3,righttrigger:b7,start:b9,x:b5,y:b6,platform:Windows, 03000000790000004418000000000000,Mayflash GameCube Controller,a:b1,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b0,y:b3,platform:Windows, 03000000790000004318000000000000,Mayflash GameCube Controller Adapter,a:b1,b:b2,back:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b0,leftshoulder:b4,leftstick:b0,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b0,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b0,y:b3,platform:Windows, +03000000242f00007300000000000000,Mayflash Magic NS,a:b1,b:b4,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b0,y:b3,platform:Windows, +0300000079000000d218000000000000,Mayflash Magic NS,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000d620000010a7000000000000,Mayflash Magic NS,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, 030000008f0e00001030000000000000,Mayflash USB Adapter for original Sega Saturn controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b5,rightshoulder:b2,righttrigger:b7,start:b9,x:b3,y:b4,platform:Windows, 0300000025090000e803000000000000,Mayflash Wii Classic Controller,a:b1,b:b0,back:b8,dpdown:b13,dpleft:b12,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Windows, 03000000790000000018000000000000,Mayflash WiiU Pro Game Controller Adapter (DInput),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000790000002418000000000000,Mega Drive,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,rightshoulder:b2,start:b9,x:b3,y:b4,platform:Windows, 03000000380700006382000000000000,MLG GamePad PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, 03000000efbe0000edfe000000000000,Monect Virtual Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b0,platform:Windows, 03000000250900006688000000000000,MP-8866 Super Dual Box,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows, @@ -191,6 +228,8 @@ 03000000321500000003000000000000,Razer Hydra,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, 03000000321500000204000000000000,Razer Panthera (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, 03000000321500000104000000000000,Razer Panthera (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000321500000507000000000000,Razer Raiju Mobile,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000321500000707000000000000,Razer Raiju Mobile,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, 030000000d0f00001100000000000000,REAL ARCADE PRO.3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,rightstick:b11,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, 030000000d0f00006a00000000000000,Real Arcade Pro.4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, 030000000d0f00006b00000000000000,Real Arcade Pro.4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, @@ -221,6 +260,7 @@ 03000000a30600002106000000000000,Saitek PS1000,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b0,y:b3,platform:Windows, 03000000a306000020f6000000000000,Saitek PS2700,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b0,y:b3,platform:Windows, 03000000300f00001101000000000000,Saitek Rumble Pad,a:b2,b:b3,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Windows, +03000000730700000401000000000000,Sanwa PlayOnline Mobile,a:b0,b:b1,back:b2,leftx:a0,lefty:a1,start:b3,platform:Windows, 0300000000050000289b000000000000,Saturn_Adapter_2.0,a:b1,b:b2,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,start:b9,x:b0,y:b3,platform:Windows, 030000009b2800000500000000000000,Saturn_Adapter_2.0,a:b1,b:b2,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,start:b9,x:b0,y:b3,platform:Windows, 030000005e0400008e02000000007801,ShanWan PS3/PC Wired GamePad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, @@ -228,7 +268,9 @@ 03000000341a00000908000000000000,SL-6566,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, 030000008f0e00000800000000000000,SpeedLink Strike FX,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, 03000000c01100000591000000000000,Speedlink Torid,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000d11800000094000000000000,Stadia Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:b12,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:b11,rightx:a3,righty:a4,start:b9,x:b2,y:b3,platform:Windows, 03000000110100001914000000000000,SteelSeries,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftstick:b13,lefttrigger:b6,leftx:a0,lefty:a1,rightstick:b14,righttrigger:b7,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000381000001214000000000000,SteelSeries Free,a:b0,b:b1,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Windows, 03000000381000001814000000000000,SteelSeries Stratus XL,a:b0,b:b1,back:b18,dpdown:b13,dpleft:b14,dpright:b15,dpup:b12,guide:b19,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b2,y:b3,platform:Windows, 03000000790000001c18000000000000,STK-7024X,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, 03000000ff1100003133000000000000,SVEN X-PAD,a:b2,b:b3,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a4,start:b5,x:b0,y:b1,platform:Windows, @@ -247,6 +289,7 @@ 03000000b80500000210000000000000,Trust Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, 030000004f04000087b6000000000000,TWCS Throttle,dpdown:b8,dpleft:b9,dpright:b7,dpup:b6,leftstick:b5,lefttrigger:-a5,leftx:a0,lefty:a1,righttrigger:+a5,platform:Windows, 03000000d90400000200000000000000,TwinShock PS2,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Windows, +030000006e0500001320000000000000,U4113,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, 03000000101c0000171c000000000000,uRage Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, 03000000300f00000701000000000000,USB 4-Axis 12-Button Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Windows, 03000000341a00002308000000000000,USB gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, @@ -256,7 +299,9 @@ 03000000f0250000c183000000000000,USB gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, 03000000ff1100004133000000000000,USB gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a4,righty:a2,start:b9,x:b3,y:b0,platform:Windows, 03000000632500002305000000000000,USB Vibration Joystick (BM),a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000790000001a18000000000000,Venom,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, 03000000790000001b18000000000000,Venom Arcade Joystick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, +030000006f0e00000302000000000000,Victrix Pro Fight Stick for PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, 030000005e0400000a0b000000000000,Xbox Adaptive Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:+a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:-a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, 03000000341a00000608000000000000,Xeox,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, 03000000450c00002043000000000000,XEOX Gamepad SL-6556-BK,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, @@ -267,10 +312,14 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, # Mac OS X 030000008f0e00000300000009010000,2In1 USB Joystick,+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Mac OS X, +03000000c82d00000650000001000000,8BitDo M30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,start:b11,x:b3,y:b4,platform:Mac OS X, 03000000022000000090000001000000,8Bitdo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, 03000000203800000900000000010000,8Bitdo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, 03000000c82d00000190000001000000,8Bitdo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, 03000000102800000900000000000000,8Bitdo SFC30 GamePad Joystick,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00000260000001000000,8BitDo SN30 Pro+,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00000261000000010000,8BitDo SN30 Pro+,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00000031000001000000,8BitDo Wireless Adapter,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, 03000000a00500003232000008010000,8Bitdo Zero GamePad,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Mac OS X, 03000000a00500003232000009010000,8Bitdo Zero GamePad,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Mac OS X, 03000000050b00000045000031000000,ASUS Gamepad,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Mac OS X, @@ -282,6 +331,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 0500000047532047616d657061640000,GameStop Gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Mac OS X, 030000006f0e00000102000000000000,GameStop Xbox 360 Wired Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, 030000007d0400000540000001010000,Gravis Eliminator GamePad Pro,a:b1,b:b2,back:b8,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X, +030000000d0f00002d00000000100000,Hori Fighting Commander 3 Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, 030000000d0f00005f00000000010000,Hori Fighting Commander 4 (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, 030000000d0f00005e00000000010000,Hori Fighting Commander 4 (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, 030000000d0f00005f00000000000000,HORI Fighting Commander 4 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, @@ -302,6 +352,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 030000006d04000016c2000014040000,Logitech Dual Action,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, 030000006d04000016c2000000000000,Logitech F310 Gamepad (DInput),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, 030000006d04000018c2000000000000,Logitech F510 Gamepad (DInput),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +030000006d04000019c2000005030000,Logitech F710,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, 030000006d0400001fc2000000000000,Logitech F710 Gamepad (XInput),a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, 030000006d04000018c2000000010000,Logitech RumblePad 2 USB,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3~,start:b9,x:b0,y:b3,platform:Mac OS X, 030000006d04000019c2000000000000,Logitech Wireless Gamepad (DInput),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, @@ -310,14 +361,19 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 03000000380700008433000000010000,Mad Catz FightStick TE S+ (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, 03000000380700008483000000010000,Mad Catz FightStick TE S+ (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, 03000000790000004418000000010000,Mayflash GameCube Controller,a:b1,b:b2,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000242f00007300000000020000,Mayflash Magic NS,a:b1,b:b4,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b0,y:b3,platform:Mac OS X, +0300000079000000d218000026010000,Mayflash Magic NS,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Mac OS X, +03000000d620000010a7000003010000,Mayflash Magic NS,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, 0300000025090000e803000000000000,Mayflash Wii Classic Controller,a:b1,b:b0,back:b8,dpdown:b13,dpleft:b12,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Mac OS X, 03000000790000000018000000000000,Mayflash WiiU Pro Game Controller Adapter (DInput),a:b4,b:b8,back:b32,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b16,leftstick:b40,lefttrigger:b24,leftx:a0,lefty:a4,rightshoulder:b20,rightstick:b44,righttrigger:b28,rightx:a8,righty:a12,start:b36,x:b0,y:b12,platform:Mac OS X, 03000000d8140000cecf000000000000,MC Cthulhu,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X, 03000000d62000007162000001000000,Moga Pro 2 HID,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Mac OS X, +03000000632500007505000000020000,NEOGEO mini PAD Controller,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b9,x:b2,y:b3,platform:Mac OS X, 030000001008000001e5000006010000,NEXT SNES Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b6,start:b9,x:b3,y:b0,platform:Mac OS X, 030000007e0500000920000000000000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Mac OS X, 030000007e0500000920000001000000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Mac OS X, 030000008f0e00000300000000000000,Piranha xtreme,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Mac OS X, +030000004c050000da0c000000010000,Playstation Classic Controller,a:b2,b:b1,back:b8,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,start:b9,x:b3,y:b0,platform:Mac OS X, 03000000d62000006dca000000010000,PowerA Pro Ex,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, 030000004c0500006802000000000000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Mac OS X, 030000004c0500006802000000010000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Mac OS X, @@ -329,6 +385,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 03000000321500000204000000010000,Razer Panthera (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, 03000000321500000104000000010000,Razer Panthera (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, 03000000321500000010000000010000,Razer RAIJU,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000321500000507000001010000,Razer Raiju Mobile,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b21,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, 03000000321500000009000000020000,Razer Serval,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Mac OS X, 030000003215000000090000163a0000,Razer Serval,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Mac OS X, 0300000032150000030a000000000000,Razer Wildcat,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, @@ -336,6 +393,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 03000000790000001100000006010000,Retrolink SNES Controller,a:b2,b:b1,back:b8,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,leftshoulder:b4,rightshoulder:b5,start:b9,x:b3,y:b0,platform:Mac OS X, 030000006b140000010d000000010000,Revolution Pro Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, 03000000c6240000fefa000000000000,Rock Candy Gamepad for PS3,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, +03000000730700000401000000010000,Sanwa PlayOnline Mobile,a:b0,b:b1,back:b2,leftx:a0,lefty:a1,start:b3,platform:Mac OS X, 03000000811700007e05000000000000,Sega Saturn,a:b2,b:b4,dpdown:b16,dpleft:b15,dpright:b14,dpup:b17,leftshoulder:b8,lefttrigger:a5,leftx:a0,lefty:a2,rightshoulder:b9,righttrigger:a4,start:b13,x:b0,y:b6,platform:Mac OS X, 03000000b40400000a01000000000000,Sega Saturn USB Gamepad,a:b0,b:b1,back:b5,guide:b2,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b8,x:b3,y:b4,platform:Mac OS X, 030000003512000021ab000000000000,SFC30 Joystick,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Mac OS X, @@ -353,6 +411,8 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 03000000bd12000015d0000000000000,Tomee SNES USB Controller,a:b2,b:b1,back:b8,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b9,x:b3,y:b0,platform:Mac OS X, 03000000bd12000015d0000000010000,Tomee SNES USB Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b9,x:b3,y:b0,platform:Mac OS X, 03000000100800000100000000000000,Twin USB Joystick,a:b4,b:b2,back:b16,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b12,leftstick:b20,lefttrigger:b8,leftx:a0,lefty:a2,rightshoulder:b14,rightstick:b22,righttrigger:b10,rightx:a6,righty:a4,start:b18,x:b6,y:b0,platform:Mac OS X, +030000006f0e00000302000025040000,Victrix Pro Fight Stick for PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000791d00000103000009010000,Wii Classic Controller,a:b2,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b10,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Mac OS X, 050000005769696d6f74652028303000,Wii Remote,a:b4,b:b5,back:b7,dpdown:b3,dpleft:b0,dpright:b1,dpup:b2,guide:b8,leftshoulder:b11,lefttrigger:b12,leftx:a0,lefty:a1,start:b6,x:b10,y:b9,platform:Mac OS X, 050000005769696d6f74652028313800,Wii U Pro Controller,a:b16,b:b15,back:b7,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b8,leftshoulder:b19,leftstick:b23,lefttrigger:b21,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b24,righttrigger:b22,rightx:a2,righty:a3,start:b6,x:b18,y:b17,platform:Mac OS X, 030000005e0400008e02000000000000,X360 Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, @@ -370,37 +430,57 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, # Linux 05000000c82d00001038000000010000,8Bitdo FC30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +05000000c82d00005106000000010000,8BitDo M30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,start:b11,x:b3,y:b4,platform:Linux, +03000000c82d00001590000011010000,8BitDo N30 Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +05000000c82d00006528000000010000,8BitDo N30 Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +03000000c82d00000310000011010000,8BitDo NES30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b7,lefttrigger:b6,rightshoulder:b9,righttrigger:b8,start:b11,x:b3,y:b4,platform:Linux, +05000000c82d00008010000000010000,8BitDo NES30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b7,lefttrigger:b6,rightshoulder:b9,righttrigger:b8,start:b11,x:b3,y:b4,platform:Linux, 03000000022000000090000011010000,8Bitdo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, 05000000203800000900000000010000,8Bitdo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, 05000000c82d00002038000000010000,8Bitdo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, 03000000c82d00000190000011010000,8Bitdo NES30 Pro 8Bitdo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +05000000c82d00000060000000010000,8BitDo SF30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, 05000000c82d00000061000000010000,8Bitdo SF30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +03000000c82d000021ab000010010000,8BitDo SFC30,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Linux, 05000000102800000900000000010000,8Bitdo SFC30 GamePad,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Linux, 05000000c82d00003028000000010000,8Bitdo SFC30 GamePad,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Linux, +03000000c82d00000160000000000000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Linux, +03000000c82d00000160000011010000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +03000000c82d00000161000000000000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Linux, +03000000c82d00001290000011010000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Linux, +05000000c82d00000161000000010000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +05000000c82d00006228000000010000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +03000000c82d00000260000011010000,8BitDo SN30 Pro+,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +05000000c82d00000261000000010000,8BitDo SN30 Pro+,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +030000005e0400008e02000020010000,8BitDo Wireless Adapter,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000c82d00000031000011010000,8BitDo Wireless Adapter,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, 05000000a00500003232000001000000,8Bitdo Zero GamePad,a:b0,b:b1,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Linux, 05000000a00500003232000008010000,8Bitdo Zero GamePad,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Linux, 030000006f0e00001302000000010000,Afterglow,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, 030000006f0e00003901000020060000,Afterglow Controller for Xbox One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000006f0e00003901000013020000,Afterglow Prismatic Wired Controller 048-007-NA,a:b0,b:b1,x:b2,y:b3,back:b6,guide:b8,start:b7,leftstick:b9,rightstick:b10,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:a2,righttrigger:a5,platform:Linux, 030000006f0e00003901000000430000,Afterglow Prismatic Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006f0e00003901000013020000,Afterglow Prismatic Wired Controller 048-007-NA,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, 03000000100000008200000011010000,Akishop Customs PS360+ v1.66,a:b1,b:b2,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, 05000000491900000204000021000000,Amazon Fire Game Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, 05000000050b00000045000031000000,ASUS Gamepad,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b10,x:b2,y:b3,platform:Linux, 05000000050b00000045000040000000,ASUS Gamepad,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b10,x:b2,y:b3,platform:Linux, 03000000120c00000500000010010000,AxisPad,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a2,start:b11,x:b0,y:b1,platform:Linux, 03000000666600006706000000010000,boom PSX to PC Converter,a:b2,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b10,righttrigger:b5,rightx:a2,righty:a3,start:b11,x:b3,y:b0,platform:Linux, +03000000ffff0000ffff000000010000,Chinese-made Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b4,platform:Linux, 03000000e82000006058000001010000,Cideko AK08b,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +030000000b0400003365000000010000,Competition Pro,a:b0,b:b1,back:b2,leftx:a0,lefty:a1,start:b3,platform:Linux, 03000000260900008888000000010000,Cyber Gadget GameCube Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:a5,rightx:a2,righty:a3~,start:b7,x:b2,y:b3,platform:Linux, 03000000a306000022f6000011010000,Cyborg V.3 Rumble Pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:+a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:-a3,rightx:a2,righty:a4,start:b9,x:b0,y:b3,platform:Linux, 03000000b40400000a01000000010000,CYPRESS USB Gamepad,a:b0,b:b1,back:b5,guide:b2,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b8,x:b3,y:b4,platform:Linux, 03000000790000000600000010010000,DragonRise Inc. Generic USB Joystick,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b3,y:b0,platform:Linux, +030000004f04000004b3000010010000,Dual Power 2,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Linux, 030000006f0e00003001000001010000,EA Sports PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, 03000000341a000005f7000010010000,GameCube {HuiJia USB box},a:b1,b:b2,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b0,y:b3,platform:Linux, 03000000bc2000000055000011010000,GameSir G3w,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, 0500000047532047616d657061640000,GameStop Gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, 030000006f0e00000104000000010000,Gamestop Logic3 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, 030000008f0e00000800000010010000,Gasia Co. Ltd PS(R) Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, -030000006f0e00001304000000010000,Generic X-Box pad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:a0,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:a3,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006f0e00001304000000010000,Generic X-Box pad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, 03000000f0250000c183000010010000,Goodbetterbest Ltd USB Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, 0300000079000000d418000000010000,GPD Win 2 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, 030000007d0400000540000000010000,Gravis Eliminator GamePad Pro,a:b1,b:b2,back:b8,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, @@ -408,6 +488,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 030000008f0e00000610000000010000,GreenAsia Electronics 4Axes 12Keys GamePad ,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b10,righttrigger:b5,rightx:a3,righty:a2,start:b11,x:b3,y:b0,platform:Linux, 030000008f0e00001200000010010000,GreenAsia Inc. USB Joystick,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b2,y:b3,platform:Linux, 0500000047532067616d657061640000,GS gamepad,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, +03000000f0250000c383000010010000,GT VX2,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, 06000000adde0000efbe000002010000,Hidromancer Game Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, 03000000d81400000862000011010000,HitBox (PS3/PC) Analog Mode,a:b1,b:b2,back:b8,guide:b9,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b12,x:b0,y:b3,platform:Linux, 03000000c9110000f055000011010000,HJC Game GAMEPAD,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, @@ -420,6 +501,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 030000000d0f00005e00000011010000,Hori Fighting Commander 4 (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, 03000000ad1b000001f5000033050000,Hori Pad EX Turbo 2,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, 030000000d0f00009200000011010000,Hori Pokken Tournament DX Pro Pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, +030000000d0f00001600000000010000,Hori Real Arcade Pro.EX-SE (Xbox 360),a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b2,y:b3,platform:Linux, 030000000d0f00006e00000011010000,HORIPAD 4 (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, 030000000d0f00006600000011010000,HORIPAD 4 (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, 030000000d0f0000ee00000011010000,HORIPAD mini4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, @@ -428,6 +510,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 03000000830500006020000010010000,iBuffalo SNES Controller,a:b1,b:b0,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b7,x:b3,y:b2,platform:Linux, 050000006964726f69643a636f6e0000,idroid:con,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, 03000000b50700001503000010010000,impact,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Linux, +03000000d80400008200000003000000,IMS PCU#0 Gamepad Interface,a:b1,b:b0,back:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,start:b5,x:b3,y:b2,platform:Linux, 03000000fd0500000030000000010000,InterAct GoPad I-73000 (Fighting Game Layout),a:b3,b:b4,back:b6,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b5,start:b7,x:b0,y:b1,platform:Linux, 0500000049190000020400001b010000,Ipega PG-9069 - Bluetooth Gamepad,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b161,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, 030000006e0500000320000010010000,JC-U3613M - DirectInput Mode,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b0,y:b1,platform:Linux, @@ -463,10 +546,12 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 03000000ad1b000016f0000090040000,Mad Catz Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, 03000000380700001888000010010000,MadCatz PC USB Wired Stick 8818,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, 03000000380700003888000010010000,MadCatz PC USB Wired Stick 8838,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:a0,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, -0300000079000000d218000011010000,MAGIC-NS,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, 03000000120c00000500000000010000,Manta Dualshock 2,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b2,y:b3,platform:Linux, 03000000790000004418000010010000,Mayflash GameCube Controller,a:b1,b:b2,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b0,y:b3,platform:Linux, 03000000790000004318000010010000,Mayflash GameCube Controller Adapter,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b2,y:b3,platform:Linux, +03000000242f00007300000011010000,Mayflash Magic NS,a:b1,b:b4,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b0,y:b3,platform:Linux, +0300000079000000d218000011010000,Mayflash Magic NS,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000d620000010a7000011010000,Mayflash Magic NS,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, 0300000025090000e803000001010000,Mayflash Wii Classic Controller,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:a4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:a5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Linux, 03000000780000000600000010010000,Microntek USB Joystick,a:b2,b:b1,back:b8,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,start:b9,x:b3,y:b0,platform:Linux, 030000005e0400000e00000000010000,Microsoft SideWinder,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,rightshoulder:b7,start:b8,x:b3,y:b4,platform:Linux, @@ -474,16 +559,20 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 030000005e0400008e02000062230000,Microsoft X-Box 360 pad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, 030000005e040000e302000003020000,Microsoft X-Box One Elite pad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, 030000005e040000d102000001010000,Microsoft X-Box One pad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +050000005e040000050b000003090000,Microsoft X-Box One Elite 2 pad,a:b0,b:b1,y:b4,x:b3,start:b11,guide:b12,back:b17,leftstick:b13,rightstick:b14,leftshoulder:b6,rightshoulder:b7,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a5,righttrigger:a4,platform:Linux, 030000005e040000dd02000003020000,Microsoft X-Box One pad (Firmware 2015),a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, 030000005e040000d102000003020000,Microsoft X-Box One pad v2,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, 030000005e0400008502000000010000,Microsoft X-Box pad (Japan),a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b4,platform:Linux, 030000005e0400008902000021010000,Microsoft X-Box pad v2 (US),a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b4,platform:Linux, +03000000c62400001a53000000010000,Mini PE,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000030000000300000002000000,Miroof,a:b1,b:b0,back:b6,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b7,x:b3,y:b2,platform:Linux, 05000000d6200000e589000001000000,Moga 2 HID,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Linux, 05000000d6200000ad0d000001000000,Moga Pro,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Linux, 05000000d62000007162000001000000,Moga Pro 2 HID,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Linux, 03000000250900006688000000010000,MP-8866 Super Dual Box,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Linux, 030000000d0f00000900000010010000,Natec Genesis P44,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, 030000001008000001e5000010010000,NEXT SNES Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b6,start:b9,x:b3,y:b0,platform:Linux, +030000007e0500003703000000016800,Nintendo GameCube Controller,a:b0,b:b2,dpdown:b6,dpleft:b4,dpright:b5,dpup:b7,lefttrigger:a4,leftx:a0,lefty:a1~,rightshoulder:b9,righttrigger:a5,rightx:a2,righty:a3~,start:b8,x:b1,y:b3,platform:Linux, 050000007e0500000920000001000000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, 050000007e0500003003000001000000,Nintendo Wii Remote Pro Controller,a:b0,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b16,dpup:b13,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Linux, 05000000010000000100000003000000,Nintendo Wiimote,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, @@ -498,9 +587,11 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 03000000ff1100003133000010010000,PC Game Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, 030000006f0e00006401000001010000,PDP Battlefield One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, 030000006f0e0000a802000023020000,PDP Wired Controller for Xbox One,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, +030000004c050000da0c000011010000,Playstation Controller,a:b2,b:b1,back:b8,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,start:b9,x:b3,y:b0,platform:Linux, 03000000c62400000053000000010000,PowerA,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, 03000000c62400003a54000001010000,PowerA 1428124-01,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, 03000000d62000006dca000011010000,PowerA Pro Ex,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000006d040000d2ca000011010000,Precision Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, 03000000ff1100004133000010010000,PS2 Controller,a:b2,b:b1,back:b8,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,start:b9,x:b3,y:b0,platform:Linux, 03000000341a00003608000011010000,PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, 030000004c0500006802000010010000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Linux, @@ -510,7 +601,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 030000006f0e00001402000011010000,PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, 030000008f0e00000300000010010000,PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, 050000004c0500006802000000010000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:a12,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:a13,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Linux, -050000004c0500006802000000800000,PS3 Controller,a:b0,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b16,dpup:b13,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, +050000004c0500006802000000800000,PS3 Controller,a:b0,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b16,dpup:b13,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, 050000004c0500006802000000810000,PS3 Controller,a:b0,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b16,dpup:b13,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, 05000000504c415953544154494f4e00,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Linux, 060000004c0500006802000000010000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Linux, @@ -521,6 +612,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 030000004c050000cc09000000010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, 030000004c050000cc09000011010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, 030000004c050000cc09000011810000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, +03000000c01100000140000011010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, 050000004c050000c405000000010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, 050000004c050000c405000000810000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, 050000004c050000cc09000000010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, @@ -533,6 +625,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 03000000321500000204000011010000,Razer Panthera (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, 03000000321500000104000011010000,Razer Panthera (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, 03000000321500000010000011010000,Razer RAIJU,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +03000000321500000507000000010000,Razer Raiju Mobile,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b21,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, 030000008916000000fe000024010000,Razer Sabertooth,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, 03000000c6240000045d000024010000,Razer Sabertooth,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, 03000000c6240000045d000025010000,Razer Sabertooth,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, @@ -540,6 +633,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 050000003215000000090000163a0000,Razer Serval,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Linux, 0300000032150000030a000001010000,Razer Wildcat,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, 03000000790000001100000010010000,Retrolink SNES Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b9,x:b3,y:b0,platform:Linux, +0300000081170000990a000001010000,Retronic Adapter,a:b0,leftx:a0,lefty:a1,platform:Linux, 0300000000f000000300000000010000,RetroPad,a:b1,b:b5,back:b2,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b3,x:b0,y:b4,platform:Linux, 030000006b140000010d000011010000,Revolution Pro Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, 030000006f0e00001f01000000010000,Rock Candy,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, @@ -548,9 +642,11 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 03000000a306000023f6000011010000,Saitek Cyborg V.1 Game Pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b0,y:b3,platform:Linux, 03000000a30600000cff000010010000,Saitek P2500 Force Rumble Pad,a:b2,b:b3,back:b11,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a2,x:b0,y:b1,platform:Linux, 03000000a30600000c04000011010000,Saitek P2900 Wireless Pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b12,x:b0,y:b3,platform:Linux, +03000000300f00001201000010010000,Saitek P380,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a1,righty:a2,start:b9,x:b0,y:b1,platform:Linux, 03000000a30600000901000000010000,Saitek P880,a:b2,b:b3,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a2,x:b0,y:b1,platform:Linux, 03000000a30600000b04000000010000,Saitek P990 Dual Analog Pad,a:b1,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b8,x:b0,y:b3,platform:Linux, 03000000a306000018f5000010010000,Saitek PLC Saitek P3200 Rumble Pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Linux, +03000000d81d00000e00000010010000,Savior,a:b0,b:b1,back:b8,leftshoulder:b6,leftstick:b10,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b11,righttrigger:b3,start:b9,x:b4,y:b5,platform:Linux, 03000000c01600008704000011010000,Serial/Keyboard/Mouse/Joystick,a:b12,b:b10,back:b4,dpdown:b2,dpleft:b3,dpright:b1,dpup:b0,leftshoulder:b9,leftstick:b14,lefttrigger:b6,leftx:a1,lefty:a0,rightshoulder:b8,rightstick:b15,righttrigger:b7,rightx:a2,righty:a3,start:b5,x:b13,y:b11,platform:Linux, 03000000f025000021c1000010010000,ShanWan Gioteck PS3 Wired Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, 03000000632500007505000010010000,SHANWAN PS3/PC Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, @@ -582,11 +678,15 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 030000004f04000012b3000010010000,Thrustmaster vibrating gamepad,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Linux, 03000000bd12000015d0000010010000,Tomee SNES USB Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b9,x:b3,y:b0,platform:Linux, 03000000d814000007cd000011010000,Toodles 2008 Chimp PC/PS3,a:b0,b:b1,back:b8,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b3,y:b2,platform:Linux, +030000005e0400008e02000070050000,Torid,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000c01100000591000011010000,Torid,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, 03000000100800000100000010010000,Twin USB PS2 Adapter,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Linux, 03000000100800000300000010010000,USB Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Linux, 03000000790000000600000007010000,USB gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b3,y:b0,platform:Linux, 03000000790000001100000000010000,USB Gamepad1,a:b2,b:b1,back:b8,dpdown:a0,dpleft:a1,dpright:a2,dpup:a4,start:b9,platform:Linux, +030000006f0e00000302000011010000,Victrix Pro Fight Stick for PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, 05000000ac0500003232000001000000,VR-BOX,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b2,y:b3,platform:Linux, +03000000791d00000103000010010000,Wii Classic Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, 030000005e0400008e02000010010000,X360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, 030000005e0400008e02000014010000,X360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, 030000005e0400001907000000010000,X360 Wireless Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12,dpup:b13,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, @@ -596,9 +696,11 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 0000000058626f782033363020576900,Xbox 360 Wireless Controller,a:b0,b:b1,back:b14,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,guide:b7,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Linux, 030000005e040000a102000014010000,Xbox 360 Wireless Receiver (XBOX),a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12,dpup:b13,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, 0000000058626f782047616d65706100,Xbox Gamepad (userspace driver),a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Linux, -030000005e040000ea02000001030000,Xbox One Wireless Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e040000d102000002010000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +050000005e040000fd02000030110000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, 050000005e040000e002000003090000,Xbox One Wireless Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, 050000005e040000fd02000003090000,Xbox One Wireless Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b16,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +030000005e040000ea02000001030000,Xbox One Wireless Controller (Model 1708),a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, 03000000450c00002043000010010000,XEOX Gamepad SL-6556-BK,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, 05000000172700004431000029010000,XiaoMi Game Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b20,leftshoulder:b6,leftstick:b13,lefttrigger:a7,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a6,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Linux, 03000000c0160000e105000001010000,Xin-Mo Xin-Mo Dual Arcade,a:b4,b:b3,back:b6,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b9,leftshoulder:b2,leftx:a0,lefty:a1,rightshoulder:b5,start:b7,x:b1,y:b0,platform:Linux, @@ -619,6 +721,8 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 050000004c050000c4050000fffe3f00,PS4 Controller,a:b1,b:b17,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b3,leftstick:b4,lefttrigger:+a3,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:+a4,rightx:a2,righty:a5,start:b16,x:b0,y:b2,platform:Android, 050000004c050000cc090000fffe3f00,PS4 Controller,a:b1,b:b17,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b3,leftstick:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:a4,rightx:a2,righty:a5,start:b16,x:b0,y:b2,platform:Android, 35643031303033326130316330353564,PS4 Controller,a:b1,b:b17,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b3,leftstick:b4,lefttrigger:+a3,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:+a4,rightx:a2,righty:a5,start:b16,x:b0,y:b2,platform:Android, +050000003215000005070000ffff3f00,Razer Raiju Mobile,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +050000003215000007070000ffff3f00,Razer Raiju Mobile,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, 050000003215000000090000bf7f3f00,Razer Serval,a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,x:b2,y:b3,platform:Android, 05000000de2800000511000001000000,Steam Controller,a:b0,b:b1,back:b6,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:Android, 05000000de2800000611000001000000,Steam Controller,a:b0,b:b1,back:b6,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:Android, @@ -630,9 +734,15 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, # iOS 05000000ac0500000100000000006d01,*,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,leftshoulder:b4,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a5,rightx:a3,righty:a4,x:b2,y:b3,platform:iOS, +05000000ac050000010000004f066d01,*,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,leftshoulder:b4,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a5,rightx:a3,righty:a4,x:b2,y:b3,platform:iOS, +05000000ac05000001000000cf076d01,*,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,x:b2,y:b3,platform:iOS, 05000000ac0500000200000000006d02,*,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,leftshoulder:b4,rightshoulder:b5,x:b2,y:b3,platform:iOS, +05000000ac050000020000004f066d02,*,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,leftshoulder:b4,rightshoulder:b5,x:b2,y:b3,platform:iOS, +050000004c050000cc090000df070000,DUALSHOCK 4 Wireless Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b2,y:b3,platform:iOS, 4d466947616d65706164010000000000,MFi Extended Gamepad,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:iOS, 4d466947616d65706164020000000000,MFi Gamepad,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,rightshoulder:b5,start:b6,x:b2,y:b3,platform:iOS, 05000000ac0500000300000000006d03,Remote,a:b0,b:b2,leftx:a0,lefty:a1,platform:iOS, +05000000ac0500000300000043006d03,Remote,a:b0,b:b2,leftx:a0,lefty:a1,platform:iOS, 05000000de2800000511000001000000,Steam Controller,a:b0,b:b1,back:b6,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:iOS, 05000000de2800000611000001000000,Steam Controller,a:b0,b:b1,back:b6,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:iOS, +050000005e040000e0020000df070000,Xbox Wireless Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b2,y:b3,platform:iOS, diff --git a/main/main.cpp b/main/main.cpp index c34d3da618..22a31d597e 100644 --- a/main/main.cpp +++ b/main/main.cpp @@ -1517,6 +1517,9 @@ bool Main::start() { ERR_FAIL_COND_V_MSG(script_res.is_null(), false, "Can't load script: " + script); if (check_only) { + if (!script_res->is_valid()) { + OS::get_singleton()->set_exit_code(1); + } return false; } diff --git a/modules/arkit/arkit_interface.mm b/modules/arkit/arkit_interface.mm index 9614f775a5..71642cfc30 100644 --- a/modules/arkit/arkit_interface.mm +++ b/modules/arkit/arkit_interface.mm @@ -37,6 +37,8 @@ #import <ARKit/ARKit.h> #import <UIKit/UIKit.h> +#include <dlfcn.h> + #include "arkit_interface.h" #include "arkit_session_delegate.h" @@ -53,7 +55,10 @@ void ARKitInterface::start_session() { // Ignore this if we're not initialized... if (initialized) { print_line("Starting ARKit session"); - ARWorldTrackingConfiguration *configuration = [ARWorldTrackingConfiguration new]; + + Class ARWorldTrackingConfigurationClass = NSClassFromString(@"ARWorldTrackingConfiguration"); + ARWorldTrackingConfiguration *configuration = [ARWorldTrackingConfigurationClass new]; + configuration.lightEstimationEnabled = light_estimation_is_enabled; if (plane_detection_is_enabled) { configuration.planeDetection = ARPlaneDetectionVertical | ARPlaneDetectionHorizontal; @@ -221,7 +226,17 @@ bool ARKitInterface::initialize() { print_line("initializing ARKit"); // create our ar session and delegate - ar_session = [ARSession new]; + Class ARSessionClass = NSClassFromString(@"ARSession"); + if (ARSessionClass == Nil) { + void *arkit_handle = dlopen("/System/Library/Frameworks/ARKit.framework/ARKit", RTLD_NOW); + if (arkit_handle) { + ARSessionClass = NSClassFromString(@"ARSession"); + } else { + print_line("ARKit init failed"); + return false; + } + } + ar_session = [ARSessionClass new]; ar_delegate = [ARKitSessionDelegate new]; ar_delegate.arkit_interface = this; ar_session.delegate = ar_delegate; diff --git a/modules/assimp/editor_scene_importer_assimp.cpp b/modules/assimp/editor_scene_importer_assimp.cpp index 3172d1e592..2cb2a71f1e 100644 --- a/modules/assimp/editor_scene_importer_assimp.cpp +++ b/modules/assimp/editor_scene_importer_assimp.cpp @@ -1319,7 +1319,7 @@ EditorSceneImporterAssimp::create_mesh(ImportState &state, const aiNode *assimp_ RegenerateBoneStack(state); - // Configure indicies + // Configure indices for (uint32_t i = 0; i < assimp_node->mNumMeshes; i++) { int mesh_index = assimp_node->mMeshes[i]; // create list of mesh indexes diff --git a/modules/assimp/import_utils.h b/modules/assimp/import_utils.h index 7b14804ddc..8135b352c6 100644 --- a/modules/assimp/import_utils.h +++ b/modules/assimp/import_utils.h @@ -394,7 +394,9 @@ public: return Ref<Image>(); } else { Ref<Texture> texture = ResourceLoader::load(p_path); + ERR_FAIL_COND_V(texture.is_null(), Ref<Image>()); Ref<Image> image = texture->get_data(); + ERR_FAIL_COND_V(image.is_null(), Ref<Image>()); state.path_to_image_cache.insert(p_path, image); return image; } diff --git a/modules/enet/doc_classes/NetworkedMultiplayerENet.xml b/modules/enet/doc_classes/NetworkedMultiplayerENet.xml index 4c10588aa6..78a8e94012 100644 --- a/modules/enet/doc_classes/NetworkedMultiplayerENet.xml +++ b/modules/enet/doc_classes/NetworkedMultiplayerENet.xml @@ -116,6 +116,9 @@ The compression method used for network packets. These have different tradeoffs of compression speed versus bandwidth, you may need to test which one works best for your use case if you use compression at all. </member> <member name="refuse_new_connections" type="bool" setter="set_refuse_new_connections" getter="is_refusing_new_connections" override="true" default="false" /> + <member name="server_relay" type="bool" setter="set_server_relay_enabled" getter="is_server_relay_enabled" default="true"> + Enable or disable the server feature that notifies clients of other peers' connection/disconnection, and relays messages between them. When this option is [code]false[/code], clients won't be automatically notified of other peers and won't be able to send them packets through the server. + </member> <member name="transfer_channel" type="int" setter="set_transfer_channel" getter="get_transfer_channel" default="-1"> Set the default channel to be used to transfer data. By default, this value is [code]-1[/code] which means that ENet will only use 2 channels, one for reliable and one for unreliable packets. Channel [code]0[/code] is reserved, and cannot be used. Setting this member to any value between [code]0[/code] and [member channel_count] (excluded) will force ENet to use that channel for sending data. </member> diff --git a/modules/enet/networked_multiplayer_enet.cpp b/modules/enet/networked_multiplayer_enet.cpp index a787cd3b80..2f5307d041 100644 --- a/modules/enet/networked_multiplayer_enet.cpp +++ b/modules/enet/networked_multiplayer_enet.cpp @@ -255,6 +255,10 @@ void NetworkedMultiplayerENet::poll() { emit_signal("peer_connected", *new_id); if (server) { + // Do not notify other peers when server_relay is disabled. + if (!server_relay) + break; + // Someone connected, notify all the peers available for (Map<int, ENetPeer *>::Element *E = peer_map.front(); E; E = E->next()) { @@ -287,31 +291,34 @@ void NetworkedMultiplayerENet::poll() { if (!server) { emit_signal("connection_failed"); } - } else { + // Never fully connected. + break; + } - if (server) { - // Someone disconnected, notify everyone else - for (Map<int, ENetPeer *>::Element *E = peer_map.front(); E; E = E->next()) { + if (!server) { - if (E->key() == *id) - continue; + // Client just disconnected from server. + emit_signal("server_disconnected"); + close_connection(); + return; + } else if (server_relay) { - ENetPacket *packet = enet_packet_create(NULL, 8, ENET_PACKET_FLAG_RELIABLE); - encode_uint32(SYSMSG_REMOVE_PEER, &packet->data[0]); - encode_uint32(*id, &packet->data[4]); - enet_peer_send(E->get(), SYSCH_CONFIG, packet); - } - } else { - emit_signal("server_disconnected"); - close_connection(); - return; - } + // Server just received a client disconnect and is in relay mode, notify everyone else. + for (Map<int, ENetPeer *>::Element *E = peer_map.front(); E; E = E->next()) { + + if (E->key() == *id) + continue; - emit_signal("peer_disconnected", *id); - peer_map.erase(*id); - memdelete(id); + ENetPacket *packet = enet_packet_create(NULL, 8, ENET_PACKET_FLAG_RELIABLE); + encode_uint32(SYSMSG_REMOVE_PEER, &packet->data[0]); + encode_uint32(*id, &packet->data[4]); + enet_peer_send(E->get(), SYSCH_CONFIG, packet); + } } + emit_signal("peer_disconnected", *id); + peer_map.erase(*id); + memdelete(id); } break; case ENET_EVENT_TYPE_RECEIVE: { @@ -361,7 +368,13 @@ void NetworkedMultiplayerENet::poll() { packet.from = *id; - if (target == 0) { + if (target == 1) { + // To myself and only myself + incoming_packets.push_back(packet); + } else if (!server_relay) { + // No other destination is allowed when server is not relaying + continue; + } else if (target == 0) { // Re-send to everyone but sender :| incoming_packets.push_back(packet); @@ -398,9 +411,6 @@ void NetworkedMultiplayerENet::poll() { enet_packet_destroy(packet.packet); } - } else if (target == 1) { - // To myself and only myself - incoming_packets.push_back(packet); } else { // To someone else, specifically ERR_CONTINUE(!peer_map.has(target)); @@ -440,6 +450,8 @@ void NetworkedMultiplayerENet::close_connection(uint32_t wait_usec) { for (Map<int, ENetPeer *>::Element *E = peer_map.front(); E; E = E->next()) { if (E->get()) { enet_peer_disconnect_now(E->get(), unique_id); + int *id = (int *)(E->get()->data); + memdelete(id); peers_disconnected = true; } } @@ -455,6 +467,7 @@ void NetworkedMultiplayerENet::close_connection(uint32_t wait_usec) { enet_host_destroy(host); active = false; incoming_packets.clear(); + peer_map.clear(); unique_id = 1; // Server is 1 connection_status = CONNECTION_DISCONNECTED; } @@ -471,10 +484,13 @@ void NetworkedMultiplayerENet::disconnect_peer(int p_peer, bool now) { // enet_peer_disconnect_now doesn't generate ENET_EVENT_TYPE_DISCONNECT, // notify everyone else, send disconnect signal & remove from peer_map like in poll() + int *id = NULL; for (Map<int, ENetPeer *>::Element *E = peer_map.front(); E; E = E->next()) { - if (E->key() == p_peer) + if (E->key() == p_peer) { + id = (int *)(E->get()->data); continue; + } ENetPacket *packet = enet_packet_create(NULL, 8, ENET_PACKET_FLAG_RELIABLE); encode_uint32(SYSMSG_REMOVE_PEER, &packet->data[0]); @@ -482,6 +498,9 @@ void NetworkedMultiplayerENet::disconnect_peer(int p_peer, bool now) { enet_peer_send(E->get(), SYSCH_CONFIG, packet); } + if (id) + memdelete(id); + emit_signal("peer_disconnected", p_peer); peer_map.erase(p_peer); } else { @@ -818,6 +837,16 @@ bool NetworkedMultiplayerENet::is_always_ordered() const { return always_ordered; } +void NetworkedMultiplayerENet::set_server_relay_enabled(bool p_enabled) { + ERR_FAIL_COND(active); + + server_relay = p_enabled; +} + +bool NetworkedMultiplayerENet::is_server_relay_enabled() const { + return server_relay; +} + void NetworkedMultiplayerENet::_bind_methods() { ClassDB::bind_method(D_METHOD("create_server", "port", "max_clients", "in_bandwidth", "out_bandwidth"), &NetworkedMultiplayerENet::create_server, DEFVAL(32), DEFVAL(0), DEFVAL(0)); @@ -838,11 +867,14 @@ void NetworkedMultiplayerENet::_bind_methods() { ClassDB::bind_method(D_METHOD("get_channel_count"), &NetworkedMultiplayerENet::get_channel_count); ClassDB::bind_method(D_METHOD("set_always_ordered", "ordered"), &NetworkedMultiplayerENet::set_always_ordered); ClassDB::bind_method(D_METHOD("is_always_ordered"), &NetworkedMultiplayerENet::is_always_ordered); + ClassDB::bind_method(D_METHOD("set_server_relay_enabled", "enabled"), &NetworkedMultiplayerENet::set_server_relay_enabled); + ClassDB::bind_method(D_METHOD("is_server_relay_enabled"), &NetworkedMultiplayerENet::is_server_relay_enabled); ADD_PROPERTY(PropertyInfo(Variant::INT, "compression_mode", PROPERTY_HINT_ENUM, "None,Range Coder,FastLZ,ZLib,ZStd"), "set_compression_mode", "get_compression_mode"); ADD_PROPERTY(PropertyInfo(Variant::INT, "transfer_channel"), "set_transfer_channel", "get_transfer_channel"); ADD_PROPERTY(PropertyInfo(Variant::INT, "channel_count"), "set_channel_count", "get_channel_count"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "always_ordered"), "set_always_ordered", "is_always_ordered"); + ADD_PROPERTY(PropertyInfo(Variant::BOOL, "server_relay"), "set_server_relay_enabled", "is_server_relay_enabled"); BIND_ENUM_CONSTANT(COMPRESS_NONE); BIND_ENUM_CONSTANT(COMPRESS_RANGE_CODER); @@ -856,6 +888,7 @@ NetworkedMultiplayerENet::NetworkedMultiplayerENet() { active = false; server = false; refuse_connections = false; + server_relay = true; unique_id = 0; target_peer = 0; current_packet.packet = NULL; diff --git a/modules/enet/networked_multiplayer_enet.h b/modules/enet/networked_multiplayer_enet.h index 8dcb202314..1c4c15ae7b 100644 --- a/modules/enet/networked_multiplayer_enet.h +++ b/modules/enet/networked_multiplayer_enet.h @@ -78,6 +78,7 @@ private: ENetHost *host; bool refuse_connections; + bool server_relay; ConnectionStatus connection_status; @@ -158,6 +159,8 @@ public: int get_channel_count() const; void set_always_ordered(bool p_ordered); bool is_always_ordered() const; + void set_server_relay_enabled(bool p_enabled); + bool is_server_relay_enabled() const; NetworkedMultiplayerENet(); ~NetworkedMultiplayerENet(); diff --git a/modules/gdnative/nativescript/api_generator.cpp b/modules/gdnative/nativescript/api_generator.cpp index e0cf990f83..eace195c33 100644 --- a/modules/gdnative/nativescript/api_generator.cpp +++ b/modules/gdnative/nativescript/api_generator.cpp @@ -108,6 +108,7 @@ struct ClassAPI { ClassDB::APIType api_type; bool is_singleton; + String singleton_name; bool is_instanciable; // @Unclear bool is_reference; @@ -183,6 +184,7 @@ List<ClassAPI> generate_c_api_classes() { global_constants_api.class_name = L"GlobalConstants"; global_constants_api.api_type = ClassDB::API_CORE; global_constants_api.is_singleton = true; + global_constants_api.singleton_name = L"GlobalConstants"; global_constants_api.is_instanciable = false; const int constants_count = GlobalConstants::get_global_constant_count(); for (int i = 0; i < constants_count; ++i) { @@ -208,6 +210,9 @@ List<ClassAPI> generate_c_api_classes() { name.remove(0); } class_api.is_singleton = Engine::get_singleton()->has_singleton(name); + if (class_api.is_singleton) { + class_api.singleton_name = name; + } } class_api.is_instanciable = !class_api.is_singleton && ClassDB::can_instance(class_name); @@ -421,6 +426,7 @@ static List<String> generate_c_api_json(const List<ClassAPI> &p_api) { source.push_back("\t\t\"base_class\": \"" + api.super_class_name + "\",\n"); source.push_back(String("\t\t\"api_type\": \"") + (api.api_type == ClassDB::API_CORE ? "core" : (api.api_type == ClassDB::API_EDITOR ? "tools" : "none")) + "\",\n"); source.push_back(String("\t\t\"singleton\": ") + (api.is_singleton ? "true" : "false") + ",\n"); + source.push_back("\t\t\"singleton_name\": \"" + api.singleton_name + "\",\n"); source.push_back(String("\t\t\"instanciable\": ") + (api.is_instanciable ? "true" : "false") + ",\n"); source.push_back(String("\t\t\"is_reference\": ") + (api.is_reference ? "true" : "false") + ",\n"); // @Unclear diff --git a/modules/gdnative/videodecoder/video_stream_gdnative.cpp b/modules/gdnative/videodecoder/video_stream_gdnative.cpp index 14b7f9a2ef..ab14f01858 100644 --- a/modules/gdnative/videodecoder/video_stream_gdnative.cpp +++ b/modules/gdnative/videodecoder/video_stream_gdnative.cpp @@ -123,9 +123,12 @@ bool VideoStreamPlaybackGDNative::open_file(const String &p_file) { godot_vector2 vec = interface->get_texture_size(data_struct); texture_size = *(Vector2 *)&vec; + // Only do memset if num_channels > 0 otherwise it will crash. + if (num_channels > 0) { + pcm = (float *)memalloc(num_channels * AUX_BUFFER_SIZE * sizeof(float)); + memset(pcm, 0, num_channels * AUX_BUFFER_SIZE * sizeof(float)); + } - pcm = (float *)memalloc(num_channels * AUX_BUFFER_SIZE * sizeof(float)); - memset(pcm, 0, num_channels * AUX_BUFFER_SIZE * sizeof(float)); pcm_write_idx = -1; samples_decoded = 0; @@ -146,7 +149,8 @@ void VideoStreamPlaybackGDNative::update(float p_delta) { ERR_FAIL_COND(interface == NULL); interface->update(data_struct, p_delta); - if (mix_callback) { + // Don't mix if there's no audio (num_channels == 0). + if (mix_callback && num_channels > 0) { if (pcm_write_idx >= 0) { // Previous remains int mixed = mix_callback(mix_udata, pcm + pcm_write_idx * num_channels, samples_decoded); diff --git a/modules/gdscript/doc_classes/@GDScript.xml b/modules/gdscript/doc_classes/@GDScript.xml index 840971dcf8..949663c5ea 100644 --- a/modules/gdscript/doc_classes/@GDScript.xml +++ b/modules/gdscript/doc_classes/@GDScript.xml @@ -502,7 +502,7 @@ <argument index="1" name="b" type="float"> </argument> <description> - Returns True/False whether [code]a[/code] and [code]b[/code] are approximately equal to each other. + Returns [code]true[/code] if [code]a[/code] and [code]b[/code] are approximately equal to each other. </description> </method> <method name="is_inf"> @@ -538,7 +538,7 @@ <argument index="0" name="s" type="float"> </argument> <description> - Returns True/False whether [code]s[/code] is zero or almost zero. + Returns [code]true[/code] if [code]s[/code] is zero or almost zero. </description> </method> <method name="len"> @@ -1363,6 +1363,26 @@ Stops the function execution and returns the current suspended state to the calling function. From the caller, call [method GDScriptFunctionState.resume] on the state to resume execution. This invalidates the state. Within the resumed function, [code]yield()[/code] returns whatever was passed to the [code]resume()[/code] function call. If passed an object and a signal, the execution is resumed when the object emits the given signal. In this case, [code]yield()[/code] returns the argument passed to [code]emit_signal()[/code] if the signal takes only one argument, or an array containing all the arguments passed to [code]emit_signal()[/code] if the signal takes multiple arguments. + You can also use [code]yield[/code] to wait for a function to finish: + [codeblock] + func _ready(): + yield(do_something(), "completed") + yield(do_something_else(), "completed") + print("All functions are done!") + + func do_something(): + print("Something is done!") + + func do_something_else(): + print("Something else is done!") + + # prints: + # Something is done! + # Something else is done! + # All functions are done! + [/codeblock] + When yielding on a function, the [code]completed[/code] signal will be emitted automatically when the function returns. It can, therefore, be used as the [code]signal[/code] parameter of the [code]yield[/code] method to resume. + If you are planning on calling the same function within a loop, you should consider using [code]yield(get_tree(), "idle_frame")[/code] also. </description> </method> </methods> diff --git a/modules/gdscript/doc_classes/GDScript.xml b/modules/gdscript/doc_classes/GDScript.xml index 6f43361914..8e175a7ab8 100644 --- a/modules/gdscript/doc_classes/GDScript.xml +++ b/modules/gdscript/doc_classes/GDScript.xml @@ -4,7 +4,7 @@ A script implemented in the GDScript programming language. </brief_description> <description> - A script implemented in the GDScript programming language. The script exends the functionality of all objects that instance it. + A script implemented in the GDScript programming language. The script extends the functionality of all objects that instance it. [method new] creates a new instance of the script. [method Object.set_script] extends an existing object, if that object's class matches one of the script's base classes. </description> <tutorials> diff --git a/modules/gdscript/gdscript.cpp b/modules/gdscript/gdscript.cpp index b90fab8221..563f7e2471 100644 --- a/modules/gdscript/gdscript.cpp +++ b/modules/gdscript/gdscript.cpp @@ -1155,8 +1155,6 @@ bool GDScriptInstance::has_method(const StringName &p_method) const { } Variant GDScriptInstance::call(const StringName &p_method, const Variant **p_args, int p_argcount, Variant::CallError &r_error) { - //printf("calling %ls:%i method %ls\n", script->get_path().c_str(), -1, String(p_method).c_str()); - GDScript *sptr = script.ptr(); while (sptr) { Map<StringName, GDScriptFunction *>::Element *E = sptr->member_functions.find(p_method); @@ -1952,11 +1950,11 @@ String GDScriptWarning::get_message() const { } break; case UNUSED_VARIABLE: { CHECK_SYMBOLS(1); - return "The local variable '" + symbols[0] + "' is declared but never used in the block."; + return "The local variable '" + symbols[0] + "' is declared but never used in the block. If this is intended, prefix it with an underscore: '_" + symbols[0] + "'"; } break; case SHADOWED_VARIABLE: { CHECK_SYMBOLS(2); - return "The local variable '" + symbols[0] + "' is shadowing an already defined variable at line " + symbols[1] + "."; + return "The local variable '" + symbols[0] + "' is shadowing an already-defined variable at line " + symbols[1] + "."; } break; case UNUSED_CLASS_VARIABLE: { CHECK_SYMBOLS(1); @@ -1964,7 +1962,7 @@ String GDScriptWarning::get_message() const { } break; case UNUSED_ARGUMENT: { CHECK_SYMBOLS(2); - return "The argument '" + symbols[1] + "' is never used in the function '" + symbols[0] + "'."; + return "The argument '" + symbols[1] + "' is never used in the function '" + symbols[0] + "'. If this is intended, prefix it with an underscore: '_" + symbols[1] + "'"; } break; case UNREACHABLE_CODE: { CHECK_SYMBOLS(1); diff --git a/modules/gdscript/gdscript_editor.cpp b/modules/gdscript/gdscript_editor.cpp index 1d82735328..280bc37dc0 100644 --- a/modules/gdscript/gdscript_editor.cpp +++ b/modules/gdscript/gdscript_editor.cpp @@ -84,14 +84,17 @@ String GDScriptLanguage::_get_processed_template(const String &p_template, const Ref<Script> GDScriptLanguage::get_template(const String &p_class_name, const String &p_base_class_name) const { String _template = "extends %BASE%\n" "\n" + "\n" "# Declare member variables here. Examples:\n" "# var a%INT_TYPE% = 2\n" "# var b%STRING_TYPE% = \"text\"\n" "\n" + "\n" "# Called when the node enters the scene tree for the first time.\n" "func _ready()%VOID_RETURN%:\n" "%TS%pass # Replace with function body.\n" "\n" + "\n" "# Called every frame. 'delta' is the elapsed time since the previous frame.\n" "#func _process(delta%FLOAT_TYPE%)%VOID_RETURN%:\n" "#%TS%pass\n"; diff --git a/modules/gdscript/language_server/gdscript_workspace.cpp b/modules/gdscript/language_server/gdscript_workspace.cpp index f2c0e7035b..f9a974bad3 100644 --- a/modules/gdscript/language_server/gdscript_workspace.cpp +++ b/modules/gdscript/language_server/gdscript_workspace.cpp @@ -102,9 +102,9 @@ const lsp::DocumentSymbol *GDScriptWorkspace::get_script_symbol(const String &p_ } void GDScriptWorkspace::reload_all_workspace_scripts() { - List<String> pathes; - list_script_files("res://", pathes); - for (List<String>::Element *E = pathes.front(); E; E = E->next()) { + List<String> paths; + list_script_files("res://", paths); + for (List<String>::Element *E = paths.front(); E; E = E->next()) { const String &path = E->get(); Error err; String content = FileAccess::get_file_as_string(path, &err); diff --git a/modules/gdscript/language_server/lsp.hpp b/modules/gdscript/language_server/lsp.hpp index a048af88bb..35471d63d6 100644 --- a/modules/gdscript/language_server/lsp.hpp +++ b/modules/gdscript/language_server/lsp.hpp @@ -1583,7 +1583,7 @@ struct GodotNativeClassInfo { } }; -/** Features not included in the standart lsp specifications */ +/** Features not included in the standard lsp specifications */ struct GodotCapabilities { /** diff --git a/modules/gridmap/doc_classes/GridMap.xml b/modules/gridmap/doc_classes/GridMap.xml index b762868f2c..a140fc8ac6 100644 --- a/modules/gridmap/doc_classes/GridMap.xml +++ b/modules/gridmap/doc_classes/GridMap.xml @@ -4,10 +4,10 @@ Node for 3D tile-based maps. </brief_description> <description> - GridMap lets you place meshes on a grid interactively. It works both from the editor and can help you create in-game level editors. - GridMaps use a [MeshLibrary] which contain a list of tiles: meshes with materials plus optional collisions and extra elements. - A GridMap contains a collection of cells. Each grid cell refers to a [MeshLibrary] item. All cells in the map have the same dimensions. - A GridMap is split into a sparse collection of octants for efficient rendering and physics processing. Every octant has the same dimensions and can contain several cells. + GridMap lets you place meshes on a grid interactively. It works both from the editor and from scripts, which can help you create in-game level editors. + GridMaps use a [MeshLibrary] which contains a list of tiles. Each tile is a mesh with materials plus optional collision and navigation shapes. + A GridMap contains a collection of cells. Each grid cell refers to a tile in the [MeshLibrary]. All cells in the map have the same dimensions. + Internally, a GridMap is split into a sparse collection of octants for efficient rendering and physics processing. Every octant has the same dimensions and can contain several cells. </description> <tutorials> <link>https://docs.godotengine.org/en/latest/tutorials/3d/using_gridmaps.html</link> @@ -72,6 +72,7 @@ <argument index="0" name="bit" type="int"> </argument> <description> + Returns an individual bit on the [member collision_layer]. </description> </method> <method name="get_collision_mask_bit" qualifiers="const"> @@ -80,20 +81,21 @@ <argument index="0" name="bit" type="int"> </argument> <description> + Returns an individual bit on the [member collision_mask]. </description> </method> <method name="get_meshes"> <return type="Array"> </return> <description> - Array of [Transform] and [Mesh] references corresponding to the non-empty cells in the grid. The transforms are specified in world space. + Returns an array of [Transform] and [Mesh] references corresponding to the non-empty cells in the grid. The transforms are specified in world space. </description> </method> <method name="get_used_cells" qualifiers="const"> <return type="Array"> </return> <description> - Array of [Vector3] with the non-empty cell coordinates in the grid map. + Returns an array of [Vector3] with the non-empty cell coordinates in the grid map. </description> </method> <method name="make_baked_meshes"> @@ -116,6 +118,7 @@ <argument index="2" name="z" type="int"> </argument> <description> + Returns the position of a grid cell in the GridMap's local coordinate space. </description> </method> <method name="resource_changed"> @@ -140,9 +143,9 @@ <argument index="4" name="orientation" type="int" default="0"> </argument> <description> - Set the mesh index for the cell referenced by its grid-based X, Y and Z coordinates. - A negative item index will clear the cell. - Optionally, the item's orientation can be passed. + Sets the mesh index for the cell referenced by its grid-based X, Y and Z coordinates. + A negative item index such as [constant INVALID_CELL_ITEM] will clear the cell. + Optionally, the item's orientation can be passed. For valid orientation values, see [method Basis.get_orthogonal_index]. </description> </method> <method name="set_clip"> @@ -167,6 +170,7 @@ <argument index="1" name="value" type="bool"> </argument> <description> + Sets an individual bit on the [member collision_layer]. </description> </method> <method name="set_collision_mask_bit"> @@ -177,6 +181,7 @@ <argument index="1" name="value" type="bool"> </argument> <description> + Sets an individual bit on the [member collision_mask]. </description> </method> <method name="world_to_map" qualifiers="const"> @@ -185,6 +190,8 @@ <argument index="0" name="pos" type="Vector3"> </argument> <description> + Returns the coordinates of the grid cell containing the given point. + [code]pos[/code] should be in the GridMap's local coordinate space. </description> </method> </methods> @@ -202,13 +209,19 @@ The size of each octant measured in number of cells. This applies to all three axis. </member> <member name="cell_scale" type="float" setter="set_cell_scale" getter="get_cell_scale" default="1.0"> + The scale of the cell items. + This does not affect the size of the grid cells themselves, only the items in them. This can be used to make cell items overlap their neighbors. </member> <member name="cell_size" type="Vector3" setter="set_cell_size" getter="get_cell_size" default="Vector3( 2, 2, 2 )"> The dimensions of the grid's cells. + This does not affect the size of the meshes. See [member cell_scale]. </member> <member name="collision_layer" type="int" setter="set_collision_layer" getter="get_collision_layer" default="1"> + The physics layers this GridMap is in. + GridMaps act as static bodies, meaning they aren't affected by gravity or other forces. They only affect other physics bodies that collide with them. </member> <member name="collision_mask" type="int" setter="set_collision_mask" getter="get_collision_mask" default="1"> + The physics layers this GridMap detects collisions in. </member> <member name="mesh_library" type="MeshLibrary" setter="set_mesh_library" getter="get_mesh_library"> The assigned [MeshLibrary]. @@ -222,6 +235,7 @@ <argument index="0" name="cell_size" type="Vector3"> </argument> <description> + Emitted when [member cell_size] changes. </description> </signal> </signals> diff --git a/modules/gridmap/grid_map.cpp b/modules/gridmap/grid_map.cpp index 47ac0de7f9..d69e60ced3 100644 --- a/modules/gridmap/grid_map.cpp +++ b/modules/gridmap/grid_map.cpp @@ -193,22 +193,6 @@ bool GridMap::get_collision_layer_bit(int p_bit) const { return get_collision_layer() & (1 << p_bit); } -#ifndef DISABLE_DEPRECATED -void GridMap::set_theme(const Ref<MeshLibrary> &p_theme) { - - WARN_DEPRECATED_MSG("GridMap.theme/set_theme() is deprecated and will be removed in a future version. Use GridMap.mesh_library/set_mesh_library() instead."); - - set_mesh_library(p_theme); -} - -Ref<MeshLibrary> GridMap::get_theme() const { - - WARN_DEPRECATED_MSG("GridMap.theme/get_theme() is deprecated and will be removed in a future version. Use GridMap.mesh_library/get_mesh_library() instead."); - - return get_mesh_library(); -} -#endif // DISABLE_DEPRECATED - void GridMap::set_mesh_library(const Ref<MeshLibrary> &p_mesh_library) { if (!mesh_library.is_null()) @@ -838,11 +822,6 @@ void GridMap::_bind_methods() { ClassDB::bind_method(D_METHOD("set_collision_layer_bit", "bit", "value"), &GridMap::set_collision_layer_bit); ClassDB::bind_method(D_METHOD("get_collision_layer_bit", "bit"), &GridMap::get_collision_layer_bit); -#ifndef DISABLE_DEPRECATED - ClassDB::bind_method(D_METHOD("set_theme", "theme"), &GridMap::set_theme); - ClassDB::bind_method(D_METHOD("get_theme"), &GridMap::get_theme); -#endif // DISABLE_DEPRECATED - ClassDB::bind_method(D_METHOD("set_mesh_library", "mesh_library"), &GridMap::set_mesh_library); ClassDB::bind_method(D_METHOD("get_mesh_library"), &GridMap::get_mesh_library); @@ -885,10 +864,6 @@ void GridMap::_bind_methods() { ClassDB::bind_method(D_METHOD("clear_baked_meshes"), &GridMap::clear_baked_meshes); ClassDB::bind_method(D_METHOD("make_baked_meshes", "gen_lightmap_uv", "lightmap_uv_texel_size"), &GridMap::make_baked_meshes, DEFVAL(false), DEFVAL(0.1)); -#ifndef DISABLE_DEPRECATED - ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "theme", PROPERTY_HINT_RESOURCE_TYPE, "MeshLibrary", 0), "set_theme", "get_theme"); -#endif // DISABLE_DEPRECATED - ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "mesh_library", PROPERTY_HINT_RESOURCE_TYPE, "MeshLibrary"), "set_mesh_library", "get_mesh_library"); ADD_GROUP("Cell", "cell_"); ADD_PROPERTY(PropertyInfo(Variant::VECTOR3, "cell_size"), "set_cell_size", "get_cell_size"); diff --git a/modules/gridmap/grid_map.h b/modules/gridmap/grid_map.h index f4407099f5..10c96956b7 100644 --- a/modules/gridmap/grid_map.h +++ b/modules/gridmap/grid_map.h @@ -227,11 +227,6 @@ public: void set_collision_mask_bit(int p_bit, bool p_value); bool get_collision_mask_bit(int p_bit) const; -#ifndef DISABLE_DEPRECATED - void set_theme(const Ref<MeshLibrary> &p_theme); - Ref<MeshLibrary> get_theme() const; -#endif // DISABLE_DEPRECATED - void set_mesh_library(const Ref<MeshLibrary> &p_mesh_library); Ref<MeshLibrary> get_mesh_library() const; diff --git a/modules/mono/SCsub b/modules/mono/SCsub index a9afa7ccf6..457edfaeed 100644 --- a/modules/mono/SCsub +++ b/modules/mono/SCsub @@ -42,14 +42,14 @@ mono_configure.configure(env, env_mono) if env_mono['tools'] and env_mono['mono_glue']: import build_scripts.api_solution_build as api_solution_build - api_solution_build.build(env_mono) + api_sln_cmd = api_solution_build.build(env_mono) # Build GodotTools if env_mono['tools']: import build_scripts.godot_tools_build as godot_tools_build if env_mono['mono_glue']: - godot_tools_build.build(env_mono) + godot_tools_build.build(env_mono, api_sln_cmd) else: # Building without the glue sources so the Godot API solution may be missing. # GodotTools depends on the Godot API solution. As such, we will only build diff --git a/modules/mono/build_scripts/api_solution_build.py b/modules/mono/build_scripts/api_solution_build.py index 1fe00a3028..be54d0a679 100644 --- a/modules/mono/build_scripts/api_solution_build.py +++ b/modules/mono/build_scripts/api_solution_build.py @@ -55,12 +55,22 @@ def build(env_mono): 'GodotSharpEditor.dll', 'GodotSharpEditor.pdb', 'GodotSharpEditor.xml' ] + depend_cmd = [] + for build_config in ['Debug', 'Release']: output_dir = Dir('#bin').abspath editor_api_dir = os.path.join(output_dir, 'GodotSharp', 'Api', build_config) targets = [os.path.join(editor_api_dir, filename) for filename in target_filenames] - cmd = env_mono.CommandNoCache(targets, [], build_api_solution, + cmd = env_mono.CommandNoCache(targets, depend_cmd, build_api_solution, module_dir=os.getcwd(), solution_build_config=build_config) env_mono.AlwaysBuild(cmd) + + # Make the Release build of the API solution depend on the Debug build. + # We do this in order to prevent SCons from building them in parallel, + # which can freak out MSBuild. In many cases, one of the builds would + # hang indefinitely requiring a key to be pressed for it to continue. + depend_cmd = cmd + + return depend_cmd diff --git a/modules/mono/build_scripts/godot_tools_build.py b/modules/mono/build_scripts/godot_tools_build.py index 35daa6d307..03aaa925f0 100644 --- a/modules/mono/build_scripts/godot_tools_build.py +++ b/modules/mono/build_scripts/godot_tools_build.py @@ -74,15 +74,11 @@ def build_godot_tools_project_editor(source, target, env): copy_target(str(scons_target)) -def build(env_mono): +def build(env_mono, api_sln_cmd): assert env_mono['tools'] output_dir = Dir('#bin').abspath editor_tools_dir = os.path.join(output_dir, 'GodotSharp', 'Tools') - editor_api_dir = os.path.join(output_dir, 'GodotSharp', 'Api', 'Debug') - - source_filenames = ['GodotSharp.dll', 'GodotSharpEditor.dll'] - sources = [os.path.join(editor_api_dir, filename) for filename in source_filenames] target_filenames = [ 'GodotTools.dll', 'GodotTools.IdeConnection.dll', 'GodotTools.BuildLogger.dll', @@ -97,7 +93,7 @@ def build(env_mono): targets = [os.path.join(editor_tools_dir, filename) for filename in target_filenames] - cmd = env_mono.CommandNoCache(targets, sources, build_godot_tools, module_dir=os.getcwd()) + cmd = env_mono.CommandNoCache(targets, api_sln_cmd, build_godot_tools, module_dir=os.getcwd()) env_mono.AlwaysBuild(cmd) diff --git a/modules/mono/build_scripts/mono_configure.py b/modules/mono/build_scripts/mono_configure.py index c5c8b9adbd..c09690ba6d 100644 --- a/modules/mono/build_scripts/mono_configure.py +++ b/modules/mono/build_scripts/mono_configure.py @@ -44,9 +44,33 @@ def copy_file(src_dir, dst_dir, name): copy(src_path, dst_dir) +def is_desktop(platform): + return platform in ['windows', 'osx', 'x11', 'server', 'uwp', 'haiku'] + + +def is_unix_like(platform): + return platform in ['osx', 'x11', 'server', 'android', 'haiku'] + + +def module_supports_tools_on(platform): + return platform not in ['android', 'javascript'] + + +def find_wasm_src_dir(mono_root): + hint_dirs = [ + os.path.join(mono_root, 'src'), + os.path.join(mono_root, '../src'), + ] + for hint_dir in hint_dirs: + if os.path.isfile(os.path.join(hint_dir, 'driver.c')): + return hint_dir + return '' + + def configure(env, env_mono): bits = env['bits'] is_android = env['platform'] == 'android' + is_javascript = env['platform'] == 'javascript' tools_enabled = env['tools'] mono_static = env['mono_static'] @@ -63,17 +87,21 @@ def configure(env, env_mono): env_mono.Append(CPPDEFINES=['NO_PENDING_EXCEPTIONS']) if is_android and not env['android_arch'] in android_arch_dirs: - raise RuntimeError('This module does not support for the specified \'android_arch\': ' + env['android_arch']) + raise RuntimeError('This module does not support the specified \'android_arch\': ' + env['android_arch']) - if is_android and tools_enabled: - # TODO: Implement this. We have to add the data directory to the apk, concretely the Api and Tools folders. - raise RuntimeError('This module does not currently support building for android with tools enabled') + if tools_enabled and not module_supports_tools_on(env['platform']): + # TODO: + # Android: We have to add the data directory to the apk, concretely the Api and Tools folders. + raise RuntimeError('This module does not currently support building for this platform with tools enabled') if is_android and mono_static: - # When static linking and doing something that requires libmono-native, we get a dlopen error as libmono-native seems to depend on libmonosgen-2.0 - raise RuntimeError('Linking Mono statically is not currently supported on Android') + # Android: When static linking and doing something that requires libmono-native, we get a dlopen error as libmono-native seems to depend on libmonosgen-2.0 + raise RuntimeError('Statically linking Mono is not currently supported on this platform') - if (os.getenv('MONO32_PREFIX') or os.getenv('MONO64_PREFIX')) and not mono_prefix: + if is_javascript: + mono_static = True + + if not mono_prefix and (os.getenv('MONO32_PREFIX') or os.getenv('MONO64_PREFIX')): print("WARNING: The environment variables 'MONO32_PREFIX' and 'MONO64_PREFIX' are deprecated; use the 'mono_prefix' SCons parameter instead") if env['platform'] == 'windows': @@ -92,9 +120,9 @@ def configure(env, env_mono): env.Append(LIBPATH=mono_lib_path) env_mono.Prepend(CPPPATH=os.path.join(mono_root, 'include', 'mono-2.0')) - if mono_static: - lib_suffix = Environment()['LIBSUFFIX'] + lib_suffix = Environment()['LIBSUFFIX'] + if mono_static: if env.msvc: mono_static_lib_name = 'libmono-static-sgen' else: @@ -116,13 +144,13 @@ def configure(env, env_mono): env.Append(LIBS=['psapi']) env.Append(LIBS=['version']) else: - mono_lib_name = find_file_in_dir(mono_lib_path, mono_lib_names, extension='.lib') + mono_lib_name = find_file_in_dir(mono_lib_path, mono_lib_names, extension=lib_suffix) if not mono_lib_name: raise RuntimeError('Could not find mono library in: ' + mono_lib_path) if env.msvc: - env.Append(LINKFLAGS=mono_lib_name + Environment()['LIBSUFFIX']) + env.Append(LINKFLAGS=mono_lib_name + lib_suffix) else: env.Append(LIBS=[mono_lib_name]) @@ -143,7 +171,7 @@ def configure(env, env_mono): mono_lib_path = '' mono_so_name = '' - if not mono_root and is_android: + if not mono_root and (is_android or is_javascript): raise RuntimeError("Mono installation directory not found; specify one manually with the 'mono_prefix' SCons parameter") if not mono_root and is_apple: @@ -167,7 +195,7 @@ def configure(env, env_mono): mono_lib_path = os.path.join(mono_root, 'lib') - env.Append(LIBPATH=mono_lib_path) + env.Append(LIBPATH=[mono_lib_path]) env_mono.Prepend(CPPPATH=os.path.join(mono_root, 'include', 'mono-2.0')) mono_lib = find_file_in_dir(mono_lib_path, mono_lib_names, prefix='lib', extension='.a') @@ -183,7 +211,30 @@ def configure(env, env_mono): if is_apple: env.Append(LINKFLAGS=['-Wl,-force_load,' + mono_lib_file]) else: + assert is_desktop(env['platform']) or is_android or is_javascript env.Append(LINKFLAGS=['-Wl,-whole-archive', mono_lib_file, '-Wl,-no-whole-archive']) + + if is_javascript: + env.Append(LIBS=['mono-icall-table', 'mono-native', 'mono-ilgen', 'mono-ee-interp']) + + wasm_src_dir = os.path.join(mono_root, 'src') + if not os.path.isdir(wasm_src_dir): + raise RuntimeError('Could not find mono wasm src directory') + + # Ideally this should be defined only for 'driver.c', but I can't fight scons for another 2 hours + env_mono.Append(CPPDEFINES=['CORE_BINDINGS']) + + env_mono.add_source_files(env.modules_sources, [ + os.path.join(wasm_src_dir, 'driver.c'), + os.path.join(wasm_src_dir, 'zlib-helper.c'), + os.path.join(wasm_src_dir, 'corebindings.c') + ]) + + env.Append(LINKFLAGS=[ + '--js-library', os.path.join(wasm_src_dir, 'library_mono.js'), + '--js-library', os.path.join(wasm_src_dir, 'binding_support.js'), + '--js-library', os.path.join(wasm_src_dir, 'dotnet_support.js') + ]) else: env.Append(LIBS=[mono_lib]) @@ -191,6 +242,8 @@ def configure(env, env_mono): env.Append(LIBS=['iconv', 'pthread']) elif is_android: pass # Nothing + elif is_javascript: + env.Append(LIBS=['m', 'rt', 'dl', 'pthread']) else: env.Append(LIBS=['m', 'rt', 'dl', 'pthread']) @@ -230,19 +283,22 @@ def configure(env, env_mono): env.Append(LINKFLAGS='-rdynamic') - if not tools_enabled and not is_android: - if not mono_root: - mono_root = subprocess.check_output(['pkg-config', 'mono-2', '--variable=prefix']).decode('utf8').strip() + if not tools_enabled: + if is_desktop(env['platform']): + if not mono_root: + mono_root = subprocess.check_output(['pkg-config', 'mono-2', '--variable=prefix']).decode('utf8').strip() - make_template_dir(env, mono_root) - elif not tools_enabled and is_android: - # Compress Android Mono Config - from . import make_android_mono_config - config_file_path = os.path.join(mono_root, 'etc', 'mono', 'config') - make_android_mono_config.generate_compressed_config(config_file_path, 'mono_gd/') + make_template_dir(env, mono_root) + elif is_android: + # Compress Android Mono Config + from . import make_android_mono_config + config_file_path = os.path.join(mono_root, 'etc', 'mono', 'config') + make_android_mono_config.generate_compressed_config(config_file_path, 'mono_gd/') - # Copy the required shared libraries - copy_mono_shared_libs(env, mono_root, None) + # Copy the required shared libraries + copy_mono_shared_libs(env, mono_root, None) + elif is_javascript: + pass # No data directory for this platform if copy_mono_root: if not mono_root: @@ -251,7 +307,7 @@ def configure(env, env_mono): if tools_enabled: copy_mono_root_files(env, mono_root) else: - print("Ignoring option: 'copy_mono_root'. Only available for builds with 'tools' enabled.") + print("Ignoring option: 'copy_mono_root'; only available for builds with 'tools' enabled.") def make_template_dir(env, mono_root): @@ -262,10 +318,9 @@ def make_template_dir(env, mono_root): template_dir_name = '' - if platform in ['windows', 'osx', 'x11', 'android', 'server']: - template_dir_name = 'data.mono.%s.%s.%s' % (platform, env['bits'], target) - else: - assert False + assert is_desktop(platform) + + template_dir_name = 'data.mono.%s.%s.%s' % (platform, env['bits'], target) output_dir = Dir('#bin').abspath template_dir = os.path.join(output_dir, template_dir_name) @@ -278,7 +333,7 @@ def make_template_dir(env, mono_root): # Copy etc/mono/ template_mono_config_dir = os.path.join(template_mono_root_dir, 'etc', 'mono') - copy_mono_etc_dir(mono_root, template_mono_config_dir, env['platform']) + copy_mono_etc_dir(mono_root, template_mono_config_dir, platform) # Copy the required shared libraries @@ -371,12 +426,19 @@ def copy_mono_shared_libs(env, mono_root, target_mono_root_dir): platform = env['platform'] if platform == 'windows': + src_mono_bin_dir = os.path.join(mono_root, 'bin') target_mono_bin_dir = os.path.join(target_mono_root_dir, 'bin') if not os.path.isdir(target_mono_bin_dir): os.makedirs(target_mono_bin_dir) - copy(os.path.join(mono_root, 'bin', 'MonoPosixHelper.dll'), target_mono_bin_dir) + mono_posix_helper_name = find_file_in_dir(src_mono_bin_dir, ['MonoPosixHelper', 'libMonoPosixHelper'], extension='.dll') + copy(os.path.join(src_mono_bin_dir, mono_posix_helper_name + '.dll'), os.path.join(target_mono_bin_dir, 'MonoPosixHelper.dll')) + + # For newer versions + btls_dll_path = os.path.join(src_mono_bin_dir, 'libmono-btls-shared.dll') + if os.path.isfile(btls_dll_path): + copy(btls_dll_path, target_mono_bin_dir) else: target_mono_lib_dir = get_android_out_dir(env) if platform == 'android' else os.path.join(target_mono_root_dir, 'lib') @@ -386,7 +448,7 @@ def copy_mono_shared_libs(env, mono_root, target_mono_root_dir): if platform == 'osx': # TODO: Make sure nothing is missing copy(os.path.join(mono_root, 'lib', 'libMonoPosixHelper.dylib'), target_mono_lib_dir) - elif platform == 'x11' or platform == 'android' or platform == 'server': + elif is_unix_like(platform): lib_file_names = [lib_name + '.so' for lib_name in [ 'libmono-btls-shared', 'libmono-ee-interp', 'libmono-native', 'libMonoPosixHelper', 'libmono-profiler-aot', 'libmono-profiler-coverage', 'libmono-profiler-log', 'libMonoSupportW' diff --git a/modules/mono/build_scripts/patches/fix-mono-android-tkill.diff b/modules/mono/build_scripts/patches/fix-mono-android-tkill.diff deleted file mode 100644 index 05f8dcadcc..0000000000 --- a/modules/mono/build_scripts/patches/fix-mono-android-tkill.diff +++ /dev/null @@ -1,70 +0,0 @@ -diff --git a/libgc/include/private/gcconfig.h b/libgc/include/private/gcconfig.h -index e2bdf13ac3e..f962200ba4e 100644 ---- a/libgc/include/private/gcconfig.h -+++ b/libgc/include/private/gcconfig.h -@@ -2255,6 +2255,14 @@ - # define GETPAGESIZE() getpagesize() - # endif - -+#if defined(HOST_ANDROID) && !(__ANDROID_API__ >= 23) \ -+ && ((defined(MIPS) && (CPP_WORDSZ == 32)) \ -+ || defined(ARM32) || defined(I386) /* but not x32 */) -+ /* tkill() exists only on arm32/mips(32)/x86. */ -+ /* NDK r11+ deprecates tkill() but keeps it for Mono clients. */ -+# define USE_TKILL_ON_ANDROID -+#endif -+ - # if defined(SUNOS5) || defined(DRSNX) || defined(UTS4) - /* OS has SVR4 generic features. Probably others also qualify. */ - # define SVR4 -diff --git a/libgc/pthread_stop_world.c b/libgc/pthread_stop_world.c -index f93ce26b562..4a49a6d578c 100644 ---- a/libgc/pthread_stop_world.c -+++ b/libgc/pthread_stop_world.c -@@ -336,7 +336,7 @@ void GC_push_all_stacks() - pthread_t GC_stopping_thread; - int GC_stopping_pid; - --#ifdef HOST_ANDROID -+#ifdef USE_TKILL_ON_ANDROID - static - int android_thread_kill(pid_t tid, int sig) - { -diff --git a/mono/metadata/threads.c b/mono/metadata/threads.c -index ad9b8823f8f..3542b32b540 100644 ---- a/mono/metadata/threads.c -+++ b/mono/metadata/threads.c -@@ -77,8 +77,12 @@ mono_native_thread_join_handle (HANDLE thread_handle, gboolean close_handle); - #include <zircon/syscalls.h> - #endif - --#if defined(HOST_ANDROID) && !defined(TARGET_ARM64) && !defined(TARGET_AMD64) --#define USE_TKILL_ON_ANDROID 1 -+#if defined(HOST_ANDROID) && !(__ANDROID_API__ >= 23) \ -+ && ((defined(MIPS) && (CPP_WORDSZ == 32)) \ -+ || defined(ARM32) || defined(I386) /* but not x32 */) -+ /* tkill() exists only on arm32/mips(32)/x86. */ -+ /* NDK r11+ deprecates tkill() but keeps it for Mono clients. */ -+# define USE_TKILL_ON_ANDROID - #endif - - #ifdef HOST_ANDROID -diff --git a/mono/utils/mono-threads-posix.c b/mono/utils/mono-threads-posix.c -index 3e4bf93de5f..79c9f731fe7 100644 ---- a/mono/utils/mono-threads-posix.c -+++ b/mono/utils/mono-threads-posix.c -@@ -31,8 +31,12 @@ - - #include <errno.h> - --#if defined(HOST_ANDROID) && !defined(TARGET_ARM64) && !defined(TARGET_AMD64) --#define USE_TKILL_ON_ANDROID 1 -+#if defined(HOST_ANDROID) && !(__ANDROID_API__ >= 23) \ -+ && ((defined(MIPS) && (CPP_WORDSZ == 32)) \ -+ || defined(ARM32) || defined(I386) /* but not x32 */) -+ /* tkill() exists only on arm32/mips(32)/x86. */ -+ /* NDK r11+ deprecates tkill() but keeps it for Mono clients. */ -+# define USE_TKILL_ON_ANDROID - #endif - - #ifdef USE_TKILL_ON_ANDROID diff --git a/modules/mono/config.py b/modules/mono/config.py index 9adf4ee6e5..70cb464c7a 100644 --- a/modules/mono/config.py +++ b/modules/mono/config.py @@ -1,10 +1,11 @@ def can_build(env, platform): - if platform in ['javascript']: - return False # Not yet supported return True def configure(env): + if env['platform'] not in ['windows', 'osx', 'x11', 'server', 'android', 'haiku', 'javascript']: + raise RuntimeError('This module does not currently support building for this platform') + env.use_ptrcall = True env.add_module_version_string('mono') @@ -18,6 +19,13 @@ def configure(env): envvars.Add(BoolVariable('xbuild_fallback', 'If MSBuild is not found, fallback to xbuild', False)) envvars.Update(env) + if env['platform'] == 'javascript': + # Mono wasm already has zlib builtin, so we need this workaround to avoid symbol collisions + print('Compiling with Mono wasm disables \'builtin_zlib\'') + env['builtin_zlib'] = False + thirdparty_zlib_dir = "#thirdparty/zlib/" + env.Prepend(CPPPATH=[thirdparty_zlib_dir]) + def get_doc_classes(): return [ diff --git a/modules/mono/csharp_script.cpp b/modules/mono/csharp_script.cpp index 83be10dee3..4536614379 100644 --- a/modules/mono/csharp_script.cpp +++ b/modules/mono/csharp_script.cpp @@ -50,8 +50,10 @@ #include "editor/editor_internal_calls.h" #include "godotsharp_dirs.h" +#include "mono_gd/gd_mono_cache.h" #include "mono_gd/gd_mono_class.h" #include "mono_gd/gd_mono_marshal.h" +#include "mono_gd/gd_mono_utils.h" #include "signal_awaiter_utils.h" #include "utils/macros.h" #include "utils/mutex_utils.h" @@ -126,12 +128,11 @@ void CSharpLanguage::init() { print_line("Run this binary with '--generate-mono-glue path/to/modules/mono/glue'"); #endif - gdmono->initialize_load_assemblies(); + if (gdmono->is_runtime_initialized()) + gdmono->initialize_load_assemblies(); #ifdef TOOLS_ENABLED EditorNode::add_init_callback(&_editor_init_callback); - - GLOBAL_DEF("mono/export/include_scripts_content", false); #endif } @@ -545,7 +546,7 @@ Vector<ScriptLanguage::StackInfo> CSharpLanguage::debug_get_current_stack_info() #ifdef DEBUG_ENABLED _TLS_RECURSION_GUARD_V_(Vector<StackInfo>()); - if (!gdmono->is_runtime_initialized() || !GDMono::get_singleton()->get_core_api_assembly() || !GDMonoUtils::mono_cache.corlib_cache_updated) + if (!gdmono->is_runtime_initialized() || !GDMono::get_singleton()->get_core_api_assembly() || !GDMonoCache::cached_data.corlib_cache_updated) return Vector<StackInfo>(); MonoObject *stack_trace = mono_object_new(mono_domain_get(), CACHED_CLASS(System_Diagnostics_StackTrace)->get_mono_ptr()); @@ -571,7 +572,7 @@ Vector<ScriptLanguage::StackInfo> CSharpLanguage::stack_trace_get_info(MonoObjec MonoException *exc = NULL; - MonoArray *frames = invoke_method_thunk(CACHED_METHOD_THUNK(System_Diagnostics_StackTrace, GetFrames), p_stack_trace, &exc); + MonoArray *frames = CACHED_METHOD_THUNK(System_Diagnostics_StackTrace, GetFrames).invoke(p_stack_trace, &exc); if (exc) { GDMonoUtils::debug_print_unhandled_exception(exc); @@ -583,8 +584,6 @@ Vector<ScriptLanguage::StackInfo> CSharpLanguage::stack_trace_get_info(MonoObjec if (frame_count <= 0) return Vector<StackInfo>(); - GDMonoUtils::DebugUtils_StackFrameInfo get_sf_info = CACHED_METHOD_THUNK(DebuggingUtils, GetStackFrameInfo); - Vector<StackInfo> si; si.resize(frame_count); @@ -595,7 +594,7 @@ Vector<ScriptLanguage::StackInfo> CSharpLanguage::stack_trace_get_info(MonoObjec MonoString *file_name; int file_line_num; MonoString *method_decl; - invoke_method_thunk(get_sf_info, frame, &file_name, &file_line_num, &method_decl, &exc); + CACHED_METHOD_THUNK(DebuggingUtils, GetStackFrameInfo).invoke(frame, &file_name, &file_line_num, &method_decl, &exc); if (exc) { GDMonoUtils::debug_print_unhandled_exception(exc); @@ -618,14 +617,14 @@ Vector<ScriptLanguage::StackInfo> CSharpLanguage::stack_trace_get_info(MonoObjec void CSharpLanguage::frame() { if (gdmono && gdmono->is_runtime_initialized() && gdmono->get_core_api_assembly() != NULL) { - const Ref<MonoGCHandle> &task_scheduler_handle = GDMonoUtils::mono_cache.task_scheduler_handle; + const Ref<MonoGCHandle> &task_scheduler_handle = GDMonoCache::cached_data.task_scheduler_handle; if (task_scheduler_handle.is_valid()) { MonoObject *task_scheduler = task_scheduler_handle->get_target(); if (task_scheduler) { MonoException *exc = NULL; - invoke_method_thunk(CACHED_METHOD_THUNK(GodotTaskScheduler, Activate), task_scheduler, &exc); + CACHED_METHOD_THUNK(GodotTaskScheduler, Activate).invoke(task_scheduler, &exc); if (exc) { GDMonoUtils::debug_unhandled_exception(exc); @@ -1079,7 +1078,7 @@ bool CSharpLanguage::overrides_external_editor() { void CSharpLanguage::thread_enter() { #if 0 - if (mono->is_runtime_initialized()) { + if (gdmono->is_runtime_initialized()) { GDMonoUtils::attach_current_thread(); } #endif @@ -1088,7 +1087,7 @@ void CSharpLanguage::thread_enter() { void CSharpLanguage::thread_exit() { #if 0 - if (mono->is_runtime_initialized()) { + if (gdmono->is_runtime_initialized()) { GDMonoUtils::detach_current_thread(); } #endif diff --git a/modules/mono/editor/GodotTools/GodotTools/Build/BuildSystem.cs b/modules/mono/editor/GodotTools/GodotTools/Build/BuildSystem.cs index 9a2b2e3a26..da90c960e5 100644 --- a/modules/mono/editor/GodotTools/GodotTools/Build/BuildSystem.cs +++ b/modules/mono/editor/GodotTools/GodotTools/Build/BuildSystem.cs @@ -44,7 +44,7 @@ namespace GodotTools.Build { get { - if (OS.IsWindows()) + if (OS.IsWindows) { return (BuildManager.BuildTool) EditorSettings.GetSetting("mono/builds/build_tool") == BuildManager.BuildTool.MsBuildMono; diff --git a/modules/mono/editor/GodotTools/GodotTools/Build/MsBuildFinder.cs b/modules/mono/editor/GodotTools/GodotTools/Build/MsBuildFinder.cs index eb2c2dd77c..ad8a6516ab 100644 --- a/modules/mono/editor/GodotTools/GodotTools/Build/MsBuildFinder.cs +++ b/modules/mono/editor/GodotTools/GodotTools/Build/MsBuildFinder.cs @@ -21,7 +21,7 @@ namespace GodotTools.Build var editorSettings = GodotSharpEditor.Instance.GetEditorInterface().GetEditorSettings(); var buildTool = (BuildManager.BuildTool) editorSettings.GetSetting("mono/builds/build_tool"); - if (OS.IsWindows()) + if (OS.IsWindows) { switch (buildTool) { @@ -59,7 +59,7 @@ namespace GodotTools.Build } } - if (OS.IsUnix()) + if (OS.IsUnixLike()) { if (buildTool == BuildManager.BuildTool.MsBuildMono) { @@ -91,7 +91,7 @@ namespace GodotTools.Build { var result = new List<string>(); - if (OS.IsOSX()) + if (OS.IsOSX) { result.Add("/Library/Frameworks/Mono.framework/Versions/Current/bin/"); result.Add("/usr/local/var/homebrew/linked/mono/bin/"); @@ -128,7 +128,7 @@ namespace GodotTools.Build private static string FindMsBuildToolsPathOnWindows() { - if (!OS.IsWindows()) + if (!OS.IsWindows) throw new PlatformNotSupportedException(); // Try to find 15.0 with vswhere diff --git a/modules/mono/editor/GodotTools/GodotTools/BuildManager.cs b/modules/mono/editor/GodotTools/GodotTools/BuildManager.cs index ab37d89955..217bf5c144 100644 --- a/modules/mono/editor/GodotTools/GodotTools/BuildManager.cs +++ b/modules/mono/editor/GodotTools/GodotTools/BuildManager.cs @@ -246,7 +246,7 @@ namespace GodotTools { // Build tool settings - EditorDef("mono/builds/build_tool", OS.IsWindows() ? BuildTool.MsBuildVs : BuildTool.MsBuildMono); + EditorDef("mono/builds/build_tool", OS.IsWindows ? BuildTool.MsBuildVs : BuildTool.MsBuildMono); var editorSettings = GodotSharpEditor.Instance.GetEditorInterface().GetEditorSettings(); @@ -255,7 +255,7 @@ namespace GodotTools ["type"] = Godot.Variant.Type.Int, ["name"] = "mono/builds/build_tool", ["hint"] = Godot.PropertyHint.Enum, - ["hint_string"] = OS.IsWindows() ? + ["hint_string"] = OS.IsWindows ? $"{PropNameMsbuildMono},{PropNameMsbuildVs}" : $"{PropNameMsbuildMono}" }); diff --git a/modules/mono/editor/GodotTools/GodotTools/Export/ExportPlugin.cs b/modules/mono/editor/GodotTools/GodotTools/Export/ExportPlugin.cs new file mode 100644 index 0000000000..aed25f5ac5 --- /dev/null +++ b/modules/mono/editor/GodotTools/GodotTools/Export/ExportPlugin.cs @@ -0,0 +1,633 @@ +using Godot; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Runtime.CompilerServices; +using GodotTools.Core; +using GodotTools.Internals; +using static GodotTools.Internals.Globals; +using Directory = GodotTools.Utils.Directory; +using File = GodotTools.Utils.File; +using OS = GodotTools.Utils.OS; +using Path = System.IO.Path; + +namespace GodotTools.Export +{ + public class ExportPlugin : EditorExportPlugin + { + public void RegisterExportSettings() + { + // TODO: These would be better as export preset options, but that doesn't seem to be supported yet + + GlobalDef("mono/export/include_scripts_content", false); + GlobalDef("mono/export/export_assemblies_inside_pck", true); + + GlobalDef("mono/export/aot/enabled", false); + GlobalDef("mono/export/aot/full_aot", false); + + // --aot or --aot=opt1,opt2 (use 'mono --aot=help AuxAssembly.dll' to list AOT options) + GlobalDef("mono/export/aot/extra_aot_options", new string[] { }); + // --optimize/-O=opt1,opt2 (use 'mono --list-opt'' to list optimize options) + GlobalDef("mono/export/aot/extra_optimizer_options", new string[] { }); + + GlobalDef("mono/export/aot/android_toolchain_path", ""); + } + + private string maybeLastExportError; + + private void AddFile(string srcPath, string dstPath, bool remap = false) + { + AddFile(dstPath, File.ReadAllBytes(srcPath), remap); + } + + public override void _ExportFile(string path, string type, string[] features) + { + base._ExportFile(path, type, features); + + if (type != Internal.CSharpLanguageType) + return; + + if (Path.GetExtension(path) != $".{Internal.CSharpLanguageExtension}") + throw new ArgumentException($"Resource of type {Internal.CSharpLanguageType} has an invalid file extension: {path}", nameof(path)); + + // TODO What if the source file is not part of the game's C# project + + bool includeScriptsContent = (bool) ProjectSettings.GetSetting("mono/export/include_scripts_content"); + + if (!includeScriptsContent) + { + // We don't want to include the source code on exported games. + + // Sadly, Godot prints errors when adding an empty file (nothing goes wrong, it's just noise). + // Because of this, we add a file which contains a line break. + AddFile(path, System.Text.Encoding.UTF8.GetBytes("\n"), remap: false); + Skip(); + } + } + + public override void _ExportBegin(string[] features, bool isDebug, string path, int flags) + { + base._ExportBegin(features, isDebug, path, flags); + + try + { + _ExportBeginImpl(features, isDebug, path, flags); + } + catch (Exception e) + { + maybeLastExportError = e.Message; + GD.PushError($"Failed to export project: {e.Message}"); + Console.Error.WriteLine(e); + // TODO: Do something on error once _ExportBegin supports failing. + } + } + + private void _ExportBeginImpl(string[] features, bool isDebug, string path, int flags) + { + if (!File.Exists(GodotSharpDirs.ProjectSlnPath)) + return; + + string platform = DeterminePlatformFromFeatures(features); + + if (platform == null) + throw new NotSupportedException("Target platform not supported"); + + string outputDir = new FileInfo(path).Directory?.FullName ?? + throw new FileNotFoundException("Base directory not found"); + + string buildConfig = isDebug ? "Debug" : "Release"; + + string scriptsMetadataPath = Path.Combine(GodotSharpDirs.ResMetadataDir, $"scripts_metadata.{(isDebug ? "debug" : "release")}"); + CsProjOperations.GenerateScriptsMetadata(GodotSharpDirs.ProjectCsProjPath, scriptsMetadataPath); + + AddFile(scriptsMetadataPath, scriptsMetadataPath); + + // Turn export features into defines + var godotDefines = features; + + if (!BuildManager.BuildProjectBlocking(buildConfig, godotDefines)) + throw new Exception("Failed to build project"); + + // Add dependency assemblies + + var dependencies = new Godot.Collections.Dictionary<string, string>(); + + var projectDllName = (string) ProjectSettings.GetSetting("application/config/name"); + if (projectDllName.Empty()) + { + projectDllName = "UnnamedProject"; + } + + string projectDllSrcDir = Path.Combine(GodotSharpDirs.ResTempAssembliesBaseDir, buildConfig); + string projectDllSrcPath = Path.Combine(projectDllSrcDir, $"{projectDllName}.dll"); + + dependencies[projectDllName] = projectDllSrcPath; + + { + string platformBclDir = DeterminePlatformBclDir(platform); + + internal_GetExportedAssemblyDependencies(projectDllName, projectDllSrcPath, buildConfig, platformBclDir, dependencies); + } + + string outputDataDir = null; + + if (PlatformHasTemplateDir(platform)) + outputDataDir = ExportDataDirectory(features, platform, isDebug, outputDir); + + string apiConfig = isDebug ? "Debug" : "Release"; + string resAssembliesDir = Path.Combine(GodotSharpDirs.ResAssembliesBaseDir, apiConfig); + + bool assembliesInsidePck = (bool) ProjectSettings.GetSetting("mono/export/export_assemblies_inside_pck") || outputDataDir == null; + + if (!assembliesInsidePck) + { + string outputDataGameAssembliesDir = Path.Combine(outputDataDir, "Assemblies"); + if (!Directory.Exists(outputDataGameAssembliesDir)) + Directory.CreateDirectory(outputDataGameAssembliesDir); + } + + foreach (var dependency in dependencies) + { + string dependSrcPath = dependency.Value; + + if (assembliesInsidePck) + { + string dependDstPath = Path.Combine(resAssembliesDir, dependSrcPath.GetFile()); + AddFile(dependSrcPath, dependDstPath); + } + else + { + string dependDstPath = Path.Combine(outputDataDir, "Assemblies", dependSrcPath.GetFile()); + File.Copy(dependSrcPath, dependDstPath); + } + } + + // AOT + + if ((bool) ProjectSettings.GetSetting("mono/export/aot/enabled")) + { + AotCompileDependencies(features, platform, isDebug, outputDir, outputDataDir, dependencies); + } + } + + public override void _ExportEnd() + { + base._ExportEnd(); + + string aotTempDir = Path.Combine(Path.GetTempPath(), $"godot-aot-{Process.GetCurrentProcess().Id}"); + + if (Directory.Exists(aotTempDir)) + Directory.Delete(aotTempDir, recursive: true); + + // TODO: Just a workaround until the export plugins can be made to abort with errors + if (!string.IsNullOrEmpty(maybeLastExportError)) // Check empty as well, because it's set to empty after hot-reloading + { + string lastExportError = maybeLastExportError; + maybeLastExportError = null; + + GodotSharpEditor.Instance.ShowErrorDialog(lastExportError, "Failed to export C# project"); + } + } + + private static string ExportDataDirectory(string[] features, string platform, bool isDebug, string outputDir) + { + string target = isDebug ? "release_debug" : "release"; + + // NOTE: Bits is ok for now as all platforms with a data directory have it, but that may change in the future. + string bits = features.Contains("64") ? "64" : "32"; + + string TemplateDirName() => $"data.mono.{platform}.{bits}.{target}"; + + string templateDirPath = Path.Combine(Internal.FullTemplatesDir, TemplateDirName()); + + if (!Directory.Exists(templateDirPath)) + { + templateDirPath = null; + + if (isDebug) + { + target = "debug"; // Support both 'release_debug' and 'debug' for the template data directory name + templateDirPath = Path.Combine(Internal.FullTemplatesDir, TemplateDirName()); + + if (!Directory.Exists(templateDirPath)) + templateDirPath = null; + } + } + + if (templateDirPath == null) + throw new FileNotFoundException("Data template directory not found"); + + string outputDataDir = Path.Combine(outputDir, DataDirName); + + if (Directory.Exists(outputDataDir)) + Directory.Delete(outputDataDir, recursive: true); // Clean first + + Directory.CreateDirectory(outputDataDir); + + foreach (string dir in Directory.GetDirectories(templateDirPath, "*", SearchOption.AllDirectories)) + { + Directory.CreateDirectory(Path.Combine(outputDataDir, dir.Substring(templateDirPath.Length + 1))); + } + + foreach (string file in Directory.GetFiles(templateDirPath, "*", SearchOption.AllDirectories)) + { + File.Copy(file, Path.Combine(outputDataDir, file.Substring(templateDirPath.Length + 1))); + } + + return outputDataDir; + } + + private void AotCompileDependencies(string[] features, string platform, bool isDebug, string outputDir, string outputDataDir, IDictionary<string, string> dependencies) + { + // TODO: WASM + + string bclDir = DeterminePlatformBclDir(platform) ?? typeof(object).Assembly.Location.GetBaseDir(); + + string aotTempDir = Path.Combine(Path.GetTempPath(), $"godot-aot-{Process.GetCurrentProcess().Id}"); + + if (!Directory.Exists(aotTempDir)) + Directory.CreateDirectory(aotTempDir); + + var assemblies = new Dictionary<string, string>(); + + foreach (var dependency in dependencies) + { + string assemblyName = dependency.Key; + string assemblyPath = dependency.Value; + + string assemblyPathInBcl = Path.Combine(bclDir, assemblyName + ".dll"); + + if (File.Exists(assemblyPathInBcl)) + { + // Don't create teporaries for assemblies from the BCL + assemblies.Add(assemblyName, assemblyPathInBcl); + } + else + { + string tempAssemblyPath = Path.Combine(aotTempDir, assemblyName + ".dll"); + File.Copy(assemblyPath, tempAssemblyPath); + assemblies.Add(assemblyName, tempAssemblyPath); + } + } + + foreach (var assembly in assemblies) + { + string assemblyName = assembly.Key; + string assemblyPath = assembly.Value; + + string sharedLibExtension = platform == OS.Platforms.Windows ? ".dll" : + platform == OS.Platforms.OSX ? ".dylib" : + platform == OS.Platforms.HTML5 ? ".wasm" : + ".so"; + + string outputFileName = assemblyName + ".dll" + sharedLibExtension; + + if (platform == OS.Platforms.Android) + { + // Not sure if the 'lib' prefix is an Android thing or just Godot being picky, + // but we use '-aot-' as well just in case to avoid conflicts with other libs. + outputFileName = "lib-aot-" + outputFileName; + } + + string outputFilePath = null; + string tempOutputFilePath; + + switch (platform) + { + case OS.Platforms.OSX: + tempOutputFilePath = Path.Combine(aotTempDir, outputFileName); + break; + case OS.Platforms.Android: + tempOutputFilePath = Path.Combine(aotTempDir, "%%ANDROID_ABI%%", outputFileName); + break; + case OS.Platforms.HTML5: + tempOutputFilePath = Path.Combine(aotTempDir, outputFileName); + outputFilePath = Path.Combine(outputDir, outputFileName); + break; + default: + tempOutputFilePath = Path.Combine(aotTempDir, outputFileName); + outputFilePath = Path.Combine(outputDataDir, "Mono", platform == OS.Platforms.Windows ? "bin" : "lib", outputFileName); + break; + } + + var data = new Dictionary<string, string>(); + var enabledAndroidAbis = platform == OS.Platforms.Android ? GetEnabledAndroidAbis(features).ToArray() : null; + + if (platform == OS.Platforms.Android) + { + Debug.Assert(enabledAndroidAbis != null); + + foreach (var abi in enabledAndroidAbis) + { + data["abi"] = abi; + var outputFilePathForThisAbi = tempOutputFilePath.Replace("%%ANDROID_ABI%%", abi); + + AotCompileAssembly(platform, isDebug, data, assemblyPath, outputFilePathForThisAbi); + + AddSharedObject(outputFilePathForThisAbi, tags: new[] {abi}); + } + } + else + { + string bits = features.Contains("64") ? "64" : features.Contains("64") ? "32" : null; + + if (bits != null) + data["bits"] = bits; + + AotCompileAssembly(platform, isDebug, data, assemblyPath, tempOutputFilePath); + + if (platform == OS.Platforms.OSX) + { + AddSharedObject(tempOutputFilePath, tags: null); + } + else + { + Debug.Assert(outputFilePath != null); + File.Copy(tempOutputFilePath, outputFilePath); + } + } + } + } + + private static void AotCompileAssembly(string platform, bool isDebug, Dictionary<string, string> data, string assemblyPath, string outputFilePath) + { + // Make sure the output directory exists + Directory.CreateDirectory(outputFilePath.GetBaseDir()); + + string exeExt = OS.IsWindows ? ".exe" : string.Empty; + + string monoCrossDirName = DetermineMonoCrossDirName(platform, data); + string monoCrossRoot = Path.Combine(GodotSharpDirs.DataEditorToolsDir, "aot-compilers", monoCrossDirName); + string monoCrossBin = Path.Combine(monoCrossRoot, "bin"); + + string toolPrefix = DetermineToolPrefix(monoCrossBin); + string monoExeName = System.IO.File.Exists(Path.Combine(monoCrossBin, $"{toolPrefix}mono{exeExt}")) ? "mono" : "mono-sgen"; + + string compilerCommand = Path.Combine(monoCrossBin, $"{toolPrefix}{monoExeName}{exeExt}"); + + bool fullAot = (bool) ProjectSettings.GetSetting("mono/export/aot/full_aot"); + + string EscapeOption(string option) => option.Contains(',') ? $"\"{option}\"" : option; + string OptionsToString(IEnumerable<string> options) => string.Join(",", options.Select(EscapeOption)); + + var aotOptions = new List<string>(); + var optimizerOptions = new List<string>(); + + if (fullAot) + aotOptions.Add("full"); + + aotOptions.Add(isDebug ? "soft-debug" : "nodebug"); + + if (platform == OS.Platforms.Android) + { + string abi = data["abi"]; + + string androidToolchain = (string) ProjectSettings.GetSetting("mono/export/aot/android_toolchain_path"); + + if (string.IsNullOrEmpty(androidToolchain)) + { + androidToolchain = Path.Combine(GodotSharpDirs.DataEditorToolsDir, "android-toolchains", $"{abi}"); // TODO: $"{abi}-{apiLevel}{(clang?"clang":"")}" + + if (!Directory.Exists(androidToolchain)) + throw new FileNotFoundException("Missing android toolchain. Specify one in the AOT export settings."); + } + else if (!Directory.Exists(androidToolchain)) + { + throw new FileNotFoundException("Android toolchain not found: " + androidToolchain); + } + + var androidToolPrefixes = new Dictionary<string, string> + { + ["armeabi-v7a"] = "arm-linux-androideabi-", + ["arm64-v8a"] = "aarch64-linux-android-", + ["x86"] = "i686-linux-android-", + ["x86_64"] = "x86_64-linux-android-" + }; + + aotOptions.Add("tool-prefix=" + Path.Combine(androidToolchain, "bin", androidToolPrefixes[abi])); + + string triple = GetAndroidTriple(abi); + aotOptions.Add ($"mtriple={triple}"); + } + + aotOptions.Add($"outfile={outputFilePath}"); + + var extraAotOptions = (string[]) ProjectSettings.GetSetting("mono/export/aot/extra_aot_options"); + var extraOptimizerOptions = (string[]) ProjectSettings.GetSetting("mono/export/aot/extra_optimizer_options"); + + if (extraAotOptions.Length > 0) + aotOptions.AddRange(extraAotOptions); + + if (extraOptimizerOptions.Length > 0) + optimizerOptions.AddRange(extraOptimizerOptions); + + var compilerArgs = new List<string>(); + + if (isDebug) + compilerArgs.Add("--debug"); // Required for --aot=soft-debug + + compilerArgs.Add(aotOptions.Count > 0 ? $"--aot={OptionsToString(aotOptions)}" : "--aot"); + + if (optimizerOptions.Count > 0) + compilerArgs.Add($"-O={OptionsToString(optimizerOptions)}"); + + compilerArgs.Add(ProjectSettings.GlobalizePath(assemblyPath)); + + // TODO: Once we move to .NET Standard 2.1 we can use ProcessStartInfo.ArgumentList instead + string CmdLineArgsToString(IEnumerable<string> args) + { + // Not perfect, but as long as we are careful... + return string.Join(" ", args.Select(arg => arg.Contains(" ") ? $@"""{arg}""" : arg)); + } + + using (var process = new Process()) + { + process.StartInfo = new ProcessStartInfo(compilerCommand, CmdLineArgsToString(compilerArgs)) + { + UseShellExecute = false + }; + + string platformBclDir = DeterminePlatformBclDir(platform); + process.StartInfo.EnvironmentVariables.Add("MONO_PATH", string.IsNullOrEmpty(platformBclDir) ? + typeof(object).Assembly.Location.GetBaseDir() : + platformBclDir); + + Console.WriteLine($"Running: \"{process.StartInfo.FileName}\" {process.StartInfo.Arguments}"); + + if (!process.Start()) + throw new Exception("Failed to start process for Mono AOT compiler"); + + process.WaitForExit(); + + if (process.ExitCode != 0) + throw new Exception($"Mono AOT compiler exited with error code: {process.ExitCode}"); + + if (!System.IO.File.Exists(outputFilePath)) + throw new Exception("Mono AOT compiler finished successfully but the output file is missing"); + } + } + + private static string DetermineMonoCrossDirName(string platform, IReadOnlyDictionary<string, string> data) + { + switch (platform) + { + case OS.Platforms.Windows: + case OS.Platforms.UWP: + { + string arch = data["bits"] == "64" ? "x86_64" : "i686"; + return $"windows-{arch}"; + } + case OS.Platforms.OSX: + { + string arch = "x86_64"; + return $"{platform}-{arch}"; + } + case OS.Platforms.X11: + case OS.Platforms.Server: + { + string arch = data["bits"] == "64" ? "x86_64" : "i686"; + return $"linux-{arch}"; + } + case OS.Platforms.Haiku: + { + string arch = data["bits"] == "64" ? "x86_64" : "i686"; + return $"{platform}-{arch}"; + } + case OS.Platforms.Android: + { + string abi = data["abi"]; + return $"{platform}-{abi}"; + } + case OS.Platforms.HTML5: + return "wasm-wasm32"; + default: + throw new NotSupportedException(); + } + } + + private static string DetermineToolPrefix(string monoCrossBin) + { + string exeExt = OS.IsWindows ? ".exe" : string.Empty; + + if (System.IO.File.Exists(Path.Combine(monoCrossBin, $"mono{exeExt}"))) + return string.Empty; + + if (System.IO.File.Exists(Path.Combine(monoCrossBin, $"mono-sgen{exeExt}" + exeExt))) + return string.Empty; + + var files = new DirectoryInfo(monoCrossBin).GetFiles($"*mono{exeExt}" + exeExt, SearchOption.TopDirectoryOnly); + if (files.Length > 0) + { + string fileName = files[0].Name; + return fileName.Substring(0, fileName.Length - $"mono{exeExt}".Length); + } + + files = new DirectoryInfo(monoCrossBin).GetFiles($"*mono-sgen{exeExt}" + exeExt, SearchOption.TopDirectoryOnly); + if (files.Length > 0) + { + string fileName = files[0].Name; + return fileName.Substring(0, fileName.Length - $"mono-sgen{exeExt}".Length); + } + + throw new FileNotFoundException($"Cannot find the mono runtime executable in {monoCrossBin}"); + } + + private static IEnumerable<string> GetEnabledAndroidAbis(string[] features) + { + var androidAbis = new[] + { + "armeabi-v7a", + "arm64-v8a", + "x86", + "x86_64" + }; + + return androidAbis.Where(features.Contains); + } + + private static string GetAndroidTriple(string abi) + { + var abiArchs = new Dictionary<string, string> + { + ["armeabi-v7a"] = "armv7", + ["arm64-v8a"] = "aarch64-v8a", + ["x86"] = "i686", + ["x86_64"] = "x86_64" + }; + + string arch = abiArchs[abi]; + + return $"{arch}-linux-android"; + } + + private static bool PlatformHasTemplateDir(string platform) + { + // OSX export templates are contained in a zip, so we place our custom template inside it and let Godot do the rest. + return !new[] {OS.Platforms.OSX, OS.Platforms.Android, OS.Platforms.HTML5}.Contains(platform); + } + + private static string DeterminePlatformFromFeatures(IEnumerable<string> features) + { + foreach (var feature in features) + { + if (OS.PlatformNameMap.TryGetValue(feature, out string platform)) + return platform; + } + + return null; + } + + private static string DeterminePlatformBclDir(string platform) + { + string templatesDir = Internal.FullTemplatesDir; + string platformBclDir = Path.Combine(templatesDir, "bcl", platform); + + if (!File.Exists(Path.Combine(platformBclDir, "mscorlib.dll"))) + { + string profile = DeterminePlatformBclProfile(platform); + platformBclDir = Path.Combine(templatesDir, "bcl", profile); + + if (!File.Exists(Path.Combine(platformBclDir, "mscorlib.dll"))) + platformBclDir = null; // Use the one we're running on + } + + return platformBclDir; + } + + private static string DeterminePlatformBclProfile(string platform) + { + switch (platform) + { + case OS.Platforms.Windows: + case OS.Platforms.UWP: + case OS.Platforms.OSX: + case OS.Platforms.X11: + case OS.Platforms.Server: + case OS.Platforms.Haiku: + return "net_4_x"; + case OS.Platforms.Android: + return "monodroid"; + case OS.Platforms.HTML5: + return "wasm"; + default: + throw new NotSupportedException(); + } + } + + private static string DataDirName + { + get + { + var appName = (string) ProjectSettings.GetSetting("application/config/name"); + string appNameSafe = appName.ToSafeDirName(allowDirSeparator: false); + return $"data_{appNameSafe}"; + } + } + + [MethodImpl(MethodImplOptions.InternalCall)] + private static extern void internal_GetExportedAssemblyDependencies(string projectDllName, string projectDllSrcPath, + string buildConfig, string customBclDir, Godot.Collections.Dictionary<string, string> dependencies); + } +} diff --git a/modules/mono/editor/GodotTools/GodotTools/GodotSharpEditor.cs b/modules/mono/editor/GodotTools/GodotTools/GodotSharpEditor.cs index 12edd651df..2a5d3de126 100644 --- a/modules/mono/editor/GodotTools/GodotTools/GodotSharpEditor.cs +++ b/modules/mono/editor/GodotTools/GodotTools/GodotSharpEditor.cs @@ -1,4 +1,5 @@ using Godot; +using GodotTools.Export; using GodotTools.Utils; using System; using System.Collections.Generic; @@ -225,7 +226,7 @@ namespace GodotTools bool osxAppBundleInstalled = false; - if (OS.IsOSX()) + if (OS.IsOSX) { // The package path is '/Applications/Visual Studio Code.app' const string vscodeBundleId = "com.microsoft.VSCode"; @@ -265,7 +266,7 @@ namespace GodotTools string command; - if (OS.IsOSX()) + if (OS.IsOSX) { if (!osxAppBundleInstalled && _vsCodePath.Empty()) { @@ -415,18 +416,18 @@ namespace GodotTools string settingsHintStr = "Disabled"; - if (OS.IsWindows()) + if (OS.IsWindows) { settingsHintStr += $",MonoDevelop:{(int) ExternalEditorId.MonoDevelop}" + $",Visual Studio Code:{(int) ExternalEditorId.VsCode}"; } - else if (OS.IsOSX()) + else if (OS.IsOSX) { settingsHintStr += $",Visual Studio:{(int) ExternalEditorId.VisualStudioForMac}" + $",MonoDevelop:{(int) ExternalEditorId.MonoDevelop}" + $",Visual Studio Code:{(int) ExternalEditorId.VsCode}"; } - else if (OS.IsUnix()) + else if (OS.IsUnixLike()) { settingsHintStr += $",MonoDevelop:{(int) ExternalEditorId.MonoDevelop}" + $",Visual Studio Code:{(int) ExternalEditorId.VsCode}"; @@ -441,8 +442,9 @@ namespace GodotTools }); // Export plugin - var exportPlugin = new GodotSharpExport(); + var exportPlugin = new ExportPlugin(); AddExportPlugin(exportPlugin); + exportPlugin.RegisterExportSettings(); exportPluginWeak = WeakRef(exportPlugin); BuildManager.Initialize(); @@ -461,7 +463,7 @@ namespace GodotTools // Otherwise, if the GC disposes it at a later time, EditorExportPlatformAndroid // will be freed after EditorSettings already was, and its device polling thread // will try to access the EditorSettings singleton, resulting in null dereferencing. - (exportPluginWeak.GetRef() as GodotSharpExport)?.Dispose(); + (exportPluginWeak.GetRef() as ExportPlugin)?.Dispose(); exportPluginWeak.Dispose(); } diff --git a/modules/mono/editor/GodotTools/GodotTools/GodotSharpExport.cs b/modules/mono/editor/GodotTools/GodotTools/GodotSharpExport.cs deleted file mode 100644 index 4f93ef8530..0000000000 --- a/modules/mono/editor/GodotTools/GodotTools/GodotSharpExport.cs +++ /dev/null @@ -1,197 +0,0 @@ -using Godot; -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Runtime.CompilerServices; -using GodotTools.Core; -using GodotTools.Internals; -using Directory = GodotTools.Utils.Directory; -using File = GodotTools.Utils.File; -using Path = System.IO.Path; - -namespace GodotTools -{ - public class GodotSharpExport : EditorExportPlugin - { - private void AddFile(string srcPath, string dstPath, bool remap = false) - { - AddFile(dstPath.Replace("\\", "/"), File.ReadAllBytes(srcPath), remap); - } - - public override void _ExportFile(string path, string type, string[] features) - { - base._ExportFile(path, type, features); - - if (type != Internal.CSharpLanguageType) - return; - - if (Path.GetExtension(path) != $".{Internal.CSharpLanguageExtension}") - throw new ArgumentException($"Resource of type {Internal.CSharpLanguageType} has an invalid file extension: {path}", nameof(path)); - - // TODO What if the source file is not part of the game's C# project - - bool includeScriptsContent = (bool) ProjectSettings.GetSetting("mono/export/include_scripts_content"); - - if (!includeScriptsContent) - { - // We don't want to include the source code on exported games - AddFile(path, new byte[] { }, remap: false); - Skip(); - } - } - - public override void _ExportBegin(string[] features, bool isDebug, string path, int flags) - { - base._ExportBegin(features, isDebug, path, flags); - - try - { - _ExportBeginImpl(features, isDebug, path, flags); - } - catch (Exception e) - { - GD.PushError($"Failed to export project. Exception message: {e.Message}"); - Console.Error.WriteLine(e); - } - } - - public void _ExportBeginImpl(string[] features, bool isDebug, string path, int flags) - { - // TODO Right now there is no way to stop the export process with an error - - if (File.Exists(GodotSharpDirs.ProjectSlnPath)) - { - string buildConfig = isDebug ? "Debug" : "Release"; - - string scriptsMetadataPath = Path.Combine(GodotSharpDirs.ResMetadataDir, $"scripts_metadata.{(isDebug ? "debug" : "release")}"); - CsProjOperations.GenerateScriptsMetadata(GodotSharpDirs.ProjectCsProjPath, scriptsMetadataPath); - - AddFile(scriptsMetadataPath, scriptsMetadataPath); - - // Turn export features into defines - var godotDefines = features; - - if (!BuildManager.BuildProjectBlocking(buildConfig, godotDefines)) - { - GD.PushError("Failed to build project"); - return; - } - - // Add dependency assemblies - - var dependencies = new Godot.Collections.Dictionary<string, string>(); - - var projectDllName = (string) ProjectSettings.GetSetting("application/config/name"); - if (projectDllName.Empty()) - { - projectDllName = "UnnamedProject"; - } - - string projectDllSrcDir = Path.Combine(GodotSharpDirs.ResTempAssembliesBaseDir, buildConfig); - string projectDllSrcPath = Path.Combine(projectDllSrcDir, $"{projectDllName}.dll"); - - dependencies[projectDllName] = projectDllSrcPath; - - { - string templatesDir = Internal.FullTemplatesDir; - string androidBclDir = Path.Combine(templatesDir, "android-bcl"); - - string customLibDir = features.Contains("Android") && Directory.Exists(androidBclDir) ? androidBclDir : string.Empty; - - GetExportedAssemblyDependencies(projectDllName, projectDllSrcPath, buildConfig, customLibDir, dependencies); - } - - string apiConfig = isDebug ? "Debug" : "Release"; - string resAssembliesDir = Path.Combine(GodotSharpDirs.ResAssembliesBaseDir, apiConfig); - - foreach (var dependency in dependencies) - { - string dependSrcPath = dependency.Value; - string dependDstPath = Path.Combine(resAssembliesDir, dependSrcPath.GetFile()); - AddFile(dependSrcPath, dependDstPath); - } - } - - // Mono specific export template extras (data dir) - ExportDataDirectory(features, isDebug, path); - } - - private static void ExportDataDirectory(IEnumerable<string> features, bool debug, string path) - { - var featureSet = new HashSet<string>(features); - - if (!PlatformHasTemplateDir(featureSet)) - return; - - string templateDirName = "data.mono"; - - if (featureSet.Contains("Windows")) - { - templateDirName += ".windows"; - templateDirName += featureSet.Contains("64") ? ".64" : ".32"; - } - else if (featureSet.Contains("X11")) - { - templateDirName += ".x11"; - templateDirName += featureSet.Contains("64") ? ".64" : ".32"; - } - else - { - throw new NotSupportedException("Target platform not supported"); - } - - templateDirName += debug ? ".release_debug" : ".release"; - - string templateDirPath = Path.Combine(Internal.FullTemplatesDir, templateDirName); - - if (!Directory.Exists(templateDirPath)) - throw new FileNotFoundException("Data template directory not found"); - - string outputDir = new FileInfo(path).Directory?.FullName ?? - throw new FileNotFoundException("Base directory not found"); - - string outputDataDir = Path.Combine(outputDir, DataDirName); - - if (Directory.Exists(outputDataDir)) - Directory.Delete(outputDataDir, recursive: true); // Clean first - - Directory.CreateDirectory(outputDataDir); - - foreach (string dir in Directory.GetDirectories(templateDirPath, "*", SearchOption.AllDirectories)) - { - Directory.CreateDirectory(Path.Combine(outputDataDir, dir.Substring(templateDirPath.Length + 1))); - } - - foreach (string file in Directory.GetFiles(templateDirPath, "*", SearchOption.AllDirectories)) - { - File.Copy(file, Path.Combine(outputDataDir, file.Substring(templateDirPath.Length + 1))); - } - } - - private static bool PlatformHasTemplateDir(IEnumerable<string> featureSet) - { - // OSX export templates are contained in a zip, so we place - // our custom template inside it and let Godot do the rest. - return !featureSet.Any(f => new[] {"OSX", "Android"}.Contains(f)); - } - - private static string DataDirName - { - get - { - var appName = (string) ProjectSettings.GetSetting("application/config/name"); - string appNameSafe = appName.ToSafeDirName(allowDirSeparator: false); - return $"data_{appNameSafe}"; - } - } - - private static void GetExportedAssemblyDependencies(string projectDllName, string projectDllSrcPath, - string buildConfig, string customLibDir, Godot.Collections.Dictionary<string, string> dependencies) => - internal_GetExportedAssemblyDependencies(projectDllName, projectDllSrcPath, buildConfig, customLibDir, dependencies); - - [MethodImpl(MethodImplOptions.InternalCall)] - private static extern void internal_GetExportedAssemblyDependencies(string projectDllName, string projectDllSrcPath, - string buildConfig, string customLibDir, Godot.Collections.Dictionary<string, string> dependencies); - } -} diff --git a/modules/mono/editor/GodotTools/GodotTools/GodotTools.csproj b/modules/mono/editor/GodotTools/GodotTools/GodotTools.csproj index 3c57900873..fb2cbabc8e 100644 --- a/modules/mono/editor/GodotTools/GodotTools/GodotTools.csproj +++ b/modules/mono/editor/GodotTools/GodotTools/GodotTools.csproj @@ -30,6 +30,7 @@ <ConsolePause>false</ConsolePause> </PropertyGroup> <ItemGroup> + <Reference Include="Mono.Posix" /> <Reference Include="System" /> <Reference Include="GodotSharp"> <HintPath>$(GodotSourceRootPath)/bin/GodotSharp/Api/$(GodotApiConfiguration)/GodotSharp.dll</HintPath> @@ -40,6 +41,7 @@ </ItemGroup> <ItemGroup> <Compile Include="Build\MsBuildFinder.cs" /> + <Compile Include="Export\ExportPlugin.cs" /> <Compile Include="ExternalEditorId.cs" /> <Compile Include="Ides\GodotIdeManager.cs" /> <Compile Include="Ides\GodotIdeServer.cs" /> @@ -63,7 +65,6 @@ <Compile Include="BuildInfo.cs" /> <Compile Include="BuildTab.cs" /> <Compile Include="BottomPanel.cs" /> - <Compile Include="GodotSharpExport.cs" /> <Compile Include="CsProjOperations.cs" /> <Compile Include="Utils\CollectionExtensions.cs" /> </ItemGroup> diff --git a/modules/mono/editor/GodotTools/GodotTools/Ides/GodotIdeManager.cs b/modules/mono/editor/GodotTools/GodotTools/Ides/GodotIdeManager.cs index 01aa0d0ab1..f94d6f998c 100644 --- a/modules/mono/editor/GodotTools/GodotTools/Ides/GodotIdeManager.cs +++ b/modules/mono/editor/GodotTools/GodotTools/Ides/GodotIdeManager.cs @@ -79,7 +79,7 @@ namespace GodotTools.Ides { MonoDevelop.Instance GetMonoDevelopInstance(string solutionPath) { - if (Utils.OS.IsOSX() && editor == ExternalEditorId.VisualStudioForMac) + if (Utils.OS.IsOSX && editor == ExternalEditorId.VisualStudioForMac) { vsForMacInstance = vsForMacInstance ?? new MonoDevelop.Instance(solutionPath, MonoDevelop.EditorId.VisualStudioForMac); diff --git a/modules/mono/editor/GodotTools/GodotTools/Ides/MonoDevelop/Instance.cs b/modules/mono/editor/GodotTools/GodotTools/Ides/MonoDevelop/Instance.cs index 1fdccf5bbd..6026c109ad 100644 --- a/modules/mono/editor/GodotTools/GodotTools/Ides/MonoDevelop/Instance.cs +++ b/modules/mono/editor/GodotTools/GodotTools/Ides/MonoDevelop/Instance.cs @@ -24,7 +24,7 @@ namespace GodotTools.Ides.MonoDevelop string command; - if (OS.IsOSX()) + if (OS.IsOSX) { string bundleId = BundleIds[editorId]; @@ -81,7 +81,7 @@ namespace GodotTools.Ides.MonoDevelop public Instance(string solutionFile, EditorId editorId) { - if (editorId == EditorId.VisualStudioForMac && !OS.IsOSX()) + if (editorId == EditorId.VisualStudioForMac && !OS.IsOSX) throw new InvalidOperationException($"{nameof(EditorId.VisualStudioForMac)} not supported on this platform"); this.solutionFile = solutionFile; @@ -93,7 +93,7 @@ namespace GodotTools.Ides.MonoDevelop static Instance() { - if (OS.IsOSX()) + if (OS.IsOSX) { ExecutableNames = new Dictionary<EditorId, string> { @@ -107,7 +107,7 @@ namespace GodotTools.Ides.MonoDevelop {EditorId.VisualStudioForMac, "com.microsoft.visual-studio"} }; } - else if (OS.IsWindows()) + else if (OS.IsWindows) { ExecutableNames = new Dictionary<EditorId, string> { @@ -118,7 +118,7 @@ namespace GodotTools.Ides.MonoDevelop {EditorId.MonoDevelop, "MonoDevelop.exe"} }; } - else if (OS.IsUnix()) + else if (OS.IsUnixLike()) { ExecutableNames = new Dictionary<EditorId, string> { diff --git a/modules/mono/editor/GodotTools/GodotTools/Internals/Internal.cs b/modules/mono/editor/GodotTools/GodotTools/Internals/Internal.cs index 836c9c11e4..de361ba844 100644 --- a/modules/mono/editor/GodotTools/GodotTools/Internals/Internal.cs +++ b/modules/mono/editor/GodotTools/GodotTools/Internals/Internal.cs @@ -52,7 +52,7 @@ namespace GodotTools.Internals public static void ScriptEditorDebugger_ReloadScripts() => internal_ScriptEditorDebugger_ReloadScripts(); - // Internal Calls + #region Internal [MethodImpl(MethodImplOptions.InternalCall)] private static extern string internal_UpdateApiAssembliesFromPrebuilt(string config); @@ -110,5 +110,7 @@ namespace GodotTools.Internals [MethodImpl(MethodImplOptions.InternalCall)] private static extern void internal_ScriptEditorDebugger_ReloadScripts(); + + #endregion } } diff --git a/modules/mono/editor/GodotTools/GodotTools/Utils/OS.cs b/modules/mono/editor/GodotTools/GodotTools/Utils/OS.cs index e48b1115db..1a8c26acd7 100644 --- a/modules/mono/editor/GodotTools/GodotTools/Utils/OS.cs +++ b/modules/mono/editor/GodotTools/GodotTools/Utils/OS.cs @@ -1,72 +1,102 @@ using System; using System.Collections.Generic; using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; using System.IO; using System.Linq; using System.Runtime.CompilerServices; +using Mono.Unix.Native; namespace GodotTools.Utils { + [SuppressMessage("ReSharper", "InconsistentNaming")] public static class OS { [MethodImpl(MethodImplOptions.InternalCall)] - extern static string GetPlatformName(); + static extern string GetPlatformName(); - const string HaikuName = "Haiku"; - const string OSXName = "OSX"; - const string ServerName = "Server"; - const string UWPName = "UWP"; - const string WindowsName = "Windows"; - const string X11Name = "X11"; - - public static bool IsHaiku() + public static class Names { - return HaikuName.Equals(GetPlatformName(), StringComparison.OrdinalIgnoreCase); + public const string Windows = "Windows"; + public const string OSX = "OSX"; + public const string X11 = "X11"; + public const string Server = "Server"; + public const string UWP = "UWP"; + public const string Haiku = "Haiku"; + public const string Android = "Android"; + public const string HTML5 = "HTML5"; } - public static bool IsOSX() + public static class Platforms { - return OSXName.Equals(GetPlatformName(), StringComparison.OrdinalIgnoreCase); + public const string Windows = "windows"; + public const string OSX = "osx"; + public const string X11 = "x11"; + public const string Server = "server"; + public const string UWP = "uwp"; + public const string Haiku = "haiku"; + public const string Android = "android"; + public const string HTML5 = "javascript"; } - public static bool IsServer() + public static readonly Dictionary<string, string> PlatformNameMap = new Dictionary<string, string> { - return ServerName.Equals(GetPlatformName(), StringComparison.OrdinalIgnoreCase); - } - - public static bool IsUWP() + [Names.Windows] = Platforms.Windows, + [Names.OSX] = Platforms.OSX, + [Names.X11] = Platforms.X11, + [Names.Server] = Platforms.Server, + [Names.UWP] = Platforms.UWP, + [Names.Haiku] = Platforms.Haiku, + [Names.Android] = Platforms.Android, + [Names.HTML5] = Platforms.HTML5 + }; + + private static bool IsOS(string name) { - return UWPName.Equals(GetPlatformName(), StringComparison.OrdinalIgnoreCase); + return name.Equals(GetPlatformName(), StringComparison.OrdinalIgnoreCase); } - public static bool IsWindows() - { - return WindowsName.Equals(GetPlatformName(), StringComparison.OrdinalIgnoreCase); - } - - public static bool IsX11() - { - return X11Name.Equals(GetPlatformName(), StringComparison.OrdinalIgnoreCase); - } + private static readonly Lazy<bool> _isWindows = new Lazy<bool>(() => IsOS(Names.Windows)); + private static readonly Lazy<bool> _isOSX = new Lazy<bool>(() => IsOS(Names.OSX)); + private static readonly Lazy<bool> _isX11 = new Lazy<bool>(() => IsOS(Names.X11)); + private static readonly Lazy<bool> _isServer = new Lazy<bool>(() => IsOS(Names.Server)); + private static readonly Lazy<bool> _isUWP = new Lazy<bool>(() => IsOS(Names.UWP)); + private static readonly Lazy<bool> _isHaiku = new Lazy<bool>(() => IsOS(Names.Haiku)); + private static readonly Lazy<bool> _isAndroid = new Lazy<bool>(() => IsOS(Names.Android)); + private static readonly Lazy<bool> _isHTML5 = new Lazy<bool>(() => IsOS(Names.HTML5)); + + public static bool IsWindows => _isWindows.Value; + public static bool IsOSX => _isOSX.Value; + public static bool IsX11 => _isX11.Value; + public static bool IsServer => _isServer.Value; + public static bool IsUWP => _isUWP.Value; + public static bool IsHaiku => _isHaiku.Value; + public static bool IsAndroid => _isAndroid.Value; + public static bool IsHTML5 => _isHTML5.Value; private static bool? _isUnixCache; - private static readonly string[] UnixPlatforms = {HaikuName, OSXName, ServerName, X11Name}; + private static readonly string[] UnixLikePlatforms = {Names.OSX, Names.X11, Names.Server, Names.Haiku, Names.Android}; - public static bool IsUnix() + public static bool IsUnixLike() { if (_isUnixCache.HasValue) return _isUnixCache.Value; string osName = GetPlatformName(); - _isUnixCache = UnixPlatforms.Any(p => p.Equals(osName, StringComparison.OrdinalIgnoreCase)); + _isUnixCache = UnixLikePlatforms.Any(p => p.Equals(osName, StringComparison.OrdinalIgnoreCase)); return _isUnixCache.Value; } - public static char PathSep => IsWindows() ? ';' : ':'; + public static char PathSep => IsWindows ? ';' : ':'; public static string PathWhich(string name) { - string[] windowsExts = IsWindows() ? Environment.GetEnvironmentVariable("PATHEXT")?.Split(PathSep) : null; + return IsWindows ? PathWhichWindows(name) : PathWhichUnix(name); + } + + private static string PathWhichWindows(string name) + { + string[] windowsExts = Environment.GetEnvironmentVariable("PATHEXT")?.Split(PathSep) ?? new string[] { }; string[] pathDirs = Environment.GetEnvironmentVariable("PATH")?.Split(PathSep); var searchDirs = new List<string>(); @@ -74,40 +104,46 @@ namespace GodotTools.Utils if (pathDirs != null) searchDirs.AddRange(pathDirs); + string nameExt = Path.GetExtension(name); + bool hasPathExt = string.IsNullOrEmpty(nameExt) || windowsExts.Contains(nameExt, StringComparer.OrdinalIgnoreCase); + searchDirs.Add(System.IO.Directory.GetCurrentDirectory()); // last in the list - foreach (var dir in searchDirs) - { - string path = Path.Combine(dir, name); - - if (IsWindows() && windowsExts != null) - { - foreach (var extension in windowsExts) - { - string pathWithExtension = path + extension; - - if (File.Exists(pathWithExtension)) - return pathWithExtension; - } - } - else - { - if (File.Exists(path)) - return path; - } - } + if (hasPathExt) + return searchDirs.Select(dir => Path.Combine(dir, name)).FirstOrDefault(File.Exists); + + return (from dir in searchDirs + select Path.Combine(dir, name) + into path + from ext in windowsExts + select path + ext).FirstOrDefault(File.Exists); + } + + private static string PathWhichUnix(string name) + { + string[] pathDirs = Environment.GetEnvironmentVariable("PATH")?.Split(PathSep); + + var searchDirs = new List<string>(); + + if (pathDirs != null) + searchDirs.AddRange(pathDirs); + + searchDirs.Add(System.IO.Directory.GetCurrentDirectory()); // last in the list - return null; + return searchDirs.Select(dir => Path.Combine(dir, name)) + .FirstOrDefault(path => File.Exists(path) && Syscall.access(path, AccessModes.X_OK) == 0); } public static void RunProcess(string command, IEnumerable<string> arguments) { + // TODO: Once we move to .NET Standard 2.1 we can use ProcessStartInfo.ArgumentList instead string CmdLineArgsToString(IEnumerable<string> args) { + // Not perfect, but as long as we are careful... return string.Join(" ", args.Select(arg => arg.Contains(" ") ? $@"""{arg}""" : arg)); } - ProcessStartInfo startInfo = new ProcessStartInfo(command, CmdLineArgsToString(arguments)) + var startInfo = new ProcessStartInfo(command, CmdLineArgsToString(arguments)) { RedirectStandardOutput = true, RedirectStandardError = true, diff --git a/modules/mono/editor/bindings_generator.cpp b/modules/mono/editor/bindings_generator.cpp index 28cab2ab61..2252f7676d 100644 --- a/modules/mono/editor/bindings_generator.cpp +++ b/modules/mono/editor/bindings_generator.cpp @@ -97,7 +97,7 @@ #define C_METHOD_MONOARRAY_TO(m_type) C_NS_MONOMARSHAL "::mono_array_to_" #m_type #define C_METHOD_MONOARRAY_FROM(m_type) C_NS_MONOMARSHAL "::" #m_type "_to_mono_array" -#define BINDINGS_GENERATOR_VERSION UINT32_C(9) +#define BINDINGS_GENERATOR_VERSION UINT32_C(11) const char *BindingsGenerator::TypeInterface::DEFAULT_VARARG_C_IN("\t%0 %1_in = %1;\n"); @@ -731,13 +731,26 @@ void BindingsGenerator::_generate_method_icalls(const TypeInterface &p_itype) { i++; } + String im_type_out = return_type->im_type_out; + + if (return_type->ret_as_byref_arg) { + // Doesn't affect the unique signature + im_type_out = "void"; + + im_sig += ", "; + im_sig += return_type->im_type_out; + im_sig += " argRet"; + + i++; + } + // godot_icall_{argc}_{icallcount} String icall_method = ICALL_PREFIX; icall_method += itos(imethod.arguments.size()); icall_method += "_"; icall_method += itos(method_icalls.size()); - InternalCall im_icall = InternalCall(p_itype.api_type, icall_method, return_type->im_type_out, im_sig, im_unique_sig); + InternalCall im_icall = InternalCall(p_itype.api_type, icall_method, im_type_out, im_sig, im_unique_sig); List<InternalCall>::Element *match = method_icalls.find(im_icall); @@ -1685,17 +1698,18 @@ Error BindingsGenerator::_generate_cs_method(const BindingsGenerator::TypeInterf const InternalCall *im_icall = match->value(); String im_call = im_icall->editor_only ? BINDINGS_CLASS_NATIVECALLS_EDITOR : BINDINGS_CLASS_NATIVECALLS; - im_call += "." + im_icall->name + "(" + icall_params + ")"; + im_call += "."; + im_call += im_icall->name; if (p_imethod.arguments.size()) p_output.append(cs_in_statements); if (return_type->cname == name_cache.type_void) { - p_output.append(im_call + ";\n"); + p_output.append(im_call + "(" + icall_params + ");\n"); } else if (return_type->cs_out.empty()) { - p_output.append("return " + im_call + ";\n"); + p_output.append("return " + im_call + "(" + icall_params + ");\n"); } else { - p_output.append(sformat(return_type->cs_out, im_call, return_type->cs_type, return_type->im_type_out)); + p_output.append(sformat(return_type->cs_out, im_call, icall_params, return_type->cs_type, return_type->im_type_out)); p_output.append("\n"); } @@ -1937,6 +1951,15 @@ Error BindingsGenerator::_generate_glue_method(const BindingsGenerator::TypeInte i++; } + if (return_type->ret_as_byref_arg) { + c_func_sig += ", "; + c_func_sig += return_type->c_type_in; + c_func_sig += " "; + c_func_sig += "arg_ret"; + + i++; + } + const Map<const MethodInterface *, const InternalCall *>::Element *match = method_icalls_map.find(&p_imethod); ERR_FAIL_NULL_V(match, ERR_BUG); @@ -1951,14 +1974,12 @@ Error BindingsGenerator::_generate_glue_method(const BindingsGenerator::TypeInte // Generate icall function - p_output.append(ret_void ? "void " : return_type->c_type_out + " "); + p_output.append((ret_void || return_type->ret_as_byref_arg) ? "void " : return_type->c_type_out + " "); p_output.append(icall_method); p_output.append("("); p_output.append(c_func_sig); p_output.append(") " OPEN_BLOCK); - String fail_ret = ret_void ? "" : ", " + (return_type->c_type_out.ends_with("*") ? "NULL" : return_type->c_type_out + "()"); - if (!ret_void) { String ptrcall_return_type; String initialization; @@ -1982,9 +2003,18 @@ Error BindingsGenerator::_generate_glue_method(const BindingsGenerator::TypeInte p_output.append("\t" + ptrcall_return_type); p_output.append(" " C_LOCAL_RET); p_output.append(initialization + ";\n"); - p_output.append("\tERR_FAIL_NULL_V(" CS_PARAM_INSTANCE); - p_output.append(fail_ret); - p_output.append(");\n"); + + String fail_ret = return_type->c_type_out.ends_with("*") && !return_type->ret_as_byref_arg ? "NULL" : return_type->c_type_out + "()"; + + if (return_type->ret_as_byref_arg) { + p_output.append("\tif (" CS_PARAM_INSTANCE " == NULL) { *arg_ret = "); + p_output.append(fail_ret); + p_output.append("; ERR_FAIL_MSG(\"Parameter ' arg_ret ' is null.\"); }\n"); + } else { + p_output.append("\tERR_FAIL_NULL_V(" CS_PARAM_INSTANCE ", "); + p_output.append(fail_ret); + p_output.append(");\n"); + } } else { p_output.append("\tERR_FAIL_NULL(" CS_PARAM_INSTANCE ");\n"); } @@ -2045,10 +2075,13 @@ Error BindingsGenerator::_generate_glue_method(const BindingsGenerator::TypeInte } if (!ret_void) { - if (return_type->c_out.empty()) + if (return_type->c_out.empty()) { p_output.append("\treturn " C_LOCAL_RET ";\n"); - else + } else if (return_type->ret_as_byref_arg) { + p_output.append(sformat(return_type->c_out, return_type->c_type_out, C_LOCAL_RET, return_type->name, "arg_ret")); + } else { p_output.append(sformat(return_type->c_out, return_type->c_type_out, C_LOCAL_RET, return_type->name)); + } } p_output.append(CLOSE_BLOCK "\n"); @@ -2620,30 +2653,32 @@ void BindingsGenerator::_populate_builtin_type_interfaces() { TypeInterface itype; -#define INSERT_STRUCT_TYPE(m_type, m_type_in) \ +#define INSERT_STRUCT_TYPE(m_type) \ { \ itype = TypeInterface::create_value_type(String(#m_type)); \ itype.c_in = "\t%0 %1_in = MARSHALLED_IN(" #m_type ", %1);\n"; \ - itype.c_out = "\treturn MARSHALLED_OUT(" #m_type ", %1);\n"; \ + itype.c_out = "\t*%3 = MARSHALLED_OUT(" #m_type ", %1);\n"; \ itype.c_arg_in = "&%s_in"; \ itype.c_type_in = "GDMonoMarshal::M_" #m_type "*"; \ itype.c_type_out = "GDMonoMarshal::M_" #m_type; \ itype.cs_in = "ref %s"; \ - itype.cs_out = "return (%1)%0;"; \ - itype.im_type_out = itype.cs_type; \ + /* in cs_out, im_type_out (%3) includes the 'out ' part */ \ + itype.cs_out = "%0(%1, %3 argRet); return (%2)argRet;"; \ + itype.im_type_out = "out " + itype.cs_type; \ + itype.ret_as_byref_arg = true; \ builtin_types.insert(itype.cname, itype); \ } - INSERT_STRUCT_TYPE(Vector2, "real_t*") - INSERT_STRUCT_TYPE(Rect2, "real_t*") - INSERT_STRUCT_TYPE(Transform2D, "real_t*") - INSERT_STRUCT_TYPE(Vector3, "real_t*") - INSERT_STRUCT_TYPE(Basis, "real_t*") - INSERT_STRUCT_TYPE(Quat, "real_t*") - INSERT_STRUCT_TYPE(Transform, "real_t*") - INSERT_STRUCT_TYPE(AABB, "real_t*") - INSERT_STRUCT_TYPE(Color, "real_t*") - INSERT_STRUCT_TYPE(Plane, "real_t*") + INSERT_STRUCT_TYPE(Vector2) + INSERT_STRUCT_TYPE(Rect2) + INSERT_STRUCT_TYPE(Transform2D) + INSERT_STRUCT_TYPE(Vector3) + INSERT_STRUCT_TYPE(Basis) + INSERT_STRUCT_TYPE(Quat) + INSERT_STRUCT_TYPE(Transform) + INSERT_STRUCT_TYPE(AABB) + INSERT_STRUCT_TYPE(Color) + INSERT_STRUCT_TYPE(Plane) #undef INSERT_STRUCT_TYPE @@ -2687,11 +2722,44 @@ void BindingsGenerator::_populate_builtin_type_interfaces() { INSERT_INT_TYPE("sbyte", int8_t, int64_t); INSERT_INT_TYPE("short", int16_t, int64_t); INSERT_INT_TYPE("int", int32_t, int64_t); - INSERT_INT_TYPE("long", int64_t, int64_t); INSERT_INT_TYPE("byte", uint8_t, int64_t); INSERT_INT_TYPE("ushort", uint16_t, int64_t); INSERT_INT_TYPE("uint", uint32_t, int64_t); - INSERT_INT_TYPE("ulong", uint64_t, int64_t); + + itype = TypeInterface::create_value_type(String("long")); + { + itype.c_out = "\treturn (%0)%1;\n"; + itype.c_in = "\t%0 %1_in = (%0)*%1;\n"; + itype.c_out = "\t*%3 = (%0)%1;\n"; + itype.c_type = "int64_t"; + itype.c_arg_in = "&%s_in"; + } + itype.c_type_in = "int64_t*"; + itype.c_type_out = "int64_t"; + itype.im_type_in = "ref " + itype.name; + itype.im_type_out = "out " + itype.name; + itype.cs_in = "ref %0"; + /* in cs_out, im_type_out (%3) includes the 'out ' part */ + itype.cs_out = "%0(%1, %3 argRet); return (%2)argRet;"; + itype.ret_as_byref_arg = true; + builtin_types.insert(itype.cname, itype); + + itype = TypeInterface::create_value_type(String("ulong")); + { + itype.c_in = "\t%0 %1_in = (%0)*%1;\n"; + itype.c_out = "\t*%3 = (%0)%1;\n"; + itype.c_type = "int64_t"; + itype.c_arg_in = "&%s_in"; + } + itype.c_type_in = "uint64_t*"; + itype.c_type_out = "uint64_t"; + itype.im_type_in = "ref " + itype.name; + itype.im_type_out = "out " + itype.name; + itype.cs_in = "ref %0"; + /* in cs_out, im_type_out (%3) includes the 'out ' part */ + itype.cs_out = "%0(%1, %3 argRet); return (%2)argRet;"; + itype.ret_as_byref_arg = true; + builtin_types.insert(itype.cname, itype); } // Floating point types @@ -2703,16 +2771,20 @@ void BindingsGenerator::_populate_builtin_type_interfaces() { itype.proxy_name = "float"; { // The expected type for 'float' in ptrcall is 'double' - itype.c_in = "\t%0 %1_in = (%0)%1;\n"; - itype.c_out = "\treturn (%0)%1;\n"; + itype.c_in = "\t%0 %1_in = (%0)*%1;\n"; + itype.c_out = "\t*%3 = (%0)%1;\n"; itype.c_type = "double"; - itype.c_type_in = "float"; + itype.c_type_in = "float*"; itype.c_type_out = "float"; itype.c_arg_in = "&%s_in"; } itype.cs_type = itype.proxy_name; - itype.im_type_in = itype.proxy_name; - itype.im_type_out = itype.proxy_name; + itype.im_type_in = "ref " + itype.proxy_name; + itype.im_type_out = "out " + itype.proxy_name; + itype.cs_in = "ref %0"; + /* in cs_out, im_type_out (%3) includes the 'out ' part */ + itype.cs_out = "%0(%1, %3 argRet); return (%2)argRet;"; + itype.ret_as_byref_arg = true; builtin_types.insert(itype.cname, itype); // double @@ -2720,13 +2792,21 @@ void BindingsGenerator::_populate_builtin_type_interfaces() { itype.name = "double"; itype.cname = itype.name; itype.proxy_name = "double"; - itype.c_type = "double"; - itype.c_type_in = "double"; - itype.c_type_out = "double"; - itype.c_arg_in = "&%s"; + { + itype.c_in = "\t%0 %1_in = (%0)*%1;\n"; + itype.c_out = "\t*%3 = (%0)%1;\n"; + itype.c_type = "double"; + itype.c_type_in = "double*"; + itype.c_type_out = "double"; + itype.c_arg_in = "&%s_in"; + } itype.cs_type = itype.proxy_name; - itype.im_type_in = itype.proxy_name; - itype.im_type_out = itype.proxy_name; + itype.im_type_in = "ref " + itype.proxy_name; + itype.im_type_out = "out " + itype.proxy_name; + itype.cs_in = "ref %0"; + /* in cs_out, im_type_out (%3) includes the 'out ' part */ + itype.cs_out = "%0(%1, %3 argRet); return (%2)argRet;"; + itype.ret_as_byref_arg = true; builtin_types.insert(itype.cname, itype); } @@ -2757,7 +2837,7 @@ void BindingsGenerator::_populate_builtin_type_interfaces() { itype.c_type_out = itype.c_type + "*"; itype.cs_type = itype.proxy_name; itype.cs_in = "NodePath." CS_SMETHOD_GETINSTANCE "(%0)"; - itype.cs_out = "return new %1(%0);"; + itype.cs_out = "return new %2(%0(%1));"; itype.im_type_in = "IntPtr"; itype.im_type_out = "IntPtr"; builtin_types.insert(itype.cname, itype); @@ -2773,7 +2853,7 @@ void BindingsGenerator::_populate_builtin_type_interfaces() { itype.c_type_out = itype.c_type + "*"; itype.cs_type = itype.proxy_name; itype.cs_in = "RID." CS_SMETHOD_GETINSTANCE "(%0)"; - itype.cs_out = "return new %1(%0);"; + itype.cs_out = "return new %2(%0(%1));"; itype.im_type_in = "IntPtr"; itype.im_type_out = "IntPtr"; builtin_types.insert(itype.cname, itype); @@ -2855,7 +2935,7 @@ void BindingsGenerator::_populate_builtin_type_interfaces() { itype.c_type_out = itype.c_type + "*"; itype.cs_type = BINDINGS_NAMESPACE_COLLECTIONS "." + itype.proxy_name; itype.cs_in = "%0." CS_SMETHOD_GETINSTANCE "()"; - itype.cs_out = "return new " + itype.cs_type + "(%0);"; + itype.cs_out = "return new " + itype.cs_type + "(%0(%1));"; itype.im_type_in = "IntPtr"; itype.im_type_out = "IntPtr"; builtin_types.insert(itype.cname, itype); @@ -2871,7 +2951,7 @@ void BindingsGenerator::_populate_builtin_type_interfaces() { itype.c_type_out = itype.c_type + "*"; itype.cs_type = BINDINGS_NAMESPACE_COLLECTIONS "." + itype.proxy_name; itype.cs_in = "%0." CS_SMETHOD_GETINSTANCE "()"; - itype.cs_out = "return new " + itype.cs_type + "(%0);"; + itype.cs_out = "return new " + itype.cs_type + "(%0(%1));"; itype.im_type_in = "IntPtr"; itype.im_type_out = "IntPtr"; builtin_types.insert(itype.cname, itype); diff --git a/modules/mono/editor/bindings_generator.h b/modules/mono/editor/bindings_generator.h index 8f3676940b..07918a2d03 100644 --- a/modules/mono/editor/bindings_generator.h +++ b/modules/mono/editor/bindings_generator.h @@ -214,6 +214,14 @@ class BindingsGenerator { */ bool memory_own; + /** + * This must be set to true for any struct bigger than 32-bits. Those cannot be passed/returned by value + * with internal calls, so we must use pointers instead. Returns must be replace with out parameters. + * In this case, [c_out] and [cs_out] must have a different format, explained below. + * The Mono IL interpreter icall trampolines don't support passing structs bigger than 32-bits by value (at least not on WASM). + */ + bool ret_as_byref_arg; + // !! The comments of the following fields make reference to other fields via square brackets, e.g.: [field_name] // !! When renaming those fields, make sure to rename their references in the comments @@ -248,6 +256,14 @@ class BindingsGenerator { * %0: [c_type_out] of the return type * %1: name of the variable to be returned * %2: [name] of the return type + * --------------------------------------- + * If [ret_as_byref_arg] is true, the format is different. Instead of using a return statement, + * the value must be assigned to a parameter. This type of this parameter is a pointer to [c_type_out]. + * Formatting elements: + * %0: [c_type_out] of the return type + * %1: name of the variable to be returned + * %2: [name] of the return type + * %3: name of the parameter that must be assigned the return value */ String c_out; @@ -291,9 +307,10 @@ class BindingsGenerator { * One or more statements that determine how a variable of this type is returned from a method. * It must contain the return statement(s). * Formatting elements: - * %0: internal method call statement - * %1: [cs_type] of the return type - * %2: [im_type_out] of the return type + * %0: internal method name + * %1: internal method call arguments without surrounding parenthesis + * %2: [cs_type] of the return type + * %3: [im_type_out] of the return type */ String cs_out; @@ -417,7 +434,7 @@ class BindingsGenerator { r_enum_itype.cs_type = r_enum_itype.proxy_name; r_enum_itype.cs_in = "(int)%s"; - r_enum_itype.cs_out = "return (%1)%0;"; + r_enum_itype.cs_out = "return (%2)%0(%1);"; r_enum_itype.im_type_in = "int"; r_enum_itype.im_type_out = "int"; r_enum_itype.class_doc = &EditorHelp::get_doc_data()->class_list[r_enum_itype.proxy_name]; @@ -435,6 +452,8 @@ class BindingsGenerator { memory_own = false; + ret_as_byref_arg = false; + c_arg_in = "%s"; class_doc = NULL; diff --git a/modules/mono/editor/editor_internal_calls.cpp b/modules/mono/editor/editor_internal_calls.cpp index 1564d73c2a..4055ec005a 100644 --- a/modules/mono/editor/editor_internal_calls.cpp +++ b/modules/mono/editor/editor_internal_calls.cpp @@ -219,15 +219,15 @@ int32_t godot_icall_ScriptClassParser_ParseFile(MonoString *p_filepath, MonoObje return err; } -uint32_t godot_icall_GodotSharpExport_GetExportedAssemblyDependencies(MonoString *p_project_dll_name, MonoString *p_project_dll_src_path, - MonoString *p_build_config, MonoString *p_custom_lib_dir, MonoObject *r_dependencies) { +uint32_t godot_icall_ExportPlugin_GetExportedAssemblyDependencies(MonoString *p_project_dll_name, MonoString *p_project_dll_src_path, + MonoString *p_build_config, MonoString *p_custom_bcl_dir, MonoObject *r_dependencies) { String project_dll_name = GDMonoMarshal::mono_string_to_godot(p_project_dll_name); String project_dll_src_path = GDMonoMarshal::mono_string_to_godot(p_project_dll_src_path); String build_config = GDMonoMarshal::mono_string_to_godot(p_build_config); - String custom_lib_dir = GDMonoMarshal::mono_string_to_godot(p_custom_lib_dir); + String custom_bcl_dir = GDMonoMarshal::mono_string_to_godot(p_custom_bcl_dir); Dictionary dependencies = GDMonoMarshal::mono_object_to_variant(r_dependencies); - return GodotSharpExport::get_exported_assembly_dependencies(project_dll_name, project_dll_src_path, build_config, custom_lib_dir, dependencies); + return GodotSharpExport::get_exported_assembly_dependencies(project_dll_name, project_dll_src_path, build_config, custom_bcl_dir, dependencies); } MonoString *godot_icall_Internal_UpdateApiAssembliesFromPrebuilt(MonoString *p_config) { @@ -411,8 +411,8 @@ void register_editor_internal_calls() { // ScriptClassParser mono_add_internal_call("GodotTools.Internals.ScriptClassParser::internal_ParseFile", (void *)godot_icall_ScriptClassParser_ParseFile); - // GodotSharpExport - mono_add_internal_call("GodotTools.GodotSharpExport::internal_GetExportedAssemblyDependencies", (void *)godot_icall_GodotSharpExport_GetExportedAssemblyDependencies); + // ExportPlugin + mono_add_internal_call("GodotTools.Export.ExportPlugin::internal_GetExportedAssemblyDependencies", (void *)godot_icall_ExportPlugin_GetExportedAssemblyDependencies); // Internals mono_add_internal_call("GodotTools.Internals.Internal::internal_UpdateApiAssembliesFromPrebuilt", (void *)godot_icall_Internal_UpdateApiAssembliesFromPrebuilt); diff --git a/modules/mono/editor/godotsharp_export.cpp b/modules/mono/editor/godotsharp_export.cpp index e83152d668..9ae9399e1d 100644 --- a/modules/mono/editor/godotsharp_export.cpp +++ b/modules/mono/editor/godotsharp_export.cpp @@ -36,6 +36,7 @@ #include "../mono_gd/gd_mono.h" #include "../mono_gd/gd_mono_assembly.h" +#include "../mono_gd/gd_mono_cache.h" namespace GodotSharpExport { diff --git a/modules/mono/glue/Managed/Files/NodePath.cs b/modules/mono/glue/Managed/Files/NodePath.cs index 4de4e1e6a9..8c5872ba5a 100644 --- a/modules/mono/glue/Managed/Files/NodePath.cs +++ b/modules/mono/glue/Managed/Files/NodePath.cs @@ -12,7 +12,7 @@ namespace Godot internal static IntPtr GetPtr(NodePath instance) { if (instance == null) - return IntPtr.Zero; + throw new NullReferenceException($"The instance of type {nameof(NodePath)} is null."); if (instance.disposed) throw new ObjectDisposedException(instance.GetType().FullName); diff --git a/modules/mono/glue/Managed/Files/RID.cs b/modules/mono/glue/Managed/Files/RID.cs index 12064beca2..94761531b1 100644 --- a/modules/mono/glue/Managed/Files/RID.cs +++ b/modules/mono/glue/Managed/Files/RID.cs @@ -12,7 +12,7 @@ namespace Godot internal static IntPtr GetPtr(RID instance) { if (instance == null) - return IntPtr.Zero; + throw new NullReferenceException($"The instance of type {nameof(RID)} is null."); if (instance.disposed) throw new ObjectDisposedException(instance.GetType().FullName); diff --git a/modules/mono/glue/base_object_glue.cpp b/modules/mono/glue/base_object_glue.cpp index 6d85f55b97..2488f78350 100644 --- a/modules/mono/glue/base_object_glue.cpp +++ b/modules/mono/glue/base_object_glue.cpp @@ -36,6 +36,7 @@ #include "core/string_name.h" #include "../csharp_script.h" +#include "../mono_gd/gd_mono_cache.h" #include "../mono_gd/gd_mono_class.h" #include "../mono_gd/gd_mono_internals.h" #include "../mono_gd/gd_mono_utils.h" diff --git a/modules/mono/glue/collections_glue.cpp b/modules/mono/glue/collections_glue.cpp index e67c8b9ad9..bfb7b0f775 100644 --- a/modules/mono/glue/collections_glue.cpp +++ b/modules/mono/glue/collections_glue.cpp @@ -34,6 +34,7 @@ #include <mono/metadata/exception.h> +#include "../mono_gd/gd_mono_cache.h" #include "../mono_gd/gd_mono_class.h" #include "../mono_gd/gd_mono_utils.h" diff --git a/modules/mono/glue/gd_glue.cpp b/modules/mono/glue/gd_glue.cpp index 8b9a1380d8..1381d79e2e 100644 --- a/modules/mono/glue/gd_glue.cpp +++ b/modules/mono/glue/gd_glue.cpp @@ -39,6 +39,7 @@ #include "core/variant.h" #include "core/variant_parser.h" +#include "../mono_gd/gd_mono_cache.h" #include "../mono_gd/gd_mono_utils.h" MonoObject *godot_icall_GD_bytes2var(MonoArray *p_bytes, MonoBoolean p_allow_objects) { @@ -211,7 +212,7 @@ MonoString *godot_icall_GD_var2str(MonoObject *p_var) { } MonoObject *godot_icall_DefaultGodotTaskScheduler() { - return GDMonoUtils::mono_cache.task_scheduler_handle->get_target(); + return GDMonoCache::cached_data.task_scheduler_handle->get_target(); } void godot_register_gd_icalls() { diff --git a/modules/mono/godotsharp_dirs.cpp b/modules/mono/godotsharp_dirs.cpp index 5fa8aed5a9..ef30a52b72 100644 --- a/modules/mono/godotsharp_dirs.cpp +++ b/modules/mono/godotsharp_dirs.cpp @@ -39,8 +39,8 @@ #include "editor/editor_settings.h" #endif -#ifdef __ANDROID__ -#include "utils/android_utils.h" +#ifdef ANDROID_ENABLED +#include "mono_gd/gd_mono_android.h" #endif #include "mono_gd/gd_mono.h" @@ -108,6 +108,10 @@ public: String data_editor_tools_dir; String data_editor_prebuilt_api_dir; +#else + // Equivalent of res_assemblies_dir, but in the data directory rather than in 'res://'. + // Only defined on export templates. Used when exporting assemblies outside of PCKs. + String data_game_assemblies_dir; #endif String data_mono_etc_dir; @@ -130,7 +134,11 @@ private: res_temp_assemblies_base_dir = res_temp_dir.plus_file("bin"); res_temp_assemblies_dir = res_temp_assemblies_base_dir.plus_file(_get_expected_build_config()); +#ifdef JAVASCRIPT_ENABLED + mono_user_dir = "user://"; +#else mono_user_dir = _get_mono_user_dir(); +#endif mono_logs_dir = mono_user_dir.plus_file("mono_logs"); #ifdef TOOLS_ENABLED @@ -160,8 +168,8 @@ private: String data_mono_root_dir = data_dir_root.plus_file("Mono"); data_mono_etc_dir = data_mono_root_dir.plus_file("etc"); -#if __ANDROID__ - data_mono_lib_dir = GDMonoUtils::Android::get_app_native_lib_dir(); +#ifdef ANDROID_ENABLED + data_mono_lib_dir = GDMonoAndroid::get_app_native_lib_dir(); #else data_mono_lib_dir = data_mono_root_dir.plus_file("lib"); #endif @@ -197,10 +205,11 @@ private: String data_mono_root_dir = data_dir_root.plus_file("Mono"); data_mono_etc_dir = data_mono_root_dir.plus_file("etc"); -#if __ANDROID__ - data_mono_lib_dir = GDMonoUtils::Android::get_app_native_lib_dir(); +#ifdef ANDROID_ENABLED + data_mono_lib_dir = GDMonoAndroid::get_app_native_lib_dir(); #else data_mono_lib_dir = data_mono_root_dir.plus_file("lib"); + data_game_assemblies_dir = data_dir_root.plus_file("Assemblies"); #endif #ifdef WINDOWS_ENABLED @@ -212,6 +221,10 @@ private: data_mono_etc_dir = exe_dir.plus_file("../Resources/GodotSharp/Mono/etc"); data_mono_lib_dir = exe_dir.plus_file("../Frameworks/GodotSharp/Mono/lib"); } + + if (!DirAccess::exists(data_game_assemblies_dir)) { + data_game_assemblies_dir = exe_dir.plus_file("../Frameworks/GodotSharp/Assemblies"); + } #endif #endif @@ -291,6 +304,10 @@ String get_data_editor_tools_dir() { String get_data_editor_prebuilt_api_dir() { return _GodotSharpDirs::get_singleton().data_editor_prebuilt_api_dir; } +#else +String get_data_game_assemblies_dir() { + return _GodotSharpDirs::get_singleton().data_game_assemblies_dir; +} #endif String get_data_mono_etc_dir() { diff --git a/modules/mono/godotsharp_dirs.h b/modules/mono/godotsharp_dirs.h index ff51888d1c..43da44b0f5 100644 --- a/modules/mono/godotsharp_dirs.h +++ b/modules/mono/godotsharp_dirs.h @@ -56,6 +56,8 @@ String get_project_csproj_path(); String get_data_editor_tools_dir(); String get_data_editor_prebuilt_api_dir(); +#else +String get_data_game_assemblies_dir(); #endif String get_data_mono_etc_dir(); diff --git a/modules/mono/mono_gd/gd_mono.cpp b/modules/mono/mono_gd/gd_mono.cpp index 504b8d41d0..a43311d281 100644 --- a/modules/mono/mono_gd/gd_mono.cpp +++ b/modules/mono/mono_gd/gd_mono.cpp @@ -46,6 +46,7 @@ #include "../csharp_script.h" #include "../godotsharp_dirs.h" #include "../utils/path_utils.h" +#include "gd_mono_cache.h" #include "gd_mono_class.h" #include "gd_mono_marshal.h" #include "gd_mono_utils.h" @@ -56,13 +57,26 @@ #ifdef ANDROID_ENABLED #include "android_mono_config.h" +#include "gd_mono_android.h" #endif +// TODO: +// This has turn into a gigantic mess. There's too much going on here. Too much #ifdef as well. +// It's just painful to read... It needs to be re-structured. Please, clean this up, future me. + GDMono *GDMono::singleton = NULL; namespace { -void setup_runtime_main_args() { +#if defined(JAVASCRIPT_ENABLED) +extern "C" { +void mono_wasm_load_runtime(const char *managed_path, int enable_debugging); +} +#endif + +#if !defined(JAVASCRIPT_ENABLED) + +void gd_mono_setup_runtime_main_args() { CharString execpath = OS::get_singleton()->get_executable_path().utf8(); List<String> cmdline_args = OS::get_singleton()->get_cmdline_args(); @@ -83,7 +97,7 @@ void setup_runtime_main_args() { mono_runtime_set_main_args(main_args.size(), main_args.ptrw()); } -void gdmono_profiler_init() { +void gd_mono_profiler_init() { String profiler_args = GLOBAL_DEF("mono/profiler/args", "log:calls,alloc,sample,output=output.mlpd"); bool profiler_enabled = GLOBAL_DEF("mono/profiler/enabled", false); if (profiler_enabled) { @@ -91,9 +105,9 @@ void gdmono_profiler_init() { } } -#ifdef DEBUG_ENABLED +#if defined(DEBUG_ENABLED) -bool _wait_for_debugger_msecs(uint32_t p_msecs) { +bool gd_mono_wait_for_debugger_msecs(uint32_t p_msecs) { do { if (mono_is_debugger_attached()) @@ -115,7 +129,7 @@ bool _wait_for_debugger_msecs(uint32_t p_msecs) { return mono_is_debugger_attached(); } -void gdmono_debug_init() { +void gd_mono_debug_init() { mono_debug_init(MONO_DEBUG_FORMAT_MONO); @@ -151,11 +165,37 @@ void gdmono_debug_init() { mono_jit_parse_options(2, (char **)options); } +#endif // defined(DEBUG_ENABLED) +#endif // !defined(JAVASCRIPT_ENABLED) + +#if defined(JAVASCRIPT_ENABLED) +MonoDomain *gd_initialize_mono_runtime() { + const char *vfs_prefix = "managed"; + int enable_debugging = 0; + +#ifdef DEBUG_ENABLED + enable_debugging = 1; +#endif + + mono_wasm_load_runtime(vfs_prefix, enable_debugging); + + return mono_get_root_domain(); +} +#else +MonoDomain *gd_initialize_mono_runtime() { +#ifdef DEBUG_ENABLED + gd_mono_debug_init(); +#endif + + return mono_jit_init_version("GodotEngine.RootDomain", "v4.0.30319"); +} #endif } // namespace void GDMono::add_mono_shared_libs_dir_to_path() { + // TODO: Replace this with a mono_dl_fallback + // By default Mono seems to search shared libraries in the following directories: // Current working directory, @executable_path@ and PATH // The parent directory of the image file (assembly where the dllimport method is declared) @@ -199,35 +239,22 @@ void GDMono::add_mono_shared_libs_dir_to_path() { #endif // WINDOWS_ENABLED || UNIX_ENABLED } -void GDMono::initialize() { +void GDMono::determine_mono_dirs(String &r_assembly_rootdir, String &r_config_dir) { - ERR_FAIL_NULL(Engine::get_singleton()); - - print_verbose("Mono: Initializing module..."); - - char *runtime_build_info = mono_get_runtime_build_info(); - print_verbose("Mono JIT compiler version " + String(runtime_build_info)); - mono_free(runtime_build_info); - -#ifdef DEBUG_METHODS_ENABLED - _initialize_and_check_api_hashes(); -#endif - - GDMonoLog::get_singleton()->initialize(); - - String assembly_rootdir; - String config_dir; + String bundled_assembly_rootdir = GodotSharpDirs::get_data_mono_lib_dir(); + String bundled_config_dir = GodotSharpDirs::get_data_mono_etc_dir(); #ifdef TOOLS_ENABLED + #if defined(WINDOWS_ENABLED) mono_reg_info = MonoRegUtils::find_mono(); if (mono_reg_info.assembly_dir.length() && DirAccess::exists(mono_reg_info.assembly_dir)) { - assembly_rootdir = mono_reg_info.assembly_dir; + r_assembly_rootdir = mono_reg_info.assembly_dir; } if (mono_reg_info.config_dir.length() && DirAccess::exists(mono_reg_info.config_dir)) { - config_dir = mono_reg_info.config_dir; + r_config_dir = mono_reg_info.config_dir; } #elif defined(OSX_ENABLED) const char *c_assembly_rootdir = mono_assembly_getrootdir(); @@ -244,29 +271,24 @@ void GDMono::initialize() { String hint_config_dir = path::join(locations[i], "etc"); if (FileAccess::exists(hint_mscorlib_path) && DirAccess::exists(hint_config_dir)) { - assembly_rootdir = hint_assembly_rootdir; - config_dir = hint_config_dir; + r_assembly_rootdir = hint_assembly_rootdir; + r_config_dir = hint_config_dir; break; } } } #endif -#endif // TOOLS_ENABLED - String bundled_assembly_rootdir = GodotSharpDirs::get_data_mono_lib_dir(); - String bundled_config_dir = GodotSharpDirs::get_data_mono_etc_dir(); - -#ifdef TOOLS_ENABLED if (DirAccess::exists(bundled_assembly_rootdir)) { - assembly_rootdir = bundled_assembly_rootdir; + r_assembly_rootdir = bundled_assembly_rootdir; } if (DirAccess::exists(bundled_config_dir)) { - config_dir = bundled_config_dir; + r_config_dir = bundled_config_dir; } #ifdef WINDOWS_ENABLED - if (assembly_rootdir.empty() || config_dir.empty()) { + if (r_assembly_rootdir.empty() || r_config_dir.empty()) { ERR_PRINT("Cannot find Mono in the registry."); // Assertion: if they are not set, then they weren't found in the registry CRASH_COND(mono_reg_info.assembly_dir.length() > 0 || mono_reg_info.config_dir.length() > 0); @@ -274,35 +296,47 @@ void GDMono::initialize() { #endif // WINDOWS_ENABLED #else - // These are always the directories in export templates - assembly_rootdir = bundled_assembly_rootdir; - config_dir = bundled_config_dir; -#endif // TOOLS_ENABLED + // Export templates always use the bundled directories + r_assembly_rootdir = bundled_assembly_rootdir; + r_config_dir = bundled_config_dir; +#endif +} + +void GDMono::initialize() { + + ERR_FAIL_NULL(Engine::get_singleton()); + + print_verbose("Mono: Initializing module..."); + + char *runtime_build_info = mono_get_runtime_build_info(); + print_verbose("Mono JIT compiler version " + String(runtime_build_info)); + mono_free(runtime_build_info); + + _init_godot_api_hashes(); + _init_exception_policy(); + + GDMonoLog::get_singleton()->initialize(); + +#if !defined(JAVASCRIPT_ENABLED) + String assembly_rootdir; + String config_dir; + determine_mono_dirs(assembly_rootdir, config_dir); // Leak if we call mono_set_dirs more than once mono_set_dirs(assembly_rootdir.length() ? assembly_rootdir.utf8().get_data() : NULL, config_dir.length() ? config_dir.utf8().get_data() : NULL); add_mono_shared_libs_dir_to_path(); +#endif - { - PropertyInfo exc_policy_prop = PropertyInfo(Variant::INT, "mono/unhandled_exception_policy", PROPERTY_HINT_ENUM, - vformat("Terminate Application:%s,Log Error:%s", (int)POLICY_TERMINATE_APP, (int)POLICY_LOG_ERROR)); - unhandled_exception_policy = (UnhandledExceptionPolicy)(int)GLOBAL_DEF(exc_policy_prop.name, (int)POLICY_TERMINATE_APP); - ProjectSettings::get_singleton()->set_custom_property_info(exc_policy_prop.name, exc_policy_prop); - - if (Engine::get_singleton()->is_editor_hint()) { - // Unhandled exceptions should not terminate the editor - unhandled_exception_policy = POLICY_LOG_ERROR; - } - } +#if defined(ANDROID_ENABLED) + GDMonoAndroid::register_android_dl_fallback(); +#endif GDMonoAssembly::initialize(); - gdmono_profiler_init(); - -#ifdef DEBUG_ENABLED - gdmono_debug_init(); +#if !defined(JAVASCRIPT_ENABLED) + gd_mono_profiler_init(); #endif #ifdef ANDROID_ENABLED @@ -314,9 +348,12 @@ void GDMono::initialize() { mono_install_unhandled_exception_hook(&unhandled_exception_hook, NULL); #ifndef TOOLS_ENABLED - // Export templates only load the Mono runtime if the project uses it - if (!DirAccess::exists("res://.mono")) + // Exported games that don't use C# must still work. They likely don't ship with mscorlib. + // We only initialize the Mono runtime if we can find mscorlib. Otherwise it would crash. + if (GDMonoAssembly::find_assembly("mscorlib.dll").empty()) { + print_verbose("Mono: Skipping runtime initialization because 'mscorlib.dll' could not be found"); return; + } #endif #if !defined(WINDOWS_ENABLED) && !defined(NO_MONO_THREADS_SUSPEND_WORKAROUND) @@ -326,12 +363,14 @@ void GDMono::initialize() { } #endif - root_domain = mono_jit_init_version("GodotEngine.RootDomain", "v4.0.30319"); + root_domain = gd_initialize_mono_runtime(); ERR_FAIL_NULL_MSG(root_domain, "Mono: Failed to initialize runtime."); GDMonoUtils::set_main_thread(GDMonoUtils::get_current_thread()); - setup_runtime_main_args(); // Required for System.Environment.GetCommandLineArgs +#if !defined(JAVASCRIPT_ENABLED) + gd_mono_setup_runtime_main_args(); // Required for System.Environment.GetCommandLineArgs +#endif runtime_initialized = true; @@ -344,8 +383,8 @@ void GDMono::initialize() { Error domain_load_err = _load_scripts_domain(); ERR_FAIL_COND_MSG(domain_load_err != OK, "Mono: Failed to load scripts domain."); -#ifdef DEBUG_ENABLED - bool debugger_attached = _wait_for_debugger_msecs(500); +#if defined(DEBUG_ENABLED) && !defined(JAVASCRIPT_ENABLED) + bool debugger_attached = gd_mono_wait_for_debugger_msecs(500); if (!debugger_attached && OS::get_singleton()->is_stdout_verbose()) print_error("Mono: Debugger wait timeout"); #endif @@ -381,7 +420,7 @@ void GDMono::initialize_load_assemblies() { } bool GDMono::_are_api_assemblies_out_of_sync() { - bool out_of_sync = core_api_assembly.assembly && (core_api_assembly.out_of_sync || !GDMonoUtils::mono_cache.godot_api_cache_updated); + bool out_of_sync = core_api_assembly.assembly && (core_api_assembly.out_of_sync || !GDMonoCache::cached_data.godot_api_cache_updated); #ifdef TOOLS_ENABLED if (!out_of_sync) out_of_sync = editor_api_assembly.assembly && editor_api_assembly.out_of_sync; @@ -429,9 +468,8 @@ void GDMono::_register_internal_calls() { GodotSharpBindings::register_generated_icalls(); } -void GDMono::_initialize_and_check_api_hashes() { -#ifdef MONO_GLUE_ENABLED -#ifdef DEBUG_METHODS_ENABLED +void GDMono::_init_godot_api_hashes() { +#if defined(MONO_GLUE_ENABLED) && defined(DEBUG_METHODS_ENABLED) if (get_api_core_hash() != GodotSharpBindings::get_core_api_hash()) { ERR_PRINT("Mono: Core API hash mismatch."); } @@ -441,8 +479,19 @@ void GDMono::_initialize_and_check_api_hashes() { ERR_PRINT("Mono: Editor API hash mismatch."); } #endif // TOOLS_ENABLED -#endif // DEBUG_METHODS_ENABLED -#endif // MONO_GLUE_ENABLED +#endif // MONO_GLUE_ENABLED && DEBUG_METHODS_ENABLED +} + +void GDMono::_init_exception_policy() { + PropertyInfo exc_policy_prop = PropertyInfo(Variant::INT, "mono/unhandled_exception_policy", PROPERTY_HINT_ENUM, + vformat("Terminate Application:%s,Log Error:%s", (int)POLICY_TERMINATE_APP, (int)POLICY_LOG_ERROR)); + unhandled_exception_policy = (UnhandledExceptionPolicy)(int)GLOBAL_DEF(exc_policy_prop.name, (int)POLICY_TERMINATE_APP); + ProjectSettings::get_singleton()->set_custom_property_info(exc_policy_prop.name, exc_policy_prop); + + if (Engine::get_singleton()->is_editor_hint()) { + // Unhandled exceptions should not terminate the editor + unhandled_exception_policy = POLICY_LOG_ERROR; + } } void GDMono::add_assembly(uint32_t p_domain_id, GDMonoAssembly *p_assembly) { @@ -561,7 +610,7 @@ bool GDMono::_load_corlib_assembly() { bool success = load_assembly("mscorlib", &corlib_assembly); if (success) - GDMonoUtils::update_corlib_cache(); + GDMonoCache::update_corlib_cache(); return success; } @@ -834,9 +883,9 @@ bool GDMono::_try_load_api_assemblies(LoadedApiAssembly &r_core_api_assembly, Lo } bool GDMono::_on_core_api_assembly_loaded() { - GDMonoUtils::update_godot_api_cache(); + GDMonoCache::update_godot_api_cache(); - if (!GDMonoUtils::mono_cache.godot_api_cache_updated) + if (!GDMonoCache::cached_data.godot_api_cache_updated) return false; get_singleton()->_install_trace_listener(); @@ -884,7 +933,7 @@ void GDMono::_load_api_assemblies() { if (_are_api_assemblies_out_of_sync()) { if (core_api_assembly.out_of_sync) { ERR_PRINT("The assembly '" CORE_API_ASSEMBLY_NAME "' is out of sync."); - } else if (!GDMonoUtils::mono_cache.godot_api_cache_updated) { + } else if (!GDMonoCache::cached_data.godot_api_cache_updated) { ERR_PRINT("The loaded assembly '" CORE_API_ASSEMBLY_NAME "' is in sync, but the cache update failed."); } @@ -984,7 +1033,7 @@ Error GDMono::_unload_scripts_domain() { mono_gc_collect(mono_gc_max_generation()); - GDMonoUtils::clear_godot_api_cache(); + GDMonoCache::clear_godot_api_cache(); _domain_assemblies_cleanup(mono_domain_get_id(scripts_domain)); diff --git a/modules/mono/mono_gd/gd_mono.h b/modules/mono/mono_gd/gd_mono.h index e14a0d8409..7fb03b82ad 100644 --- a/modules/mono/mono_gd/gd_mono.h +++ b/modules/mono/mono_gd/gd_mono.h @@ -153,7 +153,8 @@ private: #ifdef TOOLS_ENABLED uint64_t api_editor_hash; #endif - void _initialize_and_check_api_hashes(); + void _init_godot_api_hashes(); + void _init_exception_policy(); GDMonoLog *gdmono_log; @@ -162,6 +163,7 @@ private: #endif void add_mono_shared_libs_dir_to_path(); + void determine_mono_dirs(String &r_assembly_rootdir, String &r_config_dir); protected: static GDMono *singleton; diff --git a/modules/mono/utils/android_utils.cpp b/modules/mono/mono_gd/gd_mono_android.cpp index 7dd67e3b8e..1ee035589d 100644 --- a/modules/mono/utils/android_utils.cpp +++ b/modules/mono/mono_gd/gd_mono_android.cpp @@ -1,5 +1,5 @@ /*************************************************************************/ -/* android_utils.cpp */ +/* gd_mono_android.cpp */ /*************************************************************************/ /* This file is part of: */ /* GODOT ENGINE */ @@ -28,16 +28,25 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ -#include "android_utils.h" +#include "gd_mono_android.h" -#ifdef __ANDROID__ +#if defined(ANDROID_ENABLED) +#include <dlfcn.h> // dlopen, dlsym +#include <mono/utils/mono-dl-fallback.h> + +#include "core/os/os.h" +#include "core/ustring.h" #include "platform/android/thread_jandroid.h" -namespace GDMonoUtils { -namespace Android { +#include "../utils/path_utils.h" +#include "../utils/string_utils.h" -String get_app_native_lib_dir() { +namespace GDMonoAndroid { + +String app_native_lib_dir_cache; + +String determine_app_native_lib_dir() { JNIEnv *env = ThreadAndroid::get_env(); jclass activityThreadClass = env->FindClass("android/app/ActivityThread"); @@ -62,7 +71,76 @@ String get_app_native_lib_dir() { return result; } -} // namespace Android -} // namespace GDMonoUtils +String get_app_native_lib_dir() { + if (app_native_lib_dir_cache.empty()) + app_native_lib_dir_cache = determine_app_native_lib_dir(); + return app_native_lib_dir_cache; +} + +int gd_mono_convert_dl_flags(int flags) { + // from mono's runtime-bootstrap.c + + int lflags = flags & MONO_DL_LOCAL ? 0 : RTLD_GLOBAL; + + if (flags & MONO_DL_LAZY) + lflags |= RTLD_LAZY; + else + lflags |= RTLD_NOW; + + return lflags; +} + +void *gd_mono_android_dlopen(const char *p_name, int p_flags, char **r_err, void *p_user_data) { + String name = String::utf8(p_name); + + if (name.ends_with(".dll.so") || name.ends_with(".exe.so")) { + String app_native_lib_dir = get_app_native_lib_dir(); + + String orig_so_name = name.get_file(); + String so_name = "lib-aot-" + orig_so_name; + String so_path = path::join(app_native_lib_dir, so_name); + + if (!FileAccess::exists(so_path)) { + if (OS::get_singleton()->is_stdout_verbose()) + OS::get_singleton()->print("Cannot find shared library: '%s'\n", so_path.utf8().get_data()); + return NULL; + } + + int lflags = gd_mono_convert_dl_flags(p_flags); + + void *handle = dlopen(so_path.utf8().get_data(), lflags); + + if (!handle) { + if (OS::get_singleton()->is_stdout_verbose()) + OS::get_singleton()->print("Failed to open shared library: '%s'. Error: '%s'\n", so_path.utf8().get_data(), dlerror()); + return NULL; + } + + if (OS::get_singleton()->is_stdout_verbose()) + OS::get_singleton()->print("Successfully loaded AOT shared library: '%s'\n", so_path.utf8().get_data()); + + return handle; + } + + return NULL; +} + +void *gd_mono_android_dlsym(void *p_handle, const char *p_name, char **r_err, void *p_user_data) { + void *sym_addr = dlsym(p_handle, p_name); + + if (sym_addr) + return sym_addr; + + if (r_err) + *r_err = str_format_new("%s\n", dlerror()); + + return NULL; +} + +void register_android_dl_fallback() { + mono_dl_fallback_register(gd_mono_android_dlopen, gd_mono_android_dlsym, NULL, NULL); +} + +} // namespace GDMonoAndroid -#endif // __ANDROID__ +#endif diff --git a/modules/mono/utils/android_utils.h b/modules/mono/mono_gd/gd_mono_android.h index f911c3fdfe..72bc799bfd 100644 --- a/modules/mono/utils/android_utils.h +++ b/modules/mono/mono_gd/gd_mono_android.h @@ -1,5 +1,5 @@ /*************************************************************************/ -/* android_utils.h */ +/* gd_mono_android.h */ /*************************************************************************/ /* This file is part of: */ /* GODOT ENGINE */ @@ -28,21 +28,21 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ -#ifndef ANDROID_UTILS_H -#define ANDROID_UTILS_H +#ifndef GD_MONO_ANDROID_H +#define GD_MONO_ANDROID_H -#ifdef __ANDROID__ +#if defined(ANDROID_ENABLED) #include "core/ustring.h" -namespace GDMonoUtils { -namespace Android { +namespace GDMonoAndroid { String get_app_native_lib_dir(); -} // namespace Android -} // namespace GDMonoUtils +void register_android_dl_fallback(); -#endif // __ANDROID__ +} // namespace GDMonoAndroid -#endif // ANDROID_UTILS_H +#endif // ANDROID_ENABLED + +#endif // GD_MONO_ANDROID_H diff --git a/modules/mono/mono_gd/gd_mono_assembly.cpp b/modules/mono/mono_gd/gd_mono_assembly.cpp index a82bb42731..105560fe9a 100644 --- a/modules/mono/mono_gd/gd_mono_assembly.cpp +++ b/modules/mono/mono_gd/gd_mono_assembly.cpp @@ -39,6 +39,7 @@ #include "core/project_settings.h" #include "../godotsharp_dirs.h" +#include "gd_mono_cache.h" #include "gd_mono_class.h" bool GDMonoAssembly::no_search = false; @@ -61,6 +62,13 @@ void GDMonoAssembly::fill_search_dirs(Vector<String> &r_search_dirs, const Strin r_search_dirs.push_back(framework_dir.plus_file("Facades")); } +#if !defined(TOOLS_ENABLED) + String data_game_assemblies_dir = GodotSharpDirs::get_data_game_assemblies_dir(); + if (!data_game_assemblies_dir.empty()) { + r_search_dirs.push_back(data_game_assemblies_dir); + } +#endif + if (p_custom_config.length()) { r_search_dirs.push_back(GodotSharpDirs::get_res_temp_assemblies_base_dir().plus_file(p_custom_config)); } else { @@ -146,10 +154,6 @@ MonoAssembly *GDMonoAssembly::_preload_hook(MonoAssemblyName *aname, char **, vo (void)user_data; // UNUSED - if (search_dirs.empty()) { - fill_search_dirs(search_dirs); - } - { // If we find the assembly here, we load it with 'mono_assembly_load_from_full', // which in turn invokes load hooks before returning the MonoAssembly to us. @@ -227,6 +231,33 @@ GDMonoAssembly *GDMonoAssembly::_load_assembly_search(const String &p_name, cons return NULL; } +String GDMonoAssembly::find_assembly(const String &p_name) { + + String path; + + bool has_extension = p_name.ends_with(".dll") || p_name.ends_with(".exe"); + + for (int i = 0; i < search_dirs.size(); i++) { + const String &search_dir = search_dirs[i]; + + if (has_extension) { + path = search_dir.plus_file(p_name); + if (FileAccess::exists(path)) + return path; + } else { + path = search_dir.plus_file(p_name + ".dll"); + if (FileAccess::exists(path)) + return path; + + path = search_dir.plus_file(p_name + ".exe"); + if (FileAccess::exists(path)) + return path; + } + } + + return String(); +} + GDMonoAssembly *GDMonoAssembly::_load_assembly_from(const String &p_name, const String &p_path, bool p_refonly) { GDMonoAssembly *assembly = memnew(GDMonoAssembly(p_name, p_path)); @@ -263,6 +294,8 @@ void GDMonoAssembly::_wrap_mono_assembly(MonoAssembly *assembly) { void GDMonoAssembly::initialize() { + fill_search_dirs(search_dirs); + mono_install_assembly_search_hook(&assembly_search_hook, NULL); mono_install_assembly_refonly_search_hook(&assembly_refonly_search_hook, NULL); mono_install_assembly_preload_hook(&assembly_preload_hook, NULL); diff --git a/modules/mono/mono_gd/gd_mono_assembly.h b/modules/mono/mono_gd/gd_mono_assembly.h index 39749dfc1d..04a219f742 100644 --- a/modules/mono/mono_gd/gd_mono_assembly.h +++ b/modules/mono/mono_gd/gd_mono_assembly.h @@ -122,6 +122,8 @@ public: GDMonoClass *get_object_derived_class(const StringName &p_class); + static String find_assembly(const String &p_name); + static void fill_search_dirs(Vector<String> &r_search_dirs, const String &p_custom_config = String(), const String &p_custom_bcl_dir = String()); static GDMonoAssembly *load_from(const String &p_name, const String &p_path, bool p_refonly); diff --git a/modules/mono/mono_gd/gd_mono_cache.cpp b/modules/mono/mono_gd/gd_mono_cache.cpp new file mode 100644 index 0000000000..caa1ca9203 --- /dev/null +++ b/modules/mono/mono_gd/gd_mono_cache.cpp @@ -0,0 +1,312 @@ +/*************************************************************************/ +/* gd_mono_cache.cpp */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ + +#include "gd_mono_cache.h" + +#include "gd_mono.h" +#include "gd_mono_class.h" +#include "gd_mono_marshal.h" +#include "gd_mono_method.h" +#include "gd_mono_utils.h" + +namespace GDMonoCache { + +CachedData cached_data; + +#define CACHE_AND_CHECK(m_var, m_val) \ + { \ + CRASH_COND(m_var != NULL); \ + m_var = m_val; \ + ERR_FAIL_COND_MSG(m_var == NULL, "Mono Cache: Member " #m_var " is null."); \ + } + +#define CACHE_CLASS_AND_CHECK(m_class, m_val) CACHE_AND_CHECK(cached_data.class_##m_class, m_val) +#define CACHE_NS_CLASS_AND_CHECK(m_ns, m_class, m_val) CACHE_AND_CHECK(cached_data.class_##m_ns##_##m_class, m_val) +#define CACHE_RAW_MONO_CLASS_AND_CHECK(m_class, m_val) CACHE_AND_CHECK(cached_data.rawclass_##m_class, m_val) +#define CACHE_FIELD_AND_CHECK(m_class, m_field, m_val) CACHE_AND_CHECK(cached_data.field_##m_class##_##m_field, m_val) +#define CACHE_METHOD_AND_CHECK(m_class, m_method, m_val) CACHE_AND_CHECK(cached_data.method_##m_class##_##m_method, m_val) +#define CACHE_PROPERTY_AND_CHECK(m_class, m_property, m_val) CACHE_AND_CHECK(cached_data.property_##m_class##_##m_property, m_val) + +#define CACHE_METHOD_THUNK_AND_CHECK_IMPL(m_var, m_val) \ + { \ + CRASH_COND(!m_var.is_null()); \ + ERR_FAIL_COND_MSG(m_val == NULL, "Mono Cache: Method for member " #m_var " is null."); \ + m_var.set_from_method(m_val); \ + ERR_FAIL_COND_MSG(m_var.is_null(), "Mono Cache: Member " #m_var " is null."); \ + } + +#define CACHE_METHOD_THUNK_AND_CHECK(m_class, m_method, m_val) CACHE_METHOD_THUNK_AND_CHECK_IMPL(cached_data.methodthunk_##m_class##_##m_method, m_val) + +void CachedData::clear_corlib_cache() { + + corlib_cache_updated = false; + + class_MonoObject = NULL; + class_bool = NULL; + class_int8_t = NULL; + class_int16_t = NULL; + class_int32_t = NULL; + class_int64_t = NULL; + class_uint8_t = NULL; + class_uint16_t = NULL; + class_uint32_t = NULL; + class_uint64_t = NULL; + class_float = NULL; + class_double = NULL; + class_String = NULL; + class_IntPtr = NULL; + + class_System_Collections_IEnumerable = NULL; + class_System_Collections_IDictionary = NULL; + +#ifdef DEBUG_ENABLED + class_System_Diagnostics_StackTrace = NULL; + methodthunk_System_Diagnostics_StackTrace_GetFrames.nullify(); + method_System_Diagnostics_StackTrace_ctor_bool = NULL; + method_System_Diagnostics_StackTrace_ctor_Exception_bool = NULL; +#endif + + class_KeyNotFoundException = NULL; +} + +void CachedData::clear_godot_api_cache() { + + godot_api_cache_updated = false; + + rawclass_Dictionary = NULL; + + class_Vector2 = NULL; + class_Rect2 = NULL; + class_Transform2D = NULL; + class_Vector3 = NULL; + class_Basis = NULL; + class_Quat = NULL; + class_Transform = NULL; + class_AABB = NULL; + class_Color = NULL; + class_Plane = NULL; + class_NodePath = NULL; + class_RID = NULL; + class_GodotObject = NULL; + class_GodotResource = NULL; + class_Node = NULL; + class_Control = NULL; + class_Spatial = NULL; + class_WeakRef = NULL; + class_Array = NULL; + class_Dictionary = NULL; + class_MarshalUtils = NULL; + class_ISerializationListener = NULL; + +#ifdef DEBUG_ENABLED + class_DebuggingUtils = NULL; + methodthunk_DebuggingUtils_GetStackFrameInfo.nullify(); +#endif + + class_ExportAttribute = NULL; + field_ExportAttribute_hint = NULL; + field_ExportAttribute_hintString = NULL; + class_SignalAttribute = NULL; + class_ToolAttribute = NULL; + class_RemoteAttribute = NULL; + class_SyncAttribute = NULL; + class_MasterAttribute = NULL; + class_PuppetAttribute = NULL; + class_SlaveAttribute = NULL; + class_RemoteSyncAttribute = NULL; + class_MasterSyncAttribute = NULL; + class_PuppetSyncAttribute = NULL; + class_GodotMethodAttribute = NULL; + field_GodotMethodAttribute_methodName = NULL; + + field_GodotObject_ptr = NULL; + field_NodePath_ptr = NULL; + field_Image_ptr = NULL; + field_RID_ptr = NULL; + + methodthunk_GodotObject_Dispose.nullify(); + methodthunk_Array_GetPtr.nullify(); + methodthunk_Dictionary_GetPtr.nullify(); + methodthunk_SignalAwaiter_SignalCallback.nullify(); + methodthunk_SignalAwaiter_FailureCallback.nullify(); + methodthunk_GodotTaskScheduler_Activate.nullify(); + + // Start of MarshalUtils methods + + methodthunk_MarshalUtils_TypeIsGenericArray.nullify(); + methodthunk_MarshalUtils_TypeIsGenericDictionary.nullify(); + + methodthunk_MarshalUtils_ArrayGetElementType.nullify(); + methodthunk_MarshalUtils_DictionaryGetKeyValueTypes.nullify(); + + methodthunk_MarshalUtils_GenericIEnumerableIsAssignableFromType.nullify(); + methodthunk_MarshalUtils_GenericIDictionaryIsAssignableFromType.nullify(); + methodthunk_MarshalUtils_GenericIEnumerableIsAssignableFromType_with_info.nullify(); + methodthunk_MarshalUtils_GenericIDictionaryIsAssignableFromType_with_info.nullify(); + + methodthunk_MarshalUtils_MakeGenericArrayType.nullify(); + methodthunk_MarshalUtils_MakeGenericDictionaryType.nullify(); + + methodthunk_MarshalUtils_EnumerableToArray.nullify(); + methodthunk_MarshalUtils_IDictionaryToDictionary.nullify(); + methodthunk_MarshalUtils_GenericIDictionaryToDictionary.nullify(); + + // End of MarshalUtils methods + + task_scheduler_handle = Ref<MonoGCHandle>(); +} + +#define GODOT_API_CLASS(m_class) (GDMono::get_singleton()->get_core_api_assembly()->get_class(BINDINGS_NAMESPACE, #m_class)) +#define GODOT_API_NS_CLASS(m_ns, m_class) (GDMono::get_singleton()->get_core_api_assembly()->get_class(m_ns, #m_class)) + +void update_corlib_cache() { + + CACHE_CLASS_AND_CHECK(MonoObject, GDMono::get_singleton()->get_corlib_assembly()->get_class(mono_get_object_class())); + CACHE_CLASS_AND_CHECK(bool, GDMono::get_singleton()->get_corlib_assembly()->get_class(mono_get_boolean_class())); + CACHE_CLASS_AND_CHECK(int8_t, GDMono::get_singleton()->get_corlib_assembly()->get_class(mono_get_sbyte_class())); + CACHE_CLASS_AND_CHECK(int16_t, GDMono::get_singleton()->get_corlib_assembly()->get_class(mono_get_int16_class())); + CACHE_CLASS_AND_CHECK(int32_t, GDMono::get_singleton()->get_corlib_assembly()->get_class(mono_get_int32_class())); + CACHE_CLASS_AND_CHECK(int64_t, GDMono::get_singleton()->get_corlib_assembly()->get_class(mono_get_int64_class())); + CACHE_CLASS_AND_CHECK(uint8_t, GDMono::get_singleton()->get_corlib_assembly()->get_class(mono_get_byte_class())); + CACHE_CLASS_AND_CHECK(uint16_t, GDMono::get_singleton()->get_corlib_assembly()->get_class(mono_get_uint16_class())); + CACHE_CLASS_AND_CHECK(uint32_t, GDMono::get_singleton()->get_corlib_assembly()->get_class(mono_get_uint32_class())); + CACHE_CLASS_AND_CHECK(uint64_t, GDMono::get_singleton()->get_corlib_assembly()->get_class(mono_get_uint64_class())); + CACHE_CLASS_AND_CHECK(float, GDMono::get_singleton()->get_corlib_assembly()->get_class(mono_get_single_class())); + CACHE_CLASS_AND_CHECK(double, GDMono::get_singleton()->get_corlib_assembly()->get_class(mono_get_double_class())); + CACHE_CLASS_AND_CHECK(String, GDMono::get_singleton()->get_corlib_assembly()->get_class(mono_get_string_class())); + CACHE_CLASS_AND_CHECK(IntPtr, GDMono::get_singleton()->get_corlib_assembly()->get_class(mono_get_intptr_class())); + + CACHE_CLASS_AND_CHECK(System_Collections_IEnumerable, GDMono::get_singleton()->get_corlib_assembly()->get_class("System.Collections", "IEnumerable")); + CACHE_CLASS_AND_CHECK(System_Collections_IDictionary, GDMono::get_singleton()->get_corlib_assembly()->get_class("System.Collections", "IDictionary")); + +#ifdef DEBUG_ENABLED + CACHE_CLASS_AND_CHECK(System_Diagnostics_StackTrace, GDMono::get_singleton()->get_corlib_assembly()->get_class("System.Diagnostics", "StackTrace")); + CACHE_METHOD_THUNK_AND_CHECK(System_Diagnostics_StackTrace, GetFrames, CACHED_CLASS(System_Diagnostics_StackTrace)->get_method("GetFrames")); + CACHE_METHOD_AND_CHECK(System_Diagnostics_StackTrace, ctor_bool, CACHED_CLASS(System_Diagnostics_StackTrace)->get_method_with_desc("System.Diagnostics.StackTrace:.ctor(bool)", true)); + CACHE_METHOD_AND_CHECK(System_Diagnostics_StackTrace, ctor_Exception_bool, CACHED_CLASS(System_Diagnostics_StackTrace)->get_method_with_desc("System.Diagnostics.StackTrace:.ctor(System.Exception,bool)", true)); +#endif + + CACHE_CLASS_AND_CHECK(KeyNotFoundException, GDMono::get_singleton()->get_corlib_assembly()->get_class("System.Collections.Generic", "KeyNotFoundException")); + + cached_data.corlib_cache_updated = true; +} + +void update_godot_api_cache() { + + CACHE_CLASS_AND_CHECK(Vector2, GODOT_API_CLASS(Vector2)); + CACHE_CLASS_AND_CHECK(Rect2, GODOT_API_CLASS(Rect2)); + CACHE_CLASS_AND_CHECK(Transform2D, GODOT_API_CLASS(Transform2D)); + CACHE_CLASS_AND_CHECK(Vector3, GODOT_API_CLASS(Vector3)); + CACHE_CLASS_AND_CHECK(Basis, GODOT_API_CLASS(Basis)); + CACHE_CLASS_AND_CHECK(Quat, GODOT_API_CLASS(Quat)); + CACHE_CLASS_AND_CHECK(Transform, GODOT_API_CLASS(Transform)); + CACHE_CLASS_AND_CHECK(AABB, GODOT_API_CLASS(AABB)); + CACHE_CLASS_AND_CHECK(Color, GODOT_API_CLASS(Color)); + CACHE_CLASS_AND_CHECK(Plane, GODOT_API_CLASS(Plane)); + CACHE_CLASS_AND_CHECK(NodePath, GODOT_API_CLASS(NodePath)); + CACHE_CLASS_AND_CHECK(RID, GODOT_API_CLASS(RID)); + CACHE_CLASS_AND_CHECK(GodotObject, GODOT_API_CLASS(Object)); + CACHE_CLASS_AND_CHECK(GodotResource, GODOT_API_CLASS(Resource)); + CACHE_CLASS_AND_CHECK(Node, GODOT_API_CLASS(Node)); + CACHE_CLASS_AND_CHECK(Control, GODOT_API_CLASS(Control)); + CACHE_CLASS_AND_CHECK(Spatial, GODOT_API_CLASS(Spatial)); + CACHE_CLASS_AND_CHECK(WeakRef, GODOT_API_CLASS(WeakRef)); + CACHE_CLASS_AND_CHECK(Array, GODOT_API_NS_CLASS(BINDINGS_NAMESPACE_COLLECTIONS, Array)); + CACHE_CLASS_AND_CHECK(Dictionary, GODOT_API_NS_CLASS(BINDINGS_NAMESPACE_COLLECTIONS, Dictionary)); + CACHE_CLASS_AND_CHECK(MarshalUtils, GODOT_API_CLASS(MarshalUtils)); + CACHE_CLASS_AND_CHECK(ISerializationListener, GODOT_API_CLASS(ISerializationListener)); + +#ifdef DEBUG_ENABLED + CACHE_CLASS_AND_CHECK(DebuggingUtils, GODOT_API_CLASS(DebuggingUtils)); +#endif + + // Attributes + CACHE_CLASS_AND_CHECK(ExportAttribute, GODOT_API_CLASS(ExportAttribute)); + CACHE_FIELD_AND_CHECK(ExportAttribute, hint, CACHED_CLASS(ExportAttribute)->get_field("hint")); + CACHE_FIELD_AND_CHECK(ExportAttribute, hintString, CACHED_CLASS(ExportAttribute)->get_field("hintString")); + CACHE_CLASS_AND_CHECK(SignalAttribute, GODOT_API_CLASS(SignalAttribute)); + CACHE_CLASS_AND_CHECK(ToolAttribute, GODOT_API_CLASS(ToolAttribute)); + CACHE_CLASS_AND_CHECK(RemoteAttribute, GODOT_API_CLASS(RemoteAttribute)); + CACHE_CLASS_AND_CHECK(SyncAttribute, GODOT_API_CLASS(SyncAttribute)); + CACHE_CLASS_AND_CHECK(MasterAttribute, GODOT_API_CLASS(MasterAttribute)); + CACHE_CLASS_AND_CHECK(PuppetAttribute, GODOT_API_CLASS(PuppetAttribute)); + CACHE_CLASS_AND_CHECK(SlaveAttribute, GODOT_API_CLASS(SlaveAttribute)); + CACHE_CLASS_AND_CHECK(RemoteSyncAttribute, GODOT_API_CLASS(RemoteSyncAttribute)); + CACHE_CLASS_AND_CHECK(MasterSyncAttribute, GODOT_API_CLASS(MasterSyncAttribute)); + CACHE_CLASS_AND_CHECK(PuppetSyncAttribute, GODOT_API_CLASS(PuppetSyncAttribute)); + CACHE_CLASS_AND_CHECK(GodotMethodAttribute, GODOT_API_CLASS(GodotMethodAttribute)); + CACHE_FIELD_AND_CHECK(GodotMethodAttribute, methodName, CACHED_CLASS(GodotMethodAttribute)->get_field("methodName")); + + CACHE_FIELD_AND_CHECK(GodotObject, ptr, CACHED_CLASS(GodotObject)->get_field(BINDINGS_PTR_FIELD)); + CACHE_FIELD_AND_CHECK(NodePath, ptr, CACHED_CLASS(NodePath)->get_field(BINDINGS_PTR_FIELD)); + CACHE_FIELD_AND_CHECK(RID, ptr, CACHED_CLASS(RID)->get_field(BINDINGS_PTR_FIELD)); + + CACHE_METHOD_THUNK_AND_CHECK(GodotObject, Dispose, CACHED_CLASS(GodotObject)->get_method("Dispose", 0)); + CACHE_METHOD_THUNK_AND_CHECK(Array, GetPtr, GODOT_API_NS_CLASS(BINDINGS_NAMESPACE_COLLECTIONS, Array)->get_method("GetPtr", 0)); + CACHE_METHOD_THUNK_AND_CHECK(Dictionary, GetPtr, GODOT_API_NS_CLASS(BINDINGS_NAMESPACE_COLLECTIONS, Dictionary)->get_method("GetPtr", 0)); + CACHE_METHOD_THUNK_AND_CHECK(SignalAwaiter, SignalCallback, GODOT_API_CLASS(SignalAwaiter)->get_method("SignalCallback", 1)); + CACHE_METHOD_THUNK_AND_CHECK(SignalAwaiter, FailureCallback, GODOT_API_CLASS(SignalAwaiter)->get_method("FailureCallback", 0)); + CACHE_METHOD_THUNK_AND_CHECK(GodotTaskScheduler, Activate, GODOT_API_CLASS(GodotTaskScheduler)->get_method("Activate", 0)); + + // Start of MarshalUtils methods + + CACHE_METHOD_THUNK_AND_CHECK(MarshalUtils, TypeIsGenericArray, GODOT_API_CLASS(MarshalUtils)->get_method("TypeIsGenericArray", 1)); + CACHE_METHOD_THUNK_AND_CHECK(MarshalUtils, TypeIsGenericDictionary, GODOT_API_CLASS(MarshalUtils)->get_method("TypeIsGenericDictionary", 1)); + + CACHE_METHOD_THUNK_AND_CHECK(MarshalUtils, ArrayGetElementType, GODOT_API_CLASS(MarshalUtils)->get_method("ArrayGetElementType", 2)); + CACHE_METHOD_THUNK_AND_CHECK(MarshalUtils, DictionaryGetKeyValueTypes, GODOT_API_CLASS(MarshalUtils)->get_method("DictionaryGetKeyValueTypes", 3)); + + CACHE_METHOD_THUNK_AND_CHECK(MarshalUtils, GenericIEnumerableIsAssignableFromType, GODOT_API_CLASS(MarshalUtils)->get_method("GenericIEnumerableIsAssignableFromType", 1)); + CACHE_METHOD_THUNK_AND_CHECK(MarshalUtils, GenericIDictionaryIsAssignableFromType, GODOT_API_CLASS(MarshalUtils)->get_method("GenericIDictionaryIsAssignableFromType", 1)); + CACHE_METHOD_THUNK_AND_CHECK(MarshalUtils, GenericIEnumerableIsAssignableFromType_with_info, GODOT_API_CLASS(MarshalUtils)->get_method("GenericIEnumerableIsAssignableFromType", 2)); + CACHE_METHOD_THUNK_AND_CHECK(MarshalUtils, GenericIDictionaryIsAssignableFromType_with_info, GODOT_API_CLASS(MarshalUtils)->get_method("GenericIDictionaryIsAssignableFromType", 3)); + + CACHE_METHOD_THUNK_AND_CHECK(MarshalUtils, MakeGenericArrayType, GODOT_API_CLASS(MarshalUtils)->get_method("MakeGenericArrayType", 1)); + CACHE_METHOD_THUNK_AND_CHECK(MarshalUtils, MakeGenericDictionaryType, GODOT_API_CLASS(MarshalUtils)->get_method("MakeGenericDictionaryType", 2)); + + CACHE_METHOD_THUNK_AND_CHECK(MarshalUtils, EnumerableToArray, GODOT_API_CLASS(MarshalUtils)->get_method("EnumerableToArray", 2)); + CACHE_METHOD_THUNK_AND_CHECK(MarshalUtils, IDictionaryToDictionary, GODOT_API_CLASS(MarshalUtils)->get_method("IDictionaryToDictionary", 2)); + CACHE_METHOD_THUNK_AND_CHECK(MarshalUtils, GenericIDictionaryToDictionary, GODOT_API_CLASS(MarshalUtils)->get_method("GenericIDictionaryToDictionary", 2)); + + // End of MarshalUtils methods + +#ifdef DEBUG_ENABLED + CACHE_METHOD_THUNK_AND_CHECK(DebuggingUtils, GetStackFrameInfo, GODOT_API_CLASS(DebuggingUtils)->get_method("GetStackFrameInfo", 4)); +#endif + + // TODO Move to CSharpLanguage::init() and do handle disposal + MonoObject *task_scheduler = mono_object_new(mono_domain_get(), GODOT_API_CLASS(GodotTaskScheduler)->get_mono_ptr()); + GDMonoUtils::runtime_object_init(task_scheduler, GODOT_API_CLASS(GodotTaskScheduler)); + cached_data.task_scheduler_handle = MonoGCHandle::create_strong(task_scheduler); + + cached_data.godot_api_cache_updated = true; +} + +} // namespace GDMonoCache diff --git a/modules/mono/mono_gd/gd_mono_cache.h b/modules/mono/mono_gd/gd_mono_cache.h new file mode 100644 index 0000000000..b21f92cdd8 --- /dev/null +++ b/modules/mono/mono_gd/gd_mono_cache.h @@ -0,0 +1,204 @@ +/*************************************************************************/ +/* gd_mono_cache.h */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ + +#ifndef GD_MONO_CACHE_H +#define GD_MONO_CACHE_H + +#include "gd_mono_header.h" +#include "gd_mono_method_thunk.h" + +namespace GDMonoCache { + +struct CachedData { + + // ----------------------------------------------- + // corlib classes + + // Let's use the no-namespace format for these too + GDMonoClass *class_MonoObject; + GDMonoClass *class_bool; + GDMonoClass *class_int8_t; + GDMonoClass *class_int16_t; + GDMonoClass *class_int32_t; + GDMonoClass *class_int64_t; + GDMonoClass *class_uint8_t; + GDMonoClass *class_uint16_t; + GDMonoClass *class_uint32_t; + GDMonoClass *class_uint64_t; + GDMonoClass *class_float; + GDMonoClass *class_double; + GDMonoClass *class_String; + GDMonoClass *class_IntPtr; + + GDMonoClass *class_System_Collections_IEnumerable; + GDMonoClass *class_System_Collections_IDictionary; + +#ifdef DEBUG_ENABLED + GDMonoClass *class_System_Diagnostics_StackTrace; + GDMonoMethodThunkR<MonoArray *, MonoObject *> methodthunk_System_Diagnostics_StackTrace_GetFrames; + GDMonoMethod *method_System_Diagnostics_StackTrace_ctor_bool; + GDMonoMethod *method_System_Diagnostics_StackTrace_ctor_Exception_bool; +#endif + + GDMonoClass *class_KeyNotFoundException; + + MonoClass *rawclass_Dictionary; + // ----------------------------------------------- + + GDMonoClass *class_Vector2; + GDMonoClass *class_Rect2; + GDMonoClass *class_Transform2D; + GDMonoClass *class_Vector3; + GDMonoClass *class_Basis; + GDMonoClass *class_Quat; + GDMonoClass *class_Transform; + GDMonoClass *class_AABB; + GDMonoClass *class_Color; + GDMonoClass *class_Plane; + GDMonoClass *class_NodePath; + GDMonoClass *class_RID; + GDMonoClass *class_GodotObject; + GDMonoClass *class_GodotResource; + GDMonoClass *class_Node; + GDMonoClass *class_Control; + GDMonoClass *class_Spatial; + GDMonoClass *class_WeakRef; + GDMonoClass *class_Array; + GDMonoClass *class_Dictionary; + GDMonoClass *class_MarshalUtils; + GDMonoClass *class_ISerializationListener; + +#ifdef DEBUG_ENABLED + GDMonoClass *class_DebuggingUtils; + GDMonoMethodThunk<MonoObject *, MonoString **, int *, MonoString **> methodthunk_DebuggingUtils_GetStackFrameInfo; +#endif + + GDMonoClass *class_ExportAttribute; + GDMonoField *field_ExportAttribute_hint; + GDMonoField *field_ExportAttribute_hintString; + GDMonoClass *class_SignalAttribute; + GDMonoClass *class_ToolAttribute; + GDMonoClass *class_RemoteAttribute; + GDMonoClass *class_SyncAttribute; + GDMonoClass *class_RemoteSyncAttribute; + GDMonoClass *class_MasterSyncAttribute; + GDMonoClass *class_PuppetSyncAttribute; + GDMonoClass *class_MasterAttribute; + GDMonoClass *class_PuppetAttribute; + GDMonoClass *class_SlaveAttribute; + GDMonoClass *class_GodotMethodAttribute; + GDMonoField *field_GodotMethodAttribute_methodName; + + GDMonoField *field_GodotObject_ptr; + GDMonoField *field_NodePath_ptr; + GDMonoField *field_Image_ptr; + GDMonoField *field_RID_ptr; + + GDMonoMethodThunk<MonoObject *> methodthunk_GodotObject_Dispose; + GDMonoMethodThunkR<Array *, MonoObject *> methodthunk_Array_GetPtr; + GDMonoMethodThunkR<Dictionary *, MonoObject *> methodthunk_Dictionary_GetPtr; + GDMonoMethodThunk<MonoObject *, MonoArray *> methodthunk_SignalAwaiter_SignalCallback; + GDMonoMethodThunk<MonoObject *> methodthunk_SignalAwaiter_FailureCallback; + GDMonoMethodThunk<MonoObject *> methodthunk_GodotTaskScheduler_Activate; + + // Start of MarshalUtils methods + + GDMonoMethodThunkR<MonoBoolean, MonoReflectionType *> methodthunk_MarshalUtils_TypeIsGenericArray; + GDMonoMethodThunkR<MonoBoolean, MonoReflectionType *> methodthunk_MarshalUtils_TypeIsGenericDictionary; + + GDMonoMethodThunk<MonoReflectionType *, MonoReflectionType **> methodthunk_MarshalUtils_ArrayGetElementType; + GDMonoMethodThunk<MonoReflectionType *, MonoReflectionType **, MonoReflectionType **> methodthunk_MarshalUtils_DictionaryGetKeyValueTypes; + + GDMonoMethodThunkR<MonoBoolean, MonoReflectionType *> methodthunk_MarshalUtils_GenericIEnumerableIsAssignableFromType; + GDMonoMethodThunkR<MonoBoolean, MonoReflectionType *> methodthunk_MarshalUtils_GenericIDictionaryIsAssignableFromType; + GDMonoMethodThunkR<MonoBoolean, MonoReflectionType *, MonoReflectionType **> methodthunk_MarshalUtils_GenericIEnumerableIsAssignableFromType_with_info; + GDMonoMethodThunkR<MonoBoolean, MonoReflectionType *, MonoReflectionType **, MonoReflectionType **> methodthunk_MarshalUtils_GenericIDictionaryIsAssignableFromType_with_info; + + GDMonoMethodThunkR<MonoReflectionType *, MonoReflectionType *> methodthunk_MarshalUtils_MakeGenericArrayType; + GDMonoMethodThunkR<MonoReflectionType *, MonoReflectionType *, MonoReflectionType *> methodthunk_MarshalUtils_MakeGenericDictionaryType; + + GDMonoMethodThunk<MonoObject *, Array *> methodthunk_MarshalUtils_EnumerableToArray; + GDMonoMethodThunk<MonoObject *, Dictionary *> methodthunk_MarshalUtils_IDictionaryToDictionary; + GDMonoMethodThunk<MonoObject *, Dictionary *> methodthunk_MarshalUtils_GenericIDictionaryToDictionary; + + // End of MarshalUtils methods + + Ref<MonoGCHandle> task_scheduler_handle; + + bool corlib_cache_updated; + bool godot_api_cache_updated; + + void clear_corlib_cache(); + void clear_godot_api_cache(); + + CachedData() { + clear_corlib_cache(); + clear_godot_api_cache(); + } +}; + +extern CachedData cached_data; + +void update_corlib_cache(); +void update_godot_api_cache(); + +inline void clear_corlib_cache() { + cached_data.clear_corlib_cache(); +} + +inline void clear_godot_api_cache() { + cached_data.clear_godot_api_cache(); +} + +_FORCE_INLINE_ bool tools_godot_api_check() { +#ifdef TOOLS_ENABLED + return cached_data.godot_api_cache_updated; +#else + return true; // Assume it's updated if this was called, otherwise it's a bug +#endif +} + +} // namespace GDMonoCache + +#define CACHED_CLASS(m_class) (GDMonoCache::cached_data.class_##m_class) +#define CACHED_CLASS_RAW(m_class) (GDMonoCache::cached_data.class_##m_class->get_mono_ptr()) +#define CACHED_RAW_MONO_CLASS(m_class) (GDMonoCache::cached_data.rawclass_##m_class) +#define CACHED_FIELD(m_class, m_field) (GDMonoCache::cached_data.field_##m_class##_##m_field) +#define CACHED_METHOD(m_class, m_method) (GDMonoCache::cached_data.method_##m_class##_##m_method) +#define CACHED_METHOD_THUNK(m_class, m_method) (GDMonoCache::cached_data.methodthunk_##m_class##_##m_method) +#define CACHED_PROPERTY(m_class, m_property) (GDMonoCache::cached_data.property_##m_class##_##m_property) + +#ifdef REAL_T_IS_DOUBLE +#define REAL_T_MONOCLASS CACHED_CLASS_RAW(double) +#else +#define REAL_T_MONOCLASS CACHED_CLASS_RAW(float) +#endif + +#endif // GD_MONO_CACHE_H diff --git a/modules/mono/mono_gd/gd_mono_class.cpp b/modules/mono/mono_gd/gd_mono_class.cpp index 89a88fcfb2..fb9b6be3d4 100644 --- a/modules/mono/mono_gd/gd_mono_class.cpp +++ b/modules/mono/mono_gd/gd_mono_class.cpp @@ -33,6 +33,7 @@ #include <mono/metadata/attrdefs.h> #include "gd_mono_assembly.h" +#include "gd_mono_cache.h" #include "gd_mono_marshal.h" String GDMonoClass::get_full_name(MonoClass *p_mono_class) { @@ -332,12 +333,6 @@ GDMonoMethod *GDMonoClass::get_method_with_desc(const String &p_description, boo return get_method(method); } -void *GDMonoClass::get_method_thunk(const StringName &p_name, int p_params_count) { - - GDMonoMethod *method = get_method(p_name, p_params_count); - return method ? method->get_thunk() : NULL; -} - GDMonoField *GDMonoClass::get_field(const StringName &p_name) { Map<StringName, GDMonoField *>::Element *result = fields.find(p_name); diff --git a/modules/mono/mono_gd/gd_mono_class.h b/modules/mono/mono_gd/gd_mono_class.h index 40e1574927..562c337822 100644 --- a/modules/mono/mono_gd/gd_mono_class.h +++ b/modules/mono/mono_gd/gd_mono_class.h @@ -144,8 +144,6 @@ public: GDMonoMethod *get_method(MonoMethod *p_raw_method, const StringName &p_name, int p_params_count); GDMonoMethod *get_method_with_desc(const String &p_description, bool p_include_namespace); - void *get_method_thunk(const StringName &p_name, int p_params_count = 0); - GDMonoField *get_field(const StringName &p_name); const Vector<GDMonoField *> &get_all_fields(); diff --git a/modules/mono/mono_gd/gd_mono_field.cpp b/modules/mono/mono_gd/gd_mono_field.cpp index 7b8e6f89e9..d84359b1ab 100644 --- a/modules/mono/mono_gd/gd_mono_field.cpp +++ b/modules/mono/mono_gd/gd_mono_field.cpp @@ -32,8 +32,10 @@ #include <mono/metadata/attrdefs.h> +#include "gd_mono_cache.h" #include "gd_mono_class.h" #include "gd_mono_marshal.h" +#include "gd_mono_utils.h" void GDMonoField::set_value_raw(MonoObject *p_object, void *p_ptr) { mono_field_set_value(p_object, mono_field, &p_ptr); @@ -337,7 +339,7 @@ void GDMonoField::set_value_from_variant(MonoObject *p_object, const Variant &p_ } if (type_class->implements_interface(CACHED_CLASS(System_Collections_IEnumerable))) { - if (GDMonoUtils::tools_godot_api_check()) { + if (GDMonoCache::tools_godot_api_check()) { MonoObject *managed = GDMonoUtils::create_managed_from(p_value.operator Array(), CACHED_CLASS(Array)); mono_field_set_value(p_object, mono_field, managed); break; @@ -491,7 +493,7 @@ void GDMonoField::set_value_from_variant(MonoObject *p_object, const Variant &p_ } if (type.type_class->implements_interface(CACHED_CLASS(System_Collections_IEnumerable))) { - if (GDMonoUtils::tools_godot_api_check()) { + if (GDMonoCache::tools_godot_api_check()) { MonoObject *managed = GDMonoUtils::create_managed_from(p_value.operator Array(), CACHED_CLASS(Array)); mono_field_set_value(p_object, mono_field, managed); break; diff --git a/modules/mono/mono_gd/gd_mono_header.h b/modules/mono/mono_gd/gd_mono_header.h index d7962eac8b..173e1613bf 100644 --- a/modules/mono/mono_gd/gd_mono_header.h +++ b/modules/mono/mono_gd/gd_mono_header.h @@ -33,6 +33,12 @@ #include "core/int_types.h" +#ifdef WIN32 +#define GD_MONO_STDCALL __stdcall +#else +#define GD_MONO_STDCALL +#endif + class GDMonoAssembly; class GDMonoClass; class GDMonoField; diff --git a/modules/mono/mono_gd/gd_mono_log.cpp b/modules/mono/mono_gd/gd_mono_log.cpp index 7b3421fdb3..261b800619 100644 --- a/modules/mono/mono_gd/gd_mono_log.cpp +++ b/modules/mono/mono_gd/gd_mono_log.cpp @@ -30,7 +30,6 @@ #include "gd_mono_log.h" -#include <mono/utils/mono-logger.h> #include <stdlib.h> // abort #include "core/os/dir_access.h" @@ -39,7 +38,19 @@ #include "../godotsharp_dirs.h" #include "../utils/string_utils.h" -static int log_level_get_id(const char *p_log_level) { +static CharString get_default_log_level() { +#ifdef DEBUG_ENABLED + return String("info").utf8(); +#else + return String("warning").utf8(); +#endif +} + +GDMonoLog *GDMonoLog::singleton = NULL; + +#if !defined(JAVASCRIPT_ENABLED) + +static int get_log_level_id(const char *p_log_level) { const char *valid_log_levels[] = { "error", "critical", "warning", "message", "info", "debug", NULL }; @@ -53,11 +64,11 @@ static int log_level_get_id(const char *p_log_level) { return -1; } -static void mono_log_callback(const char *log_domain, const char *log_level, const char *message, mono_bool fatal, void *user_data) { +void GDMonoLog::mono_log_callback(const char *log_domain, const char *log_level, const char *message, mono_bool fatal, void *) { - FileAccess *f = GDMonoLog::get_singleton()->get_log_file(); + FileAccess *f = GDMonoLog::get_singleton()->log_file; - if (GDMonoLog::get_singleton()->get_log_level_id() >= log_level_get_id(log_level)) { + if (GDMonoLog::get_singleton()->log_level_id >= get_log_level_id(log_level)) { String text(message); text += " (in domain "; text += log_domain; @@ -72,7 +83,7 @@ static void mono_log_callback(const char *log_domain, const char *log_level, con } if (fatal) { - ERR_PRINTS("Mono: FATAL ERROR, ABORTING! Logfile: '" + GDMonoLog::get_singleton()->get_log_file_path() + "'."); + ERR_PRINTS("Mono: FATAL ERROR, ABORTING! Logfile: '" + GDMonoLog::get_singleton()->log_file_path + "'."); // Make sure to flush before aborting f->flush(); f->close(); @@ -82,8 +93,6 @@ static void mono_log_callback(const char *log_domain, const char *log_level, con } } -GDMonoLog *GDMonoLog::singleton = NULL; - bool GDMonoLog::_try_create_logs_dir(const String &p_logs_dir) { if (!DirAccess::exists(p_logs_dir)) { @@ -129,17 +138,13 @@ void GDMonoLog::initialize() { CharString log_level = OS::get_singleton()->get_environment("GODOT_MONO_LOG_LEVEL").utf8(); - if (log_level.length() != 0 && log_level_get_id(log_level.get_data()) == -1) { + if (log_level.length() != 0 && get_log_level_id(log_level.get_data()) == -1) { ERR_PRINTS(String() + "Mono: Ignoring invalid log level (GODOT_MONO_LOG_LEVEL): '" + log_level.get_data() + "'."); log_level = CharString(); } if (log_level.length() == 0) { -#ifdef DEBUG_ENABLED - log_level = String("info").utf8(); -#else - log_level = String("warning").utf8(); -#endif + log_level = get_default_log_level(); } String logs_dir = GodotSharpDirs::get_mono_logs_dir(); @@ -149,11 +154,14 @@ void GDMonoLog::initialize() { OS::Date date_now = OS::get_singleton()->get_date(); OS::Time time_now = OS::get_singleton()->get_time(); - int pid = OS::get_singleton()->get_process_id(); - String log_file_name = str_format("%d_%02d_%02d %02d.%02d.%02d (%d).txt", + String log_file_name = str_format("%d_%02d_%02d %02d.%02d.%02d", date_now.year, date_now.month, date_now.day, - time_now.hour, time_now.min, time_now.sec, pid); + time_now.hour, time_now.min, time_now.sec); + + log_file_name += str_format(" (%d)", OS::get_singleton()->get_process_id()); + + log_file_name += ".txt"; log_file_path = logs_dir.plus_file(log_file_name); @@ -164,7 +172,7 @@ void GDMonoLog::initialize() { } mono_trace_set_level_string(log_level.get_data()); - log_level_id = log_level_get_id(log_level.get_data()); + log_level_id = get_log_level_id(log_level.get_data()); if (log_file) { OS::get_singleton()->print("Mono: Logfile is: %s\n", log_file_path.utf8().get_data()); @@ -190,3 +198,22 @@ GDMonoLog::~GDMonoLog() { memdelete(log_file); } } + +#else + +void GDMonoLog::initialize() { + CharString log_level = get_default_log_level(); + mono_trace_set_level_string(log_level.get_data()); +} + +GDMonoLog::GDMonoLog() { + + singleton = this; +} + +GDMonoLog::~GDMonoLog() { + + singleton = NULL; +} + +#endif // !defined(JAVASCRIPT_ENABLED) diff --git a/modules/mono/mono_gd/gd_mono_log.h b/modules/mono/mono_gd/gd_mono_log.h index 91d0557aa3..4cd5a662fb 100644 --- a/modules/mono/mono_gd/gd_mono_log.h +++ b/modules/mono/mono_gd/gd_mono_log.h @@ -31,10 +31,17 @@ #ifndef GD_MONO_LOG_H #define GD_MONO_LOG_H +#include <mono/utils/mono-logger.h> + +#include "core/typedefs.h" + +#if !defined(JAVASCRIPT_ENABLED) #include "core/os/file_access.h" +#endif class GDMonoLog { +#if !defined(JAVASCRIPT_ENABLED) int log_level_id; FileAccess *log_file; @@ -43,6 +50,9 @@ class GDMonoLog { bool _try_create_logs_dir(const String &p_logs_dir); void _delete_old_log_files(const String &p_logs_dir); + static void mono_log_callback(const char *log_domain, const char *log_level, const char *message, mono_bool fatal, void *user_data); +#endif + static GDMonoLog *singleton; public: @@ -50,10 +60,6 @@ public: void initialize(); - _FORCE_INLINE_ FileAccess *get_log_file() { return log_file; } - _FORCE_INLINE_ String get_log_file_path() { return log_file_path; } - _FORCE_INLINE_ int get_log_level_id() { return log_level_id; } - GDMonoLog(); ~GDMonoLog(); }; diff --git a/modules/mono/mono_gd/gd_mono_marshal.cpp b/modules/mono/mono_gd/gd_mono_marshal.cpp index 7aac691102..3827960e6b 100644 --- a/modules/mono/mono_gd/gd_mono_marshal.cpp +++ b/modules/mono/mono_gd/gd_mono_marshal.cpp @@ -31,6 +31,7 @@ #include "gd_mono_marshal.h" #include "gd_mono.h" +#include "gd_mono_cache.h" #include "gd_mono_class.h" namespace GDMonoMarshal { @@ -556,7 +557,7 @@ MonoObject *variant_to_mono_object(const Variant *p_var, const ManagedType &p_ty } if (type_class->implements_interface(CACHED_CLASS(System_Collections_IEnumerable))) { - if (GDMonoUtils::tools_godot_api_check()) { + if (GDMonoCache::tools_godot_api_check()) { return GDMonoUtils::create_managed_from(p_var->operator Array(), CACHED_CLASS(Array)); } else { return (MonoObject *)GDMonoMarshal::Array_to_mono_array(p_var->operator Array()); @@ -683,7 +684,7 @@ MonoObject *variant_to_mono_object(const Variant *p_var, const ManagedType &p_ty } if (p_type.type_class->implements_interface(CACHED_CLASS(System_Collections_IEnumerable))) { - if (GDMonoUtils::tools_godot_api_check()) { + if (GDMonoCache::tools_godot_api_check()) { return GDMonoUtils::create_managed_from(p_var->operator Array(), CACHED_CLASS(Array)); } else { return (MonoObject *)GDMonoMarshal::Array_to_mono_array(p_var->operator Array()); @@ -834,14 +835,14 @@ Variant mono_object_to_variant(MonoObject *p_obj) { if (CACHED_CLASS(Array) == type_class) { MonoException *exc = NULL; - Array *ptr = invoke_method_thunk(CACHED_METHOD_THUNK(Array, GetPtr), p_obj, &exc); + Array *ptr = CACHED_METHOD_THUNK(Array, GetPtr).invoke(p_obj, &exc); UNHANDLED_EXCEPTION(exc); return ptr ? Variant(*ptr) : Variant(); } if (CACHED_CLASS(Dictionary) == type_class) { MonoException *exc = NULL; - Dictionary *ptr = invoke_method_thunk(CACHED_METHOD_THUNK(Dictionary, GetPtr), p_obj, &exc); + Dictionary *ptr = CACHED_METHOD_THUNK(Dictionary, GetPtr).invoke(p_obj, &exc); UNHANDLED_EXCEPTION(exc); return ptr ? Variant(*ptr) : Variant(); } diff --git a/modules/mono/mono_gd/gd_mono_marshal.h b/modules/mono/mono_gd/gd_mono_marshal.h index 3fa958ac32..53eae45320 100644 --- a/modules/mono/mono_gd/gd_mono_marshal.h +++ b/modules/mono/mono_gd/gd_mono_marshal.h @@ -43,6 +43,11 @@ T unbox(MonoObject *p_obj) { return *(T *)mono_object_unbox(p_obj); } +template <typename T> +T *unbox_addr(MonoObject *p_obj) { + return (T *)mono_object_unbox(p_obj); +} + #define BOX_DOUBLE(x) mono_value_box(mono_domain_get(), CACHED_CLASS_RAW(double), &x) #define BOX_FLOAT(x) mono_value_box(mono_domain_get(), CACHED_CLASS_RAW(float), &x) #define BOX_INT64(x) mono_value_box(mono_domain_get(), CACHED_CLASS_RAW(int64_t), &x) diff --git a/modules/mono/mono_gd/gd_mono_method.cpp b/modules/mono/mono_gd/gd_mono_method.cpp index 968b316a3e..080b3a676a 100644 --- a/modules/mono/mono_gd/gd_mono_method.cpp +++ b/modules/mono/mono_gd/gd_mono_method.cpp @@ -30,8 +30,10 @@ #include "gd_mono_method.h" +#include "gd_mono_cache.h" #include "gd_mono_class.h" #include "gd_mono_marshal.h" +#include "gd_mono_utils.h" #include <mono/metadata/attrdefs.h> @@ -99,10 +101,6 @@ IMonoClassMember::Visibility GDMonoMethod::get_visibility() { } } -void *GDMonoMethod::get_thunk() { - return mono_method_get_unmanaged_thunk(mono_method); -} - MonoObject *GDMonoMethod::invoke(MonoObject *p_object, const Variant **p_params, MonoException **r_exc) { if (get_return_type().type_encoding != MONO_TYPE_VOID || get_parameters_count() > 0) { MonoArray *params = mono_array_new(mono_domain_get(), CACHED_CLASS_RAW(MonoObject), get_parameters_count()); diff --git a/modules/mono/mono_gd/gd_mono_method.h b/modules/mono/mono_gd/gd_mono_method.h index 2fc8628f27..abbae92e29 100644 --- a/modules/mono/mono_gd/gd_mono_method.h +++ b/modules/mono/mono_gd/gd_mono_method.h @@ -71,11 +71,11 @@ public: virtual MonoObject *get_attribute(GDMonoClass *p_attr_class) GD_FINAL; void fetch_attributes(); + _FORCE_INLINE_ MonoMethod *get_mono_ptr() { return mono_method; } + _FORCE_INLINE_ int get_parameters_count() { return params_count; } _FORCE_INLINE_ ManagedType get_return_type() { return return_type; } - void *get_thunk(); - MonoObject *invoke(MonoObject *p_object, const Variant **p_params, MonoException **r_exc = NULL); MonoObject *invoke(MonoObject *p_object, MonoException **r_exc = NULL); MonoObject *invoke_raw(MonoObject *p_object, void **p_params, MonoException **r_exc = NULL); diff --git a/modules/mono/mono_gd/gd_mono_method_thunk.h b/modules/mono/mono_gd/gd_mono_method_thunk.h new file mode 100644 index 0000000000..f8cc736ec3 --- /dev/null +++ b/modules/mono/mono_gd/gd_mono_method_thunk.h @@ -0,0 +1,332 @@ +/*************************************************************************/ +/* gd_mono_method_thunk.h */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ + +#ifndef GD_MONO_METHOD_THUNK_H +#define GD_MONO_METHOD_THUNK_H + +#include <type_traits> + +#include "gd_mono_class.h" +#include "gd_mono_header.h" +#include "gd_mono_marshal.h" +#include "gd_mono_method.h" +#include "gd_mono_utils.h" + +#if !defined(JAVASCRIPT_ENABLED) +#define HAVE_METHOD_THUNKS +#endif + +#ifdef HAVE_METHOD_THUNKS + +template <class... ParamTypes> +struct GDMonoMethodThunk { + + typedef void(GD_MONO_STDCALL *M)(ParamTypes... p_args, MonoException **); + + M mono_method_thunk; + +public: + _FORCE_INLINE_ void invoke(ParamTypes... p_args, MonoException **r_exc) { + GD_MONO_BEGIN_RUNTIME_INVOKE; + mono_method_thunk(p_args..., r_exc); + GD_MONO_END_RUNTIME_INVOKE; + } + + _FORCE_INLINE_ bool is_null() { + return mono_method_thunk == NULL; + } + + _FORCE_INLINE_ void nullify() { + mono_method_thunk = NULL; + } + + _FORCE_INLINE_ void set_from_method(GDMonoMethod *p_mono_method) { +#ifdef DEBUG_ENABLED + CRASH_COND(p_mono_method == NULL); + CRASH_COND(p_mono_method->get_return_type().type_encoding != MONO_TYPE_VOID); + + if (p_mono_method->is_static()) { + CRASH_COND(p_mono_method->get_parameters_count() != sizeof...(ParamTypes)); + } else { + CRASH_COND(p_mono_method->get_parameters_count() != (sizeof...(ParamTypes) - 1)); + } +#endif + mono_method_thunk = (M)mono_method_get_unmanaged_thunk(p_mono_method->get_mono_ptr()); + } + + GDMonoMethodThunk() : + mono_method_thunk(NULL) { + } + + explicit GDMonoMethodThunk(GDMonoMethod *p_mono_method) { + set_from_method(p_mono_method); + } +}; + +template <class R, class... ParamTypes> +struct GDMonoMethodThunkR { + + typedef R(GD_MONO_STDCALL *M)(ParamTypes... p_args, MonoException **); + + M mono_method_thunk; + +public: + _FORCE_INLINE_ R invoke(ParamTypes... p_args, MonoException **r_exc) { + GD_MONO_BEGIN_RUNTIME_INVOKE; + R r = mono_method_thunk(p_args..., r_exc); + GD_MONO_END_RUNTIME_INVOKE; + return r; + } + + _FORCE_INLINE_ bool is_null() { + return mono_method_thunk == NULL; + } + + _FORCE_INLINE_ void nullify() { + mono_method_thunk = NULL; + } + + _FORCE_INLINE_ void set_from_method(GDMonoMethod *p_mono_method) { +#ifdef DEBUG_ENABLED + CRASH_COND(p_mono_method == NULL); + CRASH_COND(p_mono_method->get_return_type().type_encoding == MONO_TYPE_VOID); + + if (p_mono_method->is_static()) { + CRASH_COND(p_mono_method->get_parameters_count() != sizeof...(ParamTypes)); + } else { + CRASH_COND(p_mono_method->get_parameters_count() != (sizeof...(ParamTypes) - 1)); + } +#endif + mono_method_thunk = (M)mono_method_get_unmanaged_thunk(p_mono_method->get_mono_ptr()); + } + + GDMonoMethodThunkR() : + mono_method_thunk(NULL) { + } + + explicit GDMonoMethodThunkR(GDMonoMethod *p_mono_method) { +#ifdef DEBUG_ENABLED + CRASH_COND(p_mono_method == NULL); +#endif + mono_method_thunk = (M)mono_method_get_unmanaged_thunk(p_mono_method->get_mono_ptr()); + } +}; + +#else + +template <unsigned int ThunkParamCount, class P1, class... ParamTypes> +struct VariadicInvokeMonoMethodImpl { + static void invoke(GDMonoMethod *p_mono_method, P1 p_arg1, ParamTypes... p_args, MonoException **r_exc) { + if (p_mono_method->is_static()) { + void *args[ThunkParamCount] = { p_arg1, p_args... }; + p_mono_method->invoke_raw(NULL, args, r_exc); + } else { + void *args[ThunkParamCount] = { p_args... }; + p_mono_method->invoke_raw((MonoObject *)p_arg1, args, r_exc); + } + } +}; + +template <unsigned int ThunkParamCount, class... ParamTypes> +struct VariadicInvokeMonoMethod { + static void invoke(GDMonoMethod *p_mono_method, ParamTypes... p_args, MonoException **r_exc) { + VariadicInvokeMonoMethodImpl<ThunkParamCount, ParamTypes...>::invoke(p_mono_method, p_args..., r_exc); + } +}; + +template <> +struct VariadicInvokeMonoMethod<0> { + static void invoke(GDMonoMethod *p_mono_method, MonoException **r_exc) { +#ifdef DEBUG_ENABLED + CRASH_COND(!p_mono_method->is_static()); +#endif + p_mono_method->invoke_raw(NULL, NULL, r_exc); + } +}; + +template <class P1> +struct VariadicInvokeMonoMethod<1, P1> { + static void invoke(GDMonoMethod *p_mono_method, P1 p_arg1, MonoException **r_exc) { + if (p_mono_method->is_static()) { + void *args[1] = { p_arg1 }; + p_mono_method->invoke_raw(NULL, args, r_exc); + } else { + p_mono_method->invoke_raw((MonoObject *)p_arg1, NULL, r_exc); + } + } +}; + +template <class R> +R unbox_if_needed(MonoObject *p_val, const ManagedType &, typename std::enable_if<!std::is_pointer<R>::value>::type * = 0) { + return GDMonoMarshal::unbox<R>(p_val); +} + +template <class R> +R unbox_if_needed(MonoObject *p_val, const ManagedType &p_type, typename std::enable_if<std::is_pointer<R>::value>::type * = 0) { + if (mono_class_is_valuetype(p_type.type_class->get_mono_ptr())) { + return GDMonoMarshal::unbox<R>(p_val); + } else { + // If it's not a value type, we assume 'R' is a pointer to 'MonoObject' or a compatible type, like 'MonoException'. + return (R)p_val; + } +} + +template <unsigned int ThunkParamCount, class R, class P1, class... ParamTypes> +struct VariadicInvokeMonoMethodRImpl { + static R invoke(GDMonoMethod *p_mono_method, P1 p_arg1, ParamTypes... p_args, MonoException **r_exc) { + if (p_mono_method->is_static()) { + void *args[ThunkParamCount] = { p_arg1, p_args... }; + MonoObject *r = p_mono_method->invoke_raw(NULL, args, r_exc); + return unbox_if_needed<R>(r, p_mono_method->get_return_type()); + } else { + void *args[ThunkParamCount] = { p_args... }; + MonoObject *r = p_mono_method->invoke_raw((MonoObject *)p_arg1, args, r_exc); + return unbox_if_needed<R>(r, p_mono_method->get_return_type()); + } + } +}; + +template <unsigned int ThunkParamCount, class R, class... ParamTypes> +struct VariadicInvokeMonoMethodR { + static R invoke(GDMonoMethod *p_mono_method, ParamTypes... p_args, MonoException **r_exc) { + return VariadicInvokeMonoMethodRImpl<ThunkParamCount, R, ParamTypes...>::invoke(p_mono_method, p_args..., r_exc); + } +}; + +template <class R> +struct VariadicInvokeMonoMethodR<0, R> { + static R invoke(GDMonoMethod *p_mono_method, MonoException **r_exc) { +#ifdef DEBUG_ENABLED + CRASH_COND(!p_mono_method->is_static()); +#endif + MonoObject *r = p_mono_method->invoke_raw(NULL, NULL, r_exc); + return unbox_if_needed<R>(r, p_mono_method->get_return_type()); + } +}; + +template <class R, class P1> +struct VariadicInvokeMonoMethodR<1, R, P1> { + static R invoke(GDMonoMethod *p_mono_method, P1 p_arg1, MonoException **r_exc) { + if (p_mono_method->is_static()) { + void *args[1] = { p_arg1 }; + MonoObject *r = p_mono_method->invoke_raw(NULL, args, r_exc); + return unbox_if_needed<R>(r, p_mono_method->get_return_type()); + } else { + MonoObject *r = p_mono_method->invoke_raw((MonoObject *)p_arg1, NULL, r_exc); + return unbox_if_needed<R>(r, p_mono_method->get_return_type()); + } + } +}; + +template <class... ParamTypes> +struct GDMonoMethodThunk { + + GDMonoMethod *mono_method; + +public: + _FORCE_INLINE_ void invoke(ParamTypes... p_args, MonoException **r_exc) { + VariadicInvokeMonoMethod<sizeof...(ParamTypes), ParamTypes...>::invoke(mono_method, p_args..., r_exc); + } + + _FORCE_INLINE_ bool is_null() { + return mono_method == NULL; + } + + _FORCE_INLINE_ void nullify() { + mono_method = NULL; + } + + _FORCE_INLINE_ void set_from_method(GDMonoMethod *p_mono_method) { +#ifdef DEBUG_ENABLED + CRASH_COND(p_mono_method == NULL); + CRASH_COND(p_mono_method->get_return_type().type_encoding != MONO_TYPE_VOID); + + if (p_mono_method->is_static()) { + CRASH_COND(p_mono_method->get_parameters_count() != sizeof...(ParamTypes)); + } else { + CRASH_COND(p_mono_method->get_parameters_count() != (sizeof...(ParamTypes) - 1)); + } +#endif + mono_method = p_mono_method; + } + + GDMonoMethodThunk() : + mono_method(NULL) { + } + + explicit GDMonoMethodThunk(GDMonoMethod *p_mono_method) { + set_from_method(p_mono_method); + } +}; + +template <class R, class... ParamTypes> +struct GDMonoMethodThunkR { + + GDMonoMethod *mono_method; + +public: + _FORCE_INLINE_ R invoke(ParamTypes... p_args, MonoException **r_exc) { + return VariadicInvokeMonoMethodR<sizeof...(ParamTypes), R, ParamTypes...>::invoke(mono_method, p_args..., r_exc); + } + + _FORCE_INLINE_ bool is_null() { + return mono_method == NULL; + } + + _FORCE_INLINE_ void nullify() { + mono_method = NULL; + } + + _FORCE_INLINE_ void set_from_method(GDMonoMethod *p_mono_method) { +#ifdef DEBUG_ENABLED + CRASH_COND(p_mono_method == NULL); + CRASH_COND(p_mono_method->get_return_type().type_encoding == MONO_TYPE_VOID); + + if (p_mono_method->is_static()) { + CRASH_COND(p_mono_method->get_parameters_count() != sizeof...(ParamTypes)); + } else { + CRASH_COND(p_mono_method->get_parameters_count() != (sizeof...(ParamTypes) - 1)); + } +#endif + mono_method = p_mono_method; + } + + GDMonoMethodThunkR() : + mono_method(NULL) { + } + + explicit GDMonoMethodThunkR(GDMonoMethod *p_mono_method) { + set_from_method(p_mono_method); + } +}; + +#endif + +#endif // GD_MONO_METHOD_THUNK_H diff --git a/modules/mono/mono_gd/gd_mono_property.cpp b/modules/mono/mono_gd/gd_mono_property.cpp index f1da00638f..277fe10087 100644 --- a/modules/mono/mono_gd/gd_mono_property.cpp +++ b/modules/mono/mono_gd/gd_mono_property.cpp @@ -30,8 +30,10 @@ #include "gd_mono_property.h" +#include "gd_mono_cache.h" #include "gd_mono_class.h" #include "gd_mono_marshal.h" +#include "gd_mono_utils.h" #include <mono/metadata/attrdefs.h> diff --git a/modules/mono/mono_gd/gd_mono_utils.cpp b/modules/mono/mono_gd/gd_mono_utils.cpp index 6504fbe423..8d7aaa97f2 100644 --- a/modules/mono/mono_gd/gd_mono_utils.cpp +++ b/modules/mono/mono_gd/gd_mono_utils.cpp @@ -45,273 +45,13 @@ #include "../utils/macros.h" #include "../utils/mutex_utils.h" #include "gd_mono.h" +#include "gd_mono_cache.h" #include "gd_mono_class.h" #include "gd_mono_marshal.h" +#include "gd_mono_method_thunk.h" namespace GDMonoUtils { -MonoCache mono_cache; - -#define CACHE_AND_CHECK(m_var, m_val) \ - { \ - CRASH_COND(m_var != NULL); \ - m_var = m_val; \ - ERR_FAIL_COND_MSG(!m_var, "Mono Cache: Member " #m_var " is null."); \ - } - -#define CACHE_CLASS_AND_CHECK(m_class, m_val) CACHE_AND_CHECK(GDMonoUtils::mono_cache.class_##m_class, m_val) -#define CACHE_NS_CLASS_AND_CHECK(m_ns, m_class, m_val) CACHE_AND_CHECK(GDMonoUtils::mono_cache.class_##m_ns##_##m_class, m_val) -#define CACHE_RAW_MONO_CLASS_AND_CHECK(m_class, m_val) CACHE_AND_CHECK(GDMonoUtils::mono_cache.rawclass_##m_class, m_val) -#define CACHE_FIELD_AND_CHECK(m_class, m_field, m_val) CACHE_AND_CHECK(GDMonoUtils::mono_cache.field_##m_class##_##m_field, m_val) -#define CACHE_METHOD_AND_CHECK(m_class, m_method, m_val) CACHE_AND_CHECK(GDMonoUtils::mono_cache.method_##m_class##_##m_method, m_val) -#define CACHE_METHOD_THUNK_AND_CHECK(m_class, m_method, m_val) CACHE_AND_CHECK(GDMonoUtils::mono_cache.methodthunk_##m_class##_##m_method, m_val) -#define CACHE_PROPERTY_AND_CHECK(m_class, m_property, m_val) CACHE_AND_CHECK(GDMonoUtils::mono_cache.property_##m_class##_##m_property, m_val) - -void MonoCache::clear_corlib_cache() { - - corlib_cache_updated = false; - - class_MonoObject = NULL; - class_bool = NULL; - class_int8_t = NULL; - class_int16_t = NULL; - class_int32_t = NULL; - class_int64_t = NULL; - class_uint8_t = NULL; - class_uint16_t = NULL; - class_uint32_t = NULL; - class_uint64_t = NULL; - class_float = NULL; - class_double = NULL; - class_String = NULL; - class_IntPtr = NULL; - - class_System_Collections_IEnumerable = NULL; - class_System_Collections_IDictionary = NULL; - -#ifdef DEBUG_ENABLED - class_System_Diagnostics_StackTrace = NULL; - methodthunk_System_Diagnostics_StackTrace_GetFrames = NULL; - method_System_Diagnostics_StackTrace_ctor_bool = NULL; - method_System_Diagnostics_StackTrace_ctor_Exception_bool = NULL; -#endif - - class_KeyNotFoundException = NULL; -} - -void MonoCache::clear_godot_api_cache() { - - godot_api_cache_updated = false; - - rawclass_Dictionary = NULL; - - class_Vector2 = NULL; - class_Rect2 = NULL; - class_Transform2D = NULL; - class_Vector3 = NULL; - class_Basis = NULL; - class_Quat = NULL; - class_Transform = NULL; - class_AABB = NULL; - class_Color = NULL; - class_Plane = NULL; - class_NodePath = NULL; - class_RID = NULL; - class_GodotObject = NULL; - class_GodotResource = NULL; - class_Node = NULL; - class_Control = NULL; - class_Spatial = NULL; - class_WeakRef = NULL; - class_Array = NULL; - class_Dictionary = NULL; - class_MarshalUtils = NULL; - class_ISerializationListener = NULL; - -#ifdef DEBUG_ENABLED - class_DebuggingUtils = NULL; - methodthunk_DebuggingUtils_GetStackFrameInfo = NULL; -#endif - - class_ExportAttribute = NULL; - field_ExportAttribute_hint = NULL; - field_ExportAttribute_hintString = NULL; - class_SignalAttribute = NULL; - class_ToolAttribute = NULL; - class_RemoteAttribute = NULL; - class_SyncAttribute = NULL; - class_MasterAttribute = NULL; - class_PuppetAttribute = NULL; - class_SlaveAttribute = NULL; - class_RemoteSyncAttribute = NULL; - class_MasterSyncAttribute = NULL; - class_PuppetSyncAttribute = NULL; - class_GodotMethodAttribute = NULL; - field_GodotMethodAttribute_methodName = NULL; - - field_GodotObject_ptr = NULL; - field_NodePath_ptr = NULL; - field_Image_ptr = NULL; - field_RID_ptr = NULL; - - methodthunk_GodotObject_Dispose = NULL; - methodthunk_Array_GetPtr = NULL; - methodthunk_Dictionary_GetPtr = NULL; - methodthunk_SignalAwaiter_SignalCallback = NULL; - methodthunk_SignalAwaiter_FailureCallback = NULL; - methodthunk_GodotTaskScheduler_Activate = NULL; - - // Start of MarshalUtils methods - - methodthunk_MarshalUtils_TypeIsGenericArray = NULL; - methodthunk_MarshalUtils_TypeIsGenericDictionary = NULL; - - methodthunk_MarshalUtils_ArrayGetElementType = NULL; - methodthunk_MarshalUtils_DictionaryGetKeyValueTypes = NULL; - - methodthunk_MarshalUtils_GenericIEnumerableIsAssignableFromType = NULL; - methodthunk_MarshalUtils_GenericIDictionaryIsAssignableFromType = NULL; - methodthunk_MarshalUtils_GenericIEnumerableIsAssignableFromType_with_info = NULL; - methodthunk_MarshalUtils_GenericIDictionaryIsAssignableFromType_with_info = NULL; - - methodthunk_MarshalUtils_MakeGenericArrayType = NULL; - methodthunk_MarshalUtils_MakeGenericDictionaryType = NULL; - - methodthunk_MarshalUtils_EnumerableToArray = NULL; - methodthunk_MarshalUtils_IDictionaryToDictionary = NULL; - methodthunk_MarshalUtils_GenericIDictionaryToDictionary = NULL; - - // End of MarshalUtils methods - - task_scheduler_handle = Ref<MonoGCHandle>(); -} - -#define GODOT_API_CLASS(m_class) (GDMono::get_singleton()->get_core_api_assembly()->get_class(BINDINGS_NAMESPACE, #m_class)) -#define GODOT_API_NS_CLAS(m_ns, m_class) (GDMono::get_singleton()->get_core_api_assembly()->get_class(m_ns, #m_class)) - -void update_corlib_cache() { - - CACHE_CLASS_AND_CHECK(MonoObject, GDMono::get_singleton()->get_corlib_assembly()->get_class(mono_get_object_class())); - CACHE_CLASS_AND_CHECK(bool, GDMono::get_singleton()->get_corlib_assembly()->get_class(mono_get_boolean_class())); - CACHE_CLASS_AND_CHECK(int8_t, GDMono::get_singleton()->get_corlib_assembly()->get_class(mono_get_sbyte_class())); - CACHE_CLASS_AND_CHECK(int16_t, GDMono::get_singleton()->get_corlib_assembly()->get_class(mono_get_int16_class())); - CACHE_CLASS_AND_CHECK(int32_t, GDMono::get_singleton()->get_corlib_assembly()->get_class(mono_get_int32_class())); - CACHE_CLASS_AND_CHECK(int64_t, GDMono::get_singleton()->get_corlib_assembly()->get_class(mono_get_int64_class())); - CACHE_CLASS_AND_CHECK(uint8_t, GDMono::get_singleton()->get_corlib_assembly()->get_class(mono_get_byte_class())); - CACHE_CLASS_AND_CHECK(uint16_t, GDMono::get_singleton()->get_corlib_assembly()->get_class(mono_get_uint16_class())); - CACHE_CLASS_AND_CHECK(uint32_t, GDMono::get_singleton()->get_corlib_assembly()->get_class(mono_get_uint32_class())); - CACHE_CLASS_AND_CHECK(uint64_t, GDMono::get_singleton()->get_corlib_assembly()->get_class(mono_get_uint64_class())); - CACHE_CLASS_AND_CHECK(float, GDMono::get_singleton()->get_corlib_assembly()->get_class(mono_get_single_class())); - CACHE_CLASS_AND_CHECK(double, GDMono::get_singleton()->get_corlib_assembly()->get_class(mono_get_double_class())); - CACHE_CLASS_AND_CHECK(String, GDMono::get_singleton()->get_corlib_assembly()->get_class(mono_get_string_class())); - CACHE_CLASS_AND_CHECK(IntPtr, GDMono::get_singleton()->get_corlib_assembly()->get_class(mono_get_intptr_class())); - - CACHE_CLASS_AND_CHECK(System_Collections_IEnumerable, GDMono::get_singleton()->get_corlib_assembly()->get_class("System.Collections", "IEnumerable")); - CACHE_CLASS_AND_CHECK(System_Collections_IDictionary, GDMono::get_singleton()->get_corlib_assembly()->get_class("System.Collections", "IDictionary")); - -#ifdef DEBUG_ENABLED - CACHE_CLASS_AND_CHECK(System_Diagnostics_StackTrace, GDMono::get_singleton()->get_corlib_assembly()->get_class("System.Diagnostics", "StackTrace")); - CACHE_METHOD_THUNK_AND_CHECK(System_Diagnostics_StackTrace, GetFrames, (StackTrace_GetFrames)CACHED_CLASS(System_Diagnostics_StackTrace)->get_method_thunk("GetFrames")); - CACHE_METHOD_AND_CHECK(System_Diagnostics_StackTrace, ctor_bool, CACHED_CLASS(System_Diagnostics_StackTrace)->get_method_with_desc("System.Diagnostics.StackTrace:.ctor(bool)", true)); - CACHE_METHOD_AND_CHECK(System_Diagnostics_StackTrace, ctor_Exception_bool, CACHED_CLASS(System_Diagnostics_StackTrace)->get_method_with_desc("System.Diagnostics.StackTrace:.ctor(System.Exception,bool)", true)); -#endif - - CACHE_CLASS_AND_CHECK(KeyNotFoundException, GDMono::get_singleton()->get_corlib_assembly()->get_class("System.Collections.Generic", "KeyNotFoundException")); - - mono_cache.corlib_cache_updated = true; -} - -void update_godot_api_cache() { - - CACHE_CLASS_AND_CHECK(Vector2, GODOT_API_CLASS(Vector2)); - CACHE_CLASS_AND_CHECK(Rect2, GODOT_API_CLASS(Rect2)); - CACHE_CLASS_AND_CHECK(Transform2D, GODOT_API_CLASS(Transform2D)); - CACHE_CLASS_AND_CHECK(Vector3, GODOT_API_CLASS(Vector3)); - CACHE_CLASS_AND_CHECK(Basis, GODOT_API_CLASS(Basis)); - CACHE_CLASS_AND_CHECK(Quat, GODOT_API_CLASS(Quat)); - CACHE_CLASS_AND_CHECK(Transform, GODOT_API_CLASS(Transform)); - CACHE_CLASS_AND_CHECK(AABB, GODOT_API_CLASS(AABB)); - CACHE_CLASS_AND_CHECK(Color, GODOT_API_CLASS(Color)); - CACHE_CLASS_AND_CHECK(Plane, GODOT_API_CLASS(Plane)); - CACHE_CLASS_AND_CHECK(NodePath, GODOT_API_CLASS(NodePath)); - CACHE_CLASS_AND_CHECK(RID, GODOT_API_CLASS(RID)); - CACHE_CLASS_AND_CHECK(GodotObject, GODOT_API_CLASS(Object)); - CACHE_CLASS_AND_CHECK(GodotResource, GODOT_API_CLASS(Resource)); - CACHE_CLASS_AND_CHECK(Node, GODOT_API_CLASS(Node)); - CACHE_CLASS_AND_CHECK(Control, GODOT_API_CLASS(Control)); - CACHE_CLASS_AND_CHECK(Spatial, GODOT_API_CLASS(Spatial)); - CACHE_CLASS_AND_CHECK(WeakRef, GODOT_API_CLASS(WeakRef)); - CACHE_CLASS_AND_CHECK(Array, GODOT_API_NS_CLAS(BINDINGS_NAMESPACE_COLLECTIONS, Array)); - CACHE_CLASS_AND_CHECK(Dictionary, GODOT_API_NS_CLAS(BINDINGS_NAMESPACE_COLLECTIONS, Dictionary)); - CACHE_CLASS_AND_CHECK(MarshalUtils, GODOT_API_CLASS(MarshalUtils)); - CACHE_CLASS_AND_CHECK(ISerializationListener, GODOT_API_CLASS(ISerializationListener)); - -#ifdef DEBUG_ENABLED - CACHE_CLASS_AND_CHECK(DebuggingUtils, GODOT_API_CLASS(DebuggingUtils)); -#endif - - // Attributes - CACHE_CLASS_AND_CHECK(ExportAttribute, GODOT_API_CLASS(ExportAttribute)); - CACHE_FIELD_AND_CHECK(ExportAttribute, hint, CACHED_CLASS(ExportAttribute)->get_field("hint")); - CACHE_FIELD_AND_CHECK(ExportAttribute, hintString, CACHED_CLASS(ExportAttribute)->get_field("hintString")); - CACHE_CLASS_AND_CHECK(SignalAttribute, GODOT_API_CLASS(SignalAttribute)); - CACHE_CLASS_AND_CHECK(ToolAttribute, GODOT_API_CLASS(ToolAttribute)); - CACHE_CLASS_AND_CHECK(RemoteAttribute, GODOT_API_CLASS(RemoteAttribute)); - CACHE_CLASS_AND_CHECK(SyncAttribute, GODOT_API_CLASS(SyncAttribute)); - CACHE_CLASS_AND_CHECK(MasterAttribute, GODOT_API_CLASS(MasterAttribute)); - CACHE_CLASS_AND_CHECK(PuppetAttribute, GODOT_API_CLASS(PuppetAttribute)); - CACHE_CLASS_AND_CHECK(SlaveAttribute, GODOT_API_CLASS(SlaveAttribute)); - CACHE_CLASS_AND_CHECK(RemoteSyncAttribute, GODOT_API_CLASS(RemoteSyncAttribute)); - CACHE_CLASS_AND_CHECK(MasterSyncAttribute, GODOT_API_CLASS(MasterSyncAttribute)); - CACHE_CLASS_AND_CHECK(PuppetSyncAttribute, GODOT_API_CLASS(PuppetSyncAttribute)); - CACHE_CLASS_AND_CHECK(GodotMethodAttribute, GODOT_API_CLASS(GodotMethodAttribute)); - CACHE_FIELD_AND_CHECK(GodotMethodAttribute, methodName, CACHED_CLASS(GodotMethodAttribute)->get_field("methodName")); - - CACHE_FIELD_AND_CHECK(GodotObject, ptr, CACHED_CLASS(GodotObject)->get_field(BINDINGS_PTR_FIELD)); - CACHE_FIELD_AND_CHECK(NodePath, ptr, CACHED_CLASS(NodePath)->get_field(BINDINGS_PTR_FIELD)); - CACHE_FIELD_AND_CHECK(RID, ptr, CACHED_CLASS(RID)->get_field(BINDINGS_PTR_FIELD)); - - CACHE_METHOD_THUNK_AND_CHECK(GodotObject, Dispose, (GodotObject_Dispose)CACHED_CLASS(GodotObject)->get_method_thunk("Dispose", 0)); - CACHE_METHOD_THUNK_AND_CHECK(Array, GetPtr, (Array_GetPtr)GODOT_API_NS_CLAS(BINDINGS_NAMESPACE_COLLECTIONS, Array)->get_method_thunk("GetPtr", 0)); - CACHE_METHOD_THUNK_AND_CHECK(Dictionary, GetPtr, (Dictionary_GetPtr)GODOT_API_NS_CLAS(BINDINGS_NAMESPACE_COLLECTIONS, Dictionary)->get_method_thunk("GetPtr", 0)); - CACHE_METHOD_THUNK_AND_CHECK(SignalAwaiter, SignalCallback, (SignalAwaiter_SignalCallback)GODOT_API_CLASS(SignalAwaiter)->get_method_thunk("SignalCallback", 1)); - CACHE_METHOD_THUNK_AND_CHECK(SignalAwaiter, FailureCallback, (SignalAwaiter_FailureCallback)GODOT_API_CLASS(SignalAwaiter)->get_method_thunk("FailureCallback", 0)); - CACHE_METHOD_THUNK_AND_CHECK(GodotTaskScheduler, Activate, (GodotTaskScheduler_Activate)GODOT_API_CLASS(GodotTaskScheduler)->get_method_thunk("Activate", 0)); - - // Start of MarshalUtils methods - - CACHE_METHOD_THUNK_AND_CHECK(MarshalUtils, TypeIsGenericArray, (TypeIsGenericArray)GODOT_API_CLASS(MarshalUtils)->get_method_thunk("TypeIsGenericArray", 1)); - CACHE_METHOD_THUNK_AND_CHECK(MarshalUtils, TypeIsGenericDictionary, (TypeIsGenericDictionary)GODOT_API_CLASS(MarshalUtils)->get_method_thunk("TypeIsGenericDictionary", 1)); - - CACHE_METHOD_THUNK_AND_CHECK(MarshalUtils, ArrayGetElementType, (ArrayGetElementType)GODOT_API_CLASS(MarshalUtils)->get_method_thunk("ArrayGetElementType", 2)); - CACHE_METHOD_THUNK_AND_CHECK(MarshalUtils, DictionaryGetKeyValueTypes, (DictionaryGetKeyValueTypes)GODOT_API_CLASS(MarshalUtils)->get_method_thunk("DictionaryGetKeyValueTypes", 3)); - - CACHE_METHOD_THUNK_AND_CHECK(MarshalUtils, GenericIEnumerableIsAssignableFromType, (GenericIEnumerableIsAssignableFromType)GODOT_API_CLASS(MarshalUtils)->get_method_thunk("GenericIEnumerableIsAssignableFromType", 1)); - CACHE_METHOD_THUNK_AND_CHECK(MarshalUtils, GenericIDictionaryIsAssignableFromType, (GenericIDictionaryIsAssignableFromType)GODOT_API_CLASS(MarshalUtils)->get_method_thunk("GenericIDictionaryIsAssignableFromType", 1)); - CACHE_METHOD_THUNK_AND_CHECK(MarshalUtils, GenericIEnumerableIsAssignableFromType_with_info, (GenericIEnumerableIsAssignableFromType_with_info)GODOT_API_CLASS(MarshalUtils)->get_method_thunk("GenericIEnumerableIsAssignableFromType", 2)); - CACHE_METHOD_THUNK_AND_CHECK(MarshalUtils, GenericIDictionaryIsAssignableFromType_with_info, (GenericIDictionaryIsAssignableFromType_with_info)GODOT_API_CLASS(MarshalUtils)->get_method_thunk("GenericIDictionaryIsAssignableFromType", 3)); - - CACHE_METHOD_THUNK_AND_CHECK(MarshalUtils, MakeGenericArrayType, (MakeGenericArrayType)GODOT_API_CLASS(MarshalUtils)->get_method_thunk("MakeGenericArrayType", 1)); - CACHE_METHOD_THUNK_AND_CHECK(MarshalUtils, MakeGenericDictionaryType, (MakeGenericDictionaryType)GODOT_API_CLASS(MarshalUtils)->get_method_thunk("MakeGenericDictionaryType", 2)); - - CACHE_METHOD_THUNK_AND_CHECK(MarshalUtils, EnumerableToArray, (EnumerableToArray)GODOT_API_CLASS(MarshalUtils)->get_method_thunk("EnumerableToArray", 2)); - CACHE_METHOD_THUNK_AND_CHECK(MarshalUtils, IDictionaryToDictionary, (IDictionaryToDictionary)GODOT_API_CLASS(MarshalUtils)->get_method_thunk("IDictionaryToDictionary", 2)); - CACHE_METHOD_THUNK_AND_CHECK(MarshalUtils, GenericIDictionaryToDictionary, (GenericIDictionaryToDictionary)GODOT_API_CLASS(MarshalUtils)->get_method_thunk("GenericIDictionaryToDictionary", 2)); - - // End of MarshalUtils methods - -#ifdef DEBUG_ENABLED - CACHE_METHOD_THUNK_AND_CHECK(DebuggingUtils, GetStackFrameInfo, (DebugUtils_StackFrameInfo)GODOT_API_CLASS(DebuggingUtils)->get_method_thunk("GetStackFrameInfo", 4)); -#endif - - // TODO Move to CSharpLanguage::init() and do handle disposal - MonoObject *task_scheduler = mono_object_new(mono_domain_get(), GODOT_API_CLASS(GodotTaskScheduler)->get_mono_ptr()); - GDMonoUtils::runtime_object_init(task_scheduler, GODOT_API_CLASS(GodotTaskScheduler)); - mono_cache.task_scheduler_handle = MonoGCHandle::create_strong(task_scheduler); - - mono_cache.godot_api_cache_updated = true; -} - MonoObject *unmanaged_get_managed(Object *unmanaged) { if (!unmanaged) @@ -386,7 +126,7 @@ void set_main_thread(MonoThread *p_thread) { void attach_current_thread() { ERR_FAIL_COND(!GDMono::get_singleton()->is_runtime_initialized()); - MonoThread *mono_thread = mono_thread_attach(mono_domain_get()); + MonoThread *mono_thread = mono_thread_attach(mono_get_root_domain()); ERR_FAIL_NULL(mono_thread); } @@ -421,7 +161,7 @@ GDMonoClass *type_get_proxy_class(const StringName &p_type) { if (klass && klass->is_static()) { // A static class means this is a Godot singleton class. If an instance is needed we use Godot.Object. - return mono_cache.class_GodotObject; + return GDMonoCache::cached_data.class_GodotObject; } #ifdef TOOLS_ENABLED @@ -751,16 +491,16 @@ uint64_t unbox_enum_value(MonoObject *p_boxed, MonoType *p_enum_basetype, bool & } void dispose(MonoObject *p_mono_object, MonoException **r_exc) { - invoke_method_thunk(CACHED_METHOD_THUNK(GodotObject, Dispose), p_mono_object, r_exc); + CACHED_METHOD_THUNK(GodotObject, Dispose).invoke(p_mono_object, r_exc); } namespace Marshal { #ifdef MONO_GLUE_ENABLED #ifdef TOOLS_ENABLED -#define NO_GLUE_RET(m_ret) \ - { \ - if (!mono_cache.godot_api_cache_updated) return m_ret; \ +#define NO_GLUE_RET(m_ret) \ + { \ + if (!GDMonoCache::cached_data.godot_api_cache_updated) return m_ret; \ } #else #define NO_GLUE_RET(m_ret) \ @@ -773,68 +513,60 @@ namespace Marshal { bool type_is_generic_array(MonoReflectionType *p_reftype) { NO_GLUE_RET(false); - TypeIsGenericArray thunk = CACHED_METHOD_THUNK(MarshalUtils, TypeIsGenericArray); MonoException *exc = NULL; - MonoBoolean res = invoke_method_thunk(thunk, p_reftype, &exc); + MonoBoolean res = CACHED_METHOD_THUNK(MarshalUtils, TypeIsGenericArray).invoke(p_reftype, &exc); UNHANDLED_EXCEPTION(exc); return (bool)res; } bool type_is_generic_dictionary(MonoReflectionType *p_reftype) { NO_GLUE_RET(false); - TypeIsGenericDictionary thunk = CACHED_METHOD_THUNK(MarshalUtils, TypeIsGenericDictionary); MonoException *exc = NULL; - MonoBoolean res = invoke_method_thunk(thunk, p_reftype, &exc); + MonoBoolean res = CACHED_METHOD_THUNK(MarshalUtils, TypeIsGenericDictionary).invoke(p_reftype, &exc); UNHANDLED_EXCEPTION(exc); return (bool)res; } void array_get_element_type(MonoReflectionType *p_array_reftype, MonoReflectionType **r_elem_reftype) { - ArrayGetElementType thunk = CACHED_METHOD_THUNK(MarshalUtils, ArrayGetElementType); MonoException *exc = NULL; - invoke_method_thunk(thunk, p_array_reftype, r_elem_reftype, &exc); + CACHED_METHOD_THUNK(MarshalUtils, ArrayGetElementType).invoke(p_array_reftype, r_elem_reftype, &exc); UNHANDLED_EXCEPTION(exc); } void dictionary_get_key_value_types(MonoReflectionType *p_dict_reftype, MonoReflectionType **r_key_reftype, MonoReflectionType **r_value_reftype) { - DictionaryGetKeyValueTypes thunk = CACHED_METHOD_THUNK(MarshalUtils, DictionaryGetKeyValueTypes); MonoException *exc = NULL; - invoke_method_thunk(thunk, p_dict_reftype, r_key_reftype, r_value_reftype, &exc); + CACHED_METHOD_THUNK(MarshalUtils, DictionaryGetKeyValueTypes).invoke(p_dict_reftype, r_key_reftype, r_value_reftype, &exc); UNHANDLED_EXCEPTION(exc); } bool generic_ienumerable_is_assignable_from(MonoReflectionType *p_reftype) { NO_GLUE_RET(false); - GenericIEnumerableIsAssignableFromType thunk = CACHED_METHOD_THUNK(MarshalUtils, GenericIEnumerableIsAssignableFromType); MonoException *exc = NULL; - MonoBoolean res = invoke_method_thunk(thunk, p_reftype, &exc); + MonoBoolean res = CACHED_METHOD_THUNK(MarshalUtils, GenericIEnumerableIsAssignableFromType).invoke(p_reftype, &exc); UNHANDLED_EXCEPTION(exc); return (bool)res; } bool generic_idictionary_is_assignable_from(MonoReflectionType *p_reftype) { NO_GLUE_RET(false); - GenericIDictionaryIsAssignableFromType thunk = CACHED_METHOD_THUNK(MarshalUtils, GenericIDictionaryIsAssignableFromType); MonoException *exc = NULL; - MonoBoolean res = invoke_method_thunk(thunk, p_reftype, &exc); + MonoBoolean res = CACHED_METHOD_THUNK(MarshalUtils, GenericIDictionaryIsAssignableFromType).invoke(p_reftype, &exc); UNHANDLED_EXCEPTION(exc); return (bool)res; } bool generic_ienumerable_is_assignable_from(MonoReflectionType *p_reftype, MonoReflectionType **r_elem_reftype) { NO_GLUE_RET(false); - GenericIEnumerableIsAssignableFromType_with_info thunk = CACHED_METHOD_THUNK(MarshalUtils, GenericIEnumerableIsAssignableFromType_with_info); MonoException *exc = NULL; - MonoBoolean res = invoke_method_thunk(thunk, p_reftype, r_elem_reftype, &exc); + MonoBoolean res = CACHED_METHOD_THUNK(MarshalUtils, GenericIEnumerableIsAssignableFromType_with_info).invoke(p_reftype, r_elem_reftype, &exc); UNHANDLED_EXCEPTION(exc); return (bool)res; } bool generic_idictionary_is_assignable_from(MonoReflectionType *p_reftype, MonoReflectionType **r_key_reftype, MonoReflectionType **r_value_reftype) { NO_GLUE_RET(false); - GenericIDictionaryIsAssignableFromType_with_info thunk = CACHED_METHOD_THUNK(MarshalUtils, GenericIDictionaryIsAssignableFromType_with_info); MonoException *exc = NULL; - MonoBoolean res = invoke_method_thunk(thunk, p_reftype, r_key_reftype, r_value_reftype, &exc); + MonoBoolean res = CACHED_METHOD_THUNK(MarshalUtils, GenericIDictionaryIsAssignableFromType_with_info).invoke(p_reftype, r_key_reftype, r_value_reftype, &exc); UNHANDLED_EXCEPTION(exc); return (bool)res; } @@ -842,9 +574,8 @@ bool generic_idictionary_is_assignable_from(MonoReflectionType *p_reftype, MonoR Array enumerable_to_array(MonoObject *p_enumerable) { NO_GLUE_RET(Array()); Array result; - EnumerableToArray thunk = CACHED_METHOD_THUNK(MarshalUtils, EnumerableToArray); MonoException *exc = NULL; - invoke_method_thunk(thunk, p_enumerable, &result, &exc); + CACHED_METHOD_THUNK(MarshalUtils, EnumerableToArray).invoke(p_enumerable, &result, &exc); UNHANDLED_EXCEPTION(exc); return result; } @@ -852,9 +583,8 @@ Array enumerable_to_array(MonoObject *p_enumerable) { Dictionary idictionary_to_dictionary(MonoObject *p_idictionary) { NO_GLUE_RET(Dictionary()); Dictionary result; - IDictionaryToDictionary thunk = CACHED_METHOD_THUNK(MarshalUtils, IDictionaryToDictionary); MonoException *exc = NULL; - invoke_method_thunk(thunk, p_idictionary, &result, &exc); + CACHED_METHOD_THUNK(MarshalUtils, IDictionaryToDictionary).invoke(p_idictionary, &result, &exc); UNHANDLED_EXCEPTION(exc); return result; } @@ -862,27 +592,24 @@ Dictionary idictionary_to_dictionary(MonoObject *p_idictionary) { Dictionary generic_idictionary_to_dictionary(MonoObject *p_generic_idictionary) { NO_GLUE_RET(Dictionary()); Dictionary result; - GenericIDictionaryToDictionary thunk = CACHED_METHOD_THUNK(MarshalUtils, GenericIDictionaryToDictionary); MonoException *exc = NULL; - invoke_method_thunk(thunk, p_generic_idictionary, &result, &exc); + CACHED_METHOD_THUNK(MarshalUtils, GenericIDictionaryToDictionary).invoke(p_generic_idictionary, &result, &exc); UNHANDLED_EXCEPTION(exc); return result; } GDMonoClass *make_generic_array_type(MonoReflectionType *p_elem_reftype) { NO_GLUE_RET(NULL); - MakeGenericArrayType thunk = CACHED_METHOD_THUNK(MarshalUtils, MakeGenericArrayType); MonoException *exc = NULL; - MonoReflectionType *reftype = invoke_method_thunk(thunk, p_elem_reftype, &exc); + MonoReflectionType *reftype = CACHED_METHOD_THUNK(MarshalUtils, MakeGenericArrayType).invoke(p_elem_reftype, &exc); UNHANDLED_EXCEPTION(exc); return GDMono::get_singleton()->get_class(mono_class_from_mono_type(mono_reflection_type_get_type(reftype))); } GDMonoClass *make_generic_dictionary_type(MonoReflectionType *p_key_reftype, MonoReflectionType *p_value_reftype) { NO_GLUE_RET(NULL); - MakeGenericDictionaryType thunk = CACHED_METHOD_THUNK(MarshalUtils, MakeGenericDictionaryType); MonoException *exc = NULL; - MonoReflectionType *reftype = invoke_method_thunk(thunk, p_key_reftype, p_value_reftype, &exc); + MonoReflectionType *reftype = CACHED_METHOD_THUNK(MarshalUtils, MakeGenericDictionaryType).invoke(p_key_reftype, p_value_reftype, &exc); UNHANDLED_EXCEPTION(exc); return GDMono::get_singleton()->get_class(mono_class_from_mono_type(mono_reflection_type_get_type(reftype))); } diff --git a/modules/mono/mono_gd/gd_mono_utils.h b/modules/mono/mono_gd/gd_mono_utils.h index d73743bf0b..848df843fe 100644 --- a/modules/mono/mono_gd/gd_mono_utils.h +++ b/modules/mono/mono_gd/gd_mono_utils.h @@ -49,33 +49,6 @@ namespace GDMonoUtils { -typedef void (*GodotObject_Dispose)(MonoObject *, MonoException **); -typedef Array *(*Array_GetPtr)(MonoObject *, MonoException **); -typedef Dictionary *(*Dictionary_GetPtr)(MonoObject *, MonoException **); -typedef MonoObject *(*SignalAwaiter_SignalCallback)(MonoObject *, MonoArray *, MonoException **); -typedef MonoObject *(*SignalAwaiter_FailureCallback)(MonoObject *, MonoException **); -typedef MonoObject *(*GodotTaskScheduler_Activate)(MonoObject *, MonoException **); -typedef MonoArray *(*StackTrace_GetFrames)(MonoObject *, MonoException **); -typedef void (*DebugUtils_StackFrameInfo)(MonoObject *, MonoString **, int *, MonoString **, MonoException **); - -typedef MonoBoolean (*TypeIsGenericArray)(MonoReflectionType *, MonoException **); -typedef MonoBoolean (*TypeIsGenericDictionary)(MonoReflectionType *, MonoException **); - -typedef void (*ArrayGetElementType)(MonoReflectionType *, MonoReflectionType **, MonoException **); -typedef void (*DictionaryGetKeyValueTypes)(MonoReflectionType *, MonoReflectionType **, MonoReflectionType **, MonoException **); - -typedef MonoBoolean (*GenericIEnumerableIsAssignableFromType)(MonoReflectionType *, MonoException **); -typedef MonoBoolean (*GenericIDictionaryIsAssignableFromType)(MonoReflectionType *, MonoException **); -typedef MonoBoolean (*GenericIEnumerableIsAssignableFromType_with_info)(MonoReflectionType *, MonoReflectionType **, MonoException **); -typedef MonoBoolean (*GenericIDictionaryIsAssignableFromType_with_info)(MonoReflectionType *, MonoReflectionType **, MonoReflectionType **, MonoException **); - -typedef MonoReflectionType *(*MakeGenericArrayType)(MonoReflectionType *, MonoException **); -typedef MonoReflectionType *(*MakeGenericDictionaryType)(MonoReflectionType *, MonoReflectionType *, MonoException **); - -typedef void (*EnumerableToArray)(MonoObject *, Array *, MonoException **); -typedef void (*IDictionaryToDictionary)(MonoObject *, Dictionary *, MonoException **); -typedef void (*GenericIDictionaryToDictionary)(MonoObject *, Dictionary *, MonoException **); - namespace Marshal { bool type_is_generic_array(MonoReflectionType *p_reftype); @@ -98,157 +71,6 @@ Dictionary generic_idictionary_to_dictionary(MonoObject *p_generic_idictionary); } // namespace Marshal -// End of MarshalUtils methods - -struct MonoCache { - - // ----------------------------------------------- - // corlib classes - - // Let's use the no-namespace format for these too - GDMonoClass *class_MonoObject; - GDMonoClass *class_bool; - GDMonoClass *class_int8_t; - GDMonoClass *class_int16_t; - GDMonoClass *class_int32_t; - GDMonoClass *class_int64_t; - GDMonoClass *class_uint8_t; - GDMonoClass *class_uint16_t; - GDMonoClass *class_uint32_t; - GDMonoClass *class_uint64_t; - GDMonoClass *class_float; - GDMonoClass *class_double; - GDMonoClass *class_String; - GDMonoClass *class_IntPtr; - - GDMonoClass *class_System_Collections_IEnumerable; - GDMonoClass *class_System_Collections_IDictionary; - -#ifdef DEBUG_ENABLED - GDMonoClass *class_System_Diagnostics_StackTrace; - StackTrace_GetFrames methodthunk_System_Diagnostics_StackTrace_GetFrames; - GDMonoMethod *method_System_Diagnostics_StackTrace_ctor_bool; - GDMonoMethod *method_System_Diagnostics_StackTrace_ctor_Exception_bool; -#endif - - GDMonoClass *class_KeyNotFoundException; - - MonoClass *rawclass_Dictionary; - // ----------------------------------------------- - - GDMonoClass *class_Vector2; - GDMonoClass *class_Rect2; - GDMonoClass *class_Transform2D; - GDMonoClass *class_Vector3; - GDMonoClass *class_Basis; - GDMonoClass *class_Quat; - GDMonoClass *class_Transform; - GDMonoClass *class_AABB; - GDMonoClass *class_Color; - GDMonoClass *class_Plane; - GDMonoClass *class_NodePath; - GDMonoClass *class_RID; - GDMonoClass *class_GodotObject; - GDMonoClass *class_GodotResource; - GDMonoClass *class_Node; - GDMonoClass *class_Control; - GDMonoClass *class_Spatial; - GDMonoClass *class_WeakRef; - GDMonoClass *class_Array; - GDMonoClass *class_Dictionary; - GDMonoClass *class_MarshalUtils; - GDMonoClass *class_ISerializationListener; - -#ifdef DEBUG_ENABLED - GDMonoClass *class_DebuggingUtils; - DebugUtils_StackFrameInfo methodthunk_DebuggingUtils_GetStackFrameInfo; -#endif - - GDMonoClass *class_ExportAttribute; - GDMonoField *field_ExportAttribute_hint; - GDMonoField *field_ExportAttribute_hintString; - GDMonoClass *class_SignalAttribute; - GDMonoClass *class_ToolAttribute; - GDMonoClass *class_RemoteAttribute; - GDMonoClass *class_SyncAttribute; - GDMonoClass *class_RemoteSyncAttribute; - GDMonoClass *class_MasterSyncAttribute; - GDMonoClass *class_PuppetSyncAttribute; - GDMonoClass *class_MasterAttribute; - GDMonoClass *class_PuppetAttribute; - GDMonoClass *class_SlaveAttribute; - GDMonoClass *class_GodotMethodAttribute; - GDMonoField *field_GodotMethodAttribute_methodName; - - GDMonoField *field_GodotObject_ptr; - GDMonoField *field_NodePath_ptr; - GDMonoField *field_Image_ptr; - GDMonoField *field_RID_ptr; - - GodotObject_Dispose methodthunk_GodotObject_Dispose; - Array_GetPtr methodthunk_Array_GetPtr; - Dictionary_GetPtr methodthunk_Dictionary_GetPtr; - SignalAwaiter_SignalCallback methodthunk_SignalAwaiter_SignalCallback; - SignalAwaiter_FailureCallback methodthunk_SignalAwaiter_FailureCallback; - GodotTaskScheduler_Activate methodthunk_GodotTaskScheduler_Activate; - - // Start of MarshalUtils methods - - TypeIsGenericArray methodthunk_MarshalUtils_TypeIsGenericArray; - TypeIsGenericDictionary methodthunk_MarshalUtils_TypeIsGenericDictionary; - - ArrayGetElementType methodthunk_MarshalUtils_ArrayGetElementType; - DictionaryGetKeyValueTypes methodthunk_MarshalUtils_DictionaryGetKeyValueTypes; - - GenericIEnumerableIsAssignableFromType methodthunk_MarshalUtils_GenericIEnumerableIsAssignableFromType; - GenericIDictionaryIsAssignableFromType methodthunk_MarshalUtils_GenericIDictionaryIsAssignableFromType; - GenericIEnumerableIsAssignableFromType_with_info methodthunk_MarshalUtils_GenericIEnumerableIsAssignableFromType_with_info; - GenericIDictionaryIsAssignableFromType_with_info methodthunk_MarshalUtils_GenericIDictionaryIsAssignableFromType_with_info; - - MakeGenericArrayType methodthunk_MarshalUtils_MakeGenericArrayType; - MakeGenericDictionaryType methodthunk_MarshalUtils_MakeGenericDictionaryType; - - EnumerableToArray methodthunk_MarshalUtils_EnumerableToArray; - IDictionaryToDictionary methodthunk_MarshalUtils_IDictionaryToDictionary; - GenericIDictionaryToDictionary methodthunk_MarshalUtils_GenericIDictionaryToDictionary; - - // End of MarshalUtils methods - - Ref<MonoGCHandle> task_scheduler_handle; - - bool corlib_cache_updated; - bool godot_api_cache_updated; - - void clear_corlib_cache(); - void clear_godot_api_cache(); - - MonoCache() { - clear_corlib_cache(); - clear_godot_api_cache(); - } -}; - -extern MonoCache mono_cache; - -void update_corlib_cache(); -void update_godot_api_cache(); - -inline void clear_corlib_cache() { - mono_cache.clear_corlib_cache(); -} - -inline void clear_godot_api_cache() { - mono_cache.clear_godot_api_cache(); -} - -_FORCE_INLINE_ bool tools_godot_api_check() { -#ifdef TOOLS_ENABLED - return mono_cache.godot_api_cache_updated; -#else - return true; // Assume it's updated if this was called, otherwise it's a bug -#endif -} - _FORCE_INLINE_ void hash_combine(uint32_t &p_hash, const uint32_t &p_with_hash) { p_hash ^= p_with_hash + 0x9e3779b9 + (p_hash << 6) + (p_hash >> 2); } @@ -324,20 +146,6 @@ void dispose(MonoObject *p_mono_object, MonoException **r_exc); #define NATIVE_GDMONOCLASS_NAME(m_class) (GDMonoMarshal::mono_string_to_godot((MonoString *)m_class->get_field(BINDINGS_NATIVE_NAME_FIELD)->get_value(NULL))) -#define CACHED_CLASS(m_class) (GDMonoUtils::mono_cache.class_##m_class) -#define CACHED_CLASS_RAW(m_class) (GDMonoUtils::mono_cache.class_##m_class->get_mono_ptr()) -#define CACHED_RAW_MONO_CLASS(m_class) (GDMonoUtils::mono_cache.rawclass_##m_class) -#define CACHED_FIELD(m_class, m_field) (GDMonoUtils::mono_cache.field_##m_class##_##m_field) -#define CACHED_METHOD(m_class, m_method) (GDMonoUtils::mono_cache.method_##m_class##_##m_method) -#define CACHED_METHOD_THUNK(m_class, m_method) (GDMonoUtils::mono_cache.methodthunk_##m_class##_##m_method) -#define CACHED_PROPERTY(m_class, m_property) (GDMonoUtils::mono_cache.property_##m_class##_##m_property) - -#ifdef REAL_T_IS_DOUBLE -#define REAL_T_MONOCLASS CACHED_CLASS_RAW(double) -#else -#define REAL_T_MONOCLASS CACHED_CLASS_RAW(float) -#endif - #define GD_MONO_BEGIN_RUNTIME_INVOKE \ int &_runtime_invoke_count_ref = GDMonoUtils::get_runtime_invoke_count_ref(); \ _runtime_invoke_count_ref += 1; @@ -345,93 +153,4 @@ void dispose(MonoObject *p_mono_object, MonoException **r_exc); #define GD_MONO_END_RUNTIME_INVOKE \ _runtime_invoke_count_ref -= 1; -inline void invoke_method_thunk(void (*p_method_thunk)()) { - GD_MONO_BEGIN_RUNTIME_INVOKE; - p_method_thunk(); - GD_MONO_END_RUNTIME_INVOKE; -} - -template <class R> -R invoke_method_thunk(R (*p_method_thunk)()) { - GD_MONO_BEGIN_RUNTIME_INVOKE; - R r = p_method_thunk(); - GD_MONO_END_RUNTIME_INVOKE; - return r; -} - -template <class P1> -void invoke_method_thunk(void (*p_method_thunk)(P1), P1 p_arg1) { - GD_MONO_BEGIN_RUNTIME_INVOKE; - p_method_thunk(p_arg1); - GD_MONO_END_RUNTIME_INVOKE; -} - -template <class R, class P1> -R invoke_method_thunk(R (*p_method_thunk)(P1), P1 p_arg1) { - GD_MONO_BEGIN_RUNTIME_INVOKE; - R r = p_method_thunk(p_arg1); - GD_MONO_END_RUNTIME_INVOKE; - return r; -} - -template <class P1, class P2> -void invoke_method_thunk(void (*p_method_thunk)(P1, P2), P1 p_arg1, P2 p_arg2) { - GD_MONO_BEGIN_RUNTIME_INVOKE; - p_method_thunk(p_arg1, p_arg2); - GD_MONO_END_RUNTIME_INVOKE; -} - -template <class R, class P1, class P2> -R invoke_method_thunk(R (*p_method_thunk)(P1, P2), P1 p_arg1, P2 p_arg2) { - GD_MONO_BEGIN_RUNTIME_INVOKE; - R r = p_method_thunk(p_arg1, p_arg2); - GD_MONO_END_RUNTIME_INVOKE; - return r; -} - -template <class P1, class P2, class P3> -void invoke_method_thunk(void (*p_method_thunk)(P1, P2, P3), P1 p_arg1, P2 p_arg2, P3 p_arg3) { - GD_MONO_BEGIN_RUNTIME_INVOKE; - p_method_thunk(p_arg1, p_arg2, p_arg3); - GD_MONO_END_RUNTIME_INVOKE; -} - -template <class R, class P1, class P2, class P3> -R invoke_method_thunk(R (*p_method_thunk)(P1, P2, P3), P1 p_arg1, P2 p_arg2, P3 p_arg3) { - GD_MONO_BEGIN_RUNTIME_INVOKE; - R r = p_method_thunk(p_arg1, p_arg2, p_arg3); - GD_MONO_END_RUNTIME_INVOKE; - return r; -} - -template <class P1, class P2, class P3, class P4> -void invoke_method_thunk(void (*p_method_thunk)(P1, P2, P3, P4), P1 p_arg1, P2 p_arg2, P3 p_arg3, P4 p_arg4) { - GD_MONO_BEGIN_RUNTIME_INVOKE; - p_method_thunk(p_arg1, p_arg2, p_arg3, p_arg4); - GD_MONO_END_RUNTIME_INVOKE; -} - -template <class R, class P1, class P2, class P3, class P4> -R invoke_method_thunk(R (*p_method_thunk)(P1, P2, P3, P4), P1 p_arg1, P2 p_arg2, P3 p_arg3, P4 p_arg4) { - GD_MONO_BEGIN_RUNTIME_INVOKE; - R r = p_method_thunk(p_arg1, p_arg2, p_arg3, p_arg4); - GD_MONO_END_RUNTIME_INVOKE; - return r; -} - -template <class P1, class P2, class P3, class P4, class P5> -void invoke_method_thunk(void (*p_method_thunk)(P1, P2, P3, P4, P5), P1 p_arg1, P2 p_arg2, P3 p_arg3, P4 p_arg4, P5 p_arg5) { - GD_MONO_BEGIN_RUNTIME_INVOKE; - p_method_thunk(p_arg1, p_arg2, p_arg3, p_arg4, p_arg5); - GD_MONO_END_RUNTIME_INVOKE; -} - -template <class R, class P1, class P2, class P3, class P4, class P5> -R invoke_method_thunk(R (*p_method_thunk)(P1, P2, P3, P4, P5), P1 p_arg1, P2 p_arg2, P3 p_arg3, P4 p_arg4, P5 p_arg5) { - GD_MONO_BEGIN_RUNTIME_INVOKE; - R r = p_method_thunk(p_arg1, p_arg2, p_arg3, p_arg4, p_arg5); - GD_MONO_END_RUNTIME_INVOKE; - return r; -} - #endif // GD_MONOUTILS_H diff --git a/modules/mono/signal_awaiter_utils.cpp b/modules/mono/signal_awaiter_utils.cpp index 189ceaab1b..ee16327856 100644 --- a/modules/mono/signal_awaiter_utils.cpp +++ b/modules/mono/signal_awaiter_utils.cpp @@ -31,6 +31,7 @@ #include "signal_awaiter_utils.h" #include "csharp_script.h" +#include "mono_gd/gd_mono_cache.h" #include "mono_gd/gd_mono_class.h" #include "mono_gd/gd_mono_marshal.h" #include "mono_gd/gd_mono_utils.h" @@ -98,7 +99,7 @@ Variant SignalAwaiterHandle::_signal_callback(const Variant **p_args, int p_argc MonoException *exc = NULL; GD_MONO_BEGIN_RUNTIME_INVOKE; - invoke_method_thunk(CACHED_METHOD_THUNK(SignalAwaiter, SignalCallback), get_target(), signal_args, &exc); + CACHED_METHOD_THUNK(SignalAwaiter, SignalCallback).invoke(get_target(), signal_args, &exc); GD_MONO_END_RUNTIME_INVOKE; if (exc) { @@ -130,7 +131,7 @@ SignalAwaiterHandle::~SignalAwaiterHandle() { if (awaiter) { MonoException *exc = NULL; GD_MONO_BEGIN_RUNTIME_INVOKE; - invoke_method_thunk(CACHED_METHOD_THUNK(SignalAwaiter, FailureCallback), awaiter, &exc); + CACHED_METHOD_THUNK(SignalAwaiter, FailureCallback).invoke(awaiter, &exc); GD_MONO_END_RUNTIME_INVOKE; if (exc) { diff --git a/modules/mono/utils/string_utils.cpp b/modules/mono/utils/string_utils.cpp index e9efc7626d..88366a6a03 100644 --- a/modules/mono/utils/string_utils.cpp +++ b/modules/mono/utils/string_utils.cpp @@ -216,6 +216,25 @@ String str_format(const char *p_format, ...) { #endif String str_format(const char *p_format, va_list p_list) { + char *buffer = str_format_new(p_format, p_list); + + String res(buffer); + memdelete_arr(buffer); + + return res; +} + +char *str_format_new(const char *p_format, ...) { + va_list list; + + va_start(list, p_format); + char *res = str_format_new(p_format, list); + va_end(list); + + return res; +} + +char *str_format_new(const char *p_format, va_list p_list) { va_list list; va_copy(list, p_list); @@ -230,8 +249,5 @@ String str_format(const char *p_format, va_list p_list) { gd_vsnprintf(buffer, len, p_format, list); va_end(list); - String res(buffer); - memdelete_arr(buffer); - - return res; + return buffer; } diff --git a/modules/mono/utils/string_utils.h b/modules/mono/utils/string_utils.h index 565b9bb644..e7f02955bd 100644 --- a/modules/mono/utils/string_utils.h +++ b/modules/mono/utils/string_utils.h @@ -56,5 +56,7 @@ Error read_all_file_utf8(const String &p_path, String &r_content); String str_format(const char *p_format, ...) _PRINTF_FORMAT_ATTRIBUTE_1_2; String str_format(const char *p_format, va_list p_list) _PRINTF_FORMAT_ATTRIBUTE_1_0; +char *str_format_new(const char *p_format, ...) _PRINTF_FORMAT_ATTRIBUTE_1_2; +char *str_format_new(const char *p_format, va_list p_list) _PRINTF_FORMAT_ATTRIBUTE_1_0; #endif // STRING_FORMAT_H diff --git a/modules/opus/SCsub b/modules/opus/SCsub index 8af4f16a26..1db5b0987e 100644 --- a/modules/opus/SCsub +++ b/modules/opus/SCsub @@ -20,9 +20,6 @@ if env['builtin_opus']: "opus_multistream.c", "opus_multistream_encoder.c", "opus_multistream_decoder.c", - "opus_projection_encoder.c", - "opus_projection_decoder.c", - "mapping_matrix.c", "repacketizer.c", "analysis.c", @@ -56,10 +53,9 @@ if env['builtin_opus']: "celt/vq.c", #"celt/arm/arm_celt_map.c", #"celt/arm/armcpu.c", - #"celt/arm/celt_fft_ne10.c", - #"celt/arm/celt_mdct_ne10.c", + #"celt/arm/celt_ne10_fft.c", + #"celt/arm/celt_ne10_mdct.c", #"celt/arm/celt_neon_intr.c", - #"celt/arm/pitch_neon_intr.c", # Sync with silk_sources.mk "silk/CNG.c", @@ -117,7 +113,6 @@ if env['builtin_opus']: "silk/lin2log.c", "silk/log2lin.c", "silk/LPC_analysis_filter.c", - "silk/LPC_fit.c", "silk/LPC_inv_pred_gain.c", "silk/table_LSF_cos.c", "silk/NLSF2A.c", @@ -155,10 +150,12 @@ if env['builtin_opus']: "silk/fixed/find_pitch_lags_FIX.c", "silk/fixed/find_pred_coefs_FIX.c", "silk/fixed/noise_shape_analysis_FIX.c", + "silk/fixed/prefilter_FIX.c", "silk/fixed/process_gains_FIX.c", "silk/fixed/regularize_correlations_FIX.c", "silk/fixed/residual_energy16_FIX.c", "silk/fixed/residual_energy_FIX.c", + "silk/fixed/solve_LS_FIX.c", "silk/fixed/warped_autocorrelation_FIX.c", "silk/fixed/apply_sine_window_FIX.c", "silk/fixed/autocorr_FIX.c", @@ -183,9 +180,11 @@ if env['builtin_opus']: "silk/float/LTP_analysis_filter_FLP.c", "silk/float/LTP_scale_ctrl_FLP.c", "silk/float/noise_shape_analysis_FLP.c", + "silk/float/prefilter_FLP.c", "silk/float/process_gains_FLP.c", "silk/float/regularize_correlations_FLP.c", "silk/float/residual_energy_FLP.c", + "silk/float/solve_LS_FLP.c", "silk/float/warped_autocorrelation_FLP.c", "silk/float/wrappers_FLP.c", "silk/float/autocorrelation_FLP.c", @@ -194,6 +193,7 @@ if env['builtin_opus']: "silk/float/energy_FLP.c", "silk/float/inner_product_FLP.c", "silk/float/k2a_FLP.c", + "silk/float/levinsondurbin_FLP.c", "silk/float/LPC_inv_pred_gain_FLP.c", "silk/float/pitch_analysis_core_FLP.c", "silk/float/scale_copy_vector_FLP.c", diff --git a/modules/regex/SCsub b/modules/regex/SCsub index 1be5af02a5..6238cd3d9f 100644 --- a/modules/regex/SCsub +++ b/modules/regex/SCsub @@ -6,12 +6,10 @@ Import('env_modules') env_regex = env_modules.Clone() if env['builtin_pcre2']: - jit_blacklist = ['javascript', 'uwp'] - thirdparty_dir = '#thirdparty/pcre2/src/' thirdparty_flags = ['PCRE2_STATIC', 'HAVE_CONFIG_H'] - if 'platform' in env and env['platform'] not in jit_blacklist: + if env['builtin_pcre2_with_jit']: thirdparty_flags.append('SUPPORT_JIT') thirdparty_sources = [ diff --git a/modules/tinyexr/image_saver_tinyexr.cpp b/modules/tinyexr/image_saver_tinyexr.cpp index e1d42d3217..894f223597 100644 --- a/modules/tinyexr/image_saver_tinyexr.cpp +++ b/modules/tinyexr/image_saver_tinyexr.cpp @@ -262,10 +262,6 @@ Error save_exr(const String &p_path, const Ref<Image> &p_img, bool p_grayscale) header.channels = channel_infos; header.pixel_types = pixel_types; header.requested_pixel_types = requested_pixel_types; - // TODO DEBUG REMOVE - for (int i = 0; i < 4; ++i) { - print_line(String("requested_pixel_types{0}: {1}").format(varray(i, requested_pixel_types[i]))); - } CharString utf8_filename = p_path.utf8(); const char *err; diff --git a/modules/visual_script/visual_script_editor.cpp b/modules/visual_script/visual_script_editor.cpp index 6aae2fd15b..b2791cfc8b 100644 --- a/modules/visual_script/visual_script_editor.cpp +++ b/modules/visual_script/visual_script_editor.cpp @@ -1637,7 +1637,7 @@ void VisualScriptEditor::_on_nodes_duplicate() { for (Set<int>::Element *F = to_duplicate.front(); F; F = F->next()) { - // duplicate from the specifc function but place it into the default func as it would lack the connections + // duplicate from the specific function but place it into the default func as it would lack the connections StringName func = _get_function_of_node(F->get()); Ref<VisualScriptNode> node = script->get_node(func, F->get()); @@ -2938,7 +2938,7 @@ void VisualScriptEditor::_graph_connected(const String &p_from, int p_from_slot, if ((to_node_pos.x - from_node_pos.x) < 0) { // to is behind from node if (to_node_pos.x > (from_node_pos.x - to_node_size.x - 240)) - new_to_node_pos.x = from_node_pos.x - to_node_size.x - 240; // approx size of construtor node + padding + new_to_node_pos.x = from_node_pos.x - to_node_size.x - 240; // approx size of constructor node + padding else new_to_node_pos.x = to_node_pos.x; new_to_node_pos.y = to_node_pos.y; @@ -2947,7 +2947,7 @@ void VisualScriptEditor::_graph_connected(const String &p_from, int p_from_slot, } else { // to is ahead of from node if (to_node_pos.x < (from_node_size.x + from_node_pos.x + 240)) - new_to_node_pos.x = from_node_size.x + from_node_pos.x + 240; // approx size of construtor node + padding + new_to_node_pos.x = from_node_size.x + from_node_pos.x + 240; // approx size of constructor node + padding else new_to_node_pos.x = to_node_pos.x; new_to_node_pos.y = to_node_pos.y; diff --git a/modules/visual_script/visual_script_nodes.cpp b/modules/visual_script/visual_script_nodes.cpp index 957127fe61..857d640b43 100644 --- a/modules/visual_script/visual_script_nodes.cpp +++ b/modules/visual_script/visual_script_nodes.cpp @@ -949,7 +949,7 @@ String VisualScriptOperator::get_caption() const { //mathematic L"A + B", //OP_ADD, L"A - B", //OP_SUBTRACT, - L"A x B", //OP_MULTIPLY, + L"A \u00D7 B", //OP_MULTIPLY, L"A \u00F7 B", //OP_DIVIDE, L"\u00AC A", //OP_NEGATE, L"+ A", //OP_POSITIVE, diff --git a/modules/websocket/wsl_peer.cpp b/modules/websocket/wsl_peer.cpp index 32beccde5d..9d610109ed 100644 --- a/modules/websocket/wsl_peer.cpp +++ b/modules/websocket/wsl_peer.cpp @@ -213,7 +213,7 @@ void WSLPeer::make_context(PeerData *p_data, unsigned int p_in_buf_size, unsigne wslay_event_context_server_init(&(_data->ctx), &wsl_callbacks, _data); else wslay_event_context_client_init(&(_data->ctx), &wsl_callbacks, _data); - wslay_event_config_set_max_recv_msg_length(_data->ctx, (1 << p_in_buf_size)); + wslay_event_config_set_max_recv_msg_length(_data->ctx, (1ULL << p_in_buf_size)); } void WSLPeer::set_write_mode(WriteMode p_mode) { diff --git a/platform/android/export/export.cpp b/platform/android/export/export.cpp index 6d021ad33a..4194e129ef 100644 --- a/platform/android/export/export.cpp +++ b/platform/android/export/export.cpp @@ -220,6 +220,7 @@ class EditorExportPlatformAndroid : public EditorExportPlatform { String name; String description; int api_level; + bool usb; }; struct APKExportData { @@ -246,17 +247,20 @@ class EditorExportPlatformAndroid : public EditorExportPlatform { String devices; List<String> args; args.push_back("devices"); + args.push_back("-l"); int ec; OS::get_singleton()->execute(adb, args, true, NULL, &devices, &ec); Vector<String> ds = devices.split("\n"); Vector<String> ldevices; + Vector<bool> ldevices_usbconnection; for (int i = 1; i < ds.size(); i++) { String d = ds[i]; - int dpos = d.find("device"); + int dpos = d.find(" device "); if (dpos == -1) continue; + ldevices_usbconnection.push_back(d.find(" usb:") != -1); d = d.substr(0, dpos).strip_edges(); ldevices.push_back(d); } @@ -287,6 +291,7 @@ class EditorExportPlatformAndroid : public EditorExportPlatform { Device d; d.id = ldevices[i]; + d.usb = ldevices_usbconnection[i]; for (int j = 0; j < ea->devices.size(); j++) { if (ea->devices[j].id == ldevices[i]) { d.description = ea->devices[j].description; @@ -341,9 +346,17 @@ class EditorExportPlatformAndroid : public EditorExportPlatform { } else if (p.begins_with("ro.opengles.version=")) { uint32_t opengl = p.get_slice("=", 1).to_int(); d.description += "OpenGL: " + itos(opengl >> 16) + "." + itos((opengl >> 8) & 0xFF) + "." + itos((opengl)&0xFF) + "\n"; + } else if (p.begins_with("ro.boot.serialno=")) { + d.description += "Serial: " + p.get_slice("=", 1).strip_edges() + "\n"; } } + if (d.usb) { + d.description += "Connection: USB\n"; + } else { + d.description += "Connection: " + d.id + "\n"; + } + d.name = vendor + " " + device; if (device == String()) continue; } @@ -1415,7 +1428,9 @@ public: } const bool use_remote = (p_debug_flags & DEBUG_FLAG_REMOTE_DEBUG) || (p_debug_flags & DEBUG_FLAG_DUMB_CLIENT); - const bool use_reverse = devices[p_device].api_level >= 21; + const bool use_reverse = devices[p_device].api_level >= 21 && devices[p_device].usb; + // Note: Reverse can still fail if device is connected by both usb and network + // Ideally we'd know for sure whether adb reverse would work before we build the APK if (use_reverse) p_debug_flags |= DEBUG_FLAG_REMOTE_DEBUG_LOCALHOST; @@ -1520,7 +1535,7 @@ public: } } else { - static const char *const msg = "--- Device API < 21; debugging over Wi-Fi ---"; + static const char *const msg = "--- Device API < 21 or no USB connection; debugging over Wi-Fi ---"; EditorNode::get_singleton()->get_log()->add_message(msg, EditorLog::MSG_TYPE_EDITOR); print_line(String(msg).to_upper()); } diff --git a/platform/android/java/lib/src/org/godotengine/godot/utils/PermissionsUtil.java b/platform/android/java/lib/src/org/godotengine/godot/utils/PermissionsUtil.java index 2c4a444e5a..21df5a91b0 100644 --- a/platform/android/java/lib/src/org/godotengine/godot/utils/PermissionsUtil.java +++ b/platform/android/java/lib/src/org/godotengine/godot/utils/PermissionsUtil.java @@ -1,3 +1,33 @@ +/*************************************************************************/ +/* PermissionsUtil.java */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ + package org.godotengine.godot.utils; import android.Manifest; diff --git a/platform/iphone/camera_ios.mm b/platform/iphone/camera_ios.mm index ff84df66ff..5636ed6262 100644 --- a/platform/iphone/camera_ios.mm +++ b/platform/iphone/camera_ios.mm @@ -28,7 +28,7 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ -///@TODO this is a near duplicate of CameraOSX, we should find a way to combine those to minimise code duplication!!!! +///@TODO this is a near duplicate of CameraOSX, we should find a way to combine those to minimize code duplication!!!! // If you fix something here, make sure you fix it there as wel! #include "camera_ios.h" diff --git a/platform/javascript/detect.py b/platform/javascript/detect.py index 172072db3c..c05b765c5e 100644 --- a/platform/javascript/detect.py +++ b/platform/javascript/detect.py @@ -24,6 +24,7 @@ def get_opts(): def get_flags(): return [ ('tools', False), + ('builtin_pcre2_with_jit', False), # Disabling the mbedtls module reduces file size. # The module has little use due to the limited networking functionality # in this platform. For the available networking methods, the browser @@ -124,6 +125,10 @@ def configure(env): ## Link flags + # We use IDBFS in javascript_main.cpp. Since Emscripten 1.39.1 it needs to + # be linked explicitly. + env.Append(LIBS=['idbfs.js']) + env.Append(LINKFLAGS=['-s', 'BINARYEN=1']) # Allow increasing memory buffer size during runtime. This is efficient diff --git a/platform/javascript/http_client_javascript.cpp b/platform/javascript/http_client_javascript.cpp index e6e933811f..1f3f2ed53c 100644 --- a/platform/javascript/http_client_javascript.cpp +++ b/platform/javascript/http_client_javascript.cpp @@ -211,6 +211,10 @@ void HTTPClient::set_read_chunk_size(int p_size) { read_limit = p_size; } +int HTTPClient::get_read_chunk_size() const { + return read_limit; +} + Error HTTPClient::poll() { switch (status) { diff --git a/platform/osx/camera_osx.h b/platform/osx/camera_osx.h index 80ca3759ba..7477d8e647 100644 --- a/platform/osx/camera_osx.h +++ b/platform/osx/camera_osx.h @@ -31,7 +31,7 @@ #ifndef CAMERAOSX_H #define CAMERAOSX_H -///@TODO this is a near duplicate of CameraIOS, we should find a way to combine those to minimise code duplication!!!! +///@TODO this is a near duplicate of CameraIOS, we should find a way to combine those to minimize code duplication!!!! // If you fix something here, make sure you fix it there as wel! #include "servers/camera_server.h" @@ -44,4 +44,4 @@ public: void update_feeds(); }; -#endif /* CAMERAOSX_H */
\ No newline at end of file +#endif /* CAMERAOSX_H */ diff --git a/platform/osx/camera_osx.mm b/platform/osx/camera_osx.mm index af09eec2eb..2b0f4906fc 100644 --- a/platform/osx/camera_osx.mm +++ b/platform/osx/camera_osx.mm @@ -28,7 +28,7 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ -///@TODO this is a near duplicate of CameraIOS, we should find a way to combine those to minimise code duplication!!!! +///@TODO this is a near duplicate of CameraIOS, we should find a way to combine those to minimize code duplication!!!! // If you fix something here, make sure you fix it there as wel! #include "camera_osx.h" diff --git a/platform/osx/os_osx.h b/platform/osx/os_osx.h index 09a871f26c..a61b9234d1 100644 --- a/platform/osx/os_osx.h +++ b/platform/osx/os_osx.h @@ -113,9 +113,6 @@ public: NSOpenGLContext *context; bool layered_window; - bool waiting_for_vsync; - NSCondition *vsync_condition; - CVDisplayLinkRef displayLink; CursorShape cursor_shape; NSCursor *cursors[CURSOR_MAX]; diff --git a/platform/osx/os_osx.mm b/platform/osx/os_osx.mm index ba3ac9862e..dac6721fb4 100644 --- a/platform/osx/os_osx.mm +++ b/platform/osx/os_osx.mm @@ -115,21 +115,6 @@ static Vector2 get_mouse_pos(NSPoint locationInWindow, CGFloat backingScaleFacto return Vector2(mouse_x, mouse_y); } -// DisplayLinkCallback is called from our DisplayLink OS thread informing us right before -// a screen update is required. We can use it to work around the broken vsync. -static CVReturn DisplayLinkCallback(CVDisplayLinkRef displayLink, const CVTimeStamp *now, const CVTimeStamp *outputTime, CVOptionFlags flagsIn, CVOptionFlags *flagsOut, void *displayLinkContext) { - OS_OSX *os = (OS_OSX *)displayLinkContext; - - // Set flag so we know we can output our next frame and signal our conditional lock - // if we're not doing vsync this will be ignored - [os->vsync_condition lock]; - os->waiting_for_vsync = false; - [os->vsync_condition signal]; - [os->vsync_condition unlock]; - - return kCVReturnSuccess; -} - @interface GodotApplication : NSApplication @end @@ -1581,15 +1566,6 @@ Error OS_OSX::initialize(const VideoMode &p_desired, int p_video_driver, int p_a [context makeCurrentContext]; - // setup our display link, this will inform us when a refresh is needed - CVDisplayLinkCreateWithActiveCGDisplays(&displayLink); - CVDisplayLinkSetOutputCallback(displayLink, &DisplayLinkCallback, this); - CVDisplayLinkSetCurrentCGDisplayFromOpenGLContext(displayLink, context.CGLContextObj, pixelFormat.CGLPixelFormatObj); - CVDisplayLinkStart(displayLink); - - // initialise a conditional lock object - vsync_condition = [[NSCondition alloc] init]; - set_use_vsync(p_desired.use_vsync); [NSApp activateIgnoringOtherApps:YES]; @@ -1682,11 +1658,6 @@ void OS_OSX::finalize() { midi_driver.close(); #endif - if (displayLink) { - CVDisplayLinkRelease(displayLink); - } - [vsync_condition release]; - CFNotificationCenterRemoveObserver(CFNotificationCenterGetDistributedCenter(), NULL, kTISNotifySelectedKeyboardInputSourceChanged, NULL); CGDisplayRemoveReconfigurationCallback(displays_arrangement_changed, NULL); @@ -2253,23 +2224,11 @@ Error OS_OSX::shell_open(String p_uri) { } String OS_OSX::get_locale() const { - NSString *locale_code = [[NSLocale currentLocale] localeIdentifier]; + NSString *locale_code = [[NSLocale preferredLanguages] objectAtIndex:0]; return [locale_code UTF8String]; } void OS_OSX::swap_buffers() { - if (is_vsync_enabled()) { - // Wait until our DisplayLink callback unsets our flag... - [vsync_condition lock]; - while (waiting_for_vsync) - [vsync_condition wait]; - - // Make sure we wait again next frame around - waiting_for_vsync = true; - - [vsync_condition unlock]; - } - [context flushBuffer]; } @@ -3009,20 +2968,11 @@ Error OS_OSX::move_to_trash(const String &p_path) { } void OS_OSX::_set_use_vsync(bool p_enable) { - // CGLCPSwapInterval broke in OSX 10.14 and it seems Apple is not interested in fixing - // it as OpenGL is now deprecated and Metal solves this differently. - // Following SDLs example we're working around this using DisplayLink - // When vsync is enabled we set a flag "waiting_for_vsync" to true. - // This flag is set to false when DisplayLink informs us our display is about to refresh. - - /* CGLContextObj ctx = CGLGetCurrentContext(); + CGLContextObj ctx = CGLGetCurrentContext(); if (ctx) { GLint swapInterval = p_enable ? 1 : 0; CGLSetParameter(ctx, kCGLCPSwapInterval, &swapInterval); - }*/ - - ///TODO Maybe pause/unpause display link? - waiting_for_vsync = p_enable; + } } OS_OSX *OS_OSX::singleton = NULL; diff --git a/platform/uwp/detect.py b/platform/uwp/detect.py index 7da93eafae..000bd18e7d 100644 --- a/platform/uwp/detect.py +++ b/platform/uwp/detect.py @@ -34,6 +34,7 @@ def get_flags(): return [ ('tools', False), ('xaudio2', True), + ('builtin_pcre2_with_jit', False), ] diff --git a/platform/uwp/export/export.cpp b/platform/uwp/export/export.cpp index 557699cf37..be78e4db20 100644 --- a/platform/uwp/export/export.cpp +++ b/platform/uwp/export/export.cpp @@ -517,7 +517,7 @@ Error AppxPackager::add_file(String p_file_name, const uint8_t *p_buffer, size_t int total_out_before = strm.total_out; int err = deflate(&strm, Z_FULL_FLUSH); - ERR_FAIL_COND_V(err >= 0, ERR_BUG); // Negative means bug + ERR_FAIL_COND_V(err < 0, ERR_BUG); // Negative means bug bh.compressed_size = strm.total_out - total_out_before; diff --git a/scene/2d/collision_object_2d.cpp b/scene/2d/collision_object_2d.cpp index 228b67990c..9f79691405 100644 --- a/scene/2d/collision_object_2d.cpp +++ b/scene/2d/collision_object_2d.cpp @@ -46,8 +46,6 @@ void CollisionObject2D::_notification(int p_what) { else Physics2DServer::get_singleton()->body_set_state(rid, Physics2DServer::BODY_STATE_TRANSFORM, global_transform); - last_transform = global_transform; - RID space = get_world_2d()->get_space(); if (area) { Physics2DServer::get_singleton()->area_set_space(rid, space); @@ -73,19 +71,17 @@ void CollisionObject2D::_notification(int p_what) { } break; case NOTIFICATION_TRANSFORM_CHANGED: { - Transform2D global_transform = get_global_transform(); - - if (only_update_transform_changes && global_transform == last_transform) { + if (only_update_transform_changes) { return; } + Transform2D global_transform = get_global_transform(); + if (area) Physics2DServer::get_singleton()->area_set_transform(rid, global_transform); else Physics2DServer::get_singleton()->body_set_state(rid, Physics2DServer::BODY_STATE_TRANSFORM, global_transform); - last_transform = global_transform; - } break; case NOTIFICATION_EXIT_TREE: { diff --git a/scene/2d/collision_object_2d.h b/scene/2d/collision_object_2d.h index 4e7d01c8e6..0a9d33b8a6 100644 --- a/scene/2d/collision_object_2d.h +++ b/scene/2d/collision_object_2d.h @@ -67,7 +67,6 @@ class CollisionObject2D : public Node2D { int total_subshapes; Map<uint32_t, ShapeData> shapes; - Transform2D last_transform; bool only_update_transform_changes; //this is used for sync physics in KinematicBody protected: diff --git a/scene/2d/path_2d.cpp b/scene/2d/path_2d.cpp index 55c8c7f229..18ace5892a 100644 --- a/scene/2d/path_2d.cpp +++ b/scene/2d/path_2d.cpp @@ -173,16 +173,10 @@ void PathFollow2D::_update_transform() { if (path_length == 0) { return; } - float bounded_offset = offset; - if (loop) - bounded_offset = Math::fposmod(bounded_offset, path_length); - else - bounded_offset = CLAMP(bounded_offset, 0, path_length); - - Vector2 pos = c->interpolate_baked(bounded_offset, cubic); + Vector2 pos = c->interpolate_baked(offset, cubic); if (rotate) { - float ahead = bounded_offset + lookahead; + float ahead = offset + lookahead; if (loop && ahead >= path_length) { // If our lookahead will loop, we need to check if the path is closed. @@ -206,7 +200,7 @@ void PathFollow2D::_update_transform() { // This will happen at the end of non-looping or non-closed paths. // We'll try a look behind instead, in order to get a meaningful angle. tangent_to_curve = - (pos - c->interpolate_baked(bounded_offset - lookahead, cubic)).normalized(); + (pos - c->interpolate_baked(offset - lookahead, cubic)).normalized(); } else { tangent_to_curve = (ahead_pos - pos).normalized(); } diff --git a/scene/2d/tile_map.cpp b/scene/2d/tile_map.cpp index 173214dfe4..d75d8cfc55 100644 --- a/scene/2d/tile_map.cpp +++ b/scene/2d/tile_map.cpp @@ -1233,8 +1233,8 @@ void TileMap::_set_tile_data(const PoolVector<int> &p_data) { } #endif - int16_t x = decode_uint16(&local[0]); - int16_t y = decode_uint16(&local[2]); + uint16_t x = decode_uint16(&local[0]); + uint16_t y = decode_uint16(&local[2]); uint32_t v = decode_uint32(&local[4]); bool flip_h = v & (1 << 29); bool flip_v = v & (1 << 30); diff --git a/scene/3d/gi_probe.cpp b/scene/3d/gi_probe.cpp index ccc87b924c..ce7bb25665 100644 --- a/scene/3d/gi_probe.cpp +++ b/scene/3d/gi_probe.cpp @@ -386,11 +386,7 @@ void GIProbe::_find_meshes(Node *p_at_node, List<PlotMesh> &plot_meshes) { } for (int i = 0; i < p_at_node->get_child_count(); i++) { - Node *child = p_at_node->get_child(i); - if (!child->get_owner()) - continue; //maybe a helper - _find_meshes(child, plot_meshes); } } diff --git a/scene/3d/path.cpp b/scene/3d/path.cpp index d55c795d38..62684bd1e1 100644 --- a/scene/3d/path.cpp +++ b/scene/3d/path.cpp @@ -111,18 +111,15 @@ void PathFollow::_update_transform() { return; } float bi = c->get_bake_interval(); - float o = offset; float o_next = offset + bi; if (loop) { - o = Math::fposmod(o, bl); o_next = Math::fposmod(o_next, bl); } else if (rotation_mode == ROTATION_ORIENTED && o_next >= bl) { - o = bl - bi; o_next = bl; } - Vector3 pos = c->interpolate_baked(o, cubic); + Vector3 pos = c->interpolate_baked(offset, cubic); Transform t = get_transform(); // Vector3 pos_offset = Vector3(h_offset, v_offset, 0); not used in all cases // will be replaced by "Vector3(h_offset, v_offset, 0)" where it was formerly used @@ -136,9 +133,9 @@ void PathFollow::_update_transform() { else forward.normalize(); - Vector3 up = c->interpolate_baked_up_vector(o, true); + Vector3 up = c->interpolate_baked_up_vector(offset, true); - if (o_next < o) { + if (o_next < offset) { Vector3 up1 = c->interpolate_baked_up_vector(o_next, true); Vector3 axis = up.cross(up1); @@ -166,8 +163,8 @@ void PathFollow::_update_transform() { t.origin = pos; - Vector3 t_prev = (pos - c->interpolate_baked(o - delta_offset, cubic)).normalized(); - Vector3 t_cur = (c->interpolate_baked(o + delta_offset, cubic) - pos).normalized(); + Vector3 t_prev = (pos - c->interpolate_baked(offset - delta_offset, cubic)).normalized(); + Vector3 t_cur = (c->interpolate_baked(offset + delta_offset, cubic) - pos).normalized(); Vector3 axis = t_prev.cross(t_cur); float dot = t_prev.dot(t_cur); @@ -190,7 +187,7 @@ void PathFollow::_update_transform() { } // do the additional tilting - float tilt_angle = c->interpolate_baked_tilt(o); + float tilt_angle = c->interpolate_baked_tilt(offset); Vector3 tilt_axis = t_cur; // not sure what tilt is supposed to do, is this correct?? if (likely(!Math::is_zero_approx(Math::abs(tilt_angle)))) { @@ -256,7 +253,7 @@ void PathFollow::_validate_property(PropertyInfo &property) const { if (path && path->get_curve().is_valid()) max = path->get_curve()->get_baked_length(); - property.hint_string = "0," + rtos(max) + ",0.01,or_greater"; + property.hint_string = "0," + rtos(max) + ",0.01,or_lesser"; } } @@ -300,8 +297,8 @@ void PathFollow::_bind_methods() { ClassDB::bind_method(D_METHOD("set_loop", "loop"), &PathFollow::set_loop); ClassDB::bind_method(D_METHOD("has_loop"), &PathFollow::has_loop); - ADD_PROPERTY(PropertyInfo(Variant::REAL, "offset", PROPERTY_HINT_RANGE, "0,10000,0.01,or_greater"), "set_offset", "get_offset"); - ADD_PROPERTY(PropertyInfo(Variant::REAL, "unit_offset", PROPERTY_HINT_RANGE, "0,1,0.0001,or_greater", PROPERTY_USAGE_EDITOR), "set_unit_offset", "get_unit_offset"); + ADD_PROPERTY(PropertyInfo(Variant::REAL, "offset", PROPERTY_HINT_RANGE, "0,10000,0.01,or_lesser"), "set_offset", "get_offset"); + ADD_PROPERTY(PropertyInfo(Variant::REAL, "unit_offset", PROPERTY_HINT_RANGE, "0,1,0.0001,or_lesser", PROPERTY_USAGE_EDITOR), "set_unit_offset", "get_unit_offset"); ADD_PROPERTY(PropertyInfo(Variant::REAL, "h_offset"), "set_h_offset", "get_h_offset"); ADD_PROPERTY(PropertyInfo(Variant::REAL, "v_offset"), "set_v_offset", "get_v_offset"); ADD_PROPERTY(PropertyInfo(Variant::INT, "rotation_mode", PROPERTY_HINT_ENUM, "None,Y,XY,XYZ,Oriented"), "set_rotation_mode", "get_rotation_mode"); @@ -319,8 +316,24 @@ void PathFollow::set_offset(float p_offset) { delta_offset = p_offset - offset; offset = p_offset; - if (path) + if (path) { + if (path->get_curve().is_valid() && path->get_curve()->get_baked_length()) { + float path_length = path->get_curve()->get_baked_length(); + + if (loop) { + while (offset > path_length) + offset -= path_length; + + while (offset < 0) + offset += path_length; + + } else { + offset = CLAMP(offset, 0, path_length); + } + } + _update_transform(); + } _change_notify("offset"); _change_notify("unit_offset"); } diff --git a/scene/animation/animation_node_state_machine.cpp b/scene/animation/animation_node_state_machine.cpp index 65bf1e0134..a37b75d428 100644 --- a/scene/animation/animation_node_state_machine.cpp +++ b/scene/animation/animation_node_state_machine.cpp @@ -312,27 +312,36 @@ float AnimationNodeStateMachinePlayback::process(AnimationNodeStateMachine *p_st bool play_start = false; if (start_request != StringName()) { - if (start_request_travel) { if (!playing) { - String node_name = start_request; - start_request = StringName(); - ERR_FAIL_V_MSG(0, "Can't travel to '" + node_name + "' if state machine is not playing."); - } - - if (!_travel(p_state_machine, start_request)) { - //can't travel, then teleport - path.clear(); - current = start_request; + if (!stop_request && p_state_machine->start_node) { + // can restart, just postpone traveling + path.clear(); + current = p_state_machine->start_node; + playing = true; + play_start = true; + } else { + // stopped, invalid state + String node_name = start_request; + start_request = StringName(); //clear start request + ERR_FAIL_V_MSG(0, "Can't travel to '" + node_name + "' if state machine is not playing."); + } + } else { + if (!_travel(p_state_machine, start_request)) { + // can't travel, then teleport + path.clear(); + current = start_request; + } + start_request = StringName(); //clear start request } } else { + // teleport to start path.clear(); current = start_request; playing = true; play_start = true; + start_request = StringName(); //clear start request } - - start_request = StringName(); //clear start request } bool do_start = (p_seek && p_time == 0) || play_start || current == StringName(); diff --git a/scene/animation/tween.cpp b/scene/animation/tween.cpp index a7d936fcd3..ce3f2b3b1a 100644 --- a/scene/animation/tween.cpp +++ b/scene/animation/tween.cpp @@ -63,6 +63,8 @@ void Tween::_add_pending_command(StringName p_key, const Variant &p_arg1, const count = 2; else if (p_arg1.get_type() != Variant::NIL) count = 1; + else + count = 0; // Add the specified arguments to the command // TODO: Make this a switch statement? diff --git a/scene/gui/dialogs.cpp b/scene/gui/dialogs.cpp index a1b584bad6..b6e647d1af 100644 --- a/scene/gui/dialogs.cpp +++ b/scene/gui/dialogs.cpp @@ -161,7 +161,7 @@ void WindowDialog::_gui_input(const Ref<InputEvent> &p_event) { global_pos.y = MAX(global_pos.y, 0); // Ensure title bar stays visible. Rect2 rect = get_rect(); - Size2 min_size = get_minimum_size(); + Size2 min_size = get_combined_minimum_size(); if (drag_type == DRAG_MOVE) { rect.position = global_pos - drag_offset; diff --git a/scene/gui/gradient_edit.cpp b/scene/gui/gradient_edit.cpp index 09ef6f26bf..5958106419 100644 --- a/scene/gui/gradient_edit.cpp +++ b/scene/gui/gradient_edit.cpp @@ -277,12 +277,13 @@ void GradientEdit::_gui_input(const Ref<InputEvent> &p_event) { if (points[i].offset == newofs && i != grabbed) { valid = false; + break; } } - if (!valid) + if (!valid || grabbed == -1) { return; - + } points.write[grabbed].offset = newofs; points.sort(); diff --git a/scene/gui/graph_edit.cpp b/scene/gui/graph_edit.cpp index 7827c66841..ed9fc0ce51 100644 --- a/scene/gui/graph_edit.cpp +++ b/scene/gui/graph_edit.cpp @@ -819,8 +819,11 @@ void GraphEdit::_gui_input(const Ref<InputEvent> &p_ev) { if (gn && gn->is_selected()) { Vector2 pos = (gn->get_drag_from() * zoom + drag_accum) / zoom; - if (is_using_snap()) { - int snap = get_snap(); + + // Snapping can be toggled temporarily by holding down Ctrl. + // This is done here as to not toggle the grid when holding down Ctrl. + if (is_using_snap() ^ Input::get_singleton()->is_key_pressed(KEY_CONTROL)) { + const int snap = get_snap(); pos = pos.snapped(Vector2(snap, snap)); } diff --git a/scene/gui/item_list.cpp b/scene/gui/item_list.cpp index 1406586361..3884622942 100644 --- a/scene/gui/item_list.cpp +++ b/scene/gui/item_list.cpp @@ -969,16 +969,16 @@ void ItemList::_notification(int p_what) { } if (all_fit) { - float page = size.height - bg->get_minimum_size().height; + float page = MAX(0, size.height - bg->get_minimum_size().height); float max = MAX(page, ofs.y + max_h); if (auto_height) auto_height_value = ofs.y + max_h + bg->get_minimum_size().height; - scroll_bar->set_max(max); - scroll_bar->set_page(page); if (max <= page) { scroll_bar->set_value(0); scroll_bar->hide(); } else { + scroll_bar->set_max(max); + scroll_bar->set_page(page); scroll_bar->show(); if (do_autoscroll_to_bottom) diff --git a/scene/gui/range.cpp b/scene/gui/range.cpp index 9c016b5a50..5682232bc4 100644 --- a/scene/gui/range.cpp +++ b/scene/gui/range.cpp @@ -100,7 +100,6 @@ void Range::set_value(double p_val) { shared->emit_value_changed(); } void Range::set_min(double p_min) { - shared->min = p_min; set_value(shared->val); @@ -109,7 +108,6 @@ void Range::set_min(double p_min) { update_configuration_warning(); } void Range::set_max(double p_max) { - shared->max = p_max; set_value(shared->val); @@ -173,6 +171,8 @@ void Range::set_as_ratio(double p_value) { } double Range::get_as_ratio() const { + ERR_FAIL_COND_V_MSG(Math::is_equal_approx(get_max(), get_min()), 0.0, "Cannot get ratio when minimum and maximum value are equal."); + if (shared->exp_ratio && get_min() >= 0) { double exp_min = get_min() == 0 ? 0.0 : Math::log(get_min()) / Math::log((double)2); diff --git a/scene/gui/scroll_container.cpp b/scene/gui/scroll_container.cpp index a840e3fec1..fa23bf91dd 100644 --- a/scene/gui/scroll_container.cpp +++ b/scene/gui/scroll_container.cpp @@ -388,7 +388,6 @@ void ScrollContainer::update_scrollbars() { if (hide_scroll_v) { v_scroll->hide(); - v_scroll->set_max(0); scroll.y = 0; } else { @@ -406,7 +405,6 @@ void ScrollContainer::update_scrollbars() { if (hide_scroll_h) { h_scroll->hide(); - h_scroll->set_max(0); scroll.x = 0; } else { diff --git a/scene/gui/text_edit.cpp b/scene/gui/text_edit.cpp index 8ddc31745e..2558a930b6 100644 --- a/scene/gui/text_edit.cpp +++ b/scene/gui/text_edit.cpp @@ -417,7 +417,6 @@ void TextEdit::_update_scrollbars() { cursor.line_ofs = 0; cursor.wrap_ofs = 0; v_scroll->set_value(0); - v_scroll->set_max(0); v_scroll->hide(); } @@ -436,7 +435,6 @@ void TextEdit::_update_scrollbars() { cursor.x_ofs = 0; h_scroll->set_value(0); - h_scroll->set_max(0); h_scroll->hide(); } @@ -4593,6 +4591,7 @@ void TextEdit::_scroll_moved(double p_to_val) { break; } } + n_line = MIN(n_line, text.size() - 1); int line_wrap_amount = times_line_wraps(n_line); int wi = line_wrap_amount - (sc - v_scroll_i - 1); wi = CLAMP(wi, 0, line_wrap_amount); diff --git a/scene/gui/tree.h b/scene/gui/tree.h index 361830173b..d5227f6e65 100644 --- a/scene/gui/tree.h +++ b/scene/gui/tree.h @@ -159,7 +159,7 @@ protected: //bind helpers Dictionary _get_range_config(int p_column) { Dictionary d; - double min, max, step; + double min = 0.0, max = 0.0, step = 0.0; get_range_config(p_column, min, max, step); d["min"] = min; d["max"] = max; diff --git a/scene/main/http_request.cpp b/scene/main/http_request.cpp index 6c922adbd2..0ae330b2ed 100644 --- a/scene/main/http_request.cpp +++ b/scene/main/http_request.cpp @@ -457,6 +457,18 @@ String HTTPRequest::get_download_file() const { return download_to_file; } + +void HTTPRequest::set_download_chunk_size(int p_chunk_size) { + + ERR_FAIL_COND(get_http_client_status() != HTTPClient::STATUS_DISCONNECTED); + + client->set_read_chunk_size(p_chunk_size); +} + +int HTTPRequest::get_download_chunk_size() const { + return client->get_read_chunk_size(); +} + HTTPClient::Status HTTPRequest::get_http_client_status() const { return client->get_status(); } @@ -524,9 +536,13 @@ void HTTPRequest::_bind_methods() { ClassDB::bind_method(D_METHOD("set_timeout", "timeout"), &HTTPRequest::set_timeout); ClassDB::bind_method(D_METHOD("get_timeout"), &HTTPRequest::get_timeout); + ClassDB::bind_method(D_METHOD("set_download_chunk_size"), &HTTPRequest::set_download_chunk_size); + ClassDB::bind_method(D_METHOD("get_download_chunk_size"), &HTTPRequest::get_download_chunk_size); + ClassDB::bind_method(D_METHOD("_timeout"), &HTTPRequest::_timeout); ADD_PROPERTY(PropertyInfo(Variant::STRING, "download_file", PROPERTY_HINT_FILE), "set_download_file", "get_download_file"); + ADD_PROPERTY(PropertyInfo(Variant::INT, "download_chunk_size", PROPERTY_HINT_RANGE, "256,16777216"), "set_download_chunk_size", "get_download_chunk_size"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "use_threads"), "set_use_threads", "is_using_threads"); ADD_PROPERTY(PropertyInfo(Variant::INT, "body_size_limit", PROPERTY_HINT_RANGE, "-1,2000000000"), "set_body_size_limit", "get_body_size_limit"); ADD_PROPERTY(PropertyInfo(Variant::INT, "max_redirects", PROPERTY_HINT_RANGE, "-1,64"), "set_max_redirects", "get_max_redirects"); diff --git a/scene/main/http_request.h b/scene/main/http_request.h index f1f91235a6..fa01172d9f 100644 --- a/scene/main/http_request.h +++ b/scene/main/http_request.h @@ -126,6 +126,9 @@ public: void set_download_file(const String &p_file); String get_download_file() const; + void set_download_chunk_size(int p_chunk_size); + int get_download_chunk_size() const; + void set_body_size_limit(int p_bytes); int get_body_size_limit() const; diff --git a/scene/main/node.cpp b/scene/main/node.cpp index 217dacfbfe..616ccc00cb 100644 --- a/scene/main/node.cpp +++ b/scene/main/node.cpp @@ -835,19 +835,31 @@ bool Node::is_processing_internal() const { void Node::set_process_priority(int p_priority) { data.process_priority = p_priority; - ERR_FAIL_COND(!data.tree); + // Make sure we are in SceneTree. + if (data.tree == NULL) { + return; + } - if (is_processing()) + if (is_processing()) { data.tree->make_group_changed("idle_process"); + } - if (is_processing_internal()) + if (is_processing_internal()) { data.tree->make_group_changed("idle_process_internal"); + } - if (is_physics_processing()) + if (is_physics_processing()) { data.tree->make_group_changed("physics_process"); + } - if (is_physics_processing_internal()) + if (is_physics_processing_internal()) { data.tree->make_group_changed("physics_process_internal"); + } +} + +int Node::get_process_priority() const { + + return data.process_priority; } void Node::set_process_input(bool p_enable) { @@ -2754,6 +2766,7 @@ void Node::_bind_methods() { ClassDB::bind_method(D_METHOD("get_process_delta_time"), &Node::get_process_delta_time); ClassDB::bind_method(D_METHOD("set_process", "enable"), &Node::set_process); ClassDB::bind_method(D_METHOD("set_process_priority", "priority"), &Node::set_process_priority); + ClassDB::bind_method(D_METHOD("get_process_priority"), &Node::get_process_priority); ClassDB::bind_method(D_METHOD("is_processing"), &Node::is_processing); ClassDB::bind_method(D_METHOD("set_process_input", "enable"), &Node::set_process_input); ClassDB::bind_method(D_METHOD("is_processing_input"), &Node::is_processing_input); @@ -2894,6 +2907,7 @@ void Node::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "owner", PROPERTY_HINT_RESOURCE_TYPE, "Node", 0), "set_owner", "get_owner"); ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "multiplayer", PROPERTY_HINT_RESOURCE_TYPE, "MultiplayerAPI", 0), "", "get_multiplayer"); ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "custom_multiplayer", PROPERTY_HINT_RESOURCE_TYPE, "MultiplayerAPI", 0), "set_custom_multiplayer", "get_custom_multiplayer"); + ADD_PROPERTY(PropertyInfo(Variant::INT, "process_priority"), "set_process_priority", "get_process_priority"); BIND_VMETHOD(MethodInfo("_process", PropertyInfo(Variant::REAL, "delta"))); BIND_VMETHOD(MethodInfo("_physics_process", PropertyInfo(Variant::REAL, "delta"))); diff --git a/scene/main/node.h b/scene/main/node.h index a8bcd2f273..6d0ff7e5cf 100644 --- a/scene/main/node.h +++ b/scene/main/node.h @@ -350,6 +350,7 @@ public: bool is_processing_internal() const; void set_process_priority(int p_priority); + int get_process_priority() const; void set_process_input(bool p_enable); bool is_processing_input() const; diff --git a/scene/main/scene_tree.cpp b/scene/main/scene_tree.cpp index 78ceccfca2..3a6fff45c5 100644 --- a/scene/main/scene_tree.cpp +++ b/scene/main/scene_tree.cpp @@ -2066,7 +2066,7 @@ SceneTree::SceneTree() { int ref_atlas_subdiv = GLOBAL_DEF("rendering/quality/reflections/atlas_subdiv", 8); ProjectSettings::get_singleton()->set_custom_property_info("rendering/quality/reflections/atlas_subdiv", PropertyInfo(Variant::INT, "rendering/quality/reflections/atlas_subdiv", PROPERTY_HINT_RANGE, "0,32,or_greater")); //next_power_of_2 will return a 0 as min value int msaa_mode = GLOBAL_DEF("rendering/quality/filters/msaa", 0); - ProjectSettings::get_singleton()->set_custom_property_info("rendering/quality/filters/msaa", PropertyInfo(Variant::INT, "rendering/quality/filters/msaa", PROPERTY_HINT_ENUM, "Disabled,2x,4x,8x,16x,External 2x,External 4x")); + ProjectSettings::get_singleton()->set_custom_property_info("rendering/quality/filters/msaa", PropertyInfo(Variant::INT, "rendering/quality/filters/msaa", PROPERTY_HINT_ENUM, "Disabled,2x,4x,8x,16x,AndroidVR 2x,AndroidVR 4x")); root->set_msaa(Viewport::MSAA(msaa_mode)); GLOBAL_DEF("rendering/quality/depth/hdr", true); diff --git a/scene/main/timer.cpp b/scene/main/timer.cpp index 14cc705edb..da96c6e89c 100755 --- a/scene/main/timer.cpp +++ b/scene/main/timer.cpp @@ -108,7 +108,7 @@ bool Timer::has_autostart() const { void Timer::start(float p_time) { - ERR_FAIL_COND_MSG(!is_inside_tree(), "Timer was not added to the SceneTree!"); + ERR_FAIL_COND_MSG(!is_inside_tree(), "Timer was not added to the SceneTree. Either add it or set autostart to true."); if (p_time > 0) { set_wait_time(p_time); diff --git a/scene/main/viewport.cpp b/scene/main/viewport.cpp index 563fcb9961..3ad44a4a2e 100644 --- a/scene/main/viewport.cpp +++ b/scene/main/viewport.cpp @@ -3187,7 +3187,7 @@ void Viewport::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::BOOL, "transparent_bg"), "set_transparent_background", "has_transparent_background"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "handle_input_locally"), "set_handle_input_locally", "is_handling_input_locally"); ADD_GROUP("Rendering", ""); - ADD_PROPERTY(PropertyInfo(Variant::INT, "msaa", PROPERTY_HINT_ENUM, "Disabled,2x,4x,8x,16x,External 2x,External 4x"), "set_msaa", "get_msaa"); + ADD_PROPERTY(PropertyInfo(Variant::INT, "msaa", PROPERTY_HINT_ENUM, "Disabled,2x,4x,8x,16x,AndroidVR 2x,AndroidVR 4x"), "set_msaa", "get_msaa"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "hdr"), "set_hdr", "get_hdr"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "disable_3d"), "set_disable_3d", "is_3d_disabled"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "keep_3d_linear"), "set_keep_3d_linear", "get_keep_3d_linear"); diff --git a/scene/resources/audio_stream_sample.cpp b/scene/resources/audio_stream_sample.cpp index 5b61654c5d..286f9e37cd 100644 --- a/scene/resources/audio_stream_sample.cpp +++ b/scene/resources/audio_stream_sample.cpp @@ -95,8 +95,8 @@ void AudioStreamPlaybackSample::do_resample(const Depth *p_src, AudioFrame *p_ds // this function will be compiled branchless by any decent compiler int32_t final, final_r, next, next_r; - while (amount--) { - + while (amount) { + amount--; int64_t pos = offset >> MIX_FRAC_BITS; if (is_stereo && !is_ima_adpcm) pos <<= 1; @@ -444,6 +444,7 @@ int AudioStreamSample::get_loop_end() const { void AudioStreamSample::set_mix_rate(int p_hz) { + ERR_FAIL_COND(p_hz == 0); mix_rate = p_hz; } int AudioStreamSample::get_mix_rate() const { diff --git a/scene/resources/environment.cpp b/scene/resources/environment.cpp index bc96b5e9f3..ddf97f48d1 100644 --- a/scene/resources/environment.cpp +++ b/scene/resources/environment.cpp @@ -978,7 +978,9 @@ void Environment::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "background_sky", PROPERTY_HINT_RESOURCE_TYPE, "Sky"), "set_sky", "get_sky"); ADD_PROPERTY(PropertyInfo(Variant::REAL, "background_sky_custom_fov", PROPERTY_HINT_RANGE, "0,180,0.1"), "set_sky_custom_fov", "get_sky_custom_fov"); ADD_PROPERTY(PropertyInfo(Variant::BASIS, "background_sky_orientation"), "set_sky_orientation", "get_sky_orientation"); - ADD_PROPERTY(PropertyInfo(Variant::VECTOR3, "background_sky_rotation", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_EDITOR), "set_sky_rotation", "get_sky_rotation"); + // Only display rotation in degrees in the inspector (like in Spatial). + // This avoids displaying the same information twice. + ADD_PROPERTY(PropertyInfo(Variant::VECTOR3, "background_sky_rotation", PROPERTY_HINT_NONE, "", 0), "set_sky_rotation", "get_sky_rotation"); ADD_PROPERTY(PropertyInfo(Variant::VECTOR3, "background_sky_rotation_degrees", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_EDITOR), "set_sky_rotation_degrees", "get_sky_rotation_degrees"); ADD_PROPERTY(PropertyInfo(Variant::COLOR, "background_color"), "set_bg_color", "get_bg_color"); ADD_PROPERTY(PropertyInfo(Variant::REAL, "background_energy", PROPERTY_HINT_RANGE, "0,16,0.01"), "set_bg_energy", "get_bg_energy"); diff --git a/scene/resources/material.cpp b/scene/resources/material.cpp index fab0aace14..41bf7f4bf0 100644 --- a/scene/resources/material.cpp +++ b/scene/resources/material.cpp @@ -1405,8 +1405,8 @@ void SpatialMaterial::set_texture(TextureParam p_param, const Ref<Texture> &p_te textures[p_param] = p_texture; RID rid = p_texture.is_valid() ? p_texture->get_rid() : RID(); VS::get_singleton()->material_set_param(_get_material(), shader_names->texture_names[p_param], rid); - _queue_shader_change(); _change_notify(); + _queue_shader_change(); } Ref<Texture> SpatialMaterial::get_texture(TextureParam p_param) const { diff --git a/scene/resources/material.h b/scene/resources/material.h index 2423d6d48b..11f8f20cf3 100644 --- a/scene/resources/material.h +++ b/scene/resources/material.h @@ -252,7 +252,7 @@ private: uint64_t flags : 18; uint64_t detail_blend_mode : 2; uint64_t diffuse_mode : 3; - uint64_t specular_mode : 2; + uint64_t specular_mode : 3; uint64_t invalid_key : 1; uint64_t deep_parallax : 1; uint64_t billboard_mode : 2; @@ -260,6 +260,8 @@ private: uint64_t proximity_fade : 1; uint64_t distance_fade : 2; uint64_t emission_op : 1; + uint64_t texture_metallic : 1; + uint64_t texture_roughness : 1; }; uint64_t key; @@ -305,6 +307,8 @@ private: mk.proximity_fade = proximity_fade_enabled; mk.distance_fade = distance_fade; mk.emission_op = emission_op; + mk.texture_metallic = textures[TEXTURE_METALLIC].is_valid() ? 1 : 0; + mk.texture_roughness = textures[TEXTURE_ROUGHNESS].is_valid() ? 1 : 0; return mk; } diff --git a/scene/resources/style_box.cpp b/scene/resources/style_box.cpp index 9ee7c2936e..f26b57b572 100644 --- a/scene/resources/style_box.cpp +++ b/scene/resources/style_box.cpp @@ -81,6 +81,10 @@ Size2 StyleBox::get_center_size() const { return Size2(); } +Rect2 StyleBox::get_draw_rect(const Rect2 &p_rect) const { + return p_rect; +} + void StyleBox::_bind_methods() { ClassDB::bind_method(D_METHOD("test_mask", "point", "rect"), &StyleBox::test_mask); @@ -175,6 +179,10 @@ float StyleBoxTexture::get_style_margin(Margin p_margin) const { return margin[p_margin]; } +Rect2 StyleBoxTexture::get_draw_rect(const Rect2 &p_rect) const { + return p_rect.grow_individual(expand_margin[MARGIN_LEFT], expand_margin[MARGIN_TOP], expand_margin[MARGIN_RIGHT], expand_margin[MARGIN_BOTTOM]); +} + void StyleBoxTexture::draw(RID p_canvas_item, const Rect2 &p_rect) const { if (texture.is_null()) return; @@ -685,6 +693,19 @@ inline void adapt_values(int p_index_a, int p_index_b, int *adapted_values, cons adapted_values[p_index_a] = MIN(p_max_a, adapted_values[p_index_a]); adapted_values[p_index_b] = MIN(p_max_b, adapted_values[p_index_b]); } + +Rect2 StyleBoxFlat::get_draw_rect(const Rect2 &p_rect) const { + Rect2 draw_rect = p_rect.grow_individual(expand_margin[MARGIN_LEFT], expand_margin[MARGIN_TOP], expand_margin[MARGIN_RIGHT], expand_margin[MARGIN_BOTTOM]); + + if (shadow_size > 0) { + Rect2 shadow_rect = draw_rect.grow(shadow_size); + shadow_rect.position += shadow_offset; + draw_rect = draw_rect.merge(shadow_rect); + } + + return draw_rect; +} + void StyleBoxFlat::draw(RID p_canvas_item, const Rect2 &p_rect) const { //PREPARATIONS @@ -694,6 +715,11 @@ void StyleBoxFlat::draw(RID p_canvas_item, const Rect2 &p_rect) const { return; } + Rect2 style_rect = p_rect.grow_individual(expand_margin[MARGIN_LEFT], expand_margin[MARGIN_TOP], expand_margin[MARGIN_RIGHT], expand_margin[MARGIN_BOTTOM]); + if (Math::is_zero_approx(style_rect.size.width) || Math::is_zero_approx(style_rect.size.height)) { + return; + } + bool rounded_corners = (corner_radius[0] > 0) || (corner_radius[1] > 0) || (corner_radius[2] > 0) || (corner_radius[3] > 0); bool aa_on = rounded_corners && anti_aliased; @@ -701,7 +727,6 @@ void StyleBoxFlat::draw(RID p_canvas_item, const Rect2 &p_rect) const { bool blend_on = blend_border && draw_border; - Rect2 style_rect = p_rect.grow_individual(expand_margin[MARGIN_LEFT], expand_margin[MARGIN_TOP], expand_margin[MARGIN_RIGHT], expand_margin[MARGIN_BOTTOM]); Rect2 border_style_rect = style_rect; if (aa_on && !blend_on) { float aa_size_grow = 0.5 * ((aa_size + 1) / 2); diff --git a/scene/resources/style_box.h b/scene/resources/style_box.h index d02e107480..ec07b5e885 100644 --- a/scene/resources/style_box.h +++ b/scene/resources/style_box.h @@ -56,6 +56,7 @@ public: float get_margin(Margin p_margin) const; virtual Size2 get_center_size() const; + virtual Rect2 get_draw_rect(const Rect2 &p_rect) const; virtual void draw(RID p_canvas_item, const Rect2 &p_rect) const = 0; CanvasItem *get_current_item_drawn() const; @@ -133,6 +134,7 @@ public: void set_modulate(const Color &p_modulate); Color get_modulate() const; + virtual Rect2 get_draw_rect(const Rect2 &p_rect) const; virtual void draw(RID p_canvas_item, const Rect2 &p_rect) const; StyleBoxTexture(); @@ -227,6 +229,7 @@ public: virtual Size2 get_center_size() const; + virtual Rect2 get_draw_rect(const Rect2 &p_rect) const; virtual void draw(RID p_canvas_item, const Rect2 &p_rect) const; StyleBoxFlat(); diff --git a/servers/visual/shader_language.cpp b/servers/visual/shader_language.cpp index 9babc99349..316a94556d 100644 --- a/servers/visual/shader_language.cpp +++ b/servers/visual/shader_language.cpp @@ -3769,8 +3769,8 @@ ShaderLanguage::Node *ShaderLanguage::_reduce_expression(BlockNode *p_block, Sha nv.sint = -cn->values[i].sint; } break; case TYPE_UINT: { - // FIXME: This can't work on uint - nv.uint = -cn->values[i].uint; + // Intentionally wrap the unsigned int value, because GLSL does. + nv.uint = 0 - cn->values[i].uint; } break; case TYPE_FLOAT: { nv.real = -cn->values[i].real; diff --git a/servers/visual/visual_server_canvas.cpp b/servers/visual/visual_server_canvas.cpp index ed06a67e4c..7bb97e0577 100644 --- a/servers/visual/visual_server_canvas.cpp +++ b/servers/visual/visual_server_canvas.cpp @@ -75,10 +75,10 @@ void _collect_ysort_children(VisualServerCanvas::Item *p_canvas_item, Transform2 } void _mark_ysort_dirty(VisualServerCanvas::Item *ysort_owner, RID_Owner<VisualServerCanvas::Item> &canvas_item_owner) { - while (ysort_owner && ysort_owner->sort_y) { + do { ysort_owner->ysort_children_count = -1; ysort_owner = canvas_item_owner.owns(ysort_owner->parent) ? canvas_item_owner.getornull(ysort_owner->parent) : NULL; - } + } while (ysort_owner && ysort_owner->sort_y); } void VisualServerCanvas::_render_canvas_item(Item *p_canvas_item, const Transform2D &p_transform, const Rect2 &p_clip_rect, const Color &p_modulate, int p_z, RasterizerCanvas::Item **z_list, RasterizerCanvas::Item **z_last_list, Item *p_canvas_clip, Item *p_material_owner) { @@ -362,7 +362,9 @@ void VisualServerCanvas::canvas_item_set_parent(RID p_item, RID p_parent) { Item *item_owner = canvas_item_owner.get(canvas_item->parent); item_owner->child_items.erase(canvas_item); - _mark_ysort_dirty(item_owner, canvas_item_owner); + if (item_owner->sort_y) { + _mark_ysort_dirty(item_owner, canvas_item_owner); + } } canvas_item->parent = RID(); @@ -382,7 +384,9 @@ void VisualServerCanvas::canvas_item_set_parent(RID p_item, RID p_parent) { item_owner->child_items.push_back(canvas_item); item_owner->children_order_dirty = true; - _mark_ysort_dirty(item_owner, canvas_item_owner); + if (item_owner->sort_y) { + _mark_ysort_dirty(item_owner, canvas_item_owner); + } } else { @@ -399,9 +403,7 @@ void VisualServerCanvas::canvas_item_set_visible(RID p_item, bool p_visible) { canvas_item->visible = p_visible; - if (canvas_item->parent.is_valid() && canvas_item_owner.owns(canvas_item->parent)) { - _mark_ysort_dirty(canvas_item_owner.get(canvas_item->parent), canvas_item_owner); - } + _mark_ysort_dirty(canvas_item, canvas_item_owner); } void VisualServerCanvas::canvas_item_set_light_mask(RID p_item, int p_mask) { @@ -1382,7 +1384,9 @@ bool VisualServerCanvas::free(RID p_rid) { Item *item_owner = canvas_item_owner.get(canvas_item->parent); item_owner->child_items.erase(canvas_item); - _mark_ysort_dirty(item_owner, canvas_item_owner); + if (item_owner->sort_y) { + _mark_ysort_dirty(item_owner, canvas_item_owner); + } } } diff --git a/thirdparty/README.md b/thirdparty/README.md index 27cfe41238..9571ee49b9 100644 --- a/thirdparty/README.md +++ b/thirdparty/README.md @@ -397,19 +397,17 @@ Files extracted from the upstream source: ## opus - Upstream: https://opus-codec.org -- Version: 1.3.1 (opus) and 0.11 (opusfile) +- Version: 1.1.5 (opus) and 0.8 (opusfile) - License: BSD-3-Clause Files extracted from upstream source: -- Run `opus/configure` and copy/sync changes to `config.h` - (note that this file may have Godot-specific options enabled) - all .c and .h files in src/ (both opus and opusfile) - all .h files in include/ (both opus and opusfile) as opus/ - remove unused `opus_demo.c`, - remove `http.c`, `wincerts.c` and `winerrno.h` (part of unused libopusurl) -- celt/ and silk/ subfolders (minus tests folders) +- celt/ and silk/ subfolders - COPYING diff --git a/thirdparty/opus/analysis.c b/thirdparty/opus/analysis.c index cb46dec582..663431a436 100644 --- a/thirdparty/opus/analysis.c +++ b/thirdparty/opus/analysis.c @@ -29,29 +29,20 @@ #include "config.h" #endif -#define ANALYSIS_C - -#include <stdio.h> - -#include "mathops.h" #include "kiss_fft.h" #include "celt.h" #include "modes.h" #include "arch.h" #include "quant_bands.h" +#include <stdio.h> #include "analysis.h" #include "mlp.h" #include "stack_alloc.h" -#include "float_cast.h" #ifndef M_PI #define M_PI 3.141592653 #endif -#ifndef DISABLE_FLOAT_API - -#define TRANSITION_PENALTY 10 - static const float dct_table[128] = { 0.250000f, 0.250000f, 0.250000f, 0.250000f, 0.250000f, 0.250000f, 0.250000f, 0.250000f, 0.250000f, 0.250000f, 0.250000f, 0.250000f, 0.250000f, 0.250000f, 0.250000f, 0.250000f, @@ -105,118 +96,52 @@ static const float analysis_window[240] = { }; static const int tbands[NB_TBANDS+1] = { - 4, 8, 12, 16, 20, 24, 28, 32, 40, 48, 56, 64, 80, 96, 112, 136, 160, 192, 240 + 2, 4, 6, 8, 10, 12, 14, 16, 20, 24, 28, 32, 40, 48, 56, 68, 80, 96, 120 }; -#define NB_TONAL_SKIP_BANDS 9 +static const int extra_bands[NB_TOT_BANDS+1] = { + 1, 2, 4, 6, 8, 10, 12, 14, 16, 20, 24, 28, 32, 40, 48, 56, 68, 80, 96, 120, 160, 200 +}; -static opus_val32 silk_resampler_down2_hp( - opus_val32 *S, /* I/O State vector [ 2 ] */ - opus_val32 *out, /* O Output signal [ floor(len/2) ] */ - const opus_val32 *in, /* I Input signal [ len ] */ - int inLen /* I Number of input samples */ -) -{ - int k, len2 = inLen/2; - opus_val32 in32, out32, out32_hp, Y, X; - opus_val64 hp_ener = 0; - /* Internal variables and state are in Q10 format */ - for( k = 0; k < len2; k++ ) { - /* Convert to Q10 */ - in32 = in[ 2 * k ]; - - /* All-pass section for even input sample */ - Y = SUB32( in32, S[ 0 ] ); - X = MULT16_32_Q15(QCONST16(0.6074371f, 15), Y); - out32 = ADD32( S[ 0 ], X ); - S[ 0 ] = ADD32( in32, X ); - out32_hp = out32; - /* Convert to Q10 */ - in32 = in[ 2 * k + 1 ]; - - /* All-pass section for odd input sample, and add to output of previous section */ - Y = SUB32( in32, S[ 1 ] ); - X = MULT16_32_Q15(QCONST16(0.15063f, 15), Y); - out32 = ADD32( out32, S[ 1 ] ); - out32 = ADD32( out32, X ); - S[ 1 ] = ADD32( in32, X ); - - Y = SUB32( -in32, S[ 2 ] ); - X = MULT16_32_Q15(QCONST16(0.15063f, 15), Y); - out32_hp = ADD32( out32_hp, S[ 2 ] ); - out32_hp = ADD32( out32_hp, X ); - S[ 2 ] = ADD32( -in32, X ); - - hp_ener += out32_hp*(opus_val64)out32_hp; - /* Add, convert back to int16 and store to output */ - out[ k ] = HALF32(out32); - } -#ifdef FIXED_POINT - /* len2 can be up to 480, so we shift by 8 more to make it fit. */ - hp_ener = hp_ener >> (2*SIG_SHIFT + 8); -#endif - return (opus_val32)hp_ener; -} +/*static const float tweight[NB_TBANDS+1] = { + .3, .4, .5, .6, .7, .8, .9, 1., 1., 1., 1., 1., 1., 1., .8, .7, .6, .5 +};*/ -static opus_val32 downmix_and_resample(downmix_func downmix, const void *_x, opus_val32 *y, opus_val32 S[3], int subframe, int offset, int c1, int c2, int C, int Fs) -{ - VARDECL(opus_val32, tmp); - opus_val32 scale; - int j; - opus_val32 ret = 0; - SAVE_STACK; - - if (subframe==0) return 0; - if (Fs == 48000) - { - subframe *= 2; - offset *= 2; - } else if (Fs == 16000) { - subframe = subframe*2/3; - offset = offset*2/3; - } - ALLOC(tmp, subframe, opus_val32); +#define NB_TONAL_SKIP_BANDS 9 - downmix(_x, tmp, subframe, offset, c1, c2, C); -#ifdef FIXED_POINT - scale = (1<<SIG_SHIFT); -#else - scale = 1.f/32768; -#endif - if (c2==-2) - scale /= C; - else if (c2>-1) - scale /= 2; - for (j=0;j<subframe;j++) - tmp[j] *= scale; - if (Fs == 48000) +#define cA 0.43157974f +#define cB 0.67848403f +#define cC 0.08595542f +#define cE ((float)M_PI/2) +static OPUS_INLINE float fast_atan2f(float y, float x) { + float x2, y2; + /* Should avoid underflow on the values we'll get */ + if (ABS16(x)+ABS16(y)<1e-9f) { - ret = silk_resampler_down2_hp(S, y, tmp, subframe); - } else if (Fs == 24000) { - OPUS_COPY(y, tmp, subframe); - } else if (Fs == 16000) { - VARDECL(opus_val32, tmp3x); - ALLOC(tmp3x, 3*subframe, opus_val32); - /* Don't do this at home! This resampler is horrible and it's only (barely) - usable for the purpose of the analysis because we don't care about all - the aliasing between 8 kHz and 12 kHz. */ - for (j=0;j<subframe;j++) - { - tmp3x[3*j] = tmp[j]; - tmp3x[3*j+1] = tmp[j]; - tmp3x[3*j+2] = tmp[j]; - } - silk_resampler_down2_hp(S, y, tmp3x, 3*subframe); + x*=1e12f; + y*=1e12f; + } + x2 = x*x; + y2 = y*y; + if(x2<y2){ + float den = (y2 + cB*x2) * (y2 + cC*x2); + if (den!=0) + return -x*y*(y2 + cA*x2) / den + (y<0 ? -cE : cE); + else + return (y<0 ? -cE : cE); + }else{ + float den = (x2 + cB*y2) * (x2 + cC*y2); + if (den!=0) + return x*y*(x2 + cA*y2) / den + (y<0 ? -cE : cE) - (x*y<0 ? -cE : cE); + else + return (y<0 ? -cE : cE) - (x*y<0 ? -cE : cE); } - RESTORE_STACK; - return ret; } -void tonality_analysis_init(TonalityAnalysisState *tonal, opus_int32 Fs) +void tonality_analysis_init(TonalityAnalysisState *tonal) { /* Initialize reusable fields. */ tonal->arch = opus_select_arch(); - tonal->Fs = Fs; /* Clear remaining fields. */ tonality_analysis_reset(tonal); } @@ -232,34 +157,15 @@ void tonality_get_info(TonalityAnalysisState *tonal, AnalysisInfo *info_out, int { int pos; int curr_lookahead; - float tonality_max; - float tonality_avg; - int tonality_count; + float psum; int i; - int pos0; - float prob_avg; - float prob_count; - float prob_min, prob_max; - float vad_prob; - int mpos, vpos; - int bandwidth_span; pos = tonal->read_pos; curr_lookahead = tonal->write_pos-tonal->read_pos; if (curr_lookahead<0) curr_lookahead += DETECT_SIZE; - tonal->read_subframe += len/(tonal->Fs/400); - while (tonal->read_subframe>=8) - { - tonal->read_subframe -= 8; - tonal->read_pos++; - } - if (tonal->read_pos>=DETECT_SIZE) - tonal->read_pos-=DETECT_SIZE; - - /* On long frames, look at the second analysis window rather than the first. */ - if (len > tonal->Fs/50 && pos != tonal->write_pos) + if (len > 480 && pos != tonal->write_pos) { pos++; if (pos==DETECT_SIZE) @@ -269,177 +175,32 @@ void tonality_get_info(TonalityAnalysisState *tonal, AnalysisInfo *info_out, int pos--; if (pos<0) pos = DETECT_SIZE-1; - pos0 = pos; OPUS_COPY(info_out, &tonal->info[pos], 1); - if (!info_out->valid) - return; - tonality_max = tonality_avg = info_out->tonality; - tonality_count = 1; - /* Look at the neighbouring frames and pick largest bandwidth found (to be safe). */ - bandwidth_span = 6; - /* If possible, look ahead for a tone to compensate for the delay in the tone detector. */ - for (i=0;i<3;i++) - { - pos++; - if (pos==DETECT_SIZE) - pos = 0; - if (pos == tonal->write_pos) - break; - tonality_max = MAX32(tonality_max, tonal->info[pos].tonality); - tonality_avg += tonal->info[pos].tonality; - tonality_count++; - info_out->bandwidth = IMAX(info_out->bandwidth, tonal->info[pos].bandwidth); - bandwidth_span--; - } - pos = pos0; - /* Look back in time to see if any has a wider bandwidth than the current frame. */ - for (i=0;i<bandwidth_span;i++) - { - pos--; - if (pos < 0) - pos = DETECT_SIZE-1; - if (pos == tonal->write_pos) - break; - info_out->bandwidth = IMAX(info_out->bandwidth, tonal->info[pos].bandwidth); - } - info_out->tonality = MAX32(tonality_avg/tonality_count, tonality_max-.2f); - - mpos = vpos = pos0; - /* If we have enough look-ahead, compensate for the ~5-frame delay in the music prob and - ~1 frame delay in the VAD prob. */ - if (curr_lookahead > 15) + tonal->read_subframe += len/120; + while (tonal->read_subframe>=4) { - mpos += 5; - if (mpos>=DETECT_SIZE) - mpos -= DETECT_SIZE; - vpos += 1; - if (vpos>=DETECT_SIZE) - vpos -= DETECT_SIZE; - } - - /* The following calculations attempt to minimize a "badness function" - for the transition. When switching from speech to music, the badness - of switching at frame k is - b_k = S*v_k + \sum_{i=0}^{k-1} v_i*(p_i - T) - where - v_i is the activity probability (VAD) at frame i, - p_i is the music probability at frame i - T is the probability threshold for switching - S is the penalty for switching during active audio rather than silence - the current frame has index i=0 - - Rather than apply badness to directly decide when to switch, what we compute - instead is the threshold for which the optimal switching point is now. When - considering whether to switch now (frame 0) or at frame k, we have: - S*v_0 = S*v_k + \sum_{i=0}^{k-1} v_i*(p_i - T) - which gives us: - T = ( \sum_{i=0}^{k-1} v_i*p_i + S*(v_k-v_0) ) / ( \sum_{i=0}^{k-1} v_i ) - We take the min threshold across all positive values of k (up to the maximum - amount of lookahead we have) to give us the threshold for which the current - frame is the optimal switch point. - - The last step is that we need to consider whether we want to switch at all. - For that we use the average of the music probability over the entire window. - If the threshold is higher than that average we're not going to - switch, so we compute a min with the average as well. The result of all these - min operations is music_prob_min, which gives the threshold for switching to music - if we're currently encoding for speech. - - We do the exact opposite to compute music_prob_max which is used for switching - from music to speech. - */ - prob_min = 1.f; - prob_max = 0.f; - vad_prob = tonal->info[vpos].activity_probability; - prob_count = MAX16(.1f, vad_prob); - prob_avg = MAX16(.1f, vad_prob)*tonal->info[mpos].music_prob; - while (1) - { - float pos_vad; - mpos++; - if (mpos==DETECT_SIZE) - mpos = 0; - if (mpos == tonal->write_pos) - break; - vpos++; - if (vpos==DETECT_SIZE) - vpos = 0; - if (vpos == tonal->write_pos) - break; - pos_vad = tonal->info[vpos].activity_probability; - prob_min = MIN16((prob_avg - TRANSITION_PENALTY*(vad_prob - pos_vad))/prob_count, prob_min); - prob_max = MAX16((prob_avg + TRANSITION_PENALTY*(vad_prob - pos_vad))/prob_count, prob_max); - prob_count += MAX16(.1f, pos_vad); - prob_avg += MAX16(.1f, pos_vad)*tonal->info[mpos].music_prob; - } - info_out->music_prob = prob_avg/prob_count; - prob_min = MIN16(prob_avg/prob_count, prob_min); - prob_max = MAX16(prob_avg/prob_count, prob_max); - prob_min = MAX16(prob_min, 0.f); - prob_max = MIN16(prob_max, 1.f); - - /* If we don't have enough look-ahead, do our best to make a decent decision. */ - if (curr_lookahead < 10) - { - float pmin, pmax; - pmin = prob_min; - pmax = prob_max; - pos = pos0; - /* Look for min/max in the past. */ - for (i=0;i<IMIN(tonal->count-1, 15);i++) - { - pos--; - if (pos < 0) - pos = DETECT_SIZE-1; - pmin = MIN16(pmin, tonal->info[pos].music_prob); - pmax = MAX16(pmax, tonal->info[pos].music_prob); - } - /* Bias against switching on active audio. */ - pmin = MAX16(0.f, pmin - .1f*vad_prob); - pmax = MIN16(1.f, pmax + .1f*vad_prob); - prob_min += (1.f-.1f*curr_lookahead)*(pmin - prob_min); - prob_max += (1.f-.1f*curr_lookahead)*(pmax - prob_max); + tonal->read_subframe -= 4; + tonal->read_pos++; } - info_out->music_prob_min = prob_min; - info_out->music_prob_max = prob_max; - - /* printf("%f %f %f %f %f\n", prob_min, prob_max, prob_avg/prob_count, vad_prob, info_out->music_prob); */ -} - -static const float std_feature_bias[9] = { - 5.684947f, 3.475288f, 1.770634f, 1.599784f, 3.773215f, - 2.163313f, 1.260756f, 1.116868f, 1.918795f -}; - -#define LEAKAGE_OFFSET 2.5f -#define LEAKAGE_SLOPE 2.f - -#ifdef FIXED_POINT -/* For fixed-point, the input is +/-2^15 shifted up by SIG_SHIFT, so we need to - compensate for that in the energy. */ -#define SCALE_COMPENS (1.f/((opus_int32)1<<(15+SIG_SHIFT))) -#define SCALE_ENER(e) ((SCALE_COMPENS*SCALE_COMPENS)*(e)) -#else -#define SCALE_ENER(e) (e) -#endif - -#ifdef FIXED_POINT -static int is_digital_silence32(const opus_val32* pcm, int frame_size, int channels, int lsb_depth) -{ - int silence = 0; - opus_val32 sample_max = 0; -#ifdef MLP_TRAINING - return 0; -#endif - sample_max = celt_maxabs32(pcm, frame_size*channels); + if (tonal->read_pos>=DETECT_SIZE) + tonal->read_pos-=DETECT_SIZE; - silence = (sample_max == 0); - (void)lsb_depth; - return silence; + /* Compensate for the delay in the features themselves. + FIXME: Need a better estimate the 10 I just made up */ + curr_lookahead = IMAX(curr_lookahead-10, 0); + + psum=0; + /* Summing the probability of transition patterns that involve music at + time (DETECT_SIZE-curr_lookahead-1) */ + for (i=0;i<DETECT_SIZE-curr_lookahead;i++) + psum += tonal->pmusic[i]; + for (;i<DETECT_SIZE;i++) + psum += tonal->pspeech[i]; + psum = psum*tonal->music_confidence + (1-psum)*tonal->speech_confidence; + /*printf("%f %f %f\n", psum, info_out->music_prob, info_out->tonality);*/ + + info_out->music_prob = psum; } -#else -#define is_digital_silence32(pcm, frame_size, channels, lsb_depth) is_digital_silence(pcm, frame_size, channels, lsb_depth) -#endif static void tonality_analysis(TonalityAnalysisState *tonal, const CELTMode *celt_mode, const void *x, int len, int offset, int c1, int c2, int C, int lsb_depth, downmix_func downmix) { @@ -469,50 +230,24 @@ static void tonality_analysis(TonalityAnalysisState *tonal, const CELTMode *celt float alpha, alphaE, alphaE2; float frame_loudness; float bandwidth_mask; - int is_masked[NB_TBANDS+1]; int bandwidth=0; float maxE = 0; float noise_floor; int remaining; AnalysisInfo *info; - float hp_ener; - float tonality2[240]; - float midE[8]; - float spec_variability=0; - float band_log2[NB_TBANDS+1]; - float leakage_from[NB_TBANDS+1]; - float leakage_to[NB_TBANDS+1]; - float layer_out[MAX_NEURONS]; - float below_max_pitch; - float above_max_pitch; - int is_silence; SAVE_STACK; - if (!tonal->initialized) - { - tonal->mem_fill = 240; - tonal->initialized = 1; - } - alpha = 1.f/IMIN(10, 1+tonal->count); - alphaE = 1.f/IMIN(25, 1+tonal->count); - /* Noise floor related decay for bandwidth detection: -2.2 dB/second */ - alphaE2 = 1.f/IMIN(100, 1+tonal->count); - if (tonal->count <= 1) alphaE2 = 1; - - if (tonal->Fs == 48000) - { - /* len and offset are now at 24 kHz. */ - len/= 2; - offset /= 2; - } else if (tonal->Fs == 16000) { - len = 3*len/2; - offset = 3*offset/2; - } + tonal->last_transition++; + alpha = 1.f/IMIN(20, 1+tonal->count); + alphaE = 1.f/IMIN(50, 1+tonal->count); + alphaE2 = 1.f/IMIN(1000, 1+tonal->count); + if (tonal->count<4) + tonal->music_prob = .5; kfft = celt_mode->mdct.kfft[0]; - tonal->hp_ener_accum += (float)downmix_and_resample(downmix, x, - &tonal->inmem[tonal->mem_fill], tonal->downmix_state, - IMIN(len, ANALYSIS_BUF_SIZE-tonal->mem_fill), offset, c1, c2, C, tonal->Fs); + if (tonal->count==0) + tonal->mem_fill = 240; + downmix(x, &tonal->inmem[tonal->mem_fill], IMIN(len, ANALYSIS_BUF_SIZE-tonal->mem_fill), offset, c1, c2, C); if (tonal->mem_fill+len < ANALYSIS_BUF_SIZE) { tonal->mem_fill += len; @@ -520,13 +255,10 @@ static void tonality_analysis(TonalityAnalysisState *tonal, const CELTMode *celt RESTORE_STACK; return; } - hp_ener = tonal->hp_ener_accum; info = &tonal->info[tonal->write_pos++]; if (tonal->write_pos>=DETECT_SIZE) tonal->write_pos-=DETECT_SIZE; - is_silence = is_digital_silence32(tonal->inmem, ANALYSIS_BUF_SIZE, 1, lsb_depth); - ALLOC(in, 480, kiss_fft_cpx); ALLOC(out, 480, kiss_fft_cpx); ALLOC(tonality, 240, float); @@ -541,20 +273,8 @@ static void tonality_analysis(TonalityAnalysisState *tonal, const CELTMode *celt } OPUS_MOVE(tonal->inmem, tonal->inmem+ANALYSIS_BUF_SIZE-240, 240); remaining = len - (ANALYSIS_BUF_SIZE-tonal->mem_fill); - tonal->hp_ener_accum = (float)downmix_and_resample(downmix, x, - &tonal->inmem[240], tonal->downmix_state, remaining, - offset+ANALYSIS_BUF_SIZE-tonal->mem_fill, c1, c2, C, tonal->Fs); + downmix(x, &tonal->inmem[240], remaining, offset+ANALYSIS_BUF_SIZE-tonal->mem_fill, c1, c2, C); tonal->mem_fill = 240 + remaining; - if (is_silence) - { - /* On silence, copy the previous analysis. */ - int prev_pos = tonal->write_pos-2; - if (prev_pos < 0) - prev_pos += DETECT_SIZE; - OPUS_COPY(info, &tonal->info[prev_pos], 1); - RESTORE_STACK; - return; - } opus_fft(kfft, in, out, tonal->arch); #ifndef FIXED_POINT /* If there's any NaN on the input, the entire output will be NaN, so we only need to check one value. */ @@ -585,31 +305,24 @@ static void tonality_analysis(TonalityAnalysisState *tonal, const CELTMode *celt d_angle2 = angle2 - angle; d2_angle2 = d_angle2 - d_angle; - mod1 = d2_angle - (float)float2int(d2_angle); + mod1 = d2_angle - (float)floor(.5+d2_angle); noisiness[i] = ABS16(mod1); mod1 *= mod1; mod1 *= mod1; - mod2 = d2_angle2 - (float)float2int(d2_angle2); + mod2 = d2_angle2 - (float)floor(.5+d2_angle2); noisiness[i] += ABS16(mod2); mod2 *= mod2; mod2 *= mod2; - avg_mod = .25f*(d2A[i]+mod1+2*mod2); - /* This introduces an extra delay of 2 frames in the detection. */ + avg_mod = .25f*(d2A[i]+2.f*mod1+mod2); tonality[i] = 1.f/(1.f+40.f*16.f*pi4*avg_mod)-.015f; - /* No delay on this detection, but it's less reliable. */ - tonality2[i] = 1.f/(1.f+40.f*16.f*pi4*mod2)-.015f; A[i] = angle2; dA[i] = d_angle2; d2A[i] = mod2; } - for (i=2;i<N2-1;i++) - { - float tt = MIN32(tonality2[i], MAX32(tonality2[i-1], tonality2[i+1])); - tonality[i] = .9f*MAX32(tonality[i], tt-.1f); - } + frame_tonality = 0; max_frame_tonality = 0; /*tw_sum = 0;*/ @@ -626,22 +339,6 @@ static void tonality_analysis(TonalityAnalysisState *tonal, const CELTMode *celt } relativeE = 0; frame_loudness = 0; - /* The energy of the very first band is special because of DC. */ - { - float E = 0; - float X1r, X2r; - X1r = 2*(float)out[0].r; - X2r = 2*(float)out[0].i; - E = X1r*X1r + X2r*X2r; - for (i=1;i<4;i++) - { - float binE = out[i].r*(float)out[i].r + out[N-i].r*(float)out[N-i].r - + out[i].i*(float)out[i].i + out[N-i].i*(float)out[N-i].i; - E += binE; - } - E = SCALE_ENER(E); - band_log2[0] = .5f*1.442695f*(float)log(E+1e-10f); - } for (b=0;b<NB_TBANDS;b++) { float E=0, tE=0, nE=0; @@ -651,9 +348,12 @@ static void tonality_analysis(TonalityAnalysisState *tonal, const CELTMode *celt { float binE = out[i].r*(float)out[i].r + out[N-i].r*(float)out[N-i].r + out[i].i*(float)out[i].i + out[N-i].i*(float)out[N-i].i; - binE = SCALE_ENER(binE); +#ifdef FIXED_POINT + /* FIXME: It's probably best to change the BFCC filter initial state instead */ + binE *= 5.55e-17f; +#endif E += binE; - tE += binE*MAX32(0, tonality[i]); + tE += binE*tonality[i]; nE += binE*2.f*(.5f-noisiness[i]); } #ifndef FIXED_POINT @@ -671,27 +371,14 @@ static void tonality_analysis(TonalityAnalysisState *tonal, const CELTMode *celt frame_loudness += (float)sqrt(E+1e-10f); logE[b] = (float)log(E+1e-10f); - band_log2[b+1] = .5f*1.442695f*(float)log(E+1e-10f); - tonal->logE[tonal->E_count][b] = logE[b]; - if (tonal->count==0) - tonal->highE[b] = tonal->lowE[b] = logE[b]; - if (tonal->highE[b] > tonal->lowE[b] + 7.5) + tonal->lowE[b] = MIN32(logE[b], tonal->lowE[b]+.01f); + tonal->highE[b] = MAX32(logE[b], tonal->highE[b]-.1f); + if (tonal->highE[b] < tonal->lowE[b]+1.f) { - if (tonal->highE[b] - logE[b] > logE[b] - tonal->lowE[b]) - tonal->highE[b] -= .01f; - else - tonal->lowE[b] += .01f; + tonal->highE[b]+=.5f; + tonal->lowE[b]-=.5f; } - if (logE[b] > tonal->highE[b]) - { - tonal->highE[b] = logE[b]; - tonal->lowE[b] = MAX32(tonal->highE[b]-15, tonal->lowE[b]); - } else if (logE[b] < tonal->lowE[b]) - { - tonal->lowE[b] = logE[b]; - tonal->highE[b] = MIN32(tonal->lowE[b]+15, tonal->highE[b]); - } - relativeE += (logE[b]-tonal->lowE[b])/(1e-5f + (tonal->highE[b]-tonal->lowE[b])); + relativeE += (logE[b]-tonal->lowE[b])/(1e-15f+tonal->highE[b]-tonal->lowE[b]); L1=L2=0; for (i=0;i<NB_FRAMES;i++) @@ -723,135 +410,45 @@ static void tonality_analysis(TonalityAnalysisState *tonal, const CELTMode *celt tonal->prev_band_tonality[b] = band_tonality[b]; } - leakage_from[0] = band_log2[0]; - leakage_to[0] = band_log2[0] - LEAKAGE_OFFSET; - for (b=1;b<NB_TBANDS+1;b++) - { - float leak_slope = LEAKAGE_SLOPE*(tbands[b]-tbands[b-1])/4; - leakage_from[b] = MIN16(leakage_from[b-1]+leak_slope, band_log2[b]); - leakage_to[b] = MAX16(leakage_to[b-1]-leak_slope, band_log2[b]-LEAKAGE_OFFSET); - } - for (b=NB_TBANDS-2;b>=0;b--) - { - float leak_slope = LEAKAGE_SLOPE*(tbands[b+1]-tbands[b])/4; - leakage_from[b] = MIN16(leakage_from[b+1]+leak_slope, leakage_from[b]); - leakage_to[b] = MAX16(leakage_to[b+1]-leak_slope, leakage_to[b]); - } - celt_assert(NB_TBANDS+1 <= LEAK_BANDS); - for (b=0;b<NB_TBANDS+1;b++) - { - /* leak_boost[] is made up of two terms. The first, based on leakage_to[], - represents the boost needed to overcome the amount of analysis leakage - cause in a weaker band b by louder neighbouring bands. - The second, based on leakage_from[], applies to a loud band b for - which the quantization noise causes synthesis leakage to the weaker - neighbouring bands. */ - float boost = MAX16(0, leakage_to[b] - band_log2[b]) + - MAX16(0, band_log2[b] - (leakage_from[b]+LEAKAGE_OFFSET)); - info->leak_boost[b] = IMIN(255, (int)floor(.5 + 64.f*boost)); - } - for (;b<LEAK_BANDS;b++) info->leak_boost[b] = 0; - - for (i=0;i<NB_FRAMES;i++) - { - int j; - float mindist = 1e15f; - for (j=0;j<NB_FRAMES;j++) - { - int k; - float dist=0; - for (k=0;k<NB_TBANDS;k++) - { - float tmp; - tmp = tonal->logE[i][k] - tonal->logE[j][k]; - dist += tmp*tmp; - } - if (j!=i) - mindist = MIN32(mindist, dist); - } - spec_variability += mindist; - } - spec_variability = (float)sqrt(spec_variability/NB_FRAMES/NB_TBANDS); bandwidth_mask = 0; bandwidth = 0; maxE = 0; noise_floor = 5.7e-4f/(1<<(IMAX(0,lsb_depth-8))); +#ifdef FIXED_POINT + noise_floor *= 1<<(15+SIG_SHIFT); +#endif noise_floor *= noise_floor; - below_max_pitch=0; - above_max_pitch=0; - for (b=0;b<NB_TBANDS;b++) + for (b=0;b<NB_TOT_BANDS;b++) { float E=0; - float Em; int band_start, band_end; /* Keep a margin of 300 Hz for aliasing */ - band_start = tbands[b]; - band_end = tbands[b+1]; + band_start = extra_bands[b]; + band_end = extra_bands[b+1]; for (i=band_start;i<band_end;i++) { float binE = out[i].r*(float)out[i].r + out[N-i].r*(float)out[N-i].r + out[i].i*(float)out[i].i + out[N-i].i*(float)out[N-i].i; E += binE; } - E = SCALE_ENER(E); maxE = MAX32(maxE, E); - if (band_start < 64) - { - below_max_pitch += E; - } else { - above_max_pitch += E; - } tonal->meanE[b] = MAX32((1-alphaE2)*tonal->meanE[b], E); - Em = MAX32(E, tonal->meanE[b]); + E = MAX32(E, tonal->meanE[b]); + /* Use a simple follower with 13 dB/Bark slope for spreading function */ + bandwidth_mask = MAX32(.05f*bandwidth_mask, E); /* Consider the band "active" only if all these conditions are met: - 1) less than 90 dB below the peak band (maximal masking possible considering + 1) less than 10 dB below the simple follower + 2) less than 90 dB below the peak band (maximal masking possible considering both the ATH and the loudness-dependent slope of the spreading function) - 2) above the PCM quantization noise floor - We use b+1 because the first CELT band isn't included in tbands[] + 3) above the PCM quantization noise floor */ - if (E*1e9f > maxE && (Em > 3*noise_floor*(band_end-band_start) || E > noise_floor*(band_end-band_start))) - bandwidth = b+1; - /* Check if the band is masked (see below). */ - is_masked[b] = E < (tonal->prev_bandwidth >= b+1 ? .01f : .05f)*bandwidth_mask; - /* Use a simple follower with 13 dB/Bark slope for spreading function. */ - bandwidth_mask = MAX32(.05f*bandwidth_mask, E); + if (E>.1*bandwidth_mask && E*1e9f > maxE && E > noise_floor*(band_end-band_start)) + bandwidth = b; } - /* Special case for the last two bands, for which we don't have spectrum but only - the energy above 12 kHz. The difficulty here is that the high-pass we use - leaks some LF energy, so we need to increase the threshold without accidentally cutting - off the band. */ - if (tonal->Fs == 48000) { - float noise_ratio; - float Em; - float E = hp_ener*(1.f/(60*60)); - noise_ratio = tonal->prev_bandwidth==20 ? 10.f : 30.f; - -#ifdef FIXED_POINT - /* silk_resampler_down2_hp() shifted right by an extra 8 bits. */ - E *= 256.f*(1.f/Q15ONE)*(1.f/Q15ONE); -#endif - above_max_pitch += E; - tonal->meanE[b] = MAX32((1-alphaE2)*tonal->meanE[b], E); - Em = MAX32(E, tonal->meanE[b]); - if (Em > 3*noise_ratio*noise_floor*160 || E > noise_ratio*noise_floor*160) - bandwidth = 20; - /* Check if the band is masked (see below). */ - is_masked[b] = E < (tonal->prev_bandwidth == 20 ? .01f : .05f)*bandwidth_mask; - } - if (above_max_pitch > below_max_pitch) - info->max_pitch_ratio = below_max_pitch/above_max_pitch; - else - info->max_pitch_ratio = 1; - /* In some cases, resampling aliasing can create a small amount of energy in the first band - being cut. So if the last band is masked, we don't include it. */ - if (bandwidth == 20 && is_masked[NB_TBANDS]) - bandwidth-=2; - else if (bandwidth > 0 && bandwidth <= NB_TBANDS && is_masked[bandwidth-1]) - bandwidth--; if (tonal->count<=2) bandwidth = 20; frame_loudness = 20*(float)log10(frame_loudness); - tonal->Etracker = MAX32(tonal->Etracker-.003f, frame_loudness); + tonal->Etracker = MAX32(tonal->Etracker-.03f, frame_loudness); tonal->lowECount *= (1-alphaE); if (frame_loudness < tonal->Etracker-30) tonal->lowECount += alphaE; @@ -863,18 +460,11 @@ static void tonality_analysis(TonalityAnalysisState *tonal, const CELTMode *celt sum += dct_table[i*16+b]*logE[b]; BFCC[i] = sum; } - for (i=0;i<8;i++) - { - float sum=0; - for (b=0;b<16;b++) - sum += dct_table[i*16+b]*.5f*(tonal->highE[b]+tonal->lowE[b]); - midE[i] = sum; - } frame_stationarity /= NB_TBANDS; relativeE /= NB_TBANDS; if (tonal->count<10) - relativeE = .5f; + relativeE = .5; frame_noisiness /= NB_TBANDS; #if 1 info->activity = frame_noisiness + (1-frame_noisiness)*relativeE; @@ -889,7 +479,7 @@ static void tonality_analysis(TonalityAnalysisState *tonal, const CELTMode *celt info->tonality_slope = slope; tonal->E_count = (tonal->E_count+1)%NB_FRAMES; - tonal->count = IMIN(tonal->count+1, ANALYSIS_COUNT_MAX); + tonal->count++; info->tonality = frame_tonality; for (i=0;i<4;i++) @@ -908,8 +498,6 @@ static void tonality_analysis(TonalityAnalysisState *tonal, const CELTMode *celt for (i=0;i<9;i++) tonal->std[i] = (1-alpha)*tonal->std[i] + alpha*features[i]*features[i]; } - for (i=0;i<4;i++) - features[i] = BFCC[i]-midE[i]; for (i=0;i<8;i++) { @@ -919,31 +507,136 @@ static void tonality_analysis(TonalityAnalysisState *tonal, const CELTMode *celt tonal->mem[i] = BFCC[i]; } for (i=0;i<9;i++) - features[11+i] = (float)sqrt(tonal->std[i]) - std_feature_bias[i]; - features[18] = spec_variability - 0.78f; - features[20] = info->tonality - 0.154723f; - features[21] = info->activity - 0.724643f; - features[22] = frame_stationarity - 0.743717f; - features[23] = info->tonality_slope + 0.069216f; - features[24] = tonal->lowECount - 0.067930f; - - compute_dense(&layer0, layer_out, features); - compute_gru(&layer1, tonal->rnn_state, layer_out); - compute_dense(&layer2, frame_probs, tonal->rnn_state); - - /* Probability of speech or music vs noise */ - info->activity_probability = frame_probs[1]; - info->music_prob = frame_probs[0]; - - /*printf("%f %f %f\n", frame_probs[0], frame_probs[1], info->music_prob);*/ -#ifdef MLP_TRAINING - for (i=0;i<25;i++) - printf("%f ", features[i]); - printf("\n"); + features[11+i] = (float)sqrt(tonal->std[i]); + features[20] = info->tonality; + features[21] = info->activity; + features[22] = frame_stationarity; + features[23] = info->tonality_slope; + features[24] = tonal->lowECount; + +#ifndef DISABLE_FLOAT_API + mlp_process(&net, features, frame_probs); + frame_probs[0] = .5f*(frame_probs[0]+1); + /* Curve fitting between the MLP probability and the actual probability */ + frame_probs[0] = .01f + 1.21f*frame_probs[0]*frame_probs[0] - .23f*(float)pow(frame_probs[0], 10); + /* Probability of active audio (as opposed to silence) */ + frame_probs[1] = .5f*frame_probs[1]+.5f; + /* Consider that silence has a 50-50 probability. */ + frame_probs[0] = frame_probs[1]*frame_probs[0] + (1-frame_probs[1])*.5f; + + /*printf("%f %f ", frame_probs[0], frame_probs[1]);*/ + { + /* Probability of state transition */ + float tau; + /* Represents independence of the MLP probabilities, where + beta=1 means fully independent. */ + float beta; + /* Denormalized probability of speech (p0) and music (p1) after update */ + float p0, p1; + /* Probabilities for "all speech" and "all music" */ + float s0, m0; + /* Probability sum for renormalisation */ + float psum; + /* Instantaneous probability of speech and music, with beta pre-applied. */ + float speech0; + float music0; + float p, q; + + /* One transition every 3 minutes of active audio */ + tau = .00005f*frame_probs[1]; + /* Adapt beta based on how "unexpected" the new prob is */ + p = MAX16(.05f,MIN16(.95f,frame_probs[0])); + q = MAX16(.05f,MIN16(.95f,tonal->music_prob)); + beta = .01f+.05f*ABS16(p-q)/(p*(1-q)+q*(1-p)); + /* p0 and p1 are the probabilities of speech and music at this frame + using only information from previous frame and applying the + state transition model */ + p0 = (1-tonal->music_prob)*(1-tau) + tonal->music_prob *tau; + p1 = tonal->music_prob *(1-tau) + (1-tonal->music_prob)*tau; + /* We apply the current probability with exponent beta to work around + the fact that the probability estimates aren't independent. */ + p0 *= (float)pow(1-frame_probs[0], beta); + p1 *= (float)pow(frame_probs[0], beta); + /* Normalise the probabilities to get the Marokv probability of music. */ + tonal->music_prob = p1/(p0+p1); + info->music_prob = tonal->music_prob; + + /* This chunk of code deals with delayed decision. */ + psum=1e-20f; + /* Instantaneous probability of speech and music, with beta pre-applied. */ + speech0 = (float)pow(1-frame_probs[0], beta); + music0 = (float)pow(frame_probs[0], beta); + if (tonal->count==1) + { + tonal->pspeech[0]=.5; + tonal->pmusic [0]=.5; + } + /* Updated probability of having only speech (s0) or only music (m0), + before considering the new observation. */ + s0 = tonal->pspeech[0] + tonal->pspeech[1]; + m0 = tonal->pmusic [0] + tonal->pmusic [1]; + /* Updates s0 and m0 with instantaneous probability. */ + tonal->pspeech[0] = s0*(1-tau)*speech0; + tonal->pmusic [0] = m0*(1-tau)*music0; + /* Propagate the transition probabilities */ + for (i=1;i<DETECT_SIZE-1;i++) + { + tonal->pspeech[i] = tonal->pspeech[i+1]*speech0; + tonal->pmusic [i] = tonal->pmusic [i+1]*music0; + } + /* Probability that the latest frame is speech, when all the previous ones were music. */ + tonal->pspeech[DETECT_SIZE-1] = m0*tau*speech0; + /* Probability that the latest frame is music, when all the previous ones were speech. */ + tonal->pmusic [DETECT_SIZE-1] = s0*tau*music0; + + /* Renormalise probabilities to 1 */ + for (i=0;i<DETECT_SIZE;i++) + psum += tonal->pspeech[i] + tonal->pmusic[i]; + psum = 1.f/psum; + for (i=0;i<DETECT_SIZE;i++) + { + tonal->pspeech[i] *= psum; + tonal->pmusic [i] *= psum; + } + psum = tonal->pmusic[0]; + for (i=1;i<DETECT_SIZE;i++) + psum += tonal->pspeech[i]; + + /* Estimate our confidence in the speech/music decisions */ + if (frame_probs[1]>.75) + { + if (tonal->music_prob>.9) + { + float adapt; + adapt = 1.f/(++tonal->music_confidence_count); + tonal->music_confidence_count = IMIN(tonal->music_confidence_count, 500); + tonal->music_confidence += adapt*MAX16(-.2f,frame_probs[0]-tonal->music_confidence); + } + if (tonal->music_prob<.1) + { + float adapt; + adapt = 1.f/(++tonal->speech_confidence_count); + tonal->speech_confidence_count = IMIN(tonal->speech_confidence_count, 500); + tonal->speech_confidence += adapt*MIN16(.2f,frame_probs[0]-tonal->speech_confidence); + } + } else { + if (tonal->music_confidence_count==0) + tonal->music_confidence = .9f; + if (tonal->speech_confidence_count==0) + tonal->speech_confidence = .1f; + } + } + if (tonal->last_music != (tonal->music_prob>.5f)) + tonal->last_transition=0; + tonal->last_music = tonal->music_prob>.5f; +#else + info->music_prob = 0; #endif + /*for (i=0;i<25;i++) + printf("%f ", features[i]); + printf("\n");*/ info->bandwidth = bandwidth; - tonal->prev_bandwidth = bandwidth; /*printf("%d %d\n", info->bandwidth, info->opus_bandwidth);*/ info->noisiness = frame_noisiness; info->valid = 1; @@ -957,25 +650,23 @@ void run_analysis(TonalityAnalysisState *analysis, const CELTMode *celt_mode, co int offset; int pcm_len; - analysis_frame_size -= analysis_frame_size&1; if (analysis_pcm != NULL) { /* Avoid overflow/wrap-around of the analysis buffer */ - analysis_frame_size = IMIN((DETECT_SIZE-5)*Fs/50, analysis_frame_size); + analysis_frame_size = IMIN((DETECT_SIZE-5)*Fs/100, analysis_frame_size); pcm_len = analysis_frame_size - analysis->analysis_offset; offset = analysis->analysis_offset; - while (pcm_len>0) { - tonality_analysis(analysis, celt_mode, analysis_pcm, IMIN(Fs/50, pcm_len), offset, c1, c2, C, lsb_depth, downmix); - offset += Fs/50; - pcm_len -= Fs/50; - } + do { + tonality_analysis(analysis, celt_mode, analysis_pcm, IMIN(480, pcm_len), offset, c1, c2, C, lsb_depth, downmix); + offset += 480; + pcm_len -= 480; + } while (pcm_len>0); analysis->analysis_offset = analysis_frame_size; analysis->analysis_offset -= frame_size; } + analysis_info->valid = 0; tonality_get_info(analysis, analysis_info, frame_size); } - -#endif /* DISABLE_FLOAT_API */ diff --git a/thirdparty/opus/analysis.h b/thirdparty/opus/analysis.h index 0b66555f21..9eae56a525 100644 --- a/thirdparty/opus/analysis.h +++ b/thirdparty/opus/analysis.h @@ -30,24 +30,16 @@ #include "celt.h" #include "opus_private.h" -#include "mlp.h" #define NB_FRAMES 8 #define NB_TBANDS 18 -#define ANALYSIS_BUF_SIZE 720 /* 30 ms at 24 kHz */ +#define NB_TOT_BANDS 21 +#define ANALYSIS_BUF_SIZE 720 /* 15 ms at 48 kHz */ -/* At that point we can stop counting frames because it no longer matters. */ -#define ANALYSIS_COUNT_MAX 10000 - -#define DETECT_SIZE 100 - -/* Uncomment this to print the MLP features on stdout. */ -/*#define MLP_TRAINING*/ +#define DETECT_SIZE 200 typedef struct { int arch; - int application; - opus_int32 Fs; #define TONALITY_ANALYSIS_RESET_START angle float angle[240]; float d_angle[240]; @@ -56,27 +48,35 @@ typedef struct { int mem_fill; /* number of usable samples in the buffer */ float prev_band_tonality[NB_TBANDS]; float prev_tonality; - int prev_bandwidth; float E[NB_FRAMES][NB_TBANDS]; - float logE[NB_FRAMES][NB_TBANDS]; float lowE[NB_TBANDS]; float highE[NB_TBANDS]; - float meanE[NB_TBANDS+1]; + float meanE[NB_TOT_BANDS]; float mem[32]; float cmean[8]; float std[9]; + float music_prob; float Etracker; float lowECount; int E_count; + int last_music; + int last_transition; int count; + float subframe_mem[3]; int analysis_offset; + /** Probability of having speech for time i to DETECT_SIZE-1 (and music before). + pspeech[0] is the probability that all frames in the window are speech. */ + float pspeech[DETECT_SIZE]; + /** Probability of having music for time i to DETECT_SIZE-1 (and speech before). + pmusic[0] is the probability that all frames in the window are music. */ + float pmusic[DETECT_SIZE]; + float speech_confidence; + float music_confidence; + int speech_confidence_count; + int music_confidence_count; int write_pos; int read_pos; int read_subframe; - float hp_ener_accum; - int initialized; - float rnn_state[MAX_NEURONS]; - opus_val32 downmix_state[3]; AnalysisInfo info[DETECT_SIZE]; } TonalityAnalysisState; @@ -86,7 +86,7 @@ typedef struct { * not be repeated every analysis step. No allocated memory is retained * by the state struct, so no cleanup call is required. */ -void tonality_analysis_init(TonalityAnalysisState *analysis, opus_int32 Fs); +void tonality_analysis_init(TonalityAnalysisState *analysis); /** Reset a TonalityAnalysisState stuct. * diff --git a/thirdparty/opus/celt/_kiss_fft_guts.h b/thirdparty/opus/celt/_kiss_fft_guts.h index 17392b3e90..5e3d58fd66 100644 --- a/thirdparty/opus/celt/_kiss_fft_guts.h +++ b/thirdparty/opus/celt/_kiss_fft_guts.h @@ -58,12 +58,12 @@ # define S_MUL(a,b) MULT16_32_Q15(b, a) # define C_MUL(m,a,b) \ - do{ (m).r = SUB32_ovflw(S_MUL((a).r,(b).r) , S_MUL((a).i,(b).i)); \ - (m).i = ADD32_ovflw(S_MUL((a).r,(b).i) , S_MUL((a).i,(b).r)); }while(0) + do{ (m).r = SUB32(S_MUL((a).r,(b).r) , S_MUL((a).i,(b).i)); \ + (m).i = ADD32(S_MUL((a).r,(b).i) , S_MUL((a).i,(b).r)); }while(0) # define C_MULC(m,a,b) \ - do{ (m).r = ADD32_ovflw(S_MUL((a).r,(b).r) , S_MUL((a).i,(b).i)); \ - (m).i = SUB32_ovflw(S_MUL((a).i,(b).r) , S_MUL((a).r,(b).i)); }while(0) + do{ (m).r = ADD32(S_MUL((a).r,(b).r) , S_MUL((a).i,(b).i)); \ + (m).i = SUB32(S_MUL((a).i,(b).r) , S_MUL((a).r,(b).i)); }while(0) # define C_MULBYSCALAR( c, s ) \ do{ (c).r = S_MUL( (c).r , s ) ;\ @@ -77,17 +77,17 @@ DIVSCALAR( (c).i , div); }while (0) #define C_ADD( res, a,b)\ - do {(res).r=ADD32_ovflw((a).r,(b).r); (res).i=ADD32_ovflw((a).i,(b).i); \ + do {(res).r=ADD32((a).r,(b).r); (res).i=ADD32((a).i,(b).i); \ }while(0) #define C_SUB( res, a,b)\ - do {(res).r=SUB32_ovflw((a).r,(b).r); (res).i=SUB32_ovflw((a).i,(b).i); \ + do {(res).r=SUB32((a).r,(b).r); (res).i=SUB32((a).i,(b).i); \ }while(0) #define C_ADDTO( res , a)\ - do {(res).r = ADD32_ovflw((res).r, (a).r); (res).i = ADD32_ovflw((res).i,(a).i);\ + do {(res).r = ADD32((res).r, (a).r); (res).i = ADD32((res).i,(a).i);\ }while(0) #define C_SUBFROM( res , a)\ - do {(res).r = ADD32_ovflw((res).r,(a).r); (res).i = SUB32_ovflw((res).i,(a).i); \ + do {(res).r = ADD32((res).r,(a).r); (res).i = SUB32((res).i,(a).i); \ }while(0) #if defined(OPUS_ARM_INLINE_ASM) diff --git a/thirdparty/opus/celt/arch.h b/thirdparty/opus/celt/arch.h index 08b07db598..8ceab5fe10 100644 --- a/thirdparty/opus/celt/arch.h +++ b/thirdparty/opus/celt/arch.h @@ -46,50 +46,25 @@ # endif # endif -#if OPUS_GNUC_PREREQ(3, 0) -#define opus_likely(x) (__builtin_expect(!!(x), 1)) -#define opus_unlikely(x) (__builtin_expect(!!(x), 0)) -#else -#define opus_likely(x) (!!(x)) -#define opus_unlikely(x) (!!(x)) -#endif - #define CELT_SIG_SCALE 32768.f -#define CELT_FATAL(str) celt_fatal(str, __FILE__, __LINE__); - -#if defined(ENABLE_ASSERTIONS) || defined(ENABLE_HARDENING) -#ifdef __GNUC__ -__attribute__((noreturn)) -#endif -void celt_fatal(const char *str, const char *file, int line); - -#if defined(CELT_C) && !defined(OVERRIDE_celt_fatal) +#define celt_fatal(str) _celt_fatal(str, __FILE__, __LINE__); +#ifdef ENABLE_ASSERTIONS #include <stdio.h> #include <stdlib.h> #ifdef __GNUC__ __attribute__((noreturn)) #endif -void celt_fatal(const char *str, const char *file, int line) +static OPUS_INLINE void _celt_fatal(const char *str, const char *file, int line) { fprintf (stderr, "Fatal (internal) error in %s, line %d: %s\n", file, line, str); abort(); } -#endif - -#define celt_assert(cond) {if (!(cond)) {CELT_FATAL("assertion failed: " #cond);}} -#define celt_assert2(cond, message) {if (!(cond)) {CELT_FATAL("assertion failed: " #cond "\n" message);}} -#define MUST_SUCCEED(call) celt_assert((call) == OPUS_OK) +#define celt_assert(cond) {if (!(cond)) {celt_fatal("assertion failed: " #cond);}} +#define celt_assert2(cond, message) {if (!(cond)) {celt_fatal("assertion failed: " #cond "\n" message);}} #else #define celt_assert(cond) #define celt_assert2(cond, message) -#define MUST_SUCCEED(call) do {if((call) != OPUS_OK) {RESTORE_STACK; return OPUS_INTERNAL_ERROR;} } while (0) -#endif - -#if defined(ENABLE_ASSERTIONS) -#define celt_sig_assert(cond) {if (!(cond)) {CELT_FATAL("signal assertion failed: " #cond);}} -#else -#define celt_sig_assert(cond) #endif #define IMUL32(a,b) ((a)*(b)) @@ -118,20 +93,14 @@ void celt_fatal(const char *str, const char *file, int line) typedef opus_int16 opus_val16; typedef opus_int32 opus_val32; -typedef opus_int64 opus_val64; typedef opus_val32 celt_sig; typedef opus_val16 celt_norm; typedef opus_val32 celt_ener; -#define celt_isnan(x) 0 - #define Q15ONE 32767 #define SIG_SHIFT 12 -/* Safe saturation value for 32-bit signals. Should be less than - 2^31*(1-0.85) to avoid blowing up on DC at deemphasis.*/ -#define SIG_SAT (300000000) #define NORM_SCALING 16384 @@ -160,7 +129,7 @@ static OPUS_INLINE opus_int16 SAT16(opus_int32 x) { #ifdef OPUS_ARM_PRESUME_AARCH64_NEON_INTR #include "arm/fixed_arm64.h" -#elif defined (OPUS_ARM_INLINE_EDSP) +#elif OPUS_ARM_INLINE_EDSP #include "arm/fixed_armv5e.h" #elif defined (OPUS_ARM_INLINE_ASM) #include "arm/fixed_armv4.h" @@ -178,7 +147,6 @@ static OPUS_INLINE opus_int16 SAT16(opus_int32 x) { typedef float opus_val16; typedef float opus_val32; -typedef float opus_val64; typedef float celt_sig; typedef float celt_norm; @@ -218,7 +186,6 @@ static OPUS_INLINE int celt_isnan(float x) #define NEG16(x) (-(x)) #define NEG32(x) (-(x)) -#define NEG32_ovflw(x) (-(x)) #define EXTRACT16(x) (x) #define EXTEND32(x) (x) #define SHR16(a,shift) (a) @@ -235,7 +202,6 @@ static OPUS_INLINE int celt_isnan(float x) #define SATURATE16(x) (x) #define ROUND16(a,shift) (a) -#define SROUND16(a,shift) (a) #define HALF16(x) (.5f*(x)) #define HALF32(x) (.5f*(x)) @@ -243,8 +209,6 @@ static OPUS_INLINE int celt_isnan(float x) #define SUB16(a,b) ((a)-(b)) #define ADD32(a,b) ((a)+(b)) #define SUB32(a,b) ((a)-(b)) -#define ADD32_ovflw(a,b) ((a)+(b)) -#define SUB32_ovflw(a,b) ((a)-(b)) #define MULT16_16_16(a,b) ((a)*(b)) #define MULT16_16(a,b) ((opus_val32)(a)*(opus_val32)(b)) #define MAC16_16(c,a,b) ((c)+(opus_val32)(a)*(opus_val32)(b)) @@ -279,9 +243,9 @@ static OPUS_INLINE int celt_isnan(float x) #ifndef GLOBAL_STACK_SIZE #ifdef FIXED_POINT -#define GLOBAL_STACK_SIZE 120000 +#define GLOBAL_STACK_SIZE 100000 #else -#define GLOBAL_STACK_SIZE 120000 +#define GLOBAL_STACK_SIZE 100000 #endif #endif diff --git a/thirdparty/opus/celt/arm/arm2gnu.pl b/thirdparty/opus/celt/arm/arm2gnu.pl index a2895f7445..6c922ac819 100755 --- a/thirdparty/opus/celt/arm/arm2gnu.pl +++ b/thirdparty/opus/celt/arm/arm2gnu.pl @@ -164,11 +164,11 @@ while (<>) { $prefix = ""; if ($proc) { - $prefix = $prefix.sprintf("\t.type\t%s, %%function", $proc) unless ($apple); + $prefix = $prefix.sprintf("\t.type\t%s, %%function; ",$proc) unless ($apple); # Make sure we $prefix isn't empty here (for the $apple case). # We handle mangling the label here, make sure it doesn't match # the label handling below (if $prefix would be empty). - $prefix = $prefix."; "; + $prefix = "; "; push(@proc_stack, $proc); s/^[A-Za-z_\.]\w+/$symprefix$&:/; } diff --git a/thirdparty/opus/celt/arm/arm_celt_map.c b/thirdparty/opus/celt/arm/arm_celt_map.c index ca988b66f5..4d4d069a86 100644 --- a/thirdparty/opus/celt/arm/arm_celt_map.c +++ b/thirdparty/opus/celt/arm/arm_celt_map.c @@ -35,29 +35,12 @@ #if defined(OPUS_HAVE_RTCD) -# if defined(OPUS_ARM_MAY_HAVE_NEON_INTR) && !defined(OPUS_ARM_PRESUME_NEON_INTR) -opus_val32 (*const CELT_INNER_PROD_IMPL[OPUS_ARCHMASK+1])(const opus_val16 *x, const opus_val16 *y, int N) = { - celt_inner_prod_c, /* ARMv4 */ - celt_inner_prod_c, /* EDSP */ - celt_inner_prod_c, /* Media */ - celt_inner_prod_neon /* NEON */ -}; - -void (*const DUAL_INNER_PROD_IMPL[OPUS_ARCHMASK+1])(const opus_val16 *x, const opus_val16 *y01, const opus_val16 *y02, - int N, opus_val32 *xy1, opus_val32 *xy2) = { - dual_inner_prod_c, /* ARMv4 */ - dual_inner_prod_c, /* EDSP */ - dual_inner_prod_c, /* Media */ - dual_inner_prod_neon /* NEON */ -}; -# endif - # if defined(FIXED_POINT) # if ((defined(OPUS_ARM_MAY_HAVE_NEON) && !defined(OPUS_ARM_PRESUME_NEON)) || \ (defined(OPUS_ARM_MAY_HAVE_MEDIA) && !defined(OPUS_ARM_PRESUME_MEDIA)) || \ (defined(OPUS_ARM_MAY_HAVE_EDSP) && !defined(OPUS_ARM_PRESUME_EDSP))) opus_val32 (*const CELT_PITCH_XCORR_IMPL[OPUS_ARCHMASK+1])(const opus_val16 *, - const opus_val16 *, opus_val32 *, int, int, int) = { + const opus_val16 *, opus_val32 *, int , int) = { celt_pitch_xcorr_c, /* ARMv4 */ MAY_HAVE_EDSP(celt_pitch_xcorr), /* EDSP */ MAY_HAVE_MEDIA(celt_pitch_xcorr), /* Media */ @@ -68,7 +51,7 @@ opus_val32 (*const CELT_PITCH_XCORR_IMPL[OPUS_ARCHMASK+1])(const opus_val16 *, # else /* !FIXED_POINT */ # if defined(OPUS_ARM_MAY_HAVE_NEON_INTR) && !defined(OPUS_ARM_PRESUME_NEON_INTR) void (*const CELT_PITCH_XCORR_IMPL[OPUS_ARCHMASK+1])(const opus_val16 *, - const opus_val16 *, opus_val32 *, int, int, int) = { + const opus_val16 *, opus_val32 *, int, int) = { celt_pitch_xcorr_c, /* ARMv4 */ celt_pitch_xcorr_c, /* EDSP */ celt_pitch_xcorr_c, /* Media */ diff --git a/thirdparty/opus/celt/arm/celt_fft_ne10.c b/thirdparty/opus/celt/arm/celt_ne10_fft.c index ea5fd7808b..42d96a7117 100644 --- a/thirdparty/opus/celt/arm/celt_fft_ne10.c +++ b/thirdparty/opus/celt/arm/celt_ne10_fft.c @@ -1,7 +1,7 @@ /* Copyright (c) 2015 Xiph.Org Foundation Written by Viswanath Puttagunta */ /** - @file celt_fft_ne10.c + @file celt_ne10_fft.c @brief ARM Neon optimizations for fft using NE10 library */ @@ -36,6 +36,7 @@ #endif #endif +#include <NE10_init.h> #include <NE10_dsp.h> #include "os_support.h" #include "kiss_fft.h" diff --git a/thirdparty/opus/celt/arm/celt_mdct_ne10.c b/thirdparty/opus/celt/arm/celt_ne10_mdct.c index 3531d02d10..293c3efd7a 100644 --- a/thirdparty/opus/celt/arm/celt_mdct_ne10.c +++ b/thirdparty/opus/celt/arm/celt_ne10_mdct.c @@ -1,7 +1,7 @@ /* Copyright (c) 2015 Xiph.Org Foundation Written by Viswanath Puttagunta */ /** - @file celt_mdct_ne10.c + @file celt_ne10_mdct.c @brief ARM Neon optimizations for mdct using NE10 library */ diff --git a/thirdparty/opus/celt/arm/celt_neon_intr.c b/thirdparty/opus/celt/arm/celt_neon_intr.c index effda769d0..47bbe3dc22 100644 --- a/thirdparty/opus/celt/arm/celt_neon_intr.c +++ b/thirdparty/opus/celt/arm/celt_neon_intr.c @@ -191,21 +191,121 @@ static void xcorr_kernel_neon_float(const float32_t *x, const float32_t *y, vst1q_f32(sum, SUMM); } +/* + * Function: xcorr_kernel_neon_float_process1 + * --------------------------------- + * Computes single correlation values and stores in *sum + */ +static void xcorr_kernel_neon_float_process1(const float32_t *x, + const float32_t *y, float32_t *sum, int len) { + float32x4_t XX[4]; + float32x4_t YY[4]; + float32x2_t XX_2; + float32x2_t YY_2; + float32x4_t SUMM; + float32x2_t SUMM_2[2]; + const float32_t *xi = x; + const float32_t *yi = y; + + SUMM = vdupq_n_f32(0); + + /* Work on 16 values per iteration */ + while (len >= 16) { + XX[0] = vld1q_f32(xi); + xi += 4; + XX[1] = vld1q_f32(xi); + xi += 4; + XX[2] = vld1q_f32(xi); + xi += 4; + XX[3] = vld1q_f32(xi); + xi += 4; + + YY[0] = vld1q_f32(yi); + yi += 4; + YY[1] = vld1q_f32(yi); + yi += 4; + YY[2] = vld1q_f32(yi); + yi += 4; + YY[3] = vld1q_f32(yi); + yi += 4; + + SUMM = vmlaq_f32(SUMM, YY[0], XX[0]); + SUMM = vmlaq_f32(SUMM, YY[1], XX[1]); + SUMM = vmlaq_f32(SUMM, YY[2], XX[2]); + SUMM = vmlaq_f32(SUMM, YY[3], XX[3]); + len -= 16; + } + + /* Work on 8 values */ + if (len >= 8) { + XX[0] = vld1q_f32(xi); + xi += 4; + XX[1] = vld1q_f32(xi); + xi += 4; + + YY[0] = vld1q_f32(yi); + yi += 4; + YY[1] = vld1q_f32(yi); + yi += 4; + + SUMM = vmlaq_f32(SUMM, YY[0], XX[0]); + SUMM = vmlaq_f32(SUMM, YY[1], XX[1]); + len -= 8; + } + + /* Work on 4 values */ + if (len >= 4) { + XX[0] = vld1q_f32(xi); + xi += 4; + YY[0] = vld1q_f32(yi); + yi += 4; + SUMM = vmlaq_f32(SUMM, YY[0], XX[0]); + len -= 4; + } + + /* Start accumulating results */ + SUMM_2[0] = vget_low_f32(SUMM); + if (len >= 2) { + /* While at it, consume 2 more values if available */ + XX_2 = vld1_f32(xi); + xi += 2; + YY_2 = vld1_f32(yi); + yi += 2; + SUMM_2[0] = vmla_f32(SUMM_2[0], YY_2, XX_2); + len -= 2; + } + SUMM_2[1] = vget_high_f32(SUMM); + SUMM_2[0] = vadd_f32(SUMM_2[0], SUMM_2[1]); + SUMM_2[0] = vpadd_f32(SUMM_2[0], SUMM_2[0]); + /* Ok, now we have result accumulated in SUMM_2[0].0 */ + + if (len > 0) { + /* Case when you have one value left */ + XX_2 = vld1_dup_f32(xi); + YY_2 = vld1_dup_f32(yi); + SUMM_2[0] = vmla_f32(SUMM_2[0], XX_2, YY_2); + } + + vst1_lane_f32(sum, SUMM_2[0], 0); +} + void celt_pitch_xcorr_float_neon(const opus_val16 *_x, const opus_val16 *_y, - opus_val32 *xcorr, int len, int max_pitch, int arch) { + opus_val32 *xcorr, int len, int max_pitch) { int i; - (void)arch; celt_assert(max_pitch > 0); - celt_sig_assert((((unsigned char *)_x-(unsigned char *)NULL)&3)==0); + celt_assert((((unsigned char *)_x-(unsigned char *)NULL)&3)==0); for (i = 0; i < (max_pitch-3); i += 4) { xcorr_kernel_neon_float((const float32_t *)_x, (const float32_t *)_y+i, (float32_t *)xcorr+i, len); } - /* In case max_pitch isn't a multiple of 4, do non-unrolled version. */ + /* In case max_pitch isn't multiple of 4 + * compute single correlation value per iteration + */ for (; i < max_pitch; i++) { - xcorr[i] = celt_inner_prod_neon(_x, _y+i, len); + xcorr_kernel_neon_float_process1((const float32_t *)_x, + (const float32_t *)_y+i, (float32_t *)xcorr+i, len); } } #endif diff --git a/thirdparty/opus/celt/arm/celt_pitch_xcorr_arm-gnu.S b/thirdparty/opus/celt/arm/celt_pitch_xcorr_arm-gnu.S index 10668e54a5..5b2ee55a10 100644 --- a/thirdparty/opus/celt/arm/celt_pitch_xcorr_arm-gnu.S +++ b/thirdparty/opus/celt/arm/celt_pitch_xcorr_arm-gnu.S @@ -44,7 +44,7 @@ .if OPUS_ARM_MAY_HAVE_NEON @ Compute sum[k]=sum(x[j]*y[j+k],j=0...len-1), k=0...3 - .type xcorr_kernel_neon, %function; xcorr_kernel_neon: @ PROC +; xcorr_kernel_neon: @ PROC xcorr_kernel_neon_start: @ input: @ r3 = int len @@ -156,8 +156,8 @@ xcorr_kernel_neon_process1: .size xcorr_kernel_neon, .-xcorr_kernel_neon @ ENDP @ opus_val32 celt_pitch_xcorr_neon(opus_val16 *_x, opus_val16 *_y, -@ opus_val32 *xcorr, int len, int max_pitch, int arch) - .type celt_pitch_xcorr_neon, %function; celt_pitch_xcorr_neon: @ PROC +@ opus_val32 *xcorr, int len, int max_pitch) +; celt_pitch_xcorr_neon: @ PROC @ input: @ r0 = opus_val16 *_x @ r1 = opus_val16 *_y @@ -171,8 +171,6 @@ xcorr_kernel_neon_process1: @ r6 = int max_pitch @ r12 = int j @ q15 = int maxcorr[4] (q15 is not used by xcorr_kernel_neon()) - @ ignored: - @ int arch STMFD sp!, {r4-r6, lr} LDR r6, [sp, #16] VMOV.S32 q15, #1 @@ -262,7 +260,7 @@ celt_pitch_xcorr_neon_done: @ This will get used on ARMv7 devices without NEON, so it has been optimized @ to take advantage of dual-issuing where possible. - .type xcorr_kernel_edsp, %function; xcorr_kernel_edsp: @ PROC +; xcorr_kernel_edsp: @ PROC xcorr_kernel_edsp_start: @ input: @ r3 = int len @@ -346,7 +344,7 @@ xcorr_kernel_edsp_done: LDMFD sp!, {r2,r4,r5,pc} .size xcorr_kernel_edsp, .-xcorr_kernel_edsp @ ENDP - .type celt_pitch_xcorr_edsp, %function; celt_pitch_xcorr_edsp: @ PROC +; celt_pitch_xcorr_edsp: @ PROC @ input: @ r0 = opus_val16 *_x (must be 32-bit aligned) @ r1 = opus_val16 *_y (only needs to be 16-bit aligned) @@ -363,8 +361,6 @@ xcorr_kernel_edsp_done: @ r9 = opus_val32 sum3 @ r1 = int max_pitch @ r12 = int j - @ ignored: - @ int arch STMFD sp!, {r4-r11, lr} MOV r5, r1 LDR r1, [sp, #36] diff --git a/thirdparty/opus/celt/arm/celt_pitch_xcorr_arm.s b/thirdparty/opus/celt/arm/celt_pitch_xcorr_arm.s index 6e873afc37..f96e0a88bb 100644 --- a/thirdparty/opus/celt/arm/celt_pitch_xcorr_arm.s +++ b/thirdparty/opus/celt/arm/celt_pitch_xcorr_arm.s @@ -153,7 +153,7 @@ xcorr_kernel_neon_process1 ENDP ; opus_val32 celt_pitch_xcorr_neon(opus_val16 *_x, opus_val16 *_y, -; opus_val32 *xcorr, int len, int max_pitch, int arch) +; opus_val32 *xcorr, int len, int max_pitch) celt_pitch_xcorr_neon PROC ; input: ; r0 = opus_val16 *_x @@ -168,8 +168,6 @@ celt_pitch_xcorr_neon PROC ; r6 = int max_pitch ; r12 = int j ; q15 = int maxcorr[4] (q15 is not used by xcorr_kernel_neon()) - ; ignored: - ; int arch STMFD sp!, {r4-r6, lr} LDR r6, [sp, #16] VMOV.S32 q15, #1 @@ -360,8 +358,6 @@ celt_pitch_xcorr_edsp PROC ; r9 = opus_val32 sum3 ; r1 = int max_pitch ; r12 = int j - ; ignored: - ; int arch STMFD sp!, {r4-r11, lr} MOV r5, r1 LDR r1, [sp, #36] diff --git a/thirdparty/opus/celt/arm/fft_arm.h b/thirdparty/opus/celt/arm/fft_arm.h index 0b78175f3a..0cb55d8e22 100644 --- a/thirdparty/opus/celt/arm/fft_arm.h +++ b/thirdparty/opus/celt/arm/fft_arm.h @@ -34,6 +34,7 @@ #if !defined(FFT_ARM_H) #define FFT_ARM_H +#include "config.h" #include "kiss_fft.h" #if defined(HAVE_ARM_NE10) diff --git a/thirdparty/opus/celt/arm/fixed_armv4.h b/thirdparty/opus/celt/arm/fixed_armv4.h index d84888a772..efb3b1896a 100644 --- a/thirdparty/opus/celt/arm/fixed_armv4.h +++ b/thirdparty/opus/celt/arm/fixed_armv4.h @@ -37,7 +37,7 @@ static OPUS_INLINE opus_val32 MULT16_32_Q16_armv4(opus_val16 a, opus_val32 b) "#MULT16_32_Q16\n\t" "smull %0, %1, %2, %3\n\t" : "=&r"(rd_lo), "=&r"(rd_hi) - : "%r"(b),"r"(SHL32(a,16)) + : "%r"(b),"r"(a<<16) ); return rd_hi; } @@ -54,10 +54,10 @@ static OPUS_INLINE opus_val32 MULT16_32_Q15_armv4(opus_val16 a, opus_val32 b) "#MULT16_32_Q15\n\t" "smull %0, %1, %2, %3\n\t" : "=&r"(rd_lo), "=&r"(rd_hi) - : "%r"(b), "r"(SHL32(a,16)) + : "%r"(b), "r"(a<<16) ); /*We intentionally don't OR in the high bit of rd_lo for speed.*/ - return SHL32(rd_hi,1); + return rd_hi<<1; } #define MULT16_32_Q15(a, b) (MULT16_32_Q15_armv4(a, b)) diff --git a/thirdparty/opus/celt/arm/fixed_armv5e.h b/thirdparty/opus/celt/arm/fixed_armv5e.h index 6bf73cbace..36a6321101 100644 --- a/thirdparty/opus/celt/arm/fixed_armv5e.h +++ b/thirdparty/opus/celt/arm/fixed_armv5e.h @@ -59,7 +59,7 @@ static OPUS_INLINE opus_val32 MULT16_32_Q15_armv5e(opus_val16 a, opus_val32 b) : "=r"(res) : "r"(b), "r"(a) ); - return SHL32(res,1); + return res<<1; } #define MULT16_32_Q15(a, b) (MULT16_32_Q15_armv5e(a, b)) @@ -76,7 +76,7 @@ static OPUS_INLINE opus_val32 MAC16_32_Q15_armv5e(opus_val32 c, opus_val16 a, "#MAC16_32_Q15\n\t" "smlawb %0, %1, %2, %3;\n" : "=r"(res) - : "r"(SHL32(b,1)), "r"(a), "r"(c) + : "r"(b<<1), "r"(a), "r"(c) ); return res; } diff --git a/thirdparty/opus/celt/arm/mdct_arm.h b/thirdparty/opus/celt/arm/mdct_arm.h index 14200bac4b..49cbb44576 100644 --- a/thirdparty/opus/celt/arm/mdct_arm.h +++ b/thirdparty/opus/celt/arm/mdct_arm.h @@ -33,6 +33,7 @@ #if !defined(MDCT_ARM_H) #define MDCT_ARM_H +#include "config.h" #include "mdct.h" #if defined(HAVE_ARM_NE10) diff --git a/thirdparty/opus/celt/arm/pitch_arm.h b/thirdparty/opus/celt/arm/pitch_arm.h index bed8b04eac..14331169ee 100644 --- a/thirdparty/opus/celt/arm/pitch_arm.h +++ b/thirdparty/opus/celt/arm/pitch_arm.h @@ -30,47 +30,11 @@ # include "armcpu.h" -# if defined(OPUS_ARM_MAY_HAVE_NEON_INTR) -opus_val32 celt_inner_prod_neon(const opus_val16 *x, const opus_val16 *y, int N); -void dual_inner_prod_neon(const opus_val16 *x, const opus_val16 *y01, - const opus_val16 *y02, int N, opus_val32 *xy1, opus_val32 *xy2); - -# if !defined(OPUS_HAVE_RTCD) && defined(OPUS_ARM_PRESUME_NEON) -# define OVERRIDE_CELT_INNER_PROD (1) -# define OVERRIDE_DUAL_INNER_PROD (1) -# define celt_inner_prod(x, y, N, arch) ((void)(arch), PRESUME_NEON(celt_inner_prod)(x, y, N)) -# define dual_inner_prod(x, y01, y02, N, xy1, xy2, arch) ((void)(arch), PRESUME_NEON(dual_inner_prod)(x, y01, y02, N, xy1, xy2)) -# endif -# endif - -# if !defined(OVERRIDE_CELT_INNER_PROD) -# if defined(OPUS_HAVE_RTCD) && (defined(OPUS_ARM_MAY_HAVE_NEON_INTR) && !defined(OPUS_ARM_PRESUME_NEON_INTR)) -extern opus_val32 (*const CELT_INNER_PROD_IMPL[OPUS_ARCHMASK+1])(const opus_val16 *x, const opus_val16 *y, int N); -# define OVERRIDE_CELT_INNER_PROD (1) -# define celt_inner_prod(x, y, N, arch) ((*CELT_INNER_PROD_IMPL[(arch)&OPUS_ARCHMASK])(x, y, N)) -# elif defined(OPUS_ARM_PRESUME_NEON_INTR) -# define OVERRIDE_CELT_INNER_PROD (1) -# define celt_inner_prod(x, y, N, arch) ((void)(arch), celt_inner_prod_neon(x, y, N)) -# endif -# endif - -# if !defined(OVERRIDE_DUAL_INNER_PROD) -# if defined(OPUS_HAVE_RTCD) && (defined(OPUS_ARM_MAY_HAVE_NEON_INTR) && !defined(OPUS_ARM_PRESUME_NEON_INTR)) -extern void (*const DUAL_INNER_PROD_IMPL[OPUS_ARCHMASK+1])(const opus_val16 *x, - const opus_val16 *y01, const opus_val16 *y02, int N, opus_val32 *xy1, opus_val32 *xy2); -# define OVERRIDE_DUAL_INNER_PROD (1) -# define dual_inner_prod(x, y01, y02, N, xy1, xy2, arch) ((*DUAL_INNER_PROD_IMPL[(arch)&OPUS_ARCHMASK])(x, y01, y02, N, xy1, xy2)) -# elif defined(OPUS_ARM_PRESUME_NEON_INTR) -# define OVERRIDE_DUAL_INNER_PROD (1) -# define dual_inner_prod(x, y01, y02, N, xy1, xy2, arch) ((void)(arch), dual_inner_prod_neon(x, y01, y02, N, xy1, xy2)) -# endif -# endif - # if defined(FIXED_POINT) # if defined(OPUS_ARM_MAY_HAVE_NEON) opus_val32 celt_pitch_xcorr_neon(const opus_val16 *_x, const opus_val16 *_y, - opus_val32 *xcorr, int len, int max_pitch, int arch); + opus_val32 *xcorr, int len, int max_pitch); # endif # if defined(OPUS_ARM_MAY_HAVE_MEDIA) @@ -79,7 +43,7 @@ opus_val32 celt_pitch_xcorr_neon(const opus_val16 *_x, const opus_val16 *_y, # if defined(OPUS_ARM_MAY_HAVE_EDSP) opus_val32 celt_pitch_xcorr_edsp(const opus_val16 *_x, const opus_val16 *_y, - opus_val32 *xcorr, int len, int max_pitch, int arch); + opus_val32 *xcorr, int len, int max_pitch); # endif # if defined(OPUS_HAVE_RTCD) && \ @@ -88,17 +52,18 @@ opus_val32 celt_pitch_xcorr_edsp(const opus_val16 *_x, const opus_val16 *_y, (defined(OPUS_ARM_MAY_HAVE_EDSP) && !defined(OPUS_ARM_PRESUME_EDSP))) extern opus_val32 (*const CELT_PITCH_XCORR_IMPL[OPUS_ARCHMASK+1])(const opus_val16 *, - const opus_val16 *, opus_val32 *, int, int, int); + const opus_val16 *, opus_val32 *, int, int); # define OVERRIDE_PITCH_XCORR (1) # define celt_pitch_xcorr(_x, _y, xcorr, len, max_pitch, arch) \ ((*CELT_PITCH_XCORR_IMPL[(arch)&OPUS_ARCHMASK])(_x, _y, \ - xcorr, len, max_pitch, arch)) + xcorr, len, max_pitch)) # elif defined(OPUS_ARM_PRESUME_EDSP) || \ defined(OPUS_ARM_PRESUME_MEDIA) || \ defined(OPUS_ARM_PRESUME_NEON) # define OVERRIDE_PITCH_XCORR (1) -# define celt_pitch_xcorr (PRESUME_NEON(celt_pitch_xcorr)) +# define celt_pitch_xcorr(_x, _y, xcorr, len, max_pitch, arch) \ + ((void)(arch),PRESUME_NEON(celt_pitch_xcorr)(_x, _y, xcorr, len, max_pitch)) # endif @@ -134,24 +99,25 @@ extern void (*const XCORR_KERNEL_IMPL[OPUS_ARCHMASK + 1])( /* Float case */ #if defined(OPUS_ARM_MAY_HAVE_NEON_INTR) void celt_pitch_xcorr_float_neon(const opus_val16 *_x, const opus_val16 *_y, - opus_val32 *xcorr, int len, int max_pitch, int arch); + opus_val32 *xcorr, int len, int max_pitch); #endif # if defined(OPUS_HAVE_RTCD) && \ (defined(OPUS_ARM_MAY_HAVE_NEON_INTR) && !defined(OPUS_ARM_PRESUME_NEON_INTR)) extern void (*const CELT_PITCH_XCORR_IMPL[OPUS_ARCHMASK+1])(const opus_val16 *, - const opus_val16 *, opus_val32 *, int, int, int); + const opus_val16 *, opus_val32 *, int, int); # define OVERRIDE_PITCH_XCORR (1) # define celt_pitch_xcorr(_x, _y, xcorr, len, max_pitch, arch) \ ((*CELT_PITCH_XCORR_IMPL[(arch)&OPUS_ARCHMASK])(_x, _y, \ - xcorr, len, max_pitch, arch)) + xcorr, len, max_pitch)) # elif defined(OPUS_ARM_PRESUME_NEON_INTR) # define OVERRIDE_PITCH_XCORR (1) -# define celt_pitch_xcorr celt_pitch_xcorr_float_neon +# define celt_pitch_xcorr(_x, _y, xcorr, len, max_pitch, arch) \ + ((void)(arch),celt_pitch_xcorr_float_neon(_x, _y, xcorr, len, max_pitch)) # endif diff --git a/thirdparty/opus/celt/arm/pitch_neon_intr.c b/thirdparty/opus/celt/arm/pitch_neon_intr.c deleted file mode 100644 index 1ac38c433a..0000000000 --- a/thirdparty/opus/celt/arm/pitch_neon_intr.c +++ /dev/null @@ -1,290 +0,0 @@ -/*********************************************************************** -Copyright (c) 2017 Google Inc. -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: -- Redistributions of source code must retain the above copyright notice, -this list of conditions and the following disclaimer. -- Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the -names of specific contributors, may be used to endorse or promote -products derived from this software without specific prior written -permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. -***********************************************************************/ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include <arm_neon.h> -#include "pitch.h" - -#ifdef FIXED_POINT - -opus_val32 celt_inner_prod_neon(const opus_val16 *x, const opus_val16 *y, int N) -{ - int i; - opus_val32 xy; - int16x8_t x_s16x8, y_s16x8; - int32x4_t xy_s32x4 = vdupq_n_s32(0); - int64x2_t xy_s64x2; - int64x1_t xy_s64x1; - - for (i = 0; i < N - 7; i += 8) { - x_s16x8 = vld1q_s16(&x[i]); - y_s16x8 = vld1q_s16(&y[i]); - xy_s32x4 = vmlal_s16(xy_s32x4, vget_low_s16 (x_s16x8), vget_low_s16 (y_s16x8)); - xy_s32x4 = vmlal_s16(xy_s32x4, vget_high_s16(x_s16x8), vget_high_s16(y_s16x8)); - } - - if (N - i >= 4) { - const int16x4_t x_s16x4 = vld1_s16(&x[i]); - const int16x4_t y_s16x4 = vld1_s16(&y[i]); - xy_s32x4 = vmlal_s16(xy_s32x4, x_s16x4, y_s16x4); - i += 4; - } - - xy_s64x2 = vpaddlq_s32(xy_s32x4); - xy_s64x1 = vadd_s64(vget_low_s64(xy_s64x2), vget_high_s64(xy_s64x2)); - xy = vget_lane_s32(vreinterpret_s32_s64(xy_s64x1), 0); - - for (; i < N; i++) { - xy = MAC16_16(xy, x[i], y[i]); - } - -#ifdef OPUS_CHECK_ASM - celt_assert(celt_inner_prod_c(x, y, N) == xy); -#endif - - return xy; -} - -void dual_inner_prod_neon(const opus_val16 *x, const opus_val16 *y01, const opus_val16 *y02, - int N, opus_val32 *xy1, opus_val32 *xy2) -{ - int i; - opus_val32 xy01, xy02; - int16x8_t x_s16x8, y01_s16x8, y02_s16x8; - int32x4_t xy01_s32x4 = vdupq_n_s32(0); - int32x4_t xy02_s32x4 = vdupq_n_s32(0); - int64x2_t xy01_s64x2, xy02_s64x2; - int64x1_t xy01_s64x1, xy02_s64x1; - - for (i = 0; i < N - 7; i += 8) { - x_s16x8 = vld1q_s16(&x[i]); - y01_s16x8 = vld1q_s16(&y01[i]); - y02_s16x8 = vld1q_s16(&y02[i]); - xy01_s32x4 = vmlal_s16(xy01_s32x4, vget_low_s16 (x_s16x8), vget_low_s16 (y01_s16x8)); - xy02_s32x4 = vmlal_s16(xy02_s32x4, vget_low_s16 (x_s16x8), vget_low_s16 (y02_s16x8)); - xy01_s32x4 = vmlal_s16(xy01_s32x4, vget_high_s16(x_s16x8), vget_high_s16(y01_s16x8)); - xy02_s32x4 = vmlal_s16(xy02_s32x4, vget_high_s16(x_s16x8), vget_high_s16(y02_s16x8)); - } - - if (N - i >= 4) { - const int16x4_t x_s16x4 = vld1_s16(&x[i]); - const int16x4_t y01_s16x4 = vld1_s16(&y01[i]); - const int16x4_t y02_s16x4 = vld1_s16(&y02[i]); - xy01_s32x4 = vmlal_s16(xy01_s32x4, x_s16x4, y01_s16x4); - xy02_s32x4 = vmlal_s16(xy02_s32x4, x_s16x4, y02_s16x4); - i += 4; - } - - xy01_s64x2 = vpaddlq_s32(xy01_s32x4); - xy02_s64x2 = vpaddlq_s32(xy02_s32x4); - xy01_s64x1 = vadd_s64(vget_low_s64(xy01_s64x2), vget_high_s64(xy01_s64x2)); - xy02_s64x1 = vadd_s64(vget_low_s64(xy02_s64x2), vget_high_s64(xy02_s64x2)); - xy01 = vget_lane_s32(vreinterpret_s32_s64(xy01_s64x1), 0); - xy02 = vget_lane_s32(vreinterpret_s32_s64(xy02_s64x1), 0); - - for (; i < N; i++) { - xy01 = MAC16_16(xy01, x[i], y01[i]); - xy02 = MAC16_16(xy02, x[i], y02[i]); - } - *xy1 = xy01; - *xy2 = xy02; - -#ifdef OPUS_CHECK_ASM - { - opus_val32 xy1_c, xy2_c; - dual_inner_prod_c(x, y01, y02, N, &xy1_c, &xy2_c); - celt_assert(xy1_c == *xy1); - celt_assert(xy2_c == *xy2); - } -#endif -} - -#else /* !FIXED_POINT */ - -/* ========================================================================== */ - -#ifdef OPUS_CHECK_ASM - -/* This part of code simulates floating-point NEON operations. */ - -/* celt_inner_prod_neon_float_c_simulation() simulates the floating-point */ -/* operations of celt_inner_prod_neon(), and both functions should have bit */ -/* exact output. */ -static opus_val32 celt_inner_prod_neon_float_c_simulation(const opus_val16 *x, const opus_val16 *y, int N) -{ - int i; - opus_val32 xy, xy0 = 0, xy1 = 0, xy2 = 0, xy3 = 0; - for (i = 0; i < N - 3; i += 4) { - xy0 = MAC16_16(xy0, x[i + 0], y[i + 0]); - xy1 = MAC16_16(xy1, x[i + 1], y[i + 1]); - xy2 = MAC16_16(xy2, x[i + 2], y[i + 2]); - xy3 = MAC16_16(xy3, x[i + 3], y[i + 3]); - } - xy0 += xy2; - xy1 += xy3; - xy = xy0 + xy1; - for (; i < N; i++) { - xy = MAC16_16(xy, x[i], y[i]); - } - return xy; -} - -/* dual_inner_prod_neon_float_c_simulation() simulates the floating-point */ -/* operations of dual_inner_prod_neon(), and both functions should have bit */ -/* exact output. */ -static void dual_inner_prod_neon_float_c_simulation(const opus_val16 *x, const opus_val16 *y01, const opus_val16 *y02, - int N, opus_val32 *xy1, opus_val32 *xy2) -{ - int i; - opus_val32 xy01, xy02, xy01_0 = 0, xy01_1 = 0, xy01_2 = 0, xy01_3 = 0, xy02_0 = 0, xy02_1 = 0, xy02_2 = 0, xy02_3 = 0; - for (i = 0; i < N - 3; i += 4) { - xy01_0 = MAC16_16(xy01_0, x[i + 0], y01[i + 0]); - xy01_1 = MAC16_16(xy01_1, x[i + 1], y01[i + 1]); - xy01_2 = MAC16_16(xy01_2, x[i + 2], y01[i + 2]); - xy01_3 = MAC16_16(xy01_3, x[i + 3], y01[i + 3]); - xy02_0 = MAC16_16(xy02_0, x[i + 0], y02[i + 0]); - xy02_1 = MAC16_16(xy02_1, x[i + 1], y02[i + 1]); - xy02_2 = MAC16_16(xy02_2, x[i + 2], y02[i + 2]); - xy02_3 = MAC16_16(xy02_3, x[i + 3], y02[i + 3]); - } - xy01_0 += xy01_2; - xy02_0 += xy02_2; - xy01_1 += xy01_3; - xy02_1 += xy02_3; - xy01 = xy01_0 + xy01_1; - xy02 = xy02_0 + xy02_1; - for (; i < N; i++) { - xy01 = MAC16_16(xy01, x[i], y01[i]); - xy02 = MAC16_16(xy02, x[i], y02[i]); - } - *xy1 = xy01; - *xy2 = xy02; -} - -#endif /* OPUS_CHECK_ASM */ - -/* ========================================================================== */ - -opus_val32 celt_inner_prod_neon(const opus_val16 *x, const opus_val16 *y, int N) -{ - int i; - opus_val32 xy; - float32x4_t xy_f32x4 = vdupq_n_f32(0); - float32x2_t xy_f32x2; - - for (i = 0; i < N - 7; i += 8) { - float32x4_t x_f32x4, y_f32x4; - x_f32x4 = vld1q_f32(&x[i]); - y_f32x4 = vld1q_f32(&y[i]); - xy_f32x4 = vmlaq_f32(xy_f32x4, x_f32x4, y_f32x4); - x_f32x4 = vld1q_f32(&x[i + 4]); - y_f32x4 = vld1q_f32(&y[i + 4]); - xy_f32x4 = vmlaq_f32(xy_f32x4, x_f32x4, y_f32x4); - } - - if (N - i >= 4) { - const float32x4_t x_f32x4 = vld1q_f32(&x[i]); - const float32x4_t y_f32x4 = vld1q_f32(&y[i]); - xy_f32x4 = vmlaq_f32(xy_f32x4, x_f32x4, y_f32x4); - i += 4; - } - - xy_f32x2 = vadd_f32(vget_low_f32(xy_f32x4), vget_high_f32(xy_f32x4)); - xy_f32x2 = vpadd_f32(xy_f32x2, xy_f32x2); - xy = vget_lane_f32(xy_f32x2, 0); - - for (; i < N; i++) { - xy = MAC16_16(xy, x[i], y[i]); - } - -#ifdef OPUS_CHECK_ASM - celt_assert(ABS32(celt_inner_prod_neon_float_c_simulation(x, y, N) - xy) <= VERY_SMALL); -#endif - - return xy; -} - -void dual_inner_prod_neon(const opus_val16 *x, const opus_val16 *y01, const opus_val16 *y02, - int N, opus_val32 *xy1, opus_val32 *xy2) -{ - int i; - opus_val32 xy01, xy02; - float32x4_t xy01_f32x4 = vdupq_n_f32(0); - float32x4_t xy02_f32x4 = vdupq_n_f32(0); - float32x2_t xy01_f32x2, xy02_f32x2; - - for (i = 0; i < N - 7; i += 8) { - float32x4_t x_f32x4, y01_f32x4, y02_f32x4; - x_f32x4 = vld1q_f32(&x[i]); - y01_f32x4 = vld1q_f32(&y01[i]); - y02_f32x4 = vld1q_f32(&y02[i]); - xy01_f32x4 = vmlaq_f32(xy01_f32x4, x_f32x4, y01_f32x4); - xy02_f32x4 = vmlaq_f32(xy02_f32x4, x_f32x4, y02_f32x4); - x_f32x4 = vld1q_f32(&x[i + 4]); - y01_f32x4 = vld1q_f32(&y01[i + 4]); - y02_f32x4 = vld1q_f32(&y02[i + 4]); - xy01_f32x4 = vmlaq_f32(xy01_f32x4, x_f32x4, y01_f32x4); - xy02_f32x4 = vmlaq_f32(xy02_f32x4, x_f32x4, y02_f32x4); - } - - if (N - i >= 4) { - const float32x4_t x_f32x4 = vld1q_f32(&x[i]); - const float32x4_t y01_f32x4 = vld1q_f32(&y01[i]); - const float32x4_t y02_f32x4 = vld1q_f32(&y02[i]); - xy01_f32x4 = vmlaq_f32(xy01_f32x4, x_f32x4, y01_f32x4); - xy02_f32x4 = vmlaq_f32(xy02_f32x4, x_f32x4, y02_f32x4); - i += 4; - } - - xy01_f32x2 = vadd_f32(vget_low_f32(xy01_f32x4), vget_high_f32(xy01_f32x4)); - xy02_f32x2 = vadd_f32(vget_low_f32(xy02_f32x4), vget_high_f32(xy02_f32x4)); - xy01_f32x2 = vpadd_f32(xy01_f32x2, xy01_f32x2); - xy02_f32x2 = vpadd_f32(xy02_f32x2, xy02_f32x2); - xy01 = vget_lane_f32(xy01_f32x2, 0); - xy02 = vget_lane_f32(xy02_f32x2, 0); - - for (; i < N; i++) { - xy01 = MAC16_16(xy01, x[i], y01[i]); - xy02 = MAC16_16(xy02, x[i], y02[i]); - } - *xy1 = xy01; - *xy2 = xy02; - -#ifdef OPUS_CHECK_ASM - { - opus_val32 xy1_c, xy2_c; - dual_inner_prod_neon_float_c_simulation(x, y01, y02, N, &xy1_c, &xy2_c); - celt_assert(ABS32(xy1_c - *xy1) <= VERY_SMALL); - celt_assert(ABS32(xy2_c - *xy2) <= VERY_SMALL); - } -#endif -} - -#endif /* FIXED_POINT */ diff --git a/thirdparty/opus/celt/bands.c b/thirdparty/opus/celt/bands.c index 2702963c37..87eaa6c031 100644 --- a/thirdparty/opus/celt/bands.c +++ b/thirdparty/opus/celt/bands.c @@ -65,19 +65,19 @@ opus_uint32 celt_lcg_rand(opus_uint32 seed) /* This is a cos() approximation designed to be bit-exact on any platform. Bit exactness with this approximation is important because it has an impact on the bit allocation */ -opus_int16 bitexact_cos(opus_int16 x) +static opus_int16 bitexact_cos(opus_int16 x) { opus_int32 tmp; opus_int16 x2; tmp = (4096+((opus_int32)(x)*(x)))>>13; - celt_sig_assert(tmp<=32767); + celt_assert(tmp<=32767); x2 = tmp; x2 = (32767-x2) + FRAC_MUL16(x2, (-7651 + FRAC_MUL16(x2, (8277 + FRAC_MUL16(-626, x2))))); - celt_sig_assert(x2<=32766); + celt_assert(x2<=32766); return 1+x2; } -int bitexact_log2tan(int isin,int icos) +static int bitexact_log2tan(int isin,int icos) { int lc; int ls; @@ -92,11 +92,10 @@ int bitexact_log2tan(int isin,int icos) #ifdef FIXED_POINT /* Compute the amplitude (sqrt energy) in each of the bands */ -void compute_band_energies(const CELTMode *m, const celt_sig *X, celt_ener *bandE, int end, int C, int LM, int arch) +void compute_band_energies(const CELTMode *m, const celt_sig *X, celt_ener *bandE, int end, int C, int LM) { int i, c, N; const opus_int16 *eBands = m->eBands; - (void)arch; N = m->shortMdctSize<<LM; c=0; do { for (i=0;i<end;i++) @@ -156,7 +155,7 @@ void normalise_bands(const CELTMode *m, const celt_sig * OPUS_RESTRICT freq, cel #else /* FIXED_POINT */ /* Compute the amplitude (sqrt energy) in each of the bands */ -void compute_band_energies(const CELTMode *m, const celt_sig *X, celt_ener *bandE, int end, int C, int LM, int arch) +void compute_band_energies(const CELTMode *m, const celt_sig *X, celt_ener *bandE, int end, int C, int LM) { int i, c, N; const opus_int16 *eBands = m->eBands; @@ -165,7 +164,7 @@ void compute_band_energies(const CELTMode *m, const celt_sig *X, celt_ener *band for (i=0;i<end;i++) { opus_val32 sum; - sum = 1e-27f + celt_inner_prod(&X[c*N+(eBands[i]<<LM)], &X[c*N+(eBands[i]<<LM)], (eBands[i+1]-eBands[i])<<LM, arch); + sum = 1e-27f + celt_inner_prod_c(&X[c*N+(eBands[i]<<LM)], &X[c*N+(eBands[i]<<LM)], (eBands[i+1]-eBands[i])<<LM); bandE[i+c*m->nbEBands] = celt_sqrt(sum); /*printf ("%f ", bandE[i+c*m->nbEBands]);*/ } @@ -225,9 +224,9 @@ void denormalise_bands(const CELTMode *m, const celt_norm * OPUS_RESTRICT X, #endif j=M*eBands[i]; band_end = M*eBands[i+1]; - lg = SATURATE16(ADD32(bandLogE[i], SHL32((opus_val32)eMeans[i],6))); + lg = ADD16(bandLogE[i], SHL16((opus_val16)eMeans[i],6)); #ifndef FIXED_POINT - g = celt_exp2(MIN32(32.f, lg)); + g = celt_exp2(lg); #else /* Handle the integer part of the log energy */ shift = 16-(lg>>DB_SHIFT); @@ -242,12 +241,12 @@ void denormalise_bands(const CELTMode *m, const celt_norm * OPUS_RESTRICT X, /* Handle extreme gains with negative shift. */ if (shift<0) { - /* For shift <= -2 and g > 16384 we'd be likely to overflow, so we're - capping the gain here, which is equivalent to a cap of 18 on lg. - This shouldn't trigger unless the bitstream is already corrupted. */ - if (shift <= -2) + /* For shift < -2 we'd be likely to overflow, so we're capping + the gain here. This shouldn't happen unless the bitstream is + already corrupted. */ + if (shift < -2) { - g = 16384; + g = 32767; shift = -2; } do { @@ -282,7 +281,7 @@ void anti_collapse(const CELTMode *m, celt_norm *X_, unsigned char *collapse_mas N0 = m->eBands[i+1]-m->eBands[i]; /* depth in 1/8 bits */ - celt_sig_assert(pulses[i]>=0); + celt_assert(pulses[i]>=0); depth = celt_udiv(1+pulses[i], (m->eBands[i+1]-m->eBands[i]))>>LM; #ifdef FIXED_POINT @@ -361,30 +360,6 @@ void anti_collapse(const CELTMode *m, celt_norm *X_, unsigned char *collapse_mas } } -/* Compute the weights to use for optimizing normalized distortion across - channels. We use the amplitude to weight square distortion, which means - that we use the square root of the value we would have been using if we - wanted to minimize the MSE in the non-normalized domain. This roughly - corresponds to some quick-and-dirty perceptual experiments I ran to - measure inter-aural masking (there doesn't seem to be any published data - on the topic). */ -static void compute_channel_weights(celt_ener Ex, celt_ener Ey, opus_val16 w[2]) -{ - celt_ener minE; -#ifdef FIXED_POINT - int shift; -#endif - minE = MIN32(Ex, Ey); - /* Adjustment to make the weights a bit more conservative. */ - Ex = ADD32(Ex, minE/3); - Ey = ADD32(Ey, minE/3); -#ifdef FIXED_POINT - shift = celt_ilog2(EPSILON+MAX32(Ex, Ey))-14; -#endif - w[0] = VSHR32(Ex, shift); - w[1] = VSHR32(Ey, shift); -} - static void intensity_stereo(const CELTMode *m, celt_norm * OPUS_RESTRICT X, const celt_norm * OPUS_RESTRICT Y, const celt_ener *bandE, int bandID, int N) { int i = bandID; @@ -478,7 +453,7 @@ static void stereo_merge(celt_norm * OPUS_RESTRICT X, celt_norm * OPUS_RESTRICT /* Decide whether we should spread the pulses in the current frame */ int spreading_decision(const CELTMode *m, const celt_norm *X, int *average, int last_decision, int *hf_average, int *tapset_decision, int update_hf, - int end, int C, int M, const int *spread_weight) + int end, int C, int M) { int i, c, N0; int sum = 0, nbBands=0; @@ -519,8 +494,8 @@ int spreading_decision(const CELTMode *m, const celt_norm *X, int *average, if (i>m->nbEBands-4) hf_sum += celt_udiv(32*(tcount[1]+tcount[0]), N); tmp = (2*tcount[2] >= N) + (2*tcount[1] >= N) + (2*tcount[0] >= N); - sum += tmp*spread_weight[i]; - nbBands+=spread_weight[i]; + sum += tmp*256; + nbBands++; } } while (++c<C); @@ -544,7 +519,7 @@ int spreading_decision(const CELTMode *m, const celt_norm *X, int *average, /*printf("%d %d %d\n", hf_sum, *hf_average, *tapset_decision);*/ celt_assert(nbBands>0); /* end has to be non-zero */ celt_assert(sum>=0); - sum = celt_udiv((opus_int32)sum<<8, nbBands); + sum = celt_udiv(sum, nbBands); /* Recursive averaging */ sum = (sum+*average)>>1; *average = sum; @@ -672,7 +647,6 @@ static int compute_qn(int N, int b, int offset, int pulse_cap, int stereo) struct band_ctx { int encode; - int resynth; const CELTMode *m; int i; int intensity; @@ -683,9 +657,6 @@ struct band_ctx { const celt_ener *bandE; opus_uint32 seed; int arch; - int theta_round; - int disable_inv; - int avoid_split_noise; }; struct split_ctx { @@ -743,35 +714,8 @@ static void compute_theta(struct band_ctx *ctx, struct split_ctx *sctx, if (qn!=1) { if (encode) - { - if (!stereo || ctx->theta_round == 0) - { - itheta = (itheta*(opus_int32)qn+8192)>>14; - if (!stereo && ctx->avoid_split_noise && itheta > 0 && itheta < qn) - { - /* Check if the selected value of theta will cause the bit allocation - to inject noise on one side. If so, make sure the energy of that side - is zero. */ - int unquantized = celt_udiv((opus_int32)itheta*16384, qn); - imid = bitexact_cos((opus_int16)unquantized); - iside = bitexact_cos((opus_int16)(16384-unquantized)); - delta = FRAC_MUL16((N-1)<<7,bitexact_log2tan(iside,imid)); - if (delta > *b) - itheta = qn; - else if (delta < -*b) - itheta = 0; - } - } else { - int down; - /* Bias quantization towards itheta=0 and itheta=16384. */ - int bias = itheta > 8192 ? 32767/qn : -32767/qn; - down = IMIN(qn-1, IMAX(0, (itheta*(opus_int32)qn + bias)>>14)); - if (ctx->theta_round < 0) - itheta = down; - else - itheta = down+1; - } - } + itheta = (itheta*(opus_int32)qn+8192)>>14; + /* Entropy coding of the angle. We use a uniform pdf for the time split, a step for stereo, and a triangular one for the rest. */ if (stereo && N>2) @@ -849,7 +793,7 @@ static void compute_theta(struct band_ctx *ctx, struct split_ctx *sctx, } else if (stereo) { if (encode) { - inv = itheta > 8192 && !ctx->disable_inv; + inv = itheta > 8192; if (inv) { int j; @@ -866,9 +810,6 @@ static void compute_theta(struct band_ctx *ctx, struct split_ctx *sctx, inv = ec_dec_bit_logp(ec, 2); } else inv = 0; - /* inv flag override to avoid problems with downmixing. */ - if (ctx->disable_inv) - inv = 0; itheta = 0; } qalloc = ec_tell_frac(ec) - tell; @@ -904,6 +845,11 @@ static void compute_theta(struct band_ctx *ctx, struct split_ctx *sctx, static unsigned quant_band_n1(struct band_ctx *ctx, celt_norm *X, celt_norm *Y, int b, celt_norm *lowband_out) { +#ifdef RESYNTH + int resynth = 1; +#else + int resynth = !ctx->encode; +#endif int c; int stereo; celt_norm *x = X; @@ -928,7 +874,7 @@ static unsigned quant_band_n1(struct band_ctx *ctx, celt_norm *X, celt_norm *Y, ctx->remaining_bits -= 1<<BITRES; b-=1<<BITRES; } - if (ctx->resynth) + if (resynth) x[0] = sign ? -NORM_SCALING : NORM_SCALING; x = Y; } while (++c<1+stereo); @@ -953,6 +899,11 @@ static unsigned quant_partition(struct band_ctx *ctx, celt_norm *X, int B0=B; opus_val16 mid=0, side=0; unsigned cm=0; +#ifdef RESYNTH + int resynth = 1; +#else + int resynth = !ctx->encode; +#endif celt_norm *Y=NULL; int encode; const CELTMode *m; @@ -984,7 +935,8 @@ static unsigned quant_partition(struct band_ctx *ctx, celt_norm *X, fill = (fill&1)|(fill<<1); B = (B+1)>>1; - compute_theta(ctx, &sctx, X, Y, N, &b, B, B0, LM, 0, &fill); + compute_theta(ctx, &sctx, X, Y, N, &b, B, B0, + LM, 0, &fill); imid = sctx.imid; iside = sctx.iside; delta = sctx.delta; @@ -1018,20 +970,24 @@ static unsigned quant_partition(struct band_ctx *ctx, celt_norm *X, rebalance = ctx->remaining_bits; if (mbits >= sbits) { - cm = quant_partition(ctx, X, N, mbits, B, lowband, LM, + cm = quant_partition(ctx, X, N, mbits, B, + lowband, LM, MULT16_16_P15(gain,mid), fill); rebalance = mbits - (rebalance-ctx->remaining_bits); if (rebalance > 3<<BITRES && itheta!=0) sbits += rebalance - (3<<BITRES); - cm |= quant_partition(ctx, Y, N, sbits, B, next_lowband2, LM, + cm |= quant_partition(ctx, Y, N, sbits, B, + next_lowband2, LM, MULT16_16_P15(gain,side), fill>>B)<<(B0>>1); } else { - cm = quant_partition(ctx, Y, N, sbits, B, next_lowband2, LM, + cm = quant_partition(ctx, Y, N, sbits, B, + next_lowband2, LM, MULT16_16_P15(gain,side), fill>>B)<<(B0>>1); rebalance = sbits - (rebalance-ctx->remaining_bits); if (rebalance > 3<<BITRES && itheta!=16384) mbits += rebalance - (3<<BITRES); - cm |= quant_partition(ctx, X, N, mbits, B, lowband, LM, + cm |= quant_partition(ctx, X, N, mbits, B, + lowband, LM, MULT16_16_P15(gain,mid), fill); } } else { @@ -1056,14 +1012,18 @@ static unsigned quant_partition(struct band_ctx *ctx, celt_norm *X, /* Finally do the actual quantization */ if (encode) { - cm = alg_quant(X, N, K, spread, B, ec, gain, ctx->resynth, ctx->arch); + cm = alg_quant(X, N, K, spread, B, ec +#ifdef RESYNTH + , gain +#endif + ); } else { cm = alg_unquant(X, N, K, spread, B, ec, gain); } } else { /* If there's no pulse, fill the band anyway */ int j; - if (ctx->resynth) + if (resynth) { unsigned cm_mask; /* B can be as large as 16, so this shift might overflow an int on a @@ -1120,6 +1080,11 @@ static unsigned quant_band(struct band_ctx *ctx, celt_norm *X, int recombine=0; int longBlocks; unsigned cm=0; +#ifdef RESYNTH + int resynth = 1; +#else + int resynth = !ctx->encode; +#endif int k; int encode; int tf_change; @@ -1186,10 +1151,11 @@ static unsigned quant_band(struct band_ctx *ctx, celt_norm *X, deinterleave_hadamard(lowband, N_B>>recombine, B0<<recombine, longBlocks); } - cm = quant_partition(ctx, X, N, b, B, lowband, LM, gain, fill); + cm = quant_partition(ctx, X, N, b, B, lowband, + LM, gain, fill); /* This code is used by the decoder and by the resynthesis-enabled encoder */ - if (ctx->resynth) + if (resynth) { /* Undo the sample reorganization going from time order to frequency order */ if (B0>1) @@ -1242,6 +1208,11 @@ static unsigned quant_band_stereo(struct band_ctx *ctx, celt_norm *X, celt_norm int inv = 0; opus_val16 mid=0, side=0; unsigned cm=0; +#ifdef RESYNTH + int resynth = 1; +#else + int resynth = !ctx->encode; +#endif int mbits, sbits, delta; int itheta; int qalloc; @@ -1261,7 +1232,8 @@ static unsigned quant_band_stereo(struct band_ctx *ctx, celt_norm *X, celt_norm orig_fill = fill; - compute_theta(ctx, &sctx, X, Y, N, &b, B, B, LM, 1, &fill); + compute_theta(ctx, &sctx, X, Y, N, &b, B, B, + LM, 1, &fill); inv = sctx.inv; imid = sctx.imid; iside = sctx.iside; @@ -1309,13 +1281,13 @@ static unsigned quant_band_stereo(struct band_ctx *ctx, celt_norm *X, celt_norm sign = 1-2*sign; /* We use orig_fill here because we want to fold the side, but if itheta==16384, we'll have cleared the low bits of fill. */ - cm = quant_band(ctx, x2, N, mbits, B, lowband, LM, lowband_out, Q15ONE, - lowband_scratch, orig_fill); + cm = quant_band(ctx, x2, N, mbits, B, lowband, + LM, lowband_out, Q15ONE, lowband_scratch, orig_fill); /* We don't split N=2 bands, so cm is either 1 or 0 (for a fold-collapse), and there's no need to worry about mixing with the other channel. */ y2[0] = -sign*x2[1]; y2[1] = sign*x2[0]; - if (ctx->resynth) + if (resynth) { celt_norm tmp; X[0] = MULT16_16_Q15(mid, X[0]); @@ -1342,32 +1314,38 @@ static unsigned quant_band_stereo(struct band_ctx *ctx, celt_norm *X, celt_norm { /* In stereo mode, we do not apply a scaling to the mid because we need the normalized mid for folding later. */ - cm = quant_band(ctx, X, N, mbits, B, lowband, LM, lowband_out, Q15ONE, - lowband_scratch, fill); + cm = quant_band(ctx, X, N, mbits, B, + lowband, LM, lowband_out, + Q15ONE, lowband_scratch, fill); rebalance = mbits - (rebalance-ctx->remaining_bits); if (rebalance > 3<<BITRES && itheta!=0) sbits += rebalance - (3<<BITRES); /* For a stereo split, the high bits of fill are always zero, so no folding will be done to the side. */ - cm |= quant_band(ctx, Y, N, sbits, B, NULL, LM, NULL, side, NULL, fill>>B); + cm |= quant_band(ctx, Y, N, sbits, B, + NULL, LM, NULL, + side, NULL, fill>>B); } else { /* For a stereo split, the high bits of fill are always zero, so no folding will be done to the side. */ - cm = quant_band(ctx, Y, N, sbits, B, NULL, LM, NULL, side, NULL, fill>>B); + cm = quant_band(ctx, Y, N, sbits, B, + NULL, LM, NULL, + side, NULL, fill>>B); rebalance = sbits - (rebalance-ctx->remaining_bits); if (rebalance > 3<<BITRES && itheta!=16384) mbits += rebalance - (3<<BITRES); /* In stereo mode, we do not apply a scaling to the mid because we need the normalized mid for folding later. */ - cm |= quant_band(ctx, X, N, mbits, B, lowband, LM, lowband_out, Q15ONE, - lowband_scratch, fill); + cm |= quant_band(ctx, X, N, mbits, B, + lowband, LM, lowband_out, + Q15ONE, lowband_scratch, fill); } } /* This code is used by the decoder and by the resynthesis-enabled encoder */ - if (ctx->resynth) + if (resynth) { if (N!=2) stereo_merge(X, Y, mid, N, ctx->arch); @@ -1381,38 +1359,19 @@ static unsigned quant_band_stereo(struct band_ctx *ctx, celt_norm *X, celt_norm return cm; } -static void special_hybrid_folding(const CELTMode *m, celt_norm *norm, celt_norm *norm2, int start, int M, int dual_stereo) -{ - int n1, n2; - const opus_int16 * OPUS_RESTRICT eBands = m->eBands; - n1 = M*(eBands[start+1]-eBands[start]); - n2 = M*(eBands[start+2]-eBands[start+1]); - /* Duplicate enough of the first band folding data to be able to fold the second band. - Copies no data for CELT-only mode. */ - OPUS_COPY(&norm[n1], &norm[2*n1 - n2], n2-n1); - if (dual_stereo) - OPUS_COPY(&norm2[n1], &norm2[2*n1 - n2], n2-n1); -} void quant_all_bands(int encode, const CELTMode *m, int start, int end, celt_norm *X_, celt_norm *Y_, unsigned char *collapse_masks, const celt_ener *bandE, int *pulses, int shortBlocks, int spread, int dual_stereo, int intensity, int *tf_res, opus_int32 total_bits, opus_int32 balance, ec_ctx *ec, int LM, int codedBands, - opus_uint32 *seed, int complexity, int arch, int disable_inv) + opus_uint32 *seed, int arch) { int i; opus_int32 remaining_bits; const opus_int16 * OPUS_RESTRICT eBands = m->eBands; celt_norm * OPUS_RESTRICT norm, * OPUS_RESTRICT norm2; VARDECL(celt_norm, _norm); - VARDECL(celt_norm, _lowband_scratch); - VARDECL(celt_norm, X_save); - VARDECL(celt_norm, Y_save); - VARDECL(celt_norm, X_save2); - VARDECL(celt_norm, Y_save2); - VARDECL(celt_norm, norm_save2); - int resynth_alloc; celt_norm *lowband_scratch; int B; int M; @@ -1420,11 +1379,10 @@ void quant_all_bands(int encode, const CELTMode *m, int start, int end, int update_lowband = 1; int C = Y_ != NULL ? 2 : 1; int norm_offset; - int theta_rdo = encode && Y_!=NULL && !dual_stereo && complexity>=8; #ifdef RESYNTH int resynth = 1; #else - int resynth = !encode || theta_rdo; + int resynth = !encode; #endif struct band_ctx ctx; SAVE_STACK; @@ -1437,24 +1395,9 @@ void quant_all_bands(int encode, const CELTMode *m, int start, int end, ALLOC(_norm, C*(M*eBands[m->nbEBands-1]-norm_offset), celt_norm); norm = _norm; norm2 = norm + M*eBands[m->nbEBands-1]-norm_offset; - - /* For decoding, we can use the last band as scratch space because we don't need that - scratch space for the last band and we don't care about the data there until we're - decoding the last band. */ - if (encode && resynth) - resynth_alloc = M*(eBands[m->nbEBands]-eBands[m->nbEBands-1]); - else - resynth_alloc = ALLOC_NONE; - ALLOC(_lowband_scratch, resynth_alloc, celt_norm); - if (encode && resynth) - lowband_scratch = _lowband_scratch; - else - lowband_scratch = X_+M*eBands[m->nbEBands-1]; - ALLOC(X_save, resynth_alloc, celt_norm); - ALLOC(Y_save, resynth_alloc, celt_norm); - ALLOC(X_save2, resynth_alloc, celt_norm); - ALLOC(Y_save2, resynth_alloc, celt_norm); - ALLOC(norm_save2, resynth_alloc, celt_norm); + /* We can use the last band as scratch space because we don't need that + scratch space for the last band. */ + lowband_scratch = X_+M*eBands[m->nbEBands-1]; lowband_offset = 0; ctx.bandE = bandE; @@ -1465,11 +1408,6 @@ void quant_all_bands(int encode, const CELTMode *m, int start, int end, ctx.seed = *seed; ctx.spread = spread; ctx.arch = arch; - ctx.disable_inv = disable_inv; - ctx.resynth = resynth; - ctx.theta_round = 0; - /* Avoid injecting noise in the first band on transients. */ - ctx.avoid_split_noise = B > 1; for (i=start;i<end;i++) { opus_int32 tell; @@ -1492,7 +1430,6 @@ void quant_all_bands(int encode, const CELTMode *m, int start, int end, else Y = NULL; N = M*eBands[i+1]-M*eBands[i]; - celt_assert(N > 0); tell = ec_tell_frac(ec); /* Compute how many bits we want to allocate to this band */ @@ -1508,15 +1445,8 @@ void quant_all_bands(int encode, const CELTMode *m, int start, int end, b = 0; } -#ifndef DISABLE_UPDATE_DRAFT - if (resynth && (M*eBands[i]-N >= M*eBands[start] || i==start+1) && (update_lowband || lowband_offset==0)) - lowband_offset = i; - if (i == start+1) - special_hybrid_folding(m, norm, norm2, start, M, dual_stereo); -#else if (resynth && M*eBands[i]-N >= M*eBands[start] && (update_lowband || lowband_offset==0)) lowband_offset = i; -#endif tf_change = tf_res[i]; ctx.tf_change = tf_change; @@ -1527,7 +1457,7 @@ void quant_all_bands(int encode, const CELTMode *m, int start, int end, Y = norm; lowband_scratch = NULL; } - if (last && !theta_rdo) + if (i==end-1) lowband_scratch = NULL; /* Get a conservative estimate of the collapse_mask's for the bands we're @@ -1542,11 +1472,7 @@ void quant_all_bands(int encode, const CELTMode *m, int start, int end, fold_start = lowband_offset; while(M*eBands[--fold_start] > effective_lowband+norm_offset); fold_end = lowband_offset-1; -#ifndef DISABLE_UPDATE_DRAFT - while(++fold_end < i && M*eBands[fold_end] < effective_lowband+norm_offset+N); -#else while(M*eBands[++fold_end] < effective_lowband+norm_offset+N); -#endif x_cm = y_cm = 0; fold_i = fold_start; do { x_cm |= collapse_masks[fold_i*C+0]; @@ -1579,79 +1505,13 @@ void quant_all_bands(int encode, const CELTMode *m, int start, int end, } else { if (Y!=NULL) { - if (theta_rdo && i < intensity) - { - ec_ctx ec_save, ec_save2; - struct band_ctx ctx_save, ctx_save2; - opus_val32 dist0, dist1; - unsigned cm, cm2; - int nstart_bytes, nend_bytes, save_bytes; - unsigned char *bytes_buf; - unsigned char bytes_save[1275]; - opus_val16 w[2]; - compute_channel_weights(bandE[i], bandE[i+m->nbEBands], w); - /* Make a copy. */ - cm = x_cm|y_cm; - ec_save = *ec; - ctx_save = ctx; - OPUS_COPY(X_save, X, N); - OPUS_COPY(Y_save, Y, N); - /* Encode and round down. */ - ctx.theta_round = -1; - x_cm = quant_band_stereo(&ctx, X, Y, N, b, B, - effective_lowband != -1 ? norm+effective_lowband : NULL, LM, - last?NULL:norm+M*eBands[i]-norm_offset, lowband_scratch, cm); - dist0 = MULT16_32_Q15(w[0], celt_inner_prod(X_save, X, N, arch)) + MULT16_32_Q15(w[1], celt_inner_prod(Y_save, Y, N, arch)); - - /* Save first result. */ - cm2 = x_cm; - ec_save2 = *ec; - ctx_save2 = ctx; - OPUS_COPY(X_save2, X, N); - OPUS_COPY(Y_save2, Y, N); - if (!last) - OPUS_COPY(norm_save2, norm+M*eBands[i]-norm_offset, N); - nstart_bytes = ec_save.offs; - nend_bytes = ec_save.storage; - bytes_buf = ec_save.buf+nstart_bytes; - save_bytes = nend_bytes-nstart_bytes; - OPUS_COPY(bytes_save, bytes_buf, save_bytes); - - /* Restore */ - *ec = ec_save; - ctx = ctx_save; - OPUS_COPY(X, X_save, N); - OPUS_COPY(Y, Y_save, N); -#ifndef DISABLE_UPDATE_DRAFT - if (i == start+1) - special_hybrid_folding(m, norm, norm2, start, M, dual_stereo); -#endif - /* Encode and round up. */ - ctx.theta_round = 1; - x_cm = quant_band_stereo(&ctx, X, Y, N, b, B, - effective_lowband != -1 ? norm+effective_lowband : NULL, LM, - last?NULL:norm+M*eBands[i]-norm_offset, lowband_scratch, cm); - dist1 = MULT16_32_Q15(w[0], celt_inner_prod(X_save, X, N, arch)) + MULT16_32_Q15(w[1], celt_inner_prod(Y_save, Y, N, arch)); - if (dist0 >= dist1) { - x_cm = cm2; - *ec = ec_save2; - ctx = ctx_save2; - OPUS_COPY(X, X_save2, N); - OPUS_COPY(Y, Y_save2, N); - if (!last) - OPUS_COPY(norm+M*eBands[i]-norm_offset, norm_save2, N); - OPUS_COPY(bytes_buf, bytes_save, save_bytes); - } - } else { - ctx.theta_round = 0; - x_cm = quant_band_stereo(&ctx, X, Y, N, b, B, - effective_lowband != -1 ? norm+effective_lowband : NULL, LM, - last?NULL:norm+M*eBands[i]-norm_offset, lowband_scratch, x_cm|y_cm); - } + x_cm = quant_band_stereo(&ctx, X, Y, N, b, B, + effective_lowband != -1 ? norm+effective_lowband : NULL, LM, + last?NULL:norm+M*eBands[i]-norm_offset, lowband_scratch, x_cm|y_cm); } else { x_cm = quant_band(&ctx, X, N, b, B, effective_lowband != -1 ? norm+effective_lowband : NULL, LM, - last?NULL:norm+M*eBands[i]-norm_offset, Q15ONE, lowband_scratch, x_cm|y_cm); + last?NULL:norm+M*eBands[i]-norm_offset, Q15ONE, lowband_scratch, x_cm|y_cm); } y_cm = x_cm; } @@ -1661,9 +1521,6 @@ void quant_all_bands(int encode, const CELTMode *m, int start, int end, /* Update the folding position only as long as we have 1 bit/sample depth. */ update_lowband = b>(N<<BITRES); - /* We only need to avoid noise on a split for the first band. After that, we - have folding. */ - ctx.avoid_split_noise = 0; } *seed = ctx.seed; diff --git a/thirdparty/opus/celt/bands.h b/thirdparty/opus/celt/bands.h index 422b32cf75..e8bef4bad0 100644 --- a/thirdparty/opus/celt/bands.h +++ b/thirdparty/opus/celt/bands.h @@ -36,15 +36,12 @@ #include "entdec.h" #include "rate.h" -opus_int16 bitexact_cos(opus_int16 x); -int bitexact_log2tan(int isin,int icos); - /** Compute the amplitude (sqrt energy) in each of the bands * @param m Mode data * @param X Spectrum * @param bandE Square root of the energy for each band (returned) */ -void compute_band_energies(const CELTMode *m, const celt_sig *X, celt_ener *bandE, int end, int C, int LM, int arch); +void compute_band_energies(const CELTMode *m, const celt_sig *X, celt_ener *bandE, int end, int C, int LM); /*void compute_noise_energies(const CELTMode *m, const celt_sig *X, const opus_val16 *tonality, celt_ener *bandE);*/ @@ -72,7 +69,7 @@ void denormalise_bands(const CELTMode *m, const celt_norm * OPUS_RESTRICT X, int spreading_decision(const CELTMode *m, const celt_norm *X, int *average, int last_decision, int *hf_average, int *tapset_decision, int update_hf, - int end, int C, int M, const int *spread_weight); + int end, int C, int M); #ifdef MEASURE_NORM_MSE void measure_norm_mse(const CELTMode *m, float *X, float *X0, float *bandE, float *bandE0, int M, int N, int C); @@ -108,7 +105,7 @@ void quant_all_bands(int encode, const CELTMode *m, int start, int end, const celt_ener *bandE, int *pulses, int shortBlocks, int spread, int dual_stereo, int intensity, int *tf_res, opus_int32 total_bits, opus_int32 balance, ec_ctx *ec, int M, int codedBands, opus_uint32 *seed, - int complexity, int arch, int disable_inv); + int arch); void anti_collapse(const CELTMode *m, celt_norm *X_, unsigned char *collapse_masks, int LM, int C, int size, int start, diff --git a/thirdparty/opus/celt/celt.c b/thirdparty/opus/celt/celt.c index 9ce234695c..b121c51a1f 100644 --- a/thirdparty/opus/celt/celt.c +++ b/thirdparty/opus/celt/celt.c @@ -111,31 +111,26 @@ void comb_filter_const_c(opus_val32 *y, opus_val32 *x, int T, int N, t = MAC16_32_Q16(x[i], g10, x2); t = MAC16_32_Q16(t, g11, ADD32(x1,x3)); t = MAC16_32_Q16(t, g12, ADD32(x0,x4)); - t = SATURATE(t, SIG_SAT); y[i] = t; x4=SHL32(x[i-T+3],1); t = MAC16_32_Q16(x[i+1], g10, x1); t = MAC16_32_Q16(t, g11, ADD32(x0,x2)); t = MAC16_32_Q16(t, g12, ADD32(x4,x3)); - t = SATURATE(t, SIG_SAT); y[i+1] = t; x3=SHL32(x[i-T+4],1); t = MAC16_32_Q16(x[i+2], g10, x0); t = MAC16_32_Q16(t, g11, ADD32(x4,x1)); t = MAC16_32_Q16(t, g12, ADD32(x3,x2)); - t = SATURATE(t, SIG_SAT); y[i+2] = t; x2=SHL32(x[i-T+5],1); t = MAC16_32_Q16(x[i+3], g10, x4); t = MAC16_32_Q16(t, g11, ADD32(x3,x0)); t = MAC16_32_Q16(t, g12, ADD32(x2,x1)); - t = SATURATE(t, SIG_SAT); y[i+3] = t; x1=SHL32(x[i-T+6],1); t = MAC16_32_Q16(x[i+4], g10, x3); t = MAC16_32_Q16(t, g11, ADD32(x2,x4)); t = MAC16_32_Q16(t, g12, ADD32(x1,x0)); - t = SATURATE(t, SIG_SAT); y[i+4] = t; } #ifdef CUSTOM_MODES @@ -146,7 +141,6 @@ void comb_filter_const_c(opus_val32 *y, opus_val32 *x, int T, int N, t = MAC16_32_Q16(x[i], g10, x2); t = MAC16_32_Q16(t, g11, ADD32(x1,x3)); t = MAC16_32_Q16(t, g12, ADD32(x0,x4)); - t = SATURATE(t, SIG_SAT); y[i] = t; x4=x3; x3=x2; @@ -175,7 +169,6 @@ void comb_filter_const_c(opus_val32 *y, opus_val32 *x, int T, int N, + MULT16_32_Q15(g10,x2) + MULT16_32_Q15(g11,ADD32(x1,x3)) + MULT16_32_Q15(g12,ADD32(x0,x4)); - y[i] = SATURATE(y[i], SIG_SAT); x4=x3; x3=x2; x2=x1; @@ -207,10 +200,6 @@ void comb_filter(opus_val32 *y, opus_val32 *x, int T0, int T1, int N, OPUS_MOVE(y, x, N); return; } - /* When the gain is zero, T0 and/or T1 is set to zero. We need - to have then be at least 2 to avoid processing garbage data. */ - T0 = IMAX(T0, COMBFILTER_MINPERIOD); - T1 = IMAX(T1, COMBFILTER_MINPERIOD); g00 = MULT16_16_P15(g0, gains[tapset0][0]); g01 = MULT16_16_P15(g0, gains[tapset0][1]); g02 = MULT16_16_P15(g0, gains[tapset0][2]); @@ -236,7 +225,6 @@ void comb_filter(opus_val32 *y, opus_val32 *x, int T0, int T1, int N, + MULT16_32_Q15(MULT16_16_Q15(f,g10),x2) + MULT16_32_Q15(MULT16_16_Q15(f,g11),ADD32(x1,x3)) + MULT16_32_Q15(MULT16_16_Q15(f,g12),ADD32(x0,x4)); - y[i] = SATURATE(y[i], SIG_SAT); x4=x3; x3=x2; x2=x1; @@ -256,16 +244,11 @@ void comb_filter(opus_val32 *y, opus_val32 *x, int T0, int T1, int N, } #endif /* OVERRIDE_comb_filter */ -/* TF change table. Positive values mean better frequency resolution (longer - effective window), whereas negative values mean better time resolution - (shorter effective window). The second index is computed as: - 4*isTransient + 2*tf_select + per_band_flag */ const signed char tf_select_table[4][8] = { - /*isTransient=0 isTransient=1 */ - {0, -1, 0, -1, 0,-1, 0,-1}, /* 2.5 ms */ - {0, -1, 0, -2, 1, 0, 1,-1}, /* 5 ms */ - {0, -2, 0, -3, 2, 0, 1,-1}, /* 10 ms */ - {0, -2, 0, -3, 3, 0, 1,-1}, /* 20 ms */ + {0, -1, 0, -1, 0,-1, 0,-1}, + {0, -1, 0, -2, 1, 0, 1,-1}, + {0, -2, 0, -3, 2, 0, 1,-1}, + {0, -2, 0, -3, 3, 0, 1,-1}, }; diff --git a/thirdparty/opus/celt/celt.h b/thirdparty/opus/celt/celt.h index 24b6b2b520..d1f7eb690d 100644 --- a/thirdparty/opus/celt/celt.h +++ b/thirdparty/opus/celt/celt.h @@ -50,8 +50,6 @@ extern "C" { #define CELTDecoder OpusCustomDecoder #define CELTMode OpusCustomMode -#define LEAK_BANDS 19 - typedef struct { int valid; float tonality; @@ -59,28 +57,18 @@ typedef struct { float noisiness; float activity; float music_prob; - float music_prob_min; - float music_prob_max; - int bandwidth; - float activity_probability; - float max_pitch_ratio; - /* Store as Q6 char to save space. */ - unsigned char leak_boost[LEAK_BANDS]; -} AnalysisInfo; - -typedef struct { - int signalType; - int offset; -} SILKInfo; + int bandwidth; +}AnalysisInfo; #define __celt_check_mode_ptr_ptr(ptr) ((ptr) + ((ptr) - (const CELTMode**)(ptr))) #define __celt_check_analysis_ptr(ptr) ((ptr) + ((ptr) - (const AnalysisInfo*)(ptr))) -#define __celt_check_silkinfo_ptr(ptr) ((ptr) + ((ptr) - (const SILKInfo*)(ptr))) - /* Encoder/decoder Requests */ +/* Expose this option again when variable framesize actually works */ +#define OPUS_FRAMESIZE_VARIABLE 5010 /**< Optimize the frame size dynamically */ + #define CELT_SET_PREDICTION_REQUEST 10002 /** Controls the use of interframe prediction. @@ -128,9 +116,6 @@ typedef struct { #define OPUS_SET_ENERGY_MASK_REQUEST 10026 #define OPUS_SET_ENERGY_MASK(x) OPUS_SET_ENERGY_MASK_REQUEST, __opus_check_val16_ptr(x) -#define CELT_SET_SILK_INFO_REQUEST 10028 -#define CELT_SET_SILK_INFO(x) CELT_SET_SILK_INFO_REQUEST, __celt_check_silkinfo_ptr(x) - /* Encoder stuff */ int celt_encoder_get_size(int channels); @@ -209,13 +194,6 @@ static OPUS_INLINE int fromOpus(unsigned char c) extern const signed char tf_select_table[4][8]; -#if defined(ENABLE_HARDENING) || defined(ENABLE_ASSERTIONS) -void validate_celt_decoder(CELTDecoder *st); -#define VALIDATE_CELT_DECODER(st) validate_celt_decoder(st) -#else -#define VALIDATE_CELT_DECODER(st) -#endif - int resampling_factor(opus_int32 rate); void celt_preemphasis(const opus_val16 * OPUS_RESTRICT pcmp, celt_sig * OPUS_RESTRICT inp, diff --git a/thirdparty/opus/celt/celt_decoder.c b/thirdparty/opus/celt/celt_decoder.c index e6efce9358..b978bb34d1 100644 --- a/thirdparty/opus/celt/celt_decoder.c +++ b/thirdparty/opus/celt/celt_decoder.c @@ -51,14 +51,6 @@ #include "celt_lpc.h" #include "vq.h" -/* The maximum pitch lag to allow in the pitch-based PLC. It's possible to save - CPU time in the PLC pitch search by making this smaller than MAX_PERIOD. The - current value corresponds to a pitch of 66.67 Hz. */ -#define PLC_PITCH_LAG_MAX (720) -/* The minimum pitch lag to allow in the pitch-based PLC. This corresponds to a - pitch of 480 Hz. */ -#define PLC_PITCH_LAG_MIN (100) - #if defined(SMALL_FOOTPRINT) && defined(FIXED_POINT) #define NORM_ALIASING_HACK #endif @@ -81,7 +73,6 @@ struct OpusCustomDecoder { int downsample; int start, end; int signalling; - int disable_inv; int arch; /* Everything beyond this point gets cleared on a reset */ @@ -109,38 +100,6 @@ struct OpusCustomDecoder { /* opus_val16 backgroundLogE[], Size = 2*mode->nbEBands */ }; -#if defined(ENABLE_HARDENING) || defined(ENABLE_ASSERTIONS) -/* Make basic checks on the CELT state to ensure we don't end - up writing all over memory. */ -void validate_celt_decoder(CELTDecoder *st) -{ -#ifndef CUSTOM_MODES - celt_assert(st->mode == opus_custom_mode_create(48000, 960, NULL)); - celt_assert(st->overlap == 120); -#endif - celt_assert(st->channels == 1 || st->channels == 2); - celt_assert(st->stream_channels == 1 || st->stream_channels == 2); - celt_assert(st->downsample > 0); - celt_assert(st->start == 0 || st->start == 17); - celt_assert(st->start < st->end); - celt_assert(st->end <= 21); -#ifdef OPUS_ARCHMASK - celt_assert(st->arch >= 0); - celt_assert(st->arch <= OPUS_ARCHMASK); -#endif - celt_assert(st->last_pitch_index <= PLC_PITCH_LAG_MAX); - celt_assert(st->last_pitch_index >= PLC_PITCH_LAG_MIN || st->last_pitch_index == 0); - celt_assert(st->postfilter_period < MAX_PERIOD); - celt_assert(st->postfilter_period >= COMBFILTER_MINPERIOD || st->postfilter_period == 0); - celt_assert(st->postfilter_period_old < MAX_PERIOD); - celt_assert(st->postfilter_period_old >= COMBFILTER_MINPERIOD || st->postfilter_period_old == 0); - celt_assert(st->postfilter_tapset <= 2); - celt_assert(st->postfilter_tapset >= 0); - celt_assert(st->postfilter_tapset_old <= 2); - celt_assert(st->postfilter_tapset_old >= 0); -} -#endif - int celt_decoder_get_size(int channels) { const CELTMode *mode = opus_custom_mode_create(48000, 960, NULL); @@ -204,11 +163,6 @@ OPUS_CUSTOM_NOSTATIC int opus_custom_decoder_init(CELTDecoder *st, const CELTMod st->start = 0; st->end = st->mode->effEBands; st->signalling = 1; -#ifndef DISABLE_UPDATE_DRAFT - st->disable_inv = channels == 1; -#else - st->disable_inv = 0; -#endif st->arch = opus_select_arch(); opus_custom_decoder_ctl(st, OPUS_RESET_STATE); @@ -223,36 +177,6 @@ void opus_custom_decoder_destroy(CELTDecoder *st) } #endif /* CUSTOM_MODES */ -#ifndef CUSTOM_MODES -/* Special case for stereo with no downsampling and no accumulation. This is - quite common and we can make it faster by processing both channels in the - same loop, reducing overhead due to the dependency loop in the IIR filter. */ -static void deemphasis_stereo_simple(celt_sig *in[], opus_val16 *pcm, int N, const opus_val16 coef0, - celt_sig *mem) -{ - celt_sig * OPUS_RESTRICT x0; - celt_sig * OPUS_RESTRICT x1; - celt_sig m0, m1; - int j; - x0=in[0]; - x1=in[1]; - m0 = mem[0]; - m1 = mem[1]; - for (j=0;j<N;j++) - { - celt_sig tmp0, tmp1; - /* Add VERY_SMALL to x[] first to reduce dependency chain. */ - tmp0 = x0[j] + VERY_SMALL + m0; - tmp1 = x1[j] + VERY_SMALL + m1; - m0 = MULT16_32_Q15(coef0, tmp0); - m1 = MULT16_32_Q15(coef0, tmp1); - pcm[2*j ] = SCALEOUT(SIG2WORD16(tmp0)); - pcm[2*j+1] = SCALEOUT(SIG2WORD16(tmp1)); - } - mem[0] = m0; - mem[1] = m1; -} -#endif #ifndef RESYNTH static @@ -266,14 +190,6 @@ void deemphasis(celt_sig *in[], opus_val16 *pcm, int N, int C, int downsample, c opus_val16 coef0; VARDECL(celt_sig, scratch); SAVE_STACK; -#ifndef CUSTOM_MODES - /* Short version for common case. */ - if (downsample == 1 && C == 2 && !accum) - { - deemphasis_stereo_simple(in, pcm, N, coef[0], mem); - return; - } -#endif #ifndef FIXED_POINT (void)accum; celt_assert(accum==0); @@ -309,7 +225,7 @@ void deemphasis(celt_sig *in[], opus_val16 *pcm, int N, int C, int downsample, c /* Shortcut for the standard (non-custom modes) case */ for (j=0;j<N;j++) { - celt_sig tmp = x[j] + VERY_SMALL + m; + celt_sig tmp = x[j] + m + VERY_SMALL; m = MULT16_32_Q15(coef0, tmp); scratch[j] = tmp; } @@ -330,7 +246,7 @@ void deemphasis(celt_sig *in[], opus_val16 *pcm, int N, int C, int downsample, c { for (j=0;j<N;j++) { - celt_sig tmp = x[j] + VERY_SMALL + m; + celt_sig tmp = x[j] + m + VERY_SMALL; m = MULT16_32_Q15(coef0, tmp); y[j*C] = SCALEOUT(SIG2WORD16(tmp)); } @@ -417,7 +333,7 @@ void celt_synthesis(const CELTMode *mode, celt_norm *X, celt_sig * out_syn[], denormalise_bands(mode, X+N, freq2, oldBandE+nbEBands, start, effEnd, M, downsample, silence); for (i=0;i<N;i++) - freq[i] = ADD32(HALF32(freq[i]), HALF32(freq2[i])); + freq[i] = HALF32(ADD32(freq[i],freq2[i])); for (b=0;b<B;b++) clt_mdct_backward(&mode->mdct, &freq[b], out_syn[0]+NB*b, mode->window, overlap, shift, B, arch); } else { @@ -429,12 +345,6 @@ void celt_synthesis(const CELTMode *mode, celt_norm *X, celt_sig * out_syn[], clt_mdct_backward(&mode->mdct, &freq[b], out_syn[c]+NB*b, mode->window, overlap, shift, B, arch); } while (++c<CC); } - /* Saturate IMDCT output so that we can't overflow in the pitch postfilter - or in the */ - c=0; do { - for (i=0;i<N;i++) - out_syn[c][i] = SATURATE(out_syn[c][i], SIG_SAT); - } while (++c<CC); RESTORE_STACK; } @@ -477,6 +387,14 @@ static void tf_decode(int start, int end, int isTransient, int *tf_res, int LM, } } +/* The maximum pitch lag to allow in the pitch-based PLC. It's possible to save + CPU time in the PLC pitch search by making this smaller than MAX_PERIOD. The + current value corresponds to a pitch of 66.67 Hz. */ +#define PLC_PITCH_LAG_MAX (720) +/* The minimum pitch lag to allow in the pitch-based PLC. This corresponds to a + pitch of 480 Hz. */ +#define PLC_PITCH_LAG_MIN (100) + static int celt_plc_pitch_search(celt_sig *decode_mem[2], int C, int arch) { int pitch_index; @@ -586,15 +504,12 @@ static void celt_decode_lost(CELTDecoder * OPUS_RESTRICT st, int N, int LM) celt_synthesis(mode, X, out_syn, oldBandE, start, effEnd, C, C, 0, LM, st->downsample, 0, st->arch); } else { - int exc_length; /* Pitch-based PLC */ const opus_val16 *window; - opus_val16 *exc; opus_val16 fade = Q15ONE; int pitch_index; VARDECL(opus_val32, etmp); - VARDECL(opus_val16, _exc); - VARDECL(opus_val16, fir_tmp); + VARDECL(opus_val16, exc); if (loss_count == 0) { @@ -604,14 +519,8 @@ static void celt_decode_lost(CELTDecoder * OPUS_RESTRICT st, int N, int LM) fade = QCONST16(.8f,15); } - /* We want the excitation for 2 pitch periods in order to look for a - decaying signal, but we can't get more than MAX_PERIOD. */ - exc_length = IMIN(2*pitch_index, MAX_PERIOD); - ALLOC(etmp, overlap, opus_val32); - ALLOC(_exc, MAX_PERIOD+LPC_ORDER, opus_val16); - ALLOC(fir_tmp, exc_length, opus_val16); - exc = _exc+LPC_ORDER; + ALLOC(exc, MAX_PERIOD, opus_val16); window = mode->window; c=0; do { opus_val16 decay; @@ -620,11 +529,13 @@ static void celt_decode_lost(CELTDecoder * OPUS_RESTRICT st, int N, int LM) celt_sig *buf; int extrapolation_offset; int extrapolation_len; + int exc_length; int j; buf = decode_mem[c]; - for (i=0;i<MAX_PERIOD+LPC_ORDER;i++) - exc[i-LPC_ORDER] = ROUND16(buf[DECODE_BUFFER_SIZE-MAX_PERIOD-LPC_ORDER+i], SIG_SHIFT); + for (i=0;i<MAX_PERIOD;i++) { + exc[i] = ROUND16(buf[DECODE_BUFFER_SIZE-MAX_PERIOD+i], SIG_SHIFT); + } if (loss_count == 0) { @@ -650,32 +561,22 @@ static void celt_decode_lost(CELTDecoder * OPUS_RESTRICT st, int N, int LM) #endif } _celt_lpc(lpc+c*LPC_ORDER, ac, LPC_ORDER); -#ifdef FIXED_POINT - /* For fixed-point, apply bandwidth expansion until we can guarantee that - no overflow can happen in the IIR filter. This means: - 32768*sum(abs(filter)) < 2^31 */ - while (1) { - opus_val16 tmp=Q15ONE; - opus_val32 sum=QCONST16(1., SIG_SHIFT); - for (i=0;i<LPC_ORDER;i++) - sum += ABS16(lpc[c*LPC_ORDER+i]); - if (sum < 65535) break; - for (i=0;i<LPC_ORDER;i++) - { - tmp = MULT16_16_Q15(QCONST16(.99f,15), tmp); - lpc[c*LPC_ORDER+i] = MULT16_16_Q15(lpc[c*LPC_ORDER+i], tmp); - } - } -#endif } + /* We want the excitation for 2 pitch periods in order to look for a + decaying signal, but we can't get more than MAX_PERIOD. */ + exc_length = IMIN(2*pitch_index, MAX_PERIOD); /* Initialize the LPC history with the samples just before the start of the region for which we're computing the excitation. */ { - /* Compute the excitation for exc_length samples before the loss. We need the copy - because celt_fir() cannot filter in-place. */ + opus_val16 lpc_mem[LPC_ORDER]; + for (i=0;i<LPC_ORDER;i++) + { + lpc_mem[i] = + ROUND16(buf[DECODE_BUFFER_SIZE-exc_length-1-i], SIG_SHIFT); + } + /* Compute the excitation for exc_length samples before the loss. */ celt_fir(exc+MAX_PERIOD-exc_length, lpc+c*LPC_ORDER, - fir_tmp, exc_length, LPC_ORDER, st->arch); - OPUS_COPY(exc+MAX_PERIOD-exc_length, fir_tmp, exc_length); + exc+MAX_PERIOD-exc_length, exc_length, LPC_ORDER, lpc_mem, st->arch); } /* Check if the waveform is decaying, and if so how fast. @@ -729,8 +630,9 @@ static void celt_decode_lost(CELTDecoder * OPUS_RESTRICT st, int N, int LM) tmp = ROUND16( buf[DECODE_BUFFER_SIZE-MAX_PERIOD-N+extrapolation_offset+j], SIG_SHIFT); - S1 += SHR32(MULT16_16(tmp, tmp), 10); + S1 += SHR32(MULT16_16(tmp, tmp), 8); } + { opus_val16 lpc_mem[LPC_ORDER]; /* Copy the last decoded samples (prior to the overlap region) to @@ -742,10 +644,6 @@ static void celt_decode_lost(CELTDecoder * OPUS_RESTRICT st, int N, int LM) celt_iir(buf+DECODE_BUFFER_SIZE-N, lpc+c*LPC_ORDER, buf+DECODE_BUFFER_SIZE-N, extrapolation_len, LPC_ORDER, lpc_mem, st->arch); -#ifdef FIXED_POINT - for (i=0; i < extrapolation_len; i++) - buf[DECODE_BUFFER_SIZE-N+i] = SATURATE(buf[DECODE_BUFFER_SIZE-N+i], SIG_SAT); -#endif } /* Check if the synthesis energy is higher than expected, which can @@ -756,7 +654,7 @@ static void celt_decode_lost(CELTDecoder * OPUS_RESTRICT st, int N, int LM) for (i=0;i<extrapolation_len;i++) { opus_val16 tmp = ROUND16(buf[DECODE_BUFFER_SIZE-N+i], SIG_SHIFT); - S2 += SHR32(MULT16_16(tmp, tmp), 10); + S2 += SHR32(MULT16_16(tmp, tmp), 8); } /* This checks for an "explosion" in the synthesis. */ #ifdef FIXED_POINT @@ -864,7 +762,6 @@ int celt_decode_with_ec(CELTDecoder * OPUS_RESTRICT st, const unsigned char *dat const opus_int16 *eBands; ALLOC_STACK; - VALIDATE_CELT_DECODER(st); mode = st->mode; nbEBands = mode->nbEBands; overlap = mode->overlap; @@ -1059,7 +956,7 @@ int celt_decode_with_ec(CELTDecoder * OPUS_RESTRICT st, const unsigned char *dat ALLOC(pulses, nbEBands, int); ALLOC(fine_priority, nbEBands, int); - codedBands = clt_compute_allocation(mode, start, end, offsets, cap, + codedBands = compute_allocation(mode, start, end, offsets, cap, alloc_trim, &intensity, &dual_stereo, bits, &balance, pulses, fine_quant, fine_priority, C, LM, dec, 0, 0, 0); @@ -1082,8 +979,7 @@ int celt_decode_with_ec(CELTDecoder * OPUS_RESTRICT st, const unsigned char *dat quant_all_bands(0, mode, start, end, X, C==2 ? X+N : NULL, collapse_masks, NULL, pulses, shortBlocks, spread_decision, dual_stereo, intensity, tf_res, - len*(8<<BITRES)-anti_collapse_rsv, balance, dec, LM, codedBands, &st->rng, 0, - st->arch, st->disable_inv); + len*(8<<BITRES)-anti_collapse_rsv, balance, dec, LM, codedBands, &st->rng, st->arch); if (anti_collapse_rsv > 0) { @@ -1338,26 +1234,6 @@ int opus_custom_decoder_ctl(CELTDecoder * OPUS_RESTRICT st, int request, ...) *value=st->rng; } break; - case OPUS_SET_PHASE_INVERSION_DISABLED_REQUEST: - { - opus_int32 value = va_arg(ap, opus_int32); - if(value<0 || value>1) - { - goto bad_arg; - } - st->disable_inv = value; - } - break; - case OPUS_GET_PHASE_INVERSION_DISABLED_REQUEST: - { - opus_int32 *value = va_arg(ap, opus_int32*); - if (!value) - { - goto bad_arg; - } - *value = st->disable_inv; - } - break; default: goto bad_request; } diff --git a/thirdparty/opus/celt/celt_encoder.c b/thirdparty/opus/celt/celt_encoder.c index 44cb0850ab..3ee7a4d3f7 100644 --- a/thirdparty/opus/celt/celt_encoder.c +++ b/thirdparty/opus/celt/celt_encoder.c @@ -73,8 +73,8 @@ struct OpusCustomEncoder { int constrained_vbr; /* If zero, VBR can do whatever it likes with the rate */ int loss_rate; int lsb_depth; + int variable_duration; int lfe; - int disable_inv; int arch; /* Everything beyond this point gets cleared on a reset */ @@ -98,7 +98,6 @@ struct OpusCustomEncoder { #endif int consec_transient; AnalysisInfo analysis; - SILKInfo silk_info; opus_val32 preemph_memE[2]; opus_val32 preemph_memD[2]; @@ -124,7 +123,6 @@ struct OpusCustomEncoder { /* opus_val16 oldBandE[], Size = channels*mode->nbEBands */ /* opus_val16 oldLogE[], Size = channels*mode->nbEBands */ /* opus_val16 oldLogE2[], Size = channels*mode->nbEBands */ - /* opus_val16 energyError[], Size = channels*mode->nbEBands */ }; int celt_encoder_get_size(int channels) @@ -138,10 +136,9 @@ OPUS_CUSTOM_NOSTATIC int opus_custom_encoder_get_size(const CELTMode *mode, int int size = sizeof(struct CELTEncoder) + (channels*mode->overlap-1)*sizeof(celt_sig) /* celt_sig in_mem[channels*mode->overlap]; */ + channels*COMBFILTER_MAXPERIOD*sizeof(celt_sig) /* celt_sig prefilter_mem[channels*COMBFILTER_MAXPERIOD]; */ - + 4*channels*mode->nbEBands*sizeof(opus_val16); /* opus_val16 oldBandE[channels*mode->nbEBands]; */ + + 3*channels*mode->nbEBands*sizeof(opus_val16); /* opus_val16 oldBandE[channels*mode->nbEBands]; */ /* opus_val16 oldLogE[channels*mode->nbEBands]; */ /* opus_val16 oldLogE2[channels*mode->nbEBands]; */ - /* opus_val16 energyError[channels*mode->nbEBands]; */ return size; } @@ -181,6 +178,7 @@ static int opus_custom_encoder_init_arch(CELTEncoder *st, const CELTMode *mode, st->start = 0; st->end = st->mode->effEBands; st->signalling = 1; + st->arch = arch; st->constrained_vbr = 1; @@ -225,8 +223,7 @@ void opus_custom_encoder_destroy(CELTEncoder *st) static int transient_analysis(const opus_val32 * OPUS_RESTRICT in, int len, int C, - opus_val16 *tf_estimate, int *tf_chan, int allow_weak_transients, - int *weak_transient) + opus_val16 *tf_estimate, int *tf_chan) { int i; VARDECL(opus_val16, tmp); @@ -236,12 +233,6 @@ static int transient_analysis(const opus_val32 * OPUS_RESTRICT in, int len, int int c; opus_val16 tf_max; int len2; - /* Forward masking: 6.7 dB/ms. */ -#ifdef FIXED_POINT - int forward_shift = 4; -#else - opus_val16 forward_decay = QCONST16(.0625f,15); -#endif /* Table of 6*64/x, trained on real data to minimize the average error */ static const unsigned char inv_table[128] = { 255,255,156,110, 86, 70, 59, 51, 45, 40, 37, 33, 31, 28, 26, 25, @@ -256,19 +247,6 @@ static int transient_analysis(const opus_val32 * OPUS_RESTRICT in, int len, int SAVE_STACK; ALLOC(tmp, len, opus_val16); - *weak_transient = 0; - /* For lower bitrates, let's be more conservative and have a forward masking - decay of 3.3 dB/ms. This avoids having to code transients at very low - bitrate (mostly for hybrid), which can result in unstable energy and/or - partial collapse. */ - if (allow_weak_transients) - { -#ifdef FIXED_POINT - forward_shift = 5; -#else - forward_decay = QCONST16(.03125f,15); -#endif - } len2=len/2; for (c=0;c<C;c++) { @@ -291,7 +269,7 @@ static int transient_analysis(const opus_val32 * OPUS_RESTRICT in, int len, int mem0 = mem1 + y - 2*x; mem1 = x - .5f*y; #endif - tmp[i] = SROUND16(y, 2); + tmp[i] = EXTRACT16(SHR32(y,2)); /*printf("%f ", tmp[i]);*/ } /*printf("\n");*/ @@ -302,7 +280,7 @@ static int transient_analysis(const opus_val32 * OPUS_RESTRICT in, int len, int /* Normalize tmp to max range */ { int shift=0; - shift = 14-celt_ilog2(MAX16(1, celt_maxabs16(tmp, len))); + shift = 14-celt_ilog2(1+celt_maxabs16(tmp, len)); if (shift!=0) { for (i=0;i<len;i++) @@ -321,9 +299,9 @@ static int transient_analysis(const opus_val32 * OPUS_RESTRICT in, int len, int mean += x2; #ifdef FIXED_POINT /* FIXME: Use PSHR16() instead */ - tmp[i] = mem0 + PSHR32(x2-mem0,forward_shift); + tmp[i] = mem0 + PSHR32(x2-mem0,4); #else - tmp[i] = mem0 + MULT16_16_P15(forward_decay,x2-mem0); + tmp[i] = mem0 + MULT16_16_P15(QCONST16(.0625f,15),x2-mem0); #endif mem0 = tmp[i]; } @@ -333,7 +311,6 @@ static int transient_analysis(const opus_val32 * OPUS_RESTRICT in, int len, int /* Backward pass to compute the pre-echo threshold */ for (i=len2-1;i>=0;i--) { - /* Backward masking: 13.9 dB/ms. */ #ifdef FIXED_POINT /* FIXME: Use PSHR16() instead */ tmp[i] = mem0 + PSHR32(tmp[i]-mem0,3); @@ -362,12 +339,6 @@ static int transient_analysis(const opus_val32 * OPUS_RESTRICT in, int len, int /* Compute harmonic mean discarding the unreliable boundaries The data is smooth, so we only take 1/4th of the samples */ unmask=0; - /* We should never see NaNs here. If we find any, then something really bad happened and we better abort - before it does any damage later on. If these asserts are disabled (no hardening), then the table - lookup a few lines below (id = ...) is likely to crash dur to an out-of-bounds read. DO NOT FIX - that crash on NaN since it could result in a worse issue later on. */ - celt_assert(!celt_isnan(tmp[0])); - celt_assert(!celt_isnan(norm)); for (i=12;i<len2-5;i+=4) { int id; @@ -388,12 +359,7 @@ static int transient_analysis(const opus_val32 * OPUS_RESTRICT in, int len, int } } is_transient = mask_metric>200; - /* For low bitrates, define "weak transients" that need to be - handled differently to avoid partial collapse. */ - if (allow_weak_transients && is_transient && mask_metric<600) { - is_transient = 0; - *weak_transient = 1; - } + /* Arbitrary metric for VBR boost */ tf_max = MAX16(0,celt_sqrt(27*mask_metric)-42); /* *tf_estimate = 1 + MIN16(1, sqrt(MAX16(0, tf_max-30))/20); */ @@ -583,7 +549,7 @@ static opus_val32 l1_metric(const celt_norm *tmp, int N, int LM, opus_val16 bias static int tf_analysis(const CELTMode *m, int len, int isTransient, int *tf_res, int lambda, celt_norm *X, int N0, int LM, - opus_val16 tf_estimate, int tf_chan, int *importance) + int *tf_sum, opus_val16 tf_estimate, int tf_chan) { int i; VARDECL(int, metric); @@ -608,6 +574,7 @@ static int tf_analysis(const CELTMode *m, int len, int isTransient, ALLOC(path0, len, int); ALLOC(path1, len, int); + *tf_sum = 0; for (i=0;i<len;i++) { int k, N; @@ -662,26 +629,27 @@ static int tf_analysis(const CELTMode *m, int len, int isTransient, metric[i] = 2*best_level; else metric[i] = -2*best_level; + *tf_sum += (isTransient ? LM : 0) - metric[i]/2; /* For bands that can't be split to -1, set the metric to the half-way point to avoid biasing the decision */ if (narrow && (metric[i]==0 || metric[i]==-2*LM)) metric[i]-=1; - /*printf("%d ", metric[i]/2 + (!isTransient)*LM);*/ + /*printf("%d ", metric[i]);*/ } /*printf("\n");*/ /* Search for the optimal tf resolution, including tf_select */ tf_select = 0; for (sel=0;sel<2;sel++) { - cost0 = importance[0]*abs(metric[0]-2*tf_select_table[LM][4*isTransient+2*sel+0]); - cost1 = importance[0]*abs(metric[0]-2*tf_select_table[LM][4*isTransient+2*sel+1]) + (isTransient ? 0 : lambda); + cost0 = 0; + cost1 = isTransient ? 0 : lambda; for (i=1;i<len;i++) { int curr0, curr1; curr0 = IMIN(cost0, cost1 + lambda); curr1 = IMIN(cost0 + lambda, cost1); - cost0 = curr0 + importance[i]*abs(metric[i]-2*tf_select_table[LM][4*isTransient+2*sel+0]); - cost1 = curr1 + importance[i]*abs(metric[i]-2*tf_select_table[LM][4*isTransient+2*sel+1]); + cost0 = curr0 + abs(metric[i]-2*tf_select_table[LM][4*isTransient+2*sel+0]); + cost1 = curr1 + abs(metric[i]-2*tf_select_table[LM][4*isTransient+2*sel+1]); } cost0 = IMIN(cost0, cost1); selcost[sel]=cost0; @@ -690,8 +658,8 @@ static int tf_analysis(const CELTMode *m, int len, int isTransient, * If tests confirm it's useful for non-transients, we could allow it. */ if (selcost[1]<selcost[0] && isTransient) tf_select=1; - cost0 = importance[0]*abs(metric[0]-2*tf_select_table[LM][4*isTransient+2*tf_select+0]); - cost1 = importance[0]*abs(metric[0]-2*tf_select_table[LM][4*isTransient+2*tf_select+1]) + (isTransient ? 0 : lambda); + cost0 = 0; + cost1 = isTransient ? 0 : lambda; /* Viterbi forward pass */ for (i=1;i<len;i++) { @@ -719,8 +687,8 @@ static int tf_analysis(const CELTMode *m, int len, int isTransient, curr1 = from1; path1[i]= 1; } - cost0 = curr0 + importance[i]*abs(metric[i]-2*tf_select_table[LM][4*isTransient+2*tf_select+0]); - cost1 = curr1 + importance[i]*abs(metric[i]-2*tf_select_table[LM][4*isTransient+2*tf_select+1]); + cost0 = curr0 + abs(metric[i]-2*tf_select_table[LM][4*isTransient+2*tf_select+0]); + cost1 = curr1 + abs(metric[i]-2*tf_select_table[LM][4*isTransient+2*tf_select+1]); } tf_res[len-1] = cost0 < cost1 ? 0 : 1; /* Viterbi backward pass to check the decisions */ @@ -786,7 +754,7 @@ static void tf_encode(int start, int end, int isTransient, int *tf_res, int LM, static int alloc_trim_analysis(const CELTMode *m, const celt_norm *X, const opus_val16 *bandLogE, int end, int LM, int C, int N0, AnalysisInfo *analysis, opus_val16 *stereo_saving, opus_val16 tf_estimate, - int intensity, opus_val16 surround_trim, opus_int32 equiv_rate, int arch) + int intensity, opus_val16 surround_trim, int arch) { int i; opus_val32 diff=0; @@ -794,14 +762,6 @@ static int alloc_trim_analysis(const CELTMode *m, const celt_norm *X, int trim_index; opus_val16 trim = QCONST16(5.f, 8); opus_val16 logXC, logXC2; - /* At low bitrate, reducing the trim seems to help. At higher bitrates, it's less - clear what's best, so we're keeping it as it was before, at least for now. */ - if (equiv_rate < 64000) { - trim = QCONST16(4.f, 8); - } else if (equiv_rate < 80000) { - opus_int32 frac = (equiv_rate-64000) >> 10; - trim = QCONST16(4.f, 8) + QCONST16(1.f/16.f, 8)*frac; - } if (C==2) { opus_val16 sum = 0; /* Q10 */ @@ -849,7 +809,7 @@ static int alloc_trim_analysis(const CELTMode *m, const celt_norm *X, } while (++c<C); diff /= C*(end-1); /*printf("%f\n", diff);*/ - trim -= MAX32(-QCONST16(2.f, 8), MIN32(QCONST16(2.f, 8), SHR32(diff+QCONST16(1.f, DB_SHIFT),DB_SHIFT-8)/6 )); + trim -= MAX16(-QCONST16(2.f, 8), MIN16(QCONST16(2.f, 8), SHR16(diff+QCONST16(1.f, DB_SHIFT),DB_SHIFT-8)/6 )); trim -= SHR16(surround_trim, DB_SHIFT-8); trim -= 2*SHR16(tf_estimate, 14-8); #ifndef DISABLE_FLOAT_API @@ -970,8 +930,7 @@ static opus_val16 median_of_3(const opus_val16 *x) static opus_val16 dynalloc_analysis(const opus_val16 *bandLogE, const opus_val16 *bandLogE2, int nbEBands, int start, int end, int C, int *offsets, int lsb_depth, const opus_int16 *logN, int isTransient, int vbr, int constrained_vbr, const opus_int16 *eBands, int LM, - int effectiveBytes, opus_int32 *tot_boost_, int lfe, opus_val16 *surround_dynalloc, - AnalysisInfo *analysis, int *importance, int *spread_weight) + int effectiveBytes, opus_int32 *tot_boost_, int lfe, opus_val16 *surround_dynalloc) { int i, c; opus_int32 tot_boost=0; @@ -997,42 +956,6 @@ static opus_val16 dynalloc_analysis(const opus_val16 *bandLogE, const opus_val16 for (i=0;i<end;i++) maxDepth = MAX16(maxDepth, bandLogE[c*nbEBands+i]-noise_floor[i]); } while (++c<C); - { - /* Compute a really simple masking model to avoid taking into account completely masked - bands when computing the spreading decision. */ - VARDECL(opus_val16, mask); - VARDECL(opus_val16, sig); - ALLOC(mask, nbEBands, opus_val16); - ALLOC(sig, nbEBands, opus_val16); - for (i=0;i<end;i++) - mask[i] = bandLogE[i]-noise_floor[i]; - if (C==2) - { - for (i=0;i<end;i++) - mask[i] = MAX16(mask[i], bandLogE[nbEBands+i]-noise_floor[i]); - } - OPUS_COPY(sig, mask, end); - for (i=1;i<end;i++) - mask[i] = MAX16(mask[i], mask[i-1] - QCONST16(2.f, DB_SHIFT)); - for (i=end-2;i>=0;i--) - mask[i] = MAX16(mask[i], mask[i+1] - QCONST16(3.f, DB_SHIFT)); - for (i=0;i<end;i++) - { - /* Compute SMR: Mask is never more than 72 dB below the peak and never below the noise floor.*/ - opus_val16 smr = sig[i]-MAX16(MAX16(0, maxDepth-QCONST16(12.f, DB_SHIFT)), mask[i]); - /* Clamp SMR to make sure we're not shifting by something negative or too large. */ -#ifdef FIXED_POINT - /* FIXME: Use PSHR16() instead */ - int shift = -PSHR32(MAX16(-QCONST16(5.f, DB_SHIFT), MIN16(0, smr)), DB_SHIFT); -#else - int shift = IMIN(5, IMAX(0, -(int)floor(.5f + smr))); -#endif - spread_weight[i] = 32 >> shift; - } - /*for (i=0;i<end;i++) - printf("%d ", spread_weight[i]); - printf("\n");*/ - } /* Make sure that dynamic allocation can't make us bust the budget */ if (effectiveBytes > 50 && LM>=1 && !lfe) { @@ -1089,14 +1012,6 @@ static opus_val16 dynalloc_analysis(const opus_val16 *bandLogE, const opus_val16 } for (i=start;i<end;i++) follower[i] = MAX16(follower[i], surround_dynalloc[i]); - for (i=start;i<end;i++) - { -#ifdef FIXED_POINT - importance[i] = PSHR32(13*celt_exp2(MIN16(follower[i], QCONST16(4.f, DB_SHIFT))), 16); -#else - importance[i] = (int)floor(.5f+13*celt_exp2(MIN16(follower[i], QCONST16(4.f, DB_SHIFT)))); -#endif - } /* For non-transient CBR/CVBR frames, halve the dynalloc contribution */ if ((!vbr || constrained_vbr)&&!isTransient) { @@ -1105,26 +1020,14 @@ static opus_val16 dynalloc_analysis(const opus_val16 *bandLogE, const opus_val16 } for (i=start;i<end;i++) { - if (i<8) - follower[i] *= 2; - if (i>=12) - follower[i] = HALF16(follower[i]); - } -#ifdef DISABLE_FLOAT_API - (void)analysis; -#else - if (analysis->valid) - { - for (i=start;i<IMIN(LEAK_BANDS, end);i++) - follower[i] = follower[i] + QCONST16(1.f/64.f, DB_SHIFT)*analysis->leak_boost[i]; - } -#endif - for (i=start;i<end;i++) - { int width; int boost; int boost_bits; + if (i<8) + follower[i] *= 2; + if (i>=12) + follower[i] = HALF16(follower[i]); follower[i] = MIN16(follower[i], QCONST16(4, DB_SHIFT)); width = C*(eBands[i+1]-eBands[i])<<LM; @@ -1139,11 +1042,11 @@ static opus_val16 dynalloc_analysis(const opus_val16 *bandLogE, const opus_val16 boost = (int)SHR32(EXTEND32(follower[i])*width/6,DB_SHIFT); boost_bits = boost*6<<BITRES; } - /* For CBR and non-transient CVBR frames, limit dynalloc to 2/3 of the bits */ + /* For CBR and non-transient CVBR frames, limit dynalloc to 1/4 of the bits */ if ((!vbr || (constrained_vbr&&!isTransient)) - && (tot_boost+boost_bits)>>BITRES>>3 > 2*effectiveBytes/3) + && (tot_boost+boost_bits)>>BITRES>>3 > effectiveBytes/4) { - opus_int32 cap = ((2*effectiveBytes/3)<<BITRES<<3); + opus_int32 cap = ((effectiveBytes/4)<<BITRES<<3); offsets[i] = cap-tot_boost; tot_boost = cap; break; @@ -1152,9 +1055,6 @@ static opus_val16 dynalloc_analysis(const opus_val16 *bandLogE, const opus_val16 tot_boost += boost_bits; } } - } else { - for (i=start;i<end;i++) - importance[i] = 13; } *tot_boost_ = tot_boost; RESTORE_STACK; @@ -1163,7 +1063,7 @@ static opus_val16 dynalloc_analysis(const opus_val16 *bandLogE, const opus_val16 static int run_prefilter(CELTEncoder *st, celt_sig *in, celt_sig *prefilter_mem, int CC, int N, - int prefilter_tapset, int *pitch, opus_val16 *gain, int *qgain, int enabled, int nbAvailableBytes, AnalysisInfo *analysis) + int prefilter_tapset, int *pitch, opus_val16 *gain, int *qgain, int enabled, int nbAvailableBytes) { int c; VARDECL(celt_sig, _pre); @@ -1219,12 +1119,7 @@ static int run_prefilter(CELTEncoder *st, celt_sig *in, celt_sig *prefilter_mem, gain1 = 0; pitch_index = COMBFILTER_MINPERIOD; } -#ifndef DISABLE_FLOAT_API - if (analysis->valid) - gain1 = (opus_val16)(gain1 * analysis->max_pitch_ratio); -#else - (void)analysis; -#endif + /* Gain threshold for enabling the prefilter/postfilter */ pf_threshold = QCONST16(.2f,15); @@ -1298,7 +1193,7 @@ static int compute_vbr(const CELTMode *mode, AnalysisInfo *analysis, opus_int32 int LM, opus_int32 bitrate, int lastCodedBands, int C, int intensity, int constrained_vbr, opus_val16 stereo_saving, int tot_boost, opus_val16 tf_estimate, int pitch_change, opus_val16 maxDepth, - int lfe, int has_surround_mask, opus_val16 surround_masking, + int variable_duration, int lfe, int has_surround_mask, opus_val16 surround_masking, opus_val16 temporal_vbr) { /* The target rate in 8th bits per frame */ @@ -1340,9 +1235,10 @@ static int compute_vbr(const CELTMode *mode, AnalysisInfo *analysis, opus_int32 SHR32(MULT16_16(stereo_saving-QCONST16(0.1f,8),(coded_stereo_dof<<BITRES)),8)); } /* Boost the rate according to dynalloc (minus the dynalloc average for calibration). */ - target += tot_boost-(19<<LM); + target += tot_boost-(16<<LM); /* Apply transient boost, compensating for average boost. */ - tf_calibration = QCONST16(0.044f,14); + tf_calibration = variable_duration==OPUS_FRAMESIZE_VARIABLE ? + QCONST16(0.02f,14) : QCONST16(0.04f,14); target += (opus_int32)SHL32(MULT16_32_Q15(tf_estimate-tf_calibration, target),1); #ifndef DISABLE_FLOAT_API @@ -1353,7 +1249,7 @@ static int compute_vbr(const CELTMode *mode, AnalysisInfo *analysis, opus_int32 float tonal; /* Tonality boost (compensating for the average). */ - tonal = MAX16(0.f,analysis->tonality-.15f)-0.12f; + tonal = MAX16(0.f,analysis->tonality-.15f)-0.09f; tonal_target = target + (opus_int32)((coded_bins<<BITRES)*1.2f*tonal); if (pitch_change) tonal_target += (opus_int32)((coded_bins<<BITRES)*.8f); @@ -1383,11 +1279,21 @@ static int compute_vbr(const CELTMode *mode, AnalysisInfo *analysis, opus_int32 /*printf("%f %d\n", maxDepth, floor_depth);*/ } - /* Make VBR less aggressive for constrained VBR because we can't keep a higher bitrate - for long. Needs tuning. */ - if ((!has_surround_mask||lfe) && constrained_vbr) + if ((!has_surround_mask||lfe) && (constrained_vbr || bitrate<64000)) { - target = base_target + (opus_int32)MULT16_32_Q15(QCONST16(0.67f, 15), target-base_target); + opus_val16 rate_factor = Q15ONE; + if (bitrate < 64000) + { +#ifdef FIXED_POINT + rate_factor = MAX16(0,(bitrate-32000)); +#else + rate_factor = MAX16(0,(1.f/32768)*(bitrate-32000)); +#endif + } + if (constrained_vbr) + rate_factor = MIN16(rate_factor, QCONST16(0.67f, 15)); + target = base_target + (opus_int32)MULT16_32_Q15(rate_factor, target-base_target); + } if (!has_surround_mask && tf_estimate < QCONST16(.2f, 14)) @@ -1421,13 +1327,11 @@ int celt_encode_with_ec(CELTEncoder * OPUS_RESTRICT st, const opus_val16 * pcm, VARDECL(int, pulses); VARDECL(int, cap); VARDECL(int, offsets); - VARDECL(int, importance); - VARDECL(int, spread_weight); VARDECL(int, fine_priority); VARDECL(int, tf_res); VARDECL(unsigned char, collapse_masks); celt_sig *prefilter_mem; - opus_val16 *oldBandE, *oldLogE, *oldLogE2, *energyError; + opus_val16 *oldBandE, *oldLogE, *oldLogE2; int shortBlocks=0; int isTransient=0; const int CC = st->channels; @@ -1439,6 +1343,7 @@ int celt_encode_with_ec(CELTEncoder * OPUS_RESTRICT st, const opus_val16 * pcm, int end; int effEnd; int codedBands; + int tf_sum; int alloc_trim; int pitch_index=COMBFILTER_MINPERIOD; opus_val16 gain1 = 0; @@ -1450,7 +1355,6 @@ int celt_encode_with_ec(CELTEncoder * OPUS_RESTRICT st, const opus_val16 * pcm, opus_int32 total_boost; opus_int32 balance; opus_int32 tell; - opus_int32 tell0_frac; int prefilter_tapset=0; int pf_on; int anti_collapse_rsv; @@ -1472,10 +1376,7 @@ int celt_encode_with_ec(CELTEncoder * OPUS_RESTRICT st, const opus_val16 * pcm, opus_val16 surround_masking=0; opus_val16 temporal_vbr=0; opus_val16 surround_trim = 0; - opus_int32 equiv_rate; - int hybrid; - int weak_transient = 0; - int enable_tf_analysis; + opus_int32 equiv_rate = 510000; VARDECL(opus_val16, surround_dynalloc); ALLOC_STACK; @@ -1485,7 +1386,6 @@ int celt_encode_with_ec(CELTEncoder * OPUS_RESTRICT st, const opus_val16 * pcm, eBands = mode->eBands; start = st->start; end = st->end; - hybrid = start != 0; tf_estimate = 0; if (nbCompressedBytes<2 || pcm==NULL) { @@ -1509,14 +1409,12 @@ int celt_encode_with_ec(CELTEncoder * OPUS_RESTRICT st, const opus_val16 * pcm, oldBandE = (opus_val16*)(st->in_mem+CC*(overlap+COMBFILTER_MAXPERIOD)); oldLogE = oldBandE + CC*nbEBands; oldLogE2 = oldLogE + CC*nbEBands; - energyError = oldLogE2 + CC*nbEBands; if (enc==NULL) { - tell0_frac=tell=1; + tell=1; nbFilledBytes=0; } else { - tell0_frac=ec_tell_frac(enc); tell=ec_tell(enc); nbFilledBytes=(tell+4)>>3; } @@ -1569,11 +1467,10 @@ int celt_encode_with_ec(CELTEncoder * OPUS_RESTRICT st, const opus_val16 * pcm, if (st->bitrate!=OPUS_BITRATE_MAX) nbCompressedBytes = IMAX(2, IMIN(nbCompressedBytes, (tmp+4*mode->Fs)/(8*mode->Fs)-!!st->signalling)); - effectiveBytes = nbCompressedBytes - nbFilledBytes; + effectiveBytes = nbCompressedBytes; } - equiv_rate = ((opus_int32)nbCompressedBytes*8*50 >> (3-LM)) - (40*C+20)*((400>>LM) - 50); if (st->bitrate != OPUS_BITRATE_MAX) - equiv_rate = IMIN(equiv_rate, st->bitrate - (40*C+20)*((400>>LM) - 50)); + equiv_rate = st->bitrate - (40*C+20)*((400>>LM) - 50); if (enc==NULL) { @@ -1661,17 +1558,17 @@ int celt_encode_with_ec(CELTEncoder * OPUS_RESTRICT st, const opus_val16 * pcm, { int enabled; int qg; - enabled = ((st->lfe&&nbAvailableBytes>3) || nbAvailableBytes>12*C) && !hybrid && !silence && !st->disable_pf - && st->complexity >= 5; + enabled = ((st->lfe&&nbAvailableBytes>3) || nbAvailableBytes>12*C) && start==0 && !silence && !st->disable_pf + && st->complexity >= 5 && !(st->consec_transient && LM!=3 && st->variable_duration==OPUS_FRAMESIZE_VARIABLE); prefilter_tapset = st->tapset_decision; - pf_on = run_prefilter(st, in, prefilter_mem, CC, N, prefilter_tapset, &pitch_index, &gain1, &qg, enabled, nbAvailableBytes, &st->analysis); + pf_on = run_prefilter(st, in, prefilter_mem, CC, N, prefilter_tapset, &pitch_index, &gain1, &qg, enabled, nbAvailableBytes); if ((gain1 > QCONST16(.4f,15) || st->prefilter_gain > QCONST16(.4f,15)) && (!st->analysis.valid || st->analysis.tonality > .3) && (pitch_index > 1.26*st->prefilter_period || pitch_index < .79*st->prefilter_period)) pitch_change = 1; if (pf_on==0) { - if(!hybrid && tell+16<=total_bits) + if(start==0 && tell+16<=total_bits) ec_enc_bit_logp(enc, 0, 1); } else { /*This block is not gated by a total bits check only because @@ -1692,12 +1589,8 @@ int celt_encode_with_ec(CELTEncoder * OPUS_RESTRICT st, const opus_val16 * pcm, shortBlocks = 0; if (st->complexity >= 1 && !st->lfe) { - /* Reduces the likelihood of energy instability on fricatives at low bitrate - in hybrid mode. It seems like we still want to have real transients on vowels - though (small SILK quantization offset value). */ - int allow_weak_transients = hybrid && effectiveBytes<15 && st->silk_info.signalType != 2; isTransient = transient_analysis(in, N+overlap, CC, - &tf_estimate, &tf_chan, allow_weak_transients, &weak_transient); + &tf_estimate, &tf_chan); } if (LM>0 && ec_tell(enc)+3<=total_bits) { @@ -1717,19 +1610,16 @@ int celt_encode_with_ec(CELTEncoder * OPUS_RESTRICT st, const opus_val16 * pcm, if (secondMdct) { compute_mdcts(mode, 0, in, freq, C, CC, LM, st->upsample, st->arch); - compute_band_energies(mode, freq, bandE, effEnd, C, LM, st->arch); + compute_band_energies(mode, freq, bandE, effEnd, C, LM); amp2Log2(mode, effEnd, end, bandE, bandLogE2, C); for (i=0;i<C*nbEBands;i++) bandLogE2[i] += HALF16(SHL16(LM, DB_SHIFT)); } compute_mdcts(mode, shortBlocks, in, freq, C, CC, LM, st->upsample, st->arch); - /* This should catch any NaN in the CELT input. Since we're not supposed to see any (they're filtered - at the Opus layer), just abort. */ - celt_assert(!celt_isnan(freq[0]) && (C==1 || !celt_isnan(freq[N]))); if (CC==2&&C==1) tf_chan = 0; - compute_band_energies(mode, freq, bandE, effEnd, C, LM, st->arch); + compute_band_energies(mode, freq, bandE, effEnd, C, LM); if (st->lfe) { @@ -1744,7 +1634,7 @@ int celt_encode_with_ec(CELTEncoder * OPUS_RESTRICT st, const opus_val16 * pcm, ALLOC(surround_dynalloc, C*nbEBands, opus_val16); OPUS_CLEAR(surround_dynalloc, end); /* This computes how much masking takes place between surround channels */ - if (!hybrid&&st->energy_mask&&!st->lfe) + if (start==0&&st->energy_mask&&!st->lfe) { int mask_end; int midband; @@ -1846,14 +1736,14 @@ int celt_encode_with_ec(CELTEncoder * OPUS_RESTRICT st, const opus_val16 * pcm, /* Last chance to catch any transient we might have missed in the time-domain analysis */ - if (LM>0 && ec_tell(enc)+3<=total_bits && !isTransient && st->complexity>=5 && !st->lfe && !hybrid) + if (LM>0 && ec_tell(enc)+3<=total_bits && !isTransient && st->complexity>=5 && !st->lfe) { if (patch_transient_decision(bandLogE, oldBandE, nbEBands, start, end, C)) { isTransient = 1; shortBlocks = M; compute_mdcts(mode, shortBlocks, in, freq, C, CC, LM, st->upsample, st->arch); - compute_band_energies(mode, freq, bandE, effEnd, C, LM, st->arch); + compute_band_energies(mode, freq, bandE, effEnd, C, LM); amp2Log2(mode, effEnd, end, bandE, bandLogE, C); /* Compensate for the scaling of short vs long mdcts */ for (i=0;i<C*nbEBands;i++) @@ -1870,59 +1760,31 @@ int celt_encode_with_ec(CELTEncoder * OPUS_RESTRICT st, const opus_val16 * pcm, /* Band normalisation */ normalise_bands(mode, freq, X, bandE, effEnd, C, M); - enable_tf_analysis = effectiveBytes>=15*C && !hybrid && st->complexity>=2 && !st->lfe; - - ALLOC(offsets, nbEBands, int); - ALLOC(importance, nbEBands, int); - ALLOC(spread_weight, nbEBands, int); - - maxDepth = dynalloc_analysis(bandLogE, bandLogE2, nbEBands, start, end, C, offsets, - st->lsb_depth, mode->logN, isTransient, st->vbr, st->constrained_vbr, - eBands, LM, effectiveBytes, &tot_boost, st->lfe, surround_dynalloc, &st->analysis, importance, spread_weight); - ALLOC(tf_res, nbEBands, int); /* Disable variable tf resolution for hybrid and at very low bitrate */ - if (enable_tf_analysis) + if (effectiveBytes>=15*C && start==0 && st->complexity>=2 && !st->lfe) { int lambda; - lambda = IMAX(80, 20480/effectiveBytes + 2); - tf_select = tf_analysis(mode, effEnd, isTransient, tf_res, lambda, X, N, LM, tf_estimate, tf_chan, importance); + if (effectiveBytes<40) + lambda = 12; + else if (effectiveBytes<60) + lambda = 6; + else if (effectiveBytes<100) + lambda = 4; + else + lambda = 3; + lambda*=2; + tf_select = tf_analysis(mode, effEnd, isTransient, tf_res, lambda, X, N, LM, &tf_sum, tf_estimate, tf_chan); for (i=effEnd;i<end;i++) tf_res[i] = tf_res[effEnd-1]; - } else if (hybrid && weak_transient) - { - /* For weak transients, we rely on the fact that improving time resolution using - TF on a long window is imperfect and will not result in an energy collapse at - low bitrate. */ - for (i=0;i<end;i++) - tf_res[i] = 1; - tf_select=0; - } else if (hybrid && effectiveBytes<15 && st->silk_info.signalType != 2) - { - /* For low bitrate hybrid, we force temporal resolution to 5 ms rather than 2.5 ms. */ - for (i=0;i<end;i++) - tf_res[i] = 0; - tf_select=isTransient; } else { + tf_sum = 0; for (i=0;i<end;i++) tf_res[i] = isTransient; tf_select=0; } ALLOC(error, C*nbEBands, opus_val16); - c=0; - do { - for (i=start;i<end;i++) - { - /* When the energy is stable, slightly bias energy quantization towards - the previous error to make the gain more stable (a constant offset is - better than fluctuations). */ - if (ABS32(SUB32(bandLogE[i+c*nbEBands], oldBandE[i+c*nbEBands])) < QCONST16(2.f, DB_SHIFT)) - { - bandLogE[i+c*nbEBands] -= MULT16_16_Q15(energyError[i+c*nbEBands], QCONST16(0.25f, 15)); - } - } - } while (++c < C); quant_coarse_energy(mode, start, end, effEnd, bandLogE, oldBandE, total_bits, error, enc, C, LM, nbAvailableBytes, st->force_intra, @@ -1936,15 +1798,7 @@ int celt_encode_with_ec(CELTEncoder * OPUS_RESTRICT st, const opus_val16 * pcm, { st->tapset_decision = 0; st->spread_decision = SPREAD_NORMAL; - } else if (hybrid) - { - if (st->complexity == 0) - st->spread_decision = SPREAD_NONE; - else if (isTransient) - st->spread_decision = SPREAD_NORMAL; - else - st->spread_decision = SPREAD_AGGRESSIVE; - } else if (shortBlocks || st->complexity < 3 || nbAvailableBytes < 10*C) + } else if (shortBlocks || st->complexity < 3 || nbAvailableBytes < 10*C || start != 0) { if (st->complexity == 0) st->spread_decision = SPREAD_NONE; @@ -1968,7 +1822,7 @@ int celt_encode_with_ec(CELTEncoder * OPUS_RESTRICT st, const opus_val16 * pcm, { st->spread_decision = spreading_decision(mode, X, &st->tonal_average, st->spread_decision, &st->hf_average, - &st->tapset_decision, pf_on&&!shortBlocks, effEnd, C, M, spread_weight); + &st->tapset_decision, pf_on&&!shortBlocks, effEnd, C, M); } /*printf("%d %d\n", st->tapset_decision, st->spread_decision);*/ /*printf("%f %d %f %d\n\n", st->analysis.tonality, st->spread_decision, st->analysis.tonality_slope, st->tapset_decision);*/ @@ -1976,6 +1830,11 @@ int celt_encode_with_ec(CELTEncoder * OPUS_RESTRICT st, const opus_val16 * pcm, ec_enc_icdf(enc, st->spread_decision, spread_icdf, 5); } + ALLOC(offsets, nbEBands, int); + + maxDepth = dynalloc_analysis(bandLogE, bandLogE2, nbEBands, start, end, C, offsets, + st->lsb_depth, mode->logN, isTransient, st->vbr, st->constrained_vbr, + eBands, LM, effectiveBytes, &tot_boost, st->lfe, surround_dynalloc); /* For LFE, everything interesting is in the first band */ if (st->lfe) offsets[0] = IMIN(8, effectiveBytes/3); @@ -2037,15 +1896,12 @@ int celt_encode_with_ec(CELTEncoder * OPUS_RESTRICT st, const opus_val16 * pcm, alloc_trim = 5; if (tell+(6<<BITRES) <= total_bits - total_boost) { - if (start > 0 || st->lfe) - { - st->stereo_saving = 0; + if (st->lfe) alloc_trim = 5; - } else { + else alloc_trim = alloc_trim_analysis(mode, X, bandLogE, end, LM, C, N, &st->analysis, &st->stereo_saving, tf_estimate, - st->intensity, surround_trim, equiv_rate, st->arch); - } + st->intensity, surround_trim, st->arch); ec_enc_icdf(enc, alloc_trim, trim_icdf, 7); tell = ec_tell_frac(enc); } @@ -2063,36 +1919,17 @@ int celt_encode_with_ec(CELTEncoder * OPUS_RESTRICT st, const opus_val16 * pcm, /* Don't attempt to use more than 510 kb/s, even for frames smaller than 20 ms. The CELT allocator will just not be able to use more than that anyway. */ nbCompressedBytes = IMIN(nbCompressedBytes,1275>>(3-LM)); - if (!hybrid) - { - base_target = vbr_rate - ((40*C+20)<<BITRES); - } else { - base_target = IMAX(0, vbr_rate - ((9*C+4)<<BITRES)); - } + base_target = vbr_rate - ((40*C+20)<<BITRES); if (st->constrained_vbr) base_target += (st->vbr_offset>>lm_diff); - if (!hybrid) - { - target = compute_vbr(mode, &st->analysis, base_target, LM, equiv_rate, + target = compute_vbr(mode, &st->analysis, base_target, LM, equiv_rate, st->lastCodedBands, C, st->intensity, st->constrained_vbr, st->stereo_saving, tot_boost, tf_estimate, pitch_change, maxDepth, - st->lfe, st->energy_mask!=NULL, surround_masking, + st->variable_duration, st->lfe, st->energy_mask!=NULL, surround_masking, temporal_vbr); - } else { - target = base_target; - /* Tonal frames (offset<100) need more bits than noisy (offset>100) ones. */ - if (st->silk_info.offset < 100) target += 12 << BITRES >> (3-LM); - if (st->silk_info.offset > 100) target -= 18 << BITRES >> (3-LM); - /* Boosting bitrate on transients and vowels with significant temporal - spikes. */ - target += (opus_int32)MULT16_16_Q14(tf_estimate-QCONST16(.25f,14), (50<<BITRES)); - /* If we have a strong transient, let's make sure it has enough bits to code - the first two bands, so that it can use folding rather than noise. */ - if (tf_estimate > QCONST16(.7f,14)) - target = IMAX(target, 50<<BITRES); - } + /* The current offset is removed from the target and the space used so far is added*/ target=target+tell; @@ -2100,16 +1937,11 @@ int celt_encode_with_ec(CELTEncoder * OPUS_RESTRICT st, const opus_val16 * pcm, result in the encoder running out of bits. The margin of 2 bytes ensures that none of the bust-prevention logic in the decoder will have triggered so far. */ - min_allowed = ((tell+total_boost+(1<<(BITRES+3))-1)>>(BITRES+3)) + 2; - /* Take into account the 37 bits we need to have left in the packet to - signal a redundant frame in hybrid mode. Creating a shorter packet would - create an entropy coder desync. */ - if (hybrid) - min_allowed = IMAX(min_allowed, (tell0_frac+(37<<BITRES)+total_boost+(1<<(BITRES+3))-1)>>(BITRES+3)); + min_allowed = ((tell+total_boost+(1<<(BITRES+3))-1)>>(BITRES+3)) + 2 - nbFilledBytes; nbAvailableBytes = (target+(1<<(BITRES+2)))>>(BITRES+3); nbAvailableBytes = IMAX(min_allowed,nbAvailableBytes); - nbAvailableBytes = IMIN(nbCompressedBytes,nbAvailableBytes); + nbAvailableBytes = IMIN(nbCompressedBytes,nbAvailableBytes+nbFilledBytes) - nbFilledBytes; /* By how much did we "miss" the target on that frame */ delta = target - vbr_rate; @@ -2156,7 +1988,7 @@ int celt_encode_with_ec(CELTEncoder * OPUS_RESTRICT st, const opus_val16 * pcm, st->vbr_reservoir = 0; /*printf ("+%d\n", adjust);*/ } - nbCompressedBytes = IMIN(nbCompressedBytes,nbAvailableBytes); + nbCompressedBytes = IMIN(nbCompressedBytes,nbAvailableBytes+nbFilledBytes); /*printf("%d\n", nbCompressedBytes*50*8);*/ /* This moves the raw bits to take into account the new compressed size */ ec_enc_shrink(enc, nbCompressedBytes); @@ -2191,7 +2023,7 @@ int celt_encode_with_ec(CELTEncoder * OPUS_RESTRICT st, const opus_val16 * pcm, #endif if (st->lfe) signalBandwidth = 1; - codedBands = clt_compute_allocation(mode, start, end, offsets, cap, + codedBands = compute_allocation(mode, start, end, offsets, cap, alloc_trim, &st->intensity, &dual_stereo, bits, &balance, pulses, fine_quant, fine_priority, C, LM, enc, 1, st->lastCodedBands, signalBandwidth); if (st->lastCodedBands) @@ -2206,7 +2038,7 @@ int celt_encode_with_ec(CELTEncoder * OPUS_RESTRICT st, const opus_val16 * pcm, quant_all_bands(1, mode, start, end, X, C==2 ? X+N : NULL, collapse_masks, bandE, pulses, shortBlocks, st->spread_decision, dual_stereo, st->intensity, tf_res, nbCompressedBytes*(8<<BITRES)-anti_collapse_rsv, - balance, enc, LM, codedBands, &st->rng, st->complexity, st->arch, st->disable_inv); + balance, enc, LM, codedBands, &st->rng, st->arch); if (anti_collapse_rsv > 0) { @@ -2217,14 +2049,6 @@ int celt_encode_with_ec(CELTEncoder * OPUS_RESTRICT st, const opus_val16 * pcm, ec_enc_bits(enc, anti_collapse_on, 1); } quant_energy_finalise(mode, start, end, oldBandE, error, fine_quant, fine_priority, nbCompressedBytes*8-ec_tell(enc), enc, C); - OPUS_CLEAR(energyError, nbEBands*CC); - c=0; - do { - for (i=start;i<end;i++) - { - energyError[i+c*nbEBands] = MAX16(-QCONST16(0.5f, 15), MIN16(QCONST16(0.5f, 15), error[i+c*nbEBands])); - } - } while (++c < C); if (silence) { @@ -2497,24 +2321,10 @@ int opus_custom_encoder_ctl(CELTEncoder * OPUS_RESTRICT st, int request, ...) *value=st->lsb_depth; } break; - case OPUS_SET_PHASE_INVERSION_DISABLED_REQUEST: + case OPUS_SET_EXPERT_FRAME_DURATION_REQUEST: { opus_int32 value = va_arg(ap, opus_int32); - if(value<0 || value>1) - { - goto bad_arg; - } - st->disable_inv = value; - } - break; - case OPUS_GET_PHASE_INVERSION_DISABLED_REQUEST: - { - opus_int32 *value = va_arg(ap, opus_int32*); - if (!value) - { - goto bad_arg; - } - *value = st->disable_inv; + st->variable_duration = value; } break; case OPUS_RESET_STATE: @@ -2558,13 +2368,6 @@ int opus_custom_encoder_ctl(CELTEncoder * OPUS_RESTRICT st, int request, ...) OPUS_COPY(&st->analysis, info, 1); } break; - case CELT_SET_SILK_INFO_REQUEST: - { - SILKInfo *info = va_arg(ap, SILKInfo *); - if (info) - OPUS_COPY(&st->silk_info, info, 1); - } - break; case CELT_GET_MODE_REQUEST: { const CELTMode ** value = va_arg(ap, const CELTMode**); diff --git a/thirdparty/opus/celt/celt_lpc.c b/thirdparty/opus/celt/celt_lpc.c index 8ecb693ee9..b410a21c5f 100644 --- a/thirdparty/opus/celt/celt_lpc.c +++ b/thirdparty/opus/celt/celt_lpc.c @@ -89,40 +89,58 @@ int p void celt_fir_c( - const opus_val16 *x, + const opus_val16 *_x, const opus_val16 *num, - opus_val16 *y, + opus_val16 *_y, int N, int ord, + opus_val16 *mem, int arch) { int i,j; VARDECL(opus_val16, rnum); + VARDECL(opus_val16, x); SAVE_STACK; - celt_assert(x != y); + ALLOC(rnum, ord, opus_val16); + ALLOC(x, N+ord, opus_val16); for(i=0;i<ord;i++) rnum[i] = num[ord-i-1]; + for(i=0;i<ord;i++) + x[i] = mem[ord-i-1]; + for (i=0;i<N;i++) + x[i+ord]=_x[i]; + for(i=0;i<ord;i++) + mem[i] = _x[N-i-1]; +#ifdef SMALL_FOOTPRINT + (void)arch; + for (i=0;i<N;i++) + { + opus_val32 sum = SHL32(EXTEND32(_x[i]), SIG_SHIFT); + for (j=0;j<ord;j++) + { + sum = MAC16_16(sum,rnum[j],x[i+j]); + } + _y[i] = SATURATE16(PSHR32(sum, SIG_SHIFT)); + } +#else for (i=0;i<N-3;i+=4) { - opus_val32 sum[4]; - sum[0] = SHL32(EXTEND32(x[i ]), SIG_SHIFT); - sum[1] = SHL32(EXTEND32(x[i+1]), SIG_SHIFT); - sum[2] = SHL32(EXTEND32(x[i+2]), SIG_SHIFT); - sum[3] = SHL32(EXTEND32(x[i+3]), SIG_SHIFT); - xcorr_kernel(rnum, x+i-ord, sum, ord, arch); - y[i ] = ROUND16(sum[0], SIG_SHIFT); - y[i+1] = ROUND16(sum[1], SIG_SHIFT); - y[i+2] = ROUND16(sum[2], SIG_SHIFT); - y[i+3] = ROUND16(sum[3], SIG_SHIFT); + opus_val32 sum[4]={0,0,0,0}; + xcorr_kernel(rnum, x+i, sum, ord, arch); + _y[i ] = SATURATE16(ADD32(EXTEND32(_x[i ]), PSHR32(sum[0], SIG_SHIFT))); + _y[i+1] = SATURATE16(ADD32(EXTEND32(_x[i+1]), PSHR32(sum[1], SIG_SHIFT))); + _y[i+2] = SATURATE16(ADD32(EXTEND32(_x[i+2]), PSHR32(sum[2], SIG_SHIFT))); + _y[i+3] = SATURATE16(ADD32(EXTEND32(_x[i+3]), PSHR32(sum[3], SIG_SHIFT))); } for (;i<N;i++) { - opus_val32 sum = SHL32(EXTEND32(x[i]), SIG_SHIFT); + opus_val32 sum = 0; for (j=0;j<ord;j++) - sum = MAC16_16(sum,rnum[j],x[i+j-ord]); - y[i] = ROUND16(sum, SIG_SHIFT); + sum = MAC16_16(sum,rnum[j],x[i+j]); + _y[i] = SATURATE16(ADD32(EXTEND32(_x[i]), PSHR32(sum, SIG_SHIFT))); } +#endif RESTORE_STACK; } @@ -148,7 +166,7 @@ void celt_iir(const opus_val32 *_x, { mem[j]=mem[j-1]; } - mem[0] = SROUND16(sum, SIG_SHIFT); + mem[0] = ROUND16(sum,SIG_SHIFT); _y[i] = sum; } #else @@ -177,20 +195,20 @@ void celt_iir(const opus_val32 *_x, xcorr_kernel(rden, y+i, sum, ord, arch); /* Patch up the result to compensate for the fact that this is an IIR */ - y[i+ord ] = -SROUND16(sum[0],SIG_SHIFT); + y[i+ord ] = -ROUND16(sum[0],SIG_SHIFT); _y[i ] = sum[0]; sum[1] = MAC16_16(sum[1], y[i+ord ], den[0]); - y[i+ord+1] = -SROUND16(sum[1],SIG_SHIFT); + y[i+ord+1] = -ROUND16(sum[1],SIG_SHIFT); _y[i+1] = sum[1]; sum[2] = MAC16_16(sum[2], y[i+ord+1], den[0]); sum[2] = MAC16_16(sum[2], y[i+ord ], den[1]); - y[i+ord+2] = -SROUND16(sum[2],SIG_SHIFT); + y[i+ord+2] = -ROUND16(sum[2],SIG_SHIFT); _y[i+2] = sum[2]; sum[3] = MAC16_16(sum[3], y[i+ord+2], den[0]); sum[3] = MAC16_16(sum[3], y[i+ord+1], den[1]); sum[3] = MAC16_16(sum[3], y[i+ord ], den[2]); - y[i+ord+3] = -SROUND16(sum[3],SIG_SHIFT); + y[i+ord+3] = -ROUND16(sum[3],SIG_SHIFT); _y[i+3] = sum[3]; } for (;i<N;i++) @@ -198,7 +216,7 @@ void celt_iir(const opus_val32 *_x, opus_val32 sum = _x[i]; for (j=0;j<ord;j++) sum -= MULT16_16(rden[j],y[i+j]); - y[i+ord] = SROUND16(sum,SIG_SHIFT); + y[i+ord] = ROUND16(sum,SIG_SHIFT); _y[i] = sum; } for(i=0;i<ord;i++) diff --git a/thirdparty/opus/celt/celt_lpc.h b/thirdparty/opus/celt/celt_lpc.h index a4c5fd6ea5..323459eb1a 100644 --- a/thirdparty/opus/celt/celt_lpc.h +++ b/thirdparty/opus/celt/celt_lpc.h @@ -45,11 +45,12 @@ void celt_fir_c( opus_val16 *y, int N, int ord, + opus_val16 *mem, int arch); #if !defined(OVERRIDE_CELT_FIR) -#define celt_fir(x, num, y, N, ord, arch) \ - (celt_fir_c(x, num, y, N, ord, arch)) +#define celt_fir(x, num, y, N, ord, mem, arch) \ + (celt_fir_c(x, num, y, N, ord, mem, arch)) #endif void celt_iir(const opus_val32 *x, diff --git a/thirdparty/opus/celt/cwrs.c b/thirdparty/opus/celt/cwrs.c index a552e4f0fb..9722f0ac86 100644 --- a/thirdparty/opus/celt/cwrs.c +++ b/thirdparty/opus/celt/cwrs.c @@ -482,7 +482,7 @@ static opus_val32 cwrsi(int _n,int _k,opus_uint32 _i,int *_y){ k0=_k; q=row[_n]; if(q>_i){ - celt_sig_assert(p>q); + celt_assert(p>q); _k=_n; do p=CELT_PVQ_U_ROW[--_k][_n]; while(p>_i); diff --git a/thirdparty/opus/celt/entcode.h b/thirdparty/opus/celt/entcode.h index 3763e3f284..13d6c84ef0 100644 --- a/thirdparty/opus/celt/entcode.h +++ b/thirdparty/opus/celt/entcode.h @@ -122,7 +122,7 @@ opus_uint32 ec_tell_frac(ec_ctx *_this); /* Tested exhaustively for all n and for 1<=d<=256 */ static OPUS_INLINE opus_uint32 celt_udiv(opus_uint32 n, opus_uint32 d) { - celt_sig_assert(d>0); + celt_assert(d>0); #ifdef USE_SMALL_DIV_TABLE if (d>256) return n/d; @@ -138,7 +138,7 @@ static OPUS_INLINE opus_uint32 celt_udiv(opus_uint32 n, opus_uint32 d) { } static OPUS_INLINE opus_int32 celt_sudiv(opus_int32 n, opus_int32 d) { - celt_sig_assert(d>0); + celt_assert(d>0); #ifdef USE_SMALL_DIV_TABLE if (n<0) return -(opus_int32)celt_udiv(-n, d); diff --git a/thirdparty/opus/celt/entdec.h b/thirdparty/opus/celt/entdec.h index 025fc1870d..d8ab318730 100644 --- a/thirdparty/opus/celt/entdec.h +++ b/thirdparty/opus/celt/entdec.h @@ -85,7 +85,7 @@ int ec_dec_icdf(ec_dec *_this,const unsigned char *_icdf,unsigned _ftb); The bits must have been encoded with ec_enc_uint(). No call to ec_dec_update() is necessary after this call. _ft: The number of integers that can be decoded (one more than the max). - This must be at least 2, and no more than 2**32-1. + This must be at least one, and no more than 2**32-1. Return: The decoded bits.*/ opus_uint32 ec_dec_uint(ec_dec *_this,opus_uint32 _ft); diff --git a/thirdparty/opus/celt/entenc.h b/thirdparty/opus/celt/entenc.h index f502eaf662..796bc4d572 100644 --- a/thirdparty/opus/celt/entenc.h +++ b/thirdparty/opus/celt/entenc.h @@ -67,7 +67,7 @@ void ec_enc_icdf(ec_enc *_this,int _s,const unsigned char *_icdf,unsigned _ftb); /*Encodes a raw unsigned integer in the stream. _fl: The integer to encode. _ft: The number of integers that can be encoded (one more than the max). - This must be at least 2, and no more than 2**32-1.*/ + This must be at least one, and no more than 2**32-1.*/ void ec_enc_uint(ec_enc *_this,opus_uint32 _fl,opus_uint32 _ft); /*Encodes a sequence of raw bits in the stream. diff --git a/thirdparty/opus/celt/fixed_debug.h b/thirdparty/opus/celt/fixed_debug.h index f435295234..d28227f5dc 100644 --- a/thirdparty/opus/celt/fixed_debug.h +++ b/thirdparty/opus/celt/fixed_debug.h @@ -59,14 +59,6 @@ extern opus_int64 celt_mips; #define SHR(a,b) SHR32(a,b) #define PSHR(a,b) PSHR32(a,b) -/** Add two 32-bit values, ignore any overflows */ -#define ADD32_ovflw(a,b) (celt_mips+=2,(opus_val32)((opus_uint32)(a)+(opus_uint32)(b))) -/** Subtract two 32-bit values, ignore any overflows */ -#define SUB32_ovflw(a,b) (celt_mips+=2,(opus_val32)((opus_uint32)(a)-(opus_uint32)(b))) -/* Avoid MSVC warning C4146: unary minus operator applied to unsigned type */ -/** Negate 32-bit value, ignore any overflows */ -#define NEG32_ovflw(a) (celt_mips+=2,(opus_val32)(0-(opus_uint32)(a))) - static OPUS_INLINE short NEG16(int x) { int res; @@ -235,11 +227,12 @@ static OPUS_INLINE int SHL32_(opus_int64 a, int shift, char *file, int line) #define VSHR32(a, shift) (((shift)>0) ? SHR32(a, shift) : SHL32(a, -(shift))) #define ROUND16(x,a) (celt_mips--,EXTRACT16(PSHR32((x),(a)))) -#define SROUND16(x,a) (celt_mips--,EXTRACT16(SATURATE(PSHR32(x,a), 32767))); - #define HALF16(x) (SHR16(x,1)) #define HALF32(x) (SHR32(x,1)) +//#define SHR(a,shift) ((a) >> (shift)) +//#define SHL(a,shift) ((a) << (shift)) + #define ADD16(a, b) ADD16_(a, b, __FILE__, __LINE__) static OPUS_INLINE short ADD16_(int a, int b, char *file, int line) { diff --git a/thirdparty/opus/celt/fixed_generic.h b/thirdparty/opus/celt/fixed_generic.h index 5f4abda76e..1cfd6d6989 100644 --- a/thirdparty/opus/celt/fixed_generic.h +++ b/thirdparty/opus/celt/fixed_generic.h @@ -104,9 +104,6 @@ /** Shift by a and round-to-neareast 32-bit value. Result is a 16-bit value */ #define ROUND16(x,a) (EXTRACT16(PSHR32((x),(a)))) -/** Shift by a and round-to-neareast 32-bit value. Result is a saturated 16-bit value */ -#define SROUND16(x,a) EXTRACT16(SATURATE(PSHR32(x,a), 32767)); - /** Divide by two */ #define HALF16(x) (SHR16(x,1)) #define HALF32(x) (SHR32(x,1)) @@ -120,14 +117,6 @@ /** Subtract two 32-bit values */ #define SUB32(a,b) ((opus_val32)(a)-(opus_val32)(b)) -/** Add two 32-bit values, ignore any overflows */ -#define ADD32_ovflw(a,b) ((opus_val32)((opus_uint32)(a)+(opus_uint32)(b))) -/** Subtract two 32-bit values, ignore any overflows */ -#define SUB32_ovflw(a,b) ((opus_val32)((opus_uint32)(a)-(opus_uint32)(b))) -/* Avoid MSVC warning C4146: unary minus operator applied to unsigned type */ -/** Negate 32-bit value, ignore any overflows */ -#define NEG32_ovflw(a) ((opus_val32)(0-(opus_uint32)(a))) - /** 16x16 multiplication where the result fits in 16 bits */ #define MULT16_16_16(a,b) ((((opus_val16)(a))*((opus_val16)(b)))) diff --git a/thirdparty/opus/celt/float_cast.h b/thirdparty/opus/celt/float_cast.h index 889dae965f..ed5a39b543 100644 --- a/thirdparty/opus/celt/float_cast.h +++ b/thirdparty/opus/celt/float_cast.h @@ -61,13 +61,7 @@ ** the config.h file. */ -/* With GCC, when SSE is available, the fastest conversion is cvtss2si. */ -#if defined(__GNUC__) && defined(__SSE__) - -#include <xmmintrin.h> -static OPUS_INLINE opus_int32 float2int(float x) {return _mm_cvt_ss2si(_mm_set_ss(x));} - -#elif defined(HAVE_LRINTF) +#if (HAVE_LRINTF) /* These defines enable functionality introduced with the 1999 ISO C ** standard. They must be defined before the inclusion of math.h to @@ -96,10 +90,10 @@ static OPUS_INLINE opus_int32 float2int(float x) {return _mm_cvt_ss2si(_mm_set_s #include <math.h> #define float2int(x) lrint(x) -#elif (defined(_MSC_VER) && _MSC_VER >= 1400) && (defined(_M_X64) || (defined(_M_IX86_FP) && _M_IX86_FP >= 1)) +#elif (defined(_MSC_VER) && _MSC_VER >= 1400) && defined (_M_X64) #include <xmmintrin.h> - static __inline long int float2int(float value) + __inline long int float2int(float value) { return _mm_cvtss_si32(_mm_load_ss(&value)); } @@ -110,7 +104,7 @@ static OPUS_INLINE opus_int32 float2int(float x) {return _mm_cvt_ss2si(_mm_set_s ** Therefore implement OPUS_INLINE versions of these functions here. */ - static __inline long int + __inline long int float2int (float flt) { int intgr; diff --git a/thirdparty/opus/celt/kiss_fft.c b/thirdparty/opus/celt/kiss_fft.c index 83775165d8..1f8fd05321 100644 --- a/thirdparty/opus/celt/kiss_fft.c +++ b/thirdparty/opus/celt/kiss_fft.c @@ -82,8 +82,8 @@ static void kf_bfly2( C_SUB( Fout2[0] , Fout[0] , t ); C_ADDTO( Fout[0] , t ); - t.r = S_MUL(ADD32_ovflw(Fout2[1].r, Fout2[1].i), tw); - t.i = S_MUL(SUB32_ovflw(Fout2[1].i, Fout2[1].r), tw); + t.r = S_MUL(Fout2[1].r+Fout2[1].i, tw); + t.i = S_MUL(Fout2[1].i-Fout2[1].r, tw); C_SUB( Fout2[1] , Fout[1] , t ); C_ADDTO( Fout[1] , t ); @@ -92,8 +92,8 @@ static void kf_bfly2( C_SUB( Fout2[2] , Fout[2] , t ); C_ADDTO( Fout[2] , t ); - t.r = S_MUL(SUB32_ovflw(Fout2[3].i, Fout2[3].r), tw); - t.i = S_MUL(NEG32_ovflw(ADD32_ovflw(Fout2[3].i, Fout2[3].r)), tw); + t.r = S_MUL(Fout2[3].i-Fout2[3].r, tw); + t.i = S_MUL(-Fout2[3].i-Fout2[3].r, tw); C_SUB( Fout2[3] , Fout[3] , t ); C_ADDTO( Fout[3] , t ); Fout += 8; @@ -126,10 +126,10 @@ static void kf_bfly4( C_ADDTO( *Fout , scratch1 ); C_SUB( scratch1 , Fout[1] , Fout[3] ); - Fout[1].r = ADD32_ovflw(scratch0.r, scratch1.i); - Fout[1].i = SUB32_ovflw(scratch0.i, scratch1.r); - Fout[3].r = SUB32_ovflw(scratch0.r, scratch1.i); - Fout[3].i = ADD32_ovflw(scratch0.i, scratch1.r); + Fout[1].r = scratch0.r + scratch1.i; + Fout[1].i = scratch0.i - scratch1.r; + Fout[3].r = scratch0.r - scratch1.i; + Fout[3].i = scratch0.i + scratch1.r; Fout+=4; } } else { @@ -160,10 +160,10 @@ static void kf_bfly4( tw3 += fstride*3; C_ADDTO( *Fout , scratch[3] ); - Fout[m].r = ADD32_ovflw(scratch[5].r, scratch[4].i); - Fout[m].i = SUB32_ovflw(scratch[5].i, scratch[4].r); - Fout[m3].r = SUB32_ovflw(scratch[5].r, scratch[4].i); - Fout[m3].i = ADD32_ovflw(scratch[5].i, scratch[4].r); + Fout[m].r = scratch[5].r + scratch[4].i; + Fout[m].i = scratch[5].i - scratch[4].r; + Fout[m3].r = scratch[5].r - scratch[4].i; + Fout[m3].i = scratch[5].i + scratch[4].r; ++Fout; } } @@ -212,18 +212,18 @@ static void kf_bfly3( tw1 += fstride; tw2 += fstride*2; - Fout[m].r = SUB32_ovflw(Fout->r, HALF_OF(scratch[3].r)); - Fout[m].i = SUB32_ovflw(Fout->i, HALF_OF(scratch[3].i)); + Fout[m].r = Fout->r - HALF_OF(scratch[3].r); + Fout[m].i = Fout->i - HALF_OF(scratch[3].i); C_MULBYSCALAR( scratch[0] , epi3.i ); C_ADDTO(*Fout,scratch[3]); - Fout[m2].r = ADD32_ovflw(Fout[m].r, scratch[0].i); - Fout[m2].i = SUB32_ovflw(Fout[m].i, scratch[0].r); + Fout[m2].r = Fout[m].r + scratch[0].i; + Fout[m2].i = Fout[m].i - scratch[0].r; - Fout[m].r = SUB32_ovflw(Fout[m].r, scratch[0].i); - Fout[m].i = ADD32_ovflw(Fout[m].i, scratch[0].r); + Fout[m].r -= scratch[0].i; + Fout[m].i += scratch[0].r; ++Fout; } while(--k); @@ -282,22 +282,22 @@ static void kf_bfly5( C_ADD( scratch[8],scratch[2],scratch[3]); C_SUB( scratch[9],scratch[2],scratch[3]); - Fout0->r = ADD32_ovflw(Fout0->r, ADD32_ovflw(scratch[7].r, scratch[8].r)); - Fout0->i = ADD32_ovflw(Fout0->i, ADD32_ovflw(scratch[7].i, scratch[8].i)); + Fout0->r += scratch[7].r + scratch[8].r; + Fout0->i += scratch[7].i + scratch[8].i; - scratch[5].r = ADD32_ovflw(scratch[0].r, ADD32_ovflw(S_MUL(scratch[7].r,ya.r), S_MUL(scratch[8].r,yb.r))); - scratch[5].i = ADD32_ovflw(scratch[0].i, ADD32_ovflw(S_MUL(scratch[7].i,ya.r), S_MUL(scratch[8].i,yb.r))); + scratch[5].r = scratch[0].r + S_MUL(scratch[7].r,ya.r) + S_MUL(scratch[8].r,yb.r); + scratch[5].i = scratch[0].i + S_MUL(scratch[7].i,ya.r) + S_MUL(scratch[8].i,yb.r); - scratch[6].r = ADD32_ovflw(S_MUL(scratch[10].i,ya.i), S_MUL(scratch[9].i,yb.i)); - scratch[6].i = NEG32_ovflw(ADD32_ovflw(S_MUL(scratch[10].r,ya.i), S_MUL(scratch[9].r,yb.i))); + scratch[6].r = S_MUL(scratch[10].i,ya.i) + S_MUL(scratch[9].i,yb.i); + scratch[6].i = -S_MUL(scratch[10].r,ya.i) - S_MUL(scratch[9].r,yb.i); C_SUB(*Fout1,scratch[5],scratch[6]); C_ADD(*Fout4,scratch[5],scratch[6]); - scratch[11].r = ADD32_ovflw(scratch[0].r, ADD32_ovflw(S_MUL(scratch[7].r,yb.r), S_MUL(scratch[8].r,ya.r))); - scratch[11].i = ADD32_ovflw(scratch[0].i, ADD32_ovflw(S_MUL(scratch[7].i,yb.r), S_MUL(scratch[8].i,ya.r))); - scratch[12].r = SUB32_ovflw(S_MUL(scratch[9].i,ya.i), S_MUL(scratch[10].i,yb.i)); - scratch[12].i = SUB32_ovflw(S_MUL(scratch[10].r,yb.i), S_MUL(scratch[9].r,ya.i)); + scratch[11].r = scratch[0].r + S_MUL(scratch[7].r,yb.r) + S_MUL(scratch[8].r,ya.r); + scratch[11].i = scratch[0].i + S_MUL(scratch[7].i,yb.r) + S_MUL(scratch[8].i,ya.r); + scratch[12].r = - S_MUL(scratch[10].i,yb.i) + S_MUL(scratch[9].i,ya.i); + scratch[12].i = S_MUL(scratch[10].r,yb.i) - S_MUL(scratch[9].r,ya.i); C_ADD(*Fout2,scratch[11],scratch[12]); C_SUB(*Fout3,scratch[11],scratch[12]); diff --git a/thirdparty/opus/celt/mathops.c b/thirdparty/opus/celt/mathops.c index 6ee9b9e101..21a01f52e4 100644 --- a/thirdparty/opus/celt/mathops.c +++ b/thirdparty/opus/celt/mathops.c @@ -38,8 +38,7 @@ #include "mathops.h" /*Compute floor(sqrt(_val)) with exact arithmetic. - _val must be greater than 0. - This has been tested on all possible 32-bit inputs greater than 0.*/ + This has been tested on all possible 32-bit inputs.*/ unsigned isqrt32(opus_uint32 _val){ unsigned b; unsigned g; @@ -183,7 +182,7 @@ opus_val32 celt_rcp(opus_val32 x) int i; opus_val16 n; opus_val16 r; - celt_sig_assert(x>0); + celt_assert2(x>0, "celt_rcp() only defined for positive values"); i = celt_ilog2(x); /* n is Q15 with range [0,1). */ n = VSHR32(x,i-15)-32768; diff --git a/thirdparty/opus/celt/mathops.h b/thirdparty/opus/celt/mathops.h index 5e86ff0dd2..a0525a9610 100644 --- a/thirdparty/opus/celt/mathops.h +++ b/thirdparty/opus/celt/mathops.h @@ -38,44 +38,11 @@ #include "entcode.h" #include "os_support.h" -#define PI 3.141592653f - /* Multiplies two 16-bit fractional values. Bit-exactness of this macro is important */ #define FRAC_MUL16(a,b) ((16384+((opus_int32)(opus_int16)(a)*(opus_int16)(b)))>>15) unsigned isqrt32(opus_uint32 _val); -/* CELT doesn't need it for fixed-point, by analysis.c does. */ -#if !defined(FIXED_POINT) || defined(ANALYSIS_C) -#define cA 0.43157974f -#define cB 0.67848403f -#define cC 0.08595542f -#define cE ((float)PI/2) -static OPUS_INLINE float fast_atan2f(float y, float x) { - float x2, y2; - x2 = x*x; - y2 = y*y; - /* For very small values, we don't care about the answer, so - we can just return 0. */ - if (x2 + y2 < 1e-18f) - { - return 0; - } - if(x2<y2){ - float den = (y2 + cB*x2) * (y2 + cC*x2); - return -x*y*(y2 + cA*x2) / den + (y<0 ? -cE : cE); - }else{ - float den = (x2 + cB*y2) * (x2 + cC*y2); - return x*y*(x2 + cA*y2) / den + (y<0 ? -cE : cE) - (x*y<0 ? -cE : cE); - } -} -#undef cA -#undef cB -#undef cC -#undef cE -#endif - - #ifndef OVERRIDE_CELT_MAXABS16 static OPUS_INLINE opus_val32 celt_maxabs16(const opus_val16 *x, int len) { @@ -113,6 +80,7 @@ static OPUS_INLINE opus_val32 celt_maxabs32(const opus_val32 *x, int len) #ifndef FIXED_POINT +#define PI 3.141592653f #define celt_sqrt(x) ((float)sqrt(x)) #define celt_rsqrt(x) (1.f/celt_sqrt(x)) #define celt_rsqrt_norm(x) (celt_rsqrt(x)) @@ -179,7 +147,7 @@ static OPUS_INLINE float celt_exp2(float x) /** Integer log in base2. Undefined for zero and negative numbers */ static OPUS_INLINE opus_int16 celt_ilog2(opus_int32 x) { - celt_sig_assert(x>0); + celt_assert2(x>0, "celt_ilog2() only defined for strictly positive numbers"); return EC_ILOG(x)-1; } #endif diff --git a/thirdparty/opus/celt/mdct.c b/thirdparty/opus/celt/mdct.c index 5c6dab5b75..5315ad11a3 100644 --- a/thirdparty/opus/celt/mdct.c +++ b/thirdparty/opus/celt/mdct.c @@ -270,8 +270,8 @@ void clt_mdct_backward_c(const mdct_lookup *l, kiss_fft_scalar *in, kiss_fft_sca int rev; kiss_fft_scalar yr, yi; rev = *bitrev++; - yr = ADD32_ovflw(S_MUL(*xp2, t[i]), S_MUL(*xp1, t[N4+i])); - yi = SUB32_ovflw(S_MUL(*xp1, t[i]), S_MUL(*xp2, t[N4+i])); + yr = S_MUL(*xp2, t[i]) + S_MUL(*xp1, t[N4+i]); + yi = S_MUL(*xp1, t[i]) - S_MUL(*xp2, t[N4+i]); /* We swap real and imag because we use an FFT instead of an IFFT. */ yp[2*rev+1] = yr; yp[2*rev] = yi; @@ -301,8 +301,8 @@ void clt_mdct_backward_c(const mdct_lookup *l, kiss_fft_scalar *in, kiss_fft_sca t0 = t[i]; t1 = t[N4+i]; /* We'd scale up by 2 here, but instead it's done when mixing the windows */ - yr = ADD32_ovflw(S_MUL(re,t0), S_MUL(im,t1)); - yi = SUB32_ovflw(S_MUL(re,t1), S_MUL(im,t0)); + yr = S_MUL(re,t0) + S_MUL(im,t1); + yi = S_MUL(re,t1) - S_MUL(im,t0); /* We swap real and imag because we're using an FFT instead of an IFFT. */ re = yp1[1]; im = yp1[0]; @@ -312,8 +312,8 @@ void clt_mdct_backward_c(const mdct_lookup *l, kiss_fft_scalar *in, kiss_fft_sca t0 = t[(N4-i-1)]; t1 = t[(N2-i-1)]; /* We'd scale up by 2 here, but instead it's done when mixing the windows */ - yr = ADD32_ovflw(S_MUL(re,t0), S_MUL(im,t1)); - yi = SUB32_ovflw(S_MUL(re,t1), S_MUL(im,t0)); + yr = S_MUL(re,t0) + S_MUL(im,t1); + yi = S_MUL(re,t1) - S_MUL(im,t0); yp1[0] = yr; yp0[1] = yi; yp0 += 2; @@ -333,8 +333,8 @@ void clt_mdct_backward_c(const mdct_lookup *l, kiss_fft_scalar *in, kiss_fft_sca kiss_fft_scalar x1, x2; x1 = *xp1; x2 = *yp1; - *yp1++ = SUB32_ovflw(MULT16_32_Q15(*wp2, x2), MULT16_32_Q15(*wp1, x1)); - *xp1-- = ADD32_ovflw(MULT16_32_Q15(*wp1, x2), MULT16_32_Q15(*wp2, x1)); + *yp1++ = MULT16_32_Q15(*wp2, x2) - MULT16_32_Q15(*wp1, x1); + *xp1-- = MULT16_32_Q15(*wp1, x2) + MULT16_32_Q15(*wp2, x1); wp1++; wp2--; } diff --git a/thirdparty/opus/celt/mips/celt_mipsr1.h b/thirdparty/opus/celt/mips/celt_mipsr1.h index c332fe0471..e85661a661 100644 --- a/thirdparty/opus/celt/mips/celt_mipsr1.h +++ b/thirdparty/opus/celt/mips/celt_mipsr1.h @@ -53,7 +53,6 @@ #include "celt_lpc.h" #include "vq.h" -#define OVERRIDE_COMB_FILTER_CONST #define OVERRIDE_comb_filter void comb_filter(opus_val32 *y, opus_val32 *x, int T0, int T1, int N, opus_val16 g0, opus_val16 g1, int tapset0, int tapset1, diff --git a/thirdparty/opus/celt/mips/vq_mipsr1.h b/thirdparty/opus/celt/mips/vq_mipsr1.h index f26a33e755..54cef86133 100644 --- a/thirdparty/opus/celt/mips/vq_mipsr1.h +++ b/thirdparty/opus/celt/mips/vq_mipsr1.h @@ -36,6 +36,11 @@ #include "mathops.h" #include "arch.h" +static unsigned extract_collapse_mask(int *iy, int N, int B); +static void normalise_residual(int * OPUS_RESTRICT iy, celt_norm * OPUS_RESTRICT X, int N, opus_val32 Ryy, opus_val16 gain); +static void exp_rotation(celt_norm *X, int len, int dir, int stride, int K, int spread); +static void renormalise_vector_mips(celt_norm *X, int N, opus_val16 gain, int arch); + #define OVERRIDE_vq_exp_rotation1 static void exp_rotation1(celt_norm *X, int len, int stride, opus_val16 c, opus_val16 s) { @@ -64,7 +69,11 @@ static void exp_rotation1(celt_norm *X, int len, int stride, opus_val16 c, opus_ } #define OVERRIDE_renormalise_vector -void renormalise_vector(celt_norm *X, int N, opus_val16 gain, int arch) + +#define renormalise_vector(X, N, gain, arch) \ + (renormalise_vector_mips(X, N, gain, arch)) + +void renormalise_vector_mips(celt_norm *X, int N, opus_val16 gain, int arch) { int i; #ifdef FIXED_POINT diff --git a/thirdparty/opus/celt/modes.c b/thirdparty/opus/celt/modes.c index 390c5e8aeb..911686e905 100644 --- a/thirdparty/opus/celt/modes.c +++ b/thirdparty/opus/celt/modes.c @@ -427,7 +427,7 @@ void opus_custom_mode_destroy(CELTMode *mode) } #endif /* CUSTOM_MODES_ONLY */ opus_free((opus_int16*)mode->eBands); - opus_free((unsigned char*)mode->allocVectors); + opus_free((opus_int16*)mode->allocVectors); opus_free((opus_val16*)mode->window); opus_free((opus_int16*)mode->logN); diff --git a/thirdparty/opus/celt/pitch.c b/thirdparty/opus/celt/pitch.c index 872582a48a..bf46e7d562 100644 --- a/thirdparty/opus/celt/pitch.c +++ b/thirdparty/opus/celt/pitch.c @@ -102,9 +102,11 @@ static void find_best_pitch(opus_val32 *xcorr, opus_val16 *y, int len, } } -static void celt_fir5(opus_val16 *x, +static void celt_fir5(const opus_val16 *x, const opus_val16 *num, - int N) + opus_val16 *y, + int N, + opus_val16 *mem) { int i; opus_val16 num0, num1, num2, num3, num4; @@ -114,11 +116,11 @@ static void celt_fir5(opus_val16 *x, num2=num[2]; num3=num[3]; num4=num[4]; - mem0=0; - mem1=0; - mem2=0; - mem3=0; - mem4=0; + mem0=mem[0]; + mem1=mem[1]; + mem2=mem[2]; + mem3=mem[3]; + mem4=mem[4]; for (i=0;i<N;i++) { opus_val32 sum = SHL32(EXTEND32(x[i]), SIG_SHIFT); @@ -132,8 +134,13 @@ static void celt_fir5(opus_val16 *x, mem2 = mem1; mem1 = mem0; mem0 = x[i]; - x[i] = ROUND16(sum, SIG_SHIFT); + y[i] = ROUND16(sum, SIG_SHIFT); } + mem[0]=mem0; + mem[1]=mem1; + mem[2]=mem2; + mem[3]=mem3; + mem[4]=mem4; } @@ -143,7 +150,7 @@ void pitch_downsample(celt_sig * OPUS_RESTRICT x[], opus_val16 * OPUS_RESTRICT x int i; opus_val32 ac[5]; opus_val16 tmp=Q15ONE; - opus_val16 lpc[4]; + opus_val16 lpc[4], mem[5]={0,0,0,0,0}; opus_val16 lpc2[5]; opus_val16 c1 = QCONST16(.8f,15); #ifdef FIXED_POINT @@ -204,7 +211,7 @@ void pitch_downsample(celt_sig * OPUS_RESTRICT x[], opus_val16 * OPUS_RESTRICT x lpc2[2] = lpc[2] + MULT16_16_Q15(c1,lpc[1]); lpc2[3] = lpc[3] + MULT16_16_Q15(c1,lpc[2]); lpc2[4] = MULT16_16_Q15(c1,lpc[3]); - celt_fir5(x_lp, lpc2, len>>1); + celt_fir5(x_lp, lpc2, x_lp, len>>1, mem); } /* Pure C implementation. */ @@ -213,8 +220,13 @@ opus_val32 #else void #endif +#if defined(OVERRIDE_PITCH_XCORR) celt_pitch_xcorr_c(const opus_val16 *_x, const opus_val16 *_y, + opus_val32 *xcorr, int len, int max_pitch) +#else +celt_pitch_xcorr(const opus_val16 *_x, const opus_val16 *_y, opus_val32 *xcorr, int len, int max_pitch, int arch) +#endif { #if 0 /* This is a simple version of the pitch correlation that should work @@ -249,11 +261,15 @@ celt_pitch_xcorr_c(const opus_val16 *_x, const opus_val16 *_y, opus_val32 maxcorr=1; #endif celt_assert(max_pitch>0); - celt_sig_assert((((unsigned char *)_x-(unsigned char *)NULL)&3)==0); + celt_assert((((unsigned char *)_x-(unsigned char *)NULL)&3)==0); for (i=0;i<max_pitch-3;i+=4) { opus_val32 sum[4]={0,0,0,0}; +#if defined(OVERRIDE_PITCH_XCORR) + xcorr_kernel_c(_x, _y+i, sum, len); +#else xcorr_kernel(_x, _y+i, sum, len, arch); +#endif xcorr[i]=sum[0]; xcorr[i+1]=sum[1]; xcorr[i+2]=sum[2]; @@ -269,7 +285,11 @@ celt_pitch_xcorr_c(const opus_val16 *_x, const opus_val16 *_y, for (;i<max_pitch;i++) { opus_val32 sum; +#if defined(OVERRIDE_PITCH_XCORR) + sum = celt_inner_prod_c(_x, _y+i, len); +#else sum = celt_inner_prod(_x, _y+i, len, arch); +#endif xcorr[i] = sum; #ifdef FIXED_POINT maxcorr = MAX32(maxcorr, sum); @@ -358,7 +378,7 @@ void pitch_search(const opus_val16 * OPUS_RESTRICT x_lp, opus_val16 * OPUS_RESTR for (j=0;j<len>>1;j++) sum += SHR32(MULT16_16(x_lp[j],y[i+j]), shift); #else - sum = celt_inner_prod(x_lp, y+i, len>>1, arch); + sum = celt_inner_prod_c(x_lp, y+i, len>>1); #endif xcorr[i] = MAX32(-1, sum); #ifdef FIXED_POINT @@ -404,7 +424,7 @@ static opus_val16 compute_pitch_gain(opus_val32 xy, opus_val32 xx, opus_val32 yy sx = celt_ilog2(xx)-14; sy = celt_ilog2(yy)-14; shift = sx + sy; - x2y2 = SHR32(MULT16_16(VSHR32(xx, sx), VSHR32(yy, sy)), 14); + x2y2 = MULT16_16_Q14(VSHR32(xx, sx), VSHR32(yy, sy)); if (shift & 1) { if (x2y2 < 32768) { diff --git a/thirdparty/opus/celt/pitch.h b/thirdparty/opus/celt/pitch.h index e425f56aea..d3503532a0 100644 --- a/thirdparty/opus/celt/pitch.h +++ b/thirdparty/opus/celt/pitch.h @@ -46,7 +46,8 @@ #include "mips/pitch_mipsr1.h" #endif -#if (defined(OPUS_ARM_ASM) || defined(OPUS_ARM_MAY_HAVE_NEON_INTR)) +#if ((defined(OPUS_ARM_ASM) && defined(FIXED_POINT)) \ + || defined(OPUS_ARM_MAY_HAVE_NEON_INTR)) # include "arm/pitch_arm.h" #endif @@ -183,10 +184,17 @@ opus_val32 void #endif celt_pitch_xcorr_c(const opus_val16 *_x, const opus_val16 *_y, + opus_val32 *xcorr, int len, int max_pitch); + +#if !defined(OVERRIDE_PITCH_XCORR) +#ifdef FIXED_POINT +opus_val32 +#else +void +#endif +celt_pitch_xcorr(const opus_val16 *_x, const opus_val16 *_y, opus_val32 *xcorr, int len, int max_pitch, int arch); -#ifndef OVERRIDE_PITCH_XCORR -# define celt_pitch_xcorr celt_pitch_xcorr_c #endif #endif diff --git a/thirdparty/opus/celt/quant_bands.c b/thirdparty/opus/celt/quant_bands.c index 39a221eda5..95076e0af2 100644 --- a/thirdparty/opus/celt/quant_bands.c +++ b/thirdparty/opus/celt/quant_bands.c @@ -418,7 +418,6 @@ void quant_energy_finalise(const CELTMode *m, int start, int end, opus_val16 *ol offset = (q2-.5f)*(1<<(14-fine_quant[i]-1))*(1.f/16384); #endif oldEBands[i+c*m->nbEBands] += offset; - error[i+c*m->nbEBands] -= offset; bits_left--; } while (++c < C); } @@ -457,7 +456,7 @@ void unquant_coarse_energy(const CELTMode *m, int start, int end, opus_val16 *ol /* It would be better to express this invariant as a test on C at function entry, but that isn't enough to make the static analyzer happy. */ - celt_sig_assert(c<2); + celt_assert(c<2); tell = ec_tell(dec); if(budget-tell>=15) { @@ -548,15 +547,9 @@ void amp2Log2(const CELTMode *m, int effEnd, int end, c=0; do { for (i=0;i<effEnd;i++) - { bandLogE[i+c*m->nbEBands] = - celt_log2(bandE[i+c*m->nbEBands]) + celt_log2(SHL32(bandE[i+c*m->nbEBands],2)) - SHL16((opus_val16)eMeans[i],6); -#ifdef FIXED_POINT - /* Compensate for bandE[] being Q12 but celt_log2() taking a Q14 input. */ - bandLogE[i+c*m->nbEBands] += QCONST16(2.f, DB_SHIFT); -#endif - } for (i=effEnd;i<end;i++) bandLogE[c*m->nbEBands+i] = -QCONST16(14.f,DB_SHIFT); } while (++c < C); diff --git a/thirdparty/opus/celt/rate.c b/thirdparty/opus/celt/rate.c index 465e1ba26c..7dfa5be8a6 100644 --- a/thirdparty/opus/celt/rate.c +++ b/thirdparty/opus/celt/rate.c @@ -348,17 +348,12 @@ static OPUS_INLINE int interp_bits2pulses(const CELTMode *m, int start, int end, /*This if() block is the only part of the allocation function that is not a mandatory part of the bitstream: any bands we choose to skip here must be explicitly signaled.*/ - int depth_threshold; - /*We choose a threshold with some hysteresis to keep bands from - fluctuating in and out, but we try not to fold below a certain point. */ - if (codedBands > 17) - depth_threshold = j<prev ? 7 : 9; - else - depth_threshold = 0; + /*Choose a threshold with some hysteresis to keep bands from + fluctuating in and out.*/ #ifdef FUZZING if ((rand()&0x1) == 0) #else - if (codedBands<=start+2 || (band_bits > (depth_threshold*band_width<<LM<<BITRES)>>4 && j<=signalBandwidth)) + if (codedBands<=start+2 || (band_bits > ((j<prev?7:9)*band_width<<LM<<BITRES)>>4 && j<=signalBandwidth)) #endif { ec_enc_bit_logp(ec, 1, 1); @@ -529,7 +524,7 @@ static OPUS_INLINE int interp_bits2pulses(const CELTMode *m, int start, int end, return codedBands; } -int clt_compute_allocation(const CELTMode *m, int start, int end, const int *offsets, const int *cap, int alloc_trim, int *intensity, int *dual_stereo, +int compute_allocation(const CELTMode *m, int start, int end, const int *offsets, const int *cap, int alloc_trim, int *intensity, int *dual_stereo, opus_int32 total, opus_int32 *balance, int *pulses, int *ebits, int *fine_priority, int C, int LM, ec_ctx *ec, int encode, int prev, int signalBandwidth) { int lo, hi, len, j; diff --git a/thirdparty/opus/celt/rate.h b/thirdparty/opus/celt/rate.h index fad5e412da..515f7687ce 100644 --- a/thirdparty/opus/celt/rate.h +++ b/thirdparty/opus/celt/rate.h @@ -95,7 +95,7 @@ static OPUS_INLINE int pulses2bits(const CELTMode *m, int band, int LM, int puls @param pulses Number of pulses per band (returned) @return Total number of bits allocated */ -int clt_compute_allocation(const CELTMode *m, int start, int end, const int *offsets, const int *cap, int alloc_trim, int *intensity, int *dual_stereo, +int compute_allocation(const CELTMode *m, int start, int end, const int *offsets, const int *cap, int alloc_trim, int *intensity, int *dual_stero, opus_int32 total, opus_int32 *balance, int *pulses, int *ebits, int *fine_priority, int C, int LM, ec_ctx *ec, int encode, int prev, int signalBandwidth); #endif diff --git a/thirdparty/opus/celt/static_modes_fixed_arm_ne10.h b/thirdparty/opus/celt/static_modes_fixed_arm_ne10.h index 7623092192..b8ef0cee98 100644 --- a/thirdparty/opus/celt/static_modes_fixed_arm_ne10.h +++ b/thirdparty/opus/celt/static_modes_fixed_arm_ne10.h @@ -1,7 +1,7 @@ /* The contents of this file was automatically generated by * dump_mode_arm_ne10.c with arguments: 48000 960 * It contains static definitions for some pre-defined modes. */ -#include <NE10_types.h> +#include <NE10_init.h> #ifndef NE10_FFT_PARAMS48000_960 #define NE10_FFT_PARAMS48000_960 diff --git a/thirdparty/opus/celt/static_modes_float_arm_ne10.h b/thirdparty/opus/celt/static_modes_float_arm_ne10.h index 66e1abb101..934a82a420 100644 --- a/thirdparty/opus/celt/static_modes_float_arm_ne10.h +++ b/thirdparty/opus/celt/static_modes_float_arm_ne10.h @@ -1,7 +1,7 @@ /* The contents of this file was automatically generated by * dump_mode_arm_ne10.c with arguments: 48000 960 * It contains static definitions for some pre-defined modes. */ -#include <NE10_types.h> +#include <NE10_init.h> #ifndef NE10_FFT_PARAMS48000_960 #define NE10_FFT_PARAMS48000_960 diff --git a/thirdparty/opus/celt/tests/test_unit_cwrs32.c b/thirdparty/opus/celt/tests/test_unit_cwrs32.c new file mode 100644 index 0000000000..36dd8af5f5 --- /dev/null +++ b/thirdparty/opus/celt/tests/test_unit_cwrs32.c @@ -0,0 +1,161 @@ +/* Copyright (c) 2008-2011 Xiph.Org Foundation, Mozilla Corporation, + Gregory Maxwell + Written by Jean-Marc Valin, Gregory Maxwell, and Timothy B. Terriberry */ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <stdio.h> +#include <string.h> + +#ifndef CUSTOM_MODES +#define CUSTOM_MODES +#else +#define TEST_CUSTOM_MODES +#endif + +#define CELT_C +#include "stack_alloc.h" +#include "entenc.c" +#include "entdec.c" +#include "entcode.c" +#include "cwrs.c" +#include "mathops.c" +#include "rate.h" + +#define NMAX (240) +#define KMAX (128) + +#ifdef TEST_CUSTOM_MODES + +#define NDIMS (44) +static const int pn[NDIMS]={ + 2, 3, 4, 5, 6, 7, 8, 9, 10, + 11, 12, 13, 14, 15, 16, 18, 20, 22, + 24, 26, 28, 30, 32, 36, 40, 44, 48, + 52, 56, 60, 64, 72, 80, 88, 96, 104, + 112, 120, 128, 144, 160, 176, 192, 208 +}; +static const int pkmax[NDIMS]={ + 128, 128, 128, 128, 88, 52, 36, 26, 22, + 18, 16, 15, 13, 12, 12, 11, 10, 9, + 9, 8, 8, 7, 7, 7, 7, 6, 6, + 6, 6, 6, 5, 5, 5, 5, 5, 5, + 4, 4, 4, 4, 4, 4, 4, 4 +}; + +#else /* TEST_CUSTOM_MODES */ + +#define NDIMS (22) +static const int pn[NDIMS]={ + 2, 3, 4, 6, 8, 9, 11, 12, 16, + 18, 22, 24, 32, 36, 44, 48, 64, 72, + 88, 96, 144, 176 +}; +static const int pkmax[NDIMS]={ + 128, 128, 128, 88, 36, 26, 18, 16, 12, + 11, 9, 9, 7, 7, 6, 6, 5, 5, + 5, 5, 4, 4 +}; + +#endif + +int main(void){ + int t; + int n; + ALLOC_STACK; + for(t=0;t<NDIMS;t++){ + int pseudo; + n=pn[t]; + for(pseudo=1;pseudo<41;pseudo++) + { + int k; +#if defined(SMALL_FOOTPRINT) + opus_uint32 uu[KMAX+2U]; +#endif + opus_uint32 inc; + opus_uint32 nc; + opus_uint32 i; + k=get_pulses(pseudo); + if (k>pkmax[t])break; + printf("Testing CWRS with N=%i, K=%i...\n",n,k); +#if defined(SMALL_FOOTPRINT) + nc=ncwrs_urow(n,k,uu); +#else + nc=CELT_PVQ_V(n,k); +#endif + inc=nc/20000; + if(inc<1)inc=1; + for(i=0;i<nc;i+=inc){ +#if defined(SMALL_FOOTPRINT) + opus_uint32 u[KMAX+2U]; +#endif + int y[NMAX]; + int sy; + opus_uint32 v; + opus_uint32 ii; + int j; +#if defined(SMALL_FOOTPRINT) + memcpy(u,uu,(k+2U)*sizeof(*u)); + cwrsi(n,k,i,y,u); +#else + cwrsi(n,k,i,y); +#endif + sy=0; + for(j=0;j<n;j++)sy+=abs(y[j]); + if(sy!=k){ + fprintf(stderr,"N=%d Pulse count mismatch in cwrsi (%d!=%d).\n", + n,sy,k); + return 99; + } + /*printf("%6u of %u:",i,nc); + for(j=0;j<n;j++)printf(" %+3i",y[j]); + printf(" ->");*/ +#if defined(SMALL_FOOTPRINT) + ii=icwrs(n,k,&v,y,u); +#else + ii=icwrs(n,y); + v=CELT_PVQ_V(n,k); +#endif + if(ii!=i){ + fprintf(stderr,"Combination-index mismatch (%lu!=%lu).\n", + (long)ii,(long)i); + return 1; + } + if(v!=nc){ + fprintf(stderr,"Combination count mismatch (%lu!=%lu).\n", + (long)v,(long)nc); + return 2; + } + /*printf(" %6u\n",i);*/ + } + /*printf("\n");*/ + } + } + return 0; +} diff --git a/thirdparty/opus/celt/tests/test_unit_dft.c b/thirdparty/opus/celt/tests/test_unit_dft.c new file mode 100644 index 0000000000..6166eb0e4f --- /dev/null +++ b/thirdparty/opus/celt/tests/test_unit_dft.c @@ -0,0 +1,189 @@ +/* Copyright (c) 2008 Xiph.Org Foundation + Written by Jean-Marc Valin */ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#define SKIP_CONFIG_H + +#ifndef CUSTOM_MODES +#define CUSTOM_MODES +#endif + +#include <stdio.h> + +#define CELT_C +#define TEST_UNIT_DFT_C +#include "stack_alloc.h" +#include "kiss_fft.h" +#include "kiss_fft.c" +#include "mathops.c" +#include "entcode.c" + +#if defined(OPUS_X86_MAY_HAVE_SSE2) || defined(OPUS_X86_MAY_HAVE_SSE4_1) +# include "x86/x86cpu.c" +#elif defined(OPUS_ARM_ASM) || defined(OPUS_ARM_MAY_HAVE_NEON_INTR) +# include "arm/armcpu.c" +# include "celt_lpc.c" +# include "pitch.c" +# if defined(OPUS_ARM_MAY_HAVE_NEON_INTR) +# include "arm/celt_neon_intr.c" +# if defined(HAVE_ARM_NE10) +# include "mdct.c" +# include "arm/celt_ne10_fft.c" +# include "arm/celt_ne10_mdct.c" +# endif +# endif +# include "arm/arm_celt_map.c" +#endif + +#ifndef M_PI +#define M_PI 3.141592653 +#endif + +int ret = 0; + +void check(kiss_fft_cpx * in,kiss_fft_cpx * out,int nfft,int isinverse) +{ + int bin,k; + double errpow=0,sigpow=0, snr; + + for (bin=0;bin<nfft;++bin) { + double ansr = 0; + double ansi = 0; + double difr; + double difi; + + for (k=0;k<nfft;++k) { + double phase = -2*M_PI*bin*k/nfft; + double re = cos(phase); + double im = sin(phase); + if (isinverse) + im = -im; + + if (!isinverse) + { + re /= nfft; + im /= nfft; + } + + ansr += in[k].r * re - in[k].i * im; + ansi += in[k].r * im + in[k].i * re; + } + /*printf ("%d %d ", (int)ansr, (int)ansi);*/ + difr = ansr - out[bin].r; + difi = ansi - out[bin].i; + errpow += difr*difr + difi*difi; + sigpow += ansr*ansr+ansi*ansi; + } + snr = 10*log10(sigpow/errpow); + printf("nfft=%d inverse=%d,snr = %f\n",nfft,isinverse,snr ); + if (snr<60) { + printf( "** poor snr: %f ** \n", snr); + ret = 1; + } +} + +void test1d(int nfft,int isinverse,int arch) +{ + size_t buflen = sizeof(kiss_fft_cpx)*nfft; + + kiss_fft_cpx * in = (kiss_fft_cpx*)malloc(buflen); + kiss_fft_cpx * out= (kiss_fft_cpx*)malloc(buflen); + kiss_fft_state *cfg = opus_fft_alloc(nfft,0,0,arch); + int k; + + for (k=0;k<nfft;++k) { + in[k].r = (rand() % 32767) - 16384; + in[k].i = (rand() % 32767) - 16384; + } + + for (k=0;k<nfft;++k) { + in[k].r *= 32768; + in[k].i *= 32768; + } + + if (isinverse) + { + for (k=0;k<nfft;++k) { + in[k].r /= nfft; + in[k].i /= nfft; + } + } + + /*for (k=0;k<nfft;++k) printf("%d %d ", in[k].r, in[k].i);printf("\n");*/ + + if (isinverse) + opus_ifft(cfg,in,out, arch); + else + opus_fft(cfg,in,out, arch); + + /*for (k=0;k<nfft;++k) printf("%d %d ", out[k].r, out[k].i);printf("\n");*/ + + check(in,out,nfft,isinverse); + + free(in); + free(out); + opus_fft_free(cfg, arch); +} + +int main(int argc,char ** argv) +{ + ALLOC_STACK; + int arch = opus_select_arch(); + + if (argc>1) { + int k; + for (k=1;k<argc;++k) { + test1d(atoi(argv[k]),0,arch); + test1d(atoi(argv[k]),1,arch); + } + }else{ + test1d(32,0,arch); + test1d(32,1,arch); + test1d(128,0,arch); + test1d(128,1,arch); + test1d(256,0,arch); + test1d(256,1,arch); +#ifndef RADIX_TWO_ONLY + test1d(36,0,arch); + test1d(36,1,arch); + test1d(50,0,arch); + test1d(50,1,arch); + test1d(60,0,arch); + test1d(60,1,arch); + test1d(120,0,arch); + test1d(120,1,arch); + test1d(240,0,arch); + test1d(240,1,arch); + test1d(480,0,arch); + test1d(480,1,arch); +#endif + } + return ret; +} diff --git a/thirdparty/opus/celt/tests/test_unit_entropy.c b/thirdparty/opus/celt/tests/test_unit_entropy.c new file mode 100644 index 0000000000..ff9265864c --- /dev/null +++ b/thirdparty/opus/celt/tests/test_unit_entropy.c @@ -0,0 +1,382 @@ +/* Copyright (c) 2007-2011 Xiph.Org Foundation, Mozilla Corporation, + Gregory Maxwell + Written by Jean-Marc Valin, Gregory Maxwell, and Timothy B. Terriberry */ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <stdlib.h> +#include <stdio.h> +#include <math.h> +#include <time.h> +#include "entcode.h" +#include "entenc.h" +#include "entdec.h" +#include <string.h> + +#include "entenc.c" +#include "entdec.c" +#include "entcode.c" + +#ifndef M_LOG2E +# define M_LOG2E 1.4426950408889634074 +#endif +#define DATA_SIZE 10000000 +#define DATA_SIZE2 10000 + +int main(int _argc,char **_argv){ + ec_enc enc; + ec_dec dec; + long nbits; + long nbits2; + double entropy; + int ft; + int ftb; + int sz; + int i; + int ret; + unsigned int sym; + unsigned int seed; + unsigned char *ptr; + const char *env_seed; + ret=0; + entropy=0; + if (_argc > 2) { + fprintf(stderr, "Usage: %s [<seed>]\n", _argv[0]); + return 1; + } + env_seed = getenv("SEED"); + if (_argc > 1) + seed = atoi(_argv[1]); + else if (env_seed) + seed = atoi(env_seed); + else + seed = time(NULL); + /*Testing encoding of raw bit values.*/ + ptr = (unsigned char *)malloc(DATA_SIZE); + ec_enc_init(&enc,ptr, DATA_SIZE); + for(ft=2;ft<1024;ft++){ + for(i=0;i<ft;i++){ + entropy+=log(ft)*M_LOG2E; + ec_enc_uint(&enc,i,ft); + } + } + /*Testing encoding of raw bit values.*/ + for(ftb=1;ftb<16;ftb++){ + for(i=0;i<(1<<ftb);i++){ + entropy+=ftb; + nbits=ec_tell(&enc); + ec_enc_bits(&enc,i,ftb); + nbits2=ec_tell(&enc); + if(nbits2-nbits!=ftb){ + fprintf(stderr,"Used %li bits to encode %i bits directly.\n", + nbits2-nbits,ftb); + ret=-1; + } + } + } + nbits=ec_tell_frac(&enc); + ec_enc_done(&enc); + fprintf(stderr, + "Encoded %0.2lf bits of entropy to %0.2lf bits (%0.3lf%% wasted).\n", + entropy,ldexp(nbits,-3),100*(nbits-ldexp(entropy,3))/nbits); + fprintf(stderr,"Packed to %li bytes.\n",(long)ec_range_bytes(&enc)); + ec_dec_init(&dec,ptr,DATA_SIZE); + for(ft=2;ft<1024;ft++){ + for(i=0;i<ft;i++){ + sym=ec_dec_uint(&dec,ft); + if(sym!=(unsigned)i){ + fprintf(stderr,"Decoded %i instead of %i with ft of %i.\n",sym,i,ft); + ret=-1; + } + } + } + for(ftb=1;ftb<16;ftb++){ + for(i=0;i<(1<<ftb);i++){ + sym=ec_dec_bits(&dec,ftb); + if(sym!=(unsigned)i){ + fprintf(stderr,"Decoded %i instead of %i with ftb of %i.\n",sym,i,ftb); + ret=-1; + } + } + } + nbits2=ec_tell_frac(&dec); + if(nbits!=nbits2){ + fprintf(stderr, + "Reported number of bits used was %0.2lf, should be %0.2lf.\n", + ldexp(nbits2,-3),ldexp(nbits,-3)); + ret=-1; + } + /*Testing an encoder bust prefers range coder data over raw bits. + This isn't a general guarantee, will only work for data that is buffered in + the encoder state and not yet stored in the user buffer, and should never + get used in practice. + It's mostly here for code coverage completeness.*/ + /*Start with a 16-bit buffer.*/ + ec_enc_init(&enc,ptr,2); + /*Write 7 raw bits.*/ + ec_enc_bits(&enc,0x55,7); + /*Write 12.3 bits of range coder data.*/ + ec_enc_uint(&enc,1,2); + ec_enc_uint(&enc,1,3); + ec_enc_uint(&enc,1,4); + ec_enc_uint(&enc,1,5); + ec_enc_uint(&enc,2,6); + ec_enc_uint(&enc,6,7); + ec_enc_done(&enc); + ec_dec_init(&dec,ptr,2); + if(!enc.error + /*The raw bits should have been overwritten by the range coder data.*/ + ||ec_dec_bits(&dec,7)!=0x05 + /*And all the range coder data should have been encoded correctly.*/ + ||ec_dec_uint(&dec,2)!=1 + ||ec_dec_uint(&dec,3)!=1 + ||ec_dec_uint(&dec,4)!=1 + ||ec_dec_uint(&dec,5)!=1 + ||ec_dec_uint(&dec,6)!=2 + ||ec_dec_uint(&dec,7)!=6){ + fprintf(stderr,"Encoder bust overwrote range coder data with raw bits.\n"); + ret=-1; + } + srand(seed); + fprintf(stderr,"Testing random streams... Random seed: %u (%.4X)\n", seed, rand() % 65536); + for(i=0;i<409600;i++){ + unsigned *data; + unsigned *tell; + unsigned tell_bits; + int j; + int zeros; + ft=rand()/((RAND_MAX>>(rand()%11U))+1U)+10; + sz=rand()/((RAND_MAX>>(rand()%9U))+1U); + data=(unsigned *)malloc(sz*sizeof(*data)); + tell=(unsigned *)malloc((sz+1)*sizeof(*tell)); + ec_enc_init(&enc,ptr,DATA_SIZE2); + zeros = rand()%13==0; + tell[0]=ec_tell_frac(&enc); + for(j=0;j<sz;j++){ + if (zeros) + data[j]=0; + else + data[j]=rand()%ft; + ec_enc_uint(&enc,data[j],ft); + tell[j+1]=ec_tell_frac(&enc); + } + if (rand()%2==0) + while(ec_tell(&enc)%8 != 0) + ec_enc_uint(&enc, rand()%2, 2); + tell_bits = ec_tell(&enc); + ec_enc_done(&enc); + if(tell_bits!=(unsigned)ec_tell(&enc)){ + fprintf(stderr,"ec_tell() changed after ec_enc_done(): %i instead of %i (Random seed: %u)\n", + ec_tell(&enc),tell_bits,seed); + ret=-1; + } + if ((tell_bits+7)/8 < ec_range_bytes(&enc)) + { + fprintf (stderr, "ec_tell() lied, there's %i bytes instead of %d (Random seed: %u)\n", + ec_range_bytes(&enc), (tell_bits+7)/8,seed); + ret=-1; + } + ec_dec_init(&dec,ptr,DATA_SIZE2); + if(ec_tell_frac(&dec)!=tell[0]){ + fprintf(stderr, + "Tell mismatch between encoder and decoder at symbol %i: %i instead of %i (Random seed: %u).\n", + 0,ec_tell_frac(&dec),tell[0],seed); + } + for(j=0;j<sz;j++){ + sym=ec_dec_uint(&dec,ft); + if(sym!=data[j]){ + fprintf(stderr, + "Decoded %i instead of %i with ft of %i at position %i of %i (Random seed: %u).\n", + sym,data[j],ft,j,sz,seed); + ret=-1; + } + if(ec_tell_frac(&dec)!=tell[j+1]){ + fprintf(stderr, + "Tell mismatch between encoder and decoder at symbol %i: %i instead of %i (Random seed: %u).\n", + j+1,ec_tell_frac(&dec),tell[j+1],seed); + } + } + free(tell); + free(data); + } + /*Test compatibility between multiple different encode/decode routines.*/ + for(i=0;i<409600;i++){ + unsigned *logp1; + unsigned *data; + unsigned *tell; + unsigned *enc_method; + int j; + sz=rand()/((RAND_MAX>>(rand()%9U))+1U); + logp1=(unsigned *)malloc(sz*sizeof(*logp1)); + data=(unsigned *)malloc(sz*sizeof(*data)); + tell=(unsigned *)malloc((sz+1)*sizeof(*tell)); + enc_method=(unsigned *)malloc(sz*sizeof(*enc_method)); + ec_enc_init(&enc,ptr,DATA_SIZE2); + tell[0]=ec_tell_frac(&enc); + for(j=0;j<sz;j++){ + data[j]=rand()/((RAND_MAX>>1)+1); + logp1[j]=(rand()%15)+1; + enc_method[j]=rand()/((RAND_MAX>>2)+1); + switch(enc_method[j]){ + case 0:{ + ec_encode(&enc,data[j]?(1<<logp1[j])-1:0, + (1<<logp1[j])-(data[j]?0:1),1<<logp1[j]); + }break; + case 1:{ + ec_encode_bin(&enc,data[j]?(1<<logp1[j])-1:0, + (1<<logp1[j])-(data[j]?0:1),logp1[j]); + }break; + case 2:{ + ec_enc_bit_logp(&enc,data[j],logp1[j]); + }break; + case 3:{ + unsigned char icdf[2]; + icdf[0]=1; + icdf[1]=0; + ec_enc_icdf(&enc,data[j],icdf,logp1[j]); + }break; + } + tell[j+1]=ec_tell_frac(&enc); + } + ec_enc_done(&enc); + if((ec_tell(&enc)+7U)/8U<ec_range_bytes(&enc)){ + fprintf(stderr,"tell() lied, there's %i bytes instead of %d (Random seed: %u)\n", + ec_range_bytes(&enc),(ec_tell(&enc)+7)/8,seed); + ret=-1; + } + ec_dec_init(&dec,ptr,DATA_SIZE2); + if(ec_tell_frac(&dec)!=tell[0]){ + fprintf(stderr, + "Tell mismatch between encoder and decoder at symbol %i: %i instead of %i (Random seed: %u).\n", + 0,ec_tell_frac(&dec),tell[0],seed); + } + for(j=0;j<sz;j++){ + int fs; + int dec_method; + dec_method=rand()/((RAND_MAX>>2)+1); + switch(dec_method){ + case 0:{ + fs=ec_decode(&dec,1<<logp1[j]); + sym=fs>=(1<<logp1[j])-1; + ec_dec_update(&dec,sym?(1<<logp1[j])-1:0, + (1<<logp1[j])-(sym?0:1),1<<logp1[j]); + }break; + case 1:{ + fs=ec_decode_bin(&dec,logp1[j]); + sym=fs>=(1<<logp1[j])-1; + ec_dec_update(&dec,sym?(1<<logp1[j])-1:0, + (1<<logp1[j])-(sym?0:1),1<<logp1[j]); + }break; + case 2:{ + sym=ec_dec_bit_logp(&dec,logp1[j]); + }break; + case 3:{ + unsigned char icdf[2]; + icdf[0]=1; + icdf[1]=0; + sym=ec_dec_icdf(&dec,icdf,logp1[j]); + }break; + } + if(sym!=data[j]){ + fprintf(stderr, + "Decoded %i instead of %i with logp1 of %i at position %i of %i (Random seed: %u).\n", + sym,data[j],logp1[j],j,sz,seed); + fprintf(stderr,"Encoding method: %i, decoding method: %i\n", + enc_method[j],dec_method); + ret=-1; + } + if(ec_tell_frac(&dec)!=tell[j+1]){ + fprintf(stderr, + "Tell mismatch between encoder and decoder at symbol %i: %i instead of %i (Random seed: %u).\n", + j+1,ec_tell_frac(&dec),tell[j+1],seed); + } + } + free(enc_method); + free(tell); + free(data); + free(logp1); + } + ec_enc_init(&enc,ptr,DATA_SIZE2); + ec_enc_bit_logp(&enc,0,1); + ec_enc_bit_logp(&enc,0,1); + ec_enc_bit_logp(&enc,0,1); + ec_enc_bit_logp(&enc,0,1); + ec_enc_bit_logp(&enc,0,2); + ec_enc_patch_initial_bits(&enc,3,2); + if(enc.error){ + fprintf(stderr,"patch_initial_bits failed"); + ret=-1; + } + ec_enc_patch_initial_bits(&enc,0,5); + if(!enc.error){ + fprintf(stderr,"patch_initial_bits didn't fail when it should have"); + ret=-1; + } + ec_enc_done(&enc); + if(ec_range_bytes(&enc)!=1||ptr[0]!=192){ + fprintf(stderr,"Got %d when expecting 192 for patch_initial_bits",ptr[0]); + ret=-1; + } + ec_enc_init(&enc,ptr,DATA_SIZE2); + ec_enc_bit_logp(&enc,0,1); + ec_enc_bit_logp(&enc,0,1); + ec_enc_bit_logp(&enc,1,6); + ec_enc_bit_logp(&enc,0,2); + ec_enc_patch_initial_bits(&enc,0,2); + if(enc.error){ + fprintf(stderr,"patch_initial_bits failed"); + ret=-1; + } + ec_enc_done(&enc); + if(ec_range_bytes(&enc)!=2||ptr[0]!=63){ + fprintf(stderr,"Got %d when expecting 63 for patch_initial_bits",ptr[0]); + ret=-1; + } + ec_enc_init(&enc,ptr,2); + ec_enc_bit_logp(&enc,0,2); + for(i=0;i<48;i++){ + ec_enc_bits(&enc,0,1); + } + ec_enc_done(&enc); + if(!enc.error){ + fprintf(stderr,"Raw bits overfill didn't fail when it should have"); + ret=-1; + } + ec_enc_init(&enc,ptr,2); + for(i=0;i<17;i++){ + ec_enc_bits(&enc,0,1); + } + ec_enc_done(&enc); + if(!enc.error){ + fprintf(stderr,"17 raw bits encoded in two bytes"); + ret=-1; + } + free(ptr); + return ret; +} diff --git a/thirdparty/opus/celt/tests/test_unit_laplace.c b/thirdparty/opus/celt/tests/test_unit_laplace.c new file mode 100644 index 0000000000..22951e29ee --- /dev/null +++ b/thirdparty/opus/celt/tests/test_unit_laplace.c @@ -0,0 +1,93 @@ +/* Copyright (c) 2008-2011 Xiph.Org Foundation, Mozilla Corporation + Written by Jean-Marc Valin and Timothy B. Terriberry */ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <stdio.h> +#include <stdlib.h> +#include "laplace.h" +#define CELT_C +#include "stack_alloc.h" + +#include "entenc.c" +#include "entdec.c" +#include "entcode.c" +#include "laplace.c" + +#define DATA_SIZE 40000 + +int ec_laplace_get_start_freq(int decay) +{ + opus_uint32 ft = 32768 - LAPLACE_MINP*(2*LAPLACE_NMIN+1); + int fs = (ft*(16384-decay))/(16384+decay); + return fs+LAPLACE_MINP; +} + +int main(void) +{ + int i; + int ret = 0; + ec_enc enc; + ec_dec dec; + unsigned char *ptr; + int val[10000], decay[10000]; + ALLOC_STACK; + ptr = (unsigned char *)malloc(DATA_SIZE); + ec_enc_init(&enc,ptr,DATA_SIZE); + + val[0] = 3; decay[0] = 6000; + val[1] = 0; decay[1] = 5800; + val[2] = -1; decay[2] = 5600; + for (i=3;i<10000;i++) + { + val[i] = rand()%15-7; + decay[i] = rand()%11000+5000; + } + for (i=0;i<10000;i++) + ec_laplace_encode(&enc, &val[i], + ec_laplace_get_start_freq(decay[i]), decay[i]); + + ec_enc_done(&enc); + + ec_dec_init(&dec,ec_get_buffer(&enc),ec_range_bytes(&enc)); + + for (i=0;i<10000;i++) + { + int d = ec_laplace_decode(&dec, + ec_laplace_get_start_freq(decay[i]), decay[i]); + if (d != val[i]) + { + fprintf (stderr, "Got %d instead of %d\n", d, val[i]); + ret = 1; + } + } + + free(ptr); + return ret; +} diff --git a/thirdparty/opus/celt/tests/test_unit_mathops.c b/thirdparty/opus/celt/tests/test_unit_mathops.c new file mode 100644 index 0000000000..fd3319da91 --- /dev/null +++ b/thirdparty/opus/celt/tests/test_unit_mathops.c @@ -0,0 +1,304 @@ +/* Copyright (c) 2008-2011 Xiph.Org Foundation, Mozilla Corporation, + Gregory Maxwell + Written by Jean-Marc Valin, Gregory Maxwell, and Timothy B. Terriberry */ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#ifndef CUSTOM_MODES +#define CUSTOM_MODES +#endif + +#define CELT_C + +#include <stdio.h> +#include <math.h> +#include "mathops.c" +#include "entenc.c" +#include "entdec.c" +#include "entcode.c" +#include "bands.c" +#include "quant_bands.c" +#include "laplace.c" +#include "vq.c" +#include "cwrs.c" +#include "pitch.c" +#include "celt_lpc.c" +#include "celt.c" + +#if defined(OPUS_X86_MAY_HAVE_SSE) || defined(OPUS_X86_MAY_HAVE_SSE2) || defined(OPUS_X86_MAY_HAVE_SSE4_1) +# if defined(OPUS_X86_MAY_HAVE_SSE) +# include "x86/pitch_sse.c" +# endif +# if defined(OPUS_X86_MAY_HAVE_SSE2) +# include "x86/pitch_sse2.c" +# endif +# if defined(OPUS_X86_MAY_HAVE_SSE4_1) +# include "x86/pitch_sse4_1.c" +# include "x86/celt_lpc_sse.c" +# endif +# include "x86/x86_celt_map.c" +#elif defined(OPUS_ARM_ASM) || defined(OPUS_ARM_MAY_HAVE_NEON_INTR) +# include "arm/armcpu.c" +# if defined(OPUS_ARM_MAY_HAVE_NEON_INTR) +# include "arm/celt_neon_intr.c" +# if defined(HAVE_ARM_NE10) +# include "kiss_fft.c" +# include "mdct.c" +# include "arm/celt_ne10_fft.c" +# include "arm/celt_ne10_mdct.c" +# endif +# endif +# include "arm/arm_celt_map.c" +#endif + +#ifdef FIXED_POINT +#define WORD "%d" +#else +#define WORD "%f" +#endif + +int ret = 0; + +void testdiv(void) +{ + opus_int32 i; + for (i=1;i<=327670;i++) + { + double prod; + opus_val32 val; + val = celt_rcp(i); +#ifdef FIXED_POINT + prod = (1./32768./65526.)*val*i; +#else + prod = val*i; +#endif + if (fabs(prod-1) > .00025) + { + fprintf (stderr, "div failed: 1/%d="WORD" (product = %f)\n", i, val, prod); + ret = 1; + } + } +} + +void testsqrt(void) +{ + opus_int32 i; + for (i=1;i<=1000000000;i++) + { + double ratio; + opus_val16 val; + val = celt_sqrt(i); + ratio = val/sqrt(i); + if (fabs(ratio - 1) > .0005 && fabs(val-sqrt(i)) > 2) + { + fprintf (stderr, "sqrt failed: sqrt(%d)="WORD" (ratio = %f)\n", i, val, ratio); + ret = 1; + } + i+= i>>10; + } +} + +void testbitexactcos(void) +{ + int i; + opus_int32 min_d,max_d,last,chk; + chk=max_d=0; + last=min_d=32767; + for(i=64;i<=16320;i++) + { + opus_int32 d; + opus_int32 q=bitexact_cos(i); + chk ^= q*i; + d = last - q; + if (d>max_d)max_d=d; + if (d<min_d)min_d=d; + last = q; + } + if ((chk!=89408644)||(max_d!=5)||(min_d!=0)||(bitexact_cos(64)!=32767)|| + (bitexact_cos(16320)!=200)||(bitexact_cos(8192)!=23171)) + { + fprintf (stderr, "bitexact_cos failed\n"); + ret = 1; + } +} + +void testbitexactlog2tan(void) +{ + int i,fail; + opus_int32 min_d,max_d,last,chk; + fail=chk=max_d=0; + last=min_d=15059; + for(i=64;i<8193;i++) + { + opus_int32 d; + opus_int32 mid=bitexact_cos(i); + opus_int32 side=bitexact_cos(16384-i); + opus_int32 q=bitexact_log2tan(mid,side); + chk ^= q*i; + d = last - q; + if (q!=-1*bitexact_log2tan(side,mid)) + fail = 1; + if (d>max_d)max_d=d; + if (d<min_d)min_d=d; + last = q; + } + if ((chk!=15821257)||(max_d!=61)||(min_d!=-2)||fail|| + (bitexact_log2tan(32767,200)!=15059)||(bitexact_log2tan(30274,12540)!=2611)|| + (bitexact_log2tan(23171,23171)!=0)) + { + fprintf (stderr, "bitexact_log2tan failed\n"); + ret = 1; + } +} + +#ifndef FIXED_POINT +void testlog2(void) +{ + float x; + for (x=0.001;x<1677700.0;x+=(x/8.0)) + { + float error = fabs((1.442695040888963387*log(x))-celt_log2(x)); + if (error>0.0009) + { + fprintf (stderr, "celt_log2 failed: fabs((1.442695040888963387*log(x))-celt_log2(x))>0.001 (x = %f, error = %f)\n", x,error); + ret = 1; + } + } +} + +void testexp2(void) +{ + float x; + for (x=-11.0;x<24.0;x+=0.0007) + { + float error = fabs(x-(1.442695040888963387*log(celt_exp2(x)))); + if (error>0.0002) + { + fprintf (stderr, "celt_exp2 failed: fabs(x-(1.442695040888963387*log(celt_exp2(x))))>0.0005 (x = %f, error = %f)\n", x,error); + ret = 1; + } + } +} + +void testexp2log2(void) +{ + float x; + for (x=-11.0;x<24.0;x+=0.0007) + { + float error = fabs(x-(celt_log2(celt_exp2(x)))); + if (error>0.001) + { + fprintf (stderr, "celt_log2/celt_exp2 failed: fabs(x-(celt_log2(celt_exp2(x))))>0.001 (x = %f, error = %f)\n", x,error); + ret = 1; + } + } +} +#else +void testlog2(void) +{ + opus_val32 x; + for (x=8;x<1073741824;x+=(x>>3)) + { + float error = fabs((1.442695040888963387*log(x/16384.0))-celt_log2(x)/1024.0); + if (error>0.003) + { + fprintf (stderr, "celt_log2 failed: x = %ld, error = %f\n", (long)x,error); + ret = 1; + } + } +} + +void testexp2(void) +{ + opus_val16 x; + for (x=-32768;x<15360;x++) + { + float error1 = fabs(x/1024.0-(1.442695040888963387*log(celt_exp2(x)/65536.0))); + float error2 = fabs(exp(0.6931471805599453094*x/1024.0)-celt_exp2(x)/65536.0); + if (error1>0.0002&&error2>0.00004) + { + fprintf (stderr, "celt_exp2 failed: x = "WORD", error1 = %f, error2 = %f\n", x,error1,error2); + ret = 1; + } + } +} + +void testexp2log2(void) +{ + opus_val32 x; + for (x=8;x<65536;x+=(x>>3)) + { + float error = fabs(x-0.25*celt_exp2(celt_log2(x)))/16384; + if (error>0.004) + { + fprintf (stderr, "celt_log2/celt_exp2 failed: fabs(x-(celt_exp2(celt_log2(x))))>0.001 (x = %ld, error = %f)\n", (long)x,error); + ret = 1; + } + } +} + +void testilog2(void) +{ + opus_val32 x; + for (x=1;x<=268435455;x+=127) + { + opus_val32 lg; + opus_val32 y; + + lg = celt_ilog2(x); + if (lg<0 || lg>=31) + { + printf("celt_ilog2 failed: 0<=celt_ilog2(x)<31 (x = %d, celt_ilog2(x) = %d)\n",x,lg); + ret = 1; + } + y = 1<<lg; + + if (x<y || (x>>1)>=y) + { + printf("celt_ilog2 failed: 2**celt_ilog2(x)<=x<2**(celt_ilog2(x)+1) (x = %d, 2**celt_ilog2(x) = %d)\n",x,y); + ret = 1; + } + } +} +#endif + +int main(void) +{ + testbitexactcos(); + testbitexactlog2tan(); + testdiv(); + testsqrt(); + testlog2(); + testexp2(); + testexp2log2(); +#ifdef FIXED_POINT + testilog2(); +#endif + return ret; +} diff --git a/thirdparty/opus/celt/tests/test_unit_mdct.c b/thirdparty/opus/celt/tests/test_unit_mdct.c new file mode 100644 index 0000000000..8dbb9caa2e --- /dev/null +++ b/thirdparty/opus/celt/tests/test_unit_mdct.c @@ -0,0 +1,230 @@ +/* Copyright (c) 2008-2011 Xiph.Org Foundation + Written by Jean-Marc Valin */ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#define SKIP_CONFIG_H + +#ifndef CUSTOM_MODES +#define CUSTOM_MODES +#endif + +#include <stdio.h> + +#define CELT_C +#include "mdct.h" +#include "stack_alloc.h" + +#include "kiss_fft.c" +#include "mdct.c" +#include "mathops.c" +#include "entcode.c" + +#if defined(OPUS_X86_MAY_HAVE_SSE2) || defined(OPUS_X86_MAY_HAVE_SSE4_1) +# include "x86/x86cpu.c" +#elif defined(OPUS_ARM_ASM) || defined(OPUS_ARM_MAY_HAVE_NEON_INTR) +# include "arm/armcpu.c" +# include "pitch.c" +# include "celt_lpc.c" +# if defined(OPUS_ARM_MAY_HAVE_NEON_INTR) +# include "arm/celt_neon_intr.c" +# if defined(HAVE_ARM_NE10) +# include "arm/celt_ne10_fft.c" +# include "arm/celt_ne10_mdct.c" +# endif +# endif +# include "arm/arm_celt_map.c" +#endif + +#ifndef M_PI +#define M_PI 3.141592653 +#endif + +int ret = 0; +void check(kiss_fft_scalar * in,kiss_fft_scalar * out,int nfft,int isinverse) +{ + int bin,k; + double errpow=0,sigpow=0; + double snr; + for (bin=0;bin<nfft/2;++bin) { + double ansr = 0; + double difr; + + for (k=0;k<nfft;++k) { + double phase = 2*M_PI*(k+.5+.25*nfft)*(bin+.5)/nfft; + double re = cos(phase); + + re /= nfft/4; + + ansr += in[k] * re; + } + /*printf ("%f %f\n", ansr, out[bin]);*/ + difr = ansr - out[bin]; + errpow += difr*difr; + sigpow += ansr*ansr; + } + snr = 10*log10(sigpow/errpow); + printf("nfft=%d inverse=%d,snr = %f\n",nfft,isinverse,snr ); + if (snr<60) { + printf( "** poor snr: %f **\n", snr); + ret = 1; + } +} + +void check_inv(kiss_fft_scalar * in,kiss_fft_scalar * out,int nfft,int isinverse) +{ + int bin,k; + double errpow=0,sigpow=0; + double snr; + for (bin=0;bin<nfft;++bin) { + double ansr = 0; + double difr; + + for (k=0;k<nfft/2;++k) { + double phase = 2*M_PI*(bin+.5+.25*nfft)*(k+.5)/nfft; + double re = cos(phase); + + /*re *= 2;*/ + + ansr += in[k] * re; + } + /*printf ("%f %f\n", ansr, out[bin]);*/ + difr = ansr - out[bin]; + errpow += difr*difr; + sigpow += ansr*ansr; + } + snr = 10*log10(sigpow/errpow); + printf("nfft=%d inverse=%d,snr = %f\n",nfft,isinverse,snr ); + if (snr<60) { + printf( "** poor snr: %f **\n", snr); + ret = 1; + } +} + + +void test1d(int nfft,int isinverse,int arch) +{ + mdct_lookup cfg; + size_t buflen = sizeof(kiss_fft_scalar)*nfft; + + kiss_fft_scalar * in = (kiss_fft_scalar*)malloc(buflen); + kiss_fft_scalar * in_copy = (kiss_fft_scalar*)malloc(buflen); + kiss_fft_scalar * out= (kiss_fft_scalar*)malloc(buflen); + opus_val16 * window= (opus_val16*)malloc(sizeof(opus_val16)*nfft/2); + int k; + + clt_mdct_init(&cfg, nfft, 0, arch); + for (k=0;k<nfft;++k) { + in[k] = (rand() % 32768) - 16384; + } + + for (k=0;k<nfft/2;++k) { + window[k] = Q15ONE; + } + for (k=0;k<nfft;++k) { + in[k] *= 32768; + } + + if (isinverse) + { + for (k=0;k<nfft;++k) { + in[k] /= nfft; + } + } + + for (k=0;k<nfft;++k) + in_copy[k] = in[k]; + /*for (k=0;k<nfft;++k) printf("%d %d ", in[k].r, in[k].i);printf("\n");*/ + + if (isinverse) + { + for (k=0;k<nfft;++k) + out[k] = 0; + clt_mdct_backward(&cfg,in,out, window, nfft/2, 0, 1, arch); + /* apply TDAC because clt_mdct_backward() no longer does that */ + for (k=0;k<nfft/4;++k) + out[nfft-k-1] = out[nfft/2+k]; + check_inv(in,out,nfft,isinverse); + } else { + clt_mdct_forward(&cfg,in,out,window, nfft/2, 0, 1, arch); + check(in_copy,out,nfft,isinverse); + } + /*for (k=0;k<nfft;++k) printf("%d %d ", out[k].r, out[k].i);printf("\n");*/ + + + free(in); + free(in_copy); + free(out); + free(window); + clt_mdct_clear(&cfg, arch); +} + +int main(int argc,char ** argv) +{ + ALLOC_STACK; + int arch = opus_select_arch(); + + if (argc>1) { + int k; + for (k=1;k<argc;++k) { + test1d(atoi(argv[k]),0,arch); + test1d(atoi(argv[k]),1,arch); + } + }else{ + test1d(32,0,arch); + test1d(32,1,arch); + test1d(256,0,arch); + test1d(256,1,arch); + test1d(512,0,arch); + test1d(512,1,arch); + test1d(1024,0,arch); + test1d(1024,1,arch); + test1d(2048,0,arch); + test1d(2048,1,arch); +#ifndef RADIX_TWO_ONLY + test1d(36,0,arch); + test1d(36,1,arch); + test1d(40,0,arch); + test1d(40,1,arch); + test1d(60,0,arch); + test1d(60,1,arch); + test1d(120,0,arch); + test1d(120,1,arch); + test1d(240,0,arch); + test1d(240,1,arch); + test1d(480,0,arch); + test1d(480,1,arch); + test1d(960,0,arch); + test1d(960,1,arch); + test1d(1920,0,arch); + test1d(1920,1,arch); +#endif + } + return ret; +} diff --git a/thirdparty/opus/celt/tests/test_unit_rotation.c b/thirdparty/opus/celt/tests/test_unit_rotation.c new file mode 100644 index 0000000000..1080c2085d --- /dev/null +++ b/thirdparty/opus/celt/tests/test_unit_rotation.c @@ -0,0 +1,120 @@ +/* Copyright (c) 2008-2011 Xiph.Org Foundation + Written by Jean-Marc Valin */ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#ifndef CUSTOM_MODES +#define CUSTOM_MODES +#endif + +#define CELT_C + +#include <stdio.h> +#include <stdlib.h> +#include "vq.c" +#include "cwrs.c" +#include "entcode.c" +#include "entenc.c" +#include "entdec.c" +#include "mathops.c" +#include "bands.h" +#include "pitch.c" +#include "celt_lpc.c" +#include "celt.c" +#include <math.h> + +#if defined(OPUS_X86_MAY_HAVE_SSE) || defined(OPUS_X86_MAY_HAVE_SSE2) || defined(OPUS_X86_MAY_HAVE_SSE4_1) +# if defined(OPUS_X86_MAY_HAVE_SSE) +# include "x86/pitch_sse.c" +# endif +# if defined(OPUS_X86_MAY_HAVE_SSE2) +# include "x86/pitch_sse2.c" +# endif +# if defined(OPUS_X86_MAY_HAVE_SSE4_1) +# include "x86/pitch_sse4_1.c" +# include "x86/celt_lpc_sse.c" +# endif +# include "x86/x86_celt_map.c" +#elif defined(OPUS_ARM_ASM) || defined(OPUS_ARM_MAY_HAVE_NEON_INTR) +# include "arm/armcpu.c" +# if defined(OPUS_ARM_MAY_HAVE_NEON_INTR) +# include "arm/celt_neon_intr.c" +# if defined(HAVE_ARM_NE10) +# include "kiss_fft.c" +# include "mdct.c" +# include "arm/celt_ne10_fft.c" +# include "arm/celt_ne10_mdct.c" +# endif +# endif +# include "arm/arm_celt_map.c" +#endif + +#define MAX_SIZE 100 + +int ret=0; +void test_rotation(int N, int K) +{ + int i; + double err = 0, ener = 0, snr, snr0; + opus_val16 x0[MAX_SIZE]; + opus_val16 x1[MAX_SIZE]; + for (i=0;i<N;i++) + x1[i] = x0[i] = rand()%32767-16384; + exp_rotation(x1, N, 1, 1, K, SPREAD_NORMAL); + for (i=0;i<N;i++) + { + err += (x0[i]-(double)x1[i])*(x0[i]-(double)x1[i]); + ener += x0[i]*(double)x0[i]; + } + snr0 = 20*log10(ener/err); + err = ener = 0; + exp_rotation(x1, N, -1, 1, K, SPREAD_NORMAL); + for (i=0;i<N;i++) + { + err += (x0[i]-(double)x1[i])*(x0[i]-(double)x1[i]); + ener += x0[i]*(double)x0[i]; + } + snr = 20*log10(ener/err); + printf ("SNR for size %d (%d pulses) is %f (was %f without inverse)\n", N, K, snr, snr0); + if (snr < 60 || snr0 > 20) + { + fprintf(stderr, "FAIL!\n"); + ret = 1; + } +} + +int main(void) +{ + ALLOC_STACK; + test_rotation(15, 3); + test_rotation(23, 5); + test_rotation(50, 3); + test_rotation(80, 1); + return ret; +} diff --git a/thirdparty/opus/celt/arm/armopts.s b/thirdparty/opus/celt/tests/test_unit_types.c index fb9196072a..67a0fb8ed3 100644 --- a/thirdparty/opus/celt/arm/armopts.s +++ b/thirdparty/opus/celt/tests/test_unit_types.c @@ -1,4 +1,5 @@ -/* Copyright (C) 2013 Mozilla Corporation */ +/* Copyright (c) 2008-2011 Xiph.Org Foundation + Written by Jean-Marc Valin */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -24,14 +25,26 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -; Set the following to 1 if we have EDSP instructions -; (LDRD/STRD, etc., ARMv5E and later). -OPUS_ARM_MAY_HAVE_EDSP * +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif -; Set the following to 1 if we have ARMv6 media instructions. -OPUS_ARM_MAY_HAVE_MEDIA * +#include "opus_types.h" +#include <stdio.h> -; Set the following to 1 if we have NEON (some ARMv7) -OPUS_ARM_MAY_HAVE_NEON * - -END +int main(void) +{ + opus_int16 i = 1; + i <<= 14; + if (i>>14 != 1) + { + fprintf(stderr, "opus_int16 isn't 16 bits\n"); + return 1; + } + if (sizeof(opus_int16)*2 != sizeof(opus_int32)) + { + fprintf(stderr, "16*2 != 32\n"); + return 1; + } + return 0; +} diff --git a/thirdparty/opus/celt/vq.c b/thirdparty/opus/celt/vq.c index 8011e22548..d29f38fd8e 100644 --- a/thirdparty/opus/celt/vq.c +++ b/thirdparty/opus/celt/vq.c @@ -39,10 +39,6 @@ #include "rate.h" #include "pitch.h" -#if defined(MIPSr1_ASM) -#include "mips/vq_mipsr1.h" -#endif - #ifndef OVERRIDE_vq_exp_rotation1 static void exp_rotation1(celt_norm *X, int len, int stride, opus_val16 c, opus_val16 s) { @@ -71,7 +67,7 @@ static void exp_rotation1(celt_norm *X, int len, int stride, opus_val16 c, opus_ } #endif /* OVERRIDE_vq_exp_rotation1 */ -void exp_rotation(celt_norm *X, int len, int dir, int stride, int K, int spread) +static void exp_rotation(celt_norm *X, int len, int dir, int stride, int K, int spread) { static const int SPREAD_FACTOR[3]={15,10,5}; int i; @@ -162,27 +158,42 @@ static unsigned extract_collapse_mask(int *iy, int N, int B) return collapse_mask; } -opus_val16 op_pvq_search_c(celt_norm *X, int *iy, int K, int N, int arch) +unsigned alg_quant(celt_norm *X, int N, int K, int spread, int B, ec_enc *enc +#ifdef RESYNTH + , opus_val16 gain +#endif + ) { VARDECL(celt_norm, y); - VARDECL(int, signx); + VARDECL(int, iy); + VARDECL(opus_val16, signx); int i, j; + opus_val16 s; int pulsesLeft; opus_val32 sum; opus_val32 xy; opus_val16 yy; + unsigned collapse_mask; SAVE_STACK; - (void)arch; + celt_assert2(K>0, "alg_quant() needs at least one pulse"); + celt_assert2(N>1, "alg_quant() needs at least two dimensions"); + ALLOC(y, N, celt_norm); - ALLOC(signx, N, int); + ALLOC(iy, N, int); + ALLOC(signx, N, opus_val16); + + exp_rotation(X, N, 1, B, K, spread); /* Get rid of the sign */ sum = 0; j=0; do { - signx[j] = X[j]<0; - /* OPT: Make sure the compiler doesn't use a branch on ABS16(). */ - X[j] = ABS16(X[j]); + if (X[j]>0) + signx[j]=1; + else { + signx[j]=-1; + X[j]=-X[j]; + } iy[j] = 0; y[j] = 0; } while (++j<N); @@ -214,12 +225,7 @@ opus_val16 op_pvq_search_c(celt_norm *X, int *iy, int K, int N, int arch) while (++j<N); sum = QCONST16(1.f,14); } -#ifdef FIXED_POINT - rcp = EXTRACT16(MULT16_32_Q16(K, celt_rcp(sum))); -#else - /* Using K+e with e < 1 guarantees we cannot get more than K pulses. */ - rcp = EXTRACT16(MULT16_32_Q16(K+0.8f, celt_rcp(sum))); -#endif + rcp = EXTRACT16(MULT16_32_Q16(K-1, celt_rcp(sum))); j=0; do { #ifdef FIXED_POINT /* It's really important to round *towards zero* here */ @@ -234,12 +240,12 @@ opus_val16 op_pvq_search_c(celt_norm *X, int *iy, int K, int N, int arch) pulsesLeft -= iy[j]; } while (++j<N); } - celt_sig_assert(pulsesLeft>=0); + celt_assert2(pulsesLeft>=1, "Allocated too many pulses in the quick pass"); /* This should never happen, but just in case it does (e.g. on silence) we fill the first bin with pulses. */ #ifdef FIXED_POINT_DEBUG - celt_sig_assert(pulsesLeft<=N+3); + celt_assert2(pulsesLeft<=N+3, "Not enough pulses in the quick pass"); #endif if (pulsesLeft > N+3) { @@ -250,12 +256,12 @@ opus_val16 op_pvq_search_c(celt_norm *X, int *iy, int K, int N, int arch) pulsesLeft=0; } + s = 1; for (i=0;i<pulsesLeft;i++) { - opus_val16 Rxy, Ryy; int best_id; - opus_val32 best_num; - opus_val16 best_den; + opus_val32 best_num = -VERY_LARGE16; + opus_val16 best_den = 0; #ifdef FIXED_POINT int rshift; #endif @@ -266,22 +272,9 @@ opus_val16 op_pvq_search_c(celt_norm *X, int *iy, int K, int N, int arch) /* The squared magnitude term gets added anyway, so we might as well add it outside the loop */ yy = ADD16(yy, 1); - - /* Calculations for position 0 are out of the loop, in part to reduce - mispredicted branches (since the if condition is usually false) - in the loop. */ - /* Temporary sums of the new pulse(s) */ - Rxy = EXTRACT16(SHR32(ADD32(xy, EXTEND32(X[0])),rshift)); - /* We're multiplying y[j] by two so we don't have to do it here */ - Ryy = ADD16(yy, y[0]); - - /* Approximate score: we maximise Rxy/sqrt(Ryy) (we're guaranteed that - Rxy is positive because the sign is pre-computed) */ - Rxy = MULT16_16_Q15(Rxy,Rxy); - best_den = Ryy; - best_num = Rxy; - j=1; + j=0; do { + opus_val16 Rxy, Ryy; /* Temporary sums of the new pulse(s) */ Rxy = EXTRACT16(SHR32(ADD32(xy, EXTEND32(X[j])),rshift)); /* We're multiplying y[j] by two so we don't have to do it here */ @@ -292,11 +285,8 @@ opus_val16 op_pvq_search_c(celt_norm *X, int *iy, int K, int N, int arch) Rxy = MULT16_16_Q15(Rxy,Rxy); /* The idea is to check for num/den >= best_num/best_den, but that way we can do it without any division */ - /* OPT: It's not clear whether a cmov is faster than a branch here - since the condition is more often false than true and using - a cmov introduces data dependencies across iterations. The optimal - choice may be architecture-dependent. */ - if (opus_unlikely(MULT16_16(best_den, Rxy) > MULT16_16(Ryy, best_num))) + /* OPT: Make sure to use conditional moves here */ + if (MULT16_16(best_den, Rxy) > MULT16_16(Ryy, best_num)) { best_den = Ryy; best_num = Rxy; @@ -311,47 +301,23 @@ opus_val16 op_pvq_search_c(celt_norm *X, int *iy, int K, int N, int arch) /* Only now that we've made the final choice, update y/iy */ /* Multiplying y[j] by 2 so we don't have to do it everywhere else */ - y[best_id] += 2; + y[best_id] += 2*s; iy[best_id]++; } /* Put the original sign back */ j=0; do { - /*iy[j] = signx[j] ? -iy[j] : iy[j];*/ - /* OPT: The is more likely to be compiled without a branch than the code above - but has the same performance otherwise. */ - iy[j] = (iy[j]^-signx[j]) + signx[j]; + X[j] = MULT16_16(signx[j],X[j]); + if (signx[j] < 0) + iy[j] = -iy[j]; } while (++j<N); - RESTORE_STACK; - return yy; -} - -unsigned alg_quant(celt_norm *X, int N, int K, int spread, int B, ec_enc *enc, - opus_val16 gain, int resynth, int arch) -{ - VARDECL(int, iy); - opus_val16 yy; - unsigned collapse_mask; - SAVE_STACK; - - celt_assert2(K>0, "alg_quant() needs at least one pulse"); - celt_assert2(N>1, "alg_quant() needs at least two dimensions"); - - /* Covers vectorization by up to 4. */ - ALLOC(iy, N+3, int); - - exp_rotation(X, N, 1, B, K, spread); - - yy = op_pvq_search(X, iy, K, N, arch); - encode_pulses(iy, N, K, enc); - if (resynth) - { - normalise_residual(iy, X, N, yy, gain); - exp_rotation(X, N, -1, B, K, spread); - } +#ifdef RESYNTH + normalise_residual(iy, X, N, yy, gain); + exp_rotation(X, N, -1, B, K, spread); +#endif collapse_mask = extract_collapse_mask(iy, N, B); RESTORE_STACK; @@ -435,7 +401,7 @@ int stereo_itheta(const celt_norm *X, const celt_norm *Y, int stereo, int N, int /* 0.63662 = 2/pi */ itheta = MULT16_16_Q15(QCONST16(0.63662f,15),celt_atan2p(side, mid)); #else - itheta = (int)floor(.5f+16384*0.63662f*fast_atan2f(side,mid)); + itheta = (int)floor(.5f+16384*0.63662f*atan2(side,mid)); #endif return itheta; diff --git a/thirdparty/opus/celt/vq.h b/thirdparty/opus/celt/vq.h index 45ec55918e..5cfcbe50ea 100644 --- a/thirdparty/opus/celt/vq.h +++ b/thirdparty/opus/celt/vq.h @@ -37,18 +37,10 @@ #include "entdec.h" #include "modes.h" -#if (defined(OPUS_X86_MAY_HAVE_SSE2) && !defined(FIXED_POINT)) -#include "x86/vq_sse.h" +#if defined(MIPSr1_ASM) +#include "mips/vq_mipsr1.h" #endif -void exp_rotation(celt_norm *X, int len, int dir, int stride, int K, int spread); - -opus_val16 op_pvq_search_c(celt_norm *X, int *iy, int K, int N, int arch); - -#if !defined(OVERRIDE_OP_PVQ_SEARCH) -#define op_pvq_search(x, iy, K, N, arch) \ - (op_pvq_search_c(x, iy, K, N, arch)) -#endif /** Algebraic pulse-vector quantiser. The signal x is replaced by the sum of * the pitch and a combination of pulses such that its norm is still equal @@ -59,8 +51,12 @@ opus_val16 op_pvq_search_c(celt_norm *X, int *iy, int K, int N, int arch); * @param enc Entropy encoder state * @ret A mask indicating which blocks in the band received pulses */ -unsigned alg_quant(celt_norm *X, int N, int K, int spread, int B, ec_enc *enc, - opus_val16 gain, int resynth, int arch); +unsigned alg_quant(celt_norm *X, int N, int K, int spread, int B, + ec_enc *enc +#ifdef RESYNTH + , opus_val16 gain +#endif + ); /** Algebraic pulse decoder * @param X Decoded normalised spectrum (returned) diff --git a/thirdparty/opus/celt/x86/celt_lpc_sse4_1.c b/thirdparty/opus/celt/x86/celt_lpc_sse.c index 5478568849..67e5592acf 100644 --- a/thirdparty/opus/celt/x86/celt_lpc_sse4_1.c +++ b/thirdparty/opus/celt/x86/celt_lpc_sse.c @@ -40,23 +40,65 @@ #if defined(FIXED_POINT) -void celt_fir_sse4_1(const opus_val16 *x, +void celt_fir_sse4_1(const opus_val16 *_x, const opus_val16 *num, - opus_val16 *y, + opus_val16 *_y, int N, int ord, + opus_val16 *mem, int arch) { int i,j; VARDECL(opus_val16, rnum); + VARDECL(opus_val16, x); __m128i vecNoA; opus_int32 noA ; SAVE_STACK; ALLOC(rnum, ord, opus_val16); + ALLOC(x, N+ord, opus_val16); for(i=0;i<ord;i++) rnum[i] = num[ord-i-1]; + for(i=0;i<ord;i++) + x[i] = mem[ord-i-1]; + + for (i=0;i<N-7;i+=8) + { + x[i+ord ]=_x[i ]; + x[i+ord+1]=_x[i+1]; + x[i+ord+2]=_x[i+2]; + x[i+ord+3]=_x[i+3]; + x[i+ord+4]=_x[i+4]; + x[i+ord+5]=_x[i+5]; + x[i+ord+6]=_x[i+6]; + x[i+ord+7]=_x[i+7]; + } + + for (;i<N-3;i+=4) + { + x[i+ord ]=_x[i ]; + x[i+ord+1]=_x[i+1]; + x[i+ord+2]=_x[i+2]; + x[i+ord+3]=_x[i+3]; + } + + for (;i<N;i++) + x[i+ord]=_x[i]; + + for(i=0;i<ord;i++) + mem[i] = _x[N-i-1]; +#ifdef SMALL_FOOTPRINT + for (i=0;i<N;i++) + { + opus_val32 sum = SHL32(EXTEND32(_x[i]), SIG_SHIFT); + for (j=0;j<ord;j++) + { + sum = MAC16_16(sum,rnum[j],x[i+j]); + } + _y[i] = SATURATE16(PSHR32(sum, SIG_SHIFT)); + } +#else noA = EXTEND32(1) << SIG_SHIFT >> 1; vecNoA = _mm_set_epi32(noA, noA, noA, noA); @@ -65,24 +107,25 @@ void celt_fir_sse4_1(const opus_val16 *x, opus_val32 sums[4] = {0}; __m128i vecSum, vecX; - xcorr_kernel(rnum, x+i-ord, sums, ord, arch); + xcorr_kernel(rnum, x+i, sums, ord, arch); vecSum = _mm_loadu_si128((__m128i *)sums); vecSum = _mm_add_epi32(vecSum, vecNoA); vecSum = _mm_srai_epi32(vecSum, SIG_SHIFT); - vecX = OP_CVTEPI16_EPI32_M64(x + i); + vecX = OP_CVTEPI16_EPI32_M64(_x + i); vecSum = _mm_add_epi32(vecSum, vecX); vecSum = _mm_packs_epi32(vecSum, vecSum); - _mm_storel_epi64((__m128i *)(y + i), vecSum); + _mm_storel_epi64((__m128i *)(_y + i), vecSum); } for (;i<N;i++) { opus_val32 sum = 0; for (j=0;j<ord;j++) - sum = MAC16_16(sum, rnum[j], x[i+j-ord]); - y[i] = SATURATE16(ADD32(EXTEND32(x[i]), PSHR32(sum, SIG_SHIFT))); + sum = MAC16_16(sum, rnum[j], x[i + j]); + _y[i] = SATURATE16(ADD32(EXTEND32(_x[i]), PSHR32(sum, SIG_SHIFT))); } +#endif RESTORE_STACK; } diff --git a/thirdparty/opus/celt/x86/celt_lpc_sse.h b/thirdparty/opus/celt/x86/celt_lpc_sse.h index 7d1ecf7533..c5ec796ed5 100644 --- a/thirdparty/opus/celt/x86/celt_lpc_sse.h +++ b/thirdparty/opus/celt/x86/celt_lpc_sse.h @@ -41,11 +41,12 @@ void celt_fir_sse4_1( opus_val16 *y, int N, int ord, + opus_val16 *mem, int arch); #if defined(OPUS_X86_PRESUME_SSE4_1) -#define celt_fir(x, num, y, N, ord, arch) \ - ((void)arch, celt_fir_sse4_1(x, num, y, N, ord, arch)) +#define celt_fir(x, num, y, N, ord, mem, arch) \ + ((void)arch, celt_fir_sse4_1(x, num, y, N, ord, mem, arch)) #else @@ -55,10 +56,11 @@ extern void (*const CELT_FIR_IMPL[OPUS_ARCHMASK + 1])( opus_val16 *y, int N, int ord, + opus_val16 *mem, int arch); -# define celt_fir(x, num, y, N, ord, arch) \ - ((*CELT_FIR_IMPL[(arch) & OPUS_ARCHMASK])(x, num, y, N, ord, arch)) +# define celt_fir(x, num, y, N, ord, mem, arch) \ + ((*CELT_FIR_IMPL[(arch) & OPUS_ARCHMASK])(x, num, y, N, ord, mem, arch)) #endif #endif diff --git a/thirdparty/opus/celt/x86/vq_sse.h b/thirdparty/opus/celt/x86/vq_sse.h deleted file mode 100644 index b4efe8f249..0000000000 --- a/thirdparty/opus/celt/x86/vq_sse.h +++ /dev/null @@ -1,50 +0,0 @@ -/* Copyright (c) 2016 Jean-Marc Valin */ -/* - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER - OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#ifndef VQ_SSE_H -#define VQ_SSE_H - -#if defined(OPUS_X86_MAY_HAVE_SSE2) && !defined(FIXED_POINT) -#define OVERRIDE_OP_PVQ_SEARCH - -opus_val16 op_pvq_search_sse2(celt_norm *_X, int *iy, int K, int N, int arch); - -#if defined(OPUS_X86_PRESUME_SSE2) -#define op_pvq_search(x, iy, K, N, arch) \ - (op_pvq_search_sse2(x, iy, K, N, arch)) - -#else - -extern opus_val16 (*const OP_PVQ_SEARCH_IMPL[OPUS_ARCHMASK + 1])( - celt_norm *_X, int *iy, int K, int N, int arch); - -# define op_pvq_search(X, iy, K, N, arch) \ - ((*OP_PVQ_SEARCH_IMPL[(arch) & OPUS_ARCHMASK])(X, iy, K, N, arch)) - -#endif -#endif - -#endif diff --git a/thirdparty/opus/celt/x86/vq_sse2.c b/thirdparty/opus/celt/x86/vq_sse2.c deleted file mode 100644 index 775042860d..0000000000 --- a/thirdparty/opus/celt/x86/vq_sse2.c +++ /dev/null @@ -1,217 +0,0 @@ -/* Copyright (c) 2007-2008 CSIRO - Copyright (c) 2007-2009 Xiph.Org Foundation - Copyright (c) 2007-2016 Jean-Marc Valin */ -/* - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER - OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include <xmmintrin.h> -#include <emmintrin.h> -#include "celt_lpc.h" -#include "stack_alloc.h" -#include "mathops.h" -#include "vq.h" -#include "x86cpu.h" - - -#ifndef FIXED_POINT - -opus_val16 op_pvq_search_sse2(celt_norm *_X, int *iy, int K, int N, int arch) -{ - int i, j; - int pulsesLeft; - float xy, yy; - VARDECL(celt_norm, y); - VARDECL(celt_norm, X); - VARDECL(float, signy); - __m128 signmask; - __m128 sums; - __m128i fours; - SAVE_STACK; - - (void)arch; - /* All bits set to zero, except for the sign bit. */ - signmask = _mm_set_ps1(-0.f); - fours = _mm_set_epi32(4, 4, 4, 4); - ALLOC(y, N+3, celt_norm); - ALLOC(X, N+3, celt_norm); - ALLOC(signy, N+3, float); - - OPUS_COPY(X, _X, N); - X[N] = X[N+1] = X[N+2] = 0; - sums = _mm_setzero_ps(); - for (j=0;j<N;j+=4) - { - __m128 x4, s4; - x4 = _mm_loadu_ps(&X[j]); - s4 = _mm_cmplt_ps(x4, _mm_setzero_ps()); - /* Get rid of the sign */ - x4 = _mm_andnot_ps(signmask, x4); - sums = _mm_add_ps(sums, x4); - /* Clear y and iy in case we don't do the projection. */ - _mm_storeu_ps(&y[j], _mm_setzero_ps()); - _mm_storeu_si128((__m128i*)&iy[j], _mm_setzero_si128()); - _mm_storeu_ps(&X[j], x4); - _mm_storeu_ps(&signy[j], s4); - } - sums = _mm_add_ps(sums, _mm_shuffle_ps(sums, sums, _MM_SHUFFLE(1, 0, 3, 2))); - sums = _mm_add_ps(sums, _mm_shuffle_ps(sums, sums, _MM_SHUFFLE(2, 3, 0, 1))); - - xy = yy = 0; - - pulsesLeft = K; - - /* Do a pre-search by projecting on the pyramid */ - if (K > (N>>1)) - { - __m128i pulses_sum; - __m128 yy4, xy4; - __m128 rcp4; - opus_val32 sum = _mm_cvtss_f32(sums); - /* If X is too small, just replace it with a pulse at 0 */ - /* Prevents infinities and NaNs from causing too many pulses - to be allocated. 64 is an approximation of infinity here. */ - if (!(sum > EPSILON && sum < 64)) - { - X[0] = QCONST16(1.f,14); - j=1; do - X[j]=0; - while (++j<N); - sums = _mm_set_ps1(1.f); - } - /* Using K+e with e < 1 guarantees we cannot get more than K pulses. */ - rcp4 = _mm_mul_ps(_mm_set_ps1((float)(K+.8)), _mm_rcp_ps(sums)); - xy4 = yy4 = _mm_setzero_ps(); - pulses_sum = _mm_setzero_si128(); - for (j=0;j<N;j+=4) - { - __m128 rx4, x4, y4; - __m128i iy4; - x4 = _mm_loadu_ps(&X[j]); - rx4 = _mm_mul_ps(x4, rcp4); - iy4 = _mm_cvttps_epi32(rx4); - pulses_sum = _mm_add_epi32(pulses_sum, iy4); - _mm_storeu_si128((__m128i*)&iy[j], iy4); - y4 = _mm_cvtepi32_ps(iy4); - xy4 = _mm_add_ps(xy4, _mm_mul_ps(x4, y4)); - yy4 = _mm_add_ps(yy4, _mm_mul_ps(y4, y4)); - /* double the y[] vector so we don't have to do it in the search loop. */ - _mm_storeu_ps(&y[j], _mm_add_ps(y4, y4)); - } - pulses_sum = _mm_add_epi32(pulses_sum, _mm_shuffle_epi32(pulses_sum, _MM_SHUFFLE(1, 0, 3, 2))); - pulses_sum = _mm_add_epi32(pulses_sum, _mm_shuffle_epi32(pulses_sum, _MM_SHUFFLE(2, 3, 0, 1))); - pulsesLeft -= _mm_cvtsi128_si32(pulses_sum); - xy4 = _mm_add_ps(xy4, _mm_shuffle_ps(xy4, xy4, _MM_SHUFFLE(1, 0, 3, 2))); - xy4 = _mm_add_ps(xy4, _mm_shuffle_ps(xy4, xy4, _MM_SHUFFLE(2, 3, 0, 1))); - xy = _mm_cvtss_f32(xy4); - yy4 = _mm_add_ps(yy4, _mm_shuffle_ps(yy4, yy4, _MM_SHUFFLE(1, 0, 3, 2))); - yy4 = _mm_add_ps(yy4, _mm_shuffle_ps(yy4, yy4, _MM_SHUFFLE(2, 3, 0, 1))); - yy = _mm_cvtss_f32(yy4); - } - X[N] = X[N+1] = X[N+2] = -100; - y[N] = y[N+1] = y[N+2] = 100; - celt_sig_assert(pulsesLeft>=0); - - /* This should never happen, but just in case it does (e.g. on silence) - we fill the first bin with pulses. */ - if (pulsesLeft > N+3) - { - opus_val16 tmp = (opus_val16)pulsesLeft; - yy = MAC16_16(yy, tmp, tmp); - yy = MAC16_16(yy, tmp, y[0]); - iy[0] += pulsesLeft; - pulsesLeft=0; - } - - for (i=0;i<pulsesLeft;i++) - { - int best_id; - __m128 xy4, yy4; - __m128 max, max2; - __m128i count; - __m128i pos; - /* The squared magnitude term gets added anyway, so we might as well - add it outside the loop */ - yy = ADD16(yy, 1); - xy4 = _mm_load1_ps(&xy); - yy4 = _mm_load1_ps(&yy); - max = _mm_setzero_ps(); - pos = _mm_setzero_si128(); - count = _mm_set_epi32(3, 2, 1, 0); - for (j=0;j<N;j+=4) - { - __m128 x4, y4, r4; - x4 = _mm_loadu_ps(&X[j]); - y4 = _mm_loadu_ps(&y[j]); - x4 = _mm_add_ps(x4, xy4); - y4 = _mm_add_ps(y4, yy4); - y4 = _mm_rsqrt_ps(y4); - r4 = _mm_mul_ps(x4, y4); - /* Update the index of the max. */ - pos = _mm_max_epi16(pos, _mm_and_si128(count, _mm_castps_si128(_mm_cmpgt_ps(r4, max)))); - /* Update the max. */ - max = _mm_max_ps(max, r4); - /* Update the indices (+4) */ - count = _mm_add_epi32(count, fours); - } - /* Horizontal max */ - max2 = _mm_max_ps(max, _mm_shuffle_ps(max, max, _MM_SHUFFLE(1, 0, 3, 2))); - max2 = _mm_max_ps(max2, _mm_shuffle_ps(max2, max2, _MM_SHUFFLE(2, 3, 0, 1))); - /* Now that max2 contains the max at all positions, look at which value(s) of the - partial max is equal to the global max. */ - pos = _mm_and_si128(pos, _mm_castps_si128(_mm_cmpeq_ps(max, max2))); - pos = _mm_max_epi16(pos, _mm_unpackhi_epi64(pos, pos)); - pos = _mm_max_epi16(pos, _mm_shufflelo_epi16(pos, _MM_SHUFFLE(1, 0, 3, 2))); - best_id = _mm_cvtsi128_si32(pos); - - /* Updating the sums of the new pulse(s) */ - xy = ADD32(xy, EXTEND32(X[best_id])); - /* We're multiplying y[j] by two so we don't have to do it here */ - yy = ADD16(yy, y[best_id]); - - /* Only now that we've made the final choice, update y/iy */ - /* Multiplying y[j] by 2 so we don't have to do it everywhere else */ - y[best_id] += 2; - iy[best_id]++; - } - - /* Put the original sign back */ - for (j=0;j<N;j+=4) - { - __m128i y4; - __m128i s4; - y4 = _mm_loadu_si128((__m128i*)&iy[j]); - s4 = _mm_castps_si128(_mm_loadu_ps(&signy[j])); - y4 = _mm_xor_si128(_mm_add_epi32(y4, s4), s4); - _mm_storeu_si128((__m128i*)&iy[j], y4); - } - RESTORE_STACK; - return yy; -} - -#endif diff --git a/thirdparty/opus/celt/x86/x86_celt_map.c b/thirdparty/opus/celt/x86/x86_celt_map.c index d39d88edec..47ba41b9ee 100644 --- a/thirdparty/opus/celt/x86/x86_celt_map.c +++ b/thirdparty/opus/celt/x86/x86_celt_map.c @@ -33,7 +33,6 @@ #include "celt_lpc.h" #include "pitch.h" #include "pitch_sse.h" -#include "vq.h" #if defined(OPUS_HAVE_RTCD) @@ -47,6 +46,7 @@ void (*const CELT_FIR_IMPL[OPUS_ARCHMASK + 1])( opus_val16 *y, int N, int ord, + opus_val16 *mem, int arch ) = { celt_fir_c, /* non-sse */ @@ -151,17 +151,5 @@ void (*const COMB_FILTER_CONST_IMPL[OPUS_ARCHMASK + 1])( #endif -#if defined(OPUS_X86_MAY_HAVE_SSE2) && !defined(OPUS_X86_PRESUME_SSE2) -opus_val16 (*const OP_PVQ_SEARCH_IMPL[OPUS_ARCHMASK + 1])( - celt_norm *_X, int *iy, int K, int N, int arch -) = { - op_pvq_search_c, /* non-sse */ - op_pvq_search_c, - MAY_HAVE_SSE2(op_pvq_search), - MAY_HAVE_SSE2(op_pvq_search), - MAY_HAVE_SSE2(op_pvq_search) -}; -#endif - #endif #endif diff --git a/thirdparty/opus/celt/x86/x86cpu.h b/thirdparty/opus/celt/x86/x86cpu.h index 1e2bf17b9b..04fd48aac4 100644 --- a/thirdparty/opus/celt/x86/x86cpu.h +++ b/thirdparty/opus/celt/x86/x86cpu.h @@ -82,9 +82,7 @@ int opus_select_arch(void); (_mm_cvtepi8_epi32(*(__m128i *)(x))) #endif -/* similar reasoning about the instruction sequence as in the 32-bit macro above, - */ -# if defined(__clang__) || !defined(__OPTIMIZE__) +# if !defined(__OPTIMIZE__) # define OP_CVTEPI16_EPI32_M64(x) \ (_mm_cvtepi16_epi32(_mm_loadl_epi64((__m128i *)(x)))) # else diff --git a/thirdparty/opus/config.h b/thirdparty/opus/config.h index 3ed0874d4b..7b9c92c6a8 100644 --- a/thirdparty/opus/config.h +++ b/thirdparty/opus/config.h @@ -1,44 +1,5 @@ -/* config.h. Generated from config.h.in by configure. */ -/* config.h.in. Generated from configure.ac by autoheader. */ - -/* Get CPU Info by asm method */ -#define CPU_INFO_BY_ASM 1 - -/* Get CPU Info by c method */ -/* #undef CPU_INFO_BY_C */ - -/* Custom modes */ -/* #undef CUSTOM_MODES */ - -/* Do not build the float API */ -/* #undef DISABLE_FLOAT_API */ - -/* Disable bitstream fixes from RFC 8251 */ -/* #undef DISABLE_UPDATE_DRAFT */ - -/* Assertions */ -/* #undef ENABLE_ASSERTIONS */ - -/* Hardening */ -#define ENABLE_HARDENING 1 - -/* Debug fixed-point implementation */ -/* #undef FIXED_DEBUG */ - -/* Compile as fixed-point (for machines without a fast enough FPU) */ -/* #undef FIXED_POINT */ - -/* Float approximations */ -/* #undef FLOAT_APPROX */ - -/* Fuzzing */ -/* #undef FUZZING */ - -/* Define to 1 if you have the <alloca.h> header file. */ -/* #undef HAVE_ALLOCA_H */ - -/* NE10 library is installed on host. Make sure it is on target! */ -/* #undef HAVE_ARM_NE10 */ +/* Opus configuration header */ +/* Based on the output of libopus configure script */ /* Define to 1 if you have the <dlfcn.h> header file. */ #define HAVE_DLFCN_H 1 @@ -46,12 +7,16 @@ /* Define to 1 if you have the <inttypes.h> header file. */ #define HAVE_INTTYPES_H 1 +#if (!defined( _MSC_VER ) || ( _MSC_VER >= 1800 )) + /* Define to 1 if you have the `lrint' function. */ #define HAVE_LRINT 1 /* Define to 1 if you have the `lrintf' function. */ #define HAVE_LRINTF 1 +#endif + /* Define to 1 if you have the <memory.h> header file. */ #define HAVE_MEMORY_H 1 @@ -76,10 +41,8 @@ /* Define to 1 if you have the <unistd.h> header file. */ #define HAVE_UNISTD_H 1 -/* Define to 1 if you have the `__malloc_hook' function. */ -#define HAVE___MALLOC_HOOK 1 - -/* Define to the sub-directory where libtool stores uninstalled libraries. */ +/* Define to the sub-directory in which libtool stores uninstalled libraries. + */ #define LT_OBJDIR ".libs/" #ifdef OPUS_ARM_OPT @@ -129,80 +92,9 @@ #endif // OPUS_ARM64_OPT -/* Define if binary requires Aarch64 Neon Intrinsics */ -/* #undef OPUS_ARM_PRESUME_AARCH64_NEON_INTR */ - -/* Define if binary requires EDSP instruction support */ -/* #undef OPUS_ARM_PRESUME_EDSP */ - -/* Define if binary requires ARMv6 media instruction support */ -/* #undef OPUS_ARM_PRESUME_MEDIA */ - -/* Define if binary requires NEON instruction support */ -/* #undef OPUS_ARM_PRESUME_NEON */ - -/* Define if binary requires NEON intrinsics support */ -/* #undef OPUS_ARM_PRESUME_NEON_INTR */ - /* This is a build of OPUS */ #define OPUS_BUILD /**/ -/* Run bit-exactness checks between optimized and c implementations */ -/* #undef OPUS_CHECK_ASM */ - -#ifndef OPUS_ARM_OPT -/* Use run-time CPU capabilities detection */ -#define OPUS_HAVE_RTCD 1 -#endif - -/* Compiler supports X86 AVX Intrinsics */ -/* #define OPUS_X86_MAY_HAVE_AVX */ - -/* Compiler supports X86 SSE Intrinsics */ -/* #define OPUS_X86_MAY_HAVE_SSE */ - -/* Compiler supports X86 SSE2 Intrinsics */ -/* #define OPUS_X86_MAY_HAVE_SSE2 */ - -/* Compiler supports X86 SSE4.1 Intrinsics */ -/* #define OPUS_X86_MAY_HAVE_SSE4_1 */ - -/* Define if binary requires AVX intrinsics support */ -/* #undef OPUS_X86_PRESUME_AVX */ - -/* Define if binary requires SSE intrinsics support */ -#define OPUS_X86_PRESUME_SSE 1 - -/* Define if binary requires SSE2 intrinsics support */ -#define OPUS_X86_PRESUME_SSE2 1 - -/* Define if binary requires SSE4.1 intrinsics support */ -#define OPUS_X86_PRESUME_SSE4_1 1 - -/* Define to the address where bug reports for this package should be sent. */ -#define PACKAGE_BUGREPORT "opus@xiph.org" - -/* Define to the full name of this package. */ -#define PACKAGE_NAME "opus" - -/* Define to the full name and version of this package. */ -#define PACKAGE_STRING "opus 1.3.1" - -/* Define to the one symbol short name of this package. */ -#define PACKAGE_TARNAME "opus" - -/* Define to the home page for this package. */ -#define PACKAGE_URL "" - -/* Define to the version of this package. */ -#define PACKAGE_VERSION "1.3.1" - -/* Define to 1 if you have the ANSI C header files. */ -#define STDC_HEADERS 1 - -/* Make use of alloca */ -/* #undef USE_ALLOCA */ - #ifndef WIN32 /* Use C99 variable-size arrays */ #define VAR_ARRAYS 1 @@ -211,13 +103,11 @@ #define USE_ALLOCA 1 #endif -/* Define to empty if `const' does not conform to ANSI C. */ -/* #undef const */ - #ifndef OPUS_FIXED_POINT #define FLOAT_APPROX 1 #endif + /* Define to `__inline__' or `__inline' if that's what the C compiler calls it, or to nothing if 'inline' is not supported under any name. */ #ifndef __cplusplus @@ -227,7 +117,11 @@ /* Define to the equivalent of the C99 'restrict' keyword, or to nothing if this is not supported. Do not define if restrict is supported directly. */ +#if (!defined( _MSC_VER ) || ( _MSC_VER >= 1800 )) #define restrict __restrict +#else +#undef restrict +#endif /* Work around a bug in Sun C++: it does not support _Restrict or __restrict__, even though the corresponding Sun C compiler ends up with "#define restrict _Restrict" or "#define restrict __restrict__" in the diff --git a/thirdparty/opus/info.c b/thirdparty/opus/info.c index 3a1a5bf75b..c36f9a9ee1 100644 --- a/thirdparty/opus/info.c +++ b/thirdparty/opus/info.c @@ -107,32 +107,26 @@ static int op_tags_ensure_capacity(OpusTags *_tags,size_t _ncomments){ char **user_comments; int *comment_lengths; int cur_ncomments; + char *binary_suffix_data; + int binary_suffix_len; size_t size; if(OP_UNLIKELY(_ncomments>=(size_t)INT_MAX))return OP_EFAULT; size=sizeof(*_tags->comment_lengths)*(_ncomments+1); if(size/sizeof(*_tags->comment_lengths)!=_ncomments+1)return OP_EFAULT; cur_ncomments=_tags->comments; - /*We only support growing. - Trimming requires cleaning up the allocated strings in the old space, and - is best handled separately if it's ever needed.*/ - OP_ASSERT(_ncomments>=(size_t)cur_ncomments); + comment_lengths=_tags->comment_lengths; + binary_suffix_len=comment_lengths==NULL?0:comment_lengths[cur_ncomments]; comment_lengths=(int *)_ogg_realloc(_tags->comment_lengths,size); if(OP_UNLIKELY(comment_lengths==NULL))return OP_EFAULT; - if(_tags->comment_lengths==NULL){ - OP_ASSERT(cur_ncomments==0); - comment_lengths[cur_ncomments]=0; - } - comment_lengths[_ncomments]=comment_lengths[cur_ncomments]; + comment_lengths[_ncomments]=binary_suffix_len; _tags->comment_lengths=comment_lengths; size=sizeof(*_tags->user_comments)*(_ncomments+1); if(size/sizeof(*_tags->user_comments)!=_ncomments+1)return OP_EFAULT; + user_comments=_tags->user_comments; + binary_suffix_data=user_comments==NULL?NULL:user_comments[cur_ncomments]; user_comments=(char **)_ogg_realloc(_tags->user_comments,size); if(OP_UNLIKELY(user_comments==NULL))return OP_EFAULT; - if(_tags->user_comments==NULL){ - OP_ASSERT(cur_ncomments==0); - user_comments[cur_ncomments]=NULL; - } - user_comments[_ncomments]=user_comments[cur_ncomments]; + user_comments[_ncomments]=binary_suffix_data; _tags->user_comments=user_comments; return 0; } @@ -281,30 +275,28 @@ int opus_tags_copy(OpusTags *_dst,const OpusTags *_src){ ret=opus_tags_copy_impl(&dst,_src); if(OP_UNLIKELY(ret<0))opus_tags_clear(&dst); else *_dst=*&dst; - return ret; + return 0; } int opus_tags_add(OpusTags *_tags,const char *_tag,const char *_value){ - char *comment; - size_t tag_len; - size_t value_len; - int ncomments; - int ret; + char *comment; + int tag_len; + int value_len; + int ncomments; + int ret; ncomments=_tags->comments; ret=op_tags_ensure_capacity(_tags,ncomments+1); if(OP_UNLIKELY(ret<0))return ret; tag_len=strlen(_tag); value_len=strlen(_value); /*+2 for '=' and '\0'.*/ - if(tag_len+value_len<tag_len)return OP_EFAULT; - if(tag_len+value_len>(size_t)INT_MAX-2)return OP_EFAULT; comment=(char *)_ogg_malloc(sizeof(*comment)*(tag_len+value_len+2)); if(OP_UNLIKELY(comment==NULL))return OP_EFAULT; memcpy(comment,_tag,sizeof(*comment)*tag_len); comment[tag_len]='='; memcpy(comment+tag_len+1,_value,sizeof(*comment)*(value_len+1)); _tags->user_comments[ncomments]=comment; - _tags->comment_lengths[ncomments]=(int)(tag_len+value_len+1); + _tags->comment_lengths[ncomments]=tag_len+value_len+1; _tags->comments=ncomments+1; return 0; } @@ -345,10 +337,7 @@ int opus_tags_set_binary_suffix(OpusTags *_tags, } int opus_tagcompare(const char *_tag_name,const char *_comment){ - size_t tag_len; - tag_len=strlen(_tag_name); - if(OP_UNLIKELY(tag_len>(size_t)INT_MAX))return -1; - return opus_tagncompare(_tag_name,(int)tag_len,_comment); + return opus_tagncompare(_tag_name,strlen(_tag_name),_comment); } int opus_tagncompare(const char *_tag_name,int _tag_len,const char *_comment){ @@ -359,18 +348,17 @@ int opus_tagncompare(const char *_tag_name,int _tag_len,const char *_comment){ } const char *opus_tags_query(const OpusTags *_tags,const char *_tag,int _count){ - char **user_comments; - size_t tag_len; - int found; - int ncomments; - int ci; + char **user_comments; + int tag_len; + int found; + int ncomments; + int ci; tag_len=strlen(_tag); - if(OP_UNLIKELY(tag_len>(size_t)INT_MAX))return NULL; ncomments=_tags->comments; user_comments=_tags->user_comments; found=0; for(ci=0;ci<ncomments;ci++){ - if(!opus_tagncompare(_tag,(int)tag_len,user_comments[ci])){ + if(!opus_tagncompare(_tag,tag_len,user_comments[ci])){ /*We return a pointer to the data, not a copy.*/ if(_count==found++)return user_comments[ci]+tag_len+1; } @@ -380,18 +368,17 @@ const char *opus_tags_query(const OpusTags *_tags,const char *_tag,int _count){ } int opus_tags_query_count(const OpusTags *_tags,const char *_tag){ - char **user_comments; - size_t tag_len; - int found; - int ncomments; - int ci; + char **user_comments; + int tag_len; + int found; + int ncomments; + int ci; tag_len=strlen(_tag); - if(OP_UNLIKELY(tag_len>(size_t)INT_MAX))return 0; ncomments=_tags->comments; user_comments=_tags->user_comments; found=0; for(ci=0;ci<ncomments;ci++){ - if(!opus_tagncompare(_tag,(int)tag_len,user_comments[ci]))found++; + if(!opus_tagncompare(_tag,tag_len,user_comments[ci]))found++; } return found; } @@ -416,8 +403,7 @@ static int opus_tags_get_gain(const OpusTags *_tags,int *_gain_q8, ncomments=_tags->comments; /*Look for the first valid tag with the name _tag_name and use that.*/ for(ci=0;ci<ncomments;ci++){ - OP_ASSERT(_tag_len<=(size_t)INT_MAX); - if(opus_tagncompare(_tag_name,(int)_tag_len,comments[ci])==0){ + if(opus_tagncompare(_tag_name,_tag_len,comments[ci])==0){ char *p; opus_int32 gain_q8; int negative; @@ -453,7 +439,8 @@ int opus_tags_get_track_gain(const OpusTags *_tags,int *_gain_q8){ } static int op_is_jpeg(const unsigned char *_buf,size_t _buf_sz){ - return _buf_sz>=3&&memcmp(_buf,"\xFF\xD8\xFF",3)==0; + return _buf_sz>=11&&memcmp(_buf,"\xFF\xD8\xFF\xE0",4)==0 + &&(_buf[4]<<8|_buf[5])>=16&&memcmp(_buf+6,"JFIF",5)==0; } /*Tries to extract the width, height, bits per pixel, and palette size of a diff --git a/thirdparty/opus/internal.h b/thirdparty/opus/internal.h index 9ac17e028f..ee48ea34c9 100644 --- a/thirdparty/opus/internal.h +++ b/thirdparty/opus/internal.h @@ -136,9 +136,6 @@ struct OggOpusLink{ that end-trimming calculations work properly. This is only valid for seekable sources.*/ opus_int64 end_offset; - /*The total duration of all prior links. - This is always zero for non-seekable sources.*/ - ogg_int64_t pcm_file_offset; /*The granule position of the last sample. This is only valid for seekable sources.*/ ogg_int64_t pcm_end; @@ -153,25 +150,23 @@ struct OggOpusLink{ }; struct OggOpusFile{ - /*The callbacks used to access the stream.*/ + /*The callbacks used to access the data source.*/ OpusFileCallbacks callbacks; - /*A FILE *, memory buffer, etc.*/ - void *stream; - /*Whether or not we can seek with this stream.*/ + /*A FILE *, memory bufer, etc.*/ + void *source; + /*Whether or not we can seek with this data source.*/ int seekable; /*The number of links in this chained Ogg Opus file.*/ int nlinks; /*The cached information from each link in a chained Ogg Opus file. - If stream isn't seekable (e.g., it's a pipe), only the current link + If source isn't seekable (e.g., it's a pipe), only the current link appears.*/ OggOpusLink *links; /*The number of serial numbers from a single link.*/ int nserialnos; /*The capacity of the list of serial numbers from a single link.*/ int cserialnos; - /*Storage for the list of serial numbers from a single link. - This is a scratch buffer used when scanning the BOS pages at the start of - each link.*/ + /*Storage for the list of serial numbers from a single link.*/ ogg_uint32_t *serialnos; /*This is the current offset of the data processed by the ogg_sync_state. After a seek, this should be set to the target offset so that we can track @@ -179,9 +174,9 @@ struct OggOpusFile{ After a call to op_get_next_page(), this will point to the first byte after that page.*/ opus_int64 offset; - /*The total size of this stream, or -1 if it's unseekable.*/ + /*The total size of this data source, or -1 if it's unseekable.*/ opus_int64 end; - /*Used to locate pages in the stream.*/ + /*Used to locate pages in the data source.*/ ogg_sync_state oy; /*One of OP_NOTOPEN, OP_PARTOPEN, OP_OPENED, OP_STREAMSET, OP_INITSET.*/ int ready_state; @@ -232,7 +227,7 @@ struct OggOpusFile{ /*The number of valid samples in the decoded buffer.*/ int od_buffer_size; /*The type of gain offset to apply. - One of OP_HEADER_GAIN, OP_ALBUM_GAIN, OP_TRACK_GAIN, or OP_ABSOLUTE_GAIN.*/ + One of OP_HEADER_GAIN, OP_TRACK_GAIN, or OP_ABSOLUTE_GAIN.*/ int gain_type; /*The offset to apply to the gain.*/ opus_int32 gain_offset_q8; diff --git a/thirdparty/opus/mapping_matrix.c b/thirdparty/opus/mapping_matrix.c deleted file mode 100644 index 31298af057..0000000000 --- a/thirdparty/opus/mapping_matrix.c +++ /dev/null @@ -1,378 +0,0 @@ -/* Copyright (c) 2017 Google Inc. - Written by Andrew Allen */ -/* - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER - OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "arch.h" -#include "float_cast.h" -#include "opus_private.h" -#include "opus_defines.h" -#include "mapping_matrix.h" - -#define MATRIX_INDEX(nb_rows, row, col) (nb_rows * col + row) - -opus_int32 mapping_matrix_get_size(int rows, int cols) -{ - opus_int32 size; - - /* Mapping Matrix must only support up to 255 channels in or out. - * Additionally, the total cell count must be <= 65004 octets in order - * for the matrix to be stored in an OGG header. - */ - if (rows > 255 || cols > 255) - return 0; - size = rows * (opus_int32)cols * sizeof(opus_int16); - if (size > 65004) - return 0; - - return align(sizeof(MappingMatrix)) + align(size); -} - -opus_int16 *mapping_matrix_get_data(const MappingMatrix *matrix) -{ - /* void* cast avoids clang -Wcast-align warning */ - return (opus_int16*)(void*)((char*)matrix + align(sizeof(MappingMatrix))); -} - -void mapping_matrix_init(MappingMatrix * const matrix, - int rows, int cols, int gain, const opus_int16 *data, opus_int32 data_size) -{ - int i; - opus_int16 *ptr; - -#if !defined(ENABLE_ASSERTIONS) - (void)data_size; -#endif - celt_assert(align(data_size) == align(rows * cols * sizeof(opus_int16))); - - matrix->rows = rows; - matrix->cols = cols; - matrix->gain = gain; - ptr = mapping_matrix_get_data(matrix); - for (i = 0; i < rows * cols; i++) - { - ptr[i] = data[i]; - } -} - -#ifndef DISABLE_FLOAT_API -void mapping_matrix_multiply_channel_in_float( - const MappingMatrix *matrix, - const float *input, - int input_rows, - opus_val16 *output, - int output_row, - int output_rows, - int frame_size) -{ - /* Matrix data is ordered col-wise. */ - opus_int16* matrix_data; - int i, col; - - celt_assert(input_rows <= matrix->cols && output_rows <= matrix->rows); - - matrix_data = mapping_matrix_get_data(matrix); - - for (i = 0; i < frame_size; i++) - { - float tmp = 0; - for (col = 0; col < input_rows; col++) - { - tmp += - matrix_data[MATRIX_INDEX(matrix->rows, output_row, col)] * - input[MATRIX_INDEX(input_rows, col, i)]; - } -#if defined(FIXED_POINT) - output[output_rows * i] = FLOAT2INT16((1/32768.f)*tmp); -#else - output[output_rows * i] = (1/32768.f)*tmp; -#endif - } -} - -void mapping_matrix_multiply_channel_out_float( - const MappingMatrix *matrix, - const opus_val16 *input, - int input_row, - int input_rows, - float *output, - int output_rows, - int frame_size -) -{ - /* Matrix data is ordered col-wise. */ - opus_int16* matrix_data; - int i, row; - float input_sample; - - celt_assert(input_rows <= matrix->cols && output_rows <= matrix->rows); - - matrix_data = mapping_matrix_get_data(matrix); - - for (i = 0; i < frame_size; i++) - { -#if defined(FIXED_POINT) - input_sample = (1/32768.f)*input[input_rows * i]; -#else - input_sample = input[input_rows * i]; -#endif - for (row = 0; row < output_rows; row++) - { - float tmp = - (1/32768.f)*matrix_data[MATRIX_INDEX(matrix->rows, row, input_row)] * - input_sample; - output[MATRIX_INDEX(output_rows, row, i)] += tmp; - } - } -} -#endif /* DISABLE_FLOAT_API */ - -void mapping_matrix_multiply_channel_in_short( - const MappingMatrix *matrix, - const opus_int16 *input, - int input_rows, - opus_val16 *output, - int output_row, - int output_rows, - int frame_size) -{ - /* Matrix data is ordered col-wise. */ - opus_int16* matrix_data; - int i, col; - - celt_assert(input_rows <= matrix->cols && output_rows <= matrix->rows); - - matrix_data = mapping_matrix_get_data(matrix); - - for (i = 0; i < frame_size; i++) - { - opus_val32 tmp = 0; - for (col = 0; col < input_rows; col++) - { -#if defined(FIXED_POINT) - tmp += - ((opus_int32)matrix_data[MATRIX_INDEX(matrix->rows, output_row, col)] * - (opus_int32)input[MATRIX_INDEX(input_rows, col, i)]) >> 8; -#else - tmp += - matrix_data[MATRIX_INDEX(matrix->rows, output_row, col)] * - input[MATRIX_INDEX(input_rows, col, i)]; -#endif - } -#if defined(FIXED_POINT) - output[output_rows * i] = (opus_int16)((tmp + 64) >> 7); -#else - output[output_rows * i] = (1/(32768.f*32768.f))*tmp; -#endif - } -} - -void mapping_matrix_multiply_channel_out_short( - const MappingMatrix *matrix, - const opus_val16 *input, - int input_row, - int input_rows, - opus_int16 *output, - int output_rows, - int frame_size) -{ - /* Matrix data is ordered col-wise. */ - opus_int16* matrix_data; - int i, row; - opus_int32 input_sample; - - celt_assert(input_rows <= matrix->cols && output_rows <= matrix->rows); - - matrix_data = mapping_matrix_get_data(matrix); - - for (i = 0; i < frame_size; i++) - { -#if defined(FIXED_POINT) - input_sample = (opus_int32)input[input_rows * i]; -#else - input_sample = (opus_int32)FLOAT2INT16(input[input_rows * i]); -#endif - for (row = 0; row < output_rows; row++) - { - opus_int32 tmp = - (opus_int32)matrix_data[MATRIX_INDEX(matrix->rows, row, input_row)] * - input_sample; - output[MATRIX_INDEX(output_rows, row, i)] += (tmp + 16384) >> 15; - } - } -} - -const MappingMatrix mapping_matrix_foa_mixing = { 6, 6, 0 }; -const opus_int16 mapping_matrix_foa_mixing_data[36] = { - 16384, 0, -16384, 23170, 0, 0, 16384, 23170, - 16384, 0, 0, 0, 16384, 0, -16384, -23170, - 0, 0, 16384, -23170, 16384, 0, 0, 0, - 0, 0, 0, 0, 32767, 0, 0, 0, - 0, 0, 0, 32767 -}; - -const MappingMatrix mapping_matrix_soa_mixing = { 11, 11, 0 }; -const opus_int16 mapping_matrix_soa_mixing_data[121] = { - 10923, 7723, 13377, -13377, 11585, 9459, 7723, -16384, - -6689, 0, 0, 10923, 7723, 13377, 13377, -11585, - 9459, 7723, 16384, -6689, 0, 0, 10923, -15447, - 13377, 0, 0, -18919, 7723, 0, 13377, 0, - 0, 10923, 7723, -13377, -13377, 11585, -9459, 7723, - 16384, -6689, 0, 0, 10923, -7723, 0, 13377, - -16384, 0, -15447, 0, 9459, 0, 0, 10923, - -7723, 0, -13377, 16384, 0, -15447, 0, 9459, - 0, 0, 10923, 15447, 0, 0, 0, 0, - -15447, 0, -18919, 0, 0, 10923, 7723, -13377, - 13377, -11585, -9459, 7723, -16384, -6689, 0, 0, - 10923, -15447, -13377, 0, 0, 18919, 7723, 0, - 13377, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 32767, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 32767 -}; - -const MappingMatrix mapping_matrix_toa_mixing = { 18, 18, 0 }; -const opus_int16 mapping_matrix_toa_mixing_data[324] = { - 8208, 0, -881, 14369, 0, 0, -8192, -4163, - 13218, 0, 0, 0, 11095, -8836, -6218, 14833, - 0, 0, 8208, -10161, 881, 10161, -13218, -2944, - -8192, 2944, 0, -10488, -6218, 6248, -11095, -6248, - 0, -10488, 0, 0, 8208, 10161, 881, -10161, - -13218, 2944, -8192, -2944, 0, 10488, -6218, -6248, - -11095, 6248, 0, 10488, 0, 0, 8176, 5566, - -11552, 5566, 9681, -11205, 8192, -11205, 0, 4920, - -15158, 9756, -3334, 9756, 0, -4920, 0, 0, - 8176, 7871, 11552, 0, 0, 15846, 8192, 0, - -9681, -6958, 0, 13797, 3334, 0, -15158, 0, - 0, 0, 8176, 0, 11552, 7871, 0, 0, - 8192, 15846, 9681, 0, 0, 0, 3334, 13797, - 15158, 6958, 0, 0, 8176, 5566, -11552, -5566, - -9681, -11205, 8192, 11205, 0, 4920, 15158, 9756, - -3334, -9756, 0, 4920, 0, 0, 8208, 14369, - -881, 0, 0, -4163, -8192, 0, -13218, -14833, - 0, -8836, 11095, 0, 6218, 0, 0, 0, - 8208, 10161, 881, 10161, 13218, 2944, -8192, 2944, - 0, 10488, 6218, -6248, -11095, -6248, 0, -10488, - 0, 0, 8208, -14369, -881, 0, 0, 4163, - -8192, 0, -13218, 14833, 0, 8836, 11095, 0, - 6218, 0, 0, 0, 8208, 0, -881, -14369, - 0, 0, -8192, 4163, 13218, 0, 0, 0, - 11095, 8836, -6218, -14833, 0, 0, 8176, -5566, - -11552, 5566, -9681, 11205, 8192, -11205, 0, -4920, - 15158, -9756, -3334, 9756, 0, -4920, 0, 0, - 8176, 0, 11552, -7871, 0, 0, 8192, -15846, - 9681, 0, 0, 0, 3334, -13797, 15158, -6958, - 0, 0, 8176, -7871, 11552, 0, 0, -15846, - 8192, 0, -9681, 6958, 0, -13797, 3334, 0, - -15158, 0, 0, 0, 8176, -5566, -11552, -5566, - 9681, 11205, 8192, 11205, 0, -4920, -15158, -9756, - -3334, -9756, 0, 4920, 0, 0, 8208, -10161, - 881, -10161, 13218, -2944, -8192, -2944, 0, -10488, - 6218, 6248, -11095, 6248, 0, 10488, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 32767, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 32767 -}; - -const MappingMatrix mapping_matrix_foa_demixing = { 6, 6, 0 }; -const opus_int16 mapping_matrix_foa_demixing_data[36] = { - 16384, 16384, 16384, 16384, 0, 0, 0, 23170, - 0, -23170, 0, 0, -16384, 16384, -16384, 16384, - 0, 0, 23170, 0, -23170, 0, 0, 0, - 0, 0, 0, 0, 32767, 0, 0, 0, - 0, 0, 0, 32767 -}; - -const MappingMatrix mapping_matrix_soa_demixing = { 11, 11, 3050 }; -const opus_int16 mapping_matrix_soa_demixing_data[121] = { - 2771, 2771, 2771, 2771, 2771, 2771, 2771, 2771, - 2771, 0, 0, 10033, 10033, -20066, 10033, 14189, - 14189, -28378, 10033, -20066, 0, 0, 3393, 3393, - 3393, -3393, 0, 0, 0, -3393, -3393, 0, - 0, -17378, 17378, 0, -17378, -24576, 24576, 0, - 17378, 0, 0, 0, -14189, 14189, 0, -14189, - -28378, 28378, 0, 14189, 0, 0, 0, 2399, - 2399, -4799, -2399, 0, 0, 0, -2399, 4799, - 0, 0, 1959, 1959, 1959, 1959, -3918, -3918, - -3918, 1959, 1959, 0, 0, -4156, 4156, 0, - 4156, 0, 0, 0, -4156, 0, 0, 0, - 8192, 8192, -16384, 8192, 16384, 16384, -32768, 8192, - -16384, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 8312, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 8312 -}; - -const MappingMatrix mapping_matrix_toa_demixing = { 18, 18, 0 }; -const opus_int16 mapping_matrix_toa_demixing_data[324] = { - 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, - 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, - 0, 0, 0, -9779, 9779, 6263, 8857, 0, - 6263, 13829, 9779, -13829, 0, -6263, 0, -8857, - -6263, -9779, 0, 0, -3413, 3413, 3413, -11359, - 11359, 11359, -11359, -3413, 3413, -3413, -3413, -11359, - 11359, 11359, -11359, 3413, 0, 0, 13829, 9779, - -9779, 6263, 0, 8857, -6263, 0, 9779, 0, - -13829, 6263, -8857, 0, -6263, -9779, 0, 0, - 0, -15617, -15617, 6406, 0, 0, -6406, 0, - 15617, 0, 0, -6406, 0, 0, 6406, 15617, - 0, 0, 0, -5003, 5003, -10664, 15081, 0, - -10664, -7075, 5003, 7075, 0, 10664, 0, -15081, - 10664, -5003, 0, 0, -8176, -8176, -8176, 8208, - 8208, 8208, 8208, -8176, -8176, -8176, -8176, 8208, - 8208, 8208, 8208, -8176, 0, 0, -7075, 5003, - -5003, -10664, 0, 15081, 10664, 0, 5003, 0, - 7075, -10664, -15081, 0, 10664, -5003, 0, 0, - 15617, 0, 0, 0, -6406, 6406, 0, -15617, - 0, -15617, 15617, 0, 6406, -6406, 0, 0, - 0, 0, 0, -11393, 11393, 2993, -4233, 0, - 2993, -16112, 11393, 16112, 0, -2993, 0, 4233, - -2993, -11393, 0, 0, 0, -9974, -9974, -13617, - 0, 0, 13617, 0, 9974, 0, 0, 13617, - 0, 0, -13617, 9974, 0, 0, 0, 5579, - -5579, 10185, 14403, 0, 10185, -7890, -5579, 7890, - 0, -10185, 0, -14403, -10185, 5579, 0, 0, - 11826, -11826, -11826, -901, 901, 901, -901, 11826, - -11826, 11826, 11826, -901, 901, 901, -901, -11826, - 0, 0, -7890, -5579, 5579, 10185, 0, 14403, - -10185, 0, -5579, 0, 7890, 10185, -14403, 0, - -10185, 5579, 0, 0, -9974, 0, 0, 0, - -13617, 13617, 0, 9974, 0, 9974, -9974, 0, - 13617, -13617, 0, 0, 0, 0, 16112, -11393, - 11393, -2993, 0, 4233, 2993, 0, -11393, 0, - -16112, -2993, -4233, 0, 2993, 11393, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 32767, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 32767 -}; - diff --git a/thirdparty/opus/mapping_matrix.h b/thirdparty/opus/mapping_matrix.h deleted file mode 100644 index 98bc82df3e..0000000000 --- a/thirdparty/opus/mapping_matrix.h +++ /dev/null @@ -1,133 +0,0 @@ -/* Copyright (c) 2017 Google Inc. - Written by Andrew Allen */ -/* - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER - OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/** - * @file mapping_matrix.h - * @brief Opus reference implementation mapping matrix API - */ - -#ifndef MAPPING_MATRIX_H -#define MAPPING_MATRIX_H - -#include "opus_types.h" -#include "opus_projection.h" - -#ifdef __cplusplus -extern "C" { -#endif - -typedef struct MappingMatrix -{ - int rows; /* number of channels outputted from matrix. */ - int cols; /* number of channels inputted to matrix. */ - int gain; /* in dB. S7.8-format. */ - /* Matrix cell data goes here using col-wise ordering. */ -} MappingMatrix; - -opus_int32 mapping_matrix_get_size(int rows, int cols); - -opus_int16 *mapping_matrix_get_data(const MappingMatrix *matrix); - -void mapping_matrix_init( - MappingMatrix * const matrix, - int rows, - int cols, - int gain, - const opus_int16 *data, - opus_int32 data_size -); - -#ifndef DISABLE_FLOAT_API -void mapping_matrix_multiply_channel_in_float( - const MappingMatrix *matrix, - const float *input, - int input_rows, - opus_val16 *output, - int output_row, - int output_rows, - int frame_size -); - -void mapping_matrix_multiply_channel_out_float( - const MappingMatrix *matrix, - const opus_val16 *input, - int input_row, - int input_rows, - float *output, - int output_rows, - int frame_size -); -#endif /* DISABLE_FLOAT_API */ - -void mapping_matrix_multiply_channel_in_short( - const MappingMatrix *matrix, - const opus_int16 *input, - int input_rows, - opus_val16 *output, - int output_row, - int output_rows, - int frame_size -); - -void mapping_matrix_multiply_channel_out_short( - const MappingMatrix *matrix, - const opus_val16 *input, - int input_row, - int input_rows, - opus_int16 *output, - int output_rows, - int frame_size -); - -/* Pre-computed mixing and demixing matrices for 1st to 3rd-order ambisonics. - * foa: first-order ambisonics - * soa: second-order ambisonics - * toa: third-order ambisonics - */ -extern const MappingMatrix mapping_matrix_foa_mixing; -extern const opus_int16 mapping_matrix_foa_mixing_data[36]; - -extern const MappingMatrix mapping_matrix_soa_mixing; -extern const opus_int16 mapping_matrix_soa_mixing_data[121]; - -extern const MappingMatrix mapping_matrix_toa_mixing; -extern const opus_int16 mapping_matrix_toa_mixing_data[324]; - -extern const MappingMatrix mapping_matrix_foa_demixing; -extern const opus_int16 mapping_matrix_foa_demixing_data[36]; - -extern const MappingMatrix mapping_matrix_soa_demixing; -extern const opus_int16 mapping_matrix_soa_demixing_data[121]; - -extern const MappingMatrix mapping_matrix_toa_demixing; -extern const opus_int16 mapping_matrix_toa_demixing_data[324]; - -#ifdef __cplusplus -} -#endif - -#endif /* MAPPING_MATRIX_H */ diff --git a/thirdparty/opus/mlp.c b/thirdparty/opus/mlp.c index 964c6a98f6..ff9e50df47 100644 --- a/thirdparty/opus/mlp.c +++ b/thirdparty/opus/mlp.c @@ -1,5 +1,5 @@ /* Copyright (c) 2008-2011 Octasic Inc. - 2012-2017 Jean-Marc Valin */ + Written by Jean-Marc Valin */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -29,13 +29,42 @@ #include "config.h" #endif -#include <math.h> #include "opus_types.h" #include "opus_defines.h" + +#include <math.h> +#include "mlp.h" #include "arch.h" #include "tansig_table.h" -#include "mlp.h" +#define MAX_NEURONS 100 +#if 0 +static OPUS_INLINE opus_val16 tansig_approx(opus_val32 _x) /* Q19 */ +{ + int i; + opus_val16 xx; /* Q11 */ + /*double x, y;*/ + opus_val16 dy, yy; /* Q14 */ + /*x = 1.9073e-06*_x;*/ + if (_x>=QCONST32(8,19)) + return QCONST32(1.,14); + if (_x<=-QCONST32(8,19)) + return -QCONST32(1.,14); + xx = EXTRACT16(SHR32(_x, 8)); + /*i = lrint(25*x);*/ + i = SHR32(ADD32(1024,MULT16_16(25, xx)),11); + /*x -= .04*i;*/ + xx -= EXTRACT16(SHR32(MULT16_16(20972,i),8)); + /*x = xx*(1./2048);*/ + /*y = tansig_table[250+i];*/ + yy = tansig_table[250+i]; + /*y = yy*(1./16384);*/ + dy = 16384-MULT16_16_Q14(yy,yy); + yy = yy + MULT16_16_Q14(MULT16_16_Q11(xx,dy),(16384 - MULT16_16_Q11(yy,xx))); + return yy; +} +#else +/*extern const float tansig_table[501];*/ static OPUS_INLINE float tansig_approx(float x) { int i; @@ -63,82 +92,54 @@ static OPUS_INLINE float tansig_approx(float x) y = y + x*dy*(1 - y*x); return sign*y; } +#endif -static OPUS_INLINE float sigmoid_approx(float x) -{ - return .5f + .5f*tansig_approx(.5f*x); -} - -static void gemm_accum(float *out, const opus_int8 *weights, int rows, int cols, int col_stride, const float *x) -{ - int i, j; - for (i=0;i<rows;i++) - { - for (j=0;j<cols;j++) - out[i] += weights[j*col_stride + i]*x[j]; - } -} - -void compute_dense(const DenseLayer *layer, float *output, const float *input) +#if 0 +void mlp_process(const MLP *m, const opus_val16 *in, opus_val16 *out) { - int i; - int N, M; - int stride; - M = layer->nb_inputs; - N = layer->nb_neurons; - stride = N; - for (i=0;i<N;i++) - output[i] = layer->bias[i]; - gemm_accum(output, layer->input_weights, N, M, stride, input); - for (i=0;i<N;i++) - output[i] *= WEIGHTS_SCALE; - if (layer->sigmoid) { - for (i=0;i<N;i++) - output[i] = sigmoid_approx(output[i]); - } else { - for (i=0;i<N;i++) - output[i] = tansig_approx(output[i]); - } + int j; + opus_val16 hidden[MAX_NEURONS]; + const opus_val16 *W = m->weights; + /* Copy to tmp_in */ + for (j=0;j<m->topo[1];j++) + { + int k; + opus_val32 sum = SHL32(EXTEND32(*W++),8); + for (k=0;k<m->topo[0];k++) + sum = MAC16_16(sum, in[k],*W++); + hidden[j] = tansig_approx(sum); + } + for (j=0;j<m->topo[2];j++) + { + int k; + opus_val32 sum = SHL32(EXTEND32(*W++),14); + for (k=0;k<m->topo[1];k++) + sum = MAC16_16(sum, hidden[k], *W++); + out[j] = tansig_approx(EXTRACT16(PSHR32(sum,17))); + } } - -void compute_gru(const GRULayer *gru, float *state, const float *input) +#else +void mlp_process(const MLP *m, const float *in, float *out) { - int i; - int N, M; - int stride; - float tmp[MAX_NEURONS]; - float z[MAX_NEURONS]; - float r[MAX_NEURONS]; - float h[MAX_NEURONS]; - M = gru->nb_inputs; - N = gru->nb_neurons; - stride = 3*N; - /* Compute update gate. */ - for (i=0;i<N;i++) - z[i] = gru->bias[i]; - gemm_accum(z, gru->input_weights, N, M, stride, input); - gemm_accum(z, gru->recurrent_weights, N, N, stride, state); - for (i=0;i<N;i++) - z[i] = sigmoid_approx(WEIGHTS_SCALE*z[i]); - - /* Compute reset gate. */ - for (i=0;i<N;i++) - r[i] = gru->bias[N + i]; - gemm_accum(r, &gru->input_weights[N], N, M, stride, input); - gemm_accum(r, &gru->recurrent_weights[N], N, N, stride, state); - for (i=0;i<N;i++) - r[i] = sigmoid_approx(WEIGHTS_SCALE*r[i]); - - /* Compute output. */ - for (i=0;i<N;i++) - h[i] = gru->bias[2*N + i]; - for (i=0;i<N;i++) - tmp[i] = state[i] * r[i]; - gemm_accum(h, &gru->input_weights[2*N], N, M, stride, input); - gemm_accum(h, &gru->recurrent_weights[2*N], N, N, stride, tmp); - for (i=0;i<N;i++) - h[i] = z[i]*state[i] + (1-z[i])*tansig_approx(WEIGHTS_SCALE*h[i]); - for (i=0;i<N;i++) - state[i] = h[i]; + int j; + float hidden[MAX_NEURONS]; + const float *W = m->weights; + /* Copy to tmp_in */ + for (j=0;j<m->topo[1];j++) + { + int k; + float sum = *W++; + for (k=0;k<m->topo[0];k++) + sum = sum + in[k]**W++; + hidden[j] = tansig_approx(sum); + } + for (j=0;j<m->topo[2];j++) + { + int k; + float sum = *W++; + for (k=0;k<m->topo[1];k++) + sum = sum + hidden[k]**W++; + out[j] = tansig_approx(sum); + } } - +#endif diff --git a/thirdparty/opus/mlp.h b/thirdparty/opus/mlp.h index d7670550fd..618e246e2c 100644 --- a/thirdparty/opus/mlp.h +++ b/thirdparty/opus/mlp.h @@ -1,4 +1,5 @@ -/* Copyright (c) 2017 Jean-Marc Valin */ +/* Copyright (c) 2008-2011 Octasic Inc. + Written by Jean-Marc Valin */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -27,34 +28,16 @@ #ifndef _MLP_H_ #define _MLP_H_ -#include "opus_types.h" - -#define WEIGHTS_SCALE (1.f/128) - -#define MAX_NEURONS 32 +#include "arch.h" typedef struct { - const opus_int8 *bias; - const opus_int8 *input_weights; - int nb_inputs; - int nb_neurons; - int sigmoid; -} DenseLayer; - -typedef struct { - const opus_int8 *bias; - const opus_int8 *input_weights; - const opus_int8 *recurrent_weights; - int nb_inputs; - int nb_neurons; -} GRULayer; - -extern const DenseLayer layer0; -extern const GRULayer layer1; -extern const DenseLayer layer2; + int layers; + const int *topo; + const float *weights; +} MLP; -void compute_dense(const DenseLayer *layer, float *output, const float *input); +extern const MLP net; -void compute_gru(const GRULayer *gru, float *state, const float *input); +void mlp_process(const MLP *m, const float *in, float *out); #endif /* _MLP_H_ */ diff --git a/thirdparty/opus/mlp_data.c b/thirdparty/opus/mlp_data.c index ae4178df76..c2fda4e2e5 100644 --- a/thirdparty/opus/mlp_data.c +++ b/thirdparty/opus/mlp_data.c @@ -1,4 +1,5 @@ -/*This file is automatically generated from a Keras model*/ +/* The contents of this file was automatically generated by mlp_train.c + It contains multi-layer perceptron (MLP) weights. */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -6,667 +7,103 @@ #include "mlp.h" -static const opus_int8 layer0_weights[800] = { - -30, -9, 2, -12, 5, -1, 8, 9, - 9, 8, -13, 18, -17, -34, -5, 17, - -11, 0, -4, 10, 2, 10, 15, -8, - 2, -1, 0, 5, 13, -3, -16, 1, - -5, 3, 7, -28, -13, 6, 36, -3, - 19, -60, -17, -28, 7, -11, -30, -7, - 2, -42, -21, -3, 6, -22, 33, -9, - 7, -30, 21, -14, 24, -11, -20, -18, - -5, -12, 12, -49, -50, -49, 16, 9, - -37, -1, 9, 34, -13, -31, -31, 12, - 16, 44, -42, 2, -9, 8, -18, -6, - 9, 36, 19, 11, 13, 12, -21, 3, - -28, -12, 3, 33, 25, -14, 11, 1, - -94, -39, 18, -12, -11, -15, -7, 49, - 52, 10, -43, 9, 57, 8, 21, -6, - 14, -15, 44, -8, 7, -30, -13, -2, - -9, 25, -2, -127, 18, -11, -52, 26, - -27, 27, 10, -10, 7, 43, 6, -24, - 41, 10, -18, -27, 10, 17, 9, 10, - -17, -10, 20, -6, 22, 55, 35, -80, - 36, 25, -24, -36, 15, 9, -19, 88, - 19, 64, -51, -35, 17, 0, -7, 41, - -16, 27, 4, 15, -1, 18, -16, 47, - -39, -54, -8, 13, -25, -20, 102, -18, - -5, 44, 11, -28, 71, 2, -51, -5, - 5, 2, -83, -9, -29, 8, 21, -53, - 58, -37, -7, 13, 38, 9, 34, -1, - -41, 21, 4, -24, -36, -33, -21, 32, - 75, -2, 1, -68, -1, 47, -29, 32, - 20, 12, -65, -87, 5, 16, -12, 24, - 40, 15, 7, 19, -26, -17, 17, 6, - -2, -37, -30, -9, 32, -127, -39, 0, - -31, -27, 4, -22, 23, -6, -77, 35, - -61, 32, -37, -24, 13, -11, -1, -40, - -3, 17, -7, 13, 11, 59, -19, 10, - 6, -18, 0, 13, 3, -6, -23, 19, - 11, -17, 13, -1, -80, 40, -53, 69, - -29, -54, 0, -4, 33, -25, -2, 38, - 35, 36, -15, 46, 2, -13, -16, -8, - -8, 12, -24, -9, -55, -5, -9, 32, - 11, 7, 12, -18, -10, -86, -38, 54, - 37, -25, 18, -43, 7, -27, -27, -54, - 13, 9, 22, 70, 6, 35, -7, 23, - -15, -44, -6, 7, -66, -85, 32, 40, - -19, -9, -7, 12, -15, 7, 2, 6, - -35, 11, 28, 0, 26, 14, 1, 1, - 4, 12, 18, 35, 22, -18, -3, 14, - -1, 7, 14, -8, -14, -3, 4, -3, - -19, -7, -1, -25, -27, 25, -26, -2, - 33, -22, -27, -25, 4, -9, 7, 21, - 26, -30, 10, -9, -20, 11, 27, 10, - 5, -18, 14, -4, 2, -17, -5, -7, - -9, -13, 15, 29, 1, -10, -16, -10, - 35, 36, -7, -22, -44, 17, 30, 22, - 21, -1, 22, -11, 32, -8, -7, 5, - -10, 5, 30, -20, 29, -20, -34, 12, - -4, -6, 6, -13, 10, -5, -68, -1, - 24, 9, 19, -24, -64, 31, 19, 27, - -26, 75, -45, 41, 39, -42, 8, 6, - 23, -30, 16, -25, 30, 34, 8, -38, - -3, 18, 16, -31, 22, -4, -9, 1, - 20, 9, 38, -32, 0, -45, 0, -6, - -13, 11, -25, -32, -22, 31, -24, -11, - -11, -4, -4, 20, -34, 22, 20, 9, - -25, 27, -5, 28, -29, 29, 6, 21, - -6, -18, 54, 4, -46, 23, 21, -14, - -31, 36, -41, -24, 4, 22, 10, 11, - 7, 36, -32, -13, -52, -17, 24, 28, - -37, -36, -1, 24, 9, -38, 35, 48, - 18, 2, -1, 45, 10, 39, 24, -38, - 13, 8, -16, 8, 25, 11, 7, -29, - -11, 7, 20, -30, -38, -45, 14, -18, - -28, -9, 65, 61, 22, -53, -38, -16, - 36, 46, 20, -39, 32, -61, -6, -6, - -36, -33, -18, -28, 56, 101, 45, 11, - -28, -23, -29, -61, 20, -47, 2, 48, - 27, -17, 1, 40, 1, 3, -51, 15, - 35, 28, 22, 35, 53, -61, -29, 12, - -6, -21, 10, 3, -20, 2, -25, 1, - -6, 31, 11, -3, 1, -10, -52, 6, - 126, -105, 122, 127, -128, 127, 127, -128, - 127, 108, 12, 127, 48, -128, -36, -128, - 127, 127, -128, -128, 127, 89, -128, 127, - -128, -128, -128, 127, 127, -128, -128, -93, - -82, 20, 125, 65, -82, 127, 38, -74, - 81, 88, -88, 79, 51, -47, -111, -26, - 14, 83, -88, -112, 24, 35, -101, 98, - -99, -48, -45, 46, 83, -60, -79, 45, - -20, -41, 9, 4, 52, 54, 93, -10, - 4, 13, 3, 123, 6, 94, -111, -69, - -14, -31, 10, 12, 53, -79, -11, -21, - -2, -44, -72, 92, 65, -57, 56, -38, - 127, -56, -128, 127, 127, -128, 86, 117, - -75, -128, 127, -19, -99, -112, 127, -128, - 127, -48, 114, 118, -128, -128, 117, -17, - -6, 121, -128, 127, -128, 82, 54, -106, - 127, 127, -33, 100, -39, -23, 18, -78, - -34, -29, -1, -30, 127, -26, 127, -128, - 126, -128, 27, -23, -79, -120, -127, 127, - 72, 66, 29, 7, -66, -56, -117, -128 -}; - -static const opus_int8 layer0_bias[32] = { - 51, -16, 1, 13, -5, -6, -16, -7, - 11, -6, 106, 26, 28, -14, 21, -29, - 7, 18, -18, -17, 21, -17, -9, 20, - -25, -3, -34, 48, 11, -13, -31, -20 -}; - -static const opus_int8 layer1_weights[2304] = { - 22, -1, -7, 7, 29, -27, -31, -17, - -13, 33, 44, -8, 11, 33, 24, 78, - 15, 19, 30, -2, -24, 5, 49, 5, - 36, 29, -14, -11, -48, -33, 21, -42, - -38, -12, 55, -37, 54, -8, 1, 36, - 17, 0, 51, 31, 59, 7, -12, 53, - 4, 32, -14, 48, 5, -10, -16, -8, - 1, -16, -56, -24, -6, 18, -2, 23, - 6, 46, -6, -10, 20, 35, -44, -15, - -49, 36, 16, 5, -7, -79, -67, 12, - 70, -3, -79, -54, -85, -24, 47, -22, - 33, 21, 69, -1, 11, 22, 14, -16, - -16, -22, -28, -11, 11, -41, 31, -26, - -33, -19, -4, 27, 32, -50, 5, -10, - -38, -22, -8, 35, -31, 1, -41, -15, - -11, 44, 28, -17, -41, -23, 17, 2, - -23, -26, -13, -13, -17, 6, 14, -31, - -25, 9, -19, 39, -8, 4, 31, -1, - -45, -11, -28, -92, -46, -15, 21, 118, - -22, 45, -51, 11, -20, -20, -15, 13, - -21, -97, -29, -32, -23, -42, 94, 1, - 23, -8, 63, -3, -46, 19, -26, 32, - -40, -74, -26, 26, -4, -13, 30, -20, - -30, -25, -14, -31, -45, -43, 4, -60, - -48, -12, -34, 2, 2, 3, 13, 15, - 11, 16, 5, 46, -9, -55, -16, -57, - 29, 14, 38, -50, -2, -44, -11, -8, - 52, -27, -38, -7, 20, 47, 17, -59, - 0, 47, 46, -63, 35, -17, 19, 33, - 68, -19, 2, 15, -16, 28, -16, -103, - 26, -35, 47, -39, -60, 30, 31, -23, - -52, -13, 116, 47, -25, 30, 40, 30, - -22, 2, 12, -27, -18, 31, -10, 27, - -8, -66, 12, 14, 4, -26, -28, -13, - 3, 13, -26, -51, 37, 5, 2, -21, - 47, 3, 13, 25, -41, -27, -8, -4, - 5, -76, -33, 28, 10, 9, -46, -74, - 19, 28, 25, 31, 54, -55, 68, 38, - -24, -32, 2, 4, 68, 11, -1, 99, - 5, 16, -2, -74, 40, 26, -26, 33, - 31, -1, -68, 14, -6, 25, 9, 29, - 60, 61, 7, -7, 0, -24, 7, 77, - 4, -1, 16, -7, 13, -15, -19, 28, - -31, -24, -16, 37, 24, 13, 30, 10, - -30, 11, 11, -10, 22, 60, 28, 45, - -3, -40, -62, -5, -102, 9, -32, -27, - -54, 21, 15, -5, 37, -43, -11, 37, - -19, 47, -64, -128, -27, -114, 21, -66, - 59, 46, -3, -12, -87, -9, 4, 19, - -113, -36, 78, 57, -26, -38, -77, -10, - 6, 6, -75, 25, -97, -11, 33, -46, - 1, 13, -21, -33, -20, 16, -6, -3, - -11, -4, -27, 38, 8, -41, -2, -33, - 18, 19, -26, 1, -29, -22, -4, -14, - -55, -11, -80, -3, 11, 34, 90, 51, - 11, 17, 43, 36, 127, -32, 29, 103, - 9, 27, 13, 64, 56, 70, -14, 3, - -12, 10, 37, 3, 12, -22, -10, 46, - 28, 10, 20, 26, -24, 18, 9, 7, - 14, 34, -5, -7, 31, -14, -56, 11, - -18, -8, -17, -7, -10, -40, 10, -33, - -32, -43, 5, 9, 11, -4, 10, 50, - -12, -5, 46, 9, 7, 1, 11, 15, - 91, -17, 7, -50, 23, 6, -30, -99, - 0, -17, 14, 8, -10, -25, -30, -69, - -62, 31, 127, 114, -23, 101, -5, -54, - -6, -22, 7, -56, 39, 18, -29, 0, - 46, 8, -79, 4, -21, 18, -32, 62, - -12, -8, -12, -58, 31, -32, 17, 6, - -24, 25, 24, 9, -4, -19, 45, 6, - 17, -14, 5, -27, 16, -4, -41, 25, - -36, 5, 15, 12, 50, 27, 25, 23, - -44, -69, -9, -19, -48, -8, 4, 12, - -6, 13, -19, -30, -36, 26, 37, -1, - -3, -30, -42, -14, -10, -20, 26, -54, - -27, -44, 4, 73, -26, 90, 32, -69, - -29, -16, 3, 103, 15, -17, 37, 24, - -23, -31, 33, -37, -64, 25, 13, -81, - -28, -32, 27, 5, -35, -23, 15, -22, - 19, -7, 9, 30, 19, -23, 27, -13, - 43, 29, -29, -6, 9, -40, -33, -33, - -32, 9, 11, -48, -8, -23, -52, 46, - 17, -22, -42, 35, -15, -41, 16, 34, - 31, -42, -19, -11, 55, 7, -39, 89, - -11, -33, 20, -14, 22, 32, 3, -17, - -6, 14, 34, 1, 55, -21, -90, -8, - 18, 27, 13, -29, 21, 15, -33, -51, - -9, -11, 4, -16, -18, 23, -4, -4, - 48, 1, 7, 29, -14, -12, -16, 17, - 35, 8, 0, -7, -2, 9, 8, 17, - -6, 53, -32, -21, -50, 5, 99, -60, - -5, -53, 10, -31, 12, -5, 7, 80, - 36, 18, -31, 9, 98, 36, -63, -35, - 4, -13, -28, -24, 28, -13, 18, 16, - -1, -18, -34, 10, 20, 7, 4, 29, - 11, 25, -7, 36, 14, 45, 24, 1, - -16, 30, 6, 35, -6, -11, -24, 13, - -1, 27, 39, 20, 48, -11, -4, -13, - 28, 11, -31, -18, 31, -29, 22, -2, - -20, -16, 5, 30, -12, -28, -3, 93, - -16, 23, 18, -29, 6, -54, -37, 28, - -3, -3, -47, -3, -36, -55, -3, 41, - -10, 47, -2, 23, 42, -7, -71, -27, - 83, -64, 7, -24, 8, 26, -17, 15, - 12, 31, -30, -38, -13, -33, -56, 4, - -17, 20, 18, 1, -30, -5, -6, -31, - -14, -37, 0, 22, 10, -30, 37, -17, - 18, 6, 5, 23, -36, -32, 14, 18, - -13, -61, -52, -69, 44, -30, 16, 18, - -4, -25, 14, 81, 26, -8, -23, -59, - 52, -104, 17, 119, -32, 26, 17, 1, - 23, 45, 29, -64, -57, -14, 73, 21, - -13, -13, 9, -68, -7, -52, 3, 24, - -39, 44, -15, 27, 14, 19, -9, -28, - -11, 5, 3, -34, -2, 2, 22, -6, - -23, 4, 3, 13, -22, -13, -10, -18, - 29, 6, 44, -13, -24, -8, 2, 30, - 14, 43, 6, 17, -73, -6, -7, 20, - -80, -7, -7, -28, 15, -69, -38, -5, - -100, -35, 15, -79, 23, 29, -18, -27, - 21, -66, -37, 8, -22, -39, 48, 4, - -13, 1, -9, 11, -29, 22, 6, -49, - 32, -14, 47, -18, -4, 44, -52, -74, - 43, 30, 23, -14, 5, 0, -27, 4, - -7, 10, -4, 10, 1, -16, 11, -18, - -2, -5, 2, -11, 0, -20, -4, 38, - 74, 59, 39, 64, -10, 26, -3, -40, - -68, 3, -30, -51, 8, -19, -27, -46, - 51, 52, 54, 36, 90, 92, 14, 13, - -5, 0, 16, -62, 16, 11, -47, -37, - -6, -5, 21, 54, -57, 32, 42, -6, - 62, -9, 16, 21, 24, 9, -10, -4, - 33, 50, 13, -15, 1, -35, -48, 18, - -11, -17, -67, -13, 21, 38, -44, 36, - -16, 29, 17, 5, -10, 18, 17, -32, - 2, 8, 22, -56, -15, -32, 40, 43, - 19, 46, -7, -100, -96, 19, 53, 24, - 21, -26, -48, -101, -82, 61, 38, -85, - -28, -34, -1, 63, -5, -5, 39, 39, - -38, 32, -12, -28, 20, 40, -8, 2, - 31, 12, -35, -13, 20, -25, 30, 8, - 3, -13, -9, -20, 2, -13, 24, 37, - -10, 33, 6, 20, -16, -24, -6, -6, - -19, -5, 22, 21, 10, 11, -4, -39, - -1, 6, 49, 41, -15, -57, 21, -62, - 77, -69, -13, 0, -74, 1, -7, -38, - -8, 6, 63, 28, 4, 26, -52, 82, - 63, 13, 45, -33, 44, -52, -65, -21, - -46, -49, 64, -17, 32, 24, 68, -39, - -16, -5, -26, 28, 5, -61, -28, 2, - 24, 11, -12, -33, 9, -37, -3, -28, - 22, -37, -12, 19, 0, -18, -2, 14, - 1, 4, 8, -9, -2, 43, -17, -2, - -66, -31, 56, -40, -87, -36, -2, -4, - -42, -45, -1, 31, -43, -15, 27, 63, - -11, 32, -10, -33, 27, -19, 4, 15, - -26, -34, 29, -4, -39, -65, 14, -20, - -21, -17, -36, 13, 59, 47, -38, -33, - 13, -37, -8, -37, -7, -6, -76, -31, - -12, -46, 7, 24, -21, -30, -14, 9, - 15, -12, -13, 47, -27, -25, -1, -39, - 0, 20, -9, 6, 7, 4, 3, 7, - 39, 50, 22, -7, 14, -20, 1, 70, - -28, 29, -41, 10, -16, -5, -28, -2, - -37, 32, -18, 17, 62, -11, -20, -50, - 36, 21, -62, -12, -56, 52, 50, 17, - 3, 48, 44, -41, -25, 3, 16, -3, - 0, 33, -6, 15, 27, 34, -25, 22, - 9, 17, -11, 36, 16, -2, 12, 21, - -52, 45, -2, -10, 46, 21, -18, 67, - -28, -13, 30, 37, 42, 16, -9, 11, - 75, 7, -64, -40, -10, 29, 57, -23, - 5, 53, -77, 3, -17, -5, 47, -55, - -35, -36, -13, 52, -53, -71, 52, -111, - -23, -26, -28, 29, -43, 55, -19, 43, - -19, 54, -12, -33, -44, -39, -19, -10, - -31, -10, 21, 38, -57, -20, 2, -25, - 8, -6, 50, 12, 15, 25, -25, 15, - -30, -6, 9, 25, 37, 19, -4, 31, - -22, 2, 4, 2, 36, 7, 3, -34, - -80, 36, -10, -2, -5, 31, -36, 49, - -70, 20, -36, 21, 24, 25, -46, -51, - 36, -58, -48, -40, -10, 55, 71, 47, - 10, -1, 1, 2, -46, -68, 16, 13, - 0, -74, -29, 73, -52, -18, -11, 7, - -44, -82, -32, -70, -28, -1, -39, -68, - -6, -41, 12, -22, -16, 40, -11, -25, - 51, -9, 21, 4, 4, -34, 7, -78, - 16, 6, -38, -30, -2, -44, 32, 0, - 22, 64, 5, -72, -2, -14, -10, -16, - -8, -25, 12, 102, -58, 37, -10, -23, - 15, 49, 7, -7, 2, -20, -32, 45, - -6, 48, 28, 30, 33, -1, 22, -6, - 30, 65, -17, 29, 74, 37, -26, -10, - 15, -24, 19, -66, 22, -10, -31, -1, - -18, -9, 11, 37, -4, 45, 5, 41, - 17, 1, 1, 24, -58, 41, 5, -51, - 14, 8, 43, 16, -10, -1, 45, 32, - -64, 3, -33, -25, -3, -27, -68, 12, - 23, -11, -13, -37, -40, 4, -21, -12, - 32, -23, -19, 76, 41, -23, -24, -44, - -65, -1, -15, 1, 71, 63, 5, 20, - -3, 21, -23, 31, -32, 18, -2, 27, - 31, 46, -5, -39, -5, -35, 18, -18, - -40, -10, 3, 12, 2, -2, -22, 40, - 5, -6, 60, 36, 3, 29, -27, 10, - 25, -54, 5, 26, 39, 35, -24, -37, - 30, -91, 28, -4, -21, -27, -39, -6, - 5, 12, -128, 38, -16, 29, -95, -29, - 82, -2, 35, 2, 12, 8, -22, 10, - 80, -47, 2, -25, -73, -79, 16, -30, - -32, -66, 48, 21, -45, -11, -47, 14, - -27, -17, -7, 15, -44, -14, -44, -26, - -32, 26, -23, 17, -7, -28, 26, -6, - 28, 6, -26, 2, 13, -14, -23, -14, - 19, 46, 16, 2, -33, -21, 28, -17, - -42, 44, -37, 1, -39, 28, 84, -46, - 15, 10, 13, -44, 72, -26, 26, 32, - -28, -12, -83, 2, 10, -30, -44, -10, - -28, 53, 45, 65, 0, -25, 57, 36, - -33, 6, 29, 44, -53, 11, 19, -2, - -27, 35, 32, 49, 4, 23, 38, 36, - 24, 10, 51, -39, 4, -7, 26, 37, - -35, 11, -47, -18, 28, 16, -35, 42, - 17, -21, -41, 28, 14, -12, 11, -45, - 7, -43, -15, 18, -5, 38, -40, -50, - -30, -21, 9, -98, 13, 12, 23, 75, - -56, -7, -3, -4, -1, -34, 12, -49, - 11, 26, -18, -28, -17, 33, 13, -14, - 40, 24, -72, -37, 10, 17, -6, 22, - 16, 16, -6, -12, -30, -14, 10, 40, - -23, 12, 15, -3, -15, 13, -56, -4, - -30, 1, -3, -17, 27, 50, -5, 64, - -36, -19, 7, 29, 22, 25, 9, -16, - -58, -69, -40, -61, -71, -14, 42, 93, - 26, 11, -6, -58, -11, 70, -52, 19, - 9, -30, -33, 11, -37, -47, -21, -22, - -40, 10, 47, 4, -23, 17, 48, 41, - -48, 14, 10, 15, 34, -23, -2, -47, - 23, -32, -13, -10, -26, -26, -4, 16, - 38, -14, 0, -12, -7, -7, 20, 44, - -1, -32, -27, -16, 4, -6, -18, 14, - 5, 4, -29, 28, 7, -7, 15, -11, - -20, -45, -36, 16, 84, 34, -59, -30, - 22, 126, 8, 68, 79, -17, 21, -68, - 37, 5, 15, 63, 49, 127, -90, 85, - 43, 7, 16, 9, 6, -45, -57, -43, - 57, 11, -23, -11, -29, 60, -26, 0, - 7, 42, -24, 10, 23, -25, 8, -7, - -40, 19, -17, 35, 4, 27, -39, -91, - 27, -36, 34, 2, 16, -24, 25, 7, - -21, 5, 17, 10, -22, -30, 9, -17, - -61, -26, 33, 21, 58, -51, -14, 69, - -38, 20, 7, 80, -4, -65, -6, -27, - 53, -12, 47, -1, -15, 1, 60, 102, - -79, -4, 12, 9, 22, 37, -8, -4, - 37, 2, -3, -15, -16, -11, -5, 19, - -6, -43, 20, -25, -18, 10, -27, 0, - -28, -27, -11, 10, -18, -2, -4, -16, - 26, 14, -6, 7, -6, 1, 53, -2, - -29, 23, 9, -30, -6, -4, -6, 56, - 70, 0, -33, -20, -17, -9, -24, 46, - -5, -105, 47, -46, -51, 20, 20, -53, - -81, -1, -7, 75, -5, -21, -65, 12, - -52, 22, -50, -12, 49, 54, 76, -81, - 10, 45, -41, -59, 18, -19, 25, 14, - -31, -53, -5, 12, 31, 84, -23, 2, - 7, 2, 10, -32, 39, -2, -12, 1, - -9, 0, -10, -11, 9, 15, -8, -2, - 2, -1, 10, 14, -5, -40, 19, -7, - -7, 26, -4, 2, 1, -27, 35, 32, - 21, -31, 26, 43, -9, 4, -32, 40, - -62, -52, 36, 22, 38, 22, 36, -96, - 6, -10, -23, -49, 15, -33, -18, -3, - 0, 41, 21, -19, 21, 23, -39, -23, - -6, 6, 47, 56, 4, 74, 0, -98, - 29, -47, -14, -36, 21, -22, 22, 16, - 13, 12, 16, -5, 13, 17, -13, -15, - 1, -34, -26, 26, 12, 32, 27, 13, - -67, 27, 2, 8, 10, 18, 16, 20, - -17, -17, 57, -64, 5, 14, 19, 31, - -18, -44, -46, -16, 4, -25, 17, -126, - -24, 39, 4, 8, 55, -25, -34, 39, - -16, 3, 9, 71, 72, -31, -55, 6, - 10, -25, 32, -85, -21, 18, -8, 15, - 12, -27, -7, 1, -21, -2, -5, 48, - -16, 18, 1, -22, -26, 16, 14, -31, - 27, -6, -15, -21, 4, -14, 18, -36 -}; - -static const opus_int8 layer1_recur_weights[1728] = { - 20, 67, -99, 12, 41, -25, 49, -44, - 35, 81, 110, 47, 34, -66, -14, 14, - -60, 34, 29, -73, 10, 41, 35, 89, - 7, -35, 22, 7, 27, -20, -6, 56, - 26, 66, 6, 33, -55, 53, 1, -21, - 14, 17, 68, 55, 59, 0, 18, -9, - 5, -41, 6, -5, -114, -12, 29, 42, - -23, 10, 81, -27, 20, -53, -30, -62, - 40, 95, 25, -4, 3, 18, -8, -15, - -29, -82, 2, -57, -3, -61, -29, -29, - 49, 2, -55, 5, -69, -99, -49, -51, - 6, -25, 12, 89, 44, -33, 5, 41, - 1, 23, -37, -37, -28, -48, 3, 4, - -41, -30, -57, -35, -39, -1, -13, -56, - -5, 50, 49, 41, -4, -4, 33, -22, - -1, 33, 34, 18, 40, -42, 12, 1, - -6, -2, 18, 17, 39, 44, 11, 65, - -60, -45, 10, 91, 21, 9, -62, -11, - 8, 69, 37, 24, -30, 21, 26, -27, - 1, -28, 24, 66, -8, 6, -71, 34, - 24, 44, 58, -78, -19, 57, 17, -60, - 1, 12, -3, -1, -40, 22, 11, -5, - 25, 12, 1, 72, 79, 7, -50, 23, - 18, 13, 21, -11, -20, 5, 77, -94, - 24, 15, 57, -51, 3, 36, 53, -1, - 4, 14, 30, -31, 22, 40, 32, -11, - -34, -36, -59, 58, 25, 21, -54, -23, - 40, 46, 18, 0, 12, 54, -96, -99, - -59, 5, 119, -38, 50, 55, 12, -16, - 67, 0, 34, 35, 39, 35, -1, 69, - 24, 27, -30, -35, -4, -70, 2, -44, - -7, -6, 19, -9, 60, 44, -21, -10, - 37, 43, -16, -3, 30, -15, -65, 31, - -55, 18, -98, 76, 64, 25, 24, -18, - -7, -68, -10, 38, 27, -60, 36, 33, - 16, 30, 34, -39, -37, 31, 12, 53, - -54, 14, -26, -49, -128, -13, -5, -22, - -11, -85, 55, -8, -51, -11, -33, -10, - -31, -76, -41, 23, 44, -40, -54, -127, - -101, 19, -23, -15, 15, 27, 58, -60, - 8, 14, -33, 1, 48, -9, -11, -123, - 3, 53, 23, 4, -28, 22, 2, -29, - -67, 36, 12, 7, 55, -21, 88, 20, - -1, -21, -17, 3, 41, 32, -10, -14, - -5, -57, 67, 57, 21, 23, -2, -27, - -73, -24, 120, 21, 18, -35, 42, -7, - 3, -45, -25, 76, -34, 50, 11, -54, - -91, 3, -113, -20, -5, 47, 15, -47, - 17, 27, -3, -26, -7, 10, 7, 74, - -40, 64, -7, -5, -24, -49, -24, -3, - -10, 27, -17, -8, -3, 14, -27, 33, - 13, 39, 28, -7, -38, 29, 16, 44, - 19, 55, -3, 9, -13, -57, 43, 43, - 31, 0, -93, -17, 19, -56, 4, -12, - -25, 37, -85, -13, -118, 33, -17, 56, - 71, -80, -4, 6, -11, -18, 47, -52, - 25, 9, 48, -107, 1, 21, 20, -3, - 10, -16, -4, 24, 17, 31, -61, -18, - -50, 24, -10, 12, 71, 26, 11, -3, - 4, 1, 0, -7, -40, 18, 38, -34, - 38, 17, 8, -34, 2, 21, 123, -32, - -26, 43, 14, -34, -1, -9, 37, -16, - 6, -17, -62, 68, 22, 17, 11, -75, - 33, -80, 62, -9, -75, 76, 36, -41, - -8, -40, -11, -71, 40, -39, 62, -49, - -81, 16, -9, -52, 52, 61, 17, -103, - -27, -10, -8, -54, -57, 21, 23, -16, - -52, 36, 18, 10, -5, 8, 15, -29, - 5, -19, -37, 8, -53, 6, 19, -37, - 38, -17, 48, 10, 0, 81, 46, 70, - -29, 101, 11, 44, -44, -3, 24, 11, - 3, 14, -9, 11, 14, -45, 13, 46, - -3, -57, 68, 44, 63, 98, 25, -28, - -23, 15, 32, -10, 53, -6, -2, -9, - -6, 16, -107, -11, -11, -28, 59, 57, - -22, 38, 42, 83, 27, 5, 29, -30, - 12, -21, -13, 31, 38, -21, 58, -10, - -10, -15, -2, -5, 11, 12, -73, -28, - -38, 22, 2, -25, 73, -52, -12, -55, - 32, -63, 21, 51, 33, 52, -26, 55, - -26, -26, 57, -32, -4, -52, -61, 21, - -33, -91, -51, 69, -90, -53, -38, -44, - 12, -76, -20, 77, -45, -7, 86, 43, - -109, -33, -105, -40, -121, -10, 0, -72, - 45, -51, -75, -49, -38, -1, -62, 18, - -1, 30, -44, -14, -10, -67, 40, -10, - -34, 46, -64, -32, 29, -13, 33, 3, - -32, -5, 28, -27, -25, 93, 24, 68, - -40, 57, 23, -3, -21, -58, 17, -39, - -17, -22, -89, 11, 18, -46, 27, 24, - 46, 127, 61, 87, 31, 127, -36, 47, - -23, 47, 127, -24, 110, 122, 30, 100, - 0, 96, -12, 6, 50, 44, -13, 73, - 4, 55, -11, -15, 49, 42, -6, 20, - -35, 58, 18, 38, 42, 72, 19, -21, - 11, 9, -37, 7, 29, 31, 16, -17, - 13, -50, 19, 5, -23, 51, -16, -5, - 4, -24, 76, 10, -53, -28, -7, -65, - 74, 40, -16, -29, 32, -16, -49, -35, - -3, 59, -96, -50, -43, -43, -61, -15, - -8, -36, -34, -33, -14, 11, -3, -39, - 4, -114, -123, -11, -49, -21, 14, -56, - 1, 43, -63, 26, 40, 18, -10, -26, - -14, -15, -35, -35, -11, 32, -44, -67, - 2, 22, 7, 3, -9, -30, -51, -28, - 28, 6, -22, 16, 34, -25, -52, -54, - -8, -6, 5, 8, 20, -16, -17, -44, - 27, 3, 31, -5, -48, -1, -3, 116, - 11, 71, -31, -47, 109, 50, -22, -12, - -57, 32, 66, 8, -25, -93, -54, -10, - 19, -76, -34, 97, 48, -36, -18, -30, - -39, -26, -12, 28, 14, 12, -12, -31, - 38, 2, 10, 4, -40, 20, 16, -61, - 2, 64, 39, 5, 15, 33, 40, -61, - -49, 93, -10, 33, 28, -11, -27, -18, - 39, -62, -6, -6, 62, 11, -8, 38, - -67, 12, 27, 39, -27, 123, -18, -6, - -65, 83, -64, 20, 19, -11, 33, 24, - 17, 56, 78, 7, -15, 54, -101, -9, - 115, -96, 50, 51, 35, 34, 27, 37, - -40, -11, 8, -36, 42, -45, 2, -23, - 0, 67, -8, -9, -13, 50, -14, -27, - 4, 0, -8, -14, 30, -9, 29, 15, - 9, -38, 37, -8, 50, -46, 54, 41, - -11, -8, -11, -26, 39, 45, 14, -26, - -17, -27, 69, 38, 39, 98, 66, 0, - 42, 123, -101, -19, -83, 117, -32, 56, - 10, 12, -88, 79, -53, 56, 63, 95, - -62, 9, 36, -13, -79, -16, 37, -46, - 35, -34, 14, 17, -54, 5, 21, -7, - 7, 63, 56, 15, 27, -76, -25, 4, - -26, -63, 28, -67, -52, 43, -47, -70, - 40, -12, 40, -66, -37, 0, 35, 37, - -53, 4, -17, -51, 11, 21, 14, -34, - -4, 24, -42, 29, 22, 7, 28, 12, - 37, 39, -39, -19, 65, -60, -50, -2, - 1, 82, 39, 19, -23, -43, -22, -67, - -35, -34, 32, 102, 81, 127, 36, 67, - -45, 1, -67, -52, -4, 35, 20, 28, - 71, 86, -35, -9, -83, -34, 12, 9, - -23, 2, 14, 28, -23, 7, -25, 45, - 7, 17, -37, 0, -19, 31, 26, 40, - -27, -16, 17, 5, -21, 23, 24, 96, - -55, 52, -19, -14, -6, 1, 50, -34, - 86, -53, 38, 2, -52, -36, -13, 60, - -85, -120, 32, 7, -12, 22, 70, -7, - -94, 38, -76, -31, -20, 15, -28, 7, - 6, 40, 53, 88, 3, 38, 18, -8, - -22, -23, 51, 37, -9, 13, -32, 25, - -21, 27, 31, 20, 18, -9, -13, 1, - 21, -24, -13, 39, 15, -11, -29, -36, - 18, 15, 8, 27, 21, -94, -1, -22, - 49, 66, -1, 6, -3, -40, -18, 6, - 28, 12, 33, -59, 62, 60, -48, 90, - -1, 108, 9, 18, -2, 27, 77, -65, - 82, -48, -38, -19, -11, 127, 50, 66, - 18, -13, -22, 60, -38, 40, -14, -26, - -13, 38, 67, 57, 30, 33, 26, 36, - 38, -17, 27, -28, 20, 12, -64, 18, - 5, -33, -27, 13, -26, 32, 35, -5, - -48, -14, 92, 43, -47, -14, 40, 11, - 51, 66, 22, -63, -16, -61, 4, -28, - 27, 20, -33, -30, -21, -29, -53, 31, - -40, 24, 43, -4, -19, 21, 67, 20, - 100, -16, -93, 78, -6, -18, -52, -37, - -9, 66, -31, -8, 26, 18, 4, 24, - -22, 17, -2, -13, 27, 0, 8, -18, - -25, 5, -21, -24, -7, 18, -93, 21, - 7, 2, -75, 69, 50, -5, -15, -17, - 60, -42, 55, 1, -4, 3, 10, 46, - 16, -13, 45, -7, -10, -44, -108, 49, - 2, -15, -64, -12, -72, 32, -38, -45, - 10, -54, 13, -13, -27, -36, -64, 58, - -62, -101, 88, -86, -71, -39, -9, -128, - 32, 15, -4, 54, -16, -39, -26, -36, - 46, 48, -64, -10, 19, 30, -13, 34, - -8, 50, 60, -22, -6, -11, -30, 5, - 50, 32, 56, 0, 25, 6, 68, 11, - -29, 45, -9, -12, 4, 1, 18, -49, - 0, -38, -19, 90, 29, 35, 51, 8, - -48, 96, -1, -12, -9, -32, -63, -65, - -7, 38, 89, 28, -85, -28, -23, -25, - -128, 56, 79, -36, 99, -6, -37, 7, - -13, -69, -46, -29, 25, 64, -21, 17, - 1, 42, -66, 1, 80, 26, -32, 21, - 15, 15, 6, 6, -10, 15, 127, 5, - 38, 27, 87, -57, -25, 11, 72, -21, - -5, 11, -13, -66, 78, 36, -3, 41, - -21, 8, -33, 23, 73, 28, 57, -25, - -5, 4, -22, -47, 15, 4, -57, -72, - 33, 1, 18, 2, 53, -71, -99, -21, - -3, -111, 108, 71, -14, 82, 25, 61, - -48, 5, 9, -51, -20, -25, -3, 14, - -33, 14, -3, -34, 22, 12, -19, -38, - -16, 2, 21, 16, 26, -31, 75, 44, - -31, 16, 26, 66, 17, -9, -22, -22, - 22, -44, 22, 27, 2, 58, -14, 10, - -73, -42, 55, -25, -61, 72, -1, 30, - -58, -25, 63, 26, -48, -40, 26, -30, - 60, 8, -17, -1, -18, -20, 43, -20, - -4, -28, 127, -106, 29, 70, 64, -27, - 39, -33, -5, -88, -40, -52, 26, 44, - -17, 23, 2, -49, 22, -9, -8, 86, - 49, -43, -60, 1, 10, 45, 36, -53, - -4, 33, 38, 48, -72, 1, 19, 21, - -65, 4, -5, -62, 27, -25, 17, -6, - 6, -45, -39, -46, 4, 26, 127, -9, - 18, -33, -18, -3, 33, 2, -5, 15, - -26, -22, -117, -63, -17, -59, 61, -74, - 7, -47, -58, -128, -67, 15, -16, -128, - 12, 2, 20, 9, -48, -40, 43, 3, - -40, -16, -38, -6, -22, -28, -16, -59, - -22, 6, -5, 11, -12, -66, -40, 27, - -62, -44, -19, 38, -3, 39, -8, 40, - -24, 13, 21, 50, -60, -22, 53, -29, - -6, 1, 22, -59, 0, 17, -39, 115 -}; +/* RMS error was 0.138320, seed was 1361535663 */ -static const opus_int8 layer1_bias[72] = { - -42, 20, 16, 0, 105, 60, 1, -97, - 24, 60, 18, 13, 62, 25, 127, 34, - 79, 55, 118, 127, 95, 31, -4, 87, - 21, 12, 2, -14, 18, 23, 8, 17, - -1, -8, 5, 4, 24, 37, 21, 13, - 36, 13, 17, 18, 37, 30, 33, 1, - 8, -16, -11, -5, -31, -3, -5, 0, - 6, 3, 58, -7, -1, -16, 5, -13, - 16, 10, -2, -14, 11, -4, 3, -11 -}; +static const float weights[422] = { -static const opus_int8 layer2_weights[48] = { - -113, -88, 31, -128, -126, -61, 85, -35, - 118, -128, -61, 127, -128, -17, -128, 127, - 104, -9, -128, 33, 45, 127, 5, 83, - 84, -128, -85, -128, -45, 48, -53, -128, - 46, 127, -17, 125, 117, -41, -117, -91, - -127, -68, -1, -89, -80, 32, 106, 7 -}; +/* hidden layer */ +-0.0941125f, -0.302976f, -0.603555f, -0.19393f, -0.185983f, +-0.601617f, -0.0465317f, -0.114563f, -0.103599f, -0.618938f, +-0.317859f, -0.169949f, -0.0702885f, 0.148065f, 0.409524f, +0.548432f, 0.367649f, -0.494393f, 0.764306f, -1.83957f, +0.170849f, 12.786f, -1.08848f, -1.27284f, -16.2606f, +24.1773f, -5.57454f, -0.17276f, -0.163388f, -0.224421f, +-0.0948944f, -0.0728695f, -0.26557f, -0.100283f, -0.0515459f, +-0.146142f, -0.120674f, -0.180655f, 0.12857f, 0.442138f, +-0.493735f, 0.167767f, 0.206699f, -0.197567f, 0.417999f, +1.50364f, -0.773341f, -10.0401f, 0.401872f, 2.97966f, +15.2165f, -1.88905f, -1.19254f, 0.0285397f, -0.00405139f, +0.0707565f, 0.00825699f, -0.0927269f, -0.010393f, -0.00428882f, +-0.00489743f, -0.0709731f, -0.00255992f, 0.0395619f, 0.226424f, +0.0325231f, 0.162175f, -0.100118f, 0.485789f, 0.12697f, +0.285937f, 0.0155637f, 0.10546f, 3.05558f, 1.15059f, +-1.00904f, -1.83088f, 3.31766f, -3.42516f, -0.119135f, +-0.0405654f, 0.00690068f, 0.0179877f, -0.0382487f, 0.00597941f, +-0.0183611f, 0.00190395f, -0.144322f, -0.0435671f, 0.000990594f, +0.221087f, 0.142405f, 0.484066f, 0.404395f, 0.511955f, +-0.237255f, 0.241742f, 0.35045f, -0.699428f, 10.3993f, +2.6507f, -2.43459f, -4.18838f, 1.05928f, 1.71067f, +0.00667811f, -0.0721335f, -0.0397346f, 0.0362704f, -0.11496f, +-0.0235776f, 0.0082161f, -0.0141741f, -0.0329699f, -0.0354253f, +0.00277404f, -0.290654f, -1.14767f, -0.319157f, -0.686544f, +0.36897f, 0.478899f, 0.182579f, -0.411069f, 0.881104f, +-4.60683f, 1.4697f, 0.335845f, -1.81905f, -30.1699f, +5.55225f, 0.0019508f, -0.123576f, -0.0727332f, -0.0641597f, +-0.0534458f, -0.108166f, -0.0937368f, -0.0697883f, -0.0275475f, +-0.192309f, -0.110074f, 0.285375f, -0.405597f, 0.0926724f, +-0.287881f, -0.851193f, -0.099493f, -0.233764f, -1.2852f, +1.13611f, 3.12168f, -0.0699f, -1.86216f, 2.65292f, +-7.31036f, 2.44776f, -0.00111802f, -0.0632786f, -0.0376296f, +-0.149851f, 0.142963f, 0.184368f, 0.123433f, 0.0756158f, +0.117312f, 0.0933395f, 0.0692163f, 0.0842592f, 0.0704683f, +0.0589963f, 0.0942205f, -0.448862f, 0.0262677f, 0.270352f, +-0.262317f, 0.172586f, 2.00227f, -0.159216f, 0.038422f, +10.2073f, 4.15536f, -2.3407f, -0.0550265f, 0.00964792f, +-0.141336f, 0.0274501f, 0.0343921f, -0.0487428f, 0.0950172f, +-0.00775017f, -0.0372492f, -0.00548121f, -0.0663695f, 0.0960506f, +-0.200008f, -0.0412827f, 0.58728f, 0.0515787f, 0.337254f, +0.855024f, 0.668371f, -0.114904f, -3.62962f, -0.467477f, +-0.215472f, 2.61537f, 0.406117f, -1.36373f, 0.0425394f, +0.12208f, 0.0934502f, 0.123055f, 0.0340935f, -0.142466f, +0.035037f, -0.0490666f, 0.0733208f, 0.0576672f, 0.123984f, +-0.0517194f, -0.253018f, 0.590565f, 0.145849f, 0.315185f, +0.221534f, -0.149081f, 0.216161f, -0.349575f, 24.5664f, +-0.994196f, 0.614289f, -18.7905f, -2.83277f, -0.716801f, +-0.347201f, 0.479515f, -0.246027f, 0.0758683f, 0.137293f, +-0.17781f, 0.118751f, -0.00108329f, -0.237334f, 0.355732f, +-0.12991f, -0.0547627f, -0.318576f, -0.325524f, 0.180494f, +-0.0625604f, 0.141219f, 0.344064f, 0.37658f, -0.591772f, +5.8427f, -0.38075f, 0.221894f, -1.41934f, -1.87943e+06f, +1.34114f, 0.0283355f, -0.0447856f, -0.0211466f, -0.0256927f, +0.0139618f, 0.0207934f, -0.0107666f, 0.0110969f, 0.0586069f, +-0.0253545f, -0.0328433f, 0.11872f, -0.216943f, 0.145748f, +0.119808f, -0.0915211f, -0.120647f, -0.0787719f, -0.143644f, +-0.595116f, -1.152f, -1.25335f, -1.17092f, 4.34023f, +-975268.f, -1.37033f, -0.0401123f, 0.210602f, -0.136656f, +0.135962f, -0.0523293f, 0.0444604f, 0.0143928f, 0.00412666f, +-0.0193003f, 0.218452f, -0.110204f, -2.02563f, 0.918238f, +-2.45362f, 1.19542f, -0.061362f, -1.92243f, 0.308111f, +0.49764f, 0.912356f, 0.209272f, -2.34525f, 2.19326f, +-6.47121f, 1.69771f, -0.725123f, 0.0118929f, 0.0377944f, +0.0554003f, 0.0226452f, -0.0704421f, -0.0300309f, 0.0122978f, +-0.0041782f, -0.0686612f, 0.0313115f, 0.039111f, 0.364111f, +-0.0945548f, 0.0229876f, -0.17414f, 0.329795f, 0.114714f, +0.30022f, 0.106997f, 0.132355f, 5.79932f, 0.908058f, +-0.905324f, -3.3561f, 0.190647f, 0.184211f, -0.673648f, +0.231807f, -0.0586222f, 0.230752f, -0.438277f, 0.245857f, +-0.17215f, 0.0876383f, -0.720512f, 0.162515f, 0.0170571f, +0.101781f, 0.388477f, 1.32931f, 1.08548f, -0.936301f, +-2.36958f, -6.71988f, -3.44376f, 2.13818f, 14.2318f, +4.91459f, -3.09052f, -9.69191f, -0.768234f, 1.79604f, +0.0549653f, 0.163399f, 0.0797025f, 0.0343933f, -0.0555876f, +-0.00505673f, 0.0187258f, 0.0326628f, 0.0231486f, 0.15573f, +0.0476223f, -0.254824f, 1.60155f, -0.801221f, 2.55496f, +0.737629f, -1.36249f, -0.695463f, -2.44301f, -1.73188f, +3.95279f, 1.89068f, 0.486087f, -11.3343f, 3.9416e+06f, -static const opus_int8 layer2_bias[2] = { - 14, 117 -}; +/* output layer */ +-0.381439f, 0.12115f, -0.906927f, 2.93878f, 1.6388f, +0.882811f, 0.874344f, 1.21726f, -0.874545f, 0.321706f, +0.785055f, 0.946558f, -0.575066f, -3.46553f, 0.884905f, +0.0924047f, -9.90712f, 0.391338f, 0.160103f, -2.04954f, +4.1455f, 0.0684029f, -0.144761f, -0.285282f, 0.379244f, +-1.1584f, -0.0277241f, -9.85f, -4.82386f, 3.71333f, +3.87308f, 3.52558f}; -const DenseLayer layer0 = { - layer0_bias, - layer0_weights, - 25, 32, 0 -}; +static const int topo[3] = {25, 15, 2}; -const GRULayer layer1 = { - layer1_bias, - layer1_weights, - layer1_recur_weights, - 32, 24 +const MLP net = { + 3, + topo, + weights }; - -const DenseLayer layer2 = { - layer2_bias, - layer2_weights, - 24, 2, 1 -}; - diff --git a/thirdparty/opus/opus.c b/thirdparty/opus/opus.c index 538b5ea74e..f76f125cfa 100644 --- a/thirdparty/opus/opus.c +++ b/thirdparty/opus/opus.c @@ -107,7 +107,7 @@ OPUS_EXPORT void opus_pcm_soft_clip(float *_x, int N, int C, float *declip_mem) /* Slightly boost "a" by 2^-22. This is just enough to ensure -ffast-math does not cause output values larger than +/-1, but small enough not to matter even for 24-bit output. */ - a += a*2.4e-7f; + a += a*2.4e-7; if (x[i*C]>0) a = -a; /* Apply soft clipping */ @@ -252,7 +252,7 @@ int opus_packet_parse_impl(const unsigned char *data, opus_int32 len, /* Number of frames encoded in bits 0 to 5 */ ch = *data++; count = ch&0x3F; - if (count <= 0 || framesize*(opus_int32)count > 5760) + if (count <= 0 || framesize*count > 5760) return OPUS_INVALID_PACKET; len--; /* Padding flag is bit 6 */ diff --git a/thirdparty/opus/opus/opus.h b/thirdparty/opus/opus/opus.h index d282f21d25..5be73ddf4e 100644 --- a/thirdparty/opus/opus/opus.h +++ b/thirdparty/opus/opus/opus.h @@ -531,7 +531,7 @@ OPUS_EXPORT int opus_packet_parse( const unsigned char *frames[48], opus_int16 size[48], int *payload_offset -) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(5); +) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(4); /** Gets the bandwidth of an Opus packet. * @param [in] data <tt>char*</tt>: Opus packet diff --git a/thirdparty/opus/opus/opus_defines.h b/thirdparty/opus/opus/opus_defines.h index d141418b21..315412dd1d 100644 --- a/thirdparty/opus/opus/opus_defines.h +++ b/thirdparty/opus/opus/opus_defines.h @@ -165,13 +165,8 @@ extern "C" { #define OPUS_GET_EXPERT_FRAME_DURATION_REQUEST 4041 #define OPUS_SET_PREDICTION_DISABLED_REQUEST 4042 #define OPUS_GET_PREDICTION_DISABLED_REQUEST 4043 -/* Don't use 4045, it's already taken by OPUS_GET_GAIN_REQUEST */ -#define OPUS_SET_PHASE_INVERSION_DISABLED_REQUEST 4046 -#define OPUS_GET_PHASE_INVERSION_DISABLED_REQUEST 4047 -#define OPUS_GET_IN_DTX_REQUEST 4049 -/** Defines for the presence of extended APIs. */ -#define OPUS_HAVE_OPUS_PROJECTION_H +/* Don't use 4045, it's already taken by OPUS_GET_GAIN_REQUEST */ /* Macros to trigger compilation errors when the wrong types are provided to a CTL */ #define __opus_check_int(x) (((void)((x) == (opus_int32)0)), (opus_int32)(x)) @@ -213,9 +208,6 @@ extern "C" { #define OPUS_FRAMESIZE_20_MS 5004 /**< Use 20 ms frames */ #define OPUS_FRAMESIZE_40_MS 5005 /**< Use 40 ms frames */ #define OPUS_FRAMESIZE_60_MS 5006 /**< Use 60 ms frames */ -#define OPUS_FRAMESIZE_80_MS 5007 /**< Use 80 ms frames */ -#define OPUS_FRAMESIZE_100_MS 5008 /**< Use 100 ms frames */ -#define OPUS_FRAMESIZE_120_MS 5009 /**< Use 120 ms frames */ /**@}*/ @@ -574,9 +566,7 @@ extern "C" { * <dt>OPUS_FRAMESIZE_20_MS</dt><dd>Use 20 ms frames.</dd> * <dt>OPUS_FRAMESIZE_40_MS</dt><dd>Use 40 ms frames.</dd> * <dt>OPUS_FRAMESIZE_60_MS</dt><dd>Use 60 ms frames.</dd> - * <dt>OPUS_FRAMESIZE_80_MS</dt><dd>Use 80 ms frames.</dd> - * <dt>OPUS_FRAMESIZE_100_MS</dt><dd>Use 100 ms frames.</dd> - * <dt>OPUS_FRAMESIZE_120_MS</dt><dd>Use 120 ms frames.</dd> + * <dt>OPUS_FRAMESIZE_VARIABLE</dt><dd>Optimize the frame size dynamically.</dd> * </dl> * @hideinitializer */ #define OPUS_SET_EXPERT_FRAME_DURATION(x) OPUS_SET_EXPERT_FRAME_DURATION_REQUEST, __opus_check_int(x) @@ -591,9 +581,7 @@ extern "C" { * <dt>OPUS_FRAMESIZE_20_MS</dt><dd>Use 20 ms frames.</dd> * <dt>OPUS_FRAMESIZE_40_MS</dt><dd>Use 40 ms frames.</dd> * <dt>OPUS_FRAMESIZE_60_MS</dt><dd>Use 60 ms frames.</dd> - * <dt>OPUS_FRAMESIZE_80_MS</dt><dd>Use 80 ms frames.</dd> - * <dt>OPUS_FRAMESIZE_100_MS</dt><dd>Use 100 ms frames.</dd> - * <dt>OPUS_FRAMESIZE_120_MS</dt><dd>Use 120 ms frames.</dd> + * <dt>OPUS_FRAMESIZE_VARIABLE</dt><dd>Optimize the frame size dynamically.</dd> * </dl> * @hideinitializer */ #define OPUS_GET_EXPERT_FRAME_DURATION(x) OPUS_GET_EXPERT_FRAME_DURATION_REQUEST, __opus_check_int_ptr(x) @@ -693,40 +681,6 @@ extern "C" { */ #define OPUS_GET_SAMPLE_RATE(x) OPUS_GET_SAMPLE_RATE_REQUEST, __opus_check_int_ptr(x) -/** If set to 1, disables the use of phase inversion for intensity stereo, - * improving the quality of mono downmixes, but slightly reducing normal - * stereo quality. Disabling phase inversion in the decoder does not comply - * with RFC 6716, although it does not cause any interoperability issue and - * is expected to become part of the Opus standard once RFC 6716 is updated - * by draft-ietf-codec-opus-update. - * @see OPUS_GET_PHASE_INVERSION_DISABLED - * @param[in] x <tt>opus_int32</tt>: Allowed values: - * <dl> - * <dt>0</dt><dd>Enable phase inversion (default).</dd> - * <dt>1</dt><dd>Disable phase inversion.</dd> - * </dl> - * @hideinitializer */ -#define OPUS_SET_PHASE_INVERSION_DISABLED(x) OPUS_SET_PHASE_INVERSION_DISABLED_REQUEST, __opus_check_int(x) -/** Gets the encoder's configured phase inversion status. - * @see OPUS_SET_PHASE_INVERSION_DISABLED - * @param[out] x <tt>opus_int32 *</tt>: Returns one of the following values: - * <dl> - * <dt>0</dt><dd>Stereo phase inversion enabled (default).</dd> - * <dt>1</dt><dd>Stereo phase inversion disabled.</dd> - * </dl> - * @hideinitializer */ -#define OPUS_GET_PHASE_INVERSION_DISABLED(x) OPUS_GET_PHASE_INVERSION_DISABLED_REQUEST, __opus_check_int_ptr(x) -/** Gets the DTX state of the encoder. - * Returns whether the last encoded frame was either a comfort noise update - * during DTX or not encoded because of DTX. - * @param[out] x <tt>opus_int32 *</tt>: Returns one of the following values: - * <dl> - * <dt>0</dt><dd>The encoder is not in DTX.</dd> - * <dt>1</dt><dd>The encoder is in DTX.</dd> - * </dl> - * @hideinitializer */ -#define OPUS_GET_IN_DTX(x) OPUS_GET_IN_DTX_REQUEST, __opus_check_int_ptr(x) - /**@}*/ /** @defgroup opus_decoderctls Decoder related CTLs diff --git a/thirdparty/opus/opus/opus_multistream.h b/thirdparty/opus/opus/opus_multistream.h index babcee6905..3622e009fb 100644 --- a/thirdparty/opus/opus/opus_multistream.h +++ b/thirdparty/opus/opus/opus_multistream.h @@ -273,7 +273,7 @@ OPUS_EXPORT OPUS_WARN_UNUSED_RESULT OpusMSEncoder *opus_multistream_surround_enc unsigned char *mapping, int application, int *error -) OPUS_ARG_NONNULL(4) OPUS_ARG_NONNULL(5) OPUS_ARG_NONNULL(6); +) OPUS_ARG_NONNULL(5); /** Initialize a previously allocated multistream encoder state. * The memory pointed to by \a st must be at least the size returned by @@ -342,7 +342,7 @@ OPUS_EXPORT int opus_multistream_surround_encoder_init( int *coupled_streams, unsigned char *mapping, int application -) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(5) OPUS_ARG_NONNULL(6) OPUS_ARG_NONNULL(7); +) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(6); /** Encodes a multistream Opus frame. * @param st <tt>OpusMSEncoder*</tt>: Multistream encoder state. diff --git a/thirdparty/opus/opus/opus_projection.h b/thirdparty/opus/opus/opus_projection.h deleted file mode 100644 index 9dabf4e85c..0000000000 --- a/thirdparty/opus/opus/opus_projection.h +++ /dev/null @@ -1,568 +0,0 @@ -/* Copyright (c) 2017 Google Inc. - Written by Andrew Allen */ -/* - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER - OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/** - * @file opus_projection.h - * @brief Opus projection reference API - */ - -#ifndef OPUS_PROJECTION_H -#define OPUS_PROJECTION_H - -#include "opus_multistream.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/** @cond OPUS_INTERNAL_DOC */ - -/** These are the actual encoder and decoder CTL ID numbers. - * They should not be used directly by applications.c - * In general, SETs should be even and GETs should be odd.*/ -/**@{*/ -#define OPUS_PROJECTION_GET_DEMIXING_MATRIX_GAIN_REQUEST 6001 -#define OPUS_PROJECTION_GET_DEMIXING_MATRIX_SIZE_REQUEST 6003 -#define OPUS_PROJECTION_GET_DEMIXING_MATRIX_REQUEST 6005 -/**@}*/ - - -/** @endcond */ - -/** @defgroup opus_projection_ctls Projection specific encoder and decoder CTLs - * - * These are convenience macros that are specific to the - * opus_projection_encoder_ctl() and opus_projection_decoder_ctl() - * interface. - * The CTLs from @ref opus_genericctls, @ref opus_encoderctls, - * @ref opus_decoderctls, and @ref opus_multistream_ctls may be applied to a - * projection encoder or decoder as well. - */ -/**@{*/ - -/** Gets the gain (in dB. S7.8-format) of the demixing matrix from the encoder. - * @param[out] x <tt>opus_int32 *</tt>: Returns the gain (in dB. S7.8-format) - * of the demixing matrix. - * @hideinitializer - */ -#define OPUS_PROJECTION_GET_DEMIXING_MATRIX_GAIN(x) OPUS_PROJECTION_GET_DEMIXING_MATRIX_GAIN_REQUEST, __opus_check_int_ptr(x) - - -/** Gets the size in bytes of the demixing matrix from the encoder. - * @param[out] x <tt>opus_int32 *</tt>: Returns the size in bytes of the - * demixing matrix. - * @hideinitializer - */ -#define OPUS_PROJECTION_GET_DEMIXING_MATRIX_SIZE(x) OPUS_PROJECTION_GET_DEMIXING_MATRIX_SIZE_REQUEST, __opus_check_int_ptr(x) - - -/** Copies the demixing matrix to the supplied pointer location. - * @param[out] x <tt>unsigned char *</tt>: Returns the demixing matrix to the - * supplied pointer location. - * @param y <tt>opus_int32</tt>: The size in bytes of the reserved memory at the - * pointer location. - * @hideinitializer - */ -#define OPUS_PROJECTION_GET_DEMIXING_MATRIX(x,y) OPUS_PROJECTION_GET_DEMIXING_MATRIX_REQUEST, x, __opus_check_int(y) - - -/**@}*/ - -/** Opus projection encoder state. - * This contains the complete state of a projection Opus encoder. - * It is position independent and can be freely copied. - * @see opus_projection_ambisonics_encoder_create - */ -typedef struct OpusProjectionEncoder OpusProjectionEncoder; - - -/** Opus projection decoder state. - * This contains the complete state of a projection Opus decoder. - * It is position independent and can be freely copied. - * @see opus_projection_decoder_create - * @see opus_projection_decoder_init - */ -typedef struct OpusProjectionDecoder OpusProjectionDecoder; - - -/**\name Projection encoder functions */ -/**@{*/ - -/** Gets the size of an OpusProjectionEncoder structure. - * @param channels <tt>int</tt>: The total number of input channels to encode. - * This must be no more than 255. - * @param mapping_family <tt>int</tt>: The mapping family to use for selecting - * the appropriate projection. - * @returns The size in bytes on success, or a negative error code - * (see @ref opus_errorcodes) on error. - */ -OPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_projection_ambisonics_encoder_get_size( - int channels, - int mapping_family -); - - -/** Allocates and initializes a projection encoder state. - * Call opus_projection_encoder_destroy() to release - * this object when finished. - * @param Fs <tt>opus_int32</tt>: Sampling rate of the input signal (in Hz). - * This must be one of 8000, 12000, 16000, - * 24000, or 48000. - * @param channels <tt>int</tt>: Number of channels in the input signal. - * This must be at most 255. - * It may be greater than the number of - * coded channels (<code>streams + - * coupled_streams</code>). - * @param mapping_family <tt>int</tt>: The mapping family to use for selecting - * the appropriate projection. - * @param[out] streams <tt>int *</tt>: The total number of streams that will - * be encoded from the input. - * @param[out] coupled_streams <tt>int *</tt>: Number of coupled (2 channel) - * streams that will be encoded from the input. - * @param application <tt>int</tt>: The target encoder application. - * This must be one of the following: - * <dl> - * <dt>#OPUS_APPLICATION_VOIP</dt> - * <dd>Process signal for improved speech intelligibility.</dd> - * <dt>#OPUS_APPLICATION_AUDIO</dt> - * <dd>Favor faithfulness to the original input.</dd> - * <dt>#OPUS_APPLICATION_RESTRICTED_LOWDELAY</dt> - * <dd>Configure the minimum possible coding delay by disabling certain modes - * of operation.</dd> - * </dl> - * @param[out] error <tt>int *</tt>: Returns #OPUS_OK on success, or an error - * code (see @ref opus_errorcodes) on - * failure. - */ -OPUS_EXPORT OPUS_WARN_UNUSED_RESULT OpusProjectionEncoder *opus_projection_ambisonics_encoder_create( - opus_int32 Fs, - int channels, - int mapping_family, - int *streams, - int *coupled_streams, - int application, - int *error -) OPUS_ARG_NONNULL(4) OPUS_ARG_NONNULL(5); - - -/** Initialize a previously allocated projection encoder state. - * The memory pointed to by \a st must be at least the size returned by - * opus_projection_ambisonics_encoder_get_size(). - * This is intended for applications which use their own allocator instead of - * malloc. - * To reset a previously initialized state, use the #OPUS_RESET_STATE CTL. - * @see opus_projection_ambisonics_encoder_create - * @see opus_projection_ambisonics_encoder_get_size - * @param st <tt>OpusProjectionEncoder*</tt>: Projection encoder state to initialize. - * @param Fs <tt>opus_int32</tt>: Sampling rate of the input signal (in Hz). - * This must be one of 8000, 12000, 16000, - * 24000, or 48000. - * @param channels <tt>int</tt>: Number of channels in the input signal. - * This must be at most 255. - * It may be greater than the number of - * coded channels (<code>streams + - * coupled_streams</code>). - * @param streams <tt>int</tt>: The total number of streams to encode from the - * input. - * This must be no more than the number of channels. - * @param coupled_streams <tt>int</tt>: Number of coupled (2 channel) streams - * to encode. - * This must be no larger than the total - * number of streams. - * Additionally, The total number of - * encoded channels (<code>streams + - * coupled_streams</code>) must be no - * more than the number of input channels. - * @param application <tt>int</tt>: The target encoder application. - * This must be one of the following: - * <dl> - * <dt>#OPUS_APPLICATION_VOIP</dt> - * <dd>Process signal for improved speech intelligibility.</dd> - * <dt>#OPUS_APPLICATION_AUDIO</dt> - * <dd>Favor faithfulness to the original input.</dd> - * <dt>#OPUS_APPLICATION_RESTRICTED_LOWDELAY</dt> - * <dd>Configure the minimum possible coding delay by disabling certain modes - * of operation.</dd> - * </dl> - * @returns #OPUS_OK on success, or an error code (see @ref opus_errorcodes) - * on failure. - */ -OPUS_EXPORT int opus_projection_ambisonics_encoder_init( - OpusProjectionEncoder *st, - opus_int32 Fs, - int channels, - int mapping_family, - int *streams, - int *coupled_streams, - int application -) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(5) OPUS_ARG_NONNULL(6); - - -/** Encodes a projection Opus frame. - * @param st <tt>OpusProjectionEncoder*</tt>: Projection encoder state. - * @param[in] pcm <tt>const opus_int16*</tt>: The input signal as interleaved - * samples. - * This must contain - * <code>frame_size*channels</code> - * samples. - * @param frame_size <tt>int</tt>: Number of samples per channel in the input - * signal. - * This must be an Opus frame size for the - * encoder's sampling rate. - * For example, at 48 kHz the permitted values - * are 120, 240, 480, 960, 1920, and 2880. - * Passing in a duration of less than 10 ms - * (480 samples at 48 kHz) will prevent the - * encoder from using the LPC or hybrid modes. - * @param[out] data <tt>unsigned char*</tt>: Output payload. - * This must contain storage for at - * least \a max_data_bytes. - * @param [in] max_data_bytes <tt>opus_int32</tt>: Size of the allocated - * memory for the output - * payload. This may be - * used to impose an upper limit on - * the instant bitrate, but should - * not be used as the only bitrate - * control. Use #OPUS_SET_BITRATE to - * control the bitrate. - * @returns The length of the encoded packet (in bytes) on success or a - * negative error code (see @ref opus_errorcodes) on failure. - */ -OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_projection_encode( - OpusProjectionEncoder *st, - const opus_int16 *pcm, - int frame_size, - unsigned char *data, - opus_int32 max_data_bytes -) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2) OPUS_ARG_NONNULL(4); - - -/** Encodes a projection Opus frame from floating point input. - * @param st <tt>OpusProjectionEncoder*</tt>: Projection encoder state. - * @param[in] pcm <tt>const float*</tt>: The input signal as interleaved - * samples with a normal range of - * +/-1.0. - * Samples with a range beyond +/-1.0 - * are supported but will be clipped by - * decoders using the integer API and - * should only be used if it is known - * that the far end supports extended - * dynamic range. - * This must contain - * <code>frame_size*channels</code> - * samples. - * @param frame_size <tt>int</tt>: Number of samples per channel in the input - * signal. - * This must be an Opus frame size for the - * encoder's sampling rate. - * For example, at 48 kHz the permitted values - * are 120, 240, 480, 960, 1920, and 2880. - * Passing in a duration of less than 10 ms - * (480 samples at 48 kHz) will prevent the - * encoder from using the LPC or hybrid modes. - * @param[out] data <tt>unsigned char*</tt>: Output payload. - * This must contain storage for at - * least \a max_data_bytes. - * @param [in] max_data_bytes <tt>opus_int32</tt>: Size of the allocated - * memory for the output - * payload. This may be - * used to impose an upper limit on - * the instant bitrate, but should - * not be used as the only bitrate - * control. Use #OPUS_SET_BITRATE to - * control the bitrate. - * @returns The length of the encoded packet (in bytes) on success or a - * negative error code (see @ref opus_errorcodes) on failure. - */ -OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_projection_encode_float( - OpusProjectionEncoder *st, - const float *pcm, - int frame_size, - unsigned char *data, - opus_int32 max_data_bytes -) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2) OPUS_ARG_NONNULL(4); - - -/** Frees an <code>OpusProjectionEncoder</code> allocated by - * opus_projection_ambisonics_encoder_create(). - * @param st <tt>OpusProjectionEncoder*</tt>: Projection encoder state to be freed. - */ -OPUS_EXPORT void opus_projection_encoder_destroy(OpusProjectionEncoder *st); - - -/** Perform a CTL function on a projection Opus encoder. - * - * Generally the request and subsequent arguments are generated by a - * convenience macro. - * @param st <tt>OpusProjectionEncoder*</tt>: Projection encoder state. - * @param request This and all remaining parameters should be replaced by one - * of the convenience macros in @ref opus_genericctls, - * @ref opus_encoderctls, @ref opus_multistream_ctls, or - * @ref opus_projection_ctls - * @see opus_genericctls - * @see opus_encoderctls - * @see opus_multistream_ctls - * @see opus_projection_ctls - */ -OPUS_EXPORT int opus_projection_encoder_ctl(OpusProjectionEncoder *st, int request, ...) OPUS_ARG_NONNULL(1); - - -/**@}*/ - -/**\name Projection decoder functions */ -/**@{*/ - -/** Gets the size of an <code>OpusProjectionDecoder</code> structure. - * @param channels <tt>int</tt>: The total number of output channels. - * This must be no more than 255. - * @param streams <tt>int</tt>: The total number of streams coded in the - * input. - * This must be no more than 255. - * @param coupled_streams <tt>int</tt>: Number streams to decode as coupled - * (2 channel) streams. - * This must be no larger than the total - * number of streams. - * Additionally, The total number of - * coded channels (<code>streams + - * coupled_streams</code>) must be no - * more than 255. - * @returns The size in bytes on success, or a negative error code - * (see @ref opus_errorcodes) on error. - */ -OPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_projection_decoder_get_size( - int channels, - int streams, - int coupled_streams -); - - -/** Allocates and initializes a projection decoder state. - * Call opus_projection_decoder_destroy() to release - * this object when finished. - * @param Fs <tt>opus_int32</tt>: Sampling rate to decode at (in Hz). - * This must be one of 8000, 12000, 16000, - * 24000, or 48000. - * @param channels <tt>int</tt>: Number of channels to output. - * This must be at most 255. - * It may be different from the number of coded - * channels (<code>streams + - * coupled_streams</code>). - * @param streams <tt>int</tt>: The total number of streams coded in the - * input. - * This must be no more than 255. - * @param coupled_streams <tt>int</tt>: Number of streams to decode as coupled - * (2 channel) streams. - * This must be no larger than the total - * number of streams. - * Additionally, The total number of - * coded channels (<code>streams + - * coupled_streams</code>) must be no - * more than 255. - * @param[in] demixing_matrix <tt>const unsigned char[demixing_matrix_size]</tt>: Demixing matrix - * that mapping from coded channels to output channels, - * as described in @ref opus_projection and - * @ref opus_projection_ctls. - * @param demixing_matrix_size <tt>opus_int32</tt>: The size in bytes of the - * demixing matrix, as - * described in @ref - * opus_projection_ctls. - * @param[out] error <tt>int *</tt>: Returns #OPUS_OK on success, or an error - * code (see @ref opus_errorcodes) on - * failure. - */ -OPUS_EXPORT OPUS_WARN_UNUSED_RESULT OpusProjectionDecoder *opus_projection_decoder_create( - opus_int32 Fs, - int channels, - int streams, - int coupled_streams, - unsigned char *demixing_matrix, - opus_int32 demixing_matrix_size, - int *error -) OPUS_ARG_NONNULL(5); - - -/** Intialize a previously allocated projection decoder state object. - * The memory pointed to by \a st must be at least the size returned by - * opus_projection_decoder_get_size(). - * This is intended for applications which use their own allocator instead of - * malloc. - * To reset a previously initialized state, use the #OPUS_RESET_STATE CTL. - * @see opus_projection_decoder_create - * @see opus_projection_deocder_get_size - * @param st <tt>OpusProjectionDecoder*</tt>: Projection encoder state to initialize. - * @param Fs <tt>opus_int32</tt>: Sampling rate to decode at (in Hz). - * This must be one of 8000, 12000, 16000, - * 24000, or 48000. - * @param channels <tt>int</tt>: Number of channels to output. - * This must be at most 255. - * It may be different from the number of coded - * channels (<code>streams + - * coupled_streams</code>). - * @param streams <tt>int</tt>: The total number of streams coded in the - * input. - * This must be no more than 255. - * @param coupled_streams <tt>int</tt>: Number of streams to decode as coupled - * (2 channel) streams. - * This must be no larger than the total - * number of streams. - * Additionally, The total number of - * coded channels (<code>streams + - * coupled_streams</code>) must be no - * more than 255. - * @param[in] demixing_matrix <tt>const unsigned char[demixing_matrix_size]</tt>: Demixing matrix - * that mapping from coded channels to output channels, - * as described in @ref opus_projection and - * @ref opus_projection_ctls. - * @param demixing_matrix_size <tt>opus_int32</tt>: The size in bytes of the - * demixing matrix, as - * described in @ref - * opus_projection_ctls. - * @returns #OPUS_OK on success, or an error code (see @ref opus_errorcodes) - * on failure. - */ -OPUS_EXPORT int opus_projection_decoder_init( - OpusProjectionDecoder *st, - opus_int32 Fs, - int channels, - int streams, - int coupled_streams, - unsigned char *demixing_matrix, - opus_int32 demixing_matrix_size -) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(6); - - -/** Decode a projection Opus packet. - * @param st <tt>OpusProjectionDecoder*</tt>: Projection decoder state. - * @param[in] data <tt>const unsigned char*</tt>: Input payload. - * Use a <code>NULL</code> - * pointer to indicate packet - * loss. - * @param len <tt>opus_int32</tt>: Number of bytes in payload. - * @param[out] pcm <tt>opus_int16*</tt>: Output signal, with interleaved - * samples. - * This must contain room for - * <code>frame_size*channels</code> - * samples. - * @param frame_size <tt>int</tt>: The number of samples per channel of - * available space in \a pcm. - * If this is less than the maximum packet duration - * (120 ms; 5760 for 48kHz), this function will not be capable - * of decoding some packets. In the case of PLC (data==NULL) - * or FEC (decode_fec=1), then frame_size needs to be exactly - * the duration of audio that is missing, otherwise the - * decoder will not be in the optimal state to decode the - * next incoming packet. For the PLC and FEC cases, frame_size - * <b>must</b> be a multiple of 2.5 ms. - * @param decode_fec <tt>int</tt>: Flag (0 or 1) to request that any in-band - * forward error correction data be decoded. - * If no such data is available, the frame is - * decoded as if it were lost. - * @returns Number of samples decoded on success or a negative error code - * (see @ref opus_errorcodes) on failure. - */ -OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_projection_decode( - OpusProjectionDecoder *st, - const unsigned char *data, - opus_int32 len, - opus_int16 *pcm, - int frame_size, - int decode_fec -) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(4); - - -/** Decode a projection Opus packet with floating point output. - * @param st <tt>OpusProjectionDecoder*</tt>: Projection decoder state. - * @param[in] data <tt>const unsigned char*</tt>: Input payload. - * Use a <code>NULL</code> - * pointer to indicate packet - * loss. - * @param len <tt>opus_int32</tt>: Number of bytes in payload. - * @param[out] pcm <tt>opus_int16*</tt>: Output signal, with interleaved - * samples. - * This must contain room for - * <code>frame_size*channels</code> - * samples. - * @param frame_size <tt>int</tt>: The number of samples per channel of - * available space in \a pcm. - * If this is less than the maximum packet duration - * (120 ms; 5760 for 48kHz), this function will not be capable - * of decoding some packets. In the case of PLC (data==NULL) - * or FEC (decode_fec=1), then frame_size needs to be exactly - * the duration of audio that is missing, otherwise the - * decoder will not be in the optimal state to decode the - * next incoming packet. For the PLC and FEC cases, frame_size - * <b>must</b> be a multiple of 2.5 ms. - * @param decode_fec <tt>int</tt>: Flag (0 or 1) to request that any in-band - * forward error correction data be decoded. - * If no such data is available, the frame is - * decoded as if it were lost. - * @returns Number of samples decoded on success or a negative error code - * (see @ref opus_errorcodes) on failure. - */ -OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_projection_decode_float( - OpusProjectionDecoder *st, - const unsigned char *data, - opus_int32 len, - float *pcm, - int frame_size, - int decode_fec -) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(4); - - -/** Perform a CTL function on a projection Opus decoder. - * - * Generally the request and subsequent arguments are generated by a - * convenience macro. - * @param st <tt>OpusProjectionDecoder*</tt>: Projection decoder state. - * @param request This and all remaining parameters should be replaced by one - * of the convenience macros in @ref opus_genericctls, - * @ref opus_decoderctls, @ref opus_multistream_ctls, or - * @ref opus_projection_ctls. - * @see opus_genericctls - * @see opus_decoderctls - * @see opus_multistream_ctls - * @see opus_projection_ctls - */ -OPUS_EXPORT int opus_projection_decoder_ctl(OpusProjectionDecoder *st, int request, ...) OPUS_ARG_NONNULL(1); - - -/** Frees an <code>OpusProjectionDecoder</code> allocated by - * opus_projection_decoder_create(). - * @param st <tt>OpusProjectionDecoder</tt>: Projection decoder state to be freed. - */ -OPUS_EXPORT void opus_projection_decoder_destroy(OpusProjectionDecoder *st); - - -/**@}*/ - -/**@}*/ - -#ifdef __cplusplus -} -#endif - -#endif /* OPUS_PROJECTION_H */ diff --git a/thirdparty/opus/opus/opus_types.h b/thirdparty/opus/opus/opus_types.h index 7cf675580f..b28e03aea2 100644 --- a/thirdparty/opus/opus/opus_types.h +++ b/thirdparty/opus/opus/opus_types.h @@ -33,29 +33,14 @@ #ifndef OPUS_TYPES_H #define OPUS_TYPES_H -#define opus_int int /* used for counters etc; at least 16 bits */ -#define opus_int64 long long -#define opus_int8 signed char - -#define opus_uint unsigned int /* used for counters etc; at least 16 bits */ -#define opus_uint64 unsigned long long -#define opus_uint8 unsigned char - /* Use the real stdint.h if it's there (taken from Paul Hsieh's pstdint.h) */ -#if (defined(__STDC__) && __STDC__ && defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || (defined(__GNUC__) && (defined(_STDINT_H) || defined(_STDINT_H_)) || defined (HAVE_STDINT_H)) +#if (defined(__STDC__) && __STDC__ && __STDC_VERSION__ >= 199901L) || (defined(__GNUC__) && (defined(_STDINT_H) || defined(_STDINT_H_)) || defined (HAVE_STDINT_H)) #include <stdint.h> -# undef opus_int64 -# undef opus_int8 -# undef opus_uint64 -# undef opus_uint8 - typedef int8_t opus_int8; - typedef uint8_t opus_uint8; + typedef int16_t opus_int16; typedef uint16_t opus_uint16; typedef int32_t opus_int32; typedef uint32_t opus_uint32; - typedef int64_t opus_int64; - typedef uint64_t opus_uint64; #elif defined(_WIN32) # if defined(__CYGWIN__) @@ -163,4 +148,12 @@ #endif +#define opus_int int /* used for counters etc; at least 16 bits */ +#define opus_int64 long long +#define opus_int8 signed char + +#define opus_uint unsigned int /* used for counters etc; at least 16 bits */ +#define opus_uint64 unsigned long long +#define opus_uint8 unsigned char + #endif /* OPUS_TYPES_H */ diff --git a/thirdparty/opus/opus/opusfile.h b/thirdparty/opus/opus/opusfile.h index e3a3dc8389..4bf2fba926 100644 --- a/thirdparty/opus/opus/opusfile.h +++ b/thirdparty/opus/opus/opusfile.h @@ -239,8 +239,7 @@ struct OpusHead{ -32768...32767. The <tt>libopusfile</tt> API will automatically apply this gain to the decoded output before returning it, scaling it by - <code>pow(10,output_gain/(20.0*256))</code>. - You can adjust this behavior with op_set_gain_offset().*/ + <code>pow(10,output_gain/(20.0*256))</code>.*/ int output_gain; /**The channel mapping family, in the range 0...255. Channel mapping family 0 covers mono or stereo in a single stream. @@ -1155,18 +1154,16 @@ OP_WARN_UNUSED_RESULT OggOpusFile *op_open_url(const char *_url, int *_error,...) OP_ARG_NONNULL(1); /**Open a stream using the given set of callbacks to access it. - \param _stream The stream to read from (e.g., a <code>FILE *</code>). - This value will be passed verbatim as the first - argument to all of the callbacks. + \param _source The stream to read from (e.g., a <code>FILE *</code>). \param _cb The callbacks with which to access the stream. <code><a href="#op_read_func">read()</a></code> must be implemented. <code><a href="#op_seek_func">seek()</a></code> and <code><a href="#op_tell_func">tell()</a></code> may be <code>NULL</code>, or may always return -1 to - indicate a stream is unseekable, but if + indicate a source is unseekable, but if <code><a href="#op_seek_func">seek()</a></code> is - implemented and succeeds on a particular stream, then + implemented and succeeds on a particular source, then <code><a href="#op_tell_func">tell()</a></code> must also. <code><a href="#op_close_func">close()</a></code> may @@ -1229,11 +1226,11 @@ OP_WARN_UNUSED_RESULT OggOpusFile *op_open_url(const char *_url, basic validity checks.</dd> </dl> \return A freshly opened \c OggOpusFile, or <code>NULL</code> on error. - <tt>libopusfile</tt> does <em>not</em> take ownership of the stream + <tt>libopusfile</tt> does <em>not</em> take ownership of the source if the call fails. - The calling application is responsible for closing the stream if + The calling application is responsible for closing the source if this call returns an error.*/ -OP_WARN_UNUSED_RESULT OggOpusFile *op_open_callbacks(void *_stream, +OP_WARN_UNUSED_RESULT OggOpusFile *op_open_callbacks(void *_source, const OpusFileCallbacks *_cb,const unsigned char *_initial_data, size_t _initial_bytes,int *_error) OP_ARG_NONNULL(2); @@ -1335,20 +1332,18 @@ OP_WARN_UNUSED_RESULT OggOpusFile *op_test_url(const char *_url, For new code, you are likely better off using op_test() instead, which is less resource-intensive, requires less data to succeed, and imposes a hard limit on the amount of data it examines (important for unseekable - streams, where all such data must be buffered until you are sure of the + sources, where all such data must be buffered until you are sure of the stream type). - \param _stream The stream to read from (e.g., a <code>FILE *</code>). - This value will be passed verbatim as the first - argument to all of the callbacks. + \param _source The stream to read from (e.g., a <code>FILE *</code>). \param _cb The callbacks with which to access the stream. <code><a href="#op_read_func">read()</a></code> must be implemented. <code><a href="#op_seek_func">seek()</a></code> and <code><a href="#op_tell_func">tell()</a></code> may be <code>NULL</code>, or may always return -1 to - indicate a stream is unseekable, but if + indicate a source is unseekable, but if <code><a href="#op_seek_func">seek()</a></code> is - implemented and succeeds on a particular stream, then + implemented and succeeds on a particular source, then <code><a href="#op_tell_func">tell()</a></code> must also. <code><a href="#op_close_func">close()</a></code> may @@ -1378,11 +1373,11 @@ OP_WARN_UNUSED_RESULT OggOpusFile *op_test_url(const char *_url, See op_open_callbacks() for a full list of failure codes. \return A partially opened \c OggOpusFile, or <code>NULL</code> on error. - <tt>libopusfile</tt> does <em>not</em> take ownership of the stream + <tt>libopusfile</tt> does <em>not</em> take ownership of the source if the call fails. - The calling application is responsible for closing the stream if + The calling application is responsible for closing the source if this call returns an error.*/ -OP_WARN_UNUSED_RESULT OggOpusFile *op_test_callbacks(void *_stream, +OP_WARN_UNUSED_RESULT OggOpusFile *op_test_callbacks(void *_source, const OpusFileCallbacks *_cb,const unsigned char *_initial_data, size_t _initial_bytes,int *_error) OP_ARG_NONNULL(2); @@ -1439,7 +1434,7 @@ void op_free(OggOpusFile *_of); Their documention will indicate so explicitly.*/ /*@{*/ -/**Returns whether or not the stream being read is seekable. +/**Returns whether or not the data source being read is seekable. This is true if <ol> <li>The <code><a href="#op_seek_func">seek()</a></code> and @@ -1460,9 +1455,9 @@ int op_seekable(const OggOpusFile *_of) OP_ARG_NONNULL(1); return 1. The actual number of links is not known until the stream is fully opened. \param _of The \c OggOpusFile from which to retrieve the link count. - \return For fully-open seekable streams, this returns the total number of + \return For fully-open seekable sources, this returns the total number of links in the whole stream, which will be at least 1. - For partially-open or unseekable streams, this always returns 1.*/ + For partially-open or unseekable sources, this always returns 1.*/ int op_link_count(const OggOpusFile *_of) OP_ARG_NONNULL(1); /**Get the serial number of the given link in a (possibly-chained) Ogg Opus @@ -1476,7 +1471,7 @@ int op_link_count(const OggOpusFile *_of) OP_ARG_NONNULL(1); \return The serial number of the given link. If \a _li is greater than the total number of links, this returns the serial number of the last link. - If the stream is not seekable, this always returns the serial number + If the source is not seekable, this always returns the serial number of the current link.*/ opus_uint32 op_serialno(const OggOpusFile *_of,int _li) OP_ARG_NONNULL(1); @@ -1493,7 +1488,7 @@ opus_uint32 op_serialno(const OggOpusFile *_of,int _li) OP_ARG_NONNULL(1); \return The channel count of the given link. If \a _li is greater than the total number of links, this returns the channel count of the last link. - If the stream is not seekable, this always returns the channel count + If the source is not seekable, this always returns the channel count of the current link.*/ int op_channel_count(const OggOpusFile *_of,int _li) OP_ARG_NONNULL(1); @@ -1512,9 +1507,9 @@ int op_channel_count(const OggOpusFile *_of,int _li) OP_ARG_NONNULL(1); compressed size of link \a _li if it is non-negative, or a negative value on error. The compressed size of the entire stream may be smaller than that - of the underlying stream if trailing garbage was detected in the + of the underlying source if trailing garbage was detected in the file. - \retval #OP_EINVAL The stream is not seekable (so we can't know the length), + \retval #OP_EINVAL The source is not seekable (so we can't know the length), \a _li wasn't less than the total number of links in the stream, or the stream was only partially open.*/ opus_int64 op_raw_total(const OggOpusFile *_of,int _li) OP_ARG_NONNULL(1); @@ -1532,7 +1527,7 @@ opus_int64 op_raw_total(const OggOpusFile *_of,int _li) OP_ARG_NONNULL(1); \return The PCM length of the entire stream if \a _li is negative, the PCM length of link \a _li if it is non-negative, or a negative value on error. - \retval #OP_EINVAL The stream is not seekable (so we can't know the length), + \retval #OP_EINVAL The source is not seekable (so we can't know the length), \a _li wasn't less than the total number of links in the stream, or the stream was only partially open.*/ ogg_int64_t op_pcm_total(const OggOpusFile *_of,int _li) OP_ARG_NONNULL(1); @@ -1580,8 +1575,8 @@ const OpusTags *op_tags(const OggOpusFile *_of,int _li) OP_ARG_NONNULL(1); \param _of The \c OggOpusFile from which to retrieve the current link index. \return The index of the current link on success, or a negative value on failure. - For seekable streams, this is a number between 0 (inclusive) and the - value returned by op_link_count() (exclusive). + For seekable streams, this is a number between 0 and the value + returned by op_link_count(). For unseekable streams, this value starts at 0 and increments by one each time a new link is encountered (even though op_link_count() always returns 1). @@ -1645,10 +1640,10 @@ ogg_int64_t op_pcm_tell(const OggOpusFile *_of) OP_ARG_NONNULL(1); /*@{*/ /**\name Functions for seeking in Opus streams - These functions let you seek in Opus streams, if the underlying stream + These functions let you seek in Opus streams, if the underlying source support it. Seeking is implemented for all built-in stream I/O routines, though some - individual streams may not be seekable (pipes, live HTTP streams, or HTTP + individual sources may not be seekable (pipes, live HTTP streams, or HTTP streams from a server that does not support <code>Range</code> requests). op_raw_seek() is the fastest: it is guaranteed to perform at most one @@ -1675,8 +1670,6 @@ ogg_int64_t op_pcm_tell(const OggOpusFile *_of) OP_ARG_NONNULL(1); packets out of the tail of the link to which it seeks. \param _of The \c OggOpusFile in which to seek. \param _byte_offset The byte position to seek to. - This must be between 0 and #op_raw_total(\a _of,\c -1) - (inclusive). \return 0 on success, or a negative error code on failure. \retval #OP_EREAD The underlying seek operation failed. \retval #OP_EINVAL The stream was only partially open, or the target was diff --git a/thirdparty/opus/opus_compare.c b/thirdparty/opus/opus_compare.c index 1956e08fa5..06c67d752f 100644 --- a/thirdparty/opus/opus_compare.c +++ b/thirdparty/opus/opus_compare.c @@ -363,9 +363,6 @@ int main(int _argc,const char **_argv){ Ef*=Ef; err+=Ef*Ef; } - free(xb); - free(X); - free(Y); err=pow(err/nframes,1.0/16); Q=100*(1-0.5*log(1+err)/log(1.13)); if(Q<0){ diff --git a/thirdparty/opus/opus_decoder.c b/thirdparty/opus/opus_decoder.c index 9113638a00..080bec5072 100644 --- a/thirdparty/opus/opus_decoder.c +++ b/thirdparty/opus/opus_decoder.c @@ -78,26 +78,6 @@ struct OpusDecoder { opus_uint32 rangeFinal; }; -#if defined(ENABLE_HARDENING) || defined(ENABLE_ASSERTIONS) -static void validate_opus_decoder(OpusDecoder *st) -{ - celt_assert(st->channels == 1 || st->channels == 2); - celt_assert(st->Fs == 48000 || st->Fs == 24000 || st->Fs == 16000 || st->Fs == 12000 || st->Fs == 8000); - celt_assert(st->DecControl.API_sampleRate == st->Fs); - celt_assert(st->DecControl.internalSampleRate == 0 || st->DecControl.internalSampleRate == 16000 || st->DecControl.internalSampleRate == 12000 || st->DecControl.internalSampleRate == 8000); - celt_assert(st->DecControl.nChannelsAPI == st->channels); - celt_assert(st->DecControl.nChannelsInternal == 0 || st->DecControl.nChannelsInternal == 1 || st->DecControl.nChannelsInternal == 2); - celt_assert(st->DecControl.payloadSize_ms == 0 || st->DecControl.payloadSize_ms == 10 || st->DecControl.payloadSize_ms == 20 || st->DecControl.payloadSize_ms == 40 || st->DecControl.payloadSize_ms == 60); -#ifdef OPUS_ARCHMASK - celt_assert(st->arch >= 0); - celt_assert(st->arch <= OPUS_ARCHMASK); -#endif - celt_assert(st->stream_channels == 1 || st->stream_channels == 2); -} -#define VALIDATE_OPUS_DECODER(st) validate_opus_decoder(st) -#else -#define VALIDATE_OPUS_DECODER(st) -#endif int opus_decoder_get_size(int channels) { @@ -124,7 +104,7 @@ int opus_decoder_init(OpusDecoder *st, opus_int32 Fs, int channels) return OPUS_BAD_ARG; OPUS_CLEAR((char*)st, opus_decoder_get_size(channels)); - /* Initialize SILK decoder */ + /* Initialize SILK encoder */ ret = silk_Get_Decoder_Size(&silkDecSizeBytes); if (ret) return OPUS_INTERNAL_ERROR; @@ -237,7 +217,6 @@ static int opus_decode_frame(OpusDecoder *st, const unsigned char *data, int audiosize; int mode; - int bandwidth; int transition=0; int start_band; int redundancy=0; @@ -274,12 +253,10 @@ static int opus_decode_frame(OpusDecoder *st, const unsigned char *data, { audiosize = st->frame_size; mode = st->mode; - bandwidth = st->bandwidth; ec_dec_init(&dec,(unsigned char*)data,len); } else { audiosize = frame_size; mode = st->prev_mode; - bandwidth = 0; if (mode == 0) { @@ -378,15 +355,15 @@ static int opus_decode_frame(OpusDecoder *st, const unsigned char *data, { st->DecControl.nChannelsInternal = st->stream_channels; if( mode == MODE_SILK_ONLY ) { - if( bandwidth == OPUS_BANDWIDTH_NARROWBAND ) { + if( st->bandwidth == OPUS_BANDWIDTH_NARROWBAND ) { st->DecControl.internalSampleRate = 8000; - } else if( bandwidth == OPUS_BANDWIDTH_MEDIUMBAND ) { + } else if( st->bandwidth == OPUS_BANDWIDTH_MEDIUMBAND ) { st->DecControl.internalSampleRate = 12000; - } else if( bandwidth == OPUS_BANDWIDTH_WIDEBAND ) { + } else if( st->bandwidth == OPUS_BANDWIDTH_WIDEBAND ) { st->DecControl.internalSampleRate = 16000; } else { st->DecControl.internalSampleRate = 16000; - celt_assert( 0 ); + silk_assert( 0 ); } } else { /* Hybrid mode */ @@ -450,26 +427,10 @@ static int opus_decode_frame(OpusDecoder *st, const unsigned char *data, if (mode != MODE_CELT_ONLY) start_band = 17; - if (redundancy) - { - transition = 0; - pcm_transition_silk_size=ALLOC_NONE; - } - - ALLOC(pcm_transition_silk, pcm_transition_silk_size, opus_val16); - - if (transition && mode != MODE_CELT_ONLY) - { - pcm_transition = pcm_transition_silk; - opus_decode_frame(st, NULL, 0, pcm_transition, IMIN(F5, audiosize), 0); - } - - - if (bandwidth) { int endband=21; - switch(bandwidth) + switch(st->bandwidth) { case OPUS_BANDWIDTH_NARROWBAND: endband = 13; @@ -484,13 +445,24 @@ static int opus_decode_frame(OpusDecoder *st, const unsigned char *data, case OPUS_BANDWIDTH_FULLBAND: endband = 21; break; - default: - celt_assert(0); - break; } - MUST_SUCCEED(celt_decoder_ctl(celt_dec, CELT_SET_END_BAND(endband))); + celt_decoder_ctl(celt_dec, CELT_SET_END_BAND(endband)); + celt_decoder_ctl(celt_dec, CELT_SET_CHANNELS(st->stream_channels)); + } + + if (redundancy) + { + transition = 0; + pcm_transition_silk_size=ALLOC_NONE; + } + + ALLOC(pcm_transition_silk, pcm_transition_silk_size, opus_val16); + + if (transition && mode != MODE_CELT_ONLY) + { + pcm_transition = pcm_transition_silk; + opus_decode_frame(st, NULL, 0, pcm_transition, IMIN(F5, audiosize), 0); } - MUST_SUCCEED(celt_decoder_ctl(celt_dec, CELT_SET_CHANNELS(st->stream_channels))); /* Only allocation memory for redundancy if/when needed */ redundant_audio_size = redundancy ? F5*st->channels : ALLOC_NONE; @@ -499,21 +471,21 @@ static int opus_decode_frame(OpusDecoder *st, const unsigned char *data, /* 5 ms redundant frame for CELT->SILK*/ if (redundancy && celt_to_silk) { - MUST_SUCCEED(celt_decoder_ctl(celt_dec, CELT_SET_START_BAND(0))); + celt_decoder_ctl(celt_dec, CELT_SET_START_BAND(0)); celt_decode_with_ec(celt_dec, data+len, redundancy_bytes, redundant_audio, F5, NULL, 0); - MUST_SUCCEED(celt_decoder_ctl(celt_dec, OPUS_GET_FINAL_RANGE(&redundant_rng))); + celt_decoder_ctl(celt_dec, OPUS_GET_FINAL_RANGE(&redundant_rng)); } /* MUST be after PLC */ - MUST_SUCCEED(celt_decoder_ctl(celt_dec, CELT_SET_START_BAND(start_band))); + celt_decoder_ctl(celt_dec, CELT_SET_START_BAND(start_band)); if (mode != MODE_SILK_ONLY) { int celt_frame_size = IMIN(F20, frame_size); /* Make sure to discard any previous CELT state */ if (mode != st->prev_mode && st->prev_mode > 0 && !st->prev_redundancy) - MUST_SUCCEED(celt_decoder_ctl(celt_dec, OPUS_RESET_STATE)); + celt_decoder_ctl(celt_dec, OPUS_RESET_STATE); /* Decode CELT */ celt_ret = celt_decode_with_ec(celt_dec, decode_fec ? NULL : data, len, pcm, celt_frame_size, &dec, celt_accum); @@ -528,7 +500,7 @@ static int opus_decode_frame(OpusDecoder *st, const unsigned char *data, do a fade-out by decoding a silence frame */ if (st->prev_mode == MODE_HYBRID && !(redundancy && celt_to_silk && st->prev_redundancy) ) { - MUST_SUCCEED(celt_decoder_ctl(celt_dec, CELT_SET_START_BAND(0))); + celt_decoder_ctl(celt_dec, CELT_SET_START_BAND(0)); celt_decode_with_ec(celt_dec, silence, 2, pcm, F2_5, NULL, celt_accum); } } @@ -546,18 +518,18 @@ static int opus_decode_frame(OpusDecoder *st, const unsigned char *data, { const CELTMode *celt_mode; - MUST_SUCCEED(celt_decoder_ctl(celt_dec, CELT_GET_MODE(&celt_mode))); + celt_decoder_ctl(celt_dec, CELT_GET_MODE(&celt_mode)); window = celt_mode->window; } /* 5 ms redundant frame for SILK->CELT */ if (redundancy && !celt_to_silk) { - MUST_SUCCEED(celt_decoder_ctl(celt_dec, OPUS_RESET_STATE)); - MUST_SUCCEED(celt_decoder_ctl(celt_dec, CELT_SET_START_BAND(0))); + celt_decoder_ctl(celt_dec, OPUS_RESET_STATE); + celt_decoder_ctl(celt_dec, CELT_SET_START_BAND(0)); celt_decode_with_ec(celt_dec, data+len, redundancy_bytes, redundant_audio, F5, NULL, 0); - MUST_SUCCEED(celt_decoder_ctl(celt_dec, OPUS_GET_FINAL_RANGE(&redundant_rng))); + celt_decoder_ctl(celt_dec, OPUS_GET_FINAL_RANGE(&redundant_rng)); smooth_fade(pcm+st->channels*(frame_size-F2_5), redundant_audio+st->channels*F2_5, pcm+st->channels*(frame_size-F2_5), F2_5, st->channels, window, st->Fs); } @@ -633,7 +605,6 @@ int opus_decode_native(OpusDecoder *st, const unsigned char *data, int packet_frame_size, packet_bandwidth, packet_mode, packet_stream_channels; /* 48 x 2.5 ms = 120 ms */ opus_int16 size[48]; - VALIDATE_OPUS_DECODER(st); if (decode_fec<0 || decode_fec>1) return OPUS_BAD_ARG; /* For FEC/PLC, frame_size has to be to have a multiple of 2.5 ms */ @@ -769,7 +740,6 @@ int opus_decode_float(OpusDecoder *st, const unsigned char *data, else return OPUS_INVALID_PACKET; } - celt_assert(st->channels == 1 || st->channels == 2); ALLOC(out, frame_size*st->channels, opus_int16); ret = opus_decode_native(st, data, len, out, frame_size, decode_fec, 0, NULL, 0); @@ -807,7 +777,6 @@ int opus_decode(OpusDecoder *st, const unsigned char *data, else return OPUS_INVALID_PACKET; } - celt_assert(st->channels == 1 || st->channels == 2); ALLOC(out, frame_size*st->channels, float); ret = opus_decode_native(st, data, len, out, frame_size, decode_fec, 0, NULL, 1); @@ -895,7 +864,7 @@ int opus_decoder_ctl(OpusDecoder *st, int request, ...) goto bad_arg; } if (st->prev_mode == MODE_CELT_ONLY) - ret = celt_decoder_ctl(celt_dec, OPUS_GET_PITCH(value)); + celt_decoder_ctl(celt_dec, OPUS_GET_PITCH(value)); else *value = st->DecControl.prevPitchLag; } @@ -922,7 +891,7 @@ int opus_decoder_ctl(OpusDecoder *st, int request, ...) break; case OPUS_GET_LAST_PACKET_DURATION_REQUEST: { - opus_int32 *value = va_arg(ap, opus_int32*); + opus_uint32 *value = va_arg(ap, opus_uint32*); if (!value) { goto bad_arg; @@ -930,26 +899,6 @@ int opus_decoder_ctl(OpusDecoder *st, int request, ...) *value = st->last_packet_duration; } break; - case OPUS_SET_PHASE_INVERSION_DISABLED_REQUEST: - { - opus_int32 value = va_arg(ap, opus_int32); - if(value<0 || value>1) - { - goto bad_arg; - } - ret = celt_decoder_ctl(celt_dec, OPUS_SET_PHASE_INVERSION_DISABLED(value)); - } - break; - case OPUS_GET_PHASE_INVERSION_DISABLED_REQUEST: - { - opus_int32 *value = va_arg(ap, opus_int32*); - if (!value) - { - goto bad_arg; - } - ret = celt_decoder_ctl(celt_dec, OPUS_GET_PHASE_INVERSION_DISABLED(value)); - } - break; default: /*fprintf(stderr, "unknown opus_decoder_ctl() request: %d", request);*/ ret = OPUS_UNIMPLEMENTED; diff --git a/thirdparty/opus/opus_encoder.c b/thirdparty/opus/opus_encoder.c index e98ac5b8d0..9a516a884a 100644 --- a/thirdparty/opus/opus_encoder.c +++ b/thirdparty/opus/opus_encoder.c @@ -53,10 +53,6 @@ #define MAX_ENCODER_BUFFER 480 -#ifndef DISABLE_FLOAT_API -#define PSEUDO_SNR_THRESHOLD 316.23f /* 10^(25/10) */ -#endif - typedef struct { opus_val32 XX, XY, YY; opus_val16 smoothed_width; @@ -86,7 +82,6 @@ struct OpusEncoder { int encoder_buffer; int lfe; int arch; - int use_dtx; /* general DTX for both SILK and CELT */ #ifndef DISABLE_FLOAT_API TonalityAnalysisState analysis; #endif @@ -102,8 +97,6 @@ struct OpusEncoder { int prev_channels; int prev_framesize; int bandwidth; - /* Bandwidth determined automatically from the rate (before any other adjustment) */ - int auto_bandwidth; int silk_bw_switch; /* Sampling rate (at the API level) */ int first; @@ -112,10 +105,7 @@ struct OpusEncoder { opus_val16 delay_buffer[MAX_ENCODER_BUFFER*2]; #ifndef DISABLE_FLOAT_API int detected_bandwidth; - int nb_no_activity_frames; - opus_val32 peak_signal_energy; #endif - int nonfinal_frame; /* current frame is not the final in a packet */ opus_uint32 rangeFinal; }; @@ -123,46 +113,38 @@ struct OpusEncoder { middle (memoriless) threshold. The second column is the hysteresis (difference with the middle) */ static const opus_int32 mono_voice_bandwidth_thresholds[8] = { - 9000, 700, /* NB<->MB */ - 9000, 700, /* MB<->WB */ - 13500, 1000, /* WB<->SWB */ - 14000, 2000, /* SWB<->FB */ + 11000, 1000, /* NB<->MB */ + 14000, 1000, /* MB<->WB */ + 17000, 1000, /* WB<->SWB */ + 21000, 2000, /* SWB<->FB */ }; static const opus_int32 mono_music_bandwidth_thresholds[8] = { - 9000, 700, /* NB<->MB */ - 9000, 700, /* MB<->WB */ - 11000, 1000, /* WB<->SWB */ - 12000, 2000, /* SWB<->FB */ + 12000, 1000, /* NB<->MB */ + 15000, 1000, /* MB<->WB */ + 18000, 2000, /* WB<->SWB */ + 22000, 2000, /* SWB<->FB */ }; static const opus_int32 stereo_voice_bandwidth_thresholds[8] = { - 9000, 700, /* NB<->MB */ - 9000, 700, /* MB<->WB */ - 13500, 1000, /* WB<->SWB */ - 14000, 2000, /* SWB<->FB */ + 11000, 1000, /* NB<->MB */ + 14000, 1000, /* MB<->WB */ + 21000, 2000, /* WB<->SWB */ + 28000, 2000, /* SWB<->FB */ }; static const opus_int32 stereo_music_bandwidth_thresholds[8] = { - 9000, 700, /* NB<->MB */ - 9000, 700, /* MB<->WB */ - 11000, 1000, /* WB<->SWB */ - 12000, 2000, /* SWB<->FB */ + 12000, 1000, /* NB<->MB */ + 18000, 2000, /* MB<->WB */ + 21000, 2000, /* WB<->SWB */ + 30000, 2000, /* SWB<->FB */ }; /* Threshold bit-rates for switching between mono and stereo */ -static const opus_int32 stereo_voice_threshold = 19000; -static const opus_int32 stereo_music_threshold = 17000; +static const opus_int32 stereo_voice_threshold = 30000; +static const opus_int32 stereo_music_threshold = 30000; /* Threshold bit-rate for switching between SILK/hybrid and CELT-only */ static const opus_int32 mode_thresholds[2][2] = { /* voice */ /* music */ - { 64000, 10000}, /* mono */ - { 44000, 10000}, /* stereo */ -}; - -static const opus_int32 fec_thresholds[] = { - 12000, 1000, /* NB */ - 14000, 1000, /* MB */ - 16000, 1000, /* WB */ - 20000, 1000, /* SWB */ - 22000, 1000, /* FB */ + { 64000, 16000}, /* mono */ + { 36000, 16000}, /* stereo */ }; int opus_encoder_get_size(int channels) @@ -263,8 +245,7 @@ int opus_encoder_init(OpusEncoder* st, opus_int32 Fs, int channels, int applicat st->bandwidth = OPUS_BANDWIDTH_FULLBAND; #ifndef DISABLE_FLOAT_API - tonality_analysis_init(&st->analysis, st->Fs); - st->analysis.application = st->application; + tonality_analysis_init(&st->analysis); #endif return OPUS_OK; @@ -342,11 +323,10 @@ static void silk_biquad_float( } #endif -static void hp_cutoff(const opus_val16 *in, opus_int32 cutoff_Hz, opus_val16 *out, opus_val32 *hp_mem, int len, int channels, opus_int32 Fs, int arch) +static void hp_cutoff(const opus_val16 *in, opus_int32 cutoff_Hz, opus_val16 *out, opus_val32 *hp_mem, int len, int channels, opus_int32 Fs) { opus_int32 B_Q28[ 3 ], A_Q28[ 2 ]; opus_int32 Fc_Q19, r_Q28, r_Q22; - (void)arch; silk_assert( cutoff_Hz <= silk_int32_MAX / SILK_FIX_CONST( 1.5 * 3.14159 / 1000, 19 ) ); Fc_Q19 = silk_DIV32_16( silk_SMULBB( SILK_FIX_CONST( 1.5 * 3.14159 / 1000, 19 ), cutoff_Hz ), Fs/1000 ); @@ -366,10 +346,9 @@ static void hp_cutoff(const opus_val16 *in, opus_int32 cutoff_Hz, opus_val16 *ou A_Q28[ 1 ] = silk_SMULWW( r_Q22, r_Q22 ); #ifdef FIXED_POINT - if( channels == 1 ) { - silk_biquad_alt_stride1( in, B_Q28, A_Q28, hp_mem, out, len ); - } else { - silk_biquad_alt_stride2( in, B_Q28, A_Q28, hp_mem, out, len, arch ); + silk_biquad_alt( in, B_Q28, A_Q28, hp_mem, out, len, channels ); + if( channels == 2 ) { + silk_biquad_alt( in+1, B_Q28, A_Q28, hp_mem+2, out+1, len, channels ); } #else silk_biquad_float( in, B_Q28, A_Q28, hp_mem, out, len, channels ); @@ -385,17 +364,21 @@ static void dc_reject(const opus_val16 *in, opus_int32 cutoff_Hz, opus_val16 *ou int c, i; int shift; - /* Approximates -round(log2(6.3*cutoff_Hz/Fs)) */ - shift=celt_ilog2(Fs/(cutoff_Hz*4)); + /* Approximates -round(log2(4.*cutoff_Hz/Fs)) */ + shift=celt_ilog2(Fs/(cutoff_Hz*3)); for (c=0;c<channels;c++) { for (i=0;i<len;i++) { - opus_val32 x, y; - x = SHL32(EXTEND32(in[channels*i+c]), 14); - y = x-hp_mem[2*c]; + opus_val32 x, tmp, y; + x = SHL32(EXTEND32(in[channels*i+c]), 15); + /* First stage */ + tmp = x-hp_mem[2*c]; hp_mem[2*c] = hp_mem[2*c] + PSHR32(x - hp_mem[2*c], shift); - out[channels*i+c] = EXTRACT16(SATURATE(PSHR32(y, 14), 32767)); + /* Second stage */ + y = tmp - hp_mem[2*c+1]; + hp_mem[2*c+1] = hp_mem[2*c+1] + PSHR32(tmp - hp_mem[2*c+1], shift); + out[channels*i+c] = EXTRACT16(SATURATE(PSHR32(y, 15), 32767)); } } } @@ -403,41 +386,24 @@ static void dc_reject(const opus_val16 *in, opus_int32 cutoff_Hz, opus_val16 *ou #else static void dc_reject(const opus_val16 *in, opus_int32 cutoff_Hz, opus_val16 *out, opus_val32 *hp_mem, int len, int channels, opus_int32 Fs) { - int i; - float coef, coef2; - coef = 6.3f*cutoff_Hz/Fs; - coef2 = 1-coef; - if (channels==2) + int c, i; + float coef; + + coef = 4.0f*cutoff_Hz/Fs; + for (c=0;c<channels;c++) { - float m0, m2; - m0 = hp_mem[0]; - m2 = hp_mem[2]; for (i=0;i<len;i++) { - opus_val32 x0, x1, out0, out1; - x0 = in[2*i+0]; - x1 = in[2*i+1]; - out0 = x0-m0; - out1 = x1-m2; - m0 = coef*x0 + VERY_SMALL + coef2*m0; - m2 = coef*x1 + VERY_SMALL + coef2*m2; - out[2*i+0] = out0; - out[2*i+1] = out1; + opus_val32 x, tmp, y; + x = in[channels*i+c]; + /* First stage */ + tmp = x-hp_mem[2*c]; + hp_mem[2*c] = hp_mem[2*c] + coef*(x - hp_mem[2*c]) + VERY_SMALL; + /* Second stage */ + y = tmp - hp_mem[2*c+1]; + hp_mem[2*c+1] = hp_mem[2*c+1] + coef*(tmp - hp_mem[2*c+1]) + VERY_SMALL; + out[channels*i+c] = y; } - hp_mem[0] = m0; - hp_mem[2] = m2; - } else { - float m0; - m0 = hp_mem[0]; - for (i=0;i<len;i++) - { - opus_val32 x, y; - x = in[i]; - y = x-m0; - m0 = coef*x + VERY_SMALL + coef2*m0; - out[i] = y; - } - hp_mem[0] = m0; } } #endif @@ -555,57 +521,287 @@ static opus_int32 user_bitrate_to_bitrate(OpusEncoder *st, int frame_size, int m } #ifndef DISABLE_FLOAT_API +/* Don't use more than 60 ms for the frame size analysis */ +#define MAX_DYNAMIC_FRAMESIZE 24 +/* Estimates how much the bitrate will be boosted based on the sub-frame energy */ +static float transient_boost(const float *E, const float *E_1, int LM, int maxM) +{ + int i; + int M; + float sumE=0, sumE_1=0; + float metric; + + M = IMIN(maxM, (1<<LM)+1); + for (i=0;i<M;i++) + { + sumE += E[i]; + sumE_1 += E_1[i]; + } + metric = sumE*sumE_1/(M*M); + /*if (LM==3) + printf("%f\n", metric);*/ + /*return metric>10 ? 1 : 0;*/ + /*return MAX16(0,1-exp(-.25*(metric-2.)));*/ + return MIN16(1,(float)sqrt(MAX16(0,.05f*(metric-2)))); +} + +/* Viterbi decoding trying to find the best frame size combination using look-ahead + + State numbering: + 0: unused + 1: 2.5 ms + 2: 5 ms (#1) + 3: 5 ms (#2) + 4: 10 ms (#1) + 5: 10 ms (#2) + 6: 10 ms (#3) + 7: 10 ms (#4) + 8: 20 ms (#1) + 9: 20 ms (#2) + 10: 20 ms (#3) + 11: 20 ms (#4) + 12: 20 ms (#5) + 13: 20 ms (#6) + 14: 20 ms (#7) + 15: 20 ms (#8) +*/ +static int transient_viterbi(const float *E, const float *E_1, int N, int frame_cost, int rate) +{ + int i; + float cost[MAX_DYNAMIC_FRAMESIZE][16]; + int states[MAX_DYNAMIC_FRAMESIZE][16]; + float best_cost; + int best_state; + float factor; + /* Take into account that we damp VBR in the 32 kb/s to 64 kb/s range. */ + if (rate<80) + factor=0; + else if (rate>160) + factor=1; + else + factor = (rate-80.f)/80.f; + /* Makes variable framesize less aggressive at lower bitrates, but I can't + find any valid theoretical justification for this (other than it seems + to help) */ + for (i=0;i<16;i++) + { + /* Impossible state */ + states[0][i] = -1; + cost[0][i] = 1e10; + } + for (i=0;i<4;i++) + { + cost[0][1<<i] = (frame_cost + rate*(1<<i))*(1+factor*transient_boost(E, E_1, i, N+1)); + states[0][1<<i] = i; + } + for (i=1;i<N;i++) + { + int j; + + /* Follow continuations */ + for (j=2;j<16;j++) + { + cost[i][j] = cost[i-1][j-1]; + states[i][j] = j-1; + } + + /* New frames */ + for(j=0;j<4;j++) + { + int k; + float min_cost; + float curr_cost; + states[i][1<<j] = 1; + min_cost = cost[i-1][1]; + for(k=1;k<4;k++) + { + float tmp = cost[i-1][(1<<(k+1))-1]; + if (tmp < min_cost) + { + states[i][1<<j] = (1<<(k+1))-1; + min_cost = tmp; + } + } + curr_cost = (frame_cost + rate*(1<<j))*(1+factor*transient_boost(E+i, E_1+i, j, N-i+1)); + cost[i][1<<j] = min_cost; + /* If part of the frame is outside the analysis window, only count part of the cost */ + if (N-i < (1<<j)) + cost[i][1<<j] += curr_cost*(float)(N-i)/(1<<j); + else + cost[i][1<<j] += curr_cost; + } + } + + best_state=1; + best_cost = cost[N-1][1]; + /* Find best end state (doesn't force a frame to end at N-1) */ + for (i=2;i<16;i++) + { + if (cost[N-1][i]<best_cost) + { + best_cost = cost[N-1][i]; + best_state = i; + } + } + + /* Follow transitions back */ + for (i=N-1;i>=0;i--) + { + /*printf("%d ", best_state);*/ + best_state = states[i][best_state]; + } + /*printf("%d\n", best_state);*/ + return best_state; +} + +static int optimize_framesize(const void *x, int len, int C, opus_int32 Fs, + int bitrate, opus_val16 tonality, float *mem, int buffering, + downmix_func downmix) +{ + int N; + int i; + float e[MAX_DYNAMIC_FRAMESIZE+4]; + float e_1[MAX_DYNAMIC_FRAMESIZE+3]; + opus_val32 memx; + int bestLM=0; + int subframe; + int pos; + int offset; + VARDECL(opus_val32, sub); + + subframe = Fs/400; + ALLOC(sub, subframe, opus_val32); + e[0]=mem[0]; + e_1[0]=1.f/(EPSILON+mem[0]); + if (buffering) + { + /* Consider the CELT delay when not in restricted-lowdelay */ + /* We assume the buffering is between 2.5 and 5 ms */ + offset = 2*subframe - buffering; + celt_assert(offset>=0 && offset <= subframe); + len -= offset; + e[1]=mem[1]; + e_1[1]=1.f/(EPSILON+mem[1]); + e[2]=mem[2]; + e_1[2]=1.f/(EPSILON+mem[2]); + pos = 3; + } else { + pos=1; + offset=0; + } + N=IMIN(len/subframe, MAX_DYNAMIC_FRAMESIZE); + /* Just silencing a warning, it's really initialized later */ + memx = 0; + for (i=0;i<N;i++) + { + float tmp; + opus_val32 tmpx; + int j; + tmp=EPSILON; + + downmix(x, sub, subframe, i*subframe+offset, 0, -2, C); + if (i==0) + memx = sub[0]; + for (j=0;j<subframe;j++) + { + tmpx = sub[j]; + tmp += (tmpx-memx)*(float)(tmpx-memx); + memx = tmpx; + } + e[i+pos] = tmp; + e_1[i+pos] = 1.f/tmp; + } + /* Hack to get 20 ms working with APPLICATION_AUDIO + The real problem is that the corresponding memory needs to use 1.5 ms + from this frame and 1 ms from the next frame */ + e[i+pos] = e[i+pos-1]; + if (buffering) + N=IMIN(MAX_DYNAMIC_FRAMESIZE, N+2); + bestLM = transient_viterbi(e, e_1, N, (int)((1.f+.5f*tonality)*(60*C+40)), bitrate/400); + mem[0] = e[1<<bestLM]; + if (buffering) + { + mem[1] = e[(1<<bestLM)+1]; + mem[2] = e[(1<<bestLM)+2]; + } + return bestLM; +} + +#endif + +#ifndef DISABLE_FLOAT_API #ifdef FIXED_POINT #define PCM2VAL(x) FLOAT2INT16(x) #else #define PCM2VAL(x) SCALEIN(x) #endif - -void downmix_float(const void *_x, opus_val32 *y, int subframe, int offset, int c1, int c2, int C) +void downmix_float(const void *_x, opus_val32 *sub, int subframe, int offset, int c1, int c2, int C) { const float *x; + opus_val32 scale; int j; - x = (const float *)_x; for (j=0;j<subframe;j++) - y[j] = PCM2VAL(x[(j+offset)*C+c1]); + sub[j] = PCM2VAL(x[(j+offset)*C+c1]); if (c2>-1) { for (j=0;j<subframe;j++) - y[j] += PCM2VAL(x[(j+offset)*C+c2]); + sub[j] += PCM2VAL(x[(j+offset)*C+c2]); } else if (c2==-2) { int c; for (c=1;c<C;c++) { for (j=0;j<subframe;j++) - y[j] += PCM2VAL(x[(j+offset)*C+c]); + sub[j] += PCM2VAL(x[(j+offset)*C+c]); } } +#ifdef FIXED_POINT + scale = (1<<SIG_SHIFT); +#else + scale = 1.f; +#endif + if (C==-2) + scale /= C; + else + scale /= 2; + for (j=0;j<subframe;j++) + sub[j] *= scale; } #endif -void downmix_int(const void *_x, opus_val32 *y, int subframe, int offset, int c1, int c2, int C) +void downmix_int(const void *_x, opus_val32 *sub, int subframe, int offset, int c1, int c2, int C) { const opus_int16 *x; + opus_val32 scale; int j; - x = (const opus_int16 *)_x; for (j=0;j<subframe;j++) - y[j] = x[(j+offset)*C+c1]; + sub[j] = x[(j+offset)*C+c1]; if (c2>-1) { for (j=0;j<subframe;j++) - y[j] += x[(j+offset)*C+c2]; + sub[j] += x[(j+offset)*C+c2]; } else if (c2==-2) { int c; for (c=1;c<C;c++) { for (j=0;j<subframe;j++) - y[j] += x[(j+offset)*C+c]; + sub[j] += x[(j+offset)*C+c]; } } +#ifdef FIXED_POINT + scale = (1<<SIG_SHIFT); +#else + scale = 1.f/32768; +#endif + if (C==-2) + scale /= C; + else + scale /= 2; + for (j=0;j<subframe;j++) + sub[j] *= scale; } opus_int32 frame_size_select(opus_int32 frame_size, int variable_duration, opus_int32 Fs) @@ -615,24 +811,53 @@ opus_int32 frame_size_select(opus_int32 frame_size, int variable_duration, opus_ return -1; if (variable_duration == OPUS_FRAMESIZE_ARG) new_size = frame_size; - else if (variable_duration >= OPUS_FRAMESIZE_2_5_MS && variable_duration <= OPUS_FRAMESIZE_120_MS) - { - if (variable_duration <= OPUS_FRAMESIZE_40_MS) - new_size = (Fs/400)<<(variable_duration-OPUS_FRAMESIZE_2_5_MS); - else - new_size = (variable_duration-OPUS_FRAMESIZE_2_5_MS-2)*Fs/50; - } + else if (variable_duration == OPUS_FRAMESIZE_VARIABLE) + new_size = Fs/50; + else if (variable_duration >= OPUS_FRAMESIZE_2_5_MS && variable_duration <= OPUS_FRAMESIZE_60_MS) + new_size = IMIN(3*Fs/50, (Fs/400)<<(variable_duration-OPUS_FRAMESIZE_2_5_MS)); else return -1; if (new_size>frame_size) return -1; - if (400*new_size!=Fs && 200*new_size!=Fs && 100*new_size!=Fs && - 50*new_size!=Fs && 25*new_size!=Fs && 50*new_size!=3*Fs && - 50*new_size!=4*Fs && 50*new_size!=5*Fs && 50*new_size!=6*Fs) + if (400*new_size!=Fs && 200*new_size!=Fs && 100*new_size!=Fs && + 50*new_size!=Fs && 25*new_size!=Fs && 50*new_size!=3*Fs) return -1; return new_size; } +opus_int32 compute_frame_size(const void *analysis_pcm, int frame_size, + int variable_duration, int C, opus_int32 Fs, int bitrate_bps, + int delay_compensation, downmix_func downmix +#ifndef DISABLE_FLOAT_API + , float *subframe_mem +#endif + ) +{ +#ifndef DISABLE_FLOAT_API + if (variable_duration == OPUS_FRAMESIZE_VARIABLE && frame_size >= Fs/200) + { + int LM = 3; + LM = optimize_framesize(analysis_pcm, frame_size, C, Fs, bitrate_bps, + 0, subframe_mem, delay_compensation, downmix); + while ((Fs/400<<LM)>frame_size) + LM--; + frame_size = (Fs/400<<LM); + } else +#else + (void)analysis_pcm; + (void)C; + (void)bitrate_bps; + (void)delay_compensation; + (void)downmix; +#endif + { + frame_size = frame_size_select(frame_size, variable_duration, Fs); + } + if (frame_size<0) + return -1; + return frame_size; +} + opus_val16 compute_stereo_width(const opus_val16 *pcm, int frame_size, opus_int32 Fs, StereoWidthState *mem) { opus_val32 xx, xy, yy; @@ -679,12 +904,6 @@ opus_val16 compute_stereo_width(const opus_val16 *pcm, int frame_size, opus_int3 xy += SHR32(pxy, 10); yy += SHR32(pyy, 10); } -#ifndef FIXED_POINT - if (!(xx < 1e9f) || celt_isnan(xx) || !(yy < 1e9f) || celt_isnan(yy)) - { - xy = xx = yy = 0; - } -#endif mem->XX += MULT16_32_Q15(short_alpha, xx-mem->XX); mem->XY += MULT16_32_Q15(short_alpha, xy-mem->XY); mem->YY += MULT16_32_Q15(short_alpha, yy-mem->YY); @@ -715,354 +934,6 @@ opus_val16 compute_stereo_width(const opus_val16 *pcm, int frame_size, opus_int3 return EXTRACT16(MIN32(Q15ONE, MULT16_16(20, mem->max_follower))); } -static int decide_fec(int useInBandFEC, int PacketLoss_perc, int last_fec, int mode, int *bandwidth, opus_int32 rate) -{ - int orig_bandwidth; - if (!useInBandFEC || PacketLoss_perc == 0 || mode == MODE_CELT_ONLY) - return 0; - orig_bandwidth = *bandwidth; - for (;;) - { - opus_int32 hysteresis; - opus_int32 LBRR_rate_thres_bps; - /* Compute threshold for using FEC at the current bandwidth setting */ - LBRR_rate_thres_bps = fec_thresholds[2*(*bandwidth - OPUS_BANDWIDTH_NARROWBAND)]; - hysteresis = fec_thresholds[2*(*bandwidth - OPUS_BANDWIDTH_NARROWBAND) + 1]; - if (last_fec == 1) LBRR_rate_thres_bps -= hysteresis; - if (last_fec == 0) LBRR_rate_thres_bps += hysteresis; - LBRR_rate_thres_bps = silk_SMULWB( silk_MUL( LBRR_rate_thres_bps, - 125 - silk_min( PacketLoss_perc, 25 ) ), SILK_FIX_CONST( 0.01, 16 ) ); - /* If loss <= 5%, we look at whether we have enough rate to enable FEC. - If loss > 5%, we decrease the bandwidth until we can enable FEC. */ - if (rate > LBRR_rate_thres_bps) - return 1; - else if (PacketLoss_perc <= 5) - return 0; - else if (*bandwidth > OPUS_BANDWIDTH_NARROWBAND) - (*bandwidth)--; - else - break; - } - /* Couldn't find any bandwidth to enable FEC, keep original bandwidth. */ - *bandwidth = orig_bandwidth; - return 0; -} - -static int compute_silk_rate_for_hybrid(int rate, int bandwidth, int frame20ms, int vbr, int fec, int channels) { - int entry; - int i; - int N; - int silk_rate; - static int rate_table[][5] = { - /* |total| |-------- SILK------------| - |-- No FEC -| |--- FEC ---| - 10ms 20ms 10ms 20ms */ - { 0, 0, 0, 0, 0}, - {12000, 10000, 10000, 11000, 11000}, - {16000, 13500, 13500, 15000, 15000}, - {20000, 16000, 16000, 18000, 18000}, - {24000, 18000, 18000, 21000, 21000}, - {32000, 22000, 22000, 28000, 28000}, - {64000, 38000, 38000, 50000, 50000} - }; - /* Do the allocation per-channel. */ - rate /= channels; - entry = 1 + frame20ms + 2*fec; - N = sizeof(rate_table)/sizeof(rate_table[0]); - for (i=1;i<N;i++) - { - if (rate_table[i][0] > rate) break; - } - if (i == N) - { - silk_rate = rate_table[i-1][entry]; - /* For now, just give 50% of the extra bits to SILK. */ - silk_rate += (rate-rate_table[i-1][0])/2; - } else { - opus_int32 lo, hi, x0, x1; - lo = rate_table[i-1][entry]; - hi = rate_table[i][entry]; - x0 = rate_table[i-1][0]; - x1 = rate_table[i][0]; - silk_rate = (lo*(x1-rate) + hi*(rate-x0))/(x1-x0); - } - if (!vbr) - { - /* Tiny boost to SILK for CBR. We should probably tune this better. */ - silk_rate += 100; - } - if (bandwidth==OPUS_BANDWIDTH_SUPERWIDEBAND) - silk_rate += 300; - silk_rate *= channels; - /* Small adjustment for stereo (calibrated for 32 kb/s, haven't tried other bitrates). */ - if (channels == 2 && rate >= 12000) - silk_rate -= 1000; - return silk_rate; -} - -/* Returns the equivalent bitrate corresponding to 20 ms frames, - complexity 10 VBR operation. */ -static opus_int32 compute_equiv_rate(opus_int32 bitrate, int channels, - int frame_rate, int vbr, int mode, int complexity, int loss) -{ - opus_int32 equiv; - equiv = bitrate; - /* Take into account overhead from smaller frames. */ - if (frame_rate > 50) - equiv -= (40*channels+20)*(frame_rate - 50); - /* CBR is about a 8% penalty for both SILK and CELT. */ - if (!vbr) - equiv -= equiv/12; - /* Complexity makes about 10% difference (from 0 to 10) in general. */ - equiv = equiv * (90+complexity)/100; - if (mode == MODE_SILK_ONLY || mode == MODE_HYBRID) - { - /* SILK complexity 0-1 uses the non-delayed-decision NSQ, which - costs about 20%. */ - if (complexity<2) - equiv = equiv*4/5; - equiv -= equiv*loss/(6*loss + 10); - } else if (mode == MODE_CELT_ONLY) { - /* CELT complexity 0-4 doesn't have the pitch filter, which costs - about 10%. */ - if (complexity<5) - equiv = equiv*9/10; - } else { - /* Mode not known yet */ - /* Half the SILK loss*/ - equiv -= equiv*loss/(12*loss + 20); - } - return equiv; -} - -#ifndef DISABLE_FLOAT_API - -int is_digital_silence(const opus_val16* pcm, int frame_size, int channels, int lsb_depth) -{ - int silence = 0; - opus_val32 sample_max = 0; -#ifdef MLP_TRAINING - return 0; -#endif - sample_max = celt_maxabs16(pcm, frame_size*channels); - -#ifdef FIXED_POINT - silence = (sample_max == 0); - (void)lsb_depth; -#else - silence = (sample_max <= (opus_val16) 1 / (1 << lsb_depth)); -#endif - - return silence; -} - -#ifdef FIXED_POINT -static opus_val32 compute_frame_energy(const opus_val16 *pcm, int frame_size, int channels, int arch) -{ - int i; - opus_val32 sample_max; - int max_shift; - int shift; - opus_val32 energy = 0; - int len = frame_size*channels; - (void)arch; - /* Max amplitude in the signal */ - sample_max = celt_maxabs16(pcm, len); - - /* Compute the right shift required in the MAC to avoid an overflow */ - max_shift = celt_ilog2(len); - shift = IMAX(0, (celt_ilog2(sample_max) << 1) + max_shift - 28); - - /* Compute the energy */ - for (i=0; i<len; i++) - energy += SHR32(MULT16_16(pcm[i], pcm[i]), shift); - - /* Normalize energy by the frame size and left-shift back to the original position */ - energy /= len; - energy = SHL32(energy, shift); - - return energy; -} -#else -static opus_val32 compute_frame_energy(const opus_val16 *pcm, int frame_size, int channels, int arch) -{ - int len = frame_size*channels; - return celt_inner_prod(pcm, pcm, len, arch)/len; -} -#endif - -/* Decides if DTX should be turned on (=1) or off (=0) */ -static int decide_dtx_mode(float activity_probability, /* probability that current frame contains speech/music */ - int *nb_no_activity_frames, /* number of consecutive frames with no activity */ - opus_val32 peak_signal_energy, /* peak energy of desired signal detected so far */ - const opus_val16 *pcm, /* input pcm signal */ - int frame_size, /* frame size */ - int channels, - int is_silence, /* only digital silence detected in this frame */ - int arch - ) -{ - opus_val32 noise_energy; - - if (!is_silence) - { - if (activity_probability < DTX_ACTIVITY_THRESHOLD) /* is noise */ - { - noise_energy = compute_frame_energy(pcm, frame_size, channels, arch); - - /* but is sufficiently quiet */ - is_silence = peak_signal_energy >= (PSEUDO_SNR_THRESHOLD * noise_energy); - } - } - - if (is_silence) - { - /* The number of consecutive DTX frames should be within the allowed bounds */ - (*nb_no_activity_frames)++; - - if (*nb_no_activity_frames > NB_SPEECH_FRAMES_BEFORE_DTX) - { - if (*nb_no_activity_frames <= (NB_SPEECH_FRAMES_BEFORE_DTX + MAX_CONSECUTIVE_DTX)) - /* Valid frame for DTX! */ - return 1; - else - (*nb_no_activity_frames) = NB_SPEECH_FRAMES_BEFORE_DTX; - } - } else - (*nb_no_activity_frames) = 0; - - return 0; -} - -#endif - -static opus_int32 encode_multiframe_packet(OpusEncoder *st, - const opus_val16 *pcm, - int nb_frames, - int frame_size, - unsigned char *data, - opus_int32 out_data_bytes, - int to_celt, - int lsb_depth, - int float_api) -{ - int i; - int ret = 0; - VARDECL(unsigned char, tmp_data); - int bak_mode, bak_bandwidth, bak_channels, bak_to_mono; - VARDECL(OpusRepacketizer, rp); - int max_header_bytes; - opus_int32 bytes_per_frame; - opus_int32 cbr_bytes; - opus_int32 repacketize_len; - int tmp_len; - ALLOC_STACK; - - /* Worst cases: - * 2 frames: Code 2 with different compressed sizes - * >2 frames: Code 3 VBR */ - max_header_bytes = nb_frames == 2 ? 3 : (2+(nb_frames-1)*2); - - if (st->use_vbr || st->user_bitrate_bps==OPUS_BITRATE_MAX) - repacketize_len = out_data_bytes; - else { - cbr_bytes = 3*st->bitrate_bps/(3*8*st->Fs/(frame_size*nb_frames)); - repacketize_len = IMIN(cbr_bytes, out_data_bytes); - } - bytes_per_frame = IMIN(1276, 1+(repacketize_len-max_header_bytes)/nb_frames); - - ALLOC(tmp_data, nb_frames*bytes_per_frame, unsigned char); - ALLOC(rp, 1, OpusRepacketizer); - opus_repacketizer_init(rp); - - bak_mode = st->user_forced_mode; - bak_bandwidth = st->user_bandwidth; - bak_channels = st->force_channels; - - st->user_forced_mode = st->mode; - st->user_bandwidth = st->bandwidth; - st->force_channels = st->stream_channels; - - bak_to_mono = st->silk_mode.toMono; - if (bak_to_mono) - st->force_channels = 1; - else - st->prev_channels = st->stream_channels; - - for (i=0;i<nb_frames;i++) - { - st->silk_mode.toMono = 0; - st->nonfinal_frame = i<(nb_frames-1); - - /* When switching from SILK/Hybrid to CELT, only ask for a switch at the last frame */ - if (to_celt && i==nb_frames-1) - st->user_forced_mode = MODE_CELT_ONLY; - - tmp_len = opus_encode_native(st, pcm+i*(st->channels*frame_size), frame_size, - tmp_data+i*bytes_per_frame, bytes_per_frame, lsb_depth, NULL, 0, 0, 0, 0, - NULL, float_api); - - if (tmp_len<0) - { - RESTORE_STACK; - return OPUS_INTERNAL_ERROR; - } - - ret = opus_repacketizer_cat(rp, tmp_data+i*bytes_per_frame, tmp_len); - - if (ret<0) - { - RESTORE_STACK; - return OPUS_INTERNAL_ERROR; - } - } - - ret = opus_repacketizer_out_range_impl(rp, 0, nb_frames, data, repacketize_len, 0, !st->use_vbr); - - if (ret<0) - { - RESTORE_STACK; - return OPUS_INTERNAL_ERROR; - } - - /* Discard configs that were forced locally for the purpose of repacketization */ - st->user_forced_mode = bak_mode; - st->user_bandwidth = bak_bandwidth; - st->force_channels = bak_channels; - st->silk_mode.toMono = bak_to_mono; - - RESTORE_STACK; - return ret; -} - -static int compute_redundancy_bytes(opus_int32 max_data_bytes, opus_int32 bitrate_bps, int frame_rate, int channels) -{ - int redundancy_bytes_cap; - int redundancy_bytes; - opus_int32 redundancy_rate; - int base_bits; - opus_int32 available_bits; - base_bits = (40*channels+20); - - /* Equivalent rate for 5 ms frames. */ - redundancy_rate = bitrate_bps + base_bits*(200 - frame_rate); - /* For VBR, further increase the bitrate if we can afford it. It's pretty short - and we'll avoid artefacts. */ - redundancy_rate = 3*redundancy_rate/2; - redundancy_bytes = redundancy_rate/1600; - - /* Compute the max rate we can use given CBR or VBR with cap. */ - available_bits = max_data_bytes*8 - 2*base_bits; - redundancy_bytes_cap = (available_bits*240/(240+48000/frame_rate) + base_bits)/8; - redundancy_bytes = IMIN(redundancy_bytes, redundancy_bytes_cap); - /* It we can't get enough bits for redundancy to be worth it, rely on the decoder PLC. */ - if (redundancy_bytes > 4 + 8*channels) - redundancy_bytes = IMIN(257, redundancy_bytes); - else - redundancy_bytes = 0; - return redundancy_bytes; -} - opus_int32 opus_encode_native(OpusEncoder *st, const opus_val16 *pcm, int frame_size, unsigned char *data, opus_int32 out_data_bytes, int lsb_depth, const void *analysis_pcm, opus_int32 analysis_size, int c1, int c2, @@ -1100,7 +971,6 @@ opus_int32 opus_encode_native(OpusEncoder *st, const opus_val16 *pcm, int frame_ AnalysisInfo analysis_info; int analysis_read_pos_bak=-1; int analysis_read_subframe_bak=-1; - int is_silence = 0; #endif VARDECL(opus_val16, tmp_prefill); @@ -1109,19 +979,15 @@ opus_int32 opus_encode_native(OpusEncoder *st, const opus_val16 *pcm, int frame_ max_data_bytes = IMIN(1276, out_data_bytes); st->rangeFinal = 0; - if (frame_size <= 0 || max_data_bytes <= 0) + if ((!st->variable_duration && 400*frame_size != st->Fs && 200*frame_size != st->Fs && 100*frame_size != st->Fs && + 50*frame_size != st->Fs && 25*frame_size != st->Fs && 50*frame_size != 3*st->Fs) + || (400*frame_size < st->Fs) + || max_data_bytes<=0 + ) { RESTORE_STACK; return OPUS_BAD_ARG; } - - /* Cannot encode 100 ms in 1 byte */ - if (max_data_bytes==1 && st->Fs==(frame_size*10)) - { - RESTORE_STACK; - return OPUS_BUFFER_TOO_SMALL; - } - silk_enc = (char*)st+st->silk_enc_offset; celt_enc = (CELTEncoder*)((char*)st+st->celt_enc_offset); if (st->application == OPUS_APPLICATION_RESTRICTED_LOWDELAY) @@ -1135,55 +1001,31 @@ opus_int32 opus_encode_native(OpusEncoder *st, const opus_val16 *pcm, int frame_ #ifndef DISABLE_FLOAT_API analysis_info.valid = 0; #ifdef FIXED_POINT - if (st->silk_mode.complexity >= 10 && st->Fs>=16000) + if (st->silk_mode.complexity >= 10 && st->Fs==48000) #else - if (st->silk_mode.complexity >= 7 && st->Fs>=16000) + if (st->silk_mode.complexity >= 7 && st->Fs==48000) #endif { - is_silence = is_digital_silence(pcm, frame_size, st->channels, lsb_depth); analysis_read_pos_bak = st->analysis.read_pos; analysis_read_subframe_bak = st->analysis.read_subframe; run_analysis(&st->analysis, celt_mode, analysis_pcm, analysis_size, frame_size, c1, c2, analysis_channels, st->Fs, lsb_depth, downmix, &analysis_info); - - /* Track the peak signal energy */ - if (!is_silence && analysis_info.activity_probability > DTX_ACTIVITY_THRESHOLD) - st->peak_signal_energy = MAX32(MULT16_32_Q15(QCONST16(0.999f, 15), st->peak_signal_energy), - compute_frame_energy(pcm, frame_size, st->channels, st->arch)); - } else if (st->analysis.initialized) { - tonality_analysis_reset(&st->analysis); } #else (void)analysis_pcm; (void)analysis_size; - (void)c1; - (void)c2; - (void)analysis_channels; - (void)downmix; #endif -#ifndef DISABLE_FLOAT_API - /* Reset voice_ratio if this frame is not silent or if analysis is disabled. - * Otherwise, preserve voice_ratio from the last non-silent frame */ - if (!is_silence) - st->voice_ratio = -1; + st->voice_ratio = -1; +#ifndef DISABLE_FLOAT_API st->detected_bandwidth = 0; if (analysis_info.valid) { int analysis_bandwidth; if (st->signal_type == OPUS_AUTO) - { - float prob; - if (st->prev_mode == 0) - prob = analysis_info.music_prob; - else if (st->prev_mode == MODE_CELT_ONLY) - prob = analysis_info.music_prob_max; - else - prob = analysis_info.music_prob_min; - st->voice_ratio = (int)floor(.5+100*(1-prob)); - } + st->voice_ratio = (int)floor(.5+100*(1-analysis_info.music_prob)); analysis_bandwidth = analysis_info.bandwidth; if (analysis_bandwidth<=12) @@ -1197,8 +1039,6 @@ opus_int32 opus_encode_native(OpusEncoder *st, const opus_val16 *pcm, int frame_ else st->detected_bandwidth = OPUS_BANDWIDTH_FULLBAND; } -#else - st->voice_ratio = -1; #endif if (st->channels==2 && st->force_channels!=1) @@ -1212,13 +1052,12 @@ opus_int32 opus_encode_native(OpusEncoder *st, const opus_val16 *pcm, int frame_ if (!st->use_vbr) { int cbrBytes; - /* Multiply by 12 to make sure the division is exact. */ - int frame_rate12 = 12*st->Fs/frame_size; + /* Multiply by 3 to make sure the division is exact. */ + int frame_rate3 = 3*st->Fs/frame_size; /* We need to make sure that "int" values always fit in 16 bits. */ - cbrBytes = IMIN( (12*st->bitrate_bps/8 + frame_rate12/2)/frame_rate12, max_data_bytes); - st->bitrate_bps = cbrBytes*(opus_int32)frame_rate12*8/12; - /* Make sure we provide at least one byte to avoid failing. */ - max_data_bytes = IMAX(1, cbrBytes); + cbrBytes = IMIN( (3*st->bitrate_bps/8 + frame_rate3/2)/frame_rate3, max_data_bytes); + st->bitrate_bps = cbrBytes*(opus_int32)frame_rate3*8/3; + max_data_bytes = cbrBytes; } if (max_data_bytes<3 || st->bitrate_bps < 3*frame_rate*8 || (frame_rate<50 && (max_data_bytes*frame_rate<300 || st->bitrate_bps < 2400))) @@ -1226,63 +1065,25 @@ opus_int32 opus_encode_native(OpusEncoder *st, const opus_val16 *pcm, int frame_ /*If the space is too low to do something useful, emit 'PLC' frames.*/ int tocmode = st->mode; int bw = st->bandwidth == 0 ? OPUS_BANDWIDTH_NARROWBAND : st->bandwidth; - int packet_code = 0; - int num_multiframes = 0; - if (tocmode==0) tocmode = MODE_SILK_ONLY; if (frame_rate>100) tocmode = MODE_CELT_ONLY; - /* 40 ms -> 2 x 20 ms if in CELT_ONLY or HYBRID mode */ - if (frame_rate==25 && tocmode!=MODE_SILK_ONLY) - { - frame_rate = 50; - packet_code = 1; - } - - /* >= 60 ms frames */ - if (frame_rate<=16) - { - /* 1 x 60 ms, 2 x 40 ms, 2 x 60 ms */ - if (out_data_bytes==1 || (tocmode==MODE_SILK_ONLY && frame_rate!=10)) - { - tocmode = MODE_SILK_ONLY; - - packet_code = frame_rate <= 12; - frame_rate = frame_rate == 12 ? 25 : 16; - } - else - { - num_multiframes = 50/frame_rate; - frame_rate = 50; - packet_code = 3; - } - } - + if (frame_rate < 50) + tocmode = MODE_SILK_ONLY; if(tocmode==MODE_SILK_ONLY&&bw>OPUS_BANDWIDTH_WIDEBAND) bw=OPUS_BANDWIDTH_WIDEBAND; else if (tocmode==MODE_CELT_ONLY&&bw==OPUS_BANDWIDTH_MEDIUMBAND) bw=OPUS_BANDWIDTH_NARROWBAND; else if (tocmode==MODE_HYBRID&&bw<=OPUS_BANDWIDTH_SUPERWIDEBAND) bw=OPUS_BANDWIDTH_SUPERWIDEBAND; - data[0] = gen_toc(tocmode, frame_rate, bw, st->stream_channels); - data[0] |= packet_code; - - ret = packet_code <= 1 ? 1 : 2; - - max_data_bytes = IMAX(max_data_bytes, ret); - - if (packet_code==3) - data[1] = num_multiframes; - + ret = 1; if (!st->use_vbr) { ret = opus_packet_pad(data, ret, max_data_bytes); if (ret == OPUS_OK) ret = max_data_bytes; - else - ret = OPUS_INTERNAL_ERROR; } RESTORE_STACK; return ret; @@ -1290,8 +1091,7 @@ opus_int32 opus_encode_native(OpusEncoder *st, const opus_val16 *pcm, int frame_ max_rate = frame_rate*max_data_bytes*8; /* Equivalent 20-ms rate for mode/channel/bandwidth decisions */ - equiv_rate = compute_equiv_rate(st->bitrate_bps, st->channels, st->Fs/frame_size, - st->use_vbr, 0, st->silk_mode.complexity, st->silk_mode.packetLossPercentage); + equiv_rate = st->bitrate_bps - (40*st->channels+20)*(st->Fs/frame_size - 50); if (st->signal_type == OPUS_SIGNAL_VOICE) voice_est = 127; @@ -1332,17 +1132,7 @@ opus_int32 opus_encode_native(OpusEncoder *st, const opus_val16 *pcm, int frame_ } #endif } - /* Update equivalent rate for channels decision. */ - equiv_rate = compute_equiv_rate(st->bitrate_bps, st->stream_channels, st->Fs/frame_size, - st->use_vbr, 0, st->silk_mode.complexity, st->silk_mode.packetLossPercentage); - - /* Allow SILK DTX if DTX is enabled but the generalized DTX cannot be used, - e.g. because of the complexity setting or sample rate. */ -#ifndef DISABLE_FLOAT_API - st->silk_mode.useDTX = st->use_dtx && !(analysis_info.valid || is_silence); -#else - st->silk_mode.useDTX = st->use_dtx; -#endif + equiv_rate = st->bitrate_bps - (40*st->stream_channels+20)*(st->Fs/frame_size - 50); /* Mode selection depending on application and signal type */ if (st->application == OPUS_APPLICATION_RESTRICTED_LOWDELAY) @@ -1391,15 +1181,10 @@ opus_int32 opus_encode_native(OpusEncoder *st, const opus_val16 *pcm, int frame_ /* When FEC is enabled and there's enough packet loss, use SILK */ if (st->silk_mode.useInBandFEC && st->silk_mode.packetLossPercentage > (128-voice_est)>>4) st->mode = MODE_SILK_ONLY; - /* When encoding voice and DTX is enabled but the generalized DTX cannot be used, - use SILK in order to make use of its DTX. */ + /* When encoding voice and DTX is enabled, set the encoder to SILK mode (at least for now) */ if (st->silk_mode.useDTX && voice_est > 100) st->mode = MODE_SILK_ONLY; #endif - - /* If max_data_bytes represents less than 6 kb/s, switch to CELT-only mode */ - if (max_data_bytes < (frame_rate > 50 ? 9000 : 6000)*frame_size / (st->Fs * 8)) - st->mode = MODE_CELT_ONLY; } else { st->mode = st->user_forced_mode; } @@ -1409,6 +1194,19 @@ opus_int32 opus_encode_native(OpusEncoder *st, const opus_val16 *pcm, int frame_ st->mode = MODE_CELT_ONLY; if (st->lfe) st->mode = MODE_CELT_ONLY; + /* If max_data_bytes represents less than 8 kb/s, switch to CELT-only mode */ + if (max_data_bytes < (frame_rate > 50 ? 12000 : 8000)*frame_size / (st->Fs * 8)) + st->mode = MODE_CELT_ONLY; + + if (st->stream_channels == 1 && st->prev_channels ==2 && st->silk_mode.toMono==0 + && st->mode != MODE_CELT_ONLY && st->prev_mode != MODE_CELT_ONLY) + { + /* Delay stereo->mono transition by two frames so that SILK can do a smooth downmix */ + st->silk_mode.toMono = 1; + st->stream_channels = 2; + } else { + st->silk_mode.toMono = 0; + } if (st->prev_mode > 0 && ((st->mode != MODE_CELT_ONLY && st->prev_mode == MODE_CELT_ONLY) || @@ -1428,22 +1226,23 @@ opus_int32 opus_encode_native(OpusEncoder *st, const opus_val16 *pcm, int frame_ } } } - - /* When encoding multiframes, we can ask for a switch to CELT only in the last frame. This switch - * is processed above as the requested mode shouldn't interrupt stereo->mono transition. */ - if (st->stream_channels == 1 && st->prev_channels ==2 && st->silk_mode.toMono==0 - && st->mode != MODE_CELT_ONLY && st->prev_mode != MODE_CELT_ONLY) + /* For the first frame at a new SILK bandwidth */ + if (st->silk_bw_switch) { - /* Delay stereo->mono transition by two frames so that SILK can do a smooth downmix */ - st->silk_mode.toMono = 1; - st->stream_channels = 2; - } else { - st->silk_mode.toMono = 0; + redundancy = 1; + celt_to_silk = 1; + st->silk_bw_switch = 0; + prefill=1; } - /* Update equivalent rate with mode decision. */ - equiv_rate = compute_equiv_rate(st->bitrate_bps, st->stream_channels, st->Fs/frame_size, - st->use_vbr, st->mode, st->silk_mode.complexity, st->silk_mode.packetLossPercentage); + if (redundancy) + { + /* Fair share of the max size allowed */ + redundancy_bytes = IMIN(257, max_data_bytes*(opus_int32)(st->Fs/200)/(frame_size+st->Fs/200)); + /* For VBR, target the actual bitrate (subject to the limit above) */ + if (st->use_vbr) + redundancy_bytes = IMIN(redundancy_bytes, st->bitrate_bps/1600); + } if (st->mode != MODE_CELT_ONLY && st->prev_mode == MODE_CELT_ONLY) { @@ -1458,7 +1257,17 @@ opus_int32 opus_encode_native(OpusEncoder *st, const opus_val16 *pcm, int frame_ const opus_int32 *voice_bandwidth_thresholds, *music_bandwidth_thresholds; opus_int32 bandwidth_thresholds[8]; int bandwidth = OPUS_BANDWIDTH_FULLBAND; + opus_int32 equiv_rate2; + equiv_rate2 = equiv_rate; + if (st->mode != MODE_CELT_ONLY) + { + /* Adjust the threshold +/- 10% depending on complexity */ + equiv_rate2 = equiv_rate2 * (45+st->silk_mode.complexity)/50; + /* CBR is less efficient by ~1 kb/s */ + if (!st->use_vbr) + equiv_rate2 -= 1000; + } if (st->channels==2 && st->force_channels!=1) { voice_bandwidth_thresholds = stereo_voice_bandwidth_thresholds; @@ -1479,19 +1288,15 @@ opus_int32 opus_encode_native(OpusEncoder *st, const opus_val16 *pcm, int frame_ hysteresis = bandwidth_thresholds[2*(bandwidth-OPUS_BANDWIDTH_MEDIUMBAND)+1]; if (!st->first) { - if (st->auto_bandwidth >= bandwidth) + if (st->bandwidth >= bandwidth) threshold -= hysteresis; else threshold += hysteresis; } - if (equiv_rate >= threshold) + if (equiv_rate2 >= threshold) break; } while (--bandwidth>OPUS_BANDWIDTH_NARROWBAND); - /* We don't use mediumband anymore, except when explicitly requested or during - mode transitions. */ - if (bandwidth == OPUS_BANDWIDTH_MEDIUMBAND) - bandwidth = OPUS_BANDWIDTH_WIDEBAND; - st->bandwidth = st->auto_bandwidth = bandwidth; + st->bandwidth = bandwidth; /* Prevents any transition to SWB/FB until the SILK layer has fully switched to WB mode and turned the variable LP filter off */ if (!st->first && st->mode != MODE_CELT_ONLY && !st->silk_mode.inWBmodeWithoutVariableLP && st->bandwidth > OPUS_BANDWIDTH_WIDEBAND) @@ -1544,8 +1349,6 @@ opus_int32 opus_encode_native(OpusEncoder *st, const opus_val16 *pcm, int frame_ st->bandwidth = IMIN(st->bandwidth, st->detected_bandwidth); } #endif - st->silk_mode.LBRR_coded = decide_fec(st->silk_mode.useInBandFEC, st->silk_mode.packetLossPercentage, - st->silk_mode.LBRR_coded, st->mode, &st->bandwidth, equiv_rate); celt_encoder_ctl(celt_enc, OPUS_SET_LSB_DEPTH(lsb_depth)); /* CELT mode doesn't support mediumband, use wideband instead */ @@ -1554,34 +1357,15 @@ opus_int32 opus_encode_native(OpusEncoder *st, const opus_val16 *pcm, int frame_ if (st->lfe) st->bandwidth = OPUS_BANDWIDTH_NARROWBAND; - curr_bandwidth = st->bandwidth; - - /* Chooses the appropriate mode for speech - *NEVER* switch to/from CELT-only mode here as this will invalidate some assumptions */ - if (st->mode == MODE_SILK_ONLY && curr_bandwidth > OPUS_BANDWIDTH_WIDEBAND) - st->mode = MODE_HYBRID; - if (st->mode == MODE_HYBRID && curr_bandwidth <= OPUS_BANDWIDTH_WIDEBAND) - st->mode = MODE_SILK_ONLY; - - /* Can't support higher than >60 ms frames, and >20 ms when in Hybrid or CELT-only modes */ - if ((frame_size > st->Fs/50 && (st->mode != MODE_SILK_ONLY)) || frame_size > 3*st->Fs/50) + /* Can't support higher than wideband for >20 ms frames */ + if (frame_size > st->Fs/50 && (st->mode == MODE_CELT_ONLY || st->bandwidth > OPUS_BANDWIDTH_WIDEBAND)) { - int enc_frame_size; + VARDECL(unsigned char, tmp_data); int nb_frames; - - if (st->mode == MODE_SILK_ONLY) - { - if (frame_size == 2*st->Fs/25) /* 80 ms -> 2x 40 ms */ - enc_frame_size = st->Fs/25; - else if (frame_size == 3*st->Fs/25) /* 120 ms -> 2x 60 ms */ - enc_frame_size = 3*st->Fs/50; - else /* 100 ms -> 5x 20 ms */ - enc_frame_size = st->Fs/50; - } - else - enc_frame_size = st->Fs/50; - - nb_frames = frame_size/enc_frame_size; + int bak_mode, bak_bandwidth, bak_channels, bak_to_mono; + VARDECL(OpusRepacketizer, rp); + opus_int32 bytes_per_frame; + opus_int32 repacketize_len; #ifndef DISABLE_FLOAT_API if (analysis_read_pos_bak!= -1) @@ -1591,34 +1375,74 @@ opus_int32 opus_encode_native(OpusEncoder *st, const opus_val16 *pcm, int frame_ } #endif - ret = encode_multiframe_packet(st, pcm, nb_frames, enc_frame_size, data, - out_data_bytes, to_celt, lsb_depth, float_api); + nb_frames = frame_size > st->Fs/25 ? 3 : 2; + bytes_per_frame = IMIN(1276,(out_data_bytes-3)/nb_frames); - RESTORE_STACK; - return ret; - } + ALLOC(tmp_data, nb_frames*bytes_per_frame, unsigned char); - /* For the first frame at a new SILK bandwidth */ - if (st->silk_bw_switch) - { - redundancy = 1; - celt_to_silk = 1; - st->silk_bw_switch = 0; - /* Do a prefill without reseting the sampling rate control. */ - prefill=2; - } + ALLOC(rp, 1, OpusRepacketizer); + opus_repacketizer_init(rp); - /* If we decided to go with CELT, make sure redundancy is off, no matter what - we decided earlier. */ - if (st->mode == MODE_CELT_ONLY) - redundancy = 0; + bak_mode = st->user_forced_mode; + bak_bandwidth = st->user_bandwidth; + bak_channels = st->force_channels; - if (redundancy) - { - redundancy_bytes = compute_redundancy_bytes(max_data_bytes, st->bitrate_bps, frame_rate, st->stream_channels); - if (redundancy_bytes == 0) - redundancy = 0; + st->user_forced_mode = st->mode; + st->user_bandwidth = st->bandwidth; + st->force_channels = st->stream_channels; + bak_to_mono = st->silk_mode.toMono; + + if (bak_to_mono) + st->force_channels = 1; + else + st->prev_channels = st->stream_channels; + for (i=0;i<nb_frames;i++) + { + int tmp_len; + st->silk_mode.toMono = 0; + /* When switching from SILK/Hybrid to CELT, only ask for a switch at the last frame */ + if (to_celt && i==nb_frames-1) + st->user_forced_mode = MODE_CELT_ONLY; + tmp_len = opus_encode_native(st, pcm+i*(st->channels*st->Fs/50), st->Fs/50, + tmp_data+i*bytes_per_frame, bytes_per_frame, lsb_depth, + NULL, 0, c1, c2, analysis_channels, downmix, float_api); + if (tmp_len<0) + { + RESTORE_STACK; + return OPUS_INTERNAL_ERROR; + } + ret = opus_repacketizer_cat(rp, tmp_data+i*bytes_per_frame, tmp_len); + if (ret<0) + { + RESTORE_STACK; + return OPUS_INTERNAL_ERROR; + } + } + if (st->use_vbr) + repacketize_len = out_data_bytes; + else + repacketize_len = IMIN(3*st->bitrate_bps/(3*8*50/nb_frames), out_data_bytes); + ret = opus_repacketizer_out_range_impl(rp, 0, nb_frames, data, repacketize_len, 0, !st->use_vbr); + if (ret<0) + { + RESTORE_STACK; + return OPUS_INTERNAL_ERROR; + } + st->user_forced_mode = bak_mode; + st->user_bandwidth = bak_bandwidth; + st->force_channels = bak_channels; + st->silk_mode.toMono = bak_to_mono; + RESTORE_STACK; + return ret; } + curr_bandwidth = st->bandwidth; + + /* Chooses the appropriate mode for speech + *NEVER* switch to/from CELT-only mode here as this will invalidate some assumptions */ + if (st->mode == MODE_SILK_ONLY && curr_bandwidth > OPUS_BANDWIDTH_WIDEBAND) + st->mode = MODE_HYBRID; + if (st->mode == MODE_HYBRID && curr_bandwidth <= OPUS_BANDWIDTH_WIDEBAND) + st->mode = MODE_SILK_ONLY; /* printf("%d %d %d %d\n", st->bitrate_bps, st->stream_channels, st->mode, curr_bandwidth); */ bytes_target = IMIN(max_data_bytes-redundancy_bytes, st->bitrate_bps * frame_size / (st->Fs * 8)) - 1; @@ -1643,7 +1467,7 @@ opus_int32 opus_encode_native(OpusEncoder *st, const opus_val16 *pcm, int frame_ if (st->application == OPUS_APPLICATION_VOIP) { - hp_cutoff(pcm, cutoff_Hz, &pcm_buf[total_buffer*st->channels], st->hp_mem, frame_size, st->channels, st->Fs, st->arch); + hp_cutoff(pcm, cutoff_Hz, &pcm_buf[total_buffer*st->channels], st->hp_mem, frame_size, st->channels, st->Fs); } else { dc_reject(pcm, 3, &pcm_buf[total_buffer*st->channels], st->hp_mem, frame_size, st->channels, st->Fs); } @@ -1668,7 +1492,6 @@ opus_int32 opus_encode_native(OpusEncoder *st, const opus_val16 *pcm, int frame_ if (st->mode != MODE_CELT_ONLY) { opus_int32 total_bitRate, celt_rate; - opus_int activity; #ifdef FIXED_POINT const opus_int16 *pcm_silk; #else @@ -1676,26 +1499,30 @@ opus_int32 opus_encode_native(OpusEncoder *st, const opus_val16 *pcm, int frame_ ALLOC(pcm_silk, st->channels*frame_size, opus_int16); #endif - activity = VAD_NO_DECISION; -#ifndef DISABLE_FLOAT_API - if( analysis_info.valid ) { - /* Inform SILK about the Opus VAD decision */ - activity = ( analysis_info.activity_probability >= DTX_ACTIVITY_THRESHOLD ); - } -#endif - /* Distribute bits between SILK and CELT */ total_bitRate = 8 * bytes_target * frame_rate; if( st->mode == MODE_HYBRID ) { + int HB_gain_ref; /* Base rate for SILK */ - st->silk_mode.bitRate = compute_silk_rate_for_hybrid(total_bitRate, - curr_bandwidth, st->Fs == 50 * frame_size, st->use_vbr, st->silk_mode.LBRR_coded, - st->stream_channels); + st->silk_mode.bitRate = st->stream_channels * ( 5000 + 1000 * ( st->Fs == 100 * frame_size ) ); + if( curr_bandwidth == OPUS_BANDWIDTH_SUPERWIDEBAND ) { + /* SILK gets 2/3 of the remaining bits */ + st->silk_mode.bitRate += ( total_bitRate - st->silk_mode.bitRate ) * 2 / 3; + } else { /* FULLBAND */ + /* SILK gets 3/5 of the remaining bits */ + st->silk_mode.bitRate += ( total_bitRate - st->silk_mode.bitRate ) * 3 / 5; + } + /* Don't let SILK use more than 80% */ + if( st->silk_mode.bitRate > total_bitRate * 4/5 ) { + st->silk_mode.bitRate = total_bitRate * 4/5; + } if (!st->energy_masking) { /* Increasingly attenuate high band when it gets allocated fewer bits */ celt_rate = total_bitRate - st->silk_mode.bitRate; - HB_gain = Q15ONE - SHR32(celt_exp2(-celt_rate * QCONST16(1.f/1024, 10)), 1); + HB_gain_ref = (curr_bandwidth == OPUS_BANDWIDTH_SUPERWIDEBAND) ? 3000 : 3600; + HB_gain = SHL32((opus_val32)celt_rate, 9) / SHR32((opus_val32)celt_rate + st->stream_channels * HB_gain_ref, 6); + HB_gain = HB_gain < (opus_val32)Q15ONE*6/7 ? HB_gain + Q15ONE/7 : Q15ONE; } } else { /* SILK gets all bits */ @@ -1742,6 +1569,7 @@ opus_int32 opus_encode_native(OpusEncoder *st, const opus_val16 *pcm, int frame_ st->silk_mode.bitRate += 3*rate_offset/5; else st->silk_mode.bitRate += rate_offset; + bytes_target += rate_offset * frame_size / (8 * st->Fs); } st->silk_mode.payloadSize_ms = 1000 * frame_size / st->Fs; @@ -1752,7 +1580,7 @@ opus_int32 opus_encode_native(OpusEncoder *st, const opus_val16 *pcm, int frame_ } else if (curr_bandwidth == OPUS_BANDWIDTH_MEDIUMBAND) { st->silk_mode.desiredInternalSampleRate = 12000; } else { - celt_assert( st->mode == MODE_HYBRID || curr_bandwidth == OPUS_BANDWIDTH_WIDEBAND ); + silk_assert( st->mode == MODE_HYBRID || curr_bandwidth == OPUS_BANDWIDTH_WIDEBAND ); st->silk_mode.desiredInternalSampleRate = 16000; } if( st->mode == MODE_HYBRID ) { @@ -1762,53 +1590,40 @@ opus_int32 opus_encode_native(OpusEncoder *st, const opus_val16 *pcm, int frame_ st->silk_mode.minInternalSampleRate = 8000; } - st->silk_mode.maxInternalSampleRate = 16000; if (st->mode == MODE_SILK_ONLY) { opus_int32 effective_max_rate = max_rate; + st->silk_mode.maxInternalSampleRate = 16000; if (frame_rate > 50) effective_max_rate = effective_max_rate*2/3; - if (effective_max_rate < 8000) + if (effective_max_rate < 13000) { st->silk_mode.maxInternalSampleRate = 12000; st->silk_mode.desiredInternalSampleRate = IMIN(12000, st->silk_mode.desiredInternalSampleRate); } - if (effective_max_rate < 7000) + if (effective_max_rate < 9600) { st->silk_mode.maxInternalSampleRate = 8000; st->silk_mode.desiredInternalSampleRate = IMIN(8000, st->silk_mode.desiredInternalSampleRate); } + } else { + st->silk_mode.maxInternalSampleRate = 16000; } st->silk_mode.useCBR = !st->use_vbr; /* Call SILK encoder for the low band */ + nBytes = IMIN(1275, max_data_bytes-1-redundancy_bytes); - /* Max bits for SILK, counting ToC, redundancy bytes, and optionally redundancy. */ - st->silk_mode.maxBits = (max_data_bytes-1)*8; - if (redundancy && redundancy_bytes >= 2) - { - /* Counting 1 bit for redundancy position and 20 bits for flag+size (only for hybrid). */ - st->silk_mode.maxBits -= redundancy_bytes*8 + 1; - if (st->mode == MODE_HYBRID) - st->silk_mode.maxBits -= 20; - } + st->silk_mode.maxBits = nBytes*8; + /* Only allow up to 90% of the bits for hybrid mode*/ + if (st->mode == MODE_HYBRID) + st->silk_mode.maxBits = (opus_int32)st->silk_mode.maxBits*9/10; if (st->silk_mode.useCBR) { - if (st->mode == MODE_HYBRID) - { - st->silk_mode.maxBits = IMIN(st->silk_mode.maxBits, st->silk_mode.bitRate * frame_size / st->Fs); - } - } else { - /* Constrained VBR. */ - if (st->mode == MODE_HYBRID) - { - /* Compute SILK bitrate corresponding to the max total bits available */ - opus_int32 maxBitRate = compute_silk_rate_for_hybrid(st->silk_mode.maxBits*st->Fs / frame_size, - curr_bandwidth, st->Fs == 50 * frame_size, st->use_vbr, st->silk_mode.LBRR_coded, - st->stream_channels); - st->silk_mode.maxBits = maxBitRate * frame_size / st->Fs; - } + st->silk_mode.maxBits = (st->silk_mode.bitRate * frame_size / (st->Fs * 8))*8; + /* Reduce the initial target to make it easier to reach the CBR rate */ + st->silk_mode.bitRate = IMAX(1, st->silk_mode.bitRate-2000); } if (prefill) @@ -1831,9 +1646,7 @@ opus_int32 opus_encode_native(OpusEncoder *st, const opus_val16 *pcm, int frame_ for (i=0;i<st->encoder_buffer*st->channels;i++) pcm_silk[i] = FLOAT2INT16(st->delay_buffer[i]); #endif - silk_Encode( silk_enc, &st->silk_mode, pcm_silk, st->encoder_buffer, NULL, &zero, prefill, activity ); - /* Prevent a second switch in the real encode call. */ - st->silk_mode.opusCanSwitch = 0; + silk_Encode( silk_enc, &st->silk_mode, pcm_silk, st->encoder_buffer, NULL, &zero, 1 ); } #ifdef FIXED_POINT @@ -1842,14 +1655,20 @@ opus_int32 opus_encode_native(OpusEncoder *st, const opus_val16 *pcm, int frame_ for (i=0;i<frame_size*st->channels;i++) pcm_silk[i] = FLOAT2INT16(pcm_buf[total_buffer*st->channels + i]); #endif - ret = silk_Encode( silk_enc, &st->silk_mode, pcm_silk, frame_size, &enc, &nBytes, 0, activity ); + ret = silk_Encode( silk_enc, &st->silk_mode, pcm_silk, frame_size, &enc, &nBytes, 0 ); if( ret ) { /*fprintf (stderr, "SILK encode error: %d\n", ret);*/ /* Handle error */ RESTORE_STACK; return OPUS_INTERNAL_ERROR; } - + if (nBytes==0) + { + st->rangeFinal = 0; + data[-1] = gen_toc(st->mode, st->Fs/frame_size, curr_bandwidth, st->stream_channels); + RESTORE_STACK; + return 1; + } /* Extract SILK internal bandwidth for signaling in first byte */ if( st->mode == MODE_SILK_ONLY ) { if( st->silk_mode.internalSampleRate == 8000 ) { @@ -1860,24 +1679,14 @@ opus_int32 opus_encode_native(OpusEncoder *st, const opus_val16 *pcm, int frame_ curr_bandwidth = OPUS_BANDWIDTH_WIDEBAND; } } else { - celt_assert( st->silk_mode.internalSampleRate == 16000 ); - } - - st->silk_mode.opusCanSwitch = st->silk_mode.switchReady && !st->nonfinal_frame; - - if (nBytes==0) - { - st->rangeFinal = 0; - data[-1] = gen_toc(st->mode, st->Fs/frame_size, curr_bandwidth, st->stream_channels); - RESTORE_STACK; - return 1; + silk_assert( st->silk_mode.internalSampleRate == 16000 ); } + st->silk_mode.opusCanSwitch = st->silk_mode.switchReady; /* FIXME: How do we allocate the redundancy for CBR? */ if (st->silk_mode.opusCanSwitch) { - redundancy_bytes = compute_redundancy_bytes(max_data_bytes, st->bitrate_bps, frame_rate, st->stream_channels); - redundancy = (redundancy_bytes != 0); + redundancy = 1; celt_to_silk = 0; st->silk_bw_switch = 1; } @@ -1918,18 +1727,40 @@ opus_int32 opus_encode_native(OpusEncoder *st, const opus_val16 *pcm, int frame_ if (st->mode == MODE_HYBRID) { + int len; + + len = (ec_tell(&enc)+7)>>3; + if (redundancy) + len += st->mode == MODE_HYBRID ? 3 : 1; if( st->use_vbr ) { - celt_encoder_ctl(celt_enc, OPUS_SET_BITRATE(st->bitrate_bps-st->silk_mode.bitRate)); - celt_encoder_ctl(celt_enc, OPUS_SET_VBR_CONSTRAINT(0)); + nb_compr_bytes = len + bytes_target - (st->silk_mode.bitRate * frame_size) / (8 * st->Fs); + } else { + /* check if SILK used up too much */ + nb_compr_bytes = len > bytes_target ? len : bytes_target; } } else { if (st->use_vbr) { + opus_int32 bonus=0; +#ifndef DISABLE_FLOAT_API + if (st->variable_duration==OPUS_FRAMESIZE_VARIABLE && frame_size != st->Fs/50) + { + bonus = (60*st->stream_channels+40)*(st->Fs/frame_size-50); + if (analysis_info.valid) + bonus = (opus_int32)(bonus*(1.f+.5f*analysis_info.tonality)); + } +#endif celt_encoder_ctl(celt_enc, OPUS_SET_VBR(1)); celt_encoder_ctl(celt_enc, OPUS_SET_VBR_CONSTRAINT(st->vbr_constraint)); - celt_encoder_ctl(celt_enc, OPUS_SET_BITRATE(st->bitrate_bps)); + celt_encoder_ctl(celt_enc, OPUS_SET_BITRATE(st->bitrate_bps+bonus)); + nb_compr_bytes = max_data_bytes-1-redundancy_bytes; + } else { + nb_compr_bytes = bytes_target; } } + + } else { + nb_compr_bytes = 0; } ALLOC(tmp_prefill, st->channels*st->Fs/400, opus_val16); @@ -1955,14 +1786,7 @@ opus_int32 opus_encode_native(OpusEncoder *st, const opus_val16 *pcm, int frame_ } st->prev_HB_gain = HB_gain; if (st->mode != MODE_HYBRID || st->stream_channels==1) - { - if (equiv_rate > 32000) - st->silk_mode.stereoWidth_Q14 = 16384; - else if (equiv_rate < 16000) - st->silk_mode.stereoWidth_Q14 = 0; - else - st->silk_mode.stereoWidth_Q14 = 16384 - 2048*(opus_int32)(32000-equiv_rate)/(equiv_rate-14000); - } + st->silk_mode.stereoWidth_Q14 = IMIN((1<<14),2*IMAX(0,equiv_rate-30000)); if( !st->energy_masking && st->channels == 2 ) { /* Apply stereo width reduction (at low bitrates) */ if( st->hybrid_stereo_width_Q14 < (1 << 14) || st->silk_mode.stereoWidth_Q14 < (1 << 14) ) { @@ -1985,23 +1809,19 @@ opus_int32 opus_encode_native(OpusEncoder *st, const opus_val16 *pcm, int frame_ if ( st->mode != MODE_CELT_ONLY && ec_tell(&enc)+17+20*(st->mode == MODE_HYBRID) <= 8*(max_data_bytes-1)) { /* For SILK mode, the redundancy is inferred from the length */ - if (st->mode == MODE_HYBRID) + if (st->mode == MODE_HYBRID && (redundancy || ec_tell(&enc)+37 <= 8*nb_compr_bytes)) ec_enc_bit_logp(&enc, redundancy, 12); if (redundancy) { int max_redundancy; ec_enc_bit_logp(&enc, celt_to_silk, 1); if (st->mode == MODE_HYBRID) - { - /* Reserve the 8 bits needed for the redundancy length, - and at least a few bits for CELT if possible */ - max_redundancy = (max_data_bytes-1)-((ec_tell(&enc)+8+3+7)>>3); - } + max_redundancy = (max_data_bytes-1)-nb_compr_bytes; else max_redundancy = (max_data_bytes-1)-((ec_tell(&enc)+7)>>3); /* Target the same bit-rate for redundancy as for the rest, up to a max of 257 bytes */ - redundancy_bytes = IMIN(max_redundancy, redundancy_bytes); + redundancy_bytes = IMIN(max_redundancy, st->bitrate_bps/1600); redundancy_bytes = IMIN(257, IMAX(2, redundancy_bytes)); if (st->mode == MODE_HYBRID) ec_enc_uint(&enc, redundancy_bytes-2, 256); @@ -2023,7 +1843,7 @@ opus_int32 opus_encode_native(OpusEncoder *st, const opus_val16 *pcm, int frame_ ec_enc_done(&enc); nb_compr_bytes = ret; } else { - nb_compr_bytes = (max_data_bytes-1)-redundancy_bytes; + nb_compr_bytes = IMIN((max_data_bytes-1)-redundancy_bytes, nb_compr_bytes); ec_enc_shrink(&enc, nb_compr_bytes); } @@ -2031,12 +1851,6 @@ opus_int32 opus_encode_native(OpusEncoder *st, const opus_val16 *pcm, int frame_ if (redundancy || st->mode != MODE_SILK_ONLY) celt_encoder_ctl(celt_enc, CELT_SET_ANALYSIS(&analysis_info)); #endif - if (st->mode == MODE_HYBRID) { - SILKInfo info; - info.signalType = st->silk_mode.signalType; - info.offset = st->silk_mode.offset; - celt_encoder_ctl(celt_enc, CELT_SET_SILK_INFO(&info)); - } /* 5 ms redundant frame for CELT->SILK */ if (redundancy && celt_to_silk) @@ -2044,7 +1858,6 @@ opus_int32 opus_encode_native(OpusEncoder *st, const opus_val16 *pcm, int frame_ int err; celt_encoder_ctl(celt_enc, CELT_SET_START_BAND(0)); celt_encoder_ctl(celt_enc, OPUS_SET_VBR(0)); - celt_encoder_ctl(celt_enc, OPUS_SET_BITRATE(OPUS_BITRATE_MAX)); err = celt_encode_with_ec(celt_enc, pcm_buf, st->Fs/200, data+nb_compr_bytes, redundancy_bytes, NULL); if (err < 0) { @@ -2068,25 +1881,15 @@ opus_int32 opus_encode_native(OpusEncoder *st, const opus_val16 *pcm, int frame_ celt_encode_with_ec(celt_enc, tmp_prefill, st->Fs/400, dummy, 2, NULL); celt_encoder_ctl(celt_enc, CELT_SET_PREDICTION(0)); } - /* If false, we already busted the budget and we'll end up with a "PLC frame" */ + /* If false, we already busted the budget and we'll end up with a "PLC packet" */ if (ec_tell(&enc) <= 8*nb_compr_bytes) { - /* Set the bitrate again if it was overridden in the redundancy code above*/ - if (redundancy && celt_to_silk && st->mode==MODE_HYBRID && st->use_vbr) - celt_encoder_ctl(celt_enc, OPUS_SET_BITRATE(st->bitrate_bps-st->silk_mode.bitRate)); - celt_encoder_ctl(celt_enc, OPUS_SET_VBR(st->use_vbr)); ret = celt_encode_with_ec(celt_enc, pcm_buf, frame_size, NULL, nb_compr_bytes, &enc); if (ret < 0) { RESTORE_STACK; return OPUS_INTERNAL_ERROR; } - /* Put CELT->SILK redundancy data in the right place. */ - if (redundancy && celt_to_silk && st->mode==MODE_HYBRID && st->use_vbr) - { - OPUS_MOVE(data+ret, data+nb_compr_bytes, redundancy_bytes); - nb_compr_bytes = nb_compr_bytes+redundancy_bytes; - } } } @@ -2102,15 +1905,7 @@ opus_int32 opus_encode_native(OpusEncoder *st, const opus_val16 *pcm, int frame_ celt_encoder_ctl(celt_enc, OPUS_RESET_STATE); celt_encoder_ctl(celt_enc, CELT_SET_START_BAND(0)); celt_encoder_ctl(celt_enc, CELT_SET_PREDICTION(0)); - celt_encoder_ctl(celt_enc, OPUS_SET_VBR(0)); - celt_encoder_ctl(celt_enc, OPUS_SET_BITRATE(OPUS_BITRATE_MAX)); - if (st->mode == MODE_HYBRID) - { - /* Shrink packet to what the encoder actually used. */ - nb_compr_bytes = ret; - ec_enc_shrink(&enc, nb_compr_bytes); - } /* NOTE: We could speed this up slightly (at the expense of code size) by just adding a function that prefills the buffer */ celt_encode_with_ec(celt_enc, pcm_buf+st->channels*(frame_size-N2-N4), N4, dummy, 2, NULL); @@ -2140,23 +1935,6 @@ opus_int32 opus_encode_native(OpusEncoder *st, const opus_val16 *pcm, int frame_ st->first = 0; - /* DTX decision */ -#ifndef DISABLE_FLOAT_API - if (st->use_dtx && (analysis_info.valid || is_silence)) - { - if (decide_dtx_mode(analysis_info.activity_probability, &st->nb_no_activity_frames, - st->peak_signal_energy, pcm, frame_size, st->channels, is_silence, st->arch)) - { - st->rangeFinal = 0; - data[0] = gen_toc(st->mode, st->Fs/frame_size, curr_bandwidth, st->stream_channels); - RESTORE_STACK; - return 1; - } - } else { - st->nb_no_activity_frames = 0; - } -#endif - /* In the unlikely case that the SILK encoder busted its target, tell the decoder to call the PLC */ if (ec_tell(&enc) > (max_data_bytes-1)*8) @@ -2184,6 +1962,7 @@ opus_int32 opus_encode_native(OpusEncoder *st, const opus_val16 *pcm, int frame_ if (!st->use_vbr) { if (opus_packet_pad(data, ret, max_data_bytes) != OPUS_OK) + { RESTORE_STACK; return OPUS_INTERNAL_ERROR; @@ -2202,15 +1981,18 @@ opus_int32 opus_encode_float(OpusEncoder *st, const float *pcm, int analysis_fra { int i, ret; int frame_size; + int delay_compensation; VARDECL(opus_int16, in); ALLOC_STACK; - frame_size = frame_size_select(analysis_frame_size, st->variable_duration, st->Fs); - if (frame_size <= 0) - { - RESTORE_STACK; - return OPUS_BAD_ARG; - } + if (st->application == OPUS_APPLICATION_RESTRICTED_LOWDELAY) + delay_compensation = 0; + else + delay_compensation = st->delay_compensation; + frame_size = compute_frame_size(pcm, analysis_frame_size, + st->variable_duration, st->channels, st->Fs, st->bitrate_bps, + delay_compensation, downmix_float, st->analysis.subframe_mem); + ALLOC(in, frame_size*st->channels, opus_int16); for (i=0;i<frame_size*st->channels;i++) @@ -2226,7 +2008,18 @@ opus_int32 opus_encode(OpusEncoder *st, const opus_int16 *pcm, int analysis_fram unsigned char *data, opus_int32 out_data_bytes) { int frame_size; - frame_size = frame_size_select(analysis_frame_size, st->variable_duration, st->Fs); + int delay_compensation; + if (st->application == OPUS_APPLICATION_RESTRICTED_LOWDELAY) + delay_compensation = 0; + else + delay_compensation = st->delay_compensation; + frame_size = compute_frame_size(pcm, analysis_frame_size, + st->variable_duration, st->channels, st->Fs, st->bitrate_bps, + delay_compensation, downmix_int +#ifndef DISABLE_FLOAT_API + , st->analysis.subframe_mem +#endif + ); return opus_encode_native(st, pcm, frame_size, data, out_data_bytes, 16, pcm, analysis_frame_size, 0, -2, st->channels, downmix_int, 0); } @@ -2237,15 +2030,18 @@ opus_int32 opus_encode(OpusEncoder *st, const opus_int16 *pcm, int analysis_fram { int i, ret; int frame_size; + int delay_compensation; VARDECL(float, in); ALLOC_STACK; - frame_size = frame_size_select(analysis_frame_size, st->variable_duration, st->Fs); - if (frame_size <= 0) - { - RESTORE_STACK; - return OPUS_BAD_ARG; - } + if (st->application == OPUS_APPLICATION_RESTRICTED_LOWDELAY) + delay_compensation = 0; + else + delay_compensation = st->delay_compensation; + frame_size = compute_frame_size(pcm, analysis_frame_size, + st->variable_duration, st->channels, st->Fs, st->bitrate_bps, + delay_compensation, downmix_int, st->analysis.subframe_mem); + ALLOC(in, frame_size*st->channels, float); for (i=0;i<frame_size*st->channels;i++) @@ -2259,7 +2055,14 @@ opus_int32 opus_encode_float(OpusEncoder *st, const float *pcm, int analysis_fra unsigned char *data, opus_int32 out_data_bytes) { int frame_size; - frame_size = frame_size_select(analysis_frame_size, st->variable_duration, st->Fs); + int delay_compensation; + if (st->application == OPUS_APPLICATION_RESTRICTED_LOWDELAY) + delay_compensation = 0; + else + delay_compensation = st->delay_compensation; + frame_size = compute_frame_size(pcm, analysis_frame_size, + st->variable_duration, st->channels, st->Fs, st->bitrate_bps, + delay_compensation, downmix_float, st->analysis.subframe_mem); return opus_encode_native(st, pcm, frame_size, data, out_data_bytes, 24, pcm, analysis_frame_size, 0, -2, st->channels, downmix_float, 1); } @@ -2290,9 +2093,6 @@ int opus_encoder_ctl(OpusEncoder *st, int request, ...) break; } st->application = value; -#ifndef DISABLE_FLOAT_API - st->analysis.application = value; -#endif } break; case OPUS_GET_APPLICATION_REQUEST: @@ -2411,7 +2211,7 @@ int opus_encoder_ctl(OpusEncoder *st, int request, ...) { goto bad_arg; } - st->use_dtx = value; + st->silk_mode.useDTX = value; } break; case OPUS_GET_DTX_REQUEST: @@ -2421,7 +2221,7 @@ int opus_encoder_ctl(OpusEncoder *st, int request, ...) { goto bad_arg; } - *value = st->use_dtx; + *value = st->silk_mode.useDTX; } break; case OPUS_SET_COMPLEXITY_REQUEST: @@ -2622,15 +2422,15 @@ int opus_encoder_ctl(OpusEncoder *st, int request, ...) case OPUS_SET_EXPERT_FRAME_DURATION_REQUEST: { opus_int32 value = va_arg(ap, opus_int32); - if (value != OPUS_FRAMESIZE_ARG && value != OPUS_FRAMESIZE_2_5_MS && - value != OPUS_FRAMESIZE_5_MS && value != OPUS_FRAMESIZE_10_MS && - value != OPUS_FRAMESIZE_20_MS && value != OPUS_FRAMESIZE_40_MS && - value != OPUS_FRAMESIZE_60_MS && value != OPUS_FRAMESIZE_80_MS && - value != OPUS_FRAMESIZE_100_MS && value != OPUS_FRAMESIZE_120_MS) + if (value != OPUS_FRAMESIZE_ARG && value != OPUS_FRAMESIZE_2_5_MS && + value != OPUS_FRAMESIZE_5_MS && value != OPUS_FRAMESIZE_10_MS && + value != OPUS_FRAMESIZE_20_MS && value != OPUS_FRAMESIZE_40_MS && + value != OPUS_FRAMESIZE_60_MS && value != OPUS_FRAMESIZE_VARIABLE) { goto bad_arg; } st->variable_duration = value; + celt_encoder_ctl(celt_enc, OPUS_SET_EXPERT_FRAME_DURATION(value)); } break; case OPUS_GET_EXPERT_FRAME_DURATION_REQUEST: @@ -2659,26 +2459,6 @@ int opus_encoder_ctl(OpusEncoder *st, int request, ...) *value = st->silk_mode.reducedDependency; } break; - case OPUS_SET_PHASE_INVERSION_DISABLED_REQUEST: - { - opus_int32 value = va_arg(ap, opus_int32); - if(value<0 || value>1) - { - goto bad_arg; - } - celt_encoder_ctl(celt_enc, OPUS_SET_PHASE_INVERSION_DISABLED(value)); - } - break; - case OPUS_GET_PHASE_INVERSION_DISABLED_REQUEST: - { - opus_int32 *value = va_arg(ap, opus_int32*); - if (!value) - { - goto bad_arg; - } - celt_encoder_ctl(celt_enc, OPUS_GET_PHASE_INVERSION_DISABLED(value)); - } - break; case OPUS_RESET_STATE: { void *silk_enc; @@ -2727,33 +2507,6 @@ int opus_encoder_ctl(OpusEncoder *st, int request, ...) ret = celt_encoder_ctl(celt_enc, OPUS_SET_ENERGY_MASK(value)); } break; - case OPUS_GET_IN_DTX_REQUEST: - { - opus_int32 *value = va_arg(ap, opus_int32*); - if (!value) - { - goto bad_arg; - } - if (st->silk_mode.useDTX && (st->prev_mode == MODE_SILK_ONLY || st->prev_mode == MODE_HYBRID)) { - /* DTX determined by Silk. */ - int n; - void *silk_enc = (char*)st+st->silk_enc_offset; - *value = 1; - for (n=0;n<st->silk_mode.nChannelsInternal;n++) { - *value = *value && ((silk_encoder*)silk_enc)->state_Fxx[n].sCmn.noSpeechCounter >= NB_SPEECH_FRAMES_BEFORE_DTX; - } - } -#ifndef DISABLE_FLOAT_API - else if (st->use_dtx) { - /* DTX determined by Opus. */ - *value = st->nb_no_activity_frames >= NB_SPEECH_FRAMES_BEFORE_DTX; - } -#endif - else { - *value = 0; - } - } - break; case CELT_GET_MODE_REQUEST: { diff --git a/thirdparty/opus/opus_multistream_decoder.c b/thirdparty/opus/opus_multistream_decoder.c index 0018517aeb..b95eaa6eac 100644 --- a/thirdparty/opus/opus_multistream_decoder.c +++ b/thirdparty/opus/opus_multistream_decoder.c @@ -37,19 +37,16 @@ #include "float_cast.h" #include "os_support.h" -/* DECODER */ +struct OpusMSDecoder { + ChannelLayout layout; + /* Decoder states go here */ +}; -#if defined(ENABLE_HARDENING) || defined(ENABLE_ASSERTIONS) -static void validate_ms_decoder(OpusMSDecoder *st) -{ - validate_layout(&st->layout); -} -#define VALIDATE_MS_DECODER(st) validate_ms_decoder(st) -#else -#define VALIDATE_MS_DECODER(st) -#endif + +/* DECODER */ + opus_int32 opus_multistream_decoder_get_size(int nb_streams, int nb_coupled_streams) { int coupled_size; @@ -146,6 +143,15 @@ OpusMSDecoder *opus_multistream_decoder_create( return st; } +typedef void (*opus_copy_channel_out_func)( + void *dst, + int dst_stride, + int dst_channel, + const opus_val16 *src, + int src_stride, + int frame_size +); + static int opus_multistream_packet_validate(const unsigned char *data, opus_int32 len, int nb_streams, opus_int32 Fs) { @@ -175,7 +181,7 @@ static int opus_multistream_packet_validate(const unsigned char *data, return samples; } -int opus_multistream_decode_native( +static int opus_multistream_decode_native( OpusMSDecoder *st, const unsigned char *data, opus_int32 len, @@ -183,8 +189,7 @@ int opus_multistream_decode_native( opus_copy_channel_out_func copy_channel_out, int frame_size, int decode_fec, - int soft_clip, - void *user_data + int soft_clip ) { opus_int32 Fs; @@ -196,14 +201,8 @@ int opus_multistream_decode_native( VARDECL(opus_val16, buf); ALLOC_STACK; - VALIDATE_MS_DECODER(st); - if (frame_size <= 0) - { - RESTORE_STACK; - return OPUS_BAD_ARG; - } /* Limit frame_size to avoid excessive stack allocations. */ - MUST_SUCCEED(opus_multistream_decoder_ctl(st, OPUS_GET_SAMPLE_RATE(&Fs))); + opus_multistream_decoder_ctl(st, OPUS_GET_SAMPLE_RATE(&Fs)); frame_size = IMIN(frame_size, Fs/25*3); ALLOC(buf, 2*frame_size, opus_val16); ptr = (char*)st + align(sizeof(OpusMSDecoder)); @@ -238,8 +237,7 @@ int opus_multistream_decode_native( for (s=0;s<st->layout.nb_streams;s++) { OpusDecoder *dec; - opus_int32 packet_offset; - int ret; + int packet_offset, ret; dec = (OpusDecoder*)ptr; ptr += (s < st->layout.nb_coupled_streams) ? align(coupled_size) : align(mono_size); @@ -267,7 +265,7 @@ int opus_multistream_decode_native( while ( (chan = get_left_channel(&st->layout, s, prev)) != -1) { (*copy_channel_out)(pcm, st->layout.nb_channels, chan, - buf, 2, frame_size, user_data); + buf, 2, frame_size); prev = chan; } prev = -1; @@ -275,7 +273,7 @@ int opus_multistream_decode_native( while ( (chan = get_right_channel(&st->layout, s, prev)) != -1) { (*copy_channel_out)(pcm, st->layout.nb_channels, chan, - buf+1, 2, frame_size, user_data); + buf+1, 2, frame_size); prev = chan; } } else { @@ -285,7 +283,7 @@ int opus_multistream_decode_native( while ( (chan = get_mono_channel(&st->layout, s, prev)) != -1) { (*copy_channel_out)(pcm, st->layout.nb_channels, chan, - buf, 1, frame_size, user_data); + buf, 1, frame_size); prev = chan; } } @@ -296,7 +294,7 @@ int opus_multistream_decode_native( if (st->layout.mapping[c] == 255) { (*copy_channel_out)(pcm, st->layout.nb_channels, c, - NULL, 0, frame_size, user_data); + NULL, 0, frame_size); } } RESTORE_STACK; @@ -310,13 +308,11 @@ static void opus_copy_channel_out_float( int dst_channel, const opus_val16 *src, int src_stride, - int frame_size, - void *user_data + int frame_size ) { float *float_dst; opus_int32 i; - (void)user_data; float_dst = (float*)dst; if (src != NULL) { @@ -341,13 +337,11 @@ static void opus_copy_channel_out_short( int dst_channel, const opus_val16 *src, int src_stride, - int frame_size, - void *user_data + int frame_size ) { opus_int16 *short_dst; opus_int32 i; - (void)user_data; short_dst = (opus_int16*)dst; if (src != NULL) { @@ -378,7 +372,7 @@ int opus_multistream_decode( ) { return opus_multistream_decode_native(st, data, len, - pcm, opus_copy_channel_out_short, frame_size, decode_fec, 0, NULL); + pcm, opus_copy_channel_out_short, frame_size, decode_fec, 0); } #ifndef DISABLE_FLOAT_API @@ -386,7 +380,7 @@ int opus_multistream_decode_float(OpusMSDecoder *st, const unsigned char *data, opus_int32 len, float *pcm, int frame_size, int decode_fec) { return opus_multistream_decode_native(st, data, len, - pcm, opus_copy_channel_out_float, frame_size, decode_fec, 0, NULL); + pcm, opus_copy_channel_out_float, frame_size, decode_fec, 0); } #endif @@ -396,30 +390,32 @@ int opus_multistream_decode(OpusMSDecoder *st, const unsigned char *data, opus_int32 len, opus_int16 *pcm, int frame_size, int decode_fec) { return opus_multistream_decode_native(st, data, len, - pcm, opus_copy_channel_out_short, frame_size, decode_fec, 1, NULL); + pcm, opus_copy_channel_out_short, frame_size, decode_fec, 1); } int opus_multistream_decode_float( OpusMSDecoder *st, const unsigned char *data, opus_int32 len, - opus_val16 *pcm, + float *pcm, int frame_size, int decode_fec ) { return opus_multistream_decode_native(st, data, len, - pcm, opus_copy_channel_out_float, frame_size, decode_fec, 0, NULL); + pcm, opus_copy_channel_out_float, frame_size, decode_fec, 0); } #endif -int opus_multistream_decoder_ctl_va_list(OpusMSDecoder *st, int request, - va_list ap) +int opus_multistream_decoder_ctl(OpusMSDecoder *st, int request, ...) { + va_list ap; int coupled_size, mono_size; char *ptr; int ret = OPUS_OK; + va_start(ap, request); + coupled_size = opus_decoder_get_size(2); mono_size = opus_decoder_get_size(1); ptr = (char*)st + align(sizeof(OpusMSDecoder)); @@ -429,7 +425,6 @@ int opus_multistream_decoder_ctl_va_list(OpusMSDecoder *st, int request, case OPUS_GET_SAMPLE_RATE_REQUEST: case OPUS_GET_GAIN_REQUEST: case OPUS_GET_LAST_PACKET_DURATION_REQUEST: - case OPUS_GET_PHASE_INVERSION_DISABLED_REQUEST: { OpusDecoder *dec; /* For int32* GET params, just query the first stream */ @@ -487,7 +482,7 @@ int opus_multistream_decoder_ctl_va_list(OpusMSDecoder *st, int request, OpusDecoder **value; stream_id = va_arg(ap, opus_int32); if (stream_id<0 || stream_id >= st->layout.nb_streams) - goto bad_arg; + ret = OPUS_BAD_ARG; value = va_arg(ap, OpusDecoder**); if (!value) { @@ -504,7 +499,6 @@ int opus_multistream_decoder_ctl_va_list(OpusMSDecoder *st, int request, } break; case OPUS_SET_GAIN_REQUEST: - case OPUS_SET_PHASE_INVERSION_DISABLED_REQUEST: { int s; /* This works for int32 params */ @@ -528,20 +522,14 @@ int opus_multistream_decoder_ctl_va_list(OpusMSDecoder *st, int request, ret = OPUS_UNIMPLEMENTED; break; } + + va_end(ap); return ret; bad_arg: + va_end(ap); return OPUS_BAD_ARG; } -int opus_multistream_decoder_ctl(OpusMSDecoder *st, int request, ...) -{ - int ret; - va_list ap; - va_start(ap, request); - ret = opus_multistream_decoder_ctl_va_list(st, request, ap); - va_end(ap); - return ret; -} void opus_multistream_decoder_destroy(OpusMSDecoder *st) { diff --git a/thirdparty/opus/opus_multistream_encoder.c b/thirdparty/opus/opus_multistream_encoder.c index 93204a14c1..1698223a16 100644 --- a/thirdparty/opus/opus_multistream_encoder.c +++ b/thirdparty/opus/opus_multistream_encoder.c @@ -61,6 +61,38 @@ static const VorbisLayout vorbis_mappings[8] = { {5, 3, {0, 6, 1, 2, 3, 4, 5, 7}}, /* 8: 7.1 surround */ }; +typedef void (*opus_copy_channel_in_func)( + opus_val16 *dst, + int dst_stride, + const void *src, + int src_stride, + int src_channel, + int frame_size +); + +typedef enum { + MAPPING_TYPE_NONE, + MAPPING_TYPE_SURROUND +#ifdef ENABLE_EXPERIMENTAL_AMBISONICS + , /* Do not include comma at end of enumerator list */ + MAPPING_TYPE_AMBISONICS +#endif +} MappingType; + +struct OpusMSEncoder { + ChannelLayout layout; + int arch; + int lfe_stream; + int application; + int variable_duration; + MappingType mapping_type; + opus_int32 bitrate_bps; + float subframe_mem[3]; + /* Encoder states go here */ + /* then opus_val32 window_mem[channels*120]; */ + /* then opus_val32 preemph_mem[channels]; */ +}; + static opus_val32 *ms_get_preemph_mem(OpusMSEncoder *st) { int s; @@ -101,29 +133,6 @@ static opus_val32 *ms_get_window_mem(OpusMSEncoder *st) return (opus_val32*)(void*)ptr; } -static int validate_ambisonics(int nb_channels, int *nb_streams, int *nb_coupled_streams) -{ - int order_plus_one; - int acn_channels; - int nondiegetic_channels; - - if (nb_channels < 1 || nb_channels > 227) - return 0; - - order_plus_one = isqrt32(nb_channels); - acn_channels = order_plus_one * order_plus_one; - nondiegetic_channels = nb_channels - acn_channels; - - if (nondiegetic_channels != 0 && nondiegetic_channels != 2) - return 0; - - if (nb_streams) - *nb_streams = acn_channels + (nondiegetic_channels != 0); - if (nb_coupled_streams) - *nb_coupled_streams = nondiegetic_channels != 0; - return 1; -} - static int validate_encoder_layout(const ChannelLayout *layout) { int s; @@ -231,7 +240,6 @@ void surround_analysis(const CELTMode *celt_mode, const void *pcm, opus_val16 *b int pos[8] = {0}; int upsample; int frame_size; - int freq_size; opus_val16 channel_offset; opus_val32 bandE[21]; opus_val16 maskLogE[3][21]; @@ -242,7 +250,6 @@ void surround_analysis(const CELTMode *celt_mode, const void *pcm, opus_val16 *b upsample = resampling_factor(rate); frame_size = len*upsample; - freq_size = IMIN(960, frame_size); /* LM = log2(frame_size / 120) */ for (LM=0;LM<celt_mode->maxLM;LM++) @@ -251,7 +258,7 @@ void surround_analysis(const CELTMode *celt_mode, const void *pcm, opus_val16 *b ALLOC(in, frame_size+overlap, opus_val32); ALLOC(x, len, opus_val16); - ALLOC(freq, freq_size, opus_val32); + ALLOC(freq, frame_size, opus_val32); channel_pos(channels, pos); @@ -261,11 +268,8 @@ void surround_analysis(const CELTMode *celt_mode, const void *pcm, opus_val16 *b for (c=0;c<channels;c++) { - int frame; - int nb_frames = frame_size/freq_size; - celt_assert(nb_frames*freq_size == frame_size); OPUS_COPY(in, mem+c*overlap, overlap); - (*copy_channel_in)(x, 1, pcm, channels, c, len, NULL); + (*copy_channel_in)(x, 1, pcm, channels, c, len); celt_preemphasis(x, in+overlap, frame_size, 1, upsample, celt_mode->preemph, preemph_mem+c, 0); #ifndef FIXED_POINT { @@ -280,26 +284,18 @@ void surround_analysis(const CELTMode *celt_mode, const void *pcm, opus_val16 *b } } #endif - OPUS_CLEAR(bandE, 21); - for (frame=0;frame<nb_frames;frame++) + clt_mdct_forward(&celt_mode->mdct, in, freq, celt_mode->window, + overlap, celt_mode->maxLM-LM, 1, arch); + if (upsample != 1) { - opus_val32 tmpE[21]; - clt_mdct_forward(&celt_mode->mdct, in+960*frame, freq, celt_mode->window, - overlap, celt_mode->maxLM-LM, 1, arch); - if (upsample != 1) - { - int bound = freq_size/upsample; - for (i=0;i<bound;i++) - freq[i] *= upsample; - for (;i<freq_size;i++) - freq[i] = 0; - } - - compute_band_energies(celt_mode, freq, tmpE, 21, 1, LM, arch); - /* If we have multiple frames, take the max energy. */ - for (i=0;i<21;i++) - bandE[i] = MAX32(bandE[i], tmpE[i]); + int bound = len; + for (i=0;i<bound;i++) + freq[i] *= upsample; + for (;i<frame_size;i++) + freq[i] = 0; } + + compute_band_energies(celt_mode, freq, bandE, 21, 1, LM); amp2Log2(celt_mode, 21, 21, bandE, bandLogE+21*c, 1); /* Apply spreading function with -6 dB/band going up and -12 dB/band going down. */ for (i=1;i<21;i++) @@ -412,10 +408,12 @@ opus_int32 opus_multistream_surround_encoder_get_size(int channels, int mapping_ { nb_streams=channels; nb_coupled_streams=0; - } else if (mapping_family==2) +#ifdef ENABLE_EXPERIMENTAL_AMBISONICS + } else if (mapping_family==254) { - if (!validate_ambisonics(channels, &nb_streams, &nb_coupled_streams)) - return 0; + nb_streams=channels; + nb_coupled_streams=0; +#endif } else return 0; size = opus_multistream_encoder_get_size(nb_streams, nb_coupled_streams); @@ -450,6 +448,7 @@ static int opus_multistream_encoder_init_impl( st->layout.nb_channels = channels; st->layout.nb_streams = streams; st->layout.nb_coupled_streams = coupled_streams; + st->subframe_mem[0]=st->subframe_mem[1]=st->subframe_mem[2]=0; if (mapping_type != MAPPING_TYPE_SURROUND) st->lfe_stream = -1; st->bitrate_bps = OPUS_AUTO; @@ -457,13 +456,7 @@ static int opus_multistream_encoder_init_impl( st->variable_duration = OPUS_FRAMESIZE_ARG; for (i=0;i<st->layout.nb_channels;i++) st->layout.mapping[i] = mapping[i]; - if (!validate_layout(&st->layout)) - return OPUS_BAD_ARG; - if (mapping_type == MAPPING_TYPE_SURROUND && - !validate_encoder_layout(&st->layout)) - return OPUS_BAD_ARG; - if (mapping_type == MAPPING_TYPE_AMBISONICS && - !validate_ambisonics(st->layout.nb_channels, NULL, NULL)) + if (!validate_layout(&st->layout) || !validate_encoder_layout(&st->layout)) return OPUS_BAD_ARG; ptr = (char*)st + align(sizeof(OpusMSEncoder)); coupled_size = opus_encoder_get_size(2); @@ -556,23 +549,25 @@ int opus_multistream_surround_encoder_init( *coupled_streams=0; for(i=0;i<channels;i++) mapping[i] = i; - } else if (mapping_family==2) +#ifdef ENABLE_EXPERIMENTAL_AMBISONICS + } else if (mapping_family==254) { int i; - if (!validate_ambisonics(channels, streams, coupled_streams)) - return OPUS_BAD_ARG; - for(i = 0; i < (*streams - *coupled_streams); i++) - mapping[i] = i + (*coupled_streams * 2); - for(i = 0; i < *coupled_streams * 2; i++) - mapping[i + (*streams - *coupled_streams)] = i; + *streams=channels; + *coupled_streams=0; + for(i=0;i<channels;i++) + mapping[i] = i; +#endif } else return OPUS_UNIMPLEMENTED; if (channels>2 && mapping_family==1) { mapping_type = MAPPING_TYPE_SURROUND; - } else if (mapping_family==2) +#ifdef ENABLE_EXPERIMENTAL_AMBISONICS + } else if (mapping_family==254) { mapping_type = MAPPING_TYPE_AMBISONICS; +#endif } else { mapping_type = MAPPING_TYPE_NONE; @@ -677,62 +672,62 @@ static void surround_rate_allocation( int lfe_offset; int coupled_ratio; /* Q8 */ int lfe_ratio; /* Q8 */ - int nb_lfe; - int nb_uncoupled; - int nb_coupled; - int nb_normal; - opus_int32 channel_offset; - opus_int32 bitrate; - int total; - - nb_lfe = (st->lfe_stream!=-1); - nb_coupled = st->layout.nb_coupled_streams; - nb_uncoupled = st->layout.nb_streams-nb_coupled-nb_lfe; - nb_normal = 2*nb_coupled + nb_uncoupled; - - /* Give each non-LFE channel enough bits per channel for coding band energy. */ - channel_offset = 40*IMAX(50, Fs/frame_size); + if (st->bitrate_bps > st->layout.nb_channels*40000) + stream_offset = 20000; + else + stream_offset = st->bitrate_bps/st->layout.nb_channels/2; + stream_offset += 60*(Fs/frame_size-50); + /* We start by giving each stream (coupled or uncoupled) the same bitrate. + This models the main saving of coupled channels over uncoupled. */ + /* The LFE stream is an exception to the above and gets fewer bits. */ + lfe_offset = 3500 + 60*(Fs/frame_size-50); + /* Coupled streams get twice the mono rate after the first 20 kb/s. */ + coupled_ratio = 512; + /* Should depend on the bitrate, for now we assume LFE gets 1/8 the bits of mono */ + lfe_ratio = 32; + + /* Compute bitrate allocation between streams */ if (st->bitrate_bps==OPUS_AUTO) { - bitrate = nb_normal*(channel_offset + Fs + 10000) + 8000*nb_lfe; + channel_rate = Fs+60*Fs/frame_size; } else if (st->bitrate_bps==OPUS_BITRATE_MAX) { - bitrate = nb_normal*300000 + nb_lfe*128000; + channel_rate = 300000; } else { - bitrate = st->bitrate_bps; + int nb_lfe; + int nb_uncoupled; + int nb_coupled; + int total; + nb_lfe = (st->lfe_stream!=-1); + nb_coupled = st->layout.nb_coupled_streams; + nb_uncoupled = st->layout.nb_streams-nb_coupled-nb_lfe; + total = (nb_uncoupled<<8) /* mono */ + + coupled_ratio*nb_coupled /* stereo */ + + nb_lfe*lfe_ratio; + channel_rate = 256*(st->bitrate_bps-lfe_offset*nb_lfe-stream_offset*(nb_coupled+nb_uncoupled))/total; } - - /* Give LFE some basic stream_channel allocation but never exceed 1/20 of the - total rate for the non-energy part to avoid problems at really low rate. */ - lfe_offset = IMIN(bitrate/20, 3000) + 15*IMAX(50, Fs/frame_size); - - /* We give each stream (coupled or uncoupled) a starting bitrate. - This models the main saving of coupled channels over uncoupled. */ - stream_offset = (bitrate - channel_offset*nb_normal - lfe_offset*nb_lfe)/nb_normal/2; - stream_offset = IMAX(0, IMIN(20000, stream_offset)); - - /* Coupled streams get twice the mono rate after the offset is allocated. */ - coupled_ratio = 512; - /* Should depend on the bitrate, for now we assume LFE gets 1/8 the bits of mono */ - lfe_ratio = 32; - - total = (nb_uncoupled<<8) /* mono */ - + coupled_ratio*nb_coupled /* stereo */ - + nb_lfe*lfe_ratio; - channel_rate = 256*(opus_int64)(bitrate - lfe_offset*nb_lfe - stream_offset*(nb_coupled+nb_uncoupled) - channel_offset*nb_normal)/total; +#ifndef FIXED_POINT + if (st->variable_duration==OPUS_FRAMESIZE_VARIABLE && frame_size != Fs/50) + { + opus_int32 bonus; + bonus = 60*(Fs/frame_size-50); + channel_rate += bonus; + } +#endif for (i=0;i<st->layout.nb_streams;i++) { if (i<st->layout.nb_coupled_streams) - rate[i] = 2*channel_offset + IMAX(0, stream_offset+(channel_rate*coupled_ratio>>8)); + rate[i] = stream_offset+(channel_rate*coupled_ratio>>8); else if (i!=st->lfe_stream) - rate[i] = channel_offset + IMAX(0, stream_offset + channel_rate); + rate[i] = stream_offset+channel_rate; else - rate[i] = IMAX(0, lfe_offset+(channel_rate*lfe_ratio>>8)); + rate[i] = lfe_offset+(channel_rate*lfe_ratio>>8); } } +#ifdef ENABLE_EXPERIMENTAL_AMBISONICS static void ambisonics_rate_allocation( OpusMSEncoder *st, opus_int32 *rate, @@ -741,31 +736,50 @@ static void ambisonics_rate_allocation( ) { int i; - opus_int32 total_rate; - opus_int32 per_stream_rate; + int non_mono_rate; + int total_rate; - const int nb_channels = st->layout.nb_streams + st->layout.nb_coupled_streams; + /* The mono channel gets (rate_ratio_num / rate_ratio_den) times as many bits + * as all other channels */ + const int rate_ratio_num = 4; + const int rate_ratio_den = 3; + const int num_channels = st->layout.nb_streams; if (st->bitrate_bps==OPUS_AUTO) { - total_rate = (st->layout.nb_coupled_streams + st->layout.nb_streams) * - (Fs+60*Fs/frame_size) + st->layout.nb_streams * (opus_int32)15000; + total_rate = num_channels * (20000 + st->layout.nb_streams*(Fs+60*Fs/frame_size)); } else if (st->bitrate_bps==OPUS_BITRATE_MAX) { - total_rate = nb_channels * 320000; - } else - { + total_rate = num_channels * 320000; + } else { total_rate = st->bitrate_bps; } - /* Allocate equal number of bits to Ambisonic (uncoupled) and non-diegetic - * (coupled) streams */ - per_stream_rate = total_rate / st->layout.nb_streams; - for (i = 0; i < st->layout.nb_streams; i++) + /* Let y be the non-mono rate and let p, q be integers such that the mono + * channel rate is (p/q) * y. + * Also let T be the total bitrate to allocate. Then + * (n - 1) y + (p/q) y = T + * y = (T q) / (qn - q + p) + */ + non_mono_rate = + total_rate * rate_ratio_den + / (rate_ratio_den*num_channels + rate_ratio_num - rate_ratio_den); + +#ifndef FIXED_POINT + if (st->variable_duration==OPUS_FRAMESIZE_VARIABLE && frame_size != Fs/50) { - rate[i] = per_stream_rate; + opus_int32 bonus = 60*(Fs/frame_size-50); + non_mono_rate += bonus; + } +#endif + + rate[0] = total_rate - (num_channels - 1) * non_mono_rate; + for (i=1;i<st->layout.nb_streams;i++) + { + rate[i] = non_mono_rate; } } +#endif /* ENABLE_EXPERIMENTAL_AMBISONICS */ static opus_int32 rate_allocation( OpusMSEncoder *st, @@ -781,9 +795,11 @@ static opus_int32 rate_allocation( ptr = (char*)st + align(sizeof(OpusMSEncoder)); opus_encoder_ctl((OpusEncoder*)ptr, OPUS_GET_SAMPLE_RATE(&Fs)); +#ifdef ENABLE_EXPERIMENTAL_AMBISONICS if (st->mapping_type == MAPPING_TYPE_AMBISONICS) { ambisonics_rate_allocation(st, rate, frame_size, Fs); } else +#endif { surround_rate_allocation(st, rate, frame_size, Fs); } @@ -796,9 +812,9 @@ static opus_int32 rate_allocation( return rate_sum; } -/* Max size in case the encoder decides to return six frames (6 x 20 ms = 120 ms) */ -#define MS_FRAME_TMP (6*1275+12) -int opus_multistream_encode_native +/* Max size in case the encoder decides to return three frames */ +#define MS_FRAME_TMP (3*1275+7) +static int opus_multistream_encode_native ( OpusMSEncoder *st, opus_copy_channel_in_func copy_channel_in, @@ -808,8 +824,7 @@ int opus_multistream_encode_native opus_int32 max_data_bytes, int lsb_depth, downmix_func downmix, - int float_api, - void *user_data + int float_api ) { opus_int32 Fs; @@ -844,8 +859,32 @@ int opus_multistream_encode_native opus_encoder_ctl((OpusEncoder*)ptr, OPUS_GET_VBR(&vbr)); opus_encoder_ctl((OpusEncoder*)ptr, CELT_GET_MODE(&celt_mode)); - frame_size = frame_size_select(analysis_frame_size, st->variable_duration, Fs); - if (frame_size <= 0) + { + opus_int32 delay_compensation; + int channels; + + channels = st->layout.nb_streams + st->layout.nb_coupled_streams; + opus_encoder_ctl((OpusEncoder*)ptr, OPUS_GET_LOOKAHEAD(&delay_compensation)); + delay_compensation -= Fs/400; + frame_size = compute_frame_size(pcm, analysis_frame_size, + st->variable_duration, channels, Fs, st->bitrate_bps, + delay_compensation, downmix +#ifndef DISABLE_FLOAT_API + , st->subframe_mem +#endif + ); + } + + if (400*frame_size < Fs) + { + RESTORE_STACK; + return OPUS_BAD_ARG; + } + /* Validate frame_size before using it to allocate stack space. + This mirrors the checks in opus_encode[_float](). */ + if (400*frame_size != Fs && 200*frame_size != Fs && + 100*frame_size != Fs && 50*frame_size != Fs && + 25*frame_size != Fs && 50*frame_size != 3*Fs) { RESTORE_STACK; return OPUS_BAD_ARG; @@ -853,9 +892,6 @@ int opus_multistream_encode_native /* Smallest packet the encoder can produce. */ smallest_packet = st->layout.nb_streams*2-1; - /* 100 ms needs an extra byte per stream for the ToC. */ - if (Fs/frame_size == 10) - smallest_packet += st->layout.nb_streams; if (max_data_bytes < smallest_packet) { RESTORE_STACK; @@ -916,9 +952,11 @@ int opus_multistream_encode_native opus_encoder_ctl(enc, OPUS_SET_FORCE_CHANNELS(2)); } } +#ifdef ENABLE_EXPERIMENTAL_AMBISONICS else if (st->mapping_type == MAPPING_TYPE_AMBISONICS) { opus_encoder_ctl(enc, OPUS_SET_FORCE_MODE(MODE_CELT_ONLY)); } +#endif } ptr = (char*)st + align(sizeof(OpusMSEncoder)); @@ -941,9 +979,9 @@ int opus_multistream_encode_native left = get_left_channel(&st->layout, s, -1); right = get_right_channel(&st->layout, s, -1); (*copy_channel_in)(buf, 2, - pcm, st->layout.nb_channels, left, frame_size, user_data); + pcm, st->layout.nb_channels, left, frame_size); (*copy_channel_in)(buf+1, 2, - pcm, st->layout.nb_channels, right, frame_size, user_data); + pcm, st->layout.nb_channels, right, frame_size); ptr += align(coupled_size); if (st->mapping_type == MAPPING_TYPE_SURROUND) { @@ -959,7 +997,7 @@ int opus_multistream_encode_native int i; int chan = get_mono_channel(&st->layout, s, -1); (*copy_channel_in)(buf, 1, - pcm, st->layout.nb_channels, chan, frame_size, user_data); + pcm, st->layout.nb_channels, chan, frame_size); ptr += align(mono_size); if (st->mapping_type == MAPPING_TYPE_SURROUND) { @@ -975,9 +1013,6 @@ int opus_multistream_encode_native curr_max = max_data_bytes - tot_size; /* Reserve one byte for the last stream and two for the others */ curr_max -= IMAX(0,2*(st->layout.nb_streams-s-1)-1); - /* For 100 ms, reserve an extra byte per stream for the ToC */ - if (Fs/frame_size == 10) - curr_max -= st->layout.nb_streams-s-1; curr_max = IMIN(curr_max,MS_FRAME_TMP); /* Repacketizer will add one or two bytes for self-delimited frames */ if (s != st->layout.nb_streams-1) curr_max -= curr_max>253 ? 2 : 1; @@ -1018,13 +1053,11 @@ static void opus_copy_channel_in_float( const void *src, int src_stride, int src_channel, - int frame_size, - void *user_data + int frame_size ) { const float *float_src; opus_int32 i; - (void)user_data; float_src = (const float *)src; for (i=0;i<frame_size;i++) #if defined(FIXED_POINT) @@ -1041,13 +1074,11 @@ static void opus_copy_channel_in_short( const void *src, int src_stride, int src_channel, - int frame_size, - void *user_data + int frame_size ) { const opus_int16 *short_src; opus_int32 i; - (void)user_data; short_src = (const opus_int16 *)src; for (i=0;i<frame_size;i++) #if defined(FIXED_POINT) @@ -1068,7 +1099,7 @@ int opus_multistream_encode( ) { return opus_multistream_encode_native(st, opus_copy_channel_in_short, - pcm, frame_size, data, max_data_bytes, 16, downmix_int, 0, NULL); + pcm, frame_size, data, max_data_bytes, 16, downmix_int, 0); } #ifndef DISABLE_FLOAT_API @@ -1081,7 +1112,7 @@ int opus_multistream_encode_float( ) { return opus_multistream_encode_native(st, opus_copy_channel_in_float, - pcm, frame_size, data, max_data_bytes, 16, downmix_float, 1, NULL); + pcm, frame_size, data, max_data_bytes, 16, downmix_float, 1); } #endif @@ -1097,7 +1128,7 @@ int opus_multistream_encode_float ) { return opus_multistream_encode_native(st, opus_copy_channel_in_float, - pcm, frame_size, data, max_data_bytes, 24, downmix_float, 1, NULL); + pcm, frame_size, data, max_data_bytes, 24, downmix_float, 1); } int opus_multistream_encode( @@ -1109,17 +1140,19 @@ int opus_multistream_encode( ) { return opus_multistream_encode_native(st, opus_copy_channel_in_short, - pcm, frame_size, data, max_data_bytes, 16, downmix_int, 0, NULL); + pcm, frame_size, data, max_data_bytes, 16, downmix_int, 0); } #endif -int opus_multistream_encoder_ctl_va_list(OpusMSEncoder *st, int request, - va_list ap) +int opus_multistream_encoder_ctl(OpusMSEncoder *st, int request, ...) { + va_list ap; int coupled_size, mono_size; char *ptr; int ret = OPUS_OK; + va_start(ap, request); + coupled_size = opus_encoder_get_size(2); mono_size = opus_encoder_get_size(1); ptr = (char*)st + align(sizeof(OpusMSEncoder)); @@ -1128,11 +1161,9 @@ int opus_multistream_encoder_ctl_va_list(OpusMSEncoder *st, int request, case OPUS_SET_BITRATE_REQUEST: { opus_int32 value = va_arg(ap, opus_int32); - if (value != OPUS_AUTO && value != OPUS_BITRATE_MAX) + if (value<0 && value!=OPUS_AUTO && value!=OPUS_BITRATE_MAX) { - if (value <= 0) - goto bad_arg; - value = IMIN(300000*st->layout.nb_channels, IMAX(500*st->layout.nb_channels, value)); + goto bad_arg; } st->bitrate_bps = value; } @@ -1175,7 +1206,6 @@ int opus_multistream_encoder_ctl_va_list(OpusMSEncoder *st, int request, case OPUS_GET_INBAND_FEC_REQUEST: case OPUS_GET_FORCE_CHANNELS_REQUEST: case OPUS_GET_PREDICTION_DISABLED_REQUEST: - case OPUS_GET_PHASE_INVERSION_DISABLED_REQUEST: { OpusEncoder *enc; /* For int32* GET params, just query the first stream */ @@ -1222,7 +1252,6 @@ int opus_multistream_encoder_ctl_va_list(OpusMSEncoder *st, int request, case OPUS_SET_FORCE_MODE_REQUEST: case OPUS_SET_FORCE_CHANNELS_REQUEST: case OPUS_SET_PREDICTION_DISABLED_REQUEST: - case OPUS_SET_PHASE_INVERSION_DISABLED_REQUEST: { int s; /* This works for int32 params */ @@ -1249,7 +1278,7 @@ int opus_multistream_encoder_ctl_va_list(OpusMSEncoder *st, int request, OpusEncoder **value; stream_id = va_arg(ap, opus_int32); if (stream_id<0 || stream_id >= st->layout.nb_streams) - goto bad_arg; + ret = OPUS_BAD_ARG; value = va_arg(ap, OpusEncoder**); if (!value) { @@ -1284,6 +1313,7 @@ int opus_multistream_encoder_ctl_va_list(OpusMSEncoder *st, int request, case OPUS_RESET_STATE: { int s; + st->subframe_mem[0] = st->subframe_mem[1] = st->subframe_mem[2] = 0; if (st->mapping_type == MAPPING_TYPE_SURROUND) { OPUS_CLEAR(ms_get_preemph_mem(st), st->layout.nb_channels); @@ -1307,19 +1337,12 @@ int opus_multistream_encoder_ctl_va_list(OpusMSEncoder *st, int request, ret = OPUS_UNIMPLEMENTED; break; } - return ret; -bad_arg: - return OPUS_BAD_ARG; -} -int opus_multistream_encoder_ctl(OpusMSEncoder *st, int request, ...) -{ - int ret; - va_list ap; - va_start(ap, request); - ret = opus_multistream_encoder_ctl_va_list(st, request, ap); va_end(ap); return ret; +bad_arg: + va_end(ap); + return OPUS_BAD_ARG; } void opus_multistream_encoder_destroy(OpusMSEncoder *st) diff --git a/thirdparty/opus/opus_private.h b/thirdparty/opus/opus_private.h index 5e2463f546..3b62eed096 100644 --- a/thirdparty/opus/opus_private.h +++ b/thirdparty/opus/opus_private.h @@ -33,7 +33,6 @@ #include "opus.h" #include "celt.h" -#include <stdarg.h> /* va_list */ #include <stddef.h> /* offsetof */ struct OpusRepacketizer { @@ -51,59 +50,12 @@ typedef struct ChannelLayout { unsigned char mapping[256]; } ChannelLayout; -typedef enum { - MAPPING_TYPE_NONE, - MAPPING_TYPE_SURROUND, - MAPPING_TYPE_AMBISONICS -} MappingType; - -struct OpusMSEncoder { - ChannelLayout layout; - int arch; - int lfe_stream; - int application; - int variable_duration; - MappingType mapping_type; - opus_int32 bitrate_bps; - /* Encoder states go here */ - /* then opus_val32 window_mem[channels*120]; */ - /* then opus_val32 preemph_mem[channels]; */ -}; - -struct OpusMSDecoder { - ChannelLayout layout; - /* Decoder states go here */ -}; - -int opus_multistream_encoder_ctl_va_list(struct OpusMSEncoder *st, int request, - va_list ap); -int opus_multistream_decoder_ctl_va_list(struct OpusMSDecoder *st, int request, - va_list ap); - int validate_layout(const ChannelLayout *layout); int get_left_channel(const ChannelLayout *layout, int stream_id, int prev); int get_right_channel(const ChannelLayout *layout, int stream_id, int prev); int get_mono_channel(const ChannelLayout *layout, int stream_id, int prev); -typedef void (*opus_copy_channel_in_func)( - opus_val16 *dst, - int dst_stride, - const void *src, - int src_stride, - int src_channel, - int frame_size, - void *user_data -); - -typedef void (*opus_copy_channel_out_func)( - void *dst, - int dst_stride, - int dst_channel, - const opus_val16 *src, - int src_stride, - int frame_size, - void *user_data -); + #define MODE_SILK_ONLY 1000 #define MODE_HYBRID 1001 @@ -135,12 +87,19 @@ typedef void (*opus_copy_channel_out_func)( typedef void (*downmix_func)(const void *, opus_val32 *, int, int, int, int, int); void downmix_float(const void *_x, opus_val32 *sub, int subframe, int offset, int c1, int c2, int C); void downmix_int(const void *_x, opus_val32 *sub, int subframe, int offset, int c1, int c2, int C); -int is_digital_silence(const opus_val16* pcm, int frame_size, int channels, int lsb_depth); int encode_size(int size, unsigned char *data); opus_int32 frame_size_select(opus_int32 frame_size, int variable_duration, opus_int32 Fs); +opus_int32 compute_frame_size(const void *analysis_pcm, int frame_size, + int variable_duration, int C, opus_int32 Fs, int bitrate_bps, + int delay_compensation, downmix_func downmix +#ifndef DISABLE_FLOAT_API + , float *subframe_mem +#endif + ); + opus_int32 opus_encode_native(OpusEncoder *st, const opus_val16 *pcm, int frame_size, unsigned char *data, opus_int32 out_data_bytes, int lsb_depth, const void *analysis_pcm, opus_int32 analysis_size, int c1, int c2, @@ -172,30 +131,4 @@ opus_int32 opus_repacketizer_out_range_impl(OpusRepacketizer *rp, int begin, int int pad_frame(unsigned char *data, opus_int32 len, opus_int32 new_len); -int opus_multistream_encode_native -( - struct OpusMSEncoder *st, - opus_copy_channel_in_func copy_channel_in, - const void *pcm, - int analysis_frame_size, - unsigned char *data, - opus_int32 max_data_bytes, - int lsb_depth, - downmix_func downmix, - int float_api, - void *user_data -); - -int opus_multistream_decode_native( - struct OpusMSDecoder *st, - const unsigned char *data, - opus_int32 len, - void *pcm, - opus_copy_channel_out_func copy_channel_out, - int frame_size, - int decode_fec, - int soft_clip, - void *user_data -); - #endif /* OPUS_PRIVATE_H */ diff --git a/thirdparty/opus/opus_projection_decoder.c b/thirdparty/opus/opus_projection_decoder.c deleted file mode 100644 index c2e07d5bcf..0000000000 --- a/thirdparty/opus/opus_projection_decoder.c +++ /dev/null @@ -1,258 +0,0 @@ -/* Copyright (c) 2017 Google Inc. - Written by Andrew Allen */ -/* - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER - OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "mathops.h" -#include "os_support.h" -#include "opus_private.h" -#include "opus_defines.h" -#include "opus_projection.h" -#include "opus_multistream.h" -#include "mapping_matrix.h" -#include "stack_alloc.h" - -struct OpusProjectionDecoder -{ - opus_int32 demixing_matrix_size_in_bytes; - /* Encoder states go here */ -}; - -#if !defined(DISABLE_FLOAT_API) -static void opus_projection_copy_channel_out_float( - void *dst, - int dst_stride, - int dst_channel, - const opus_val16 *src, - int src_stride, - int frame_size, - void *user_data) -{ - float *float_dst; - const MappingMatrix *matrix; - float_dst = (float *)dst; - matrix = (const MappingMatrix *)user_data; - - if (dst_channel == 0) - OPUS_CLEAR(float_dst, frame_size * dst_stride); - - if (src != NULL) - mapping_matrix_multiply_channel_out_float(matrix, src, dst_channel, - src_stride, float_dst, dst_stride, frame_size); -} -#endif - -static void opus_projection_copy_channel_out_short( - void *dst, - int dst_stride, - int dst_channel, - const opus_val16 *src, - int src_stride, - int frame_size, - void *user_data) -{ - opus_int16 *short_dst; - const MappingMatrix *matrix; - short_dst = (opus_int16 *)dst; - matrix = (const MappingMatrix *)user_data; - if (dst_channel == 0) - OPUS_CLEAR(short_dst, frame_size * dst_stride); - - if (src != NULL) - mapping_matrix_multiply_channel_out_short(matrix, src, dst_channel, - src_stride, short_dst, dst_stride, frame_size); -} - -static MappingMatrix *get_dec_demixing_matrix(OpusProjectionDecoder *st) -{ - /* void* cast avoids clang -Wcast-align warning */ - return (MappingMatrix*)(void*)((char*)st + - align(sizeof(OpusProjectionDecoder))); -} - -static OpusMSDecoder *get_multistream_decoder(OpusProjectionDecoder *st) -{ - /* void* cast avoids clang -Wcast-align warning */ - return (OpusMSDecoder*)(void*)((char*)st + - align(sizeof(OpusProjectionDecoder) + - st->demixing_matrix_size_in_bytes)); -} - -opus_int32 opus_projection_decoder_get_size(int channels, int streams, - int coupled_streams) -{ - opus_int32 matrix_size; - opus_int32 decoder_size; - - matrix_size = - mapping_matrix_get_size(streams + coupled_streams, channels); - if (!matrix_size) - return 0; - - decoder_size = opus_multistream_decoder_get_size(streams, coupled_streams); - if (!decoder_size) - return 0; - - return align(sizeof(OpusProjectionDecoder)) + matrix_size + decoder_size; -} - -int opus_projection_decoder_init(OpusProjectionDecoder *st, opus_int32 Fs, - int channels, int streams, int coupled_streams, - unsigned char *demixing_matrix, opus_int32 demixing_matrix_size) -{ - int nb_input_streams; - opus_int32 expected_matrix_size; - int i, ret; - unsigned char mapping[255]; - VARDECL(opus_int16, buf); - ALLOC_STACK; - - /* Verify supplied matrix size. */ - nb_input_streams = streams + coupled_streams; - expected_matrix_size = nb_input_streams * channels * sizeof(opus_int16); - if (expected_matrix_size != demixing_matrix_size) - { - RESTORE_STACK; - return OPUS_BAD_ARG; - } - - /* Convert demixing matrix input into internal format. */ - ALLOC(buf, nb_input_streams * channels, opus_int16); - for (i = 0; i < nb_input_streams * channels; i++) - { - int s = demixing_matrix[2*i + 1] << 8 | demixing_matrix[2*i]; - s = ((s & 0xFFFF) ^ 0x8000) - 0x8000; - buf[i] = (opus_int16)s; - } - - /* Assign demixing matrix. */ - st->demixing_matrix_size_in_bytes = - mapping_matrix_get_size(channels, nb_input_streams); - if (!st->demixing_matrix_size_in_bytes) - { - RESTORE_STACK; - return OPUS_BAD_ARG; - } - - mapping_matrix_init(get_dec_demixing_matrix(st), channels, nb_input_streams, 0, - buf, demixing_matrix_size); - - /* Set trivial mapping so each input channel pairs with a matrix column. */ - for (i = 0; i < channels; i++) - mapping[i] = i; - - ret = opus_multistream_decoder_init( - get_multistream_decoder(st), Fs, channels, streams, coupled_streams, mapping); - RESTORE_STACK; - return ret; -} - -OpusProjectionDecoder *opus_projection_decoder_create( - opus_int32 Fs, int channels, int streams, int coupled_streams, - unsigned char *demixing_matrix, opus_int32 demixing_matrix_size, int *error) -{ - int size; - int ret; - OpusProjectionDecoder *st; - - /* Allocate space for the projection decoder. */ - size = opus_projection_decoder_get_size(channels, streams, coupled_streams); - if (!size) { - if (error) - *error = OPUS_ALLOC_FAIL; - return NULL; - } - st = (OpusProjectionDecoder *)opus_alloc(size); - if (!st) - { - if (error) - *error = OPUS_ALLOC_FAIL; - return NULL; - } - - /* Initialize projection decoder with provided settings. */ - ret = opus_projection_decoder_init(st, Fs, channels, streams, coupled_streams, - demixing_matrix, demixing_matrix_size); - if (ret != OPUS_OK) - { - opus_free(st); - st = NULL; - } - if (error) - *error = ret; - return st; -} - -#ifdef FIXED_POINT -int opus_projection_decode(OpusProjectionDecoder *st, const unsigned char *data, - opus_int32 len, opus_int16 *pcm, int frame_size, - int decode_fec) -{ - return opus_multistream_decode_native(get_multistream_decoder(st), data, len, - pcm, opus_projection_copy_channel_out_short, frame_size, decode_fec, 0, - get_dec_demixing_matrix(st)); -} -#else -int opus_projection_decode(OpusProjectionDecoder *st, const unsigned char *data, - opus_int32 len, opus_int16 *pcm, int frame_size, - int decode_fec) -{ - return opus_multistream_decode_native(get_multistream_decoder(st), data, len, - pcm, opus_projection_copy_channel_out_short, frame_size, decode_fec, 1, - get_dec_demixing_matrix(st)); -} -#endif - -#ifndef DISABLE_FLOAT_API -int opus_projection_decode_float(OpusProjectionDecoder *st, const unsigned char *data, - opus_int32 len, float *pcm, int frame_size, int decode_fec) -{ - return opus_multistream_decode_native(get_multistream_decoder(st), data, len, - pcm, opus_projection_copy_channel_out_float, frame_size, decode_fec, 0, - get_dec_demixing_matrix(st)); -} -#endif - -int opus_projection_decoder_ctl(OpusProjectionDecoder *st, int request, ...) -{ - va_list ap; - int ret = OPUS_OK; - - va_start(ap, request); - ret = opus_multistream_decoder_ctl_va_list(get_multistream_decoder(st), - request, ap); - va_end(ap); - return ret; -} - -void opus_projection_decoder_destroy(OpusProjectionDecoder *st) -{ - opus_free(st); -} - diff --git a/thirdparty/opus/opus_projection_encoder.c b/thirdparty/opus/opus_projection_encoder.c deleted file mode 100644 index 06fb2d2526..0000000000 --- a/thirdparty/opus/opus_projection_encoder.c +++ /dev/null @@ -1,468 +0,0 @@ -/* Copyright (c) 2017 Google Inc. - Written by Andrew Allen */ -/* - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER - OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "mathops.h" -#include "os_support.h" -#include "opus_private.h" -#include "opus_defines.h" -#include "opus_projection.h" -#include "opus_multistream.h" -#include "stack_alloc.h" -#include "mapping_matrix.h" - -struct OpusProjectionEncoder -{ - opus_int32 mixing_matrix_size_in_bytes; - opus_int32 demixing_matrix_size_in_bytes; - /* Encoder states go here */ -}; - -#if !defined(DISABLE_FLOAT_API) -static void opus_projection_copy_channel_in_float( - opus_val16 *dst, - int dst_stride, - const void *src, - int src_stride, - int src_channel, - int frame_size, - void *user_data -) -{ - mapping_matrix_multiply_channel_in_float((const MappingMatrix*)user_data, - (const float*)src, src_stride, dst, src_channel, dst_stride, frame_size); -} -#endif - -static void opus_projection_copy_channel_in_short( - opus_val16 *dst, - int dst_stride, - const void *src, - int src_stride, - int src_channel, - int frame_size, - void *user_data -) -{ - mapping_matrix_multiply_channel_in_short((const MappingMatrix*)user_data, - (const opus_int16*)src, src_stride, dst, src_channel, dst_stride, frame_size); -} - -static int get_order_plus_one_from_channels(int channels, int *order_plus_one) -{ - int order_plus_one_; - int acn_channels; - int nondiegetic_channels; - - /* Allowed numbers of channels: - * (1 + n)^2 + 2j, for n = 0...14 and j = 0 or 1. - */ - if (channels < 1 || channels > 227) - return OPUS_BAD_ARG; - - order_plus_one_ = isqrt32(channels); - acn_channels = order_plus_one_ * order_plus_one_; - nondiegetic_channels = channels - acn_channels; - if (nondiegetic_channels != 0 && nondiegetic_channels != 2) - return OPUS_BAD_ARG; - - if (order_plus_one) - *order_plus_one = order_plus_one_; - return OPUS_OK; -} - -static int get_streams_from_channels(int channels, int mapping_family, - int *streams, int *coupled_streams, - int *order_plus_one) -{ - if (mapping_family == 3) - { - if (get_order_plus_one_from_channels(channels, order_plus_one) != OPUS_OK) - return OPUS_BAD_ARG; - if (streams) - *streams = (channels + 1) / 2; - if (coupled_streams) - *coupled_streams = channels / 2; - return OPUS_OK; - } - return OPUS_BAD_ARG; -} - -static MappingMatrix *get_mixing_matrix(OpusProjectionEncoder *st) -{ - /* void* cast avoids clang -Wcast-align warning */ - return (MappingMatrix *)(void*)((char*)st + - align(sizeof(OpusProjectionEncoder))); -} - -static MappingMatrix *get_enc_demixing_matrix(OpusProjectionEncoder *st) -{ - /* void* cast avoids clang -Wcast-align warning */ - return (MappingMatrix *)(void*)((char*)st + - align(sizeof(OpusProjectionEncoder) + - st->mixing_matrix_size_in_bytes)); -} - -static OpusMSEncoder *get_multistream_encoder(OpusProjectionEncoder *st) -{ - /* void* cast avoids clang -Wcast-align warning */ - return (OpusMSEncoder *)(void*)((char*)st + - align(sizeof(OpusProjectionEncoder) + - st->mixing_matrix_size_in_bytes + - st->demixing_matrix_size_in_bytes)); -} - -opus_int32 opus_projection_ambisonics_encoder_get_size(int channels, - int mapping_family) -{ - int nb_streams; - int nb_coupled_streams; - int order_plus_one; - int mixing_matrix_rows, mixing_matrix_cols; - int demixing_matrix_rows, demixing_matrix_cols; - opus_int32 mixing_matrix_size, demixing_matrix_size; - opus_int32 encoder_size; - int ret; - - ret = get_streams_from_channels(channels, mapping_family, &nb_streams, - &nb_coupled_streams, &order_plus_one); - if (ret != OPUS_OK) - return 0; - - if (order_plus_one == 2) - { - mixing_matrix_rows = mapping_matrix_foa_mixing.rows; - mixing_matrix_cols = mapping_matrix_foa_mixing.cols; - demixing_matrix_rows = mapping_matrix_foa_demixing.rows; - demixing_matrix_cols = mapping_matrix_foa_demixing.cols; - } - else if (order_plus_one == 3) - { - mixing_matrix_rows = mapping_matrix_soa_mixing.rows; - mixing_matrix_cols = mapping_matrix_soa_mixing.cols; - demixing_matrix_rows = mapping_matrix_soa_demixing.rows; - demixing_matrix_cols = mapping_matrix_soa_demixing.cols; - } - else if (order_plus_one == 4) - { - mixing_matrix_rows = mapping_matrix_toa_mixing.rows; - mixing_matrix_cols = mapping_matrix_toa_mixing.cols; - demixing_matrix_rows = mapping_matrix_toa_demixing.rows; - demixing_matrix_cols = mapping_matrix_toa_demixing.cols; - } - else - return 0; - - mixing_matrix_size = - mapping_matrix_get_size(mixing_matrix_rows, mixing_matrix_cols); - if (!mixing_matrix_size) - return 0; - - demixing_matrix_size = - mapping_matrix_get_size(demixing_matrix_rows, demixing_matrix_cols); - if (!demixing_matrix_size) - return 0; - - encoder_size = - opus_multistream_encoder_get_size(nb_streams, nb_coupled_streams); - if (!encoder_size) - return 0; - - return align(sizeof(OpusProjectionEncoder)) + - mixing_matrix_size + demixing_matrix_size + encoder_size; -} - -int opus_projection_ambisonics_encoder_init(OpusProjectionEncoder *st, opus_int32 Fs, - int channels, int mapping_family, - int *streams, int *coupled_streams, - int application) -{ - MappingMatrix *mixing_matrix; - MappingMatrix *demixing_matrix; - OpusMSEncoder *ms_encoder; - int i; - int ret; - int order_plus_one; - unsigned char mapping[255]; - - if (streams == NULL || coupled_streams == NULL) { - return OPUS_BAD_ARG; - } - - if (get_streams_from_channels(channels, mapping_family, streams, - coupled_streams, &order_plus_one) != OPUS_OK) - return OPUS_BAD_ARG; - - if (mapping_family == 3) - { - /* Assign mixing matrix based on available pre-computed matrices. */ - mixing_matrix = get_mixing_matrix(st); - if (order_plus_one == 2) - { - mapping_matrix_init(mixing_matrix, mapping_matrix_foa_mixing.rows, - mapping_matrix_foa_mixing.cols, mapping_matrix_foa_mixing.gain, - mapping_matrix_foa_mixing_data, - sizeof(mapping_matrix_foa_mixing_data)); - } - else if (order_plus_one == 3) - { - mapping_matrix_init(mixing_matrix, mapping_matrix_soa_mixing.rows, - mapping_matrix_soa_mixing.cols, mapping_matrix_soa_mixing.gain, - mapping_matrix_soa_mixing_data, - sizeof(mapping_matrix_soa_mixing_data)); - } - else if (order_plus_one == 4) - { - mapping_matrix_init(mixing_matrix, mapping_matrix_toa_mixing.rows, - mapping_matrix_toa_mixing.cols, mapping_matrix_toa_mixing.gain, - mapping_matrix_toa_mixing_data, - sizeof(mapping_matrix_toa_mixing_data)); - } - else - return OPUS_BAD_ARG; - - st->mixing_matrix_size_in_bytes = mapping_matrix_get_size( - mixing_matrix->rows, mixing_matrix->cols); - if (!st->mixing_matrix_size_in_bytes) - return OPUS_BAD_ARG; - - /* Assign demixing matrix based on available pre-computed matrices. */ - demixing_matrix = get_enc_demixing_matrix(st); - if (order_plus_one == 2) - { - mapping_matrix_init(demixing_matrix, mapping_matrix_foa_demixing.rows, - mapping_matrix_foa_demixing.cols, mapping_matrix_foa_demixing.gain, - mapping_matrix_foa_demixing_data, - sizeof(mapping_matrix_foa_demixing_data)); - } - else if (order_plus_one == 3) - { - mapping_matrix_init(demixing_matrix, mapping_matrix_soa_demixing.rows, - mapping_matrix_soa_demixing.cols, mapping_matrix_soa_demixing.gain, - mapping_matrix_soa_demixing_data, - sizeof(mapping_matrix_soa_demixing_data)); - } - else if (order_plus_one == 4) - { - mapping_matrix_init(demixing_matrix, mapping_matrix_toa_demixing.rows, - mapping_matrix_toa_demixing.cols, mapping_matrix_toa_demixing.gain, - mapping_matrix_toa_demixing_data, - sizeof(mapping_matrix_toa_demixing_data)); - } - else - return OPUS_BAD_ARG; - - st->demixing_matrix_size_in_bytes = mapping_matrix_get_size( - demixing_matrix->rows, demixing_matrix->cols); - if (!st->demixing_matrix_size_in_bytes) - return OPUS_BAD_ARG; - } - else - return OPUS_UNIMPLEMENTED; - - /* Ensure matrices are large enough for desired coding scheme. */ - if (*streams + *coupled_streams > mixing_matrix->rows || - channels > mixing_matrix->cols || - channels > demixing_matrix->rows || - *streams + *coupled_streams > demixing_matrix->cols) - return OPUS_BAD_ARG; - - /* Set trivial mapping so each input channel pairs with a matrix column. */ - for (i = 0; i < channels; i++) - mapping[i] = i; - - /* Initialize multistream encoder with provided settings. */ - ms_encoder = get_multistream_encoder(st); - ret = opus_multistream_encoder_init(ms_encoder, Fs, channels, *streams, - *coupled_streams, mapping, application); - return ret; -} - -OpusProjectionEncoder *opus_projection_ambisonics_encoder_create( - opus_int32 Fs, int channels, int mapping_family, int *streams, - int *coupled_streams, int application, int *error) -{ - int size; - int ret; - OpusProjectionEncoder *st; - - /* Allocate space for the projection encoder. */ - size = opus_projection_ambisonics_encoder_get_size(channels, mapping_family); - if (!size) { - if (error) - *error = OPUS_ALLOC_FAIL; - return NULL; - } - st = (OpusProjectionEncoder *)opus_alloc(size); - if (!st) - { - if (error) - *error = OPUS_ALLOC_FAIL; - return NULL; - } - - /* Initialize projection encoder with provided settings. */ - ret = opus_projection_ambisonics_encoder_init(st, Fs, channels, - mapping_family, streams, coupled_streams, application); - if (ret != OPUS_OK) - { - opus_free(st); - st = NULL; - } - if (error) - *error = ret; - return st; -} - -int opus_projection_encode(OpusProjectionEncoder *st, const opus_int16 *pcm, - int frame_size, unsigned char *data, - opus_int32 max_data_bytes) -{ - return opus_multistream_encode_native(get_multistream_encoder(st), - opus_projection_copy_channel_in_short, pcm, frame_size, data, - max_data_bytes, 16, downmix_int, 0, get_mixing_matrix(st)); -} - -#ifndef DISABLE_FLOAT_API -#ifdef FIXED_POINT -int opus_projection_encode_float(OpusProjectionEncoder *st, const float *pcm, - int frame_size, unsigned char *data, - opus_int32 max_data_bytes) -{ - return opus_multistream_encode_native(get_multistream_encoder(st), - opus_projection_copy_channel_in_float, pcm, frame_size, data, - max_data_bytes, 16, downmix_float, 1, get_mixing_matrix(st)); -} -#else -int opus_projection_encode_float(OpusProjectionEncoder *st, const float *pcm, - int frame_size, unsigned char *data, - opus_int32 max_data_bytes) -{ - return opus_multistream_encode_native(get_multistream_encoder(st), - opus_projection_copy_channel_in_float, pcm, frame_size, data, - max_data_bytes, 24, downmix_float, 1, get_mixing_matrix(st)); -} -#endif -#endif - -void opus_projection_encoder_destroy(OpusProjectionEncoder *st) -{ - opus_free(st); -} - -int opus_projection_encoder_ctl(OpusProjectionEncoder *st, int request, ...) -{ - va_list ap; - MappingMatrix *demixing_matrix; - OpusMSEncoder *ms_encoder; - int ret = OPUS_OK; - - ms_encoder = get_multistream_encoder(st); - demixing_matrix = get_enc_demixing_matrix(st); - - va_start(ap, request); - switch(request) - { - case OPUS_PROJECTION_GET_DEMIXING_MATRIX_SIZE_REQUEST: - { - opus_int32 *value = va_arg(ap, opus_int32*); - if (!value) - { - goto bad_arg; - } - *value = - ms_encoder->layout.nb_channels * (ms_encoder->layout.nb_streams - + ms_encoder->layout.nb_coupled_streams) * sizeof(opus_int16); - } - break; - case OPUS_PROJECTION_GET_DEMIXING_MATRIX_GAIN_REQUEST: - { - opus_int32 *value = va_arg(ap, opus_int32*); - if (!value) - { - goto bad_arg; - } - *value = demixing_matrix->gain; - } - break; - case OPUS_PROJECTION_GET_DEMIXING_MATRIX_REQUEST: - { - int i, j, k, l; - int nb_input_streams; - int nb_output_streams; - unsigned char *external_char; - opus_int16 *internal_short; - opus_int32 external_size; - opus_int32 internal_size; - - /* (I/O is in relation to the decoder's perspective). */ - nb_input_streams = ms_encoder->layout.nb_streams + - ms_encoder->layout.nb_coupled_streams; - nb_output_streams = ms_encoder->layout.nb_channels; - - external_char = va_arg(ap, unsigned char *); - external_size = va_arg(ap, opus_int32); - if (!external_char) - { - goto bad_arg; - } - internal_short = mapping_matrix_get_data(demixing_matrix); - internal_size = nb_input_streams * nb_output_streams * sizeof(opus_int16); - if (external_size != internal_size) - { - goto bad_arg; - } - - /* Copy demixing matrix subset to output destination. */ - l = 0; - for (i = 0; i < nb_input_streams; i++) { - for (j = 0; j < nb_output_streams; j++) { - k = demixing_matrix->rows * i + j; - external_char[2*l] = (unsigned char)internal_short[k]; - external_char[2*l+1] = (unsigned char)(internal_short[k] >> 8); - l++; - } - } - } - break; - default: - { - ret = opus_multistream_encoder_ctl_va_list(ms_encoder, request, ap); - } - break; - } - va_end(ap); - return ret; - -bad_arg: - va_end(ap); - return OPUS_BAD_ARG; -} - diff --git a/thirdparty/opus/opusfile.c b/thirdparty/opus/opusfile.c index 8b000a2c58..b8b3a354cf 100644 --- a/thirdparty/opus/opusfile.c +++ b/thirdparty/opus/opusfile.c @@ -86,15 +86,14 @@ int op_test(OpusHead *_head, This is to prevent us spending a lot of time allocating memory and looking for Ogg pages in non-Ogg files.*/ if(memcmp(_initial_data,"OggS",4)!=0)return OP_ENOTFORMAT; - if(OP_UNLIKELY(_initial_bytes>(size_t)LONG_MAX))return OP_EFAULT; ogg_sync_init(&oy); - data=ogg_sync_buffer(&oy,(long)_initial_bytes); + data=ogg_sync_buffer(&oy,_initial_bytes); if(data!=NULL){ ogg_stream_state os; ogg_page og; int ret; memcpy(data,_initial_data,_initial_bytes); - ogg_sync_wrote(&oy,(long)_initial_bytes); + ogg_sync_wrote(&oy,_initial_bytes); ogg_stream_init(&os,-1); err=OP_FALSE; do{ @@ -148,7 +147,7 @@ static int op_get_data(OggOpusFile *_of,int _nbytes){ int nbytes; OP_ASSERT(_nbytes>0); buffer=(unsigned char *)ogg_sync_buffer(&_of->oy,_nbytes); - nbytes=(int)(*_of->callbacks.read)(_of->stream,buffer,_nbytes); + nbytes=(int)(*_of->callbacks.read)(_of->source,buffer,_nbytes); OP_ASSERT(nbytes<=_nbytes); if(OP_LIKELY(nbytes>0))ogg_sync_wrote(&_of->oy,nbytes); return nbytes; @@ -158,7 +157,7 @@ static int op_get_data(OggOpusFile *_of,int _nbytes){ static int op_seek_helper(OggOpusFile *_of,opus_int64 _offset){ if(_offset==_of->offset)return 0; if(_of->callbacks.seek==NULL - ||(*_of->callbacks.seek)(_of->stream,_offset,SEEK_SET)){ + ||(*_of->callbacks.seek)(_of->source,_offset,SEEK_SET)){ return OP_EREAD; } _of->offset=_offset; @@ -166,7 +165,7 @@ static int op_seek_helper(OggOpusFile *_of,opus_int64 _offset){ return 0; } -/*Get the current position indicator of the underlying stream. +/*Get the current position indicator of the underlying source. This should be the same as the value reported by tell().*/ static opus_int64 op_position(const OggOpusFile *_of){ /*The current position indicator is _not_ simply offset. @@ -370,7 +369,7 @@ static int op_get_prev_page_serial(OggOpusFile *_of,OpusSeekRecord *_sr, search_start=llret+1; } /*We started from the beginning of the stream and found nothing. - This should be impossible unless the contents of the stream changed out + This should be impossible unless the contents of the source changed out from under us after we read from it.*/ if(OP_UNLIKELY(!begin)&&OP_UNLIKELY(_offset<0))return OP_EBADLINK; /*Bump up the chunk size. @@ -456,7 +455,7 @@ static opus_int64 op_get_last_page(OggOpusFile *_of,ogg_int64_t *_gp, } } /*We started from at or before the beginning of the link and found nothing. - This should be impossible unless the contents of the stream changed out + This should be impossible unless the contents of the source changed out from under us after we read from it.*/ if((OP_UNLIKELY(left_link)||OP_UNLIKELY(!begin))&&OP_UNLIKELY(_offset<0)){ return OP_EBADLINK; @@ -856,7 +855,6 @@ static int op_find_initial_pcm_offset(OggOpusFile *_of, /*Fail if the pre-skip is non-zero, since it's asking us to skip more samples than exist.*/ if(_link->head.pre_skip>0)return OP_EBADTIMESTAMP; - _link->pcm_file_offset=0; /*Set pcm_end and end_offset so we can skip the call to op_find_final_pcm_offset().*/ _link->pcm_start=_link->pcm_end=0; @@ -868,8 +866,7 @@ static int op_find_initial_pcm_offset(OggOpusFile *_of, if(_link->head.pre_skip>0)return OP_EBADTIMESTAMP; /*Set pcm_end and end_offset so we can skip the call to op_find_final_pcm_offset().*/ - _link->pcm_file_offset=0; - _link->pcm_start=_link->pcm_end=0; + _link->pcm_end=_link->pcm_start=0; _link->end_offset=_link->data_offset; /*Tell the caller we've got a buffered page for them.*/ return 1; @@ -954,7 +951,6 @@ static int op_find_initial_pcm_offset(OggOpusFile *_of, /*Update the packet count after end-trimming.*/ _of->op_count=pi; _of->cur_discard_count=_link->head.pre_skip; - _link->pcm_file_offset=0; _of->prev_packet_gp=_link->pcm_start=pcm_start; _of->prev_page_offset=page_offset; return 0; @@ -1275,7 +1271,6 @@ static int op_bisect_forward_serialno(OggOpusFile *_of, always starts with a seek.*/ ret=op_find_initial_pcm_offset(_of,links+nlinks,NULL); if(OP_UNLIKELY(ret<0))return ret; - links[nlinks].pcm_file_offset=total_duration; _searched=_of->offset; /*Mark the current link count so it can be cleaned up on error.*/ _of->nlinks=++nlinks; @@ -1395,8 +1390,8 @@ static int op_open_seekable2_impl(OggOpusFile *_of){ opus_int64 data_offset; int ret; /*We can seek, so set out learning all about this file.*/ - (*_of->callbacks.seek)(_of->stream,0,SEEK_END); - _of->offset=_of->end=(*_of->callbacks.tell)(_of->stream); + (*_of->callbacks.seek)(_of->source,0,SEEK_END); + _of->offset=_of->end=(*_of->callbacks.tell)(_of->source); if(OP_UNLIKELY(_of->end<0))return OP_EREAD; data_offset=_of->links[0].data_offset; if(OP_UNLIKELY(_of->end<data_offset))return OP_EBADLINK; @@ -1441,7 +1436,7 @@ static int op_open_seekable2(OggOpusFile *_of){ prev_page_offset=_of->prev_page_offset; start_offset=_of->offset; memcpy(op_start,_of->op,sizeof(*op_start)*start_op_count); - OP_ASSERT((*_of->callbacks.tell)(_of->stream)==op_position(_of)); + OP_ASSERT((*_of->callbacks.tell)(_of->source)==op_position(_of)); ogg_sync_init(&_of->oy); ogg_stream_init(&_of->os,-1); ret=op_open_seekable2_impl(_of); @@ -1459,7 +1454,7 @@ static int op_open_seekable2(OggOpusFile *_of){ _of->cur_discard_count=_of->links[0].head.pre_skip; if(OP_UNLIKELY(ret<0))return ret; /*And restore the position indicator.*/ - ret=(*_of->callbacks.seek)(_of->stream,op_position(_of),SEEK_SET); + ret=(*_of->callbacks.seek)(_of->source,op_position(_of),SEEK_SET); return OP_UNLIKELY(ret<0)?OP_EREAD:0; } @@ -1498,20 +1493,19 @@ static void op_clear(OggOpusFile *_of){ _ogg_free(_of->serialnos); ogg_stream_clear(&_of->os); ogg_sync_clear(&_of->oy); - if(_of->callbacks.close!=NULL)(*_of->callbacks.close)(_of->stream); + if(_of->callbacks.close!=NULL)(*_of->callbacks.close)(_of->source); } static int op_open1(OggOpusFile *_of, - void *_stream,const OpusFileCallbacks *_cb, + void *_source,const OpusFileCallbacks *_cb, const unsigned char *_initial_data,size_t _initial_bytes){ ogg_page og; ogg_page *pog; int seekable; int ret; memset(_of,0,sizeof(*_of)); - if(OP_UNLIKELY(_initial_bytes>(size_t)LONG_MAX))return OP_EFAULT; _of->end=-1; - _of->stream=_stream; + _of->source=_source; *&_of->callbacks=*_cb; /*At a minimum, we need to be able to read data.*/ if(OP_UNLIKELY(_of->callbacks.read==NULL))return OP_EREAD; @@ -1526,18 +1520,18 @@ static int op_open1(OggOpusFile *_of, decoding entire files from RAM.*/ if(_initial_bytes>0){ char *buffer; - buffer=ogg_sync_buffer(&_of->oy,(long)_initial_bytes); + buffer=ogg_sync_buffer(&_of->oy,_initial_bytes); memcpy(buffer,_initial_data,_initial_bytes*sizeof(*buffer)); - ogg_sync_wrote(&_of->oy,(long)_initial_bytes); + ogg_sync_wrote(&_of->oy,_initial_bytes); } /*Can we seek? Stevens suggests the seek test is portable.*/ - seekable=_cb->seek!=NULL&&(*_cb->seek)(_stream,0,SEEK_CUR)!=-1; + seekable=_cb->seek!=NULL&&(*_cb->seek)(_source,0,SEEK_CUR)!=-1; /*If seek is implemented, tell must also be implemented.*/ if(seekable){ opus_int64 pos; if(OP_UNLIKELY(_of->callbacks.tell==NULL))return OP_EINVAL; - pos=(*_of->callbacks.tell)(_of->stream); + pos=(*_of->callbacks.tell)(_of->source); /*If the current position is not equal to the initial bytes consumed, absolute seeking will not work.*/ if(OP_UNLIKELY(pos!=(opus_int64)_initial_bytes))return OP_EINVAL; @@ -1596,14 +1590,14 @@ static int op_open2(OggOpusFile *_of){ return ret; } -OggOpusFile *op_test_callbacks(void *_stream,const OpusFileCallbacks *_cb, +OggOpusFile *op_test_callbacks(void *_source,const OpusFileCallbacks *_cb, const unsigned char *_initial_data,size_t _initial_bytes,int *_error){ OggOpusFile *of; int ret; of=(OggOpusFile *)_ogg_malloc(sizeof(*of)); ret=OP_EFAULT; if(OP_LIKELY(of!=NULL)){ - ret=op_open1(of,_stream,_cb,_initial_data,_initial_bytes); + ret=op_open1(of,_source,_cb,_initial_data,_initial_bytes); if(OP_LIKELY(ret>=0)){ if(_error!=NULL)*_error=0; return of; @@ -1617,10 +1611,10 @@ OggOpusFile *op_test_callbacks(void *_stream,const OpusFileCallbacks *_cb, return NULL; } -OggOpusFile *op_open_callbacks(void *_stream,const OpusFileCallbacks *_cb, +OggOpusFile *op_open_callbacks(void *_source,const OpusFileCallbacks *_cb, const unsigned char *_initial_data,size_t _initial_bytes,int *_error){ OggOpusFile *of; - of=op_test_callbacks(_stream,_cb,_initial_data,_initial_bytes,_error); + of=op_test_callbacks(_source,_cb,_initial_data,_initial_bytes,_error); if(OP_LIKELY(of!=NULL)){ int ret; ret=op_open2(of); @@ -1633,15 +1627,15 @@ OggOpusFile *op_open_callbacks(void *_stream,const OpusFileCallbacks *_cb, /*Convenience routine to clean up from failure for the open functions that create their own streams.*/ -static OggOpusFile *op_open_close_on_failure(void *_stream, +static OggOpusFile *op_open_close_on_failure(void *_source, const OpusFileCallbacks *_cb,int *_error){ OggOpusFile *of; - if(OP_UNLIKELY(_stream==NULL)){ + if(OP_UNLIKELY(_source==NULL)){ if(_error!=NULL)*_error=OP_EFAULT; return NULL; } - of=op_open_callbacks(_stream,_cb,NULL,0,_error); - if(OP_UNLIKELY(of==NULL))(*_cb->close)(_stream); + of=op_open_callbacks(_source,_cb,NULL,0,_error); + if(OP_UNLIKELY(of==NULL))(*_cb->close)(_source); return of; } @@ -1659,15 +1653,15 @@ OggOpusFile *op_open_memory(const unsigned char *_data,size_t _size, /*Convenience routine to clean up from failure for the open functions that create their own streams.*/ -static OggOpusFile *op_test_close_on_failure(void *_stream, +static OggOpusFile *op_test_close_on_failure(void *_source, const OpusFileCallbacks *_cb,int *_error){ OggOpusFile *of; - if(OP_UNLIKELY(_stream==NULL)){ + if(OP_UNLIKELY(_source==NULL)){ if(_error!=NULL)*_error=OP_EFAULT; return NULL; } - of=op_test_callbacks(_stream,_cb,NULL,0,_error); - if(OP_UNLIKELY(of==NULL))(*_cb->close)(_stream); + of=op_test_callbacks(_source,_cb,NULL,0,_error); + if(OP_UNLIKELY(of==NULL))(*_cb->close)(_source); return of; } @@ -1708,7 +1702,7 @@ int op_link_count(const OggOpusFile *_of){ return _of->nlinks; } -opus_uint32 op_serialno(const OggOpusFile *_of,int _li){ +ogg_uint32_t op_serialno(const OggOpusFile *_of,int _li){ if(OP_UNLIKELY(_li>=_of->nlinks))_li=_of->nlinks-1; if(!_of->seekable)_li=0; return _of->links[_li<0?_of->cur_link:_li].serialno; @@ -1724,14 +1718,13 @@ opus_int64 op_raw_total(const OggOpusFile *_of,int _li){ ||OP_UNLIKELY(_li>=_of->nlinks)){ return OP_EINVAL; } - if(_li<0)return _of->end; + if(_li<0)return _of->end-_of->links[0].offset; return (_li+1>=_of->nlinks?_of->end:_of->links[_li+1].offset) - -(_li>0?_of->links[_li].offset:0); + -_of->links[_li].offset; } ogg_int64_t op_pcm_total(const OggOpusFile *_of,int _li){ OggOpusLink *links; - ogg_int64_t pcm_total; ogg_int64_t diff; int nlinks; nlinks=_of->nlinks; @@ -1744,14 +1737,20 @@ ogg_int64_t op_pcm_total(const OggOpusFile *_of,int _li){ /*We verify that the granule position differences are larger than the pre-skip and that the total duration does not overflow during link enumeration, so we don't have to check here.*/ - pcm_total=0; if(_li<0){ - pcm_total=links[nlinks-1].pcm_file_offset; - _li=nlinks-1; + ogg_int64_t pcm_total; + int li; + pcm_total=0; + for(li=0;li<nlinks;li++){ + OP_ALWAYS_TRUE(!op_granpos_diff(&diff, + links[li].pcm_end,links[li].pcm_start)); + pcm_total+=diff-links[li].head.pre_skip; + } + return pcm_total; } OP_ALWAYS_TRUE(!op_granpos_diff(&diff, links[_li].pcm_end,links[_li].pcm_start)); - return pcm_total+diff-links[_li].head.pre_skip; + return diff-links[_li].head.pre_skip; } const OpusHead *op_head(const OggOpusFile *_of,int _li){ @@ -1821,34 +1820,6 @@ opus_int32 op_bitrate_instant(OggOpusFile *_of){ return ret; } -/*Given a serialno, find a link with a corresponding Opus stream, if it exists. - Return: The index of the link to which the page belongs, or a negative number - if it was not a desired Opus bitstream section.*/ -static int op_get_link_from_serialno(const OggOpusFile *_of,int _cur_link, - opus_int64 _page_offset,ogg_uint32_t _serialno){ - const OggOpusLink *links; - int nlinks; - int li_lo; - int li_hi; - OP_ASSERT(_of->seekable); - links=_of->links; - nlinks=_of->nlinks; - li_lo=0; - /*Start off by guessing we're just a multiplexed page in the current link.*/ - li_hi=_cur_link+1<nlinks&&_page_offset<links[_cur_link+1].offset? - _cur_link+1:nlinks; - do{ - if(_page_offset>=links[_cur_link].offset)li_lo=_cur_link; - else li_hi=_cur_link; - _cur_link=li_lo+(li_hi-li_lo>>1); - } - while(li_hi-li_lo>1); - /*We've identified the link that should contain this page. - Make sure it's a page we care about.*/ - if(links[_cur_link].serialno!=_serialno)return OP_FALSE; - return _cur_link; -} - /*Fetch and process a page. This handles the case where we're at a bitstream boundary and dumps the decoding machine. @@ -1905,28 +1876,19 @@ static int op_fetch_and_process_page(OggOpusFile *_of, if(OP_UNLIKELY(_of->ready_state<OP_STREAMSET)){ if(seekable){ ogg_uint32_t serialno; + int nlinks; + int li; serialno=ogg_page_serialno(&og); - /*Match the serialno to bitstream section.*/ - OP_ASSERT(cur_link>=0&&cur_link<_of->nlinks); - if(links[cur_link].serialno!=serialno){ - /*It wasn't a page from the current link. - Is it from the next one?*/ - if(OP_LIKELY(cur_link+1<_of->nlinks&&links[cur_link+1].serialno== - serialno)){ - cur_link++; - } - else{ - int new_link; - new_link= - op_get_link_from_serialno(_of,cur_link,_page_offset,serialno); - /*Not a desired Opus bitstream section. - Keep trying.*/ - if(new_link<0)continue; - cur_link=new_link; - } - } + /*Match the serialno to bitstream section. + We use this rather than offset positions to avoid problems near + logical bitstream boundaries.*/ + nlinks=_of->nlinks; + for(li=0;li<nlinks&&links[li].serialno!=serialno;li++); + /*Not a desired Opus bitstream section. + Keep trying.*/ + if(li>=nlinks)continue; cur_serialno=serialno; - _of->cur_link=cur_link; + _of->cur_link=cur_link=li; ogg_stream_reset_serialno(&_of->os,serialno); _of->ready_state=OP_STREAMSET; /*If we're at the start of this link, initialize the granule position @@ -1980,32 +1942,13 @@ static int op_fetch_and_process_page(OggOpusFile *_of, opus_int32 total_duration; int durations[255]; int op_count; - int report_hole; - report_hole=0; total_duration=op_collect_audio_packets(_of,durations); if(OP_UNLIKELY(total_duration<0)){ - /*libogg reported a hole (a gap in the page sequence numbers). - Drain the packets from the page anyway. - If we don't, they'll still be there when we fetch the next page. - Then, when we go to pull out packets, we might get more than 255, - which would overrun our packet buffer.*/ + /*Drain the packets from the page anyway.*/ total_duration=op_collect_audio_packets(_of,durations); OP_ASSERT(total_duration>=0); - if(!_ignore_holes){ - /*Report the hole to the caller after we finish timestamping the - packets.*/ - report_hole=1; - /*We had lost or damaged pages, so reset our granule position - tracking. - This makes holes behave the same as a small raw seek. - If the next page is the EOS page, we'll discard it (because we - can't perform end trimming properly), and we'll always discard at - least 80 ms of audio (to allow decoder state to re-converge). - We could try to fill in the gap with PLC by looking at timestamps - in the non-EOS case, but that's complicated and error prone and we - can't rely on the timestamps being valid.*/ - _of->prev_packet_gp=-1; - } + /*Report holes to the caller.*/ + if(!_ignore_holes)return OP_HOLE; } op_count=_of->op_count; /*If we found at least one audio data packet, compute per-packet granule @@ -2032,7 +1975,6 @@ static int op_fetch_and_process_page(OggOpusFile *_of, Proceed to the next link, rather than risk playing back some samples that shouldn't have been played.*/ _of->op_count=0; - if(report_hole)return OP_HOLE; continue; } /*By default discard 80 ms of data after a seek, unless we seek @@ -2078,11 +2020,7 @@ static int op_fetch_and_process_page(OggOpusFile *_of, &&OP_LIKELY(diff<total_duration)){ cur_packet_gp=prev_packet_gp; for(pi=0;pi<op_count;pi++){ - /*Check for overflow.*/ - if(diff<0&&OP_UNLIKELY(OP_INT64_MAX+diff<durations[pi])){ - diff=durations[pi]+1; - } - else diff=durations[pi]-diff; + diff=durations[pi]-diff; /*If we have samples to trim...*/ if(diff>0){ /*If we trimmed the entire packet, stop (the spec says encoders @@ -2138,11 +2076,10 @@ static int op_fetch_and_process_page(OggOpusFile *_of, } _of->prev_packet_gp=prev_packet_gp; _of->prev_page_offset=_page_offset; - _of->op_count=op_count=pi; + _of->op_count=pi; + /*If end-trimming didn't trim all the packets, we're done.*/ + if(OP_LIKELY(pi>0))return 0; } - if(report_hole)return OP_HOLE; - /*If end-trimming didn't trim all the packets, we're done.*/ - if(op_count>0)return 0; } } } @@ -2180,41 +2117,35 @@ static ogg_int64_t op_get_granulepos(const OggOpusFile *_of, ogg_int64_t _pcm_offset,int *_li){ const OggOpusLink *links; ogg_int64_t duration; - ogg_int64_t pcm_start; - opus_int32 pre_skip; int nlinks; - int li_lo; - int li_hi; + int li; OP_ASSERT(_pcm_offset>=0); nlinks=_of->nlinks; links=_of->links; - li_lo=0; - li_hi=nlinks; - do{ - int li; - li=li_lo+(li_hi-li_lo>>1); - if(links[li].pcm_file_offset<=_pcm_offset)li_lo=li; - else li_hi=li; - } - while(li_hi-li_lo>1); - _pcm_offset-=links[li_lo].pcm_file_offset; - pcm_start=links[li_lo].pcm_start; - pre_skip=links[li_lo].head.pre_skip; - OP_ALWAYS_TRUE(!op_granpos_diff(&duration,links[li_lo].pcm_end,pcm_start)); - duration-=pre_skip; - if(_pcm_offset>=duration)return -1; - _pcm_offset+=pre_skip; - if(OP_UNLIKELY(pcm_start>OP_INT64_MAX-_pcm_offset)){ - /*Adding this amount to the granule position would overflow the positive - half of its 64-bit range. - Since signed overflow is undefined in C, do it in a way the compiler - isn't allowed to screw up.*/ - _pcm_offset-=OP_INT64_MAX-pcm_start+1; - pcm_start=OP_INT64_MIN; - } - pcm_start+=_pcm_offset; - *_li=li_lo; - return pcm_start; + for(li=0;OP_LIKELY(li<nlinks);li++){ + ogg_int64_t pcm_start; + opus_int32 pre_skip; + pcm_start=links[li].pcm_start; + pre_skip=links[li].head.pre_skip; + OP_ALWAYS_TRUE(!op_granpos_diff(&duration,links[li].pcm_end,pcm_start)); + duration-=pre_skip; + if(_pcm_offset<duration){ + _pcm_offset+=pre_skip; + if(OP_UNLIKELY(pcm_start>OP_INT64_MAX-_pcm_offset)){ + /*Adding this amount to the granule position would overflow the positive + half of its 64-bit range. + Since signed overflow is undefined in C, do it in a way the compiler + isn't allowed to screw up.*/ + _pcm_offset-=OP_INT64_MAX-pcm_start+1; + pcm_start=OP_INT64_MIN; + } + pcm_start+=_pcm_offset; + *_li=li; + return pcm_start; + } + _pcm_offset-=duration; + } + return -1; } /*A small helper to determine if an Ogg page contains data that continues onto @@ -2601,14 +2532,15 @@ int op_pcm_seek(OggOpusFile *_of,ogg_int64_t _pcm_offset){ ogg_int64_t gp; gp=_of->prev_packet_gp; if(OP_LIKELY(gp!=-1)){ - ogg_int64_t discard_count; - int nbuffered; + int nbuffered; nbuffered=OP_MAX(_of->od_buffer_size-_of->od_buffer_pos,0); OP_ALWAYS_TRUE(!op_granpos_add(&gp,gp,-nbuffered)); /*We do _not_ add cur_discard_count to gp. Otherwise the total amount to discard could grow without bound, and it would be better just to do a full seek.*/ - if(OP_LIKELY(!op_granpos_diff(&discard_count,target_gp,gp))){ + if(OP_LIKELY(!op_granpos_diff(&diff,gp,pcm_start))){ + ogg_int64_t discard_count; + discard_count=_pcm_offset-diff; /*We use a threshold of 90 ms instead of 80, since 80 ms is the _minimum_ we would have discarded after a full seek. Assuming 20 ms frames (the default), we'd discard 90 ms on average.*/ @@ -2674,14 +2606,22 @@ static ogg_int64_t op_get_pcm_offset(const OggOpusFile *_of, ogg_int64_t _gp,int _li){ const OggOpusLink *links; ogg_int64_t pcm_offset; + ogg_int64_t delta; + int li; links=_of->links; - OP_ASSERT(_li>=0&&_li<_of->nlinks); - pcm_offset=links[_li].pcm_file_offset; + pcm_offset=0; + OP_ASSERT(_li<_of->nlinks); + for(li=0;li<_li;li++){ + OP_ALWAYS_TRUE(!op_granpos_diff(&delta, + links[li].pcm_end,links[li].pcm_start)); + delta-=links[li].head.pre_skip; + pcm_offset+=delta; + } + OP_ASSERT(_li>=0); if(_of->seekable&&OP_UNLIKELY(op_granpos_cmp(_gp,links[_li].pcm_end)>0)){ _gp=links[_li].pcm_end; } if(OP_LIKELY(op_granpos_cmp(_gp,links[_li].pcm_start)>0)){ - ogg_int64_t delta; if(OP_UNLIKELY(op_granpos_diff(&delta,_gp,links[_li].pcm_start)<0)){ /*This means an unseekable stream claimed to have a page from more than 2 billion days after we joined.*/ diff --git a/thirdparty/opus/repacketizer.c b/thirdparty/opus/repacketizer.c index bda44a148a..c80ee7f001 100644 --- a/thirdparty/opus/repacketizer.c +++ b/thirdparty/opus/repacketizer.c @@ -213,8 +213,7 @@ opus_int32 opus_repacketizer_out_range_impl(OpusRepacketizer *rp, int begin, int { /* Using OPUS_MOVE() instead of OPUS_COPY() in case we're doing in-place padding from opus_packet_pad or opus_packet_unpad(). */ - /* assert disabled because it's not valid in C. */ - /* celt_assert(frames[i] + len[i] <= data || ptr <= frames[i]); */ + celt_assert(frames[i] + len[i] <= data || ptr <= frames[i]); OPUS_MOVE(ptr, frames[i], len[i]); ptr += len[i]; } diff --git a/thirdparty/opus/silk/A2NLSF.c b/thirdparty/opus/silk/A2NLSF.c index b487686ff9..b6e9e5ffcc 100644 --- a/thirdparty/opus/silk/A2NLSF.c +++ b/thirdparty/opus/silk/A2NLSF.c @@ -40,7 +40,7 @@ POSSIBILITY OF SUCH DAMAGE. /* Number of binary divisions, when not in low complexity mode */ #define BIN_DIV_STEPS_A2NLSF_FIX 3 /* must be no higher than 16 - log2( LSF_COS_TAB_SZ_FIX ) */ -#define MAX_ITERATIONS_A2NLSF_FIX 16 +#define MAX_ITERATIONS_A2NLSF_FIX 30 /* Helper function for A2NLSF(..) */ /* Transforms polynomials from cos(n*f) to cos(f)^n */ @@ -130,7 +130,7 @@ void silk_A2NLSF( const opus_int d /* I Filter order (must be even) */ ) { - opus_int i, k, m, dd, root_ix, ffrac; + opus_int i, k, m, dd, root_ix, ffrac; opus_int32 xlo, xhi, xmid; opus_int32 ylo, yhi, ymid, thr; opus_int32 nom, den; @@ -239,13 +239,13 @@ void silk_A2NLSF( /* Set NLSFs to white spectrum and exit */ NLSF[ 0 ] = (opus_int16)silk_DIV32_16( 1 << 15, d + 1 ); for( k = 1; k < d; k++ ) { - NLSF[ k ] = (opus_int16)silk_ADD16( NLSF[ k-1 ], NLSF[ 0 ] ); + NLSF[ k ] = (opus_int16)silk_SMULBB( k + 1, NLSF[ 0 ] ); } return; } /* Error: Apply progressively more bandwidth expansion and run again */ - silk_bwexpander_32( a_Q16, d, 65536 - silk_LSHIFT( 1, i ) ); + silk_bwexpander_32( a_Q16, d, 65536 - silk_SMULBB( 10 + i, i ) ); /* 10_Q16 = 0.00015*/ silk_A2NLSF_init( a_Q16, P, Q, dd ); p = P; /* Pointer to polynomial */ diff --git a/thirdparty/opus/silk/API.h b/thirdparty/opus/silk/API.h index 4d90ff9aa3..0131acbb08 100644 --- a/thirdparty/opus/silk/API.h +++ b/thirdparty/opus/silk/API.h @@ -80,8 +80,7 @@ opus_int silk_Encode( /* O Returns error co opus_int nSamplesIn, /* I Number of samples in input vector */ ec_enc *psRangeEnc, /* I/O Compressor data structure */ opus_int32 *nBytesOut, /* I/O Number of bytes in payload (input: Max bytes) */ - const opus_int prefillFlag, /* I Flag to indicate prefilling buffers no coding */ - int activity /* I Decision of Opus voice activity detector */ + const opus_int prefillFlag /* I Flag to indicate prefilling buffers no coding */ ); /****************************************/ diff --git a/thirdparty/opus/silk/CNG.c b/thirdparty/opus/silk/CNG.c index ef8e38df9f..8443ad63bb 100644 --- a/thirdparty/opus/silk/CNG.c +++ b/thirdparty/opus/silk/CNG.c @@ -138,16 +138,16 @@ void silk_CNG( gain_Q16 = silk_LSHIFT32( silk_SQRT_APPROX( gain_Q16 ), 8 ); } gain_Q10 = silk_RSHIFT( gain_Q16, 6 ); - + silk_CNG_exc( CNG_sig_Q14 + MAX_LPC_ORDER, psCNG->CNG_exc_buf_Q14, length, &psCNG->rand_seed ); /* Convert CNG NLSF to filter representation */ - silk_NLSF2A( A_Q12, psCNG->CNG_smth_NLSF_Q15, psDec->LPC_order, psDec->arch ); + silk_NLSF2A( A_Q12, psCNG->CNG_smth_NLSF_Q15, psDec->LPC_order ); /* Generate CNG signal, by synthesis filtering */ silk_memcpy( CNG_sig_Q14, psCNG->CNG_synth_state, MAX_LPC_ORDER * sizeof( opus_int32 ) ); - celt_assert( psDec->LPC_order == 10 || psDec->LPC_order == 16 ); for( i = 0; i < length; i++ ) { + silk_assert( psDec->LPC_order == 10 || psDec->LPC_order == 16 ); /* Avoids introducing a bias because silk_SMLAWB() always rounds to -inf */ LPC_pred_Q10 = silk_RSHIFT( psDec->LPC_order, 1 ); LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, CNG_sig_Q14[ MAX_LPC_ORDER + i - 1 ], A_Q12[ 0 ] ); @@ -170,11 +170,11 @@ void silk_CNG( } /* Update states */ - CNG_sig_Q14[ MAX_LPC_ORDER + i ] = silk_ADD_SAT32( CNG_sig_Q14[ MAX_LPC_ORDER + i ], silk_LSHIFT_SAT32( LPC_pred_Q10, 4 ) ); - + CNG_sig_Q14[ MAX_LPC_ORDER + i ] = silk_ADD_LSHIFT( CNG_sig_Q14[ MAX_LPC_ORDER + i ], LPC_pred_Q10, 4 ); + /* Scale with Gain and add to input signal */ frame[ i ] = (opus_int16)silk_ADD_SAT16( frame[ i ], silk_SAT16( silk_RSHIFT_ROUND( silk_SMULWW( CNG_sig_Q14[ MAX_LPC_ORDER + i ], gain_Q10 ), 8 ) ) ); - + } silk_memcpy( psCNG->CNG_synth_state, &CNG_sig_Q14[ length ], MAX_LPC_ORDER * sizeof( opus_int32 ) ); } else { diff --git a/thirdparty/opus/silk/LPC_analysis_filter.c b/thirdparty/opus/silk/LPC_analysis_filter.c index d34b5eb709..20906673ff 100644 --- a/thirdparty/opus/silk/LPC_analysis_filter.c +++ b/thirdparty/opus/silk/LPC_analysis_filter.c @@ -39,13 +39,6 @@ POSSIBILITY OF SUCH DAMAGE. /* first d output samples are set to zero */ /*******************************************/ -/* OPT: Using celt_fir() for this function should be faster, but it may cause - integer overflows in intermediate values (not final results), which the - current implementation silences by casting to unsigned. Enabling - this should be safe in pretty much all cases, even though it is not technically - C89-compliant. */ -#define USE_CELT_FIR 0 - void silk_LPC_analysis_filter( opus_int16 *out, /* O Output signal */ const opus_int16 *in, /* I Input signal */ @@ -56,7 +49,8 @@ void silk_LPC_analysis_filter( ) { opus_int j; -#if defined(FIXED_POINT) && USE_CELT_FIR +#ifdef FIXED_POINT + opus_int16 mem[SILK_MAX_ORDER_LPC]; opus_int16 num[SILK_MAX_ORDER_LPC]; #else int ix; @@ -64,16 +58,19 @@ void silk_LPC_analysis_filter( const opus_int16 *in_ptr; #endif - celt_assert( d >= 6 ); - celt_assert( (d & 1) == 0 ); - celt_assert( d <= len ); + silk_assert( d >= 6 ); + silk_assert( (d & 1) == 0 ); + silk_assert( d <= len ); -#if defined(FIXED_POINT) && USE_CELT_FIR - celt_assert( d <= SILK_MAX_ORDER_LPC ); +#ifdef FIXED_POINT + silk_assert( d <= SILK_MAX_ORDER_LPC ); for ( j = 0; j < d; j++ ) { num[ j ] = -B[ j ]; } - celt_fir( in + d, num, out + d, len - d, d, arch ); + for (j=0;j<d;j++) { + mem[ j ] = in[ d - j - 1 ]; + } + celt_fir( in + d, num, out + d, len - d, d, mem, arch ); for ( j = 0; j < d; j++ ) { out[ j ] = 0; } diff --git a/thirdparty/opus/silk/LPC_fit.c b/thirdparty/opus/silk/LPC_fit.c deleted file mode 100644 index cdea4f3abc..0000000000 --- a/thirdparty/opus/silk/LPC_fit.c +++ /dev/null @@ -1,81 +0,0 @@ -/*********************************************************************** -Copyright (c) 2013, Koen Vos. All rights reserved. -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: -- Redistributions of source code must retain the above copyright notice, -this list of conditions and the following disclaimer. -- Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the -names of specific contributors, may be used to endorse or promote -products derived from this software without specific prior written -permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. -***********************************************************************/ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "SigProc_FIX.h" - -/* Convert int32 coefficients to int16 coefs and make sure there's no wrap-around */ -void silk_LPC_fit( - opus_int16 *a_QOUT, /* O Output signal */ - opus_int32 *a_QIN, /* I/O Input signal */ - const opus_int QOUT, /* I Input Q domain */ - const opus_int QIN, /* I Input Q domain */ - const opus_int d /* I Filter order */ -) -{ - opus_int i, k, idx = 0; - opus_int32 maxabs, absval, chirp_Q16; - - /* Limit the maximum absolute value of the prediction coefficients, so that they'll fit in int16 */ - for( i = 0; i < 10; i++ ) { - /* Find maximum absolute value and its index */ - maxabs = 0; - for( k = 0; k < d; k++ ) { - absval = silk_abs( a_QIN[k] ); - if( absval > maxabs ) { - maxabs = absval; - idx = k; - } - } - maxabs = silk_RSHIFT_ROUND( maxabs, QIN - QOUT ); - - if( maxabs > silk_int16_MAX ) { - /* Reduce magnitude of prediction coefficients */ - maxabs = silk_min( maxabs, 163838 ); /* ( silk_int32_MAX >> 14 ) + silk_int16_MAX = 163838 */ - chirp_Q16 = SILK_FIX_CONST( 0.999, 16 ) - silk_DIV32( silk_LSHIFT( maxabs - silk_int16_MAX, 14 ), - silk_RSHIFT32( silk_MUL( maxabs, idx + 1), 2 ) ); - silk_bwexpander_32( a_QIN, d, chirp_Q16 ); - } else { - break; - } - } - - if( i == 10 ) { - /* Reached the last iteration, clip the coefficients */ - for( k = 0; k < d; k++ ) { - a_QOUT[ k ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( a_QIN[ k ], QIN - QOUT ) ); - a_QIN[ k ] = silk_LSHIFT( (opus_int32)a_QOUT[ k ], QIN - QOUT ); - } - } else { - for( k = 0; k < d; k++ ) { - a_QOUT[ k ] = (opus_int16)silk_RSHIFT_ROUND( a_QIN[ k ], QIN - QOUT ); - } - } -} diff --git a/thirdparty/opus/silk/LPC_inv_pred_gain.c b/thirdparty/opus/silk/LPC_inv_pred_gain.c index a3746a6ef9..4af89aa5fa 100644 --- a/thirdparty/opus/silk/LPC_inv_pred_gain.c +++ b/thirdparty/opus/silk/LPC_inv_pred_gain.c @@ -30,7 +30,6 @@ POSSIBILITY OF SUCH DAMAGE. #endif #include "SigProc_FIX.h" -#include "define.h" #define QA 24 #define A_LIMIT SILK_FIX_CONST( 0.99975, QA ) @@ -39,103 +38,117 @@ POSSIBILITY OF SUCH DAMAGE. /* Compute inverse of LPC prediction gain, and */ /* test if LPC coefficients are stable (all poles within unit circle) */ -static opus_int32 LPC_inverse_pred_gain_QA_c( /* O Returns inverse prediction gain in energy domain, Q30 */ - opus_int32 A_QA[ SILK_MAX_ORDER_LPC ], /* I Prediction coefficients */ +static opus_int32 LPC_inverse_pred_gain_QA( /* O Returns inverse prediction gain in energy domain, Q30 */ + opus_int32 A_QA[ 2 ][ SILK_MAX_ORDER_LPC ], /* I Prediction coefficients */ const opus_int order /* I Prediction order */ ) { opus_int k, n, mult2Q; - opus_int32 invGain_Q30, rc_Q31, rc_mult1_Q30, rc_mult2, tmp1, tmp2; + opus_int32 invGain_Q30, rc_Q31, rc_mult1_Q30, rc_mult2, tmp_QA; + opus_int32 *Aold_QA, *Anew_QA; - invGain_Q30 = SILK_FIX_CONST( 1, 30 ); + Anew_QA = A_QA[ order & 1 ]; + + invGain_Q30 = (opus_int32)1 << 30; for( k = order - 1; k > 0; k-- ) { /* Check for stability */ - if( ( A_QA[ k ] > A_LIMIT ) || ( A_QA[ k ] < -A_LIMIT ) ) { + if( ( Anew_QA[ k ] > A_LIMIT ) || ( Anew_QA[ k ] < -A_LIMIT ) ) { return 0; } /* Set RC equal to negated AR coef */ - rc_Q31 = -silk_LSHIFT( A_QA[ k ], 31 - QA ); + rc_Q31 = -silk_LSHIFT( Anew_QA[ k ], 31 - QA ); /* rc_mult1_Q30 range: [ 1 : 2^30 ] */ - rc_mult1_Q30 = silk_SUB32( SILK_FIX_CONST( 1, 30 ), silk_SMMUL( rc_Q31, rc_Q31 ) ); + rc_mult1_Q30 = ( (opus_int32)1 << 30 ) - silk_SMMUL( rc_Q31, rc_Q31 ); silk_assert( rc_mult1_Q30 > ( 1 << 15 ) ); /* reduce A_LIMIT if fails */ silk_assert( rc_mult1_Q30 <= ( 1 << 30 ) ); + /* rc_mult2 range: [ 2^30 : silk_int32_MAX ] */ + mult2Q = 32 - silk_CLZ32( silk_abs( rc_mult1_Q30 ) ); + rc_mult2 = silk_INVERSE32_varQ( rc_mult1_Q30, mult2Q + 30 ); + /* Update inverse gain */ /* invGain_Q30 range: [ 0 : 2^30 ] */ invGain_Q30 = silk_LSHIFT( silk_SMMUL( invGain_Q30, rc_mult1_Q30 ), 2 ); silk_assert( invGain_Q30 >= 0 ); silk_assert( invGain_Q30 <= ( 1 << 30 ) ); - if( invGain_Q30 < SILK_FIX_CONST( 1.0f / MAX_PREDICTION_POWER_GAIN, 30 ) ) { - return 0; - } - /* rc_mult2 range: [ 2^30 : silk_int32_MAX ] */ - mult2Q = 32 - silk_CLZ32( silk_abs( rc_mult1_Q30 ) ); - rc_mult2 = silk_INVERSE32_varQ( rc_mult1_Q30, mult2Q + 30 ); + /* Swap pointers */ + Aold_QA = Anew_QA; + Anew_QA = A_QA[ k & 1 ]; /* Update AR coefficient */ - for( n = 0; n < (k + 1) >> 1; n++ ) { - opus_int64 tmp64; - tmp1 = A_QA[ n ]; - tmp2 = A_QA[ k - n - 1 ]; - tmp64 = silk_RSHIFT_ROUND64( silk_SMULL( silk_SUB_SAT32(tmp1, - MUL32_FRAC_Q( tmp2, rc_Q31, 31 ) ), rc_mult2 ), mult2Q); - if( tmp64 > silk_int32_MAX || tmp64 < silk_int32_MIN ) { - return 0; - } - A_QA[ n ] = ( opus_int32 )tmp64; - tmp64 = silk_RSHIFT_ROUND64( silk_SMULL( silk_SUB_SAT32(tmp2, - MUL32_FRAC_Q( tmp1, rc_Q31, 31 ) ), rc_mult2), mult2Q); - if( tmp64 > silk_int32_MAX || tmp64 < silk_int32_MIN ) { - return 0; - } - A_QA[ k - n - 1 ] = ( opus_int32 )tmp64; + for( n = 0; n < k; n++ ) { + tmp_QA = Aold_QA[ n ] - MUL32_FRAC_Q( Aold_QA[ k - n - 1 ], rc_Q31, 31 ); + Anew_QA[ n ] = MUL32_FRAC_Q( tmp_QA, rc_mult2 , mult2Q ); } } /* Check for stability */ - if( ( A_QA[ k ] > A_LIMIT ) || ( A_QA[ k ] < -A_LIMIT ) ) { + if( ( Anew_QA[ 0 ] > A_LIMIT ) || ( Anew_QA[ 0 ] < -A_LIMIT ) ) { return 0; } /* Set RC equal to negated AR coef */ - rc_Q31 = -silk_LSHIFT( A_QA[ 0 ], 31 - QA ); + rc_Q31 = -silk_LSHIFT( Anew_QA[ 0 ], 31 - QA ); /* Range: [ 1 : 2^30 ] */ - rc_mult1_Q30 = silk_SUB32( SILK_FIX_CONST( 1, 30 ), silk_SMMUL( rc_Q31, rc_Q31 ) ); + rc_mult1_Q30 = ( (opus_int32)1 << 30 ) - silk_SMMUL( rc_Q31, rc_Q31 ); /* Update inverse gain */ /* Range: [ 0 : 2^30 ] */ invGain_Q30 = silk_LSHIFT( silk_SMMUL( invGain_Q30, rc_mult1_Q30 ), 2 ); - silk_assert( invGain_Q30 >= 0 ); - silk_assert( invGain_Q30 <= ( 1 << 30 ) ); - if( invGain_Q30 < SILK_FIX_CONST( 1.0f / MAX_PREDICTION_POWER_GAIN, 30 ) ) { - return 0; - } + silk_assert( invGain_Q30 >= 0 ); + silk_assert( invGain_Q30 <= 1<<30 ); return invGain_Q30; } /* For input in Q12 domain */ -opus_int32 silk_LPC_inverse_pred_gain_c( /* O Returns inverse prediction gain in energy domain, Q30 */ +opus_int32 silk_LPC_inverse_pred_gain( /* O Returns inverse prediction gain in energy domain, Q30 */ const opus_int16 *A_Q12, /* I Prediction coefficients, Q12 [order] */ const opus_int order /* I Prediction order */ ) { opus_int k; - opus_int32 Atmp_QA[ SILK_MAX_ORDER_LPC ]; + opus_int32 Atmp_QA[ 2 ][ SILK_MAX_ORDER_LPC ]; + opus_int32 *Anew_QA; opus_int32 DC_resp = 0; + Anew_QA = Atmp_QA[ order & 1 ]; + /* Increase Q domain of the AR coefficients */ for( k = 0; k < order; k++ ) { DC_resp += (opus_int32)A_Q12[ k ]; - Atmp_QA[ k ] = silk_LSHIFT32( (opus_int32)A_Q12[ k ], QA - 12 ); + Anew_QA[ k ] = silk_LSHIFT32( (opus_int32)A_Q12[ k ], QA - 12 ); } /* If the DC is unstable, we don't even need to do the full calculations */ if( DC_resp >= 4096 ) { return 0; } - return LPC_inverse_pred_gain_QA_c( Atmp_QA, order ); + return LPC_inverse_pred_gain_QA( Atmp_QA, order ); } + +#ifdef FIXED_POINT + +/* For input in Q24 domain */ +opus_int32 silk_LPC_inverse_pred_gain_Q24( /* O Returns inverse prediction gain in energy domain, Q30 */ + const opus_int32 *A_Q24, /* I Prediction coefficients [order] */ + const opus_int order /* I Prediction order */ +) +{ + opus_int k; + opus_int32 Atmp_QA[ 2 ][ SILK_MAX_ORDER_LPC ]; + opus_int32 *Anew_QA; + + Anew_QA = Atmp_QA[ order & 1 ]; + + /* Increase Q domain of the AR coefficients */ + for( k = 0; k < order; k++ ) { + Anew_QA[ k ] = silk_RSHIFT32( A_Q24[ k ], 24 - QA ); + } + + return LPC_inverse_pred_gain_QA( Atmp_QA, order ); +} +#endif diff --git a/thirdparty/opus/silk/LP_variable_cutoff.c b/thirdparty/opus/silk/LP_variable_cutoff.c index 79112ad354..f639e1f899 100644 --- a/thirdparty/opus/silk/LP_variable_cutoff.c +++ b/thirdparty/opus/silk/LP_variable_cutoff.c @@ -130,6 +130,6 @@ void silk_LP_variable_cutoff( /* ARMA low-pass filtering */ silk_assert( TRANSITION_NB == 3 && TRANSITION_NA == 2 ); - silk_biquad_alt_stride1( frame, B_Q28, A_Q28, psLP->In_LP_State, frame, frame_length); + silk_biquad_alt( frame, B_Q28, A_Q28, psLP->In_LP_State, frame, frame_length, 1); } } diff --git a/thirdparty/opus/silk/MacroCount.h b/thirdparty/opus/silk/MacroCount.h index 78100ffede..834817d058 100644 --- a/thirdparty/opus/silk/MacroCount.h +++ b/thirdparty/opus/silk/MacroCount.h @@ -319,6 +319,14 @@ static OPUS_INLINE opus_int32 silk_ADD_POS_SAT32(opus_int64 a, opus_int64 b){ return(tmp); } +#undef silk_ADD_POS_SAT64 +static OPUS_INLINE opus_int64 silk_ADD_POS_SAT64(opus_int64 a, opus_int64 b){ + opus_int64 tmp; + ops_count += 1; + tmp = ((((a)+(b)) & 0x8000000000000000LL) ? silk_int64_MAX : ((a)+(b))); + return(tmp); +} + #undef silk_LSHIFT8 static OPUS_INLINE opus_int8 silk_LSHIFT8(opus_int8 a, opus_int32 shift){ opus_int8 ret; @@ -691,7 +699,7 @@ return(ret); #undef silk_LIMIT_32 -static OPUS_INLINE opus_int32 silk_LIMIT_32(opus_int32 a, opus_int32 limit1, opus_int32 limit2) +static OPUS_INLINE opus_int silk_LIMIT_32(opus_int32 a, opus_int32 limit1, opus_int32 limit2) { opus_int32 ret; ops_count += 6; diff --git a/thirdparty/opus/silk/MacroDebug.h b/thirdparty/opus/silk/MacroDebug.h index 8dd4ce2ee2..35aedc5c5f 100644 --- a/thirdparty/opus/silk/MacroDebug.h +++ b/thirdparty/opus/silk/MacroDebug.h @@ -539,7 +539,8 @@ static OPUS_INLINE opus_int32 silk_DIV32_16_(opus_int32 a32, opus_int32 b32, cha no checking needed for silk_POS_SAT32 no checking needed for silk_ADD_POS_SAT8 no checking needed for silk_ADD_POS_SAT16 - no checking needed for silk_ADD_POS_SAT32 */ + no checking needed for silk_ADD_POS_SAT32 + no checking needed for silk_ADD_POS_SAT64 */ #undef silk_LSHIFT8 #define silk_LSHIFT8(a,b) silk_LSHIFT8_((a), (b), __FILE__, __LINE__) diff --git a/thirdparty/opus/silk/NLSF2A.c b/thirdparty/opus/silk/NLSF2A.c index d5b7730638..b1c559ea68 100644 --- a/thirdparty/opus/silk/NLSF2A.c +++ b/thirdparty/opus/silk/NLSF2A.c @@ -66,8 +66,7 @@ static OPUS_INLINE void silk_NLSF2A_find_poly( void silk_NLSF2A( opus_int16 *a_Q12, /* O monic whitening filter coefficients in Q12, [ d ] */ const opus_int16 *NLSF, /* I normalized line spectral frequencies in Q15, [ d ] */ - const opus_int d, /* I filter order (should be even) */ - int arch /* I Run-time architecture */ + const opus_int d /* I filter order (should be even) */ ) { /* This ordering was found to maximize quality. It improves numerical accuracy of @@ -84,14 +83,15 @@ void silk_NLSF2A( opus_int32 P[ SILK_MAX_ORDER_LPC / 2 + 1 ], Q[ SILK_MAX_ORDER_LPC / 2 + 1 ]; opus_int32 Ptmp, Qtmp, f_int, f_frac, cos_val, delta; opus_int32 a32_QA1[ SILK_MAX_ORDER_LPC ]; + opus_int32 maxabs, absval, idx=0, sc_Q16; silk_assert( LSF_COS_TAB_SZ_FIX == 128 ); - celt_assert( d==10 || d==16 ); + silk_assert( d==10||d==16 ); /* convert LSFs to 2*cos(LSF), using piecewise linear curve from table */ ordering = d == 16 ? ordering16 : ordering10; for( k = 0; k < d; k++ ) { - silk_assert( NLSF[k] >= 0 ); + silk_assert(NLSF[k] >= 0 ); /* f_int on a scale 0-127 (rounded down) */ f_int = silk_RSHIFT( NLSF[k], 15 - 7 ); @@ -126,15 +126,52 @@ void silk_NLSF2A( a32_QA1[ d-k-1 ] = Qtmp - Ptmp; /* QA+1 */ } - /* Convert int32 coefficients to Q12 int16 coefs */ - silk_LPC_fit( a_Q12, a32_QA1, 12, QA + 1, d ); + /* Limit the maximum absolute value of the prediction coefficients, so that they'll fit in int16 */ + for( i = 0; i < 10; i++ ) { + /* Find maximum absolute value and its index */ + maxabs = 0; + for( k = 0; k < d; k++ ) { + absval = silk_abs( a32_QA1[k] ); + if( absval > maxabs ) { + maxabs = absval; + idx = k; + } + } + maxabs = silk_RSHIFT_ROUND( maxabs, QA + 1 - 12 ); /* QA+1 -> Q12 */ + + if( maxabs > silk_int16_MAX ) { + /* Reduce magnitude of prediction coefficients */ + maxabs = silk_min( maxabs, 163838 ); /* ( silk_int32_MAX >> 14 ) + silk_int16_MAX = 163838 */ + sc_Q16 = SILK_FIX_CONST( 0.999, 16 ) - silk_DIV32( silk_LSHIFT( maxabs - silk_int16_MAX, 14 ), + silk_RSHIFT32( silk_MUL( maxabs, idx + 1), 2 ) ); + silk_bwexpander_32( a32_QA1, d, sc_Q16 ); + } else { + break; + } + } - for( i = 0; silk_LPC_inverse_pred_gain( a_Q12, d, arch ) == 0 && i < MAX_LPC_STABILIZE_ITERATIONS; i++ ) { - /* Prediction coefficients are (too close to) unstable; apply bandwidth expansion */ - /* on the unscaled coefficients, convert to Q12 and measure again */ - silk_bwexpander_32( a32_QA1, d, 65536 - silk_LSHIFT( 2, i ) ); + if( i == 10 ) { + /* Reached the last iteration, clip the coefficients */ for( k = 0; k < d; k++ ) { - a_Q12[ k ] = (opus_int16)silk_RSHIFT_ROUND( a32_QA1[ k ], QA + 1 - 12 ); /* QA+1 -> Q12 */ + a_Q12[ k ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( a32_QA1[ k ], QA + 1 - 12 ) ); /* QA+1 -> Q12 */ + a32_QA1[ k ] = silk_LSHIFT( (opus_int32)a_Q12[ k ], QA + 1 - 12 ); + } + } else { + for( k = 0; k < d; k++ ) { + a_Q12[ k ] = (opus_int16)silk_RSHIFT_ROUND( a32_QA1[ k ], QA + 1 - 12 ); /* QA+1 -> Q12 */ + } + } + + for( i = 0; i < MAX_LPC_STABILIZE_ITERATIONS; i++ ) { + if( silk_LPC_inverse_pred_gain( a_Q12, d ) < SILK_FIX_CONST( 1.0 / MAX_PREDICTION_POWER_GAIN, 30 ) ) { + /* Prediction coefficients are (too close to) unstable; apply bandwidth expansion */ + /* on the unscaled coefficients, convert to Q12 and measure again */ + silk_bwexpander_32( a32_QA1, d, 65536 - silk_LSHIFT( 2, i ) ); + for( k = 0; k < d; k++ ) { + a_Q12[ k ] = (opus_int16)silk_RSHIFT_ROUND( a32_QA1[ k ], QA + 1 - 12 ); /* QA+1 -> Q12 */ + } + } else { + break; } } } diff --git a/thirdparty/opus/silk/NLSF_VQ.c b/thirdparty/opus/silk/NLSF_VQ.c index b83182a79c..69b6e22e18 100644 --- a/thirdparty/opus/silk/NLSF_VQ.c +++ b/thirdparty/opus/silk/NLSF_VQ.c @@ -33,44 +33,36 @@ POSSIBILITY OF SUCH DAMAGE. /* Compute quantization errors for an LPC_order element input vector for a VQ codebook */ void silk_NLSF_VQ( - opus_int32 err_Q24[], /* O Quantization errors [K] */ + opus_int32 err_Q26[], /* O Quantization errors [K] */ const opus_int16 in_Q15[], /* I Input vectors to be quantized [LPC_order] */ const opus_uint8 pCB_Q8[], /* I Codebook vectors [K*LPC_order] */ - const opus_int16 pWght_Q9[], /* I Codebook weights [K*LPC_order] */ const opus_int K, /* I Number of codebook vectors */ const opus_int LPC_order /* I Number of LPCs */ ) { - opus_int i, m; - opus_int32 diff_Q15, diffw_Q24, sum_error_Q24, pred_Q24; - const opus_int16 *w_Q9_ptr; - const opus_uint8 *cb_Q8_ptr; + opus_int i, m; + opus_int32 diff_Q15, sum_error_Q30, sum_error_Q26; - celt_assert( ( LPC_order & 1 ) == 0 ); + silk_assert( LPC_order <= 16 ); + silk_assert( ( LPC_order & 1 ) == 0 ); /* Loop over codebook */ - cb_Q8_ptr = pCB_Q8; - w_Q9_ptr = pWght_Q9; for( i = 0; i < K; i++ ) { - sum_error_Q24 = 0; - pred_Q24 = 0; - for( m = LPC_order-2; m >= 0; m -= 2 ) { - /* Compute weighted absolute predictive quantization error for index m + 1 */ - diff_Q15 = silk_SUB_LSHIFT32( in_Q15[ m + 1 ], (opus_int32)cb_Q8_ptr[ m + 1 ], 7 ); /* range: [ -32767 : 32767 ]*/ - diffw_Q24 = silk_SMULBB( diff_Q15, w_Q9_ptr[ m + 1 ] ); - sum_error_Q24 = silk_ADD32( sum_error_Q24, silk_abs( silk_SUB_RSHIFT32( diffw_Q24, pred_Q24, 1 ) ) ); - pred_Q24 = diffw_Q24; + sum_error_Q26 = 0; + for( m = 0; m < LPC_order; m += 2 ) { + /* Compute weighted squared quantization error for index m */ + diff_Q15 = silk_SUB_LSHIFT32( in_Q15[ m ], (opus_int32)*pCB_Q8++, 7 ); /* range: [ -32767 : 32767 ]*/ + sum_error_Q30 = silk_SMULBB( diff_Q15, diff_Q15 ); - /* Compute weighted absolute predictive quantization error for index m */ - diff_Q15 = silk_SUB_LSHIFT32( in_Q15[ m ], (opus_int32)cb_Q8_ptr[ m ], 7 ); /* range: [ -32767 : 32767 ]*/ - diffw_Q24 = silk_SMULBB( diff_Q15, w_Q9_ptr[ m ] ); - sum_error_Q24 = silk_ADD32( sum_error_Q24, silk_abs( silk_SUB_RSHIFT32( diffw_Q24, pred_Q24, 1 ) ) ); - pred_Q24 = diffw_Q24; + /* Compute weighted squared quantization error for index m + 1 */ + diff_Q15 = silk_SUB_LSHIFT32( in_Q15[m + 1], (opus_int32)*pCB_Q8++, 7 ); /* range: [ -32767 : 32767 ]*/ + sum_error_Q30 = silk_SMLABB( sum_error_Q30, diff_Q15, diff_Q15 ); - silk_assert( sum_error_Q24 >= 0 ); + sum_error_Q26 = silk_ADD_RSHIFT32( sum_error_Q26, sum_error_Q30, 4 ); + + silk_assert( sum_error_Q26 >= 0 ); + silk_assert( sum_error_Q30 >= 0 ); } - err_Q24[ i ] = sum_error_Q24; - cb_Q8_ptr += LPC_order; - w_Q9_ptr += LPC_order; + err_Q26[ i ] = sum_error_Q26; } } diff --git a/thirdparty/opus/silk/NLSF_VQ_weights_laroia.c b/thirdparty/opus/silk/NLSF_VQ_weights_laroia.c index 9873bcde10..04894c59ab 100644 --- a/thirdparty/opus/silk/NLSF_VQ_weights_laroia.c +++ b/thirdparty/opus/silk/NLSF_VQ_weights_laroia.c @@ -48,8 +48,8 @@ void silk_NLSF_VQ_weights_laroia( opus_int k; opus_int32 tmp1_int, tmp2_int; - celt_assert( D > 0 ); - celt_assert( ( D & 1 ) == 0 ); + silk_assert( D > 0 ); + silk_assert( ( D & 1 ) == 0 ); /* First value */ tmp1_int = silk_max_int( pNLSF_Q15[ 0 ], 1 ); diff --git a/thirdparty/opus/silk/NLSF_decode.c b/thirdparty/opus/silk/NLSF_decode.c index eeb0ba8c92..9f715060b8 100644 --- a/thirdparty/opus/silk/NLSF_decode.c +++ b/thirdparty/opus/silk/NLSF_decode.c @@ -32,7 +32,7 @@ POSSIBILITY OF SUCH DAMAGE. #include "main.h" /* Predictive dequantizer for NLSF residuals */ -static OPUS_INLINE void silk_NLSF_residual_dequant( /* O Returns RD value in Q30 */ +static OPUS_INLINE void silk_NLSF_residual_dequant( /* O Returns RD value in Q30 */ opus_int16 x_Q10[], /* O Output [ order ] */ const opus_int8 indices[], /* I Quantization indices [ order ] */ const opus_uint8 pred_coef_Q8[], /* I Backward predictor coefs [ order ] */ @@ -70,9 +70,15 @@ void silk_NLSF_decode( opus_uint8 pred_Q8[ MAX_LPC_ORDER ]; opus_int16 ec_ix[ MAX_LPC_ORDER ]; opus_int16 res_Q10[ MAX_LPC_ORDER ]; - opus_int32 NLSF_Q15_tmp; + opus_int16 W_tmp_QW[ MAX_LPC_ORDER ]; + opus_int32 W_tmp_Q9, NLSF_Q15_tmp; const opus_uint8 *pCB_element; - const opus_int16 *pCB_Wght_Q9; + + /* Decode first stage */ + pCB_element = &psNLSF_CB->CB1_NLSF_Q8[ NLSFIndices[ 0 ] * psNLSF_CB->order ]; + for( i = 0; i < psNLSF_CB->order; i++ ) { + pNLSF_Q15[ i ] = silk_LSHIFT( (opus_int16)pCB_element[ i ], 7 ); + } /* Unpack entropy table indices and predictor for current CB1 index */ silk_NLSF_unpack( ec_ix, pred_Q8, psNLSF_CB, NLSFIndices[ 0 ] ); @@ -80,11 +86,13 @@ void silk_NLSF_decode( /* Predictive residual dequantizer */ silk_NLSF_residual_dequant( res_Q10, &NLSFIndices[ 1 ], pred_Q8, psNLSF_CB->quantStepSize_Q16, psNLSF_CB->order ); - /* Apply inverse square-rooted weights to first stage and add to output */ - pCB_element = &psNLSF_CB->CB1_NLSF_Q8[ NLSFIndices[ 0 ] * psNLSF_CB->order ]; - pCB_Wght_Q9 = &psNLSF_CB->CB1_Wght_Q9[ NLSFIndices[ 0 ] * psNLSF_CB->order ]; + /* Weights from codebook vector */ + silk_NLSF_VQ_weights_laroia( W_tmp_QW, pNLSF_Q15, psNLSF_CB->order ); + + /* Apply inverse square-rooted weights and add to output */ for( i = 0; i < psNLSF_CB->order; i++ ) { - NLSF_Q15_tmp = silk_ADD_LSHIFT32( silk_DIV32_16( silk_LSHIFT( (opus_int32)res_Q10[ i ], 14 ), pCB_Wght_Q9[ i ] ), (opus_int16)pCB_element[ i ], 7 ); + W_tmp_Q9 = silk_SQRT_APPROX( silk_LSHIFT( (opus_int32)W_tmp_QW[ i ], 18 - NLSF_W_Q ) ); + NLSF_Q15_tmp = silk_ADD32( pNLSF_Q15[ i ], silk_DIV32_16( silk_LSHIFT( (opus_int32)res_Q10[ i ], 14 ), W_tmp_Q9 ) ); pNLSF_Q15[ i ] = (opus_int16)silk_LIMIT( NLSF_Q15_tmp, 0, 32767 ); } diff --git a/thirdparty/opus/silk/NLSF_del_dec_quant.c b/thirdparty/opus/silk/NLSF_del_dec_quant.c index 44a16acd0b..de88fee060 100644 --- a/thirdparty/opus/silk/NLSF_del_dec_quant.c +++ b/thirdparty/opus/silk/NLSF_del_dec_quant.c @@ -84,7 +84,7 @@ opus_int32 silk_NLSF_del_dec_quant( /* O Returns nStates = 1; RD_Q25[ 0 ] = 0; prev_out_Q10[ 0 ] = 0; - for( i = order - 1; i >= 0; i-- ) { + for( i = order - 1; ; i-- ) { rates_Q5 = &ec_rates_Q5[ ec_ix[ i ] ]; in_Q10 = x_Q10[ i ]; for( j = 0; j < nStates; j++ ) { @@ -131,7 +131,7 @@ opus_int32 silk_NLSF_del_dec_quant( /* O Returns RD_Q25[ j + nStates ] = silk_SMLABB( silk_MLA( RD_tmp_Q25, silk_SMULBB( diff_Q10, diff_Q10 ), w_Q5[ i ] ), mu_Q20, rate1_Q5 ); } - if( nStates <= NLSF_QUANT_DEL_DEC_STATES/2 ) { + if( nStates <= ( NLSF_QUANT_DEL_DEC_STATES >> 1 ) ) { /* double number of states and copy */ for( j = 0; j < nStates; j++ ) { ind[ j + nStates ][ i ] = ind[ j ][ i ] + 1; @@ -140,7 +140,7 @@ opus_int32 silk_NLSF_del_dec_quant( /* O Returns for( j = nStates; j < NLSF_QUANT_DEL_DEC_STATES; j++ ) { ind[ j ][ i ] = ind[ j - nStates ][ i ]; } - } else { + } else if( i > 0 ) { /* sort lower and upper half of RD_Q25, pairwise */ for( j = 0; j < NLSF_QUANT_DEL_DEC_STATES; j++ ) { if( RD_Q25[ j ] > RD_Q25[ j + NLSF_QUANT_DEL_DEC_STATES ] ) { @@ -191,6 +191,8 @@ opus_int32 silk_NLSF_del_dec_quant( /* O Returns for( j = 0; j < NLSF_QUANT_DEL_DEC_STATES; j++ ) { ind[ j ][ i ] += silk_RSHIFT( ind_sort[ j ], NLSF_QUANT_DEL_DEC_STATES_LOG2 ); } + } else { /* i == 0 */ + break; } } diff --git a/thirdparty/opus/silk/NLSF_encode.c b/thirdparty/opus/silk/NLSF_encode.c index 01ac7db78c..f03c3f1c35 100644 --- a/thirdparty/opus/silk/NLSF_encode.c +++ b/thirdparty/opus/silk/NLSF_encode.c @@ -37,9 +37,9 @@ POSSIBILITY OF SUCH DAMAGE. /***********************/ opus_int32 silk_NLSF_encode( /* O Returns RD value in Q25 */ opus_int8 *NLSFIndices, /* I Codebook path vector [ LPC_ORDER + 1 ] */ - opus_int16 *pNLSF_Q15, /* I/O (Un)quantized NLSF vector [ LPC_ORDER ] */ + opus_int16 *pNLSF_Q15, /* I/O Quantized NLSF vector [ LPC_ORDER ] */ const silk_NLSF_CB_struct *psNLSF_CB, /* I Codebook object */ - const opus_int16 *pW_Q2, /* I NLSF weight vector [ LPC_ORDER ] */ + const opus_int16 *pW_QW, /* I NLSF weight vector [ LPC_ORDER ] */ const opus_int NLSF_mu_Q20, /* I Rate weight for the RD optimization */ const opus_int nSurvivors, /* I Max survivors after first stage */ const opus_int signalType /* I Signal type: 0/1/2 */ @@ -47,32 +47,34 @@ opus_int32 silk_NLSF_encode( /* O Returns { opus_int i, s, ind1, bestIndex, prob_Q8, bits_q7; opus_int32 W_tmp_Q9, ret; - VARDECL( opus_int32, err_Q24 ); + VARDECL( opus_int32, err_Q26 ); VARDECL( opus_int32, RD_Q25 ); VARDECL( opus_int, tempIndices1 ); VARDECL( opus_int8, tempIndices2 ); + opus_int16 res_Q15[ MAX_LPC_ORDER ]; opus_int16 res_Q10[ MAX_LPC_ORDER ]; opus_int16 NLSF_tmp_Q15[ MAX_LPC_ORDER ]; + opus_int16 W_tmp_QW[ MAX_LPC_ORDER ]; opus_int16 W_adj_Q5[ MAX_LPC_ORDER ]; opus_uint8 pred_Q8[ MAX_LPC_ORDER ]; opus_int16 ec_ix[ MAX_LPC_ORDER ]; const opus_uint8 *pCB_element, *iCDF_ptr; - const opus_int16 *pCB_Wght_Q9; SAVE_STACK; - celt_assert( signalType >= 0 && signalType <= 2 ); + silk_assert( nSurvivors <= NLSF_VQ_MAX_SURVIVORS ); + silk_assert( signalType >= 0 && signalType <= 2 ); silk_assert( NLSF_mu_Q20 <= 32767 && NLSF_mu_Q20 >= 0 ); /* NLSF stabilization */ silk_NLSF_stabilize( pNLSF_Q15, psNLSF_CB->deltaMin_Q15, psNLSF_CB->order ); /* First stage: VQ */ - ALLOC( err_Q24, psNLSF_CB->nVectors, opus_int32 ); - silk_NLSF_VQ( err_Q24, pNLSF_Q15, psNLSF_CB->CB1_NLSF_Q8, psNLSF_CB->CB1_Wght_Q9, psNLSF_CB->nVectors, psNLSF_CB->order ); + ALLOC( err_Q26, psNLSF_CB->nVectors, opus_int32 ); + silk_NLSF_VQ( err_Q26, pNLSF_Q15, psNLSF_CB->CB1_NLSF_Q8, psNLSF_CB->nVectors, psNLSF_CB->order ); /* Sort the quantization errors */ ALLOC( tempIndices1, nSurvivors, opus_int ); - silk_insertion_sort_increasing( err_Q24, tempIndices1, psNLSF_CB->nVectors, nSurvivors ); + silk_insertion_sort_increasing( err_Q26, tempIndices1, psNLSF_CB->nVectors, nSurvivors ); ALLOC( RD_Q25, nSurvivors, opus_int32 ); ALLOC( tempIndices2, nSurvivors * MAX_LPC_ORDER, opus_int8 ); @@ -83,12 +85,23 @@ opus_int32 silk_NLSF_encode( /* O Returns /* Residual after first stage */ pCB_element = &psNLSF_CB->CB1_NLSF_Q8[ ind1 * psNLSF_CB->order ]; - pCB_Wght_Q9 = &psNLSF_CB->CB1_Wght_Q9[ ind1 * psNLSF_CB->order ]; for( i = 0; i < psNLSF_CB->order; i++ ) { NLSF_tmp_Q15[ i ] = silk_LSHIFT16( (opus_int16)pCB_element[ i ], 7 ); - W_tmp_Q9 = pCB_Wght_Q9[ i ]; - res_Q10[ i ] = (opus_int16)silk_RSHIFT( silk_SMULBB( pNLSF_Q15[ i ] - NLSF_tmp_Q15[ i ], W_tmp_Q9 ), 14 ); - W_adj_Q5[ i ] = silk_DIV32_varQ( (opus_int32)pW_Q2[ i ], silk_SMULBB( W_tmp_Q9, W_tmp_Q9 ), 21 ); + res_Q15[ i ] = pNLSF_Q15[ i ] - NLSF_tmp_Q15[ i ]; + } + + /* Weights from codebook vector */ + silk_NLSF_VQ_weights_laroia( W_tmp_QW, NLSF_tmp_Q15, psNLSF_CB->order ); + + /* Apply square-rooted weights */ + for( i = 0; i < psNLSF_CB->order; i++ ) { + W_tmp_Q9 = silk_SQRT_APPROX( silk_LSHIFT( (opus_int32)W_tmp_QW[ i ], 18 - NLSF_W_Q ) ); + res_Q10[ i ] = (opus_int16)silk_RSHIFT( silk_SMULBB( res_Q15[ i ], W_tmp_Q9 ), 14 ); + } + + /* Modify input weights accordingly */ + for( i = 0; i < psNLSF_CB->order; i++ ) { + W_adj_Q5[ i ] = silk_DIV32_16( silk_LSHIFT( (opus_int32)pW_QW[ i ], 5 ), W_tmp_QW[ i ] ); } /* Unpack entropy table indices and predictor for current CB1 index */ diff --git a/thirdparty/opus/silk/NSQ.c b/thirdparty/opus/silk/NSQ.c index 1d64d8e257..43e3fee7e0 100644 --- a/thirdparty/opus/silk/NSQ.c +++ b/thirdparty/opus/silk/NSQ.c @@ -37,7 +37,7 @@ POSSIBILITY OF SUCH DAMAGE. static OPUS_INLINE void silk_nsq_scale_states( const silk_encoder_state *psEncC, /* I Encoder State */ silk_nsq_state *NSQ, /* I/O NSQ state */ - const opus_int16 x16[], /* I input */ + const opus_int32 x_Q3[], /* I input in Q3 */ opus_int32 x_sc_Q10[], /* O input scaled with 1/Gain */ const opus_int16 sLTP[], /* I re-whitened LTP state in Q0 */ opus_int32 sLTP_Q15[], /* O LTP state matching scaled input */ @@ -75,14 +75,14 @@ static OPUS_INLINE void silk_noise_shape_quantizer( void silk_NSQ_c ( - const silk_encoder_state *psEncC, /* I Encoder State */ + const silk_encoder_state *psEncC, /* I/O Encoder State */ silk_nsq_state *NSQ, /* I/O NSQ state */ SideInfoIndices *psIndices, /* I/O Quantization Indices */ - const opus_int16 x16[], /* I Input */ + const opus_int32 x_Q3[], /* I Prefiltered input signal */ opus_int8 pulses[], /* O Quantized pulse signal */ const opus_int16 PredCoef_Q12[ 2 * MAX_LPC_ORDER ], /* I Short term prediction coefs */ const opus_int16 LTPCoef_Q14[ LTP_ORDER * MAX_NB_SUBFR ], /* I Long term prediction coefs */ - const opus_int16 AR_Q13[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ], /* I Noise shaping coefs */ + const opus_int16 AR2_Q13[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ], /* I Noise shaping coefs */ const opus_int HarmShapeGain_Q14[ MAX_NB_SUBFR ], /* I Long term shaping coefs */ const opus_int Tilt_Q14[ MAX_NB_SUBFR ], /* I Spectral tilt */ const opus_int32 LF_shp_Q14[ MAX_NB_SUBFR ], /* I Low frequency shaping coefs */ @@ -117,7 +117,8 @@ void silk_NSQ_c LSF_interpolation_flag = 1; } - ALLOC( sLTP_Q15, psEncC->ltp_mem_length + psEncC->frame_length, opus_int32 ); + ALLOC( sLTP_Q15, + psEncC->ltp_mem_length + psEncC->frame_length, opus_int32 ); ALLOC( sLTP, psEncC->ltp_mem_length + psEncC->frame_length, opus_int16 ); ALLOC( x_sc_Q10, psEncC->subfr_length, opus_int32 ); /* Set up pointers to start of sub frame */ @@ -127,7 +128,7 @@ void silk_NSQ_c for( k = 0; k < psEncC->nb_subfr; k++ ) { A_Q12 = &PredCoef_Q12[ (( k >> 1 ) | ( 1 - LSF_interpolation_flag )) * MAX_LPC_ORDER ]; B_Q14 = <PCoef_Q14[ k * LTP_ORDER ]; - AR_shp_Q13 = &AR_Q13[ k * MAX_SHAPE_LPC_ORDER ]; + AR_shp_Q13 = &AR2_Q13[ k * MAX_SHAPE_LPC_ORDER ]; /* Noise shape parameters */ silk_assert( HarmShapeGain_Q14[ k ] >= 0 ); @@ -143,7 +144,7 @@ void silk_NSQ_c if( ( k & ( 3 - silk_LSHIFT( LSF_interpolation_flag, 1 ) ) ) == 0 ) { /* Rewhiten with new A coefs */ start_idx = psEncC->ltp_mem_length - lag - psEncC->predictLPCOrder - LTP_ORDER / 2; - celt_assert( start_idx > 0 ); + silk_assert( start_idx > 0 ); silk_LPC_analysis_filter( &sLTP[ start_idx ], &NSQ->xq[ start_idx + k * psEncC->subfr_length ], A_Q12, psEncC->ltp_mem_length - start_idx, psEncC->predictLPCOrder, psEncC->arch ); @@ -153,13 +154,13 @@ void silk_NSQ_c } } - silk_nsq_scale_states( psEncC, NSQ, x16, x_sc_Q10, sLTP, sLTP_Q15, k, LTP_scale_Q14, Gains_Q16, pitchL, psIndices->signalType ); + silk_nsq_scale_states( psEncC, NSQ, x_Q3, x_sc_Q10, sLTP, sLTP_Q15, k, LTP_scale_Q14, Gains_Q16, pitchL, psIndices->signalType ); silk_noise_shape_quantizer( NSQ, psIndices->signalType, x_sc_Q10, pulses, pxq, sLTP_Q15, A_Q12, B_Q14, AR_shp_Q13, lag, HarmShapeFIRPacked_Q14, Tilt_Q14[ k ], LF_shp_Q14[ k ], Gains_Q16[ k ], Lambda_Q10, offset_Q10, psEncC->subfr_length, psEncC->shapingLPCOrder, psEncC->predictLPCOrder, psEncC->arch ); - x16 += psEncC->subfr_length; + x_Q3 += psEncC->subfr_length; pulses += psEncC->subfr_length; pxq += psEncC->subfr_length; } @@ -168,6 +169,7 @@ void silk_NSQ_c NSQ->lagPrev = pitchL[ psEncC->nb_subfr - 1 ]; /* Save quantized speech and noise shaping signals */ + /* DEBUG_STORE_DATA( enc.pcm, &NSQ->xq[ psEncC->ltp_mem_length ], psEncC->frame_length * sizeof( opus_int16 ) ) */ silk_memmove( NSQ->xq, &NSQ->xq[ psEncC->frame_length ], psEncC->ltp_mem_length * sizeof( opus_int16 ) ); silk_memmove( NSQ->sLTP_shp_Q14, &NSQ->sLTP_shp_Q14[ psEncC->frame_length ], psEncC->ltp_mem_length * sizeof( opus_int32 ) ); RESTORE_STACK; @@ -247,15 +249,15 @@ void silk_noise_shape_quantizer( } /* Noise shape feedback */ - celt_assert( ( shapingLPCOrder & 1 ) == 0 ); /* check that order is even */ - n_AR_Q12 = silk_NSQ_noise_shape_feedback_loop(&NSQ->sDiff_shp_Q14, NSQ->sAR2_Q14, AR_shp_Q13, shapingLPCOrder, arch); + silk_assert( ( shapingLPCOrder & 1 ) == 0 ); /* check that order is even */ + n_AR_Q12 = silk_NSQ_noise_shape_feedback_loop(psLPC_Q14, NSQ->sAR2_Q14, AR_shp_Q13, shapingLPCOrder, arch); n_AR_Q12 = silk_SMLAWB( n_AR_Q12, NSQ->sLF_AR_shp_Q14, Tilt_Q14 ); n_LF_Q12 = silk_SMULWB( NSQ->sLTP_shp_Q14[ NSQ->sLTP_shp_buf_idx - 1 ], LF_shp_Q14 ); n_LF_Q12 = silk_SMLAWT( n_LF_Q12, NSQ->sLF_AR_shp_Q14, LF_shp_Q14 ); - celt_assert( lag > 0 || signalType != TYPE_VOICED ); + silk_assert( lag > 0 || signalType != TYPE_VOICED ); /* Combine prediction and noise shaping signals */ tmp1 = silk_SUB32( silk_LSHIFT32( LPC_pred_Q10, 2 ), n_AR_Q12 ); /* Q12 */ @@ -277,27 +279,14 @@ void silk_noise_shape_quantizer( r_Q10 = silk_SUB32( x_sc_Q10[ i ], tmp1 ); /* residual error Q10 */ /* Flip sign depending on dither */ - if( NSQ->rand_seed < 0 ) { - r_Q10 = -r_Q10; + if ( NSQ->rand_seed < 0 ) { + r_Q10 = -r_Q10; } r_Q10 = silk_LIMIT_32( r_Q10, -(31 << 10), 30 << 10 ); /* Find two quantization level candidates and measure their rate-distortion */ q1_Q10 = silk_SUB32( r_Q10, offset_Q10 ); q1_Q0 = silk_RSHIFT( q1_Q10, 10 ); - if (Lambda_Q10 > 2048) { - /* For aggressive RDO, the bias becomes more than one pulse. */ - int rdo_offset = Lambda_Q10/2 - 512; - if (q1_Q10 > rdo_offset) { - q1_Q0 = silk_RSHIFT( q1_Q10 - rdo_offset, 10 ); - } else if (q1_Q10 < -rdo_offset) { - q1_Q0 = silk_RSHIFT( q1_Q10 + rdo_offset, 10 ); - } else if (q1_Q10 < 0) { - q1_Q0 = -1; - } else { - q1_Q0 = 0; - } - } if( q1_Q0 > 0 ) { q1_Q10 = silk_SUB32( silk_LSHIFT( q1_Q0, 10 ), QUANT_LEVEL_ADJUST_Q10 ); q1_Q10 = silk_ADD32( q1_Q10, offset_Q10 ); @@ -348,8 +337,7 @@ void silk_noise_shape_quantizer( /* Update states */ psLPC_Q14++; *psLPC_Q14 = xq_Q14; - NSQ->sDiff_shp_Q14 = silk_SUB_LSHIFT32( xq_Q14, x_sc_Q10[ i ], 4 ); - sLF_AR_shp_Q14 = silk_SUB_LSHIFT32( NSQ->sDiff_shp_Q14, n_AR_Q12, 2 ); + sLF_AR_shp_Q14 = silk_SUB_LSHIFT32( xq_Q14, n_AR_Q12, 2 ); NSQ->sLF_AR_shp_Q14 = sLF_AR_shp_Q14; NSQ->sLTP_shp_Q14[ NSQ->sLTP_shp_buf_idx ] = silk_SUB_LSHIFT32( sLF_AR_shp_Q14, n_LF_Q12, 2 ); @@ -368,7 +356,7 @@ void silk_noise_shape_quantizer( static OPUS_INLINE void silk_nsq_scale_states( const silk_encoder_state *psEncC, /* I Encoder State */ silk_nsq_state *NSQ, /* I/O NSQ state */ - const opus_int16 x16[], /* I input */ + const opus_int32 x_Q3[], /* I input in Q3 */ opus_int32 x_sc_Q10[], /* O input scaled with 1/Gain */ const opus_int16 sLTP[], /* I re-whitened LTP state in Q0 */ opus_int32 sLTP_Q15[], /* O LTP state matching scaled input */ @@ -380,18 +368,28 @@ static OPUS_INLINE void silk_nsq_scale_states( ) { opus_int i, lag; - opus_int32 gain_adj_Q16, inv_gain_Q31, inv_gain_Q26; + opus_int32 gain_adj_Q16, inv_gain_Q31, inv_gain_Q23; lag = pitchL[ subfr ]; inv_gain_Q31 = silk_INVERSE32_varQ( silk_max( Gains_Q16[ subfr ], 1 ), 47 ); silk_assert( inv_gain_Q31 != 0 ); + /* Calculate gain adjustment factor */ + if( Gains_Q16[ subfr ] != NSQ->prev_gain_Q16 ) { + gain_adj_Q16 = silk_DIV32_varQ( NSQ->prev_gain_Q16, Gains_Q16[ subfr ], 16 ); + } else { + gain_adj_Q16 = (opus_int32)1 << 16; + } + /* Scale input */ - inv_gain_Q26 = silk_RSHIFT_ROUND( inv_gain_Q31, 5 ); + inv_gain_Q23 = silk_RSHIFT_ROUND( inv_gain_Q31, 8 ); for( i = 0; i < psEncC->subfr_length; i++ ) { - x_sc_Q10[ i ] = silk_SMULWW( x16[ i ], inv_gain_Q26 ); + x_sc_Q10[ i ] = silk_SMULWW( x_Q3[ i ], inv_gain_Q23 ); } + /* Save inverse gain */ + NSQ->prev_gain_Q16 = Gains_Q16[ subfr ]; + /* After rewhitening the LTP state is un-scaled, so scale with inv_gain_Q16 */ if( NSQ->rewhite_flag ) { if( subfr == 0 ) { @@ -405,9 +403,7 @@ static OPUS_INLINE void silk_nsq_scale_states( } /* Adjust for changing gain */ - if( Gains_Q16[ subfr ] != NSQ->prev_gain_Q16 ) { - gain_adj_Q16 = silk_DIV32_varQ( NSQ->prev_gain_Q16, Gains_Q16[ subfr ], 16 ); - + if( gain_adj_Q16 != (opus_int32)1 << 16 ) { /* Scale long-term shaping state */ for( i = NSQ->sLTP_shp_buf_idx - psEncC->ltp_mem_length; i < NSQ->sLTP_shp_buf_idx; i++ ) { NSQ->sLTP_shp_Q14[ i ] = silk_SMULWW( gain_adj_Q16, NSQ->sLTP_shp_Q14[ i ] ); @@ -421,7 +417,6 @@ static OPUS_INLINE void silk_nsq_scale_states( } NSQ->sLF_AR_shp_Q14 = silk_SMULWW( gain_adj_Q16, NSQ->sLF_AR_shp_Q14 ); - NSQ->sDiff_shp_Q14 = silk_SMULWW( gain_adj_Q16, NSQ->sDiff_shp_Q14 ); /* Scale short-term prediction and shaping states */ for( i = 0; i < NSQ_LPC_BUF_LENGTH; i++ ) { @@ -430,8 +425,5 @@ static OPUS_INLINE void silk_nsq_scale_states( for( i = 0; i < MAX_SHAPE_LPC_ORDER; i++ ) { NSQ->sAR2_Q14[ i ] = silk_SMULWW( gain_adj_Q16, NSQ->sAR2_Q14[ i ] ); } - - /* Save inverse gain */ - NSQ->prev_gain_Q16 = Gains_Q16[ subfr ]; } } diff --git a/thirdparty/opus/silk/NSQ_del_dec.c b/thirdparty/opus/silk/NSQ_del_dec.c index 3fd9fa0d5b..ab6feeac98 100644 --- a/thirdparty/opus/silk/NSQ_del_dec.c +++ b/thirdparty/opus/silk/NSQ_del_dec.c @@ -43,7 +43,6 @@ typedef struct { opus_int32 Shape_Q14[ DECISION_DELAY ]; opus_int32 sAR2_Q14[ MAX_SHAPE_LPC_ORDER ]; opus_int32 LF_AR_Q14; - opus_int32 Diff_Q14; opus_int32 Seed; opus_int32 SeedInit; opus_int32 RD_Q10; @@ -54,7 +53,6 @@ typedef struct { opus_int32 RD_Q10; opus_int32 xq_Q14; opus_int32 LF_AR_Q14; - opus_int32 Diff_Q14; opus_int32 sLTP_shp_Q14; opus_int32 LPC_exc_Q14; } NSQ_sample_struct; @@ -68,7 +66,7 @@ static OPUS_INLINE void silk_nsq_del_dec_scale_states( const silk_encoder_state *psEncC, /* I Encoder State */ silk_nsq_state *NSQ, /* I/O NSQ state */ NSQ_del_dec_struct psDelDec[], /* I/O Delayed decision states */ - const opus_int16 x16[], /* I Input */ + const opus_int32 x_Q3[], /* I Input in Q3 */ opus_int32 x_sc_Q10[], /* O Input scaled with 1/Gain in Q10 */ const opus_int16 sLTP[], /* I Re-whitened LTP state in Q0 */ opus_int32 sLTP_Q15[], /* O LTP state matching scaled input */ @@ -109,20 +107,20 @@ static OPUS_INLINE void silk_noise_shape_quantizer_del_dec( opus_int predictLPCOrder, /* I Prediction filter order */ opus_int warping_Q16, /* I */ opus_int nStatesDelayedDecision, /* I Number of states in decision tree */ - opus_int *smpl_buf_idx, /* I/O Index to newest samples in buffers */ + opus_int *smpl_buf_idx, /* I Index to newest samples in buffers */ opus_int decisionDelay, /* I */ int arch /* I */ ); void silk_NSQ_del_dec_c( - const silk_encoder_state *psEncC, /* I Encoder State */ + const silk_encoder_state *psEncC, /* I/O Encoder State */ silk_nsq_state *NSQ, /* I/O NSQ state */ SideInfoIndices *psIndices, /* I/O Quantization Indices */ - const opus_int16 x16[], /* I Input */ + const opus_int32 x_Q3[], /* I Prefiltered input signal */ opus_int8 pulses[], /* O Quantized pulse signal */ const opus_int16 PredCoef_Q12[ 2 * MAX_LPC_ORDER ], /* I Short term prediction coefs */ const opus_int16 LTPCoef_Q14[ LTP_ORDER * MAX_NB_SUBFR ], /* I Long term prediction coefs */ - const opus_int16 AR_Q13[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ], /* I Noise shaping coefs */ + const opus_int16 AR2_Q13[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ], /* I Noise shaping coefs */ const opus_int HarmShapeGain_Q14[ MAX_NB_SUBFR ], /* I Long term shaping coefs */ const opus_int Tilt_Q14[ MAX_NB_SUBFR ], /* I Spectral tilt */ const opus_int32 LF_shp_Q14[ MAX_NB_SUBFR ], /* I Low frequency shaping coefs */ @@ -161,7 +159,6 @@ void silk_NSQ_del_dec_c( psDD->SeedInit = psDD->Seed; psDD->RD_Q10 = 0; psDD->LF_AR_Q14 = NSQ->sLF_AR_shp_Q14; - psDD->Diff_Q14 = NSQ->sDiff_shp_Q14; psDD->Shape_Q14[ 0 ] = NSQ->sLTP_shp_Q14[ psEncC->ltp_mem_length - 1 ]; silk_memcpy( psDD->sLPC_Q14, NSQ->sLPC_Q14, NSQ_LPC_BUF_LENGTH * sizeof( opus_int32 ) ); silk_memcpy( psDD->sAR2_Q14, NSQ->sAR2_Q14, sizeof( NSQ->sAR2_Q14 ) ); @@ -189,7 +186,8 @@ void silk_NSQ_del_dec_c( LSF_interpolation_flag = 1; } - ALLOC( sLTP_Q15, psEncC->ltp_mem_length + psEncC->frame_length, opus_int32 ); + ALLOC( sLTP_Q15, + psEncC->ltp_mem_length + psEncC->frame_length, opus_int32 ); ALLOC( sLTP, psEncC->ltp_mem_length + psEncC->frame_length, opus_int16 ); ALLOC( x_sc_Q10, psEncC->subfr_length, opus_int32 ); ALLOC( delayedGain_Q10, DECISION_DELAY, opus_int32 ); @@ -201,7 +199,7 @@ void silk_NSQ_del_dec_c( for( k = 0; k < psEncC->nb_subfr; k++ ) { A_Q12 = &PredCoef_Q12[ ( ( k >> 1 ) | ( 1 - LSF_interpolation_flag ) ) * MAX_LPC_ORDER ]; B_Q14 = <PCoef_Q14[ k * LTP_ORDER ]; - AR_shp_Q13 = &AR_Q13[ k * MAX_SHAPE_LPC_ORDER ]; + AR_shp_Q13 = &AR2_Q13[ k * MAX_SHAPE_LPC_ORDER ]; /* Noise shape parameters */ silk_assert( HarmShapeGain_Q14[ k ] >= 0 ); @@ -237,8 +235,7 @@ void silk_NSQ_del_dec_c( psDD = &psDelDec[ Winner_ind ]; last_smple_idx = smpl_buf_idx + decisionDelay; for( i = 0; i < decisionDelay; i++ ) { - last_smple_idx = ( last_smple_idx - 1 ) % DECISION_DELAY; - if( last_smple_idx < 0 ) last_smple_idx += DECISION_DELAY; + last_smple_idx = ( last_smple_idx - 1 ) & DECISION_DELAY_MASK; pulses[ i - decisionDelay ] = (opus_int8)silk_RSHIFT_ROUND( psDD->Q_Q10[ last_smple_idx ], 10 ); pxq[ i - decisionDelay ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( silk_SMULWW( psDD->Xq_Q14[ last_smple_idx ], Gains_Q16[ 1 ] ), 14 ) ); @@ -250,7 +247,7 @@ void silk_NSQ_del_dec_c( /* Rewhiten with new A coefs */ start_idx = psEncC->ltp_mem_length - lag - psEncC->predictLPCOrder - LTP_ORDER / 2; - celt_assert( start_idx > 0 ); + silk_assert( start_idx > 0 ); silk_LPC_analysis_filter( &sLTP[ start_idx ], &NSQ->xq[ start_idx + k * psEncC->subfr_length ], A_Q12, psEncC->ltp_mem_length - start_idx, psEncC->predictLPCOrder, psEncC->arch ); @@ -260,7 +257,7 @@ void silk_NSQ_del_dec_c( } } - silk_nsq_del_dec_scale_states( psEncC, NSQ, psDelDec, x16, x_sc_Q10, sLTP, sLTP_Q15, k, + silk_nsq_del_dec_scale_states( psEncC, NSQ, psDelDec, x_Q3, x_sc_Q10, sLTP, sLTP_Q15, k, psEncC->nStatesDelayedDecision, LTP_scale_Q14, Gains_Q16, pitchL, psIndices->signalType, decisionDelay ); silk_noise_shape_quantizer_del_dec( NSQ, psDelDec, psIndices->signalType, x_sc_Q10, pulses, pxq, sLTP_Q15, @@ -268,7 +265,7 @@ void silk_NSQ_del_dec_c( Gains_Q16[ k ], Lambda_Q10, offset_Q10, psEncC->subfr_length, subfr++, psEncC->shapingLPCOrder, psEncC->predictLPCOrder, psEncC->warping_Q16, psEncC->nStatesDelayedDecision, &smpl_buf_idx, decisionDelay, psEncC->arch ); - x16 += psEncC->subfr_length; + x_Q3 += psEncC->subfr_length; pulses += psEncC->subfr_length; pxq += psEncC->subfr_length; } @@ -289,9 +286,7 @@ void silk_NSQ_del_dec_c( last_smple_idx = smpl_buf_idx + decisionDelay; Gain_Q10 = silk_RSHIFT32( Gains_Q16[ psEncC->nb_subfr - 1 ], 6 ); for( i = 0; i < decisionDelay; i++ ) { - last_smple_idx = ( last_smple_idx - 1 ) % DECISION_DELAY; - if( last_smple_idx < 0 ) last_smple_idx += DECISION_DELAY; - + last_smple_idx = ( last_smple_idx - 1 ) & DECISION_DELAY_MASK; pulses[ i - decisionDelay ] = (opus_int8)silk_RSHIFT_ROUND( psDD->Q_Q10[ last_smple_idx ], 10 ); pxq[ i - decisionDelay ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( silk_SMULWW( psDD->Xq_Q14[ last_smple_idx ], Gain_Q10 ), 8 ) ); @@ -302,10 +297,10 @@ void silk_NSQ_del_dec_c( /* Update states */ NSQ->sLF_AR_shp_Q14 = psDD->LF_AR_Q14; - NSQ->sDiff_shp_Q14 = psDD->Diff_Q14; NSQ->lagPrev = pitchL[ psEncC->nb_subfr - 1 ]; /* Save quantized speech signal */ + /* DEBUG_STORE_DATA( enc.pcm, &NSQ->xq[psEncC->ltp_mem_length], psEncC->frame_length * sizeof( opus_int16 ) ) */ silk_memmove( NSQ->xq, &NSQ->xq[ psEncC->frame_length ], psEncC->ltp_mem_length * sizeof( opus_int16 ) ); silk_memmove( NSQ->sLTP_shp_Q14, &NSQ->sLTP_shp_Q14[ psEncC->frame_length ], psEncC->ltp_mem_length * sizeof( opus_int32 ) ); RESTORE_STACK; @@ -340,7 +335,7 @@ static OPUS_INLINE void silk_noise_shape_quantizer_del_dec( opus_int predictLPCOrder, /* I Prediction filter order */ opus_int warping_Q16, /* I */ opus_int nStatesDelayedDecision, /* I Number of states in decision tree */ - opus_int *smpl_buf_idx, /* I/O Index to newest samples in buffers */ + opus_int *smpl_buf_idx, /* I Index to newest samples in buffers */ opus_int decisionDelay, /* I */ int arch /* I */ ) @@ -361,7 +356,7 @@ static OPUS_INLINE void silk_noise_shape_quantizer_del_dec( NSQ_sample_struct *psSS; SAVE_STACK; - celt_assert( nStatesDelayedDecision > 0 ); + silk_assert( nStatesDelayedDecision > 0 ); ALLOC( psSampleState, nStatesDelayedDecision, NSQ_sample_pair ); shp_lag_ptr = &NSQ->sLTP_shp_Q14[ NSQ->sLTP_shp_buf_idx - lag + HARM_SHAPE_FIR_TAPS / 2 ]; @@ -419,9 +414,9 @@ static OPUS_INLINE void silk_noise_shape_quantizer_del_dec( LPC_pred_Q14 = silk_LSHIFT( LPC_pred_Q14, 4 ); /* Q10 -> Q14 */ /* Noise shape feedback */ - celt_assert( ( shapingLPCOrder & 1 ) == 0 ); /* check that order is even */ + silk_assert( ( shapingLPCOrder & 1 ) == 0 ); /* check that order is even */ /* Output of lowpass section */ - tmp2 = silk_SMLAWB( psDD->Diff_Q14, psDD->sAR2_Q14[ 0 ], warping_Q16 ); + tmp2 = silk_SMLAWB( psLPC_Q14[ 0 ], psDD->sAR2_Q14[ 0 ], warping_Q16 ); /* Output of allpass section */ tmp1 = silk_SMLAWB( psDD->sAR2_Q14[ 0 ], psDD->sAR2_Q14[ 1 ] - tmp2, warping_Q16 ); psDD->sAR2_Q14[ 0 ] = tmp2; @@ -467,19 +462,6 @@ static OPUS_INLINE void silk_noise_shape_quantizer_del_dec( /* Find two quantization level candidates and measure their rate-distortion */ q1_Q10 = silk_SUB32( r_Q10, offset_Q10 ); q1_Q0 = silk_RSHIFT( q1_Q10, 10 ); - if (Lambda_Q10 > 2048) { - /* For aggressive RDO, the bias becomes more than one pulse. */ - int rdo_offset = Lambda_Q10/2 - 512; - if (q1_Q10 > rdo_offset) { - q1_Q0 = silk_RSHIFT( q1_Q10 - rdo_offset, 10 ); - } else if (q1_Q10 < -rdo_offset) { - q1_Q0 = silk_RSHIFT( q1_Q10 + rdo_offset, 10 ); - } else if (q1_Q10 < 0) { - q1_Q0 = -1; - } else { - q1_Q0 = 0; - } - } if( q1_Q0 > 0 ) { q1_Q10 = silk_SUB32( silk_LSHIFT( q1_Q0, 10 ), QUANT_LEVEL_ADJUST_Q10 ); q1_Q10 = silk_ADD32( q1_Q10, offset_Q10 ); @@ -533,8 +515,7 @@ static OPUS_INLINE void silk_noise_shape_quantizer_del_dec( xq_Q14 = silk_ADD32( LPC_exc_Q14, LPC_pred_Q14 ); /* Update states */ - psSS[ 0 ].Diff_Q14 = silk_SUB_LSHIFT32( xq_Q14, x_Q10[ i ], 4 ); - sLF_AR_shp_Q14 = silk_SUB32( psSS[ 0 ].Diff_Q14, n_AR_Q14 ); + sLF_AR_shp_Q14 = silk_SUB32( xq_Q14, n_AR_Q14 ); psSS[ 0 ].sLTP_shp_Q14 = silk_SUB32( sLF_AR_shp_Q14, n_LF_Q14 ); psSS[ 0 ].LF_AR_Q14 = sLF_AR_shp_Q14; psSS[ 0 ].LPC_exc_Q14 = LPC_exc_Q14; @@ -548,22 +529,21 @@ static OPUS_INLINE void silk_noise_shape_quantizer_del_dec( exc_Q14 = -exc_Q14; } + /* Add predictions */ LPC_exc_Q14 = silk_ADD32( exc_Q14, LTP_pred_Q14 ); xq_Q14 = silk_ADD32( LPC_exc_Q14, LPC_pred_Q14 ); /* Update states */ - psSS[ 1 ].Diff_Q14 = silk_SUB_LSHIFT32( xq_Q14, x_Q10[ i ], 4 ); - sLF_AR_shp_Q14 = silk_SUB32( psSS[ 1 ].Diff_Q14, n_AR_Q14 ); + sLF_AR_shp_Q14 = silk_SUB32( xq_Q14, n_AR_Q14 ); psSS[ 1 ].sLTP_shp_Q14 = silk_SUB32( sLF_AR_shp_Q14, n_LF_Q14 ); psSS[ 1 ].LF_AR_Q14 = sLF_AR_shp_Q14; psSS[ 1 ].LPC_exc_Q14 = LPC_exc_Q14; psSS[ 1 ].xq_Q14 = xq_Q14; } - *smpl_buf_idx = ( *smpl_buf_idx - 1 ) % DECISION_DELAY; - if( *smpl_buf_idx < 0 ) *smpl_buf_idx += DECISION_DELAY; - last_smple_idx = ( *smpl_buf_idx + decisionDelay ) % DECISION_DELAY; + *smpl_buf_idx = ( *smpl_buf_idx - 1 ) & DECISION_DELAY_MASK; /* Index to newest samples */ + last_smple_idx = ( *smpl_buf_idx + decisionDelay ) & DECISION_DELAY_MASK; /* Index to decisionDelay old samples */ /* Find winner */ RDmin_Q10 = psSampleState[ 0 ][ 0 ].RD_Q10; @@ -627,7 +607,6 @@ static OPUS_INLINE void silk_noise_shape_quantizer_del_dec( psDD = &psDelDec[ k ]; psSS = &psSampleState[ k ][ 0 ]; psDD->LF_AR_Q14 = psSS->LF_AR_Q14; - psDD->Diff_Q14 = psSS->Diff_Q14; psDD->sLPC_Q14[ NSQ_LPC_BUF_LENGTH + i ] = psSS->xq_Q14; psDD->Xq_Q14[ *smpl_buf_idx ] = psSS->xq_Q14; psDD->Q_Q10[ *smpl_buf_idx ] = psSS->Q_Q10; @@ -652,7 +631,7 @@ static OPUS_INLINE void silk_nsq_del_dec_scale_states( const silk_encoder_state *psEncC, /* I Encoder State */ silk_nsq_state *NSQ, /* I/O NSQ state */ NSQ_del_dec_struct psDelDec[], /* I/O Delayed decision states */ - const opus_int16 x16[], /* I Input */ + const opus_int32 x_Q3[], /* I Input in Q3 */ opus_int32 x_sc_Q10[], /* O Input scaled with 1/Gain in Q10 */ const opus_int16 sLTP[], /* I Re-whitened LTP state in Q0 */ opus_int32 sLTP_Q15[], /* O LTP state matching scaled input */ @@ -666,19 +645,29 @@ static OPUS_INLINE void silk_nsq_del_dec_scale_states( ) { opus_int i, k, lag; - opus_int32 gain_adj_Q16, inv_gain_Q31, inv_gain_Q26; + opus_int32 gain_adj_Q16, inv_gain_Q31, inv_gain_Q23; NSQ_del_dec_struct *psDD; lag = pitchL[ subfr ]; inv_gain_Q31 = silk_INVERSE32_varQ( silk_max( Gains_Q16[ subfr ], 1 ), 47 ); silk_assert( inv_gain_Q31 != 0 ); + /* Calculate gain adjustment factor */ + if( Gains_Q16[ subfr ] != NSQ->prev_gain_Q16 ) { + gain_adj_Q16 = silk_DIV32_varQ( NSQ->prev_gain_Q16, Gains_Q16[ subfr ], 16 ); + } else { + gain_adj_Q16 = (opus_int32)1 << 16; + } + /* Scale input */ - inv_gain_Q26 = silk_RSHIFT_ROUND( inv_gain_Q31, 5 ); + inv_gain_Q23 = silk_RSHIFT_ROUND( inv_gain_Q31, 8 ); for( i = 0; i < psEncC->subfr_length; i++ ) { - x_sc_Q10[ i ] = silk_SMULWW( x16[ i ], inv_gain_Q26 ); + x_sc_Q10[ i ] = silk_SMULWW( x_Q3[ i ], inv_gain_Q23 ); } + /* Save inverse gain */ + NSQ->prev_gain_Q16 = Gains_Q16[ subfr ]; + /* After rewhitening the LTP state is un-scaled, so scale with inv_gain_Q16 */ if( NSQ->rewhite_flag ) { if( subfr == 0 ) { @@ -692,9 +681,7 @@ static OPUS_INLINE void silk_nsq_del_dec_scale_states( } /* Adjust for changing gain */ - if( Gains_Q16[ subfr ] != NSQ->prev_gain_Q16 ) { - gain_adj_Q16 = silk_DIV32_varQ( NSQ->prev_gain_Q16, Gains_Q16[ subfr ], 16 ); - + if( gain_adj_Q16 != (opus_int32)1 << 16 ) { /* Scale long-term shaping state */ for( i = NSQ->sLTP_shp_buf_idx - psEncC->ltp_mem_length; i < NSQ->sLTP_shp_buf_idx; i++ ) { NSQ->sLTP_shp_Q14[ i ] = silk_SMULWW( gain_adj_Q16, NSQ->sLTP_shp_Q14[ i ] ); @@ -712,7 +699,6 @@ static OPUS_INLINE void silk_nsq_del_dec_scale_states( /* Scale scalar states */ psDD->LF_AR_Q14 = silk_SMULWW( gain_adj_Q16, psDD->LF_AR_Q14 ); - psDD->Diff_Q14 = silk_SMULWW( gain_adj_Q16, psDD->Diff_Q14 ); /* Scale short-term prediction and shaping states */ for( i = 0; i < NSQ_LPC_BUF_LENGTH; i++ ) { @@ -726,8 +712,5 @@ static OPUS_INLINE void silk_nsq_del_dec_scale_states( psDD->Shape_Q14[ i ] = silk_SMULWW( gain_adj_Q16, psDD->Shape_Q14[ i ] ); } } - - /* Save inverse gain */ - NSQ->prev_gain_Q16 = Gains_Q16[ subfr ]; } } diff --git a/thirdparty/opus/silk/PLC.c b/thirdparty/opus/silk/PLC.c index f89391651c..fb6ea887b7 100644 --- a/thirdparty/opus/silk/PLC.c +++ b/thirdparty/opus/silk/PLC.c @@ -275,7 +275,7 @@ static OPUS_INLINE void silk_PLC_conceal( /* Reduce random noise for unvoiced frames with high LPC gain */ opus_int32 invGain_Q30, down_scale_Q30; - invGain_Q30 = silk_LPC_inverse_pred_gain( psPLC->prevLPC_Q12, psDec->LPC_order, arch ); + invGain_Q30 = silk_LPC_inverse_pred_gain( psPLC->prevLPC_Q12, psDec->LPC_order ); down_scale_Q30 = silk_min_32( silk_RSHIFT( (opus_int32)1 << 30, LOG2_INV_LPC_GAIN_HIGH_THRES ), invGain_Q30 ); down_scale_Q30 = silk_max_32( silk_RSHIFT( (opus_int32)1 << 30, LOG2_INV_LPC_GAIN_LOW_THRES ), down_scale_Q30 ); @@ -291,7 +291,7 @@ static OPUS_INLINE void silk_PLC_conceal( /* Rewhiten LTP state */ idx = psDec->ltp_mem_length - lag - psDec->LPC_order - LTP_ORDER / 2; - celt_assert( idx > 0 ); + silk_assert( idx > 0 ); silk_LPC_analysis_filter( &sLTP[ idx ], &psDec->outBuf[ idx ], A_Q12, psDec->ltp_mem_length - idx, psDec->LPC_order, arch ); /* Scale LTP state */ inv_gain_Q30 = silk_INVERSE32_varQ( psPLC->prevGain_Q16[ 1 ], 46 ); @@ -328,10 +328,8 @@ static OPUS_INLINE void silk_PLC_conceal( for( j = 0; j < LTP_ORDER; j++ ) { B_Q14[ j ] = silk_RSHIFT( silk_SMULBB( harm_Gain_Q15, B_Q14[ j ] ), 15 ); } - if ( psDec->indices.signalType != TYPE_NO_VOICE_ACTIVITY ) { - /* Gradually reduce excitation gain */ - rand_scale_Q14 = silk_RSHIFT( silk_SMULBB( rand_scale_Q14, rand_Gain_Q15 ), 15 ); - } + /* Gradually reduce excitation gain */ + rand_scale_Q14 = silk_RSHIFT( silk_SMULBB( rand_scale_Q14, rand_Gain_Q15 ), 15 ); /* Slowly increase pitch lag */ psPLC->pitchL_Q8 = silk_SMLAWB( psPLC->pitchL_Q8, psPLC->pitchL_Q8, PITCH_DRIFT_FAC_Q16 ); @@ -347,7 +345,7 @@ static OPUS_INLINE void silk_PLC_conceal( /* Copy LPC state */ silk_memcpy( sLPC_Q14_ptr, psDec->sLPC_Q14_buf, MAX_LPC_ORDER * sizeof( opus_int32 ) ); - celt_assert( psDec->LPC_order >= 10 ); /* check that unrolling works */ + silk_assert( psDec->LPC_order >= 10 ); /* check that unrolling works */ for( i = 0; i < psDec->frame_length; i++ ) { /* partly unrolled */ /* Avoids introducing a bias because silk_SMLAWB() always rounds to -inf */ diff --git a/thirdparty/opus/silk/SigProc_FIX.h b/thirdparty/opus/silk/SigProc_FIX.h index f9ae326326..b63299441e 100644 --- a/thirdparty/opus/silk/SigProc_FIX.h +++ b/thirdparty/opus/silk/SigProc_FIX.h @@ -35,7 +35,7 @@ extern "C" /*#define silk_MACRO_COUNT */ /* Used to enable WMOPS counting */ -#define SILK_MAX_ORDER_LPC 24 /* max order of the LPC analysis in schur() and k2a() */ +#define SILK_MAX_ORDER_LPC 16 /* max order of the LPC analysis in schur() and k2a() */ #include <string.h> /* for memset(), memcpy(), memmove() */ #include "typedef.h" @@ -47,11 +47,6 @@ extern "C" #include "x86/SigProc_FIX_sse.h" #endif -#if (defined(OPUS_ARM_ASM) || defined(OPUS_ARM_MAY_HAVE_NEON_INTR)) -#include "arm/biquad_alt_arm.h" -#include "arm/LPC_inv_pred_gain_arm.h" -#endif - /********************************************************************/ /* SIGNAL PROCESSING FUNCTIONS */ /********************************************************************/ @@ -101,22 +96,14 @@ void silk_resampler_down2_3( * slower than biquad() but uses more precise coefficients * can handle (slowly) varying coefficients */ -void silk_biquad_alt_stride1( +void silk_biquad_alt( const opus_int16 *in, /* I input signal */ const opus_int32 *B_Q28, /* I MA coefficients [3] */ const opus_int32 *A_Q28, /* I AR coefficients [2] */ opus_int32 *S, /* I/O State vector [2] */ opus_int16 *out, /* O output signal */ - const opus_int32 len /* I signal length (must be even) */ -); - -void silk_biquad_alt_stride2_c( - const opus_int16 *in, /* I input signal */ - const opus_int32 *B_Q28, /* I MA coefficients [3] */ - const opus_int32 *A_Q28, /* I AR coefficients [2] */ - opus_int32 *S, /* I/O State vector [4] */ - opus_int16 *out, /* O output signal */ - const opus_int32 len /* I signal length (must be even) */ + const opus_int32 len, /* I signal length (must be even) */ + opus_int stride /* I Operate on interleaved signal if > 1 */ ); /* Variable order MA prediction error filter. */ @@ -145,11 +132,17 @@ void silk_bwexpander_32( /* Compute inverse of LPC prediction gain, and */ /* test if LPC coefficients are stable (all poles within unit circle) */ -opus_int32 silk_LPC_inverse_pred_gain_c( /* O Returns inverse prediction gain in energy domain, Q30 */ +opus_int32 silk_LPC_inverse_pred_gain( /* O Returns inverse prediction gain in energy domain, Q30 */ const opus_int16 *A_Q12, /* I Prediction coefficients, Q12 [order] */ const opus_int order /* I Prediction order */ ); +/* For input in Q24 domain */ +opus_int32 silk_LPC_inverse_pred_gain_Q24( /* O Returns inverse prediction gain in energy domain, Q30 */ + const opus_int32 *A_Q24, /* I Prediction coefficients [order] */ + const opus_int order /* I Prediction order */ +); + /* Split signal in two decimated bands using first-order allpass filters */ void silk_ana_filt_bank_1( const opus_int16 *in, /* I Input signal [N] */ @@ -159,14 +152,6 @@ void silk_ana_filt_bank_1( const opus_int32 N /* I Number of input samples */ ); -#if !defined(OVERRIDE_silk_biquad_alt_stride2) -#define silk_biquad_alt_stride2(in, B_Q28, A_Q28, S, out, len, arch) ((void)(arch), silk_biquad_alt_stride2_c(in, B_Q28, A_Q28, S, out, len)) -#endif - -#if !defined(OVERRIDE_silk_LPC_inverse_pred_gain) -#define silk_LPC_inverse_pred_gain(A_Q12, order, arch) ((void)(arch), silk_LPC_inverse_pred_gain_c(A_Q12, order)) -#endif - /********************************************************************/ /* SCALAR FUNCTIONS */ /********************************************************************/ @@ -286,17 +271,7 @@ void silk_A2NLSF( void silk_NLSF2A( opus_int16 *a_Q12, /* O monic whitening filter coefficients in Q12, [ d ] */ const opus_int16 *NLSF, /* I normalized line spectral frequencies in Q15, [ d ] */ - const opus_int d, /* I filter order (should be even) */ - int arch /* I Run-time architecture */ -); - -/* Convert int32 coefficients to int16 coefs and make sure there's no wrap-around */ -void silk_LPC_fit( - opus_int16 *a_QOUT, /* O Output signal */ - opus_int32 *a_QIN, /* I/O Input signal */ - const opus_int QOUT, /* I Input Q domain */ - const opus_int QIN, /* I Input Q domain */ - const opus_int d /* I Filter order */ + const opus_int d /* I filter order (should be even) */ ); void silk_insertion_sort_increasing( @@ -496,7 +471,8 @@ static OPUS_INLINE opus_int32 silk_ROR32( opus_int32 a32, opus_int rot ) /* Add with saturation for positive input values */ #define silk_ADD_POS_SAT8(a, b) ((((a)+(b)) & 0x80) ? silk_int8_MAX : ((a)+(b))) #define silk_ADD_POS_SAT16(a, b) ((((a)+(b)) & 0x8000) ? silk_int16_MAX : ((a)+(b))) -#define silk_ADD_POS_SAT32(a, b) ((((opus_uint32)(a)+(opus_uint32)(b)) & 0x80000000) ? silk_int32_MAX : ((a)+(b))) +#define silk_ADD_POS_SAT32(a, b) ((((a)+(b)) & 0x80000000) ? silk_int32_MAX : ((a)+(b))) +#define silk_ADD_POS_SAT64(a, b) ((((a)+(b)) & 0x8000000000000000LL) ? silk_int64_MAX : ((a)+(b))) #define silk_LSHIFT8(a, shift) ((opus_int8)((opus_uint8)(a)<<(shift))) /* shift >= 0, shift < 8 */ #define silk_LSHIFT16(a, shift) ((opus_int16)((opus_uint16)(a)<<(shift))) /* shift >= 0, shift < 16 */ @@ -596,9 +572,7 @@ static OPUS_INLINE opus_int64 silk_max_64(opus_int64 a, opus_int64 b) /* Make sure to store the result as the seed for the next call (also in between */ /* frames), otherwise result won't be random at all. When only using some of the */ /* bits, take the most significant bits by right-shifting. */ -#define RAND_MULTIPLIER 196314165 -#define RAND_INCREMENT 907633515 -#define silk_RAND(seed) (silk_MLA_ovflw((RAND_INCREMENT), (seed), (RAND_MULTIPLIER))) +#define silk_RAND(seed) (silk_MLA_ovflw(907633515, (seed), 196314165)) /* Add some multiplication functions that can be easily mapped to ARM. */ diff --git a/thirdparty/opus/silk/VAD.c b/thirdparty/opus/silk/VAD.c index d0cda52162..0a782af2f1 100644 --- a/thirdparty/opus/silk/VAD.c +++ b/thirdparty/opus/silk/VAD.c @@ -101,9 +101,9 @@ opus_int silk_VAD_GetSA_Q8_c( /* O Return v /* Safety checks */ silk_assert( VAD_N_BANDS == 4 ); - celt_assert( MAX_FRAME_LENGTH >= psEncC->frame_length ); - celt_assert( psEncC->frame_length <= 512 ); - celt_assert( psEncC->frame_length == 8 * silk_RSHIFT( psEncC->frame_length, 3 ) ); + silk_assert( MAX_FRAME_LENGTH >= psEncC->frame_length ); + silk_assert( psEncC->frame_length <= 512 ); + silk_assert( psEncC->frame_length == 8 * silk_RSHIFT( psEncC->frame_length, 3 ) ); /***********************/ /* Filter and Decimate */ @@ -252,14 +252,15 @@ opus_int silk_VAD_GetSA_Q8_c( /* O Return v speech_nrg += ( b + 1 ) * silk_RSHIFT( Xnrg[ b ] - psSilk_VAD->NL[ b ], 4 ); } - if( psEncC->frame_length == 20 * psEncC->fs_kHz ) { - speech_nrg = silk_RSHIFT32( speech_nrg, 1 ); - } /* Power scaling */ if( speech_nrg <= 0 ) { SA_Q15 = silk_RSHIFT( SA_Q15, 1 ); - } else if( speech_nrg < 16384 ) { - speech_nrg = silk_LSHIFT32( speech_nrg, 16 ); + } else if( speech_nrg < 32768 ) { + if( psEncC->frame_length == 10 * psEncC->fs_kHz ) { + speech_nrg = silk_LSHIFT_SAT32( speech_nrg, 16 ); + } else { + speech_nrg = silk_LSHIFT_SAT32( speech_nrg, 15 ); + } /* square-root */ speech_nrg = silk_SQRT_APPROX( speech_nrg ); @@ -312,8 +313,6 @@ void silk_VAD_GetNoiseLevels( /* Initially faster smoothing */ if( psSilk_VAD->counter < 1000 ) { /* 1000 = 20 sec */ min_coef = silk_DIV32_16( silk_int16_MAX, silk_RSHIFT( psSilk_VAD->counter, 4 ) + 1 ); - /* Increment frame counter */ - psSilk_VAD->counter++; } else { min_coef = 0; } @@ -357,4 +356,7 @@ void silk_VAD_GetNoiseLevels( /* Store as part of state */ psSilk_VAD->NL[ k ] = nl; } + + /* Increment frame counter */ + psSilk_VAD->counter++; } diff --git a/thirdparty/opus/silk/VQ_WMat_EC.c b/thirdparty/opus/silk/VQ_WMat_EC.c index 0f3d545c4e..7983f1db80 100644 --- a/thirdparty/opus/silk/VQ_WMat_EC.c +++ b/thirdparty/opus/silk/VQ_WMat_EC.c @@ -34,95 +34,84 @@ POSSIBILITY OF SUCH DAMAGE. /* Entropy constrained matrix-weighted VQ, hard-coded to 5-element vectors, for a single input data vector */ void silk_VQ_WMat_EC_c( opus_int8 *ind, /* O index of best codebook vector */ - opus_int32 *res_nrg_Q15, /* O best residual energy */ - opus_int32 *rate_dist_Q8, /* O best total bitrate */ + opus_int32 *rate_dist_Q14, /* O best weighted quant error + mu * rate */ opus_int *gain_Q7, /* O sum of absolute LTP coefficients */ - const opus_int32 *XX_Q17, /* I correlation matrix */ - const opus_int32 *xX_Q17, /* I correlation vector */ + const opus_int16 *in_Q14, /* I input vector to be quantized */ + const opus_int32 *W_Q18, /* I weighting matrix */ const opus_int8 *cb_Q7, /* I codebook */ const opus_uint8 *cb_gain_Q7, /* I codebook effective gain */ const opus_uint8 *cl_Q5, /* I code length for each codebook vector */ - const opus_int subfr_len, /* I number of samples per subframe */ + const opus_int mu_Q9, /* I tradeoff betw. weighted error and rate */ const opus_int32 max_gain_Q7, /* I maximum sum of absolute LTP coefficients */ - const opus_int L /* I number of vectors in codebook */ + opus_int L /* I number of vectors in codebook */ ) { opus_int k, gain_tmp_Q7; const opus_int8 *cb_row_Q7; - opus_int32 neg_xX_Q24[ 5 ]; - opus_int32 sum1_Q15, sum2_Q24; - opus_int32 bits_res_Q8, bits_tot_Q8; - - /* Negate and convert to new Q domain */ - neg_xX_Q24[ 0 ] = -silk_LSHIFT32( xX_Q17[ 0 ], 7 ); - neg_xX_Q24[ 1 ] = -silk_LSHIFT32( xX_Q17[ 1 ], 7 ); - neg_xX_Q24[ 2 ] = -silk_LSHIFT32( xX_Q17[ 2 ], 7 ); - neg_xX_Q24[ 3 ] = -silk_LSHIFT32( xX_Q17[ 3 ], 7 ); - neg_xX_Q24[ 4 ] = -silk_LSHIFT32( xX_Q17[ 4 ], 7 ); + opus_int16 diff_Q14[ 5 ]; + opus_int32 sum1_Q14, sum2_Q16; /* Loop over codebook */ - *rate_dist_Q8 = silk_int32_MAX; - *res_nrg_Q15 = silk_int32_MAX; + *rate_dist_Q14 = silk_int32_MAX; cb_row_Q7 = cb_Q7; - /* In things go really bad, at least *ind is set to something safe. */ - *ind = 0; for( k = 0; k < L; k++ ) { - opus_int32 penalty; gain_tmp_Q7 = cb_gain_Q7[k]; + + diff_Q14[ 0 ] = in_Q14[ 0 ] - silk_LSHIFT( cb_row_Q7[ 0 ], 7 ); + diff_Q14[ 1 ] = in_Q14[ 1 ] - silk_LSHIFT( cb_row_Q7[ 1 ], 7 ); + diff_Q14[ 2 ] = in_Q14[ 2 ] - silk_LSHIFT( cb_row_Q7[ 2 ], 7 ); + diff_Q14[ 3 ] = in_Q14[ 3 ] - silk_LSHIFT( cb_row_Q7[ 3 ], 7 ); + diff_Q14[ 4 ] = in_Q14[ 4 ] - silk_LSHIFT( cb_row_Q7[ 4 ], 7 ); + /* Weighted rate */ - /* Quantization error: 1 - 2 * xX * cb + cb' * XX * cb */ - sum1_Q15 = SILK_FIX_CONST( 1.001, 15 ); + sum1_Q14 = silk_SMULBB( mu_Q9, cl_Q5[ k ] ); /* Penalty for too large gain */ - penalty = silk_LSHIFT32( silk_max( silk_SUB32( gain_tmp_Q7, max_gain_Q7 ), 0 ), 11 ); - - /* first row of XX_Q17 */ - sum2_Q24 = silk_MLA( neg_xX_Q24[ 0 ], XX_Q17[ 1 ], cb_row_Q7[ 1 ] ); - sum2_Q24 = silk_MLA( sum2_Q24, XX_Q17[ 2 ], cb_row_Q7[ 2 ] ); - sum2_Q24 = silk_MLA( sum2_Q24, XX_Q17[ 3 ], cb_row_Q7[ 3 ] ); - sum2_Q24 = silk_MLA( sum2_Q24, XX_Q17[ 4 ], cb_row_Q7[ 4 ] ); - sum2_Q24 = silk_LSHIFT32( sum2_Q24, 1 ); - sum2_Q24 = silk_MLA( sum2_Q24, XX_Q17[ 0 ], cb_row_Q7[ 0 ] ); - sum1_Q15 = silk_SMLAWB( sum1_Q15, sum2_Q24, cb_row_Q7[ 0 ] ); - - /* second row of XX_Q17 */ - sum2_Q24 = silk_MLA( neg_xX_Q24[ 1 ], XX_Q17[ 7 ], cb_row_Q7[ 2 ] ); - sum2_Q24 = silk_MLA( sum2_Q24, XX_Q17[ 8 ], cb_row_Q7[ 3 ] ); - sum2_Q24 = silk_MLA( sum2_Q24, XX_Q17[ 9 ], cb_row_Q7[ 4 ] ); - sum2_Q24 = silk_LSHIFT32( sum2_Q24, 1 ); - sum2_Q24 = silk_MLA( sum2_Q24, XX_Q17[ 6 ], cb_row_Q7[ 1 ] ); - sum1_Q15 = silk_SMLAWB( sum1_Q15, sum2_Q24, cb_row_Q7[ 1 ] ); - - /* third row of XX_Q17 */ - sum2_Q24 = silk_MLA( neg_xX_Q24[ 2 ], XX_Q17[ 13 ], cb_row_Q7[ 3 ] ); - sum2_Q24 = silk_MLA( sum2_Q24, XX_Q17[ 14 ], cb_row_Q7[ 4 ] ); - sum2_Q24 = silk_LSHIFT32( sum2_Q24, 1 ); - sum2_Q24 = silk_MLA( sum2_Q24, XX_Q17[ 12 ], cb_row_Q7[ 2 ] ); - sum1_Q15 = silk_SMLAWB( sum1_Q15, sum2_Q24, cb_row_Q7[ 2 ] ); - - /* fourth row of XX_Q17 */ - sum2_Q24 = silk_MLA( neg_xX_Q24[ 3 ], XX_Q17[ 19 ], cb_row_Q7[ 4 ] ); - sum2_Q24 = silk_LSHIFT32( sum2_Q24, 1 ); - sum2_Q24 = silk_MLA( sum2_Q24, XX_Q17[ 18 ], cb_row_Q7[ 3 ] ); - sum1_Q15 = silk_SMLAWB( sum1_Q15, sum2_Q24, cb_row_Q7[ 3 ] ); - - /* last row of XX_Q17 */ - sum2_Q24 = silk_LSHIFT32( neg_xX_Q24[ 4 ], 1 ); - sum2_Q24 = silk_MLA( sum2_Q24, XX_Q17[ 24 ], cb_row_Q7[ 4 ] ); - sum1_Q15 = silk_SMLAWB( sum1_Q15, sum2_Q24, cb_row_Q7[ 4 ] ); + sum1_Q14 = silk_ADD_LSHIFT32( sum1_Q14, silk_max( silk_SUB32( gain_tmp_Q7, max_gain_Q7 ), 0 ), 10 ); + + silk_assert( sum1_Q14 >= 0 ); + + /* first row of W_Q18 */ + sum2_Q16 = silk_SMULWB( W_Q18[ 1 ], diff_Q14[ 1 ] ); + sum2_Q16 = silk_SMLAWB( sum2_Q16, W_Q18[ 2 ], diff_Q14[ 2 ] ); + sum2_Q16 = silk_SMLAWB( sum2_Q16, W_Q18[ 3 ], diff_Q14[ 3 ] ); + sum2_Q16 = silk_SMLAWB( sum2_Q16, W_Q18[ 4 ], diff_Q14[ 4 ] ); + sum2_Q16 = silk_LSHIFT( sum2_Q16, 1 ); + sum2_Q16 = silk_SMLAWB( sum2_Q16, W_Q18[ 0 ], diff_Q14[ 0 ] ); + sum1_Q14 = silk_SMLAWB( sum1_Q14, sum2_Q16, diff_Q14[ 0 ] ); + + /* second row of W_Q18 */ + sum2_Q16 = silk_SMULWB( W_Q18[ 7 ], diff_Q14[ 2 ] ); + sum2_Q16 = silk_SMLAWB( sum2_Q16, W_Q18[ 8 ], diff_Q14[ 3 ] ); + sum2_Q16 = silk_SMLAWB( sum2_Q16, W_Q18[ 9 ], diff_Q14[ 4 ] ); + sum2_Q16 = silk_LSHIFT( sum2_Q16, 1 ); + sum2_Q16 = silk_SMLAWB( sum2_Q16, W_Q18[ 6 ], diff_Q14[ 1 ] ); + sum1_Q14 = silk_SMLAWB( sum1_Q14, sum2_Q16, diff_Q14[ 1 ] ); + + /* third row of W_Q18 */ + sum2_Q16 = silk_SMULWB( W_Q18[ 13 ], diff_Q14[ 3 ] ); + sum2_Q16 = silk_SMLAWB( sum2_Q16, W_Q18[ 14 ], diff_Q14[ 4 ] ); + sum2_Q16 = silk_LSHIFT( sum2_Q16, 1 ); + sum2_Q16 = silk_SMLAWB( sum2_Q16, W_Q18[ 12 ], diff_Q14[ 2 ] ); + sum1_Q14 = silk_SMLAWB( sum1_Q14, sum2_Q16, diff_Q14[ 2 ] ); + + /* fourth row of W_Q18 */ + sum2_Q16 = silk_SMULWB( W_Q18[ 19 ], diff_Q14[ 4 ] ); + sum2_Q16 = silk_LSHIFT( sum2_Q16, 1 ); + sum2_Q16 = silk_SMLAWB( sum2_Q16, W_Q18[ 18 ], diff_Q14[ 3 ] ); + sum1_Q14 = silk_SMLAWB( sum1_Q14, sum2_Q16, diff_Q14[ 3 ] ); + + /* last row of W_Q18 */ + sum2_Q16 = silk_SMULWB( W_Q18[ 24 ], diff_Q14[ 4 ] ); + sum1_Q14 = silk_SMLAWB( sum1_Q14, sum2_Q16, diff_Q14[ 4 ] ); + + silk_assert( sum1_Q14 >= 0 ); /* find best */ - if( sum1_Q15 >= 0 ) { - /* Translate residual energy to bits using high-rate assumption (6 dB ==> 1 bit/sample) */ - bits_res_Q8 = silk_SMULBB( subfr_len, silk_lin2log( sum1_Q15 + penalty) - (15 << 7) ); - /* In the following line we reduce the codelength component by half ("-1"); seems to slghtly improve quality */ - bits_tot_Q8 = silk_ADD_LSHIFT32( bits_res_Q8, cl_Q5[ k ], 3-1 ); - if( bits_tot_Q8 <= *rate_dist_Q8 ) { - *rate_dist_Q8 = bits_tot_Q8; - *res_nrg_Q15 = sum1_Q15 + penalty; - *ind = (opus_int8)k; - *gain_Q7 = gain_tmp_Q7; - } + if( sum1_Q14 < *rate_dist_Q14 ) { + *rate_dist_Q14 = sum1_Q14; + *ind = (opus_int8)k; + *gain_Q7 = gain_tmp_Q7; } /* Go to next cbk vector */ diff --git a/thirdparty/opus/silk/arm/LPC_inv_pred_gain_arm.h b/thirdparty/opus/silk/arm/LPC_inv_pred_gain_arm.h deleted file mode 100644 index 9895b555c8..0000000000 --- a/thirdparty/opus/silk/arm/LPC_inv_pred_gain_arm.h +++ /dev/null @@ -1,57 +0,0 @@ -/*********************************************************************** -Copyright (c) 2017 Google Inc. -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: -- Redistributions of source code must retain the above copyright notice, -this list of conditions and the following disclaimer. -- Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the -names of specific contributors, may be used to endorse or promote -products derived from this software without specific prior written -permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. -***********************************************************************/ - -#ifndef SILK_LPC_INV_PRED_GAIN_ARM_H -# define SILK_LPC_INV_PRED_GAIN_ARM_H - -# include "celt/arm/armcpu.h" - -# if defined(OPUS_ARM_MAY_HAVE_NEON_INTR) -opus_int32 silk_LPC_inverse_pred_gain_neon( /* O Returns inverse prediction gain in energy domain, Q30 */ - const opus_int16 *A_Q12, /* I Prediction coefficients, Q12 [order] */ - const opus_int order /* I Prediction order */ -); - -# if !defined(OPUS_HAVE_RTCD) && defined(OPUS_ARM_PRESUME_NEON) -# define OVERRIDE_silk_LPC_inverse_pred_gain (1) -# define silk_LPC_inverse_pred_gain(A_Q12, order, arch) ((void)(arch), PRESUME_NEON(silk_LPC_inverse_pred_gain)(A_Q12, order)) -# endif -# endif - -# if !defined(OVERRIDE_silk_LPC_inverse_pred_gain) -/*Is run-time CPU detection enabled on this platform?*/ -# if defined(OPUS_HAVE_RTCD) && (defined(OPUS_ARM_MAY_HAVE_NEON_INTR) && !defined(OPUS_ARM_PRESUME_NEON_INTR)) -extern opus_int32 (*const SILK_LPC_INVERSE_PRED_GAIN_IMPL[OPUS_ARCHMASK+1])(const opus_int16 *A_Q12, const opus_int order); -# define OVERRIDE_silk_LPC_inverse_pred_gain (1) -# define silk_LPC_inverse_pred_gain(A_Q12, order, arch) ((*SILK_LPC_INVERSE_PRED_GAIN_IMPL[(arch)&OPUS_ARCHMASK])(A_Q12, order)) -# elif defined(OPUS_ARM_PRESUME_NEON_INTR) -# define OVERRIDE_silk_LPC_inverse_pred_gain (1) -# define silk_LPC_inverse_pred_gain(A_Q12, order, arch) ((void)(arch), silk_LPC_inverse_pred_gain_neon(A_Q12, order)) -# endif -# endif - -#endif /* end SILK_LPC_INV_PRED_GAIN_ARM_H */ diff --git a/thirdparty/opus/silk/arm/LPC_inv_pred_gain_neon_intr.c b/thirdparty/opus/silk/arm/LPC_inv_pred_gain_neon_intr.c deleted file mode 100644 index ab426bcd66..0000000000 --- a/thirdparty/opus/silk/arm/LPC_inv_pred_gain_neon_intr.c +++ /dev/null @@ -1,280 +0,0 @@ -/*********************************************************************** -Copyright (c) 2017 Google Inc. -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: -- Redistributions of source code must retain the above copyright notice, -this list of conditions and the following disclaimer. -- Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the -names of specific contributors, may be used to endorse or promote -products derived from this software without specific prior written -permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. -***********************************************************************/ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include <arm_neon.h> -#include "SigProc_FIX.h" -#include "define.h" - -#define QA 24 -#define A_LIMIT SILK_FIX_CONST( 0.99975, QA ) - -#define MUL32_FRAC_Q(a32, b32, Q) ((opus_int32)(silk_RSHIFT_ROUND64(silk_SMULL(a32, b32), Q))) - -/* The difficulty is how to judge a 64-bit signed integer tmp64 is 32-bit overflowed, - * since NEON has no 64-bit min, max or comparison instructions. - * A failed idea is to compare the results of vmovn(tmp64) and vqmovn(tmp64) whether they are equal or not. - * However, this idea fails when the tmp64 is something like 0xFFFFFFF980000000. - * Here we know that mult2Q >= 1, so the highest bit (bit 63, sign bit) of tmp64 must equal to bit 62. - * tmp64 was shifted left by 1 and we got tmp64'. If high_half(tmp64') != 0 and high_half(tmp64') != -1, - * then we know that bit 31 to bit 63 of tmp64 can not all be the sign bit, and therefore tmp64 is 32-bit overflowed. - * That is, we judge if tmp64' > 0x00000000FFFFFFFF, or tmp64' <= 0xFFFFFFFF00000000. - * We use narrowing shift right 31 bits to tmp32' to save data bandwidth and instructions. - * That is, we judge if tmp32' > 0x00000000, or tmp32' <= 0xFFFFFFFF. - */ - -/* Compute inverse of LPC prediction gain, and */ -/* test if LPC coefficients are stable (all poles within unit circle) */ -static OPUS_INLINE opus_int32 LPC_inverse_pred_gain_QA_neon( /* O Returns inverse prediction gain in energy domain, Q30 */ - opus_int32 A_QA[ SILK_MAX_ORDER_LPC ], /* I Prediction coefficients */ - const opus_int order /* I Prediction order */ -) -{ - opus_int k, n, mult2Q; - opus_int32 invGain_Q30, rc_Q31, rc_mult1_Q30, rc_mult2, tmp1, tmp2; - opus_int32 max, min; - int32x4_t max_s32x4, min_s32x4; - int32x2_t max_s32x2, min_s32x2; - - max_s32x4 = vdupq_n_s32( silk_int32_MIN ); - min_s32x4 = vdupq_n_s32( silk_int32_MAX ); - invGain_Q30 = SILK_FIX_CONST( 1, 30 ); - for( k = order - 1; k > 0; k-- ) { - int32x2_t rc_Q31_s32x2, rc_mult2_s32x2; - int64x2_t mult2Q_s64x2; - - /* Check for stability */ - if( ( A_QA[ k ] > A_LIMIT ) || ( A_QA[ k ] < -A_LIMIT ) ) { - return 0; - } - - /* Set RC equal to negated AR coef */ - rc_Q31 = -silk_LSHIFT( A_QA[ k ], 31 - QA ); - - /* rc_mult1_Q30 range: [ 1 : 2^30 ] */ - rc_mult1_Q30 = silk_SUB32( SILK_FIX_CONST( 1, 30 ), silk_SMMUL( rc_Q31, rc_Q31 ) ); - silk_assert( rc_mult1_Q30 > ( 1 << 15 ) ); /* reduce A_LIMIT if fails */ - silk_assert( rc_mult1_Q30 <= ( 1 << 30 ) ); - - /* Update inverse gain */ - /* invGain_Q30 range: [ 0 : 2^30 ] */ - invGain_Q30 = silk_LSHIFT( silk_SMMUL( invGain_Q30, rc_mult1_Q30 ), 2 ); - silk_assert( invGain_Q30 >= 0 ); - silk_assert( invGain_Q30 <= ( 1 << 30 ) ); - if( invGain_Q30 < SILK_FIX_CONST( 1.0f / MAX_PREDICTION_POWER_GAIN, 30 ) ) { - return 0; - } - - /* rc_mult2 range: [ 2^30 : silk_int32_MAX ] */ - mult2Q = 32 - silk_CLZ32( silk_abs( rc_mult1_Q30 ) ); - rc_mult2 = silk_INVERSE32_varQ( rc_mult1_Q30, mult2Q + 30 ); - - /* Update AR coefficient */ - rc_Q31_s32x2 = vdup_n_s32( rc_Q31 ); - mult2Q_s64x2 = vdupq_n_s64( -mult2Q ); - rc_mult2_s32x2 = vdup_n_s32( rc_mult2 ); - - for( n = 0; n < ( ( k + 1 ) >> 1 ) - 3; n += 4 ) { - /* We always calculate extra elements of A_QA buffer when ( k % 4 ) != 0, to take the advantage of SIMD parallelization. */ - int32x4_t tmp1_s32x4, tmp2_s32x4, t0_s32x4, t1_s32x4, s0_s32x4, s1_s32x4, t_QA0_s32x4, t_QA1_s32x4; - int64x2_t t0_s64x2, t1_s64x2, t2_s64x2, t3_s64x2; - tmp1_s32x4 = vld1q_s32( A_QA + n ); - tmp2_s32x4 = vld1q_s32( A_QA + k - n - 4 ); - tmp2_s32x4 = vrev64q_s32( tmp2_s32x4 ); - tmp2_s32x4 = vcombine_s32( vget_high_s32( tmp2_s32x4 ), vget_low_s32( tmp2_s32x4 ) ); - t0_s32x4 = vqrdmulhq_lane_s32( tmp2_s32x4, rc_Q31_s32x2, 0 ); - t1_s32x4 = vqrdmulhq_lane_s32( tmp1_s32x4, rc_Q31_s32x2, 0 ); - t_QA0_s32x4 = vqsubq_s32( tmp1_s32x4, t0_s32x4 ); - t_QA1_s32x4 = vqsubq_s32( tmp2_s32x4, t1_s32x4 ); - t0_s64x2 = vmull_s32( vget_low_s32 ( t_QA0_s32x4 ), rc_mult2_s32x2 ); - t1_s64x2 = vmull_s32( vget_high_s32( t_QA0_s32x4 ), rc_mult2_s32x2 ); - t2_s64x2 = vmull_s32( vget_low_s32 ( t_QA1_s32x4 ), rc_mult2_s32x2 ); - t3_s64x2 = vmull_s32( vget_high_s32( t_QA1_s32x4 ), rc_mult2_s32x2 ); - t0_s64x2 = vrshlq_s64( t0_s64x2, mult2Q_s64x2 ); - t1_s64x2 = vrshlq_s64( t1_s64x2, mult2Q_s64x2 ); - t2_s64x2 = vrshlq_s64( t2_s64x2, mult2Q_s64x2 ); - t3_s64x2 = vrshlq_s64( t3_s64x2, mult2Q_s64x2 ); - t0_s32x4 = vcombine_s32( vmovn_s64( t0_s64x2 ), vmovn_s64( t1_s64x2 ) ); - t1_s32x4 = vcombine_s32( vmovn_s64( t2_s64x2 ), vmovn_s64( t3_s64x2 ) ); - s0_s32x4 = vcombine_s32( vshrn_n_s64( t0_s64x2, 31 ), vshrn_n_s64( t1_s64x2, 31 ) ); - s1_s32x4 = vcombine_s32( vshrn_n_s64( t2_s64x2, 31 ), vshrn_n_s64( t3_s64x2, 31 ) ); - max_s32x4 = vmaxq_s32( max_s32x4, s0_s32x4 ); - min_s32x4 = vminq_s32( min_s32x4, s0_s32x4 ); - max_s32x4 = vmaxq_s32( max_s32x4, s1_s32x4 ); - min_s32x4 = vminq_s32( min_s32x4, s1_s32x4 ); - t1_s32x4 = vrev64q_s32( t1_s32x4 ); - t1_s32x4 = vcombine_s32( vget_high_s32( t1_s32x4 ), vget_low_s32( t1_s32x4 ) ); - vst1q_s32( A_QA + n, t0_s32x4 ); - vst1q_s32( A_QA + k - n - 4, t1_s32x4 ); - } - for( ; n < (k + 1) >> 1; n++ ) { - opus_int64 tmp64; - tmp1 = A_QA[ n ]; - tmp2 = A_QA[ k - n - 1 ]; - tmp64 = silk_RSHIFT_ROUND64( silk_SMULL( silk_SUB_SAT32(tmp1, - MUL32_FRAC_Q( tmp2, rc_Q31, 31 ) ), rc_mult2 ), mult2Q); - if( tmp64 > silk_int32_MAX || tmp64 < silk_int32_MIN ) { - return 0; - } - A_QA[ n ] = ( opus_int32 )tmp64; - tmp64 = silk_RSHIFT_ROUND64( silk_SMULL( silk_SUB_SAT32(tmp2, - MUL32_FRAC_Q( tmp1, rc_Q31, 31 ) ), rc_mult2), mult2Q); - if( tmp64 > silk_int32_MAX || tmp64 < silk_int32_MIN ) { - return 0; - } - A_QA[ k - n - 1 ] = ( opus_int32 )tmp64; - } - } - - /* Check for stability */ - if( ( A_QA[ k ] > A_LIMIT ) || ( A_QA[ k ] < -A_LIMIT ) ) { - return 0; - } - - max_s32x2 = vmax_s32( vget_low_s32( max_s32x4 ), vget_high_s32( max_s32x4 ) ); - min_s32x2 = vmin_s32( vget_low_s32( min_s32x4 ), vget_high_s32( min_s32x4 ) ); - max_s32x2 = vmax_s32( max_s32x2, vreinterpret_s32_s64( vshr_n_s64( vreinterpret_s64_s32( max_s32x2 ), 32 ) ) ); - min_s32x2 = vmin_s32( min_s32x2, vreinterpret_s32_s64( vshr_n_s64( vreinterpret_s64_s32( min_s32x2 ), 32 ) ) ); - max = vget_lane_s32( max_s32x2, 0 ); - min = vget_lane_s32( min_s32x2, 0 ); - if( ( max > 0 ) || ( min < -1 ) ) { - return 0; - } - - /* Set RC equal to negated AR coef */ - rc_Q31 = -silk_LSHIFT( A_QA[ 0 ], 31 - QA ); - - /* Range: [ 1 : 2^30 ] */ - rc_mult1_Q30 = silk_SUB32( SILK_FIX_CONST( 1, 30 ), silk_SMMUL( rc_Q31, rc_Q31 ) ); - - /* Update inverse gain */ - /* Range: [ 0 : 2^30 ] */ - invGain_Q30 = silk_LSHIFT( silk_SMMUL( invGain_Q30, rc_mult1_Q30 ), 2 ); - silk_assert( invGain_Q30 >= 0 ); - silk_assert( invGain_Q30 <= ( 1 << 30 ) ); - if( invGain_Q30 < SILK_FIX_CONST( 1.0f / MAX_PREDICTION_POWER_GAIN, 30 ) ) { - return 0; - } - - return invGain_Q30; -} - -/* For input in Q12 domain */ -opus_int32 silk_LPC_inverse_pred_gain_neon( /* O Returns inverse prediction gain in energy domain, Q30 */ - const opus_int16 *A_Q12, /* I Prediction coefficients, Q12 [order] */ - const opus_int order /* I Prediction order */ -) -{ -#ifdef OPUS_CHECK_ASM - const opus_int32 invGain_Q30_c = silk_LPC_inverse_pred_gain_c( A_Q12, order ); -#endif - - opus_int32 invGain_Q30; - if( ( SILK_MAX_ORDER_LPC != 24 ) || ( order & 1 )) { - invGain_Q30 = silk_LPC_inverse_pred_gain_c( A_Q12, order ); - } - else { - opus_int32 Atmp_QA[ SILK_MAX_ORDER_LPC ]; - opus_int32 DC_resp; - int16x8_t t0_s16x8, t1_s16x8, t2_s16x8; - int32x4_t t0_s32x4; - const opus_int leftover = order & 7; - - /* Increase Q domain of the AR coefficients */ - t0_s16x8 = vld1q_s16( A_Q12 + 0 ); - t1_s16x8 = vld1q_s16( A_Q12 + 8 ); - t2_s16x8 = vld1q_s16( A_Q12 + 16 ); - t0_s32x4 = vpaddlq_s16( t0_s16x8 ); - - switch( order - leftover ) - { - case 24: - t0_s32x4 = vpadalq_s16( t0_s32x4, t2_s16x8 ); - /* FALLTHROUGH */ - - case 16: - t0_s32x4 = vpadalq_s16( t0_s32x4, t1_s16x8 ); - vst1q_s32( Atmp_QA + 16, vshll_n_s16( vget_low_s16 ( t2_s16x8 ), QA - 12 ) ); - vst1q_s32( Atmp_QA + 20, vshll_n_s16( vget_high_s16( t2_s16x8 ), QA - 12 ) ); - /* FALLTHROUGH */ - - case 8: - { - const int32x2_t t_s32x2 = vpadd_s32( vget_low_s32( t0_s32x4 ), vget_high_s32( t0_s32x4 ) ); - const int64x1_t t_s64x1 = vpaddl_s32( t_s32x2 ); - DC_resp = vget_lane_s32( vreinterpret_s32_s64( t_s64x1 ), 0 ); - vst1q_s32( Atmp_QA + 8, vshll_n_s16( vget_low_s16 ( t1_s16x8 ), QA - 12 ) ); - vst1q_s32( Atmp_QA + 12, vshll_n_s16( vget_high_s16( t1_s16x8 ), QA - 12 ) ); - } - break; - - default: - DC_resp = 0; - break; - } - A_Q12 += order - leftover; - - switch( leftover ) - { - case 6: - DC_resp += (opus_int32)A_Q12[ 5 ]; - DC_resp += (opus_int32)A_Q12[ 4 ]; - /* FALLTHROUGH */ - - case 4: - DC_resp += (opus_int32)A_Q12[ 3 ]; - DC_resp += (opus_int32)A_Q12[ 2 ]; - /* FALLTHROUGH */ - - case 2: - DC_resp += (opus_int32)A_Q12[ 1 ]; - DC_resp += (opus_int32)A_Q12[ 0 ]; - /* FALLTHROUGH */ - - default: - break; - } - - /* If the DC is unstable, we don't even need to do the full calculations */ - if( DC_resp >= 4096 ) { - invGain_Q30 = 0; - } else { - vst1q_s32( Atmp_QA + 0, vshll_n_s16( vget_low_s16 ( t0_s16x8 ), QA - 12 ) ); - vst1q_s32( Atmp_QA + 4, vshll_n_s16( vget_high_s16( t0_s16x8 ), QA - 12 ) ); - invGain_Q30 = LPC_inverse_pred_gain_QA_neon( Atmp_QA, order ); - } - } - -#ifdef OPUS_CHECK_ASM - silk_assert( invGain_Q30_c == invGain_Q30 ); -#endif - - return invGain_Q30; -} diff --git a/thirdparty/opus/silk/arm/NSQ_del_dec_arm.h b/thirdparty/opus/silk/arm/NSQ_del_dec_arm.h deleted file mode 100644 index 9e76e16927..0000000000 --- a/thirdparty/opus/silk/arm/NSQ_del_dec_arm.h +++ /dev/null @@ -1,100 +0,0 @@ -/*********************************************************************** -Copyright (c) 2017 Google Inc. -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: -- Redistributions of source code must retain the above copyright notice, -this list of conditions and the following disclaimer. -- Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the -names of specific contributors, may be used to endorse or promote -products derived from this software without specific prior written -permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. -***********************************************************************/ - -#ifndef SILK_NSQ_DEL_DEC_ARM_H -#define SILK_NSQ_DEL_DEC_ARM_H - -#include "celt/arm/armcpu.h" - -#if defined(OPUS_ARM_MAY_HAVE_NEON_INTR) -void silk_NSQ_del_dec_neon( - const silk_encoder_state *psEncC, silk_nsq_state *NSQ, - SideInfoIndices *psIndices, const opus_int16 x16[], opus_int8 pulses[], - const opus_int16 PredCoef_Q12[2 * MAX_LPC_ORDER], - const opus_int16 LTPCoef_Q14[LTP_ORDER * MAX_NB_SUBFR], - const opus_int16 AR_Q13[MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER], - const opus_int HarmShapeGain_Q14[MAX_NB_SUBFR], - const opus_int Tilt_Q14[MAX_NB_SUBFR], - const opus_int32 LF_shp_Q14[MAX_NB_SUBFR], - const opus_int32 Gains_Q16[MAX_NB_SUBFR], - const opus_int pitchL[MAX_NB_SUBFR], const opus_int Lambda_Q10, - const opus_int LTP_scale_Q14); - -#if !defined(OPUS_HAVE_RTCD) -#define OVERRIDE_silk_NSQ_del_dec (1) -#define silk_NSQ_del_dec(psEncC, NSQ, psIndices, x16, pulses, PredCoef_Q12, \ - LTPCoef_Q14, AR_Q13, HarmShapeGain_Q14, Tilt_Q14, \ - LF_shp_Q14, Gains_Q16, pitchL, Lambda_Q10, \ - LTP_scale_Q14, arch) \ - ((void)(arch), \ - PRESUME_NEON(silk_NSQ_del_dec)( \ - psEncC, NSQ, psIndices, x16, pulses, PredCoef_Q12, LTPCoef_Q14, \ - AR_Q13, HarmShapeGain_Q14, Tilt_Q14, LF_shp_Q14, Gains_Q16, pitchL, \ - Lambda_Q10, LTP_scale_Q14)) -#endif -#endif - -#if !defined(OVERRIDE_silk_NSQ_del_dec) -/*Is run-time CPU detection enabled on this platform?*/ -#if defined(OPUS_HAVE_RTCD) && (defined(OPUS_ARM_MAY_HAVE_NEON_INTR) && \ - !defined(OPUS_ARM_PRESUME_NEON_INTR)) -extern void (*const SILK_NSQ_DEL_DEC_IMPL[OPUS_ARCHMASK + 1])( - const silk_encoder_state *psEncC, silk_nsq_state *NSQ, - SideInfoIndices *psIndices, const opus_int16 x16[], opus_int8 pulses[], - const opus_int16 PredCoef_Q12[2 * MAX_LPC_ORDER], - const opus_int16 LTPCoef_Q14[LTP_ORDER * MAX_NB_SUBFR], - const opus_int16 AR_Q13[MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER], - const opus_int HarmShapeGain_Q14[MAX_NB_SUBFR], - const opus_int Tilt_Q14[MAX_NB_SUBFR], - const opus_int32 LF_shp_Q14[MAX_NB_SUBFR], - const opus_int32 Gains_Q16[MAX_NB_SUBFR], - const opus_int pitchL[MAX_NB_SUBFR], const opus_int Lambda_Q10, - const opus_int LTP_scale_Q14); -#define OVERRIDE_silk_NSQ_del_dec (1) -#define silk_NSQ_del_dec(psEncC, NSQ, psIndices, x16, pulses, PredCoef_Q12, \ - LTPCoef_Q14, AR_Q13, HarmShapeGain_Q14, Tilt_Q14, \ - LF_shp_Q14, Gains_Q16, pitchL, Lambda_Q10, \ - LTP_scale_Q14, arch) \ - ((*SILK_NSQ_DEL_DEC_IMPL[(arch)&OPUS_ARCHMASK])( \ - psEncC, NSQ, psIndices, x16, pulses, PredCoef_Q12, LTPCoef_Q14, \ - AR_Q13, HarmShapeGain_Q14, Tilt_Q14, LF_shp_Q14, Gains_Q16, pitchL, \ - Lambda_Q10, LTP_scale_Q14)) -#elif defined(OPUS_ARM_PRESUME_NEON_INTR) -#define OVERRIDE_silk_NSQ_del_dec (1) -#define silk_NSQ_del_dec(psEncC, NSQ, psIndices, x16, pulses, PredCoef_Q12, \ - LTPCoef_Q14, AR_Q13, HarmShapeGain_Q14, Tilt_Q14, \ - LF_shp_Q14, Gains_Q16, pitchL, Lambda_Q10, \ - LTP_scale_Q14, arch) \ - ((void)(arch), \ - silk_NSQ_del_dec_neon(psEncC, NSQ, psIndices, x16, pulses, PredCoef_Q12, \ - LTPCoef_Q14, AR_Q13, HarmShapeGain_Q14, Tilt_Q14, \ - LF_shp_Q14, Gains_Q16, pitchL, Lambda_Q10, \ - LTP_scale_Q14)) -#endif -#endif - -#endif /* end SILK_NSQ_DEL_DEC_ARM_H */ diff --git a/thirdparty/opus/silk/arm/NSQ_del_dec_neon_intr.c b/thirdparty/opus/silk/arm/NSQ_del_dec_neon_intr.c deleted file mode 100644 index 212410f362..0000000000 --- a/thirdparty/opus/silk/arm/NSQ_del_dec_neon_intr.c +++ /dev/null @@ -1,1124 +0,0 @@ -/*********************************************************************** -Copyright (c) 2017 Google Inc. -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: -- Redistributions of source code must retain the above copyright notice, -this list of conditions and the following disclaimer. -- Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the -names of specific contributors, may be used to endorse or promote -products derived from this software without specific prior written -permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. -***********************************************************************/ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include <arm_neon.h> -#ifdef OPUS_CHECK_ASM -# include <string.h> -#endif -#include "main.h" -#include "stack_alloc.h" - -/* NEON intrinsics optimization now can only parallelize up to 4 delay decision states. */ -/* If there are more states, C function is called, and this optimization must be expanded. */ -#define NEON_MAX_DEL_DEC_STATES 4 - -typedef struct { - opus_int32 sLPC_Q14[ MAX_SUB_FRAME_LENGTH + NSQ_LPC_BUF_LENGTH ][ NEON_MAX_DEL_DEC_STATES ]; - opus_int32 RandState[ DECISION_DELAY ][ NEON_MAX_DEL_DEC_STATES ]; - opus_int32 Q_Q10[ DECISION_DELAY ][ NEON_MAX_DEL_DEC_STATES ]; - opus_int32 Xq_Q14[ DECISION_DELAY ][ NEON_MAX_DEL_DEC_STATES ]; - opus_int32 Pred_Q15[ DECISION_DELAY ][ NEON_MAX_DEL_DEC_STATES ]; - opus_int32 Shape_Q14[ DECISION_DELAY ][ NEON_MAX_DEL_DEC_STATES ]; - opus_int32 sAR2_Q14[ MAX_SHAPE_LPC_ORDER ][ NEON_MAX_DEL_DEC_STATES ]; - opus_int32 LF_AR_Q14[ NEON_MAX_DEL_DEC_STATES ]; - opus_int32 Diff_Q14[ NEON_MAX_DEL_DEC_STATES ]; - opus_int32 Seed[ NEON_MAX_DEL_DEC_STATES ]; - opus_int32 SeedInit[ NEON_MAX_DEL_DEC_STATES ]; - opus_int32 RD_Q10[ NEON_MAX_DEL_DEC_STATES ]; -} NSQ_del_decs_struct; - -typedef struct { - opus_int32 Q_Q10[ NEON_MAX_DEL_DEC_STATES ]; - opus_int32 RD_Q10[ NEON_MAX_DEL_DEC_STATES ]; - opus_int32 xq_Q14[ NEON_MAX_DEL_DEC_STATES ]; - opus_int32 LF_AR_Q14[ NEON_MAX_DEL_DEC_STATES ]; - opus_int32 Diff_Q14[ NEON_MAX_DEL_DEC_STATES ]; - opus_int32 sLTP_shp_Q14[ NEON_MAX_DEL_DEC_STATES ]; - opus_int32 LPC_exc_Q14[ NEON_MAX_DEL_DEC_STATES ]; -} NSQ_samples_struct; - -static OPUS_INLINE void silk_nsq_del_dec_scale_states_neon( - const silk_encoder_state *psEncC, /* I Encoder State */ - silk_nsq_state *NSQ, /* I/O NSQ state */ - NSQ_del_decs_struct psDelDec[], /* I/O Delayed decision states */ - const opus_int16 x16[], /* I Input */ - opus_int32 x_sc_Q10[], /* O Input scaled with 1/Gain in Q10 */ - const opus_int16 sLTP[], /* I Re-whitened LTP state in Q0 */ - opus_int32 sLTP_Q15[], /* O LTP state matching scaled input */ - opus_int subfr, /* I Subframe number */ - const opus_int LTP_scale_Q14, /* I LTP state scaling */ - const opus_int32 Gains_Q16[ MAX_NB_SUBFR ], /* I */ - const opus_int pitchL[ MAX_NB_SUBFR ], /* I Pitch lag */ - const opus_int signal_type, /* I Signal type */ - const opus_int decisionDelay /* I Decision delay */ -); - -/******************************************/ -/* Noise shape quantizer for one subframe */ -/******************************************/ -static OPUS_INLINE void silk_noise_shape_quantizer_del_dec_neon( - silk_nsq_state *NSQ, /* I/O NSQ state */ - NSQ_del_decs_struct psDelDec[], /* I/O Delayed decision states */ - opus_int signalType, /* I Signal type */ - const opus_int32 x_Q10[], /* I */ - opus_int8 pulses[], /* O */ - opus_int16 xq[], /* O */ - opus_int32 sLTP_Q15[], /* I/O LTP filter state */ - opus_int32 delayedGain_Q10[], /* I/O Gain delay buffer */ - const opus_int16 a_Q12[], /* I Short term prediction coefs */ - const opus_int16 b_Q14[], /* I Long term prediction coefs */ - const opus_int16 AR_shp_Q13[], /* I Noise shaping coefs */ - opus_int lag, /* I Pitch lag */ - opus_int32 HarmShapeFIRPacked_Q14, /* I */ - opus_int Tilt_Q14, /* I Spectral tilt */ - opus_int32 LF_shp_Q14, /* I */ - opus_int32 Gain_Q16, /* I */ - opus_int Lambda_Q10, /* I */ - opus_int offset_Q10, /* I */ - opus_int length, /* I Input length */ - opus_int subfr, /* I Subframe number */ - opus_int shapingLPCOrder, /* I Shaping LPC filter order */ - opus_int predictLPCOrder, /* I Prediction filter order */ - opus_int warping_Q16, /* I */ - opus_int nStatesDelayedDecision, /* I Number of states in decision tree */ - opus_int *smpl_buf_idx, /* I/O Index to newest samples in buffers */ - opus_int decisionDelay /* I */ -); - -static OPUS_INLINE void copy_winner_state_kernel( - const NSQ_del_decs_struct *psDelDec, - const opus_int offset, - const opus_int last_smple_idx, - const opus_int Winner_ind, - const int32x2_t gain_lo_s32x2, - const int32x2_t gain_hi_s32x2, - const int32x4_t shift_s32x4, - int32x4_t t0_s32x4, - int32x4_t t1_s32x4, - opus_int8 *const pulses, - opus_int16 *pxq, - silk_nsq_state *NSQ -) -{ - int16x8_t t_s16x8; - int32x4_t o0_s32x4, o1_s32x4; - - t0_s32x4 = vld1q_lane_s32( &psDelDec->Q_Q10[ last_smple_idx - 0 ][ Winner_ind ], t0_s32x4, 0 ); - t0_s32x4 = vld1q_lane_s32( &psDelDec->Q_Q10[ last_smple_idx - 1 ][ Winner_ind ], t0_s32x4, 1 ); - t0_s32x4 = vld1q_lane_s32( &psDelDec->Q_Q10[ last_smple_idx - 2 ][ Winner_ind ], t0_s32x4, 2 ); - t0_s32x4 = vld1q_lane_s32( &psDelDec->Q_Q10[ last_smple_idx - 3 ][ Winner_ind ], t0_s32x4, 3 ); - t1_s32x4 = vld1q_lane_s32( &psDelDec->Q_Q10[ last_smple_idx - 4 ][ Winner_ind ], t1_s32x4, 0 ); - t1_s32x4 = vld1q_lane_s32( &psDelDec->Q_Q10[ last_smple_idx - 5 ][ Winner_ind ], t1_s32x4, 1 ); - t1_s32x4 = vld1q_lane_s32( &psDelDec->Q_Q10[ last_smple_idx - 6 ][ Winner_ind ], t1_s32x4, 2 ); - t1_s32x4 = vld1q_lane_s32( &psDelDec->Q_Q10[ last_smple_idx - 7 ][ Winner_ind ], t1_s32x4, 3 ); - t_s16x8 = vcombine_s16( vrshrn_n_s32( t0_s32x4, 10 ), vrshrn_n_s32( t1_s32x4, 10 ) ); - vst1_s8( &pulses[ offset ], vmovn_s16( t_s16x8 ) ); - - t0_s32x4 = vld1q_lane_s32( &psDelDec->Xq_Q14[ last_smple_idx - 0 ][ Winner_ind ], t0_s32x4, 0 ); - t0_s32x4 = vld1q_lane_s32( &psDelDec->Xq_Q14[ last_smple_idx - 1 ][ Winner_ind ], t0_s32x4, 1 ); - t0_s32x4 = vld1q_lane_s32( &psDelDec->Xq_Q14[ last_smple_idx - 2 ][ Winner_ind ], t0_s32x4, 2 ); - t0_s32x4 = vld1q_lane_s32( &psDelDec->Xq_Q14[ last_smple_idx - 3 ][ Winner_ind ], t0_s32x4, 3 ); - t1_s32x4 = vld1q_lane_s32( &psDelDec->Xq_Q14[ last_smple_idx - 4 ][ Winner_ind ], t1_s32x4, 0 ); - t1_s32x4 = vld1q_lane_s32( &psDelDec->Xq_Q14[ last_smple_idx - 5 ][ Winner_ind ], t1_s32x4, 1 ); - t1_s32x4 = vld1q_lane_s32( &psDelDec->Xq_Q14[ last_smple_idx - 6 ][ Winner_ind ], t1_s32x4, 2 ); - t1_s32x4 = vld1q_lane_s32( &psDelDec->Xq_Q14[ last_smple_idx - 7 ][ Winner_ind ], t1_s32x4, 3 ); - o0_s32x4 = vqdmulhq_lane_s32( t0_s32x4, gain_lo_s32x2, 0 ); - o1_s32x4 = vqdmulhq_lane_s32( t1_s32x4, gain_lo_s32x2, 0 ); - o0_s32x4 = vmlaq_lane_s32( o0_s32x4, t0_s32x4, gain_hi_s32x2, 0 ); - o1_s32x4 = vmlaq_lane_s32( o1_s32x4, t1_s32x4, gain_hi_s32x2, 0 ); - o0_s32x4 = vrshlq_s32( o0_s32x4, shift_s32x4 ); - o1_s32x4 = vrshlq_s32( o1_s32x4, shift_s32x4 ); - vst1_s16( &pxq[ offset + 0 ], vqmovn_s32( o0_s32x4 ) ); - vst1_s16( &pxq[ offset + 4 ], vqmovn_s32( o1_s32x4 ) ); - - t0_s32x4 = vld1q_lane_s32( &psDelDec->Shape_Q14[ last_smple_idx - 0 ][ Winner_ind ], t0_s32x4, 0 ); - t0_s32x4 = vld1q_lane_s32( &psDelDec->Shape_Q14[ last_smple_idx - 1 ][ Winner_ind ], t0_s32x4, 1 ); - t0_s32x4 = vld1q_lane_s32( &psDelDec->Shape_Q14[ last_smple_idx - 2 ][ Winner_ind ], t0_s32x4, 2 ); - t0_s32x4 = vld1q_lane_s32( &psDelDec->Shape_Q14[ last_smple_idx - 3 ][ Winner_ind ], t0_s32x4, 3 ); - t1_s32x4 = vld1q_lane_s32( &psDelDec->Shape_Q14[ last_smple_idx - 4 ][ Winner_ind ], t1_s32x4, 0 ); - t1_s32x4 = vld1q_lane_s32( &psDelDec->Shape_Q14[ last_smple_idx - 5 ][ Winner_ind ], t1_s32x4, 1 ); - t1_s32x4 = vld1q_lane_s32( &psDelDec->Shape_Q14[ last_smple_idx - 6 ][ Winner_ind ], t1_s32x4, 2 ); - t1_s32x4 = vld1q_lane_s32( &psDelDec->Shape_Q14[ last_smple_idx - 7 ][ Winner_ind ], t1_s32x4, 3 ); - vst1q_s32( &NSQ->sLTP_shp_Q14[ NSQ->sLTP_shp_buf_idx + offset + 0 ], t0_s32x4 ); - vst1q_s32( &NSQ->sLTP_shp_Q14[ NSQ->sLTP_shp_buf_idx + offset + 4 ], t1_s32x4 ); -} - -static OPUS_INLINE void copy_winner_state( - const NSQ_del_decs_struct *psDelDec, - const opus_int decisionDelay, - const opus_int smpl_buf_idx, - const opus_int Winner_ind, - const opus_int32 gain, - const opus_int32 shift, - opus_int8 *const pulses, - opus_int16 *pxq, - silk_nsq_state *NSQ -) -{ - opus_int i, last_smple_idx; - const int32x2_t gain_lo_s32x2 = vdup_n_s32( silk_LSHIFT32( gain & 0x0000FFFF, 15 ) ); - const int32x2_t gain_hi_s32x2 = vdup_n_s32( gain >> 16 ); - const int32x4_t shift_s32x4 = vdupq_n_s32( -shift ); - int32x4_t t0_s32x4, t1_s32x4; - - t0_s32x4 = t1_s32x4 = vdupq_n_s32( 0 ); /* initialization */ - last_smple_idx = smpl_buf_idx + decisionDelay - 1 + DECISION_DELAY; - if( last_smple_idx >= DECISION_DELAY ) last_smple_idx -= DECISION_DELAY; - if( last_smple_idx >= DECISION_DELAY ) last_smple_idx -= DECISION_DELAY; - - for( i = 0; ( i < ( decisionDelay - 7 ) ) && ( last_smple_idx >= 7 ); i += 8, last_smple_idx -= 8 ) { - copy_winner_state_kernel( psDelDec, i - decisionDelay, last_smple_idx, Winner_ind, gain_lo_s32x2, gain_hi_s32x2, shift_s32x4, t0_s32x4, t1_s32x4, pulses, pxq, NSQ ); - } - for( ; ( i < decisionDelay ) && ( last_smple_idx >= 0 ); i++, last_smple_idx-- ) { - pulses[ i - decisionDelay ] = (opus_int8)silk_RSHIFT_ROUND( psDelDec->Q_Q10[ last_smple_idx ][ Winner_ind ], 10 ); - pxq[ i - decisionDelay ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( silk_SMULWW( psDelDec->Xq_Q14[ last_smple_idx ][ Winner_ind ], gain ), shift ) ); - NSQ->sLTP_shp_Q14[ NSQ->sLTP_shp_buf_idx - decisionDelay + i ] = psDelDec->Shape_Q14[ last_smple_idx ][ Winner_ind ]; - } - - last_smple_idx += DECISION_DELAY; - for( ; i < ( decisionDelay - 7 ); i++, last_smple_idx-- ) { - copy_winner_state_kernel( psDelDec, i - decisionDelay, last_smple_idx, Winner_ind, gain_lo_s32x2, gain_hi_s32x2, shift_s32x4, t0_s32x4, t1_s32x4, pulses, pxq, NSQ ); - } - for( ; i < decisionDelay; i++, last_smple_idx-- ) { - pulses[ i - decisionDelay ] = (opus_int8)silk_RSHIFT_ROUND( psDelDec->Q_Q10[ last_smple_idx ][ Winner_ind ], 10 ); - pxq[ i - decisionDelay ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( silk_SMULWW( psDelDec->Xq_Q14[ last_smple_idx ][ Winner_ind ], gain ), shift ) ); - NSQ->sLTP_shp_Q14[ NSQ->sLTP_shp_buf_idx - decisionDelay + i ] = psDelDec->Shape_Q14[ last_smple_idx ][ Winner_ind ]; - } -} - -void silk_NSQ_del_dec_neon( - const silk_encoder_state *psEncC, /* I Encoder State */ - silk_nsq_state *NSQ, /* I/O NSQ state */ - SideInfoIndices *psIndices, /* I/O Quantization Indices */ - const opus_int16 x16[], /* I Input */ - opus_int8 pulses[], /* O Quantized pulse signal */ - const opus_int16 PredCoef_Q12[ 2 * MAX_LPC_ORDER ], /* I Short term prediction coefs */ - const opus_int16 LTPCoef_Q14[ LTP_ORDER * MAX_NB_SUBFR ], /* I Long term prediction coefs */ - const opus_int16 AR_Q13[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ], /* I Noise shaping coefs */ - const opus_int HarmShapeGain_Q14[ MAX_NB_SUBFR ], /* I Long term shaping coefs */ - const opus_int Tilt_Q14[ MAX_NB_SUBFR ], /* I Spectral tilt */ - const opus_int32 LF_shp_Q14[ MAX_NB_SUBFR ], /* I Low frequency shaping coefs */ - const opus_int32 Gains_Q16[ MAX_NB_SUBFR ], /* I Quantization step sizes */ - const opus_int pitchL[ MAX_NB_SUBFR ], /* I Pitch lags */ - const opus_int Lambda_Q10, /* I Rate/distortion tradeoff */ - const opus_int LTP_scale_Q14 /* I LTP state scaling */ -) -{ -#ifdef OPUS_CHECK_ASM - silk_nsq_state NSQ_c; - SideInfoIndices psIndices_c; - opus_int8 pulses_c[ MAX_FRAME_LENGTH ]; - const opus_int8 *const pulses_a = pulses; - - ( void )pulses_a; - silk_memcpy( &NSQ_c, NSQ, sizeof( NSQ_c ) ); - silk_memcpy( &psIndices_c, psIndices, sizeof( psIndices_c ) ); - silk_memcpy( pulses_c, pulses, sizeof( pulses_c ) ); - silk_NSQ_del_dec_c( psEncC, &NSQ_c, &psIndices_c, x16, pulses_c, PredCoef_Q12, LTPCoef_Q14, AR_Q13, HarmShapeGain_Q14, Tilt_Q14, LF_shp_Q14, Gains_Q16, - pitchL, Lambda_Q10, LTP_scale_Q14 ); -#endif - - /* The optimization parallelizes the different delay decision states. */ - if(( psEncC->nStatesDelayedDecision > NEON_MAX_DEL_DEC_STATES ) || ( psEncC->nStatesDelayedDecision <= 2 )) { - /* NEON intrinsics optimization now can only parallelize up to 4 delay decision states. */ - /* If there are more states, C function is called, and this optimization must be expanded. */ - /* When the number of delay decision states is less than 3, there are penalties using this */ - /* optimization, and C function is called. */ - /* When the number of delay decision states is 2, it's better to specialize another */ - /* structure NSQ_del_dec2_struct and optimize with shorter NEON registers. (Low priority) */ - silk_NSQ_del_dec_c( psEncC, NSQ, psIndices, x16, pulses, PredCoef_Q12, LTPCoef_Q14, AR_Q13, HarmShapeGain_Q14, - Tilt_Q14, LF_shp_Q14, Gains_Q16, pitchL, Lambda_Q10, LTP_scale_Q14 ); - } else { - opus_int i, k, lag, start_idx, LSF_interpolation_flag, Winner_ind, subfr; - opus_int smpl_buf_idx, decisionDelay; - const opus_int16 *A_Q12, *B_Q14, *AR_shp_Q13; - opus_int16 *pxq; - VARDECL( opus_int32, sLTP_Q15 ); - VARDECL( opus_int16, sLTP ); - opus_int32 HarmShapeFIRPacked_Q14; - opus_int offset_Q10; - opus_int32 RDmin_Q10, Gain_Q10; - VARDECL( opus_int32, x_sc_Q10 ); - VARDECL( opus_int32, delayedGain_Q10 ); - VARDECL( NSQ_del_decs_struct, psDelDec ); - int32x4_t t_s32x4; - SAVE_STACK; - - /* Set unvoiced lag to the previous one, overwrite later for voiced */ - lag = NSQ->lagPrev; - - silk_assert( NSQ->prev_gain_Q16 != 0 ); - - /* Initialize delayed decision states */ - ALLOC( psDelDec, 1, NSQ_del_decs_struct ); - /* Only RandState and RD_Q10 need to be initialized to 0. */ - silk_memset( psDelDec->RandState, 0, sizeof( psDelDec->RandState ) ); - vst1q_s32( psDelDec->RD_Q10, vdupq_n_s32( 0 ) ); - - for( k = 0; k < psEncC->nStatesDelayedDecision; k++ ) { - psDelDec->SeedInit[ k ] = psDelDec->Seed[ k ] = ( k + psIndices->Seed ) & 3; - } - vst1q_s32( psDelDec->LF_AR_Q14, vld1q_dup_s32( &NSQ->sLF_AR_shp_Q14 ) ); - vst1q_s32( psDelDec->Diff_Q14, vld1q_dup_s32( &NSQ->sDiff_shp_Q14 ) ); - vst1q_s32( psDelDec->Shape_Q14[ 0 ], vld1q_dup_s32( &NSQ->sLTP_shp_Q14[ psEncC->ltp_mem_length - 1 ] ) ); - for( i = 0; i < NSQ_LPC_BUF_LENGTH; i++ ) { - vst1q_s32( psDelDec->sLPC_Q14[ i ], vld1q_dup_s32( &NSQ->sLPC_Q14[ i ] ) ); - } - for( i = 0; i < (opus_int)( sizeof( NSQ->sAR2_Q14 ) / sizeof( NSQ->sAR2_Q14[ 0 ] ) ); i++ ) { - vst1q_s32( psDelDec->sAR2_Q14[ i ], vld1q_dup_s32( &NSQ->sAR2_Q14[ i ] ) ); - } - - offset_Q10 = silk_Quantization_Offsets_Q10[ psIndices->signalType >> 1 ][ psIndices->quantOffsetType ]; - smpl_buf_idx = 0; /* index of oldest samples */ - - decisionDelay = silk_min_int( DECISION_DELAY, psEncC->subfr_length ); - - /* For voiced frames limit the decision delay to lower than the pitch lag */ - if( psIndices->signalType == TYPE_VOICED ) { - opus_int pitch_min = pitchL[ 0 ]; - for( k = 1; k < psEncC->nb_subfr; k++ ) { - pitch_min = silk_min_int( pitch_min, pitchL[ k ] ); - } - decisionDelay = silk_min_int( decisionDelay, pitch_min - LTP_ORDER / 2 - 1 ); - } else { - if( lag > 0 ) { - decisionDelay = silk_min_int( decisionDelay, lag - LTP_ORDER / 2 - 1 ); - } - } - - if( psIndices->NLSFInterpCoef_Q2 == 4 ) { - LSF_interpolation_flag = 0; - } else { - LSF_interpolation_flag = 1; - } - - ALLOC( sLTP_Q15, psEncC->ltp_mem_length + psEncC->frame_length, opus_int32 ); - ALLOC( sLTP, psEncC->ltp_mem_length + psEncC->frame_length, opus_int16 ); - ALLOC( x_sc_Q10, psEncC->subfr_length, opus_int32 ); - ALLOC( delayedGain_Q10, DECISION_DELAY, opus_int32 ); - /* Set up pointers to start of sub frame */ - pxq = &NSQ->xq[ psEncC->ltp_mem_length ]; - NSQ->sLTP_shp_buf_idx = psEncC->ltp_mem_length; - NSQ->sLTP_buf_idx = psEncC->ltp_mem_length; - subfr = 0; - for( k = 0; k < psEncC->nb_subfr; k++ ) { - A_Q12 = &PredCoef_Q12[ ( ( k >> 1 ) | ( 1 - LSF_interpolation_flag ) ) * MAX_LPC_ORDER ]; - B_Q14 = <PCoef_Q14[ k * LTP_ORDER ]; - AR_shp_Q13 = &AR_Q13[ k * MAX_SHAPE_LPC_ORDER ]; - - /* Noise shape parameters */ - silk_assert( HarmShapeGain_Q14[ k ] >= 0 ); - HarmShapeFIRPacked_Q14 = silk_RSHIFT( HarmShapeGain_Q14[ k ], 2 ); - HarmShapeFIRPacked_Q14 |= silk_LSHIFT( (opus_int32)silk_RSHIFT( HarmShapeGain_Q14[ k ], 1 ), 16 ); - - NSQ->rewhite_flag = 0; - if( psIndices->signalType == TYPE_VOICED ) { - /* Voiced */ - lag = pitchL[ k ]; - - /* Re-whitening */ - if( ( k & ( 3 - silk_LSHIFT( LSF_interpolation_flag, 1 ) ) ) == 0 ) { - if( k == 2 ) { - /* RESET DELAYED DECISIONS */ - /* Find winner */ - int32x4_t RD_Q10_s32x4; - RDmin_Q10 = psDelDec->RD_Q10[ 0 ]; - Winner_ind = 0; - for( i = 1; i < psEncC->nStatesDelayedDecision; i++ ) { - if( psDelDec->RD_Q10[ i ] < RDmin_Q10 ) { - RDmin_Q10 = psDelDec->RD_Q10[ i ]; - Winner_ind = i; - } - } - psDelDec->RD_Q10[ Winner_ind ] -= ( silk_int32_MAX >> 4 ); - RD_Q10_s32x4 = vld1q_s32( psDelDec->RD_Q10 ); - RD_Q10_s32x4 = vaddq_s32( RD_Q10_s32x4, vdupq_n_s32( silk_int32_MAX >> 4 ) ); - vst1q_s32( psDelDec->RD_Q10, RD_Q10_s32x4 ); - - /* Copy final part of signals from winner state to output and long-term filter states */ - copy_winner_state( psDelDec, decisionDelay, smpl_buf_idx, Winner_ind, Gains_Q16[ 1 ], 14, pulses, pxq, NSQ ); - - subfr = 0; - } - - /* Rewhiten with new A coefs */ - start_idx = psEncC->ltp_mem_length - lag - psEncC->predictLPCOrder - LTP_ORDER / 2; - silk_assert( start_idx > 0 ); - - silk_LPC_analysis_filter( &sLTP[ start_idx ], &NSQ->xq[ start_idx + k * psEncC->subfr_length ], - A_Q12, psEncC->ltp_mem_length - start_idx, psEncC->predictLPCOrder, psEncC->arch ); - - NSQ->sLTP_buf_idx = psEncC->ltp_mem_length; - NSQ->rewhite_flag = 1; - } - } - - silk_nsq_del_dec_scale_states_neon( psEncC, NSQ, psDelDec, x16, x_sc_Q10, sLTP, sLTP_Q15, k, - LTP_scale_Q14, Gains_Q16, pitchL, psIndices->signalType, decisionDelay ); - - silk_noise_shape_quantizer_del_dec_neon( NSQ, psDelDec, psIndices->signalType, x_sc_Q10, pulses, pxq, sLTP_Q15, - delayedGain_Q10, A_Q12, B_Q14, AR_shp_Q13, lag, HarmShapeFIRPacked_Q14, Tilt_Q14[ k ], LF_shp_Q14[ k ], - Gains_Q16[ k ], Lambda_Q10, offset_Q10, psEncC->subfr_length, subfr++, psEncC->shapingLPCOrder, - psEncC->predictLPCOrder, psEncC->warping_Q16, psEncC->nStatesDelayedDecision, &smpl_buf_idx, decisionDelay ); - - x16 += psEncC->subfr_length; - pulses += psEncC->subfr_length; - pxq += psEncC->subfr_length; - } - - /* Find winner */ - RDmin_Q10 = psDelDec->RD_Q10[ 0 ]; - Winner_ind = 0; - for( k = 1; k < psEncC->nStatesDelayedDecision; k++ ) { - if( psDelDec->RD_Q10[ k ] < RDmin_Q10 ) { - RDmin_Q10 = psDelDec->RD_Q10[ k ]; - Winner_ind = k; - } - } - - /* Copy final part of signals from winner state to output and long-term filter states */ - psIndices->Seed = psDelDec->SeedInit[ Winner_ind ]; - Gain_Q10 = silk_RSHIFT32( Gains_Q16[ psEncC->nb_subfr - 1 ], 6 ); - copy_winner_state( psDelDec, decisionDelay, smpl_buf_idx, Winner_ind, Gain_Q10, 8, pulses, pxq, NSQ ); - - t_s32x4 = vdupq_n_s32( 0 ); /* initialization */ - for( i = 0; i < ( NSQ_LPC_BUF_LENGTH - 3 ); i += 4 ) { - t_s32x4 = vld1q_lane_s32( &psDelDec->sLPC_Q14[ i + 0 ][ Winner_ind ], t_s32x4, 0 ); - t_s32x4 = vld1q_lane_s32( &psDelDec->sLPC_Q14[ i + 1 ][ Winner_ind ], t_s32x4, 1 ); - t_s32x4 = vld1q_lane_s32( &psDelDec->sLPC_Q14[ i + 2 ][ Winner_ind ], t_s32x4, 2 ); - t_s32x4 = vld1q_lane_s32( &psDelDec->sLPC_Q14[ i + 3 ][ Winner_ind ], t_s32x4, 3 ); - vst1q_s32( &NSQ->sLPC_Q14[ i ], t_s32x4 ); - } - - for( ; i < NSQ_LPC_BUF_LENGTH; i++ ) { - NSQ->sLPC_Q14[ i ] = psDelDec->sLPC_Q14[ i ][ Winner_ind ]; - } - - for( i = 0; i < (opus_int)( sizeof( NSQ->sAR2_Q14 ) / sizeof( NSQ->sAR2_Q14[ 0 ] ) - 3 ); i += 4 ) { - t_s32x4 = vld1q_lane_s32( &psDelDec->sAR2_Q14[ i + 0 ][ Winner_ind ], t_s32x4, 0 ); - t_s32x4 = vld1q_lane_s32( &psDelDec->sAR2_Q14[ i + 1 ][ Winner_ind ], t_s32x4, 1 ); - t_s32x4 = vld1q_lane_s32( &psDelDec->sAR2_Q14[ i + 2 ][ Winner_ind ], t_s32x4, 2 ); - t_s32x4 = vld1q_lane_s32( &psDelDec->sAR2_Q14[ i + 3 ][ Winner_ind ], t_s32x4, 3 ); - vst1q_s32( &NSQ->sAR2_Q14[ i ], t_s32x4 ); - } - - for( ; i < (opus_int)( sizeof( NSQ->sAR2_Q14 ) / sizeof( NSQ->sAR2_Q14[ 0 ] ) ); i++ ) { - NSQ->sAR2_Q14[ i ] = psDelDec->sAR2_Q14[ i ][ Winner_ind ]; - } - - /* Update states */ - NSQ->sLF_AR_shp_Q14 = psDelDec->LF_AR_Q14[ Winner_ind ]; - NSQ->sDiff_shp_Q14 = psDelDec->Diff_Q14[ Winner_ind ]; - NSQ->lagPrev = pitchL[ psEncC->nb_subfr - 1 ]; - - /* Save quantized speech signal */ - silk_memmove( NSQ->xq, &NSQ->xq[ psEncC->frame_length ], psEncC->ltp_mem_length * sizeof( opus_int16 ) ); - silk_memmove( NSQ->sLTP_shp_Q14, &NSQ->sLTP_shp_Q14[ psEncC->frame_length ], psEncC->ltp_mem_length * sizeof( opus_int32 ) ); - RESTORE_STACK; - } - -#ifdef OPUS_CHECK_ASM - silk_assert( !memcmp( &NSQ_c, NSQ, sizeof( NSQ_c ) ) ); - silk_assert( !memcmp( &psIndices_c, psIndices, sizeof( psIndices_c ) ) ); - silk_assert( !memcmp( pulses_c, pulses_a, sizeof( pulses_c ) ) ); -#endif -} - -/******************************************/ -/* Noise shape quantizer for one subframe */ -/******************************************/ -/* Note: Function silk_short_prediction_create_arch_coef_neon() defined in NSQ_neon.h is actually a hacking C function. */ -/* Therefore here we append "_local" to the NEON function name to avoid confusion. */ -static OPUS_INLINE void silk_short_prediction_create_arch_coef_neon_local(opus_int32 *out, const opus_int16 *in, opus_int order) -{ - int16x8_t t_s16x8; - int32x4_t t0_s32x4, t1_s32x4, t2_s32x4, t3_s32x4; - silk_assert( order == 10 || order == 16 ); - - t_s16x8 = vld1q_s16( in + 0 ); /* 7 6 5 4 3 2 1 0 */ - t_s16x8 = vrev64q_s16( t_s16x8 ); /* 4 5 6 7 0 1 2 3 */ - t2_s32x4 = vshll_n_s16( vget_high_s16( t_s16x8 ), 15 ); /* 4 5 6 7 */ - t3_s32x4 = vshll_n_s16( vget_low_s16( t_s16x8 ), 15 ); /* 0 1 2 3 */ - - if( order == 16 ) { - t_s16x8 = vld1q_s16( in + 8 ); /* F E D C B A 9 8 */ - t_s16x8 = vrev64q_s16( t_s16x8 ); /* C D E F 8 9 A B */ - t0_s32x4 = vshll_n_s16( vget_high_s16( t_s16x8 ), 15 ); /* C D E F */ - t1_s32x4 = vshll_n_s16( vget_low_s16( t_s16x8 ), 15 ); /* 8 9 A B */ - } else { - int16x4_t t_s16x4; - - t0_s32x4 = vdupq_n_s32( 0 ); /* zero zero zero zero */ - t_s16x4 = vld1_s16( in + 6 ); /* 9 8 7 6 */ - t_s16x4 = vrev64_s16( t_s16x4 ); /* 6 7 8 9 */ - t1_s32x4 = vshll_n_s16( t_s16x4, 15 ); - t1_s32x4 = vcombine_s32( vget_low_s32(t0_s32x4), vget_low_s32( t1_s32x4 ) ); /* 8 9 zero zero */ - } - vst1q_s32( out + 0, t0_s32x4 ); - vst1q_s32( out + 4, t1_s32x4 ); - vst1q_s32( out + 8, t2_s32x4 ); - vst1q_s32( out + 12, t3_s32x4 ); -} - -static OPUS_INLINE int32x4_t silk_SMLAWB_lane0_neon( - const int32x4_t out_s32x4, - const int32x4_t in_s32x4, - const int32x2_t coef_s32x2 -) -{ - return vaddq_s32( out_s32x4, vqdmulhq_lane_s32( in_s32x4, coef_s32x2, 0 ) ); -} - -static OPUS_INLINE int32x4_t silk_SMLAWB_lane1_neon( - const int32x4_t out_s32x4, - const int32x4_t in_s32x4, - const int32x2_t coef_s32x2 -) -{ - return vaddq_s32( out_s32x4, vqdmulhq_lane_s32( in_s32x4, coef_s32x2, 1 ) ); -} - -/* Note: This function has different return value than silk_noise_shape_quantizer_short_prediction_neon(). */ -/* Therefore here we append "_local" to the function name to avoid confusion. */ -static OPUS_INLINE int32x4_t silk_noise_shape_quantizer_short_prediction_neon_local(const opus_int32 *buf32, const opus_int32 *a_Q12_arch, opus_int order) -{ - const int32x4_t a_Q12_arch0_s32x4 = vld1q_s32( a_Q12_arch + 0 ); - const int32x4_t a_Q12_arch1_s32x4 = vld1q_s32( a_Q12_arch + 4 ); - const int32x4_t a_Q12_arch2_s32x4 = vld1q_s32( a_Q12_arch + 8 ); - const int32x4_t a_Q12_arch3_s32x4 = vld1q_s32( a_Q12_arch + 12 ); - int32x4_t LPC_pred_Q14_s32x4; - - silk_assert( order == 10 || order == 16 ); - /* Avoids introducing a bias because silk_SMLAWB() always rounds to -inf */ - LPC_pred_Q14_s32x4 = vdupq_n_s32( silk_RSHIFT( order, 1 ) ); - LPC_pred_Q14_s32x4 = silk_SMLAWB_lane0_neon( LPC_pred_Q14_s32x4, vld1q_s32( buf32 + 0 * NEON_MAX_DEL_DEC_STATES ), vget_low_s32( a_Q12_arch0_s32x4 ) ); - LPC_pred_Q14_s32x4 = silk_SMLAWB_lane1_neon( LPC_pred_Q14_s32x4, vld1q_s32( buf32 + 1 * NEON_MAX_DEL_DEC_STATES ), vget_low_s32( a_Q12_arch0_s32x4 ) ); - LPC_pred_Q14_s32x4 = silk_SMLAWB_lane0_neon( LPC_pred_Q14_s32x4, vld1q_s32( buf32 + 2 * NEON_MAX_DEL_DEC_STATES ), vget_high_s32( a_Q12_arch0_s32x4 ) ); - LPC_pred_Q14_s32x4 = silk_SMLAWB_lane1_neon( LPC_pred_Q14_s32x4, vld1q_s32( buf32 + 3 * NEON_MAX_DEL_DEC_STATES ), vget_high_s32( a_Q12_arch0_s32x4 ) ); - LPC_pred_Q14_s32x4 = silk_SMLAWB_lane0_neon( LPC_pred_Q14_s32x4, vld1q_s32( buf32 + 4 * NEON_MAX_DEL_DEC_STATES ), vget_low_s32( a_Q12_arch1_s32x4 ) ); - LPC_pred_Q14_s32x4 = silk_SMLAWB_lane1_neon( LPC_pred_Q14_s32x4, vld1q_s32( buf32 + 5 * NEON_MAX_DEL_DEC_STATES ), vget_low_s32( a_Q12_arch1_s32x4 ) ); - LPC_pred_Q14_s32x4 = silk_SMLAWB_lane0_neon( LPC_pred_Q14_s32x4, vld1q_s32( buf32 + 6 * NEON_MAX_DEL_DEC_STATES ), vget_high_s32( a_Q12_arch1_s32x4 ) ); - LPC_pred_Q14_s32x4 = silk_SMLAWB_lane1_neon( LPC_pred_Q14_s32x4, vld1q_s32( buf32 + 7 * NEON_MAX_DEL_DEC_STATES ), vget_high_s32( a_Q12_arch1_s32x4 ) ); - LPC_pred_Q14_s32x4 = silk_SMLAWB_lane0_neon( LPC_pred_Q14_s32x4, vld1q_s32( buf32 + 8 * NEON_MAX_DEL_DEC_STATES ), vget_low_s32( a_Q12_arch2_s32x4 ) ); - LPC_pred_Q14_s32x4 = silk_SMLAWB_lane1_neon( LPC_pred_Q14_s32x4, vld1q_s32( buf32 + 9 * NEON_MAX_DEL_DEC_STATES ), vget_low_s32( a_Q12_arch2_s32x4 ) ); - LPC_pred_Q14_s32x4 = silk_SMLAWB_lane0_neon( LPC_pred_Q14_s32x4, vld1q_s32( buf32 + 10 * NEON_MAX_DEL_DEC_STATES ), vget_high_s32( a_Q12_arch2_s32x4 ) ); - LPC_pred_Q14_s32x4 = silk_SMLAWB_lane1_neon( LPC_pred_Q14_s32x4, vld1q_s32( buf32 + 11 * NEON_MAX_DEL_DEC_STATES ), vget_high_s32( a_Q12_arch2_s32x4 ) ); - LPC_pred_Q14_s32x4 = silk_SMLAWB_lane0_neon( LPC_pred_Q14_s32x4, vld1q_s32( buf32 + 12 * NEON_MAX_DEL_DEC_STATES ), vget_low_s32( a_Q12_arch3_s32x4 ) ); - LPC_pred_Q14_s32x4 = silk_SMLAWB_lane1_neon( LPC_pred_Q14_s32x4, vld1q_s32( buf32 + 13 * NEON_MAX_DEL_DEC_STATES ), vget_low_s32( a_Q12_arch3_s32x4 ) ); - LPC_pred_Q14_s32x4 = silk_SMLAWB_lane0_neon( LPC_pred_Q14_s32x4, vld1q_s32( buf32 + 14 * NEON_MAX_DEL_DEC_STATES ), vget_high_s32( a_Q12_arch3_s32x4 ) ); - LPC_pred_Q14_s32x4 = silk_SMLAWB_lane1_neon( LPC_pred_Q14_s32x4, vld1q_s32( buf32 + 15 * NEON_MAX_DEL_DEC_STATES ), vget_high_s32( a_Q12_arch3_s32x4 ) ); - - return LPC_pred_Q14_s32x4; -} - -static OPUS_INLINE void silk_noise_shape_quantizer_del_dec_neon( - silk_nsq_state *NSQ, /* I/O NSQ state */ - NSQ_del_decs_struct psDelDec[], /* I/O Delayed decision states */ - opus_int signalType, /* I Signal type */ - const opus_int32 x_Q10[], /* I */ - opus_int8 pulses[], /* O */ - opus_int16 xq[], /* O */ - opus_int32 sLTP_Q15[], /* I/O LTP filter state */ - opus_int32 delayedGain_Q10[], /* I/O Gain delay buffer */ - const opus_int16 a_Q12[], /* I Short term prediction coefs */ - const opus_int16 b_Q14[], /* I Long term prediction coefs */ - const opus_int16 AR_shp_Q13[], /* I Noise shaping coefs */ - opus_int lag, /* I Pitch lag */ - opus_int32 HarmShapeFIRPacked_Q14, /* I */ - opus_int Tilt_Q14, /* I Spectral tilt */ - opus_int32 LF_shp_Q14, /* I */ - opus_int32 Gain_Q16, /* I */ - opus_int Lambda_Q10, /* I */ - opus_int offset_Q10, /* I */ - opus_int length, /* I Input length */ - opus_int subfr, /* I Subframe number */ - opus_int shapingLPCOrder, /* I Shaping LPC filter order */ - opus_int predictLPCOrder, /* I Prediction filter order */ - opus_int warping_Q16, /* I */ - opus_int nStatesDelayedDecision, /* I Number of states in decision tree */ - opus_int *smpl_buf_idx, /* I/O Index to newest samples in buffers */ - opus_int decisionDelay /* I */ -) -{ - opus_int i, j, k, Winner_ind, RDmin_ind, RDmax_ind, last_smple_idx; - opus_int32 Winner_rand_state; - opus_int32 LTP_pred_Q14, n_LTP_Q14; - opus_int32 RDmin_Q10, RDmax_Q10; - opus_int32 Gain_Q10; - opus_int32 *pred_lag_ptr, *shp_lag_ptr; - opus_int32 a_Q12_arch[MAX_LPC_ORDER]; - const int32x2_t warping_Q16_s32x2 = vdup_n_s32( silk_LSHIFT32( warping_Q16, 16 ) >> 1 ); - const opus_int32 LF_shp_Q29 = silk_LSHIFT32( LF_shp_Q14, 16 ) >> 1; - opus_int32 AR_shp_Q28[ MAX_SHAPE_LPC_ORDER ]; - const uint32x4_t rand_multiplier_u32x4 = vdupq_n_u32( RAND_MULTIPLIER ); - const uint32x4_t rand_increment_u32x4 = vdupq_n_u32( RAND_INCREMENT ); - - VARDECL( NSQ_samples_struct, psSampleState ); - SAVE_STACK; - - silk_assert( nStatesDelayedDecision > 0 ); - silk_assert( ( shapingLPCOrder & 1 ) == 0 ); /* check that order is even */ - ALLOC( psSampleState, 2, NSQ_samples_struct ); - - shp_lag_ptr = &NSQ->sLTP_shp_Q14[ NSQ->sLTP_shp_buf_idx - lag + HARM_SHAPE_FIR_TAPS / 2 ]; - pred_lag_ptr = &sLTP_Q15[ NSQ->sLTP_buf_idx - lag + LTP_ORDER / 2 ]; - Gain_Q10 = silk_RSHIFT( Gain_Q16, 6 ); - - for( i = 0; i < ( MAX_SHAPE_LPC_ORDER - 7 ); i += 8 ) { - const int16x8_t t_s16x8 = vld1q_s16( AR_shp_Q13 + i ); - vst1q_s32( AR_shp_Q28 + i + 0, vshll_n_s16( vget_low_s16( t_s16x8 ), 15 ) ); - vst1q_s32( AR_shp_Q28 + i + 4, vshll_n_s16( vget_high_s16( t_s16x8 ), 15 ) ); - } - - for( ; i < MAX_SHAPE_LPC_ORDER; i++ ) { - AR_shp_Q28[i] = silk_LSHIFT32( AR_shp_Q13[i], 15 ); - } - - silk_short_prediction_create_arch_coef_neon_local( a_Q12_arch, a_Q12, predictLPCOrder ); - - for( i = 0; i < length; i++ ) { - int32x4_t Seed_s32x4, LPC_pred_Q14_s32x4; - int32x4_t sign_s32x4, tmp1_s32x4, tmp2_s32x4; - int32x4_t n_AR_Q14_s32x4, n_LF_Q14_s32x4; - int32x2_t AR_shp_Q28_s32x2; - int16x4_t r_Q10_s16x4, rr_Q10_s16x4; - - /* Perform common calculations used in all states */ - - /* Long-term prediction */ - if( signalType == TYPE_VOICED ) { - /* Unrolled loop */ - /* Avoids introducing a bias because silk_SMLAWB() always rounds to -inf */ - LTP_pred_Q14 = 2; - LTP_pred_Q14 = silk_SMLAWB( LTP_pred_Q14, pred_lag_ptr[ 0 ], b_Q14[ 0 ] ); - LTP_pred_Q14 = silk_SMLAWB( LTP_pred_Q14, pred_lag_ptr[ -1 ], b_Q14[ 1 ] ); - LTP_pred_Q14 = silk_SMLAWB( LTP_pred_Q14, pred_lag_ptr[ -2 ], b_Q14[ 2 ] ); - LTP_pred_Q14 = silk_SMLAWB( LTP_pred_Q14, pred_lag_ptr[ -3 ], b_Q14[ 3 ] ); - LTP_pred_Q14 = silk_SMLAWB( LTP_pred_Q14, pred_lag_ptr[ -4 ], b_Q14[ 4 ] ); - LTP_pred_Q14 = silk_LSHIFT( LTP_pred_Q14, 1 ); /* Q13 -> Q14 */ - pred_lag_ptr++; - } else { - LTP_pred_Q14 = 0; - } - - /* Long-term shaping */ - if( lag > 0 ) { - /* Symmetric, packed FIR coefficients */ - n_LTP_Q14 = silk_SMULWB( silk_ADD32( shp_lag_ptr[ 0 ], shp_lag_ptr[ -2 ] ), HarmShapeFIRPacked_Q14 ); - n_LTP_Q14 = silk_SMLAWT( n_LTP_Q14, shp_lag_ptr[ -1 ], HarmShapeFIRPacked_Q14 ); - n_LTP_Q14 = silk_SUB_LSHIFT32( LTP_pred_Q14, n_LTP_Q14, 2 ); /* Q12 -> Q14 */ - shp_lag_ptr++; - } else { - n_LTP_Q14 = 0; - } - - /* Generate dither */ - Seed_s32x4 = vld1q_s32( psDelDec->Seed ); - Seed_s32x4 = vreinterpretq_s32_u32( vmlaq_u32( rand_increment_u32x4, vreinterpretq_u32_s32( Seed_s32x4 ), rand_multiplier_u32x4 ) ); - vst1q_s32( psDelDec->Seed, Seed_s32x4 ); - - /* Short-term prediction */ - LPC_pred_Q14_s32x4 = silk_noise_shape_quantizer_short_prediction_neon_local(psDelDec->sLPC_Q14[ NSQ_LPC_BUF_LENGTH - 16 + i ], a_Q12_arch, predictLPCOrder); - LPC_pred_Q14_s32x4 = vshlq_n_s32( LPC_pred_Q14_s32x4, 4 ); /* Q10 -> Q14 */ - - /* Noise shape feedback */ - /* Output of lowpass section */ - tmp2_s32x4 = silk_SMLAWB_lane0_neon( vld1q_s32( psDelDec->Diff_Q14 ), vld1q_s32( psDelDec->sAR2_Q14[ 0 ] ), warping_Q16_s32x2 ); - /* Output of allpass section */ - tmp1_s32x4 = vsubq_s32( vld1q_s32( psDelDec->sAR2_Q14[ 1 ] ), tmp2_s32x4 ); - tmp1_s32x4 = silk_SMLAWB_lane0_neon( vld1q_s32( psDelDec->sAR2_Q14[ 0 ] ), tmp1_s32x4, warping_Q16_s32x2 ); - vst1q_s32( psDelDec->sAR2_Q14[ 0 ], tmp2_s32x4 ); - AR_shp_Q28_s32x2 = vld1_s32( AR_shp_Q28 ); - n_AR_Q14_s32x4 = vaddq_s32( vdupq_n_s32( silk_RSHIFT( shapingLPCOrder, 1 ) ), vqdmulhq_lane_s32( tmp2_s32x4, AR_shp_Q28_s32x2, 0 ) ); - - /* Loop over allpass sections */ - for( j = 2; j < shapingLPCOrder; j += 2 ) { - /* Output of allpass section */ - tmp2_s32x4 = vsubq_s32( vld1q_s32( psDelDec->sAR2_Q14[ j + 0 ] ), tmp1_s32x4 ); - tmp2_s32x4 = silk_SMLAWB_lane0_neon( vld1q_s32( psDelDec->sAR2_Q14[ j - 1 ] ), tmp2_s32x4, warping_Q16_s32x2 ); - vst1q_s32( psDelDec->sAR2_Q14[ j - 1 ], tmp1_s32x4 ); - n_AR_Q14_s32x4 = vaddq_s32( n_AR_Q14_s32x4, vqdmulhq_lane_s32( tmp1_s32x4, AR_shp_Q28_s32x2, 1 ) ); - /* Output of allpass section */ - tmp1_s32x4 = vsubq_s32( vld1q_s32( psDelDec->sAR2_Q14[ j + 1 ] ), tmp2_s32x4 ); - tmp1_s32x4 = silk_SMLAWB_lane0_neon( vld1q_s32( psDelDec->sAR2_Q14[ j + 0 ] ), tmp1_s32x4, warping_Q16_s32x2 ); - vst1q_s32( psDelDec->sAR2_Q14[ j + 0 ], tmp2_s32x4 ); - AR_shp_Q28_s32x2 = vld1_s32( &AR_shp_Q28[ j ] ); - n_AR_Q14_s32x4 = vaddq_s32( n_AR_Q14_s32x4, vqdmulhq_lane_s32( tmp2_s32x4, AR_shp_Q28_s32x2, 0 ) ); - } - vst1q_s32( psDelDec->sAR2_Q14[ shapingLPCOrder - 1 ], tmp1_s32x4 ); - n_AR_Q14_s32x4 = vaddq_s32( n_AR_Q14_s32x4, vqdmulhq_lane_s32( tmp1_s32x4, AR_shp_Q28_s32x2, 1 ) ); - n_AR_Q14_s32x4 = vshlq_n_s32( n_AR_Q14_s32x4, 1 ); /* Q11 -> Q12 */ - n_AR_Q14_s32x4 = vaddq_s32( n_AR_Q14_s32x4, vqdmulhq_n_s32( vld1q_s32( psDelDec->LF_AR_Q14 ), silk_LSHIFT32( Tilt_Q14, 16 ) >> 1 ) ); /* Q12 */ - n_AR_Q14_s32x4 = vshlq_n_s32( n_AR_Q14_s32x4, 2 ); /* Q12 -> Q14 */ - n_LF_Q14_s32x4 = vqdmulhq_n_s32( vld1q_s32( psDelDec->Shape_Q14[ *smpl_buf_idx ] ), LF_shp_Q29 ); /* Q12 */ - n_LF_Q14_s32x4 = vaddq_s32( n_LF_Q14_s32x4, vqdmulhq_n_s32( vld1q_s32( psDelDec->LF_AR_Q14 ), silk_LSHIFT32( LF_shp_Q14 >> 16 , 15 ) ) ); /* Q12 */ - n_LF_Q14_s32x4 = vshlq_n_s32( n_LF_Q14_s32x4, 2 ); /* Q12 -> Q14 */ - - /* Input minus prediction plus noise feedback */ - /* r = x[ i ] - LTP_pred - LPC_pred + n_AR + n_Tilt + n_LF + n_LTP */ - tmp1_s32x4 = vaddq_s32( n_AR_Q14_s32x4, n_LF_Q14_s32x4 ); /* Q14 */ - tmp2_s32x4 = vaddq_s32( vdupq_n_s32( n_LTP_Q14 ), LPC_pred_Q14_s32x4 ); /* Q13 */ - tmp1_s32x4 = vsubq_s32( tmp2_s32x4, tmp1_s32x4 ); /* Q13 */ - tmp1_s32x4 = vrshrq_n_s32( tmp1_s32x4, 4 ); /* Q10 */ - tmp1_s32x4 = vsubq_s32( vdupq_n_s32( x_Q10[ i ] ), tmp1_s32x4 ); /* residual error Q10 */ - - /* Flip sign depending on dither */ - sign_s32x4 = vreinterpretq_s32_u32( vcltq_s32( Seed_s32x4, vdupq_n_s32( 0 ) ) ); - tmp1_s32x4 = veorq_s32( tmp1_s32x4, sign_s32x4 ); - tmp1_s32x4 = vsubq_s32( tmp1_s32x4, sign_s32x4 ); - tmp1_s32x4 = vmaxq_s32( tmp1_s32x4, vdupq_n_s32( -( 31 << 10 ) ) ); - tmp1_s32x4 = vminq_s32( tmp1_s32x4, vdupq_n_s32( 30 << 10 ) ); - r_Q10_s16x4 = vmovn_s32( tmp1_s32x4 ); - - /* Find two quantization level candidates and measure their rate-distortion */ - { - int16x4_t q1_Q10_s16x4 = vsub_s16( r_Q10_s16x4, vdup_n_s16( offset_Q10 ) ); - int16x4_t q1_Q0_s16x4 = vshr_n_s16( q1_Q10_s16x4, 10 ); - int16x4_t q2_Q10_s16x4; - int32x4_t rd1_Q10_s32x4, rd2_Q10_s32x4; - uint32x4_t t_u32x4; - - if( Lambda_Q10 > 2048 ) { - /* For aggressive RDO, the bias becomes more than one pulse. */ - const int rdo_offset = Lambda_Q10/2 - 512; - const uint16x4_t greaterThanRdo = vcgt_s16( q1_Q10_s16x4, vdup_n_s16( rdo_offset ) ); - const uint16x4_t lessThanMinusRdo = vclt_s16( q1_Q10_s16x4, vdup_n_s16( -rdo_offset ) ); - /* If Lambda_Q10 > 32767, then q1_Q0, q1_Q10 and q2_Q10 must change to 32-bit. */ - silk_assert( Lambda_Q10 <= 32767 ); - - q1_Q0_s16x4 = vreinterpret_s16_u16( vclt_s16( q1_Q10_s16x4, vdup_n_s16( 0 ) ) ); - q1_Q0_s16x4 = vbsl_s16( greaterThanRdo, vsub_s16( q1_Q10_s16x4, vdup_n_s16( rdo_offset ) ), q1_Q0_s16x4 ); - q1_Q0_s16x4 = vbsl_s16( lessThanMinusRdo, vadd_s16( q1_Q10_s16x4, vdup_n_s16( rdo_offset ) ), q1_Q0_s16x4 ); - q1_Q0_s16x4 = vshr_n_s16( q1_Q0_s16x4, 10 ); - } - { - const uint16x4_t equal0_u16x4 = vceq_s16( q1_Q0_s16x4, vdup_n_s16( 0 ) ); - const uint16x4_t equalMinus1_u16x4 = vceq_s16( q1_Q0_s16x4, vdup_n_s16( -1 ) ); - const uint16x4_t lessThanMinus1_u16x4 = vclt_s16( q1_Q0_s16x4, vdup_n_s16( -1 ) ); - int16x4_t tmp1_s16x4, tmp2_s16x4; - - q1_Q10_s16x4 = vshl_n_s16( q1_Q0_s16x4, 10 ); - tmp1_s16x4 = vadd_s16( q1_Q10_s16x4, vdup_n_s16( offset_Q10 - QUANT_LEVEL_ADJUST_Q10 ) ); - q1_Q10_s16x4 = vadd_s16( q1_Q10_s16x4, vdup_n_s16( offset_Q10 + QUANT_LEVEL_ADJUST_Q10 ) ); - q1_Q10_s16x4 = vbsl_s16( lessThanMinus1_u16x4, q1_Q10_s16x4, tmp1_s16x4 ); - q1_Q10_s16x4 = vbsl_s16( equal0_u16x4, vdup_n_s16( offset_Q10 ), q1_Q10_s16x4 ); - q1_Q10_s16x4 = vbsl_s16( equalMinus1_u16x4, vdup_n_s16( offset_Q10 - ( 1024 - QUANT_LEVEL_ADJUST_Q10 ) ), q1_Q10_s16x4 ); - q2_Q10_s16x4 = vadd_s16( q1_Q10_s16x4, vdup_n_s16( 1024 ) ); - q2_Q10_s16x4 = vbsl_s16( equal0_u16x4, vdup_n_s16( offset_Q10 + 1024 - QUANT_LEVEL_ADJUST_Q10 ), q2_Q10_s16x4 ); - q2_Q10_s16x4 = vbsl_s16( equalMinus1_u16x4, vdup_n_s16( offset_Q10 ), q2_Q10_s16x4 ); - tmp1_s16x4 = q1_Q10_s16x4; - tmp2_s16x4 = q2_Q10_s16x4; - tmp1_s16x4 = vbsl_s16( vorr_u16( equalMinus1_u16x4, lessThanMinus1_u16x4 ), vneg_s16( tmp1_s16x4 ), tmp1_s16x4 ); - tmp2_s16x4 = vbsl_s16( lessThanMinus1_u16x4, vneg_s16( tmp2_s16x4 ), tmp2_s16x4 ); - rd1_Q10_s32x4 = vmull_s16( tmp1_s16x4, vdup_n_s16( Lambda_Q10 ) ); - rd2_Q10_s32x4 = vmull_s16( tmp2_s16x4, vdup_n_s16( Lambda_Q10 ) ); - } - - rr_Q10_s16x4 = vsub_s16( r_Q10_s16x4, q1_Q10_s16x4 ); - rd1_Q10_s32x4 = vmlal_s16( rd1_Q10_s32x4, rr_Q10_s16x4, rr_Q10_s16x4 ); - rd1_Q10_s32x4 = vshrq_n_s32( rd1_Q10_s32x4, 10 ); - - rr_Q10_s16x4 = vsub_s16( r_Q10_s16x4, q2_Q10_s16x4 ); - rd2_Q10_s32x4 = vmlal_s16( rd2_Q10_s32x4, rr_Q10_s16x4, rr_Q10_s16x4 ); - rd2_Q10_s32x4 = vshrq_n_s32( rd2_Q10_s32x4, 10 ); - - tmp2_s32x4 = vld1q_s32( psDelDec->RD_Q10 ); - tmp1_s32x4 = vaddq_s32( tmp2_s32x4, vminq_s32( rd1_Q10_s32x4, rd2_Q10_s32x4 ) ); - tmp2_s32x4 = vaddq_s32( tmp2_s32x4, vmaxq_s32( rd1_Q10_s32x4, rd2_Q10_s32x4 ) ); - vst1q_s32( psSampleState[ 0 ].RD_Q10, tmp1_s32x4 ); - vst1q_s32( psSampleState[ 1 ].RD_Q10, tmp2_s32x4 ); - t_u32x4 = vcltq_s32( rd1_Q10_s32x4, rd2_Q10_s32x4 ); - tmp1_s32x4 = vbslq_s32( t_u32x4, vmovl_s16( q1_Q10_s16x4 ), vmovl_s16( q2_Q10_s16x4 ) ); - tmp2_s32x4 = vbslq_s32( t_u32x4, vmovl_s16( q2_Q10_s16x4 ), vmovl_s16( q1_Q10_s16x4 ) ); - vst1q_s32( psSampleState[ 0 ].Q_Q10, tmp1_s32x4 ); - vst1q_s32( psSampleState[ 1 ].Q_Q10, tmp2_s32x4 ); - } - - { - /* Update states for best quantization */ - int32x4_t exc_Q14_s32x4, LPC_exc_Q14_s32x4, xq_Q14_s32x4, sLF_AR_shp_Q14_s32x4; - - /* Quantized excitation */ - exc_Q14_s32x4 = vshlq_n_s32( tmp1_s32x4, 4 ); - exc_Q14_s32x4 = veorq_s32( exc_Q14_s32x4, sign_s32x4 ); - exc_Q14_s32x4 = vsubq_s32( exc_Q14_s32x4, sign_s32x4 ); - - /* Add predictions */ - LPC_exc_Q14_s32x4 = vaddq_s32( exc_Q14_s32x4, vdupq_n_s32( LTP_pred_Q14 ) ); - xq_Q14_s32x4 = vaddq_s32( LPC_exc_Q14_s32x4, LPC_pred_Q14_s32x4 ); - - /* Update states */ - tmp1_s32x4 = vsubq_s32( xq_Q14_s32x4, vshlq_n_s32( vdupq_n_s32( x_Q10[ i ] ), 4 ) ); - vst1q_s32( psSampleState[ 0 ].Diff_Q14, tmp1_s32x4 ); - sLF_AR_shp_Q14_s32x4 = vsubq_s32( tmp1_s32x4, n_AR_Q14_s32x4 ); - vst1q_s32( psSampleState[ 0 ].sLTP_shp_Q14, vsubq_s32( sLF_AR_shp_Q14_s32x4, n_LF_Q14_s32x4 ) ); - vst1q_s32( psSampleState[ 0 ].LF_AR_Q14, sLF_AR_shp_Q14_s32x4 ); - vst1q_s32( psSampleState[ 0 ].LPC_exc_Q14, LPC_exc_Q14_s32x4 ); - vst1q_s32( psSampleState[ 0 ].xq_Q14, xq_Q14_s32x4 ); - - /* Quantized excitation */ - exc_Q14_s32x4 = vshlq_n_s32( tmp2_s32x4, 4 ); - exc_Q14_s32x4 = veorq_s32( exc_Q14_s32x4, sign_s32x4 ); - exc_Q14_s32x4 = vsubq_s32( exc_Q14_s32x4, sign_s32x4 ); - - /* Add predictions */ - LPC_exc_Q14_s32x4 = vaddq_s32( exc_Q14_s32x4, vdupq_n_s32( LTP_pred_Q14 ) ); - xq_Q14_s32x4 = vaddq_s32( LPC_exc_Q14_s32x4, LPC_pred_Q14_s32x4 ); - - /* Update states */ - tmp1_s32x4 = vsubq_s32( xq_Q14_s32x4, vshlq_n_s32( vdupq_n_s32( x_Q10[ i ] ), 4 ) ); - vst1q_s32( psSampleState[ 1 ].Diff_Q14, tmp1_s32x4 ); - sLF_AR_shp_Q14_s32x4 = vsubq_s32( tmp1_s32x4, n_AR_Q14_s32x4 ); - vst1q_s32( psSampleState[ 1 ].sLTP_shp_Q14, vsubq_s32( sLF_AR_shp_Q14_s32x4, n_LF_Q14_s32x4 ) ); - vst1q_s32( psSampleState[ 1 ].LF_AR_Q14, sLF_AR_shp_Q14_s32x4 ); - vst1q_s32( psSampleState[ 1 ].LPC_exc_Q14, LPC_exc_Q14_s32x4 ); - vst1q_s32( psSampleState[ 1 ].xq_Q14, xq_Q14_s32x4 ); - } - - *smpl_buf_idx = *smpl_buf_idx ? ( *smpl_buf_idx - 1 ) : ( DECISION_DELAY - 1); - last_smple_idx = *smpl_buf_idx + decisionDelay + DECISION_DELAY; - if( last_smple_idx >= DECISION_DELAY ) last_smple_idx -= DECISION_DELAY; - if( last_smple_idx >= DECISION_DELAY ) last_smple_idx -= DECISION_DELAY; - - /* Find winner */ - RDmin_Q10 = psSampleState[ 0 ].RD_Q10[ 0 ]; - Winner_ind = 0; - for( k = 1; k < nStatesDelayedDecision; k++ ) { - if( psSampleState[ 0 ].RD_Q10[ k ] < RDmin_Q10 ) { - RDmin_Q10 = psSampleState[ 0 ].RD_Q10[ k ]; - Winner_ind = k; - } - } - - /* Increase RD values of expired states */ - { - uint32x4_t t_u32x4; - Winner_rand_state = psDelDec->RandState[ last_smple_idx ][ Winner_ind ]; - t_u32x4 = vceqq_s32( vld1q_s32( psDelDec->RandState[ last_smple_idx ] ), vdupq_n_s32( Winner_rand_state ) ); - t_u32x4 = vmvnq_u32( t_u32x4 ); - t_u32x4 = vshrq_n_u32( t_u32x4, 5 ); - tmp1_s32x4 = vld1q_s32( psSampleState[ 0 ].RD_Q10 ); - tmp2_s32x4 = vld1q_s32( psSampleState[ 1 ].RD_Q10 ); - tmp1_s32x4 = vaddq_s32( tmp1_s32x4, vreinterpretq_s32_u32( t_u32x4 ) ); - tmp2_s32x4 = vaddq_s32( tmp2_s32x4, vreinterpretq_s32_u32( t_u32x4 ) ); - vst1q_s32( psSampleState[ 0 ].RD_Q10, tmp1_s32x4 ); - vst1q_s32( psSampleState[ 1 ].RD_Q10, tmp2_s32x4 ); - - /* Find worst in first set and best in second set */ - RDmax_Q10 = psSampleState[ 0 ].RD_Q10[ 0 ]; - RDmin_Q10 = psSampleState[ 1 ].RD_Q10[ 0 ]; - RDmax_ind = 0; - RDmin_ind = 0; - for( k = 1; k < nStatesDelayedDecision; k++ ) { - /* find worst in first set */ - if( psSampleState[ 0 ].RD_Q10[ k ] > RDmax_Q10 ) { - RDmax_Q10 = psSampleState[ 0 ].RD_Q10[ k ]; - RDmax_ind = k; - } - /* find best in second set */ - if( psSampleState[ 1 ].RD_Q10[ k ] < RDmin_Q10 ) { - RDmin_Q10 = psSampleState[ 1 ].RD_Q10[ k ]; - RDmin_ind = k; - } - } - } - - /* Replace a state if best from second set outperforms worst in first set */ - if( RDmin_Q10 < RDmax_Q10 ) { - opus_int32 (*ptr)[NEON_MAX_DEL_DEC_STATES] = psDelDec->RandState; - const int numOthers = (int)( ( sizeof( NSQ_del_decs_struct ) - sizeof( ( (NSQ_del_decs_struct *)0 )->sLPC_Q14 ) ) - / ( NEON_MAX_DEL_DEC_STATES * sizeof( opus_int32 ) ) ); - /* Only ( predictLPCOrder - 1 ) of sLPC_Q14 buffer need to be updated, though the first several */ - /* useless sLPC_Q14[] will be different comparing with C when predictLPCOrder < NSQ_LPC_BUF_LENGTH. */ - /* Here just update constant ( NSQ_LPC_BUF_LENGTH - 1 ) for simplicity. */ - for( j = i + 1; j < i + NSQ_LPC_BUF_LENGTH; j++ ) { - psDelDec->sLPC_Q14[ j ][ RDmax_ind ] = psDelDec->sLPC_Q14[ j ][ RDmin_ind ]; - } - for( j = 0; j < numOthers; j++ ) { - ptr[ j ][ RDmax_ind ] = ptr[ j ][ RDmin_ind ]; - } - - psSampleState[ 0 ].Q_Q10[ RDmax_ind ] = psSampleState[ 1 ].Q_Q10[ RDmin_ind ]; - psSampleState[ 0 ].RD_Q10[ RDmax_ind ] = psSampleState[ 1 ].RD_Q10[ RDmin_ind ]; - psSampleState[ 0 ].xq_Q14[ RDmax_ind ] = psSampleState[ 1 ].xq_Q14[ RDmin_ind ]; - psSampleState[ 0 ].LF_AR_Q14[ RDmax_ind ] = psSampleState[ 1 ].LF_AR_Q14[ RDmin_ind ]; - psSampleState[ 0 ].Diff_Q14[ RDmax_ind ] = psSampleState[ 1 ].Diff_Q14[ RDmin_ind ]; - psSampleState[ 0 ].sLTP_shp_Q14[ RDmax_ind ] = psSampleState[ 1 ].sLTP_shp_Q14[ RDmin_ind ]; - psSampleState[ 0 ].LPC_exc_Q14[ RDmax_ind ] = psSampleState[ 1 ].LPC_exc_Q14[ RDmin_ind ]; - } - - /* Write samples from winner to output and long-term filter states */ - if( subfr > 0 || i >= decisionDelay ) { - pulses[ i - decisionDelay ] = (opus_int8)silk_RSHIFT_ROUND( psDelDec->Q_Q10[ last_smple_idx ][ Winner_ind ], 10 ); - xq[ i - decisionDelay ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( - silk_SMULWW( psDelDec->Xq_Q14[ last_smple_idx ][ Winner_ind ], delayedGain_Q10[ last_smple_idx ] ), 8 ) ); - NSQ->sLTP_shp_Q14[ NSQ->sLTP_shp_buf_idx - decisionDelay ] = psDelDec->Shape_Q14[ last_smple_idx ][ Winner_ind ]; - sLTP_Q15[ NSQ->sLTP_buf_idx - decisionDelay ] = psDelDec->Pred_Q15[ last_smple_idx ][ Winner_ind ]; - } - NSQ->sLTP_shp_buf_idx++; - NSQ->sLTP_buf_idx++; - - /* Update states */ - vst1q_s32( psDelDec->LF_AR_Q14, vld1q_s32( psSampleState[ 0 ].LF_AR_Q14 ) ); - vst1q_s32( psDelDec->Diff_Q14, vld1q_s32( psSampleState[ 0 ].Diff_Q14 ) ); - vst1q_s32( psDelDec->sLPC_Q14[ NSQ_LPC_BUF_LENGTH + i ], vld1q_s32( psSampleState[ 0 ].xq_Q14 ) ); - vst1q_s32( psDelDec->Xq_Q14[ *smpl_buf_idx ], vld1q_s32( psSampleState[ 0 ].xq_Q14 ) ); - tmp1_s32x4 = vld1q_s32( psSampleState[ 0 ].Q_Q10 ); - vst1q_s32( psDelDec->Q_Q10[ *smpl_buf_idx ], tmp1_s32x4 ); - vst1q_s32( psDelDec->Pred_Q15[ *smpl_buf_idx ], vshlq_n_s32( vld1q_s32( psSampleState[ 0 ].LPC_exc_Q14 ), 1 ) ); - vst1q_s32( psDelDec->Shape_Q14[ *smpl_buf_idx ], vld1q_s32( psSampleState[ 0 ].sLTP_shp_Q14 ) ); - tmp1_s32x4 = vrshrq_n_s32( tmp1_s32x4, 10 ); - tmp1_s32x4 = vaddq_s32( vld1q_s32( psDelDec->Seed ), tmp1_s32x4 ); - vst1q_s32( psDelDec->Seed, tmp1_s32x4 ); - vst1q_s32( psDelDec->RandState[ *smpl_buf_idx ], tmp1_s32x4 ); - vst1q_s32( psDelDec->RD_Q10, vld1q_s32( psSampleState[ 0 ].RD_Q10 ) ); - delayedGain_Q10[ *smpl_buf_idx ] = Gain_Q10; - } - /* Update LPC states */ - silk_memcpy( psDelDec->sLPC_Q14[ 0 ], psDelDec->sLPC_Q14[ length ], NEON_MAX_DEL_DEC_STATES * NSQ_LPC_BUF_LENGTH * sizeof( opus_int32 ) ); - - RESTORE_STACK; -} - -static OPUS_INLINE void silk_SMULWB_8_neon( - const opus_int16 *a, - const int32x2_t b, - opus_int32 *o -) -{ - const int16x8_t a_s16x8 = vld1q_s16( a ); - int32x4_t o0_s32x4, o1_s32x4; - - o0_s32x4 = vshll_n_s16( vget_low_s16( a_s16x8 ), 15 ); - o1_s32x4 = vshll_n_s16( vget_high_s16( a_s16x8 ), 15 ); - o0_s32x4 = vqdmulhq_lane_s32( o0_s32x4, b, 0 ); - o1_s32x4 = vqdmulhq_lane_s32( o1_s32x4, b, 0 ); - vst1q_s32( o, o0_s32x4 ); - vst1q_s32( o + 4, o1_s32x4 ); -} - -/* Only works when ( b >= -65536 ) && ( b < 65536 ). */ -static OPUS_INLINE void silk_SMULWW_small_b_4_neon( - opus_int32 *a, - const int32x2_t b_s32x2) -{ - int32x4_t o_s32x4; - - o_s32x4 = vld1q_s32( a ); - o_s32x4 = vqdmulhq_lane_s32( o_s32x4, b_s32x2, 0 ); - vst1q_s32( a, o_s32x4 ); -} - -/* Only works when ( b >= -65536 ) && ( b < 65536 ). */ -static OPUS_INLINE void silk_SMULWW_small_b_8_neon( - opus_int32 *a, - const int32x2_t b_s32x2 -) -{ - int32x4_t o0_s32x4, o1_s32x4; - - o0_s32x4 = vld1q_s32( a ); - o1_s32x4 = vld1q_s32( a + 4 ); - o0_s32x4 = vqdmulhq_lane_s32( o0_s32x4, b_s32x2, 0 ); - o1_s32x4 = vqdmulhq_lane_s32( o1_s32x4, b_s32x2, 0 ); - vst1q_s32( a, o0_s32x4 ); - vst1q_s32( a + 4, o1_s32x4 ); -} - -static OPUS_INLINE void silk_SMULWW_4_neon( - opus_int32 *a, - const int32x2_t b_s32x2) -{ - int32x4_t a_s32x4, o_s32x4; - - a_s32x4 = vld1q_s32( a ); - o_s32x4 = vqdmulhq_lane_s32( a_s32x4, b_s32x2, 0 ); - o_s32x4 = vmlaq_lane_s32( o_s32x4, a_s32x4, b_s32x2, 1 ); - vst1q_s32( a, o_s32x4 ); -} - -static OPUS_INLINE void silk_SMULWW_8_neon( - opus_int32 *a, - const int32x2_t b_s32x2 -) -{ - int32x4_t a0_s32x4, a1_s32x4, o0_s32x4, o1_s32x4; - - a0_s32x4 = vld1q_s32( a ); - a1_s32x4 = vld1q_s32( a + 4 ); - o0_s32x4 = vqdmulhq_lane_s32( a0_s32x4, b_s32x2, 0 ); - o1_s32x4 = vqdmulhq_lane_s32( a1_s32x4, b_s32x2, 0 ); - o0_s32x4 = vmlaq_lane_s32( o0_s32x4, a0_s32x4, b_s32x2, 1 ); - o1_s32x4 = vmlaq_lane_s32( o1_s32x4, a1_s32x4, b_s32x2, 1 ); - vst1q_s32( a, o0_s32x4 ); - vst1q_s32( a + 4, o1_s32x4 ); -} - -static OPUS_INLINE void silk_SMULWW_loop_neon( - const opus_int16 *a, - const opus_int32 b, - opus_int32 *o, - const opus_int loop_num -) -{ - opus_int i; - int32x2_t b_s32x2; - - b_s32x2 = vdup_n_s32( b ); - for( i = 0; i < loop_num - 7; i += 8 ) { - silk_SMULWB_8_neon( a + i, b_s32x2, o + i ); - } - for( ; i < loop_num; i++ ) { - o[ i ] = silk_SMULWW( a[ i ], b ); - } -} - -static OPUS_INLINE void silk_nsq_del_dec_scale_states_neon( - const silk_encoder_state *psEncC, /* I Encoder State */ - silk_nsq_state *NSQ, /* I/O NSQ state */ - NSQ_del_decs_struct psDelDec[], /* I/O Delayed decision states */ - const opus_int16 x16[], /* I Input */ - opus_int32 x_sc_Q10[], /* O Input scaled with 1/Gain in Q10 */ - const opus_int16 sLTP[], /* I Re-whitened LTP state in Q0 */ - opus_int32 sLTP_Q15[], /* O LTP state matching scaled input */ - opus_int subfr, /* I Subframe number */ - const opus_int LTP_scale_Q14, /* I LTP state scaling */ - const opus_int32 Gains_Q16[ MAX_NB_SUBFR ], /* I */ - const opus_int pitchL[ MAX_NB_SUBFR ], /* I Pitch lag */ - const opus_int signal_type, /* I Signal type */ - const opus_int decisionDelay /* I Decision delay */ -) -{ - opus_int i, lag; - opus_int32 gain_adj_Q16, inv_gain_Q31, inv_gain_Q26; - - lag = pitchL[ subfr ]; - inv_gain_Q31 = silk_INVERSE32_varQ( silk_max( Gains_Q16[ subfr ], 1 ), 47 ); - silk_assert( inv_gain_Q31 != 0 ); - - /* Scale input */ - inv_gain_Q26 = silk_RSHIFT_ROUND( inv_gain_Q31, 5 ); - silk_SMULWW_loop_neon( x16, inv_gain_Q26, x_sc_Q10, psEncC->subfr_length ); - - /* After rewhitening the LTP state is un-scaled, so scale with inv_gain_Q16 */ - if( NSQ->rewhite_flag ) { - if( subfr == 0 ) { - /* Do LTP downscaling */ - inv_gain_Q31 = silk_LSHIFT( silk_SMULWB( inv_gain_Q31, LTP_scale_Q14 ), 2 ); - } - silk_SMULWW_loop_neon( sLTP + NSQ->sLTP_buf_idx - lag - LTP_ORDER / 2, inv_gain_Q31, sLTP_Q15 + NSQ->sLTP_buf_idx - lag - LTP_ORDER / 2, lag + LTP_ORDER / 2 ); - } - - /* Adjust for changing gain */ - if( Gains_Q16[ subfr ] != NSQ->prev_gain_Q16 ) { - int32x2_t gain_adj_Q16_s32x2; - gain_adj_Q16 = silk_DIV32_varQ( NSQ->prev_gain_Q16, Gains_Q16[ subfr ], 16 ); - - /* Scale long-term shaping state */ - if( ( gain_adj_Q16 >= -65536 ) && ( gain_adj_Q16 < 65536 ) ) { - gain_adj_Q16_s32x2 = vdup_n_s32( silk_LSHIFT32( gain_adj_Q16, 15 ) ); - for( i = NSQ->sLTP_shp_buf_idx - psEncC->ltp_mem_length; i < NSQ->sLTP_shp_buf_idx - 7; i += 8 ) { - silk_SMULWW_small_b_8_neon( NSQ->sLTP_shp_Q14 + i, gain_adj_Q16_s32x2 ); - } - for( ; i < NSQ->sLTP_shp_buf_idx; i++ ) { - NSQ->sLTP_shp_Q14[ i ] = silk_SMULWW( gain_adj_Q16, NSQ->sLTP_shp_Q14[ i ] ); - } - - /* Scale long-term prediction state */ - if( signal_type == TYPE_VOICED && NSQ->rewhite_flag == 0 ) { - for( i = NSQ->sLTP_buf_idx - lag - LTP_ORDER / 2; i < NSQ->sLTP_buf_idx - decisionDelay - 7; i += 8 ) { - silk_SMULWW_small_b_8_neon( sLTP_Q15 + i, gain_adj_Q16_s32x2 ); - } - for( ; i < NSQ->sLTP_buf_idx - decisionDelay; i++ ) { - sLTP_Q15[ i ] = silk_SMULWW( gain_adj_Q16, sLTP_Q15[ i ] ); - } - } - - /* Scale scalar states */ - silk_SMULWW_small_b_4_neon( psDelDec->LF_AR_Q14, gain_adj_Q16_s32x2 ); - silk_SMULWW_small_b_4_neon( psDelDec->Diff_Q14, gain_adj_Q16_s32x2 ); - - /* Scale short-term prediction and shaping states */ - for( i = 0; i < NSQ_LPC_BUF_LENGTH; i++ ) { - silk_SMULWW_small_b_4_neon( psDelDec->sLPC_Q14[ i ], gain_adj_Q16_s32x2 ); - } - - for( i = 0; i < MAX_SHAPE_LPC_ORDER; i++ ) { - silk_SMULWW_small_b_4_neon( psDelDec->sAR2_Q14[ i ], gain_adj_Q16_s32x2 ); - } - - for( i = 0; i < DECISION_DELAY; i++ ) { - silk_SMULWW_small_b_4_neon( psDelDec->Pred_Q15[ i ], gain_adj_Q16_s32x2 ); - silk_SMULWW_small_b_4_neon( psDelDec->Shape_Q14[ i ], gain_adj_Q16_s32x2 ); - } - } else { - gain_adj_Q16_s32x2 = vdup_n_s32( silk_LSHIFT32( gain_adj_Q16 & 0x0000FFFF, 15 ) ); - gain_adj_Q16_s32x2 = vset_lane_s32( gain_adj_Q16 >> 16, gain_adj_Q16_s32x2, 1 ); - for( i = NSQ->sLTP_shp_buf_idx - psEncC->ltp_mem_length; i < NSQ->sLTP_shp_buf_idx - 7; i += 8 ) { - silk_SMULWW_8_neon( NSQ->sLTP_shp_Q14 + i, gain_adj_Q16_s32x2 ); - } - for( ; i < NSQ->sLTP_shp_buf_idx; i++ ) { - NSQ->sLTP_shp_Q14[ i ] = silk_SMULWW( gain_adj_Q16, NSQ->sLTP_shp_Q14[ i ] ); - } - - /* Scale long-term prediction state */ - if( signal_type == TYPE_VOICED && NSQ->rewhite_flag == 0 ) { - for( i = NSQ->sLTP_buf_idx - lag - LTP_ORDER / 2; i < NSQ->sLTP_buf_idx - decisionDelay - 7; i += 8 ) { - silk_SMULWW_8_neon( sLTP_Q15 + i, gain_adj_Q16_s32x2 ); - } - for( ; i < NSQ->sLTP_buf_idx - decisionDelay; i++ ) { - sLTP_Q15[ i ] = silk_SMULWW( gain_adj_Q16, sLTP_Q15[ i ] ); - } - } - - /* Scale scalar states */ - silk_SMULWW_4_neon( psDelDec->LF_AR_Q14, gain_adj_Q16_s32x2 ); - silk_SMULWW_4_neon( psDelDec->Diff_Q14, gain_adj_Q16_s32x2 ); - - /* Scale short-term prediction and shaping states */ - for( i = 0; i < NSQ_LPC_BUF_LENGTH; i++ ) { - silk_SMULWW_4_neon( psDelDec->sLPC_Q14[ i ], gain_adj_Q16_s32x2 ); - } - - for( i = 0; i < MAX_SHAPE_LPC_ORDER; i++ ) { - silk_SMULWW_4_neon( psDelDec->sAR2_Q14[ i ], gain_adj_Q16_s32x2 ); - } - - for( i = 0; i < DECISION_DELAY; i++ ) { - silk_SMULWW_4_neon( psDelDec->Pred_Q15[ i ], gain_adj_Q16_s32x2 ); - silk_SMULWW_4_neon( psDelDec->Shape_Q14[ i ], gain_adj_Q16_s32x2 ); - } - } - - /* Save inverse gain */ - NSQ->prev_gain_Q16 = Gains_Q16[ subfr ]; - } -} diff --git a/thirdparty/opus/silk/arm/NSQ_neon.h b/thirdparty/opus/silk/arm/NSQ_neon.h index b31d9442d6..77c946af85 100644 --- a/thirdparty/opus/silk/arm/NSQ_neon.h +++ b/thirdparty/opus/silk/arm/NSQ_neon.h @@ -28,31 +28,30 @@ POSSIBILITY OF SUCH DAMAGE. #define SILK_NSQ_NEON_H #include "cpu_support.h" -#include "SigProc_FIX.h" #undef silk_short_prediction_create_arch_coef /* For vectorized calc, reverse a_Q12 coefs, convert to 32-bit, and shift for vqdmulhq_s32. */ static OPUS_INLINE void silk_short_prediction_create_arch_coef_neon(opus_int32 *out, const opus_int16 *in, opus_int order) { - out[15] = silk_LSHIFT32(in[0], 15); - out[14] = silk_LSHIFT32(in[1], 15); - out[13] = silk_LSHIFT32(in[2], 15); - out[12] = silk_LSHIFT32(in[3], 15); - out[11] = silk_LSHIFT32(in[4], 15); - out[10] = silk_LSHIFT32(in[5], 15); - out[9] = silk_LSHIFT32(in[6], 15); - out[8] = silk_LSHIFT32(in[7], 15); - out[7] = silk_LSHIFT32(in[8], 15); - out[6] = silk_LSHIFT32(in[9], 15); + out[15] = in[0] << 15; + out[14] = in[1] << 15; + out[13] = in[2] << 15; + out[12] = in[3] << 15; + out[11] = in[4] << 15; + out[10] = in[5] << 15; + out[9] = in[6] << 15; + out[8] = in[7] << 15; + out[7] = in[8] << 15; + out[6] = in[9] << 15; if (order == 16) { - out[5] = silk_LSHIFT32(in[10], 15); - out[4] = silk_LSHIFT32(in[11], 15); - out[3] = silk_LSHIFT32(in[12], 15); - out[2] = silk_LSHIFT32(in[13], 15); - out[1] = silk_LSHIFT32(in[14], 15); - out[0] = silk_LSHIFT32(in[15], 15); + out[5] = in[10] << 15; + out[4] = in[11] << 15; + out[3] = in[12] << 15; + out[2] = in[13] << 15; + out[1] = in[14] << 15; + out[0] = in[15] << 15; } else { diff --git a/thirdparty/opus/silk/arm/arm_silk_map.c b/thirdparty/opus/silk/arm/arm_silk_map.c index 0b9bfec2ca..9bd86a7b21 100644 --- a/thirdparty/opus/silk/arm/arm_silk_map.c +++ b/thirdparty/opus/silk/arm/arm_silk_map.c @@ -28,62 +28,13 @@ POSSIBILITY OF SUCH DAMAGE. # include "config.h" #endif -#include "main_FIX.h" #include "NSQ.h" -#include "SigProc_FIX.h" #if defined(OPUS_HAVE_RTCD) # if (defined(OPUS_ARM_MAY_HAVE_NEON_INTR) && \ !defined(OPUS_ARM_PRESUME_NEON_INTR)) -void (*const SILK_BIQUAD_ALT_STRIDE2_IMPL[OPUS_ARCHMASK + 1])( - const opus_int16 *in, /* I input signal */ - const opus_int32 *B_Q28, /* I MA coefficients [3] */ - const opus_int32 *A_Q28, /* I AR coefficients [2] */ - opus_int32 *S, /* I/O State vector [4] */ - opus_int16 *out, /* O output signal */ - const opus_int32 len /* I signal length (must be even) */ -) = { - silk_biquad_alt_stride2_c, /* ARMv4 */ - silk_biquad_alt_stride2_c, /* EDSP */ - silk_biquad_alt_stride2_c, /* Media */ - silk_biquad_alt_stride2_neon, /* Neon */ -}; - -opus_int32 (*const SILK_LPC_INVERSE_PRED_GAIN_IMPL[OPUS_ARCHMASK + 1])( /* O Returns inverse prediction gain in energy domain, Q30 */ - const opus_int16 *A_Q12, /* I Prediction coefficients, Q12 [order] */ - const opus_int order /* I Prediction order */ -) = { - silk_LPC_inverse_pred_gain_c, /* ARMv4 */ - silk_LPC_inverse_pred_gain_c, /* EDSP */ - silk_LPC_inverse_pred_gain_c, /* Media */ - silk_LPC_inverse_pred_gain_neon, /* Neon */ -}; - -void (*const SILK_NSQ_DEL_DEC_IMPL[OPUS_ARCHMASK + 1])( - const silk_encoder_state *psEncC, /* I Encoder State */ - silk_nsq_state *NSQ, /* I/O NSQ state */ - SideInfoIndices *psIndices, /* I/O Quantization Indices */ - const opus_int16 x16[], /* I Input */ - opus_int8 pulses[], /* O Quantized pulse signal */ - const opus_int16 PredCoef_Q12[ 2 * MAX_LPC_ORDER ], /* I Short term prediction coefs */ - const opus_int16 LTPCoef_Q14[ LTP_ORDER * MAX_NB_SUBFR ], /* I Long term prediction coefs */ - const opus_int16 AR_Q13[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ], /* I Noise shaping coefs */ - const opus_int HarmShapeGain_Q14[ MAX_NB_SUBFR ], /* I Long term shaping coefs */ - const opus_int Tilt_Q14[ MAX_NB_SUBFR ], /* I Spectral tilt */ - const opus_int32 LF_shp_Q14[ MAX_NB_SUBFR ], /* I Low frequency shaping coefs */ - const opus_int32 Gains_Q16[ MAX_NB_SUBFR ], /* I Quantization step sizes */ - const opus_int pitchL[ MAX_NB_SUBFR ], /* I Pitch lags */ - const opus_int Lambda_Q10, /* I Rate/distortion tradeoff */ - const opus_int LTP_scale_Q14 /* I LTP state scaling */ -) = { - silk_NSQ_del_dec_c, /* ARMv4 */ - silk_NSQ_del_dec_c, /* EDSP */ - silk_NSQ_del_dec_c, /* Media */ - silk_NSQ_del_dec_neon, /* Neon */ -}; - /*There is no table for silk_noise_shape_quantizer_short_prediction because the NEON version takes different parameters than the C version. Instead RTCD is done via if statements at the call sites. @@ -101,23 +52,4 @@ opus_int32 # endif -# if defined(FIXED_POINT) && \ - defined(OPUS_ARM_MAY_HAVE_NEON_INTR) && !defined(OPUS_ARM_PRESUME_NEON_INTR) - -void (*const SILK_WARPED_AUTOCORRELATION_FIX_IMPL[OPUS_ARCHMASK + 1])( - opus_int32 *corr, /* O Result [order + 1] */ - opus_int *scale, /* O Scaling of the correlation vector */ - const opus_int16 *input, /* I Input data to correlate */ - const opus_int warping_Q16, /* I Warping coefficient */ - const opus_int length, /* I Length of input */ - const opus_int order /* I Correlation order (even) */ -) = { - silk_warped_autocorrelation_FIX_c, /* ARMv4 */ - silk_warped_autocorrelation_FIX_c, /* EDSP */ - silk_warped_autocorrelation_FIX_c, /* Media */ - silk_warped_autocorrelation_FIX_neon, /* Neon */ -}; - -# endif - #endif /* OPUS_HAVE_RTCD */ diff --git a/thirdparty/opus/silk/arm/biquad_alt_arm.h b/thirdparty/opus/silk/arm/biquad_alt_arm.h deleted file mode 100644 index 66ea9f43dd..0000000000 --- a/thirdparty/opus/silk/arm/biquad_alt_arm.h +++ /dev/null @@ -1,68 +0,0 @@ -/*********************************************************************** -Copyright (c) 2017 Google Inc. -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: -- Redistributions of source code must retain the above copyright notice, -this list of conditions and the following disclaimer. -- Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the -names of specific contributors, may be used to endorse or promote -products derived from this software without specific prior written -permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. -***********************************************************************/ - -#ifndef SILK_BIQUAD_ALT_ARM_H -# define SILK_BIQUAD_ALT_ARM_H - -# include "celt/arm/armcpu.h" - -# if defined(OPUS_ARM_MAY_HAVE_NEON_INTR) -void silk_biquad_alt_stride2_neon( - const opus_int16 *in, /* I input signal */ - const opus_int32 *B_Q28, /* I MA coefficients [3] */ - const opus_int32 *A_Q28, /* I AR coefficients [2] */ - opus_int32 *S, /* I/O State vector [4] */ - opus_int16 *out, /* O output signal */ - const opus_int32 len /* I signal length (must be even) */ -); - -# if !defined(OPUS_HAVE_RTCD) && defined(OPUS_ARM_PRESUME_NEON) -# define OVERRIDE_silk_biquad_alt_stride2 (1) -# define silk_biquad_alt_stride2(in, B_Q28, A_Q28, S, out, len, arch) ((void)(arch), PRESUME_NEON(silk_biquad_alt_stride2)(in, B_Q28, A_Q28, S, out, len)) -# endif -# endif - -# if !defined(OVERRIDE_silk_biquad_alt_stride2) -/*Is run-time CPU detection enabled on this platform?*/ -# if defined(OPUS_HAVE_RTCD) && (defined(OPUS_ARM_MAY_HAVE_NEON_INTR) && !defined(OPUS_ARM_PRESUME_NEON_INTR)) -extern void (*const SILK_BIQUAD_ALT_STRIDE2_IMPL[OPUS_ARCHMASK+1])( - const opus_int16 *in, /* I input signal */ - const opus_int32 *B_Q28, /* I MA coefficients [3] */ - const opus_int32 *A_Q28, /* I AR coefficients [2] */ - opus_int32 *S, /* I/O State vector [4] */ - opus_int16 *out, /* O output signal */ - const opus_int32 len /* I signal length (must be even) */ - ); -# define OVERRIDE_silk_biquad_alt_stride2 (1) -# define silk_biquad_alt_stride2(in, B_Q28, A_Q28, S, out, len, arch) ((*SILK_BIQUAD_ALT_STRIDE2_IMPL[(arch)&OPUS_ARCHMASK])(in, B_Q28, A_Q28, S, out, len)) -# elif defined(OPUS_ARM_PRESUME_NEON_INTR) -# define OVERRIDE_silk_biquad_alt_stride2 (1) -# define silk_biquad_alt_stride2(in, B_Q28, A_Q28, S, out, len, arch) ((void)(arch), silk_biquad_alt_stride2_neon(in, B_Q28, A_Q28, S, out, len)) -# endif -# endif - -#endif /* end SILK_BIQUAD_ALT_ARM_H */ diff --git a/thirdparty/opus/silk/arm/biquad_alt_neon_intr.c b/thirdparty/opus/silk/arm/biquad_alt_neon_intr.c deleted file mode 100644 index 9715733185..0000000000 --- a/thirdparty/opus/silk/arm/biquad_alt_neon_intr.c +++ /dev/null @@ -1,156 +0,0 @@ -/*********************************************************************** -Copyright (c) 2017 Google Inc. -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: -- Redistributions of source code must retain the above copyright notice, -this list of conditions and the following disclaimer. -- Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the -names of specific contributors, may be used to endorse or promote -products derived from this software without specific prior written -permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. -***********************************************************************/ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include <arm_neon.h> -#ifdef OPUS_CHECK_ASM -# include <string.h> -# include "stack_alloc.h" -#endif -#include "SigProc_FIX.h" - -static inline void silk_biquad_alt_stride2_kernel( const int32x4_t A_L_s32x4, const int32x4_t A_U_s32x4, const int32x4_t B_Q28_s32x4, const int32x2_t t_s32x2, const int32x4_t in_s32x4, int32x4_t *S_s32x4, int32x2_t *out32_Q14_s32x2 ) -{ - int32x4_t t_s32x4, out32_Q14_s32x4; - - *out32_Q14_s32x2 = vadd_s32( vget_low_s32( *S_s32x4 ), t_s32x2 ); /* silk_SMLAWB( S{0,1}, B_Q28[ 0 ], in{0,1} ) */ - *S_s32x4 = vcombine_s32( vget_high_s32( *S_s32x4 ), vdup_n_s32( 0 ) ); /* S{0,1} = S{2,3}; S{2,3} = 0; */ - *out32_Q14_s32x2 = vshl_n_s32( *out32_Q14_s32x2, 2 ); /* out32_Q14_{0,1} = silk_LSHIFT( silk_SMLAWB( S{0,1}, B_Q28[ 0 ], in{0,1} ), 2 ); */ - out32_Q14_s32x4 = vcombine_s32( *out32_Q14_s32x2, *out32_Q14_s32x2 ); /* out32_Q14_{0,1,0,1} */ - t_s32x4 = vqdmulhq_s32( out32_Q14_s32x4, A_L_s32x4 ); /* silk_SMULWB( out32_Q14_{0,1,0,1}, A{0,0,1,1}_L_Q28 ) */ - *S_s32x4 = vrsraq_n_s32( *S_s32x4, t_s32x4, 14 ); /* S{0,1} = S{2,3} + silk_RSHIFT_ROUND(); S{2,3} = silk_RSHIFT_ROUND(); */ - t_s32x4 = vqdmulhq_s32( out32_Q14_s32x4, A_U_s32x4 ); /* silk_SMULWB( out32_Q14_{0,1,0,1}, A{0,0,1,1}_U_Q28 ) */ - *S_s32x4 = vaddq_s32( *S_s32x4, t_s32x4 ); /* S0 = silk_SMLAWB( S{0,1,2,3}, out32_Q14_{0,1,0,1}, A{0,0,1,1}_U_Q28 ); */ - t_s32x4 = vqdmulhq_s32( in_s32x4, B_Q28_s32x4 ); /* silk_SMULWB( B_Q28[ {1,1,2,2} ], in{0,1,0,1} ) */ - *S_s32x4 = vaddq_s32( *S_s32x4, t_s32x4 ); /* S0 = silk_SMLAWB( S0, B_Q28[ {1,1,2,2} ], in{0,1,0,1} ); */ -} - -void silk_biquad_alt_stride2_neon( - const opus_int16 *in, /* I input signal */ - const opus_int32 *B_Q28, /* I MA coefficients [3] */ - const opus_int32 *A_Q28, /* I AR coefficients [2] */ - opus_int32 *S, /* I/O State vector [4] */ - opus_int16 *out, /* O output signal */ - const opus_int32 len /* I signal length (must be even) */ -) -{ - /* DIRECT FORM II TRANSPOSED (uses 2 element state vector) */ - opus_int k = 0; - const int32x2_t offset_s32x2 = vdup_n_s32( (1<<14) - 1 ); - const int32x4_t offset_s32x4 = vcombine_s32( offset_s32x2, offset_s32x2 ); - int16x4_t in_s16x4 = vdup_n_s16( 0 ); - int16x4_t out_s16x4; - int32x2_t A_Q28_s32x2, A_L_s32x2, A_U_s32x2, B_Q28_s32x2, t_s32x2; - int32x4_t A_L_s32x4, A_U_s32x4, B_Q28_s32x4, S_s32x4, out32_Q14_s32x4; - int32x2x2_t t0_s32x2x2, t1_s32x2x2, t2_s32x2x2, S_s32x2x2; - -#ifdef OPUS_CHECK_ASM - opus_int32 S_c[ 4 ]; - VARDECL( opus_int16, out_c ); - SAVE_STACK; - ALLOC( out_c, 2 * len, opus_int16 ); - - silk_memcpy( &S_c, S, sizeof( S_c ) ); - silk_biquad_alt_stride2_c( in, B_Q28, A_Q28, S_c, out_c, len ); -#endif - - /* Negate A_Q28 values and split in two parts */ - A_Q28_s32x2 = vld1_s32( A_Q28 ); - A_Q28_s32x2 = vneg_s32( A_Q28_s32x2 ); - A_L_s32x2 = vshl_n_s32( A_Q28_s32x2, 18 ); /* ( -A_Q28[] & 0x00003FFF ) << 18 */ - A_L_s32x2 = vreinterpret_s32_u32( vshr_n_u32( vreinterpret_u32_s32( A_L_s32x2 ), 3 ) ); /* ( -A_Q28[] & 0x00003FFF ) << 15 */ - A_U_s32x2 = vshr_n_s32( A_Q28_s32x2, 14 ); /* silk_RSHIFT( -A_Q28[], 14 ) */ - A_U_s32x2 = vshl_n_s32( A_U_s32x2, 16 ); /* silk_RSHIFT( -A_Q28[], 14 ) << 16 (Clip two leading bits to conform to C function.) */ - A_U_s32x2 = vshr_n_s32( A_U_s32x2, 1 ); /* silk_RSHIFT( -A_Q28[], 14 ) << 15 */ - - B_Q28_s32x2 = vld1_s32( B_Q28 ); - t_s32x2 = vld1_s32( B_Q28 + 1 ); - t0_s32x2x2 = vzip_s32( A_L_s32x2, A_L_s32x2 ); - t1_s32x2x2 = vzip_s32( A_U_s32x2, A_U_s32x2 ); - t2_s32x2x2 = vzip_s32( t_s32x2, t_s32x2 ); - A_L_s32x4 = vcombine_s32( t0_s32x2x2.val[ 0 ], t0_s32x2x2.val[ 1 ] ); /* A{0,0,1,1}_L_Q28 */ - A_U_s32x4 = vcombine_s32( t1_s32x2x2.val[ 0 ], t1_s32x2x2.val[ 1 ] ); /* A{0,0,1,1}_U_Q28 */ - B_Q28_s32x4 = vcombine_s32( t2_s32x2x2.val[ 0 ], t2_s32x2x2.val[ 1 ] ); /* B_Q28[ {1,1,2,2} ] */ - S_s32x4 = vld1q_s32( S ); /* S0 = S[ 0 ]; S3 = S[ 3 ]; */ - S_s32x2x2 = vtrn_s32( vget_low_s32( S_s32x4 ), vget_high_s32( S_s32x4 ) ); /* S2 = S[ 1 ]; S1 = S[ 2 ]; */ - S_s32x4 = vcombine_s32( S_s32x2x2.val[ 0 ], S_s32x2x2.val[ 1 ] ); - - for( ; k < len - 1; k += 2 ) { - int32x4_t in_s32x4[ 2 ], t_s32x4; - int32x2_t out32_Q14_s32x2[ 2 ]; - - /* S[ 2 * i + 0 ], S[ 2 * i + 1 ], S[ 2 * i + 2 ], S[ 2 * i + 3 ]: Q12 */ - in_s16x4 = vld1_s16( &in[ 2 * k ] ); /* in{0,1,2,3} = in[ 2 * k + {0,1,2,3} ]; */ - in_s32x4[ 0 ] = vshll_n_s16( in_s16x4, 15 ); /* in{0,1,2,3} << 15 */ - t_s32x4 = vqdmulhq_lane_s32( in_s32x4[ 0 ], B_Q28_s32x2, 0 ); /* silk_SMULWB( B_Q28[ 0 ], in{0,1,2,3} ) */ - in_s32x4[ 1 ] = vcombine_s32( vget_high_s32( in_s32x4[ 0 ] ), vget_high_s32( in_s32x4[ 0 ] ) ); /* in{2,3,2,3} << 15 */ - in_s32x4[ 0 ] = vcombine_s32( vget_low_s32 ( in_s32x4[ 0 ] ), vget_low_s32 ( in_s32x4[ 0 ] ) ); /* in{0,1,0,1} << 15 */ - silk_biquad_alt_stride2_kernel( A_L_s32x4, A_U_s32x4, B_Q28_s32x4, vget_low_s32 ( t_s32x4 ), in_s32x4[ 0 ], &S_s32x4, &out32_Q14_s32x2[ 0 ] ); - silk_biquad_alt_stride2_kernel( A_L_s32x4, A_U_s32x4, B_Q28_s32x4, vget_high_s32( t_s32x4 ), in_s32x4[ 1 ], &S_s32x4, &out32_Q14_s32x2[ 1 ] ); - - /* Scale back to Q0 and saturate */ - out32_Q14_s32x4 = vcombine_s32( out32_Q14_s32x2[ 0 ], out32_Q14_s32x2[ 1 ] ); /* out32_Q14_{0,1,2,3} */ - out32_Q14_s32x4 = vaddq_s32( out32_Q14_s32x4, offset_s32x4 ); /* out32_Q14_{0,1,2,3} + (1<<14) - 1 */ - out_s16x4 = vqshrn_n_s32( out32_Q14_s32x4, 14 ); /* (opus_int16)silk_SAT16( silk_RSHIFT( out32_Q14_{0,1,2,3} + (1<<14) - 1, 14 ) ) */ - vst1_s16( &out[ 2 * k ], out_s16x4 ); /* out[ 2 * k + {0,1,2,3} ] = (opus_int16)silk_SAT16( silk_RSHIFT( out32_Q14_{0,1,2,3} + (1<<14) - 1, 14 ) ); */ - } - - /* Process leftover. */ - if( k < len ) { - int32x4_t in_s32x4; - int32x2_t out32_Q14_s32x2; - - /* S[ 2 * i + 0 ], S[ 2 * i + 1 ]: Q12 */ - in_s16x4 = vld1_lane_s16( &in[ 2 * k + 0 ], in_s16x4, 0 ); /* in{0,1} = in[ 2 * k + {0,1} ]; */ - in_s16x4 = vld1_lane_s16( &in[ 2 * k + 1 ], in_s16x4, 1 ); /* in{0,1} = in[ 2 * k + {0,1} ]; */ - in_s32x4 = vshll_n_s16( in_s16x4, 15 ); /* in{0,1} << 15 */ - t_s32x2 = vqdmulh_lane_s32( vget_low_s32( in_s32x4 ), B_Q28_s32x2, 0 ); /* silk_SMULWB( B_Q28[ 0 ], in{0,1} ) */ - in_s32x4 = vcombine_s32( vget_low_s32( in_s32x4 ), vget_low_s32( in_s32x4 ) ); /* in{0,1,0,1} << 15 */ - silk_biquad_alt_stride2_kernel( A_L_s32x4, A_U_s32x4, B_Q28_s32x4, t_s32x2, in_s32x4, &S_s32x4, &out32_Q14_s32x2 ); - - /* Scale back to Q0 and saturate */ - out32_Q14_s32x2 = vadd_s32( out32_Q14_s32x2, offset_s32x2 ); /* out32_Q14_{0,1} + (1<<14) - 1 */ - out32_Q14_s32x4 = vcombine_s32( out32_Q14_s32x2, out32_Q14_s32x2 ); /* out32_Q14_{0,1,0,1} + (1<<14) - 1 */ - out_s16x4 = vqshrn_n_s32( out32_Q14_s32x4, 14 ); /* (opus_int16)silk_SAT16( silk_RSHIFT( out32_Q14_{0,1,0,1} + (1<<14) - 1, 14 ) ) */ - vst1_lane_s16( &out[ 2 * k + 0 ], out_s16x4, 0 ); /* out[ 2 * k + 0 ] = (opus_int16)silk_SAT16( silk_RSHIFT( out32_Q14_0 + (1<<14) - 1, 14 ) ); */ - vst1_lane_s16( &out[ 2 * k + 1 ], out_s16x4, 1 ); /* out[ 2 * k + 1 ] = (opus_int16)silk_SAT16( silk_RSHIFT( out32_Q14_1 + (1<<14) - 1, 14 ) ); */ - } - - vst1q_lane_s32( &S[ 0 ], S_s32x4, 0 ); /* S[ 0 ] = S0; */ - vst1q_lane_s32( &S[ 1 ], S_s32x4, 2 ); /* S[ 1 ] = S2; */ - vst1q_lane_s32( &S[ 2 ], S_s32x4, 1 ); /* S[ 2 ] = S1; */ - vst1q_lane_s32( &S[ 3 ], S_s32x4, 3 ); /* S[ 3 ] = S3; */ - -#ifdef OPUS_CHECK_ASM - silk_assert( !memcmp( S_c, S, sizeof( S_c ) ) ); - silk_assert( !memcmp( out_c, out, 2 * len * sizeof( opus_int16 ) ) ); - RESTORE_STACK; -#endif -} diff --git a/thirdparty/opus/silk/arm/macros_armv4.h b/thirdparty/opus/silk/arm/macros_armv4.h index 877eb18dd5..3f30e97288 100644 --- a/thirdparty/opus/silk/arm/macros_armv4.h +++ b/thirdparty/opus/silk/arm/macros_armv4.h @@ -28,11 +28,6 @@ POSSIBILITY OF SUCH DAMAGE. #ifndef SILK_MACROS_ARMv4_H #define SILK_MACROS_ARMv4_H -/* This macro only avoids the undefined behaviour from a left shift of - a negative value. It should only be used in macros that can't include - SigProc_FIX.h. In other cases, use silk_LSHIFT32(). */ -#define SAFE_SHL(a,b) ((opus_int32)((opus_uint32)(a) << (b))) - /* (a32 * (opus_int32)((opus_int16)(b32))) >> 16 output have to be 32bit int */ #undef silk_SMULWB static OPUS_INLINE opus_int32 silk_SMULWB_armv4(opus_int32 a, opus_int16 b) @@ -43,7 +38,7 @@ static OPUS_INLINE opus_int32 silk_SMULWB_armv4(opus_int32 a, opus_int16 b) "#silk_SMULWB\n\t" "smull %0, %1, %2, %3\n\t" : "=&r"(rd_lo), "=&r"(rd_hi) - : "%r"(a), "r"(SAFE_SHL(b,16)) + : "%r"(a), "r"(b<<16) ); return rd_hi; } @@ -85,7 +80,7 @@ static OPUS_INLINE opus_int32 silk_SMULWW_armv4(opus_int32 a, opus_int32 b) : "=&r"(rd_lo), "=&r"(rd_hi) : "%r"(a), "r"(b) ); - return SAFE_SHL(rd_hi,16)+(rd_lo>>16); + return (rd_hi<<16)+(rd_lo>>16); } #define silk_SMULWW(a, b) (silk_SMULWW_armv4(a, b)) @@ -101,10 +96,8 @@ static OPUS_INLINE opus_int32 silk_SMLAWW_armv4(opus_int32 a, opus_int32 b, : "=&r"(rd_lo), "=&r"(rd_hi) : "%r"(b), "r"(c) ); - return a+SAFE_SHL(rd_hi,16)+(rd_lo>>16); + return a+(rd_hi<<16)+(rd_lo>>16); } #define silk_SMLAWW(a, b, c) (silk_SMLAWW_armv4(a, b, c)) -#undef SAFE_SHL - #endif /* SILK_MACROS_ARMv4_H */ diff --git a/thirdparty/opus/silk/arm/macros_armv5e.h b/thirdparty/opus/silk/arm/macros_armv5e.h index b14ec65ddb..aad4117e46 100644 --- a/thirdparty/opus/silk/arm/macros_armv5e.h +++ b/thirdparty/opus/silk/arm/macros_armv5e.h @@ -29,11 +29,6 @@ POSSIBILITY OF SUCH DAMAGE. #ifndef SILK_MACROS_ARMv5E_H #define SILK_MACROS_ARMv5E_H -/* This macro only avoids the undefined behaviour from a left shift of - a negative value. It should only be used in macros that can't include - SigProc_FIX.h. In other cases, use silk_LSHIFT32(). */ -#define SAFE_SHL(a,b) ((opus_int32)((opus_uint32)(a) << (b))) - /* (a32 * (opus_int32)((opus_int16)(b32))) >> 16 output have to be 32bit int */ #undef silk_SMULWB static OPUS_INLINE opus_int32 silk_SMULWB_armv5e(opus_int32 a, opus_int16 b) @@ -195,7 +190,7 @@ static OPUS_INLINE opus_int32 silk_CLZ16_armv5(opus_int16 in16) "#silk_CLZ16\n\t" "clz %0, %1;\n" : "=r"(res) - : "r"(SAFE_SHL(in16,16)|0x8000) + : "r"(in16<<16|0x8000) ); return res; } @@ -215,6 +210,4 @@ static OPUS_INLINE opus_int32 silk_CLZ32_armv5(opus_int32 in32) } #define silk_CLZ32(in32) (silk_CLZ32_armv5(in32)) -#undef SAFE_SHL - #endif /* SILK_MACROS_ARMv5E_H */ diff --git a/thirdparty/opus/silk/biquad_alt.c b/thirdparty/opus/silk/biquad_alt.c index 54566a43c0..d55f5ee92e 100644 --- a/thirdparty/opus/silk/biquad_alt.c +++ b/thirdparty/opus/silk/biquad_alt.c @@ -39,13 +39,14 @@ POSSIBILITY OF SUCH DAMAGE. #include "SigProc_FIX.h" /* Second order ARMA filter, alternative implementation */ -void silk_biquad_alt_stride1( +void silk_biquad_alt( const opus_int16 *in, /* I input signal */ const opus_int32 *B_Q28, /* I MA coefficients [3] */ const opus_int32 *A_Q28, /* I AR coefficients [2] */ opus_int32 *S, /* I/O State vector [2] */ opus_int16 *out, /* O output signal */ - const opus_int32 len /* I signal length (must be even) */ + const opus_int32 len, /* I signal length (must be even) */ + opus_int stride /* I Operate on interleaved signal if > 1 */ ) { /* DIRECT FORM II TRANSPOSED (uses 2 element state vector) */ @@ -60,7 +61,7 @@ void silk_biquad_alt_stride1( for( k = 0; k < len; k++ ) { /* S[ 0 ], S[ 1 ]: Q12 */ - inval = in[ k ]; + inval = in[ k * stride ]; out32_Q14 = silk_LSHIFT( silk_SMLAWB( S[ 0 ], B_Q28[ 0 ], inval ), 2 ); S[ 0 ] = S[1] + silk_RSHIFT_ROUND( silk_SMULWB( out32_Q14, A0_L_Q28 ), 14 ); @@ -72,50 +73,6 @@ void silk_biquad_alt_stride1( S[ 1 ] = silk_SMLAWB( S[ 1 ], B_Q28[ 2 ], inval ); /* Scale back to Q0 and saturate */ - out[ k ] = (opus_int16)silk_SAT16( silk_RSHIFT( out32_Q14 + (1<<14) - 1, 14 ) ); - } -} - -void silk_biquad_alt_stride2_c( - const opus_int16 *in, /* I input signal */ - const opus_int32 *B_Q28, /* I MA coefficients [3] */ - const opus_int32 *A_Q28, /* I AR coefficients [2] */ - opus_int32 *S, /* I/O State vector [4] */ - opus_int16 *out, /* O output signal */ - const opus_int32 len /* I signal length (must be even) */ -) -{ - /* DIRECT FORM II TRANSPOSED (uses 2 element state vector) */ - opus_int k; - opus_int32 A0_U_Q28, A0_L_Q28, A1_U_Q28, A1_L_Q28, out32_Q14[ 2 ]; - - /* Negate A_Q28 values and split in two parts */ - A0_L_Q28 = ( -A_Q28[ 0 ] ) & 0x00003FFF; /* lower part */ - A0_U_Q28 = silk_RSHIFT( -A_Q28[ 0 ], 14 ); /* upper part */ - A1_L_Q28 = ( -A_Q28[ 1 ] ) & 0x00003FFF; /* lower part */ - A1_U_Q28 = silk_RSHIFT( -A_Q28[ 1 ], 14 ); /* upper part */ - - for( k = 0; k < len; k++ ) { - /* S[ 0 ], S[ 1 ], S[ 2 ], S[ 3 ]: Q12 */ - out32_Q14[ 0 ] = silk_LSHIFT( silk_SMLAWB( S[ 0 ], B_Q28[ 0 ], in[ 2 * k + 0 ] ), 2 ); - out32_Q14[ 1 ] = silk_LSHIFT( silk_SMLAWB( S[ 2 ], B_Q28[ 0 ], in[ 2 * k + 1 ] ), 2 ); - - S[ 0 ] = S[ 1 ] + silk_RSHIFT_ROUND( silk_SMULWB( out32_Q14[ 0 ], A0_L_Q28 ), 14 ); - S[ 2 ] = S[ 3 ] + silk_RSHIFT_ROUND( silk_SMULWB( out32_Q14[ 1 ], A0_L_Q28 ), 14 ); - S[ 0 ] = silk_SMLAWB( S[ 0 ], out32_Q14[ 0 ], A0_U_Q28 ); - S[ 2 ] = silk_SMLAWB( S[ 2 ], out32_Q14[ 1 ], A0_U_Q28 ); - S[ 0 ] = silk_SMLAWB( S[ 0 ], B_Q28[ 1 ], in[ 2 * k + 0 ] ); - S[ 2 ] = silk_SMLAWB( S[ 2 ], B_Q28[ 1 ], in[ 2 * k + 1 ] ); - - S[ 1 ] = silk_RSHIFT_ROUND( silk_SMULWB( out32_Q14[ 0 ], A1_L_Q28 ), 14 ); - S[ 3 ] = silk_RSHIFT_ROUND( silk_SMULWB( out32_Q14[ 1 ], A1_L_Q28 ), 14 ); - S[ 1 ] = silk_SMLAWB( S[ 1 ], out32_Q14[ 0 ], A1_U_Q28 ); - S[ 3 ] = silk_SMLAWB( S[ 3 ], out32_Q14[ 1 ], A1_U_Q28 ); - S[ 1 ] = silk_SMLAWB( S[ 1 ], B_Q28[ 2 ], in[ 2 * k + 0 ] ); - S[ 3 ] = silk_SMLAWB( S[ 3 ], B_Q28[ 2 ], in[ 2 * k + 1 ] ); - - /* Scale back to Q0 and saturate */ - out[ 2 * k + 0 ] = (opus_int16)silk_SAT16( silk_RSHIFT( out32_Q14[ 0 ] + (1<<14) - 1, 14 ) ); - out[ 2 * k + 1 ] = (opus_int16)silk_SAT16( silk_RSHIFT( out32_Q14[ 1 ] + (1<<14) - 1, 14 ) ); + out[ k * stride ] = (opus_int16)silk_SAT16( silk_RSHIFT( out32_Q14 + (1<<14) - 1, 14 ) ); } } diff --git a/thirdparty/opus/silk/bwexpander.c b/thirdparty/opus/silk/bwexpander.c index afa97907ec..2eb4456695 100644 --- a/thirdparty/opus/silk/bwexpander.c +++ b/thirdparty/opus/silk/bwexpander.c @@ -45,7 +45,7 @@ void silk_bwexpander( /* Bias in silk_SMULWB can lead to unstable filters */ for( i = 0; i < d - 1; i++ ) { ar[ i ] = (opus_int16)silk_RSHIFT_ROUND( silk_MUL( chirp_Q16, ar[ i ] ), 16 ); - chirp_Q16 += silk_RSHIFT_ROUND( silk_MUL( chirp_Q16, chirp_minus_one_Q16 ), 16 ); + chirp_Q16 += silk_RSHIFT_ROUND( silk_MUL( chirp_Q16, chirp_minus_one_Q16 ), 16 ); } ar[ d - 1 ] = (opus_int16)silk_RSHIFT_ROUND( silk_MUL( chirp_Q16, ar[ d - 1 ] ), 16 ); } diff --git a/thirdparty/opus/silk/check_control_input.c b/thirdparty/opus/silk/check_control_input.c index 739fb01f1e..b5de9ce48d 100644 --- a/thirdparty/opus/silk/check_control_input.c +++ b/thirdparty/opus/silk/check_control_input.c @@ -38,7 +38,7 @@ opus_int check_control_input( silk_EncControlStruct *encControl /* I Control structure */ ) { - celt_assert( encControl != NULL ); + silk_assert( encControl != NULL ); if( ( ( encControl->API_sampleRate != 8000 ) && ( encControl->API_sampleRate != 12000 ) && @@ -59,46 +59,46 @@ opus_int check_control_input( ( encControl->minInternalSampleRate > encControl->desiredInternalSampleRate ) || ( encControl->maxInternalSampleRate < encControl->desiredInternalSampleRate ) || ( encControl->minInternalSampleRate > encControl->maxInternalSampleRate ) ) { - celt_assert( 0 ); + silk_assert( 0 ); return SILK_ENC_FS_NOT_SUPPORTED; } if( encControl->payloadSize_ms != 10 && encControl->payloadSize_ms != 20 && encControl->payloadSize_ms != 40 && encControl->payloadSize_ms != 60 ) { - celt_assert( 0 ); + silk_assert( 0 ); return SILK_ENC_PACKET_SIZE_NOT_SUPPORTED; } if( encControl->packetLossPercentage < 0 || encControl->packetLossPercentage > 100 ) { - celt_assert( 0 ); + silk_assert( 0 ); return SILK_ENC_INVALID_LOSS_RATE; } if( encControl->useDTX < 0 || encControl->useDTX > 1 ) { - celt_assert( 0 ); + silk_assert( 0 ); return SILK_ENC_INVALID_DTX_SETTING; } if( encControl->useCBR < 0 || encControl->useCBR > 1 ) { - celt_assert( 0 ); + silk_assert( 0 ); return SILK_ENC_INVALID_CBR_SETTING; } if( encControl->useInBandFEC < 0 || encControl->useInBandFEC > 1 ) { - celt_assert( 0 ); + silk_assert( 0 ); return SILK_ENC_INVALID_INBAND_FEC_SETTING; } if( encControl->nChannelsAPI < 1 || encControl->nChannelsAPI > ENCODER_NUM_CHANNELS ) { - celt_assert( 0 ); + silk_assert( 0 ); return SILK_ENC_INVALID_NUMBER_OF_CHANNELS_ERROR; } if( encControl->nChannelsInternal < 1 || encControl->nChannelsInternal > ENCODER_NUM_CHANNELS ) { - celt_assert( 0 ); + silk_assert( 0 ); return SILK_ENC_INVALID_NUMBER_OF_CHANNELS_ERROR; } if( encControl->nChannelsInternal > encControl->nChannelsAPI ) { - celt_assert( 0 ); + silk_assert( 0 ); return SILK_ENC_INVALID_NUMBER_OF_CHANNELS_ERROR; } if( encControl->complexity < 0 || encControl->complexity > 10 ) { - celt_assert( 0 ); + silk_assert( 0 ); return SILK_ENC_INVALID_COMPLEXITY_SETTING; } diff --git a/thirdparty/opus/silk/control.h b/thirdparty/opus/silk/control.h index b76ec33cd6..747e5426a0 100644 --- a/thirdparty/opus/silk/control.h +++ b/thirdparty/opus/silk/control.h @@ -77,9 +77,6 @@ typedef struct { /* I: Flag to enable in-band Forward Error Correction (FEC); 0/1 */ opus_int useInBandFEC; - /* I: Flag to actually code in-band Forward Error Correction (FEC) in the current packet; 0/1 */ - opus_int LBRR_coded; - /* I: Flag to enable discontinuous transmission (DTX); 0/1 */ opus_int useDTX; @@ -113,11 +110,6 @@ typedef struct { /* O: Tells the Opus encoder we're ready to switch */ opus_int switchReady; - /* O: SILK Signal type */ - opus_int signalType; - - /* O: SILK offset (dithering) */ - opus_int offset; } silk_EncControlStruct; /**************************************************************************/ diff --git a/thirdparty/opus/silk/control_SNR.c b/thirdparty/opus/silk/control_SNR.c index 9a6db27543..cee87eb0d8 100644 --- a/thirdparty/opus/silk/control_SNR.c +++ b/thirdparty/opus/silk/control_SNR.c @@ -32,82 +32,45 @@ POSSIBILITY OF SUCH DAMAGE. #include "main.h" #include "tuning_parameters.h" -/* These tables hold SNR values divided by 21 (so they fit in 8 bits) - for different target bitrates spaced at 400 bps interval. The first - 10 values are omitted (0-4 kb/s) because they're all zeros. - These tables were obtained by running different SNRs through the - encoder and measuring the active bitrate. */ -static const unsigned char silk_TargetRate_NB_21[117 - 10] = { - 0, 15, 39, 52, 61, 68, - 74, 79, 84, 88, 92, 95, 99,102,105,108,111,114,117,119,122,124, - 126,129,131,133,135,137,139,142,143,145,147,149,151,153,155,157, - 158,160,162,163,165,167,168,170,171,173,174,176,177,179,180,182, - 183,185,186,187,189,190,192,193,194,196,197,199,200,201,203,204, - 205,207,208,209,211,212,213,215,216,217,219,220,221,223,224,225, - 227,228,230,231,232,234,235,236,238,239,241,242,243,245,246,248, - 249,250,252,253,255 -}; - -static const unsigned char silk_TargetRate_MB_21[165 - 10] = { - 0, 0, 28, 43, 52, 59, - 65, 70, 74, 78, 81, 85, 87, 90, 93, 95, 98,100,102,105,107,109, - 111,113,115,116,118,120,122,123,125,127,128,130,131,133,134,136, - 137,138,140,141,143,144,145,147,148,149,151,152,153,154,156,157, - 158,159,160,162,163,164,165,166,167,168,169,171,172,173,174,175, - 176,177,178,179,180,181,182,183,184,185,186,187,188,188,189,190, - 191,192,193,194,195,196,197,198,199,200,201,202,203,203,204,205, - 206,207,208,209,210,211,212,213,214,214,215,216,217,218,219,220, - 221,222,223,224,224,225,226,227,228,229,230,231,232,233,234,235, - 236,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250, - 251,252,253,254,255 -}; - -static const unsigned char silk_TargetRate_WB_21[201 - 10] = { - 0, 0, 0, 8, 29, 41, - 49, 56, 62, 66, 70, 74, 77, 80, 83, 86, 88, 91, 93, 95, 97, 99, - 101,103,105,107,108,110,112,113,115,116,118,119,121,122,123,125, - 126,127,129,130,131,132,134,135,136,137,138,140,141,142,143,144, - 145,146,147,148,149,150,151,152,153,154,156,157,158,159,159,160, - 161,162,163,164,165,166,167,168,169,170,171,171,172,173,174,175, - 176,177,177,178,179,180,181,181,182,183,184,185,185,186,187,188, - 189,189,190,191,192,192,193,194,195,195,196,197,198,198,199,200, - 200,201,202,203,203,204,205,206,206,207,208,209,209,210,211,211, - 212,213,214,214,215,216,216,217,218,219,219,220,221,221,222,223, - 224,224,225,226,226,227,228,229,229,230,231,232,232,233,234,234, - 235,236,237,237,238,239,240,240,241,242,243,243,244,245,246,246, - 247,248,249,249,250,251,252,253,255 -}; - /* Control SNR of redidual quantizer */ opus_int silk_control_SNR( silk_encoder_state *psEncC, /* I/O Pointer to Silk encoder state */ opus_int32 TargetRate_bps /* I Target max bitrate (bps) */ ) { - int id; - int bound; - const unsigned char *snr_table; + opus_int k, ret = SILK_NO_ERROR; + opus_int32 frac_Q6; + const opus_int32 *rateTable; - psEncC->TargetRate_bps = TargetRate_bps; - if( psEncC->nb_subfr == 2 ) { - TargetRate_bps -= 2000 + psEncC->fs_kHz/16; - } - if( psEncC->fs_kHz == 8 ) { - bound = sizeof(silk_TargetRate_NB_21); - snr_table = silk_TargetRate_NB_21; - } else if( psEncC->fs_kHz == 12 ) { - bound = sizeof(silk_TargetRate_MB_21); - snr_table = silk_TargetRate_MB_21; - } else { - bound = sizeof(silk_TargetRate_WB_21); - snr_table = silk_TargetRate_WB_21; - } - id = (TargetRate_bps+200)/400; - id = silk_min(id - 10, bound-1); - if( id <= 0 ) { - psEncC->SNR_dB_Q7 = 0; - } else { - psEncC->SNR_dB_Q7 = snr_table[id]*21; + /* Set bitrate/coding quality */ + TargetRate_bps = silk_LIMIT( TargetRate_bps, MIN_TARGET_RATE_BPS, MAX_TARGET_RATE_BPS ); + if( TargetRate_bps != psEncC->TargetRate_bps ) { + psEncC->TargetRate_bps = TargetRate_bps; + + /* If new TargetRate_bps, translate to SNR_dB value */ + if( psEncC->fs_kHz == 8 ) { + rateTable = silk_TargetRate_table_NB; + } else if( psEncC->fs_kHz == 12 ) { + rateTable = silk_TargetRate_table_MB; + } else { + rateTable = silk_TargetRate_table_WB; + } + + /* Reduce bitrate for 10 ms modes in these calculations */ + if( psEncC->nb_subfr == 2 ) { + TargetRate_bps -= REDUCE_BITRATE_10_MS_BPS; + } + + /* Find bitrate interval in table and interpolate */ + for( k = 1; k < TARGET_RATE_TAB_SZ; k++ ) { + if( TargetRate_bps <= rateTable[ k ] ) { + frac_Q6 = silk_DIV32( silk_LSHIFT( TargetRate_bps - rateTable[ k - 1 ], 6 ), + rateTable[ k ] - rateTable[ k - 1 ] ); + psEncC->SNR_dB_Q7 = silk_LSHIFT( silk_SNR_table_Q1[ k - 1 ], 6 ) + silk_MUL( frac_Q6, silk_SNR_table_Q1[ k ] - silk_SNR_table_Q1[ k - 1 ] ); + break; + } + } } - return SILK_NO_ERROR; + + return ret; } diff --git a/thirdparty/opus/silk/control_audio_bandwidth.c b/thirdparty/opus/silk/control_audio_bandwidth.c index f6d22d8395..4f9bc5cbda 100644 --- a/thirdparty/opus/silk/control_audio_bandwidth.c +++ b/thirdparty/opus/silk/control_audio_bandwidth.c @@ -39,15 +39,9 @@ opus_int silk_control_audio_bandwidth( ) { opus_int fs_kHz; - opus_int orig_kHz; opus_int32 fs_Hz; - orig_kHz = psEncC->fs_kHz; - /* Handle a bandwidth-switching reset where we need to be aware what the last sampling rate was. */ - if( orig_kHz == 0 ) { - orig_kHz = psEncC->sLP.saved_fs_kHz; - } - fs_kHz = orig_kHz; + fs_kHz = psEncC->fs_kHz; fs_Hz = silk_SMULBB( fs_kHz, 1000 ); if( fs_Hz == 0 ) { /* Encoder has just been initialized */ @@ -67,7 +61,7 @@ opus_int silk_control_audio_bandwidth( } if( psEncC->allow_bandwidth_switch || encControl->opusCanSwitch ) { /* Check if we should switch down */ - if( silk_SMULBB( orig_kHz, 1000 ) > psEncC->desiredInternal_fs_Hz ) + if( silk_SMULBB( psEncC->fs_kHz, 1000 ) > psEncC->desiredInternal_fs_Hz ) { /* Switch down */ if( psEncC->sLP.mode == 0 ) { @@ -82,7 +76,7 @@ opus_int silk_control_audio_bandwidth( psEncC->sLP.mode = 0; /* Switch to a lower sample frequency */ - fs_kHz = orig_kHz == 16 ? 12 : 8; + fs_kHz = psEncC->fs_kHz == 16 ? 12 : 8; } else { if( psEncC->sLP.transition_frame_no <= 0 ) { encControl->switchReady = 1; @@ -96,12 +90,12 @@ opus_int silk_control_audio_bandwidth( } else /* Check if we should switch up */ - if( silk_SMULBB( orig_kHz, 1000 ) < psEncC->desiredInternal_fs_Hz ) + if( silk_SMULBB( psEncC->fs_kHz, 1000 ) < psEncC->desiredInternal_fs_Hz ) { /* Switch up */ if( encControl->opusCanSwitch ) { /* Switch to a higher sample frequency */ - fs_kHz = orig_kHz == 8 ? 12 : 16; + fs_kHz = psEncC->fs_kHz == 8 ? 12 : 16; /* New transition */ psEncC->sLP.transition_frame_no = 0; diff --git a/thirdparty/opus/silk/control_codec.c b/thirdparty/opus/silk/control_codec.c index 52aa8fded3..044eea3f2a 100644 --- a/thirdparty/opus/silk/control_codec.c +++ b/thirdparty/opus/silk/control_codec.c @@ -57,7 +57,7 @@ static opus_int silk_setup_complexity( static OPUS_INLINE opus_int silk_setup_LBRR( silk_encoder_state *psEncC, /* I/O */ - const silk_EncControlStruct *encControl /* I */ + const opus_int32 TargetRate_bps /* I */ ); @@ -65,6 +65,7 @@ static OPUS_INLINE opus_int silk_setup_LBRR( opus_int silk_control_encoder( silk_encoder_state_Fxx *psEnc, /* I/O Pointer to Silk encoder state */ silk_EncControlStruct *encControl, /* I Control structure */ + const opus_int32 TargetRate_bps, /* I Target max bitrate (bps) */ const opus_int allow_bw_switch, /* I Flag to allow switching audio bandwidth */ const opus_int channelNb, /* I Channel number */ const opus_int force_fs_kHz @@ -124,7 +125,7 @@ opus_int silk_control_encoder( /********************************************/ /* Set LBRR usage */ /********************************************/ - ret += silk_setup_LBRR( &psEnc->sCmn, encControl ); + ret += silk_setup_LBRR( &psEnc->sCmn, TargetRate_bps ); psEnc->sCmn.controlled_since_last_payload = 1; @@ -238,11 +239,12 @@ static opus_int silk_setup_fs( } /* Set internal sampling frequency */ - celt_assert( fs_kHz == 8 || fs_kHz == 12 || fs_kHz == 16 ); - celt_assert( psEnc->sCmn.nb_subfr == 2 || psEnc->sCmn.nb_subfr == 4 ); + silk_assert( fs_kHz == 8 || fs_kHz == 12 || fs_kHz == 16 ); + silk_assert( psEnc->sCmn.nb_subfr == 2 || psEnc->sCmn.nb_subfr == 4 ); if( psEnc->sCmn.fs_kHz != fs_kHz ) { /* reset part of the state */ silk_memset( &psEnc->sShape, 0, sizeof( psEnc->sShape ) ); + silk_memset( &psEnc->sPrefilt, 0, sizeof( psEnc->sPrefilt ) ); silk_memset( &psEnc->sCmn.sNSQ, 0, sizeof( psEnc->sCmn.sNSQ ) ); silk_memset( psEnc->sCmn.prev_NLSFq_Q15, 0, sizeof( psEnc->sCmn.prev_NLSFq_Q15 ) ); silk_memset( &psEnc->sCmn.sLP.In_LP_State, 0, sizeof( psEnc->sCmn.sLP.In_LP_State ) ); @@ -253,6 +255,7 @@ static opus_int silk_setup_fs( /* Initialize non-zero parameters */ psEnc->sCmn.prevLag = 100; psEnc->sCmn.first_frame_after_reset = 1; + psEnc->sPrefilt.lagPrev = 100; psEnc->sShape.LastGainIndex = 10; psEnc->sCmn.sNSQ.lagPrev = 100; psEnc->sCmn.sNSQ.prev_gain_Q16 = 65536; @@ -290,16 +293,19 @@ static opus_int silk_setup_fs( psEnc->sCmn.pitch_LPC_win_length = silk_SMULBB( FIND_PITCH_LPC_WIN_MS_2_SF, fs_kHz ); } if( psEnc->sCmn.fs_kHz == 16 ) { + psEnc->sCmn.mu_LTP_Q9 = SILK_FIX_CONST( MU_LTP_QUANT_WB, 9 ); psEnc->sCmn.pitch_lag_low_bits_iCDF = silk_uniform8_iCDF; } else if( psEnc->sCmn.fs_kHz == 12 ) { + psEnc->sCmn.mu_LTP_Q9 = SILK_FIX_CONST( MU_LTP_QUANT_MB, 9 ); psEnc->sCmn.pitch_lag_low_bits_iCDF = silk_uniform6_iCDF; } else { + psEnc->sCmn.mu_LTP_Q9 = SILK_FIX_CONST( MU_LTP_QUANT_NB, 9 ); psEnc->sCmn.pitch_lag_low_bits_iCDF = silk_uniform4_iCDF; } } /* Check that settings are valid */ - celt_assert( ( psEnc->sCmn.subfr_length * psEnc->sCmn.nb_subfr ) == psEnc->sCmn.frame_length ); + silk_assert( ( psEnc->sCmn.subfr_length * psEnc->sCmn.nb_subfr ) == psEnc->sCmn.frame_length ); return ret; } @@ -312,76 +318,61 @@ static opus_int silk_setup_complexity( opus_int ret = 0; /* Set encoding complexity */ - celt_assert( Complexity >= 0 && Complexity <= 10 ); - if( Complexity < 1 ) { + silk_assert( Complexity >= 0 && Complexity <= 10 ); + if( Complexity < 2 ) { psEncC->pitchEstimationComplexity = SILK_PE_MIN_COMPLEX; psEncC->pitchEstimationThreshold_Q16 = SILK_FIX_CONST( 0.8, 16 ); psEncC->pitchEstimationLPCOrder = 6; - psEncC->shapingLPCOrder = 12; + psEncC->shapingLPCOrder = 8; psEncC->la_shape = 3 * psEncC->fs_kHz; psEncC->nStatesDelayedDecision = 1; psEncC->useInterpolatedNLSFs = 0; - psEncC->NLSF_MSVQ_Survivors = 2; - psEncC->warping_Q16 = 0; - } else if( Complexity < 2 ) { - psEncC->pitchEstimationComplexity = SILK_PE_MID_COMPLEX; - psEncC->pitchEstimationThreshold_Q16 = SILK_FIX_CONST( 0.76, 16 ); - psEncC->pitchEstimationLPCOrder = 8; - psEncC->shapingLPCOrder = 14; - psEncC->la_shape = 5 * psEncC->fs_kHz; - psEncC->nStatesDelayedDecision = 1; - psEncC->useInterpolatedNLSFs = 0; - psEncC->NLSF_MSVQ_Survivors = 3; - psEncC->warping_Q16 = 0; - } else if( Complexity < 3 ) { - psEncC->pitchEstimationComplexity = SILK_PE_MIN_COMPLEX; - psEncC->pitchEstimationThreshold_Q16 = SILK_FIX_CONST( 0.8, 16 ); - psEncC->pitchEstimationLPCOrder = 6; - psEncC->shapingLPCOrder = 12; - psEncC->la_shape = 3 * psEncC->fs_kHz; - psEncC->nStatesDelayedDecision = 2; - psEncC->useInterpolatedNLSFs = 0; + psEncC->LTPQuantLowComplexity = 1; psEncC->NLSF_MSVQ_Survivors = 2; psEncC->warping_Q16 = 0; } else if( Complexity < 4 ) { psEncC->pitchEstimationComplexity = SILK_PE_MID_COMPLEX; psEncC->pitchEstimationThreshold_Q16 = SILK_FIX_CONST( 0.76, 16 ); psEncC->pitchEstimationLPCOrder = 8; - psEncC->shapingLPCOrder = 14; + psEncC->shapingLPCOrder = 10; psEncC->la_shape = 5 * psEncC->fs_kHz; - psEncC->nStatesDelayedDecision = 2; + psEncC->nStatesDelayedDecision = 1; psEncC->useInterpolatedNLSFs = 0; + psEncC->LTPQuantLowComplexity = 0; psEncC->NLSF_MSVQ_Survivors = 4; psEncC->warping_Q16 = 0; } else if( Complexity < 6 ) { psEncC->pitchEstimationComplexity = SILK_PE_MID_COMPLEX; psEncC->pitchEstimationThreshold_Q16 = SILK_FIX_CONST( 0.74, 16 ); psEncC->pitchEstimationLPCOrder = 10; - psEncC->shapingLPCOrder = 16; + psEncC->shapingLPCOrder = 12; psEncC->la_shape = 5 * psEncC->fs_kHz; psEncC->nStatesDelayedDecision = 2; psEncC->useInterpolatedNLSFs = 1; - psEncC->NLSF_MSVQ_Survivors = 6; + psEncC->LTPQuantLowComplexity = 0; + psEncC->NLSF_MSVQ_Survivors = 8; psEncC->warping_Q16 = psEncC->fs_kHz * SILK_FIX_CONST( WARPING_MULTIPLIER, 16 ); } else if( Complexity < 8 ) { psEncC->pitchEstimationComplexity = SILK_PE_MID_COMPLEX; psEncC->pitchEstimationThreshold_Q16 = SILK_FIX_CONST( 0.72, 16 ); psEncC->pitchEstimationLPCOrder = 12; - psEncC->shapingLPCOrder = 20; + psEncC->shapingLPCOrder = 14; psEncC->la_shape = 5 * psEncC->fs_kHz; psEncC->nStatesDelayedDecision = 3; psEncC->useInterpolatedNLSFs = 1; - psEncC->NLSF_MSVQ_Survivors = 8; + psEncC->LTPQuantLowComplexity = 0; + psEncC->NLSF_MSVQ_Survivors = 16; psEncC->warping_Q16 = psEncC->fs_kHz * SILK_FIX_CONST( WARPING_MULTIPLIER, 16 ); } else { psEncC->pitchEstimationComplexity = SILK_PE_MAX_COMPLEX; psEncC->pitchEstimationThreshold_Q16 = SILK_FIX_CONST( 0.7, 16 ); psEncC->pitchEstimationLPCOrder = 16; - psEncC->shapingLPCOrder = 24; + psEncC->shapingLPCOrder = 16; psEncC->la_shape = 5 * psEncC->fs_kHz; psEncC->nStatesDelayedDecision = MAX_DEL_DEC_STATES; psEncC->useInterpolatedNLSFs = 1; - psEncC->NLSF_MSVQ_Survivors = 16; + psEncC->LTPQuantLowComplexity = 0; + psEncC->NLSF_MSVQ_Survivors = 32; psEncC->warping_Q16 = psEncC->fs_kHz * SILK_FIX_CONST( WARPING_MULTIPLIER, 16 ); } @@ -390,32 +381,46 @@ static opus_int silk_setup_complexity( psEncC->shapeWinLength = SUB_FRAME_LENGTH_MS * psEncC->fs_kHz + 2 * psEncC->la_shape; psEncC->Complexity = Complexity; - celt_assert( psEncC->pitchEstimationLPCOrder <= MAX_FIND_PITCH_LPC_ORDER ); - celt_assert( psEncC->shapingLPCOrder <= MAX_SHAPE_LPC_ORDER ); - celt_assert( psEncC->nStatesDelayedDecision <= MAX_DEL_DEC_STATES ); - celt_assert( psEncC->warping_Q16 <= 32767 ); - celt_assert( psEncC->la_shape <= LA_SHAPE_MAX ); - celt_assert( psEncC->shapeWinLength <= SHAPE_LPC_WIN_MAX ); + silk_assert( psEncC->pitchEstimationLPCOrder <= MAX_FIND_PITCH_LPC_ORDER ); + silk_assert( psEncC->shapingLPCOrder <= MAX_SHAPE_LPC_ORDER ); + silk_assert( psEncC->nStatesDelayedDecision <= MAX_DEL_DEC_STATES ); + silk_assert( psEncC->warping_Q16 <= 32767 ); + silk_assert( psEncC->la_shape <= LA_SHAPE_MAX ); + silk_assert( psEncC->shapeWinLength <= SHAPE_LPC_WIN_MAX ); + silk_assert( psEncC->NLSF_MSVQ_Survivors <= NLSF_VQ_MAX_SURVIVORS ); return ret; } static OPUS_INLINE opus_int silk_setup_LBRR( silk_encoder_state *psEncC, /* I/O */ - const silk_EncControlStruct *encControl /* I */ + const opus_int32 TargetRate_bps /* I */ ) { opus_int LBRR_in_previous_packet, ret = SILK_NO_ERROR; + opus_int32 LBRR_rate_thres_bps; LBRR_in_previous_packet = psEncC->LBRR_enabled; - psEncC->LBRR_enabled = encControl->LBRR_coded; - if( psEncC->LBRR_enabled ) { - /* Set gain increase for coding LBRR excitation */ - if( LBRR_in_previous_packet == 0 ) { - /* Previous packet did not have LBRR, and was therefore coded at a higher bitrate */ - psEncC->LBRR_GainIncreases = 7; + psEncC->LBRR_enabled = 0; + if( psEncC->useInBandFEC && psEncC->PacketLoss_perc > 0 ) { + if( psEncC->fs_kHz == 8 ) { + LBRR_rate_thres_bps = LBRR_NB_MIN_RATE_BPS; + } else if( psEncC->fs_kHz == 12 ) { + LBRR_rate_thres_bps = LBRR_MB_MIN_RATE_BPS; } else { - psEncC->LBRR_GainIncreases = silk_max_int( 7 - silk_SMULWB( (opus_int32)psEncC->PacketLoss_perc, SILK_FIX_CONST( 0.4, 16 ) ), 2 ); + LBRR_rate_thres_bps = LBRR_WB_MIN_RATE_BPS; + } + LBRR_rate_thres_bps = silk_SMULWB( silk_MUL( LBRR_rate_thres_bps, 125 - silk_min( psEncC->PacketLoss_perc, 25 ) ), SILK_FIX_CONST( 0.01, 16 ) ); + + if( TargetRate_bps > LBRR_rate_thres_bps ) { + /* Set gain increase for coding LBRR excitation */ + if( LBRR_in_previous_packet == 0 ) { + /* Previous packet did not have LBRR, and was therefore coded at a higher bitrate */ + psEncC->LBRR_GainIncreases = 7; + } else { + psEncC->LBRR_GainIncreases = silk_max_int( 7 - silk_SMULWB( (opus_int32)psEncC->PacketLoss_perc, SILK_FIX_CONST( 0.4, 16 ) ), 2 ); + } + psEncC->LBRR_enabled = 1; } } diff --git a/thirdparty/opus/silk/debug.h b/thirdparty/opus/silk/debug.h index 6f68c1ca0f..efb6d3e99e 100644 --- a/thirdparty/opus/silk/debug.h +++ b/thirdparty/opus/silk/debug.h @@ -39,10 +39,23 @@ extern "C" unsigned long GetHighResolutionTime(void); /* O time in usec*/ -/* Set to 1 to enable DEBUG_STORE_DATA() macros for dumping - * intermediate signals from the codec. - */ -#define SILK_DEBUG 0 +/* make SILK_DEBUG dependent on compiler's _DEBUG */ +#if defined _WIN32 + #ifdef _DEBUG + #define SILK_DEBUG 1 + #else + #define SILK_DEBUG 0 + #endif + + /* overrule the above */ + #if 0 + /* #define NO_ASSERTS*/ + #undef SILK_DEBUG + #define SILK_DEBUG 1 + #endif +#else + #define SILK_DEBUG 0 +#endif /* Flag for using timers */ #define SILK_TIC_TOC 0 diff --git a/thirdparty/opus/silk/dec_API.c b/thirdparty/opus/silk/dec_API.c index 7d5ca7fb9f..b7d8ed48d8 100644 --- a/thirdparty/opus/silk/dec_API.c +++ b/thirdparty/opus/silk/dec_API.c @@ -104,7 +104,7 @@ opus_int silk_Decode( /* O Returns error co int delay_stack_alloc; SAVE_STACK; - celt_assert( decControl->nChannelsInternal == 1 || decControl->nChannelsInternal == 2 ); + silk_assert( decControl->nChannelsInternal == 1 || decControl->nChannelsInternal == 2 ); /**********************************/ /* Test if first frame in payload */ @@ -143,13 +143,13 @@ opus_int silk_Decode( /* O Returns error co channel_state[ n ].nFramesPerPacket = 3; channel_state[ n ].nb_subfr = 4; } else { - celt_assert( 0 ); + silk_assert( 0 ); RESTORE_STACK; return SILK_DEC_INVALID_FRAME_SIZE; } fs_kHz_dec = ( decControl->internalSampleRate >> 10 ) + 1; if( fs_kHz_dec != 8 && fs_kHz_dec != 12 && fs_kHz_dec != 16 ) { - celt_assert( 0 ); + silk_assert( 0 ); RESTORE_STACK; return SILK_DEC_INVALID_SAMPLING_FREQUENCY; } diff --git a/thirdparty/opus/silk/decode_core.c b/thirdparty/opus/silk/decode_core.c index 1c352a6522..e569c0e72b 100644 --- a/thirdparty/opus/silk/decode_core.c +++ b/thirdparty/opus/silk/decode_core.c @@ -141,7 +141,7 @@ void silk_decode_core( if( k == 0 || ( k == 2 && NLSF_interpolation_flag ) ) { /* Rewhiten with new A coefs */ start_idx = psDec->ltp_mem_length - lag - psDec->LPC_order - LTP_ORDER / 2; - celt_assert( start_idx > 0 ); + silk_assert( start_idx > 0 ); if( k == 2 ) { silk_memcpy( &psDec->outBuf[ psDec->ltp_mem_length ], xq, 2 * psDec->subfr_length * sizeof( opus_int16 ) ); @@ -196,7 +196,7 @@ void silk_decode_core( for( i = 0; i < psDec->subfr_length; i++ ) { /* Short-term prediction */ - celt_assert( psDec->LPC_order == 10 || psDec->LPC_order == 16 ); + silk_assert( psDec->LPC_order == 10 || psDec->LPC_order == 16 ); /* Avoids introducing a bias because silk_SMLAWB() always rounds to -inf */ LPC_pred_Q10 = silk_RSHIFT( psDec->LPC_order, 1 ); LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, sLPC_Q14[ MAX_LPC_ORDER + i - 1 ], A_Q12_tmp[ 0 ] ); @@ -225,6 +225,8 @@ void silk_decode_core( pxq[ i ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( silk_SMULWW( sLPC_Q14[ MAX_LPC_ORDER + i ], Gain_Q10 ), 8 ) ); } + /* DEBUG_STORE_DATA( dec.pcm, pxq, psDec->subfr_length * sizeof( opus_int16 ) ) */ + /* Update LPC filter state */ silk_memcpy( sLPC_Q14, &sLPC_Q14[ psDec->subfr_length ], MAX_LPC_ORDER * sizeof( opus_int32 ) ); pexc_Q14 += psDec->subfr_length; diff --git a/thirdparty/opus/silk/decode_frame.c b/thirdparty/opus/silk/decode_frame.c index e73825b267..a605d95ac6 100644 --- a/thirdparty/opus/silk/decode_frame.c +++ b/thirdparty/opus/silk/decode_frame.c @@ -55,7 +55,7 @@ opus_int silk_decode_frame( psDecCtrl->LTP_scale_Q14 = 0; /* Safety checks */ - celt_assert( L > 0 && L <= MAX_FRAME_LENGTH ); + silk_assert( L > 0 && L <= MAX_FRAME_LENGTH ); if( lostFlag == FLAG_DECODE_NORMAL || ( lostFlag == FLAG_DECODE_LBRR && psDec->LBRR_flags[ psDec->nFramesDecoded ] == 1 ) ) @@ -91,20 +91,19 @@ opus_int silk_decode_frame( psDec->lossCnt = 0; psDec->prevSignalType = psDec->indices.signalType; - celt_assert( psDec->prevSignalType >= 0 && psDec->prevSignalType <= 2 ); + silk_assert( psDec->prevSignalType >= 0 && psDec->prevSignalType <= 2 ); /* A frame has been decoded without errors */ psDec->first_frame_after_reset = 0; } else { /* Handle packet loss by extrapolation */ - psDec->indices.signalType = psDec->prevSignalType; silk_PLC( psDec, psDecCtrl, pOut, 1, arch ); } /*************************/ /* Update output buffer. */ /*************************/ - celt_assert( psDec->ltp_mem_length >= psDec->frame_length ); + silk_assert( psDec->ltp_mem_length >= psDec->frame_length ); mv_len = psDec->ltp_mem_length - psDec->frame_length; silk_memmove( psDec->outBuf, &psDec->outBuf[ psDec->frame_length ], mv_len * sizeof(opus_int16) ); silk_memcpy( &psDec->outBuf[ mv_len ], pOut, psDec->frame_length * sizeof( opus_int16 ) ); diff --git a/thirdparty/opus/silk/decode_indices.c b/thirdparty/opus/silk/decode_indices.c index 0bb4a997a5..7afe5c26c1 100644 --- a/thirdparty/opus/silk/decode_indices.c +++ b/thirdparty/opus/silk/decode_indices.c @@ -79,7 +79,7 @@ void silk_decode_indices( /**********************/ psDec->indices.NLSFIndices[ 0 ] = (opus_int8)ec_dec_icdf( psRangeDec, &psDec->psNLSF_CB->CB1_iCDF[ ( psDec->indices.signalType >> 1 ) * psDec->psNLSF_CB->nVectors ], 8 ); silk_NLSF_unpack( ec_ix, pred_Q8, psDec->psNLSF_CB, psDec->indices.NLSFIndices[ 0 ] ); - celt_assert( psDec->psNLSF_CB->order == psDec->LPC_order ); + silk_assert( psDec->psNLSF_CB->order == psDec->LPC_order ); for( i = 0; i < psDec->psNLSF_CB->order; i++ ) { Ix = ec_dec_icdf( psRangeDec, &psDec->psNLSF_CB->ec_iCDF[ ec_ix[ i ] ], 8 ); if( Ix == 0 ) { diff --git a/thirdparty/opus/silk/decode_parameters.c b/thirdparty/opus/silk/decode_parameters.c index a56a409858..e345b1dcef 100644 --- a/thirdparty/opus/silk/decode_parameters.c +++ b/thirdparty/opus/silk/decode_parameters.c @@ -52,7 +52,7 @@ void silk_decode_parameters( silk_NLSF_decode( pNLSF_Q15, psDec->indices.NLSFIndices, psDec->psNLSF_CB ); /* Convert NLSF parameters to AR prediction filter coefficients */ - silk_NLSF2A( psDecCtrl->PredCoef_Q12[ 1 ], pNLSF_Q15, psDec->LPC_order, psDec->arch ); + silk_NLSF2A( psDecCtrl->PredCoef_Q12[ 1 ], pNLSF_Q15, psDec->LPC_order ); /* If just reset, e.g., because internal Fs changed, do not allow interpolation */ /* improves the case of packet loss in the first frame after a switch */ @@ -69,7 +69,7 @@ void silk_decode_parameters( } /* Convert NLSF parameters to AR prediction filter coefficients */ - silk_NLSF2A( psDecCtrl->PredCoef_Q12[ 0 ], pNLSF0_Q15, psDec->LPC_order, psDec->arch ); + silk_NLSF2A( psDecCtrl->PredCoef_Q12[ 0 ], pNLSF0_Q15, psDec->LPC_order ); } else { /* Copy LPC coefficients for first half from second half */ silk_memcpy( psDecCtrl->PredCoef_Q12[ 0 ], psDecCtrl->PredCoef_Q12[ 1 ], psDec->LPC_order * sizeof( opus_int16 ) ); diff --git a/thirdparty/opus/silk/decode_pitch.c b/thirdparty/opus/silk/decode_pitch.c index fd1b6bf551..fedbc6a525 100644 --- a/thirdparty/opus/silk/decode_pitch.c +++ b/thirdparty/opus/silk/decode_pitch.c @@ -51,7 +51,7 @@ void silk_decode_pitch( Lag_CB_ptr = &silk_CB_lags_stage2[ 0 ][ 0 ]; cbk_size = PE_NB_CBKS_STAGE2_EXT; } else { - celt_assert( nb_subfr == PE_MAX_NB_SUBFR >> 1 ); + silk_assert( nb_subfr == PE_MAX_NB_SUBFR >> 1 ); Lag_CB_ptr = &silk_CB_lags_stage2_10_ms[ 0 ][ 0 ]; cbk_size = PE_NB_CBKS_STAGE2_10MS; } @@ -60,7 +60,7 @@ void silk_decode_pitch( Lag_CB_ptr = &silk_CB_lags_stage3[ 0 ][ 0 ]; cbk_size = PE_NB_CBKS_STAGE3_MAX; } else { - celt_assert( nb_subfr == PE_MAX_NB_SUBFR >> 1 ); + silk_assert( nb_subfr == PE_MAX_NB_SUBFR >> 1 ); Lag_CB_ptr = &silk_CB_lags_stage3_10_ms[ 0 ][ 0 ]; cbk_size = PE_NB_CBKS_STAGE3_10MS; } diff --git a/thirdparty/opus/silk/decode_pulses.c b/thirdparty/opus/silk/decode_pulses.c index a56d2d3074..d6bbec9225 100644 --- a/thirdparty/opus/silk/decode_pulses.c +++ b/thirdparty/opus/silk/decode_pulses.c @@ -56,7 +56,7 @@ void silk_decode_pulses( silk_assert( 1 << LOG2_SHELL_CODEC_FRAME_LENGTH == SHELL_CODEC_FRAME_LENGTH ); iter = silk_RSHIFT( frame_length, LOG2_SHELL_CODEC_FRAME_LENGTH ); if( iter * SHELL_CODEC_FRAME_LENGTH < frame_length ) { - celt_assert( frame_length == 12 * 10 ); /* Make sure only happens for 10 ms @ 12 kHz */ + silk_assert( frame_length == 12 * 10 ); /* Make sure only happens for 10 ms @ 12 kHz */ iter++; } diff --git a/thirdparty/opus/silk/decoder_set_fs.c b/thirdparty/opus/silk/decoder_set_fs.c index d9a13d0f0c..eef0fd25e1 100644 --- a/thirdparty/opus/silk/decoder_set_fs.c +++ b/thirdparty/opus/silk/decoder_set_fs.c @@ -40,8 +40,8 @@ opus_int silk_decoder_set_fs( { opus_int frame_length, ret = 0; - celt_assert( fs_kHz == 8 || fs_kHz == 12 || fs_kHz == 16 ); - celt_assert( psDec->nb_subfr == MAX_NB_SUBFR || psDec->nb_subfr == MAX_NB_SUBFR/2 ); + silk_assert( fs_kHz == 8 || fs_kHz == 12 || fs_kHz == 16 ); + silk_assert( psDec->nb_subfr == MAX_NB_SUBFR || psDec->nb_subfr == MAX_NB_SUBFR/2 ); /* New (sub)frame length */ psDec->subfr_length = silk_SMULBB( SUB_FRAME_LENGTH_MS, fs_kHz ); @@ -86,7 +86,7 @@ opus_int silk_decoder_set_fs( psDec->pitch_lag_low_bits_iCDF = silk_uniform4_iCDF; } else { /* unsupported sampling rate */ - celt_assert( 0 ); + silk_assert( 0 ); } psDec->first_frame_after_reset = 1; psDec->lagPrev = 100; @@ -101,7 +101,7 @@ opus_int silk_decoder_set_fs( } /* Check that settings are valid */ - celt_assert( psDec->frame_length > 0 && psDec->frame_length <= MAX_FRAME_LENGTH ); + silk_assert( psDec->frame_length > 0 && psDec->frame_length <= MAX_FRAME_LENGTH ); return ret; } diff --git a/thirdparty/opus/silk/define.h b/thirdparty/opus/silk/define.h index 247cb0bf71..19c9b00e25 100644 --- a/thirdparty/opus/silk/define.h +++ b/thirdparty/opus/silk/define.h @@ -46,6 +46,7 @@ extern "C" /* Limits on bitrate */ #define MIN_TARGET_RATE_BPS 5000 #define MAX_TARGET_RATE_BPS 80000 +#define TARGET_RATE_TAB_SZ 8 /* LBRR thresholds */ #define LBRR_NB_MIN_RATE_BPS 12000 @@ -55,12 +56,6 @@ extern "C" /* DTX settings */ #define NB_SPEECH_FRAMES_BEFORE_DTX 10 /* eq 200 ms */ #define MAX_CONSECUTIVE_DTX 20 /* eq 400 ms */ -#define DTX_ACTIVITY_THRESHOLD 0.1f - -/* VAD decision */ -#define VAD_NO_DECISION -1 -#define VAD_NO_ACTIVITY 0 -#define VAD_ACTIVITY 1 /* Maximum sampling frequency */ #define MAX_FS_KHZ 16 @@ -152,7 +147,7 @@ extern "C" #define USE_HARM_SHAPING 1 /* Max LPC order of noise shaping filters */ -#define MAX_SHAPE_LPC_ORDER 24 +#define MAX_SHAPE_LPC_ORDER 16 #define HARM_SHAPE_FIR_TAPS 3 @@ -162,7 +157,8 @@ extern "C" #define LTP_BUF_LENGTH 512 #define LTP_MASK ( LTP_BUF_LENGTH - 1 ) -#define DECISION_DELAY 40 +#define DECISION_DELAY 32 +#define DECISION_DELAY_MASK ( DECISION_DELAY - 1 ) /* Number of subframes for excitation entropy coding */ #define SHELL_CODEC_FRAME_LENGTH 16 @@ -177,7 +173,11 @@ extern "C" #define MAX_MATRIX_SIZE MAX_LPC_ORDER /* Max of LPC Order and LTP order */ +#if( MAX_LPC_ORDER > DECISION_DELAY ) # define NSQ_LPC_BUF_LENGTH MAX_LPC_ORDER +#else +# define NSQ_LPC_BUF_LENGTH DECISION_DELAY +#endif /***************************/ /* Voice activity detector */ @@ -205,6 +205,7 @@ extern "C" /******************/ #define NLSF_W_Q 2 #define NLSF_VQ_MAX_VECTORS 32 +#define NLSF_VQ_MAX_SURVIVORS 32 #define NLSF_QUANT_MAX_AMPLITUDE 4 #define NLSF_QUANT_MAX_AMPLITUDE_EXT 10 #define NLSF_QUANT_LEVEL_ADJ 0.1 diff --git a/thirdparty/opus/silk/enc_API.c b/thirdparty/opus/silk/enc_API.c index 55a33f37e9..f8060286db 100644 --- a/thirdparty/opus/silk/enc_API.c +++ b/thirdparty/opus/silk/enc_API.c @@ -82,7 +82,7 @@ opus_int silk_InitEncoder( /* O Returns error co silk_memset( psEnc, 0, sizeof( silk_encoder ) ); for( n = 0; n < ENCODER_NUM_CHANNELS; n++ ) { if( ret += silk_init_encoder( &psEnc->state_Fxx[ n ], arch ) ) { - celt_assert( 0 ); + silk_assert( 0 ); } } @@ -91,7 +91,7 @@ opus_int silk_InitEncoder( /* O Returns error co /* Read control structure */ if( ret += silk_QueryEncoder( encState, encStatus ) ) { - celt_assert( 0 ); + silk_assert( 0 ); } return ret; @@ -144,8 +144,7 @@ opus_int silk_Encode( /* O Returns error co opus_int nSamplesIn, /* I Number of samples in input vector */ ec_enc *psRangeEnc, /* I/O Compressor data structure */ opus_int32 *nBytesOut, /* I/O Number of bytes in payload (input: Max bytes) */ - const opus_int prefillFlag, /* I Flag to indicate prefilling buffers no coding */ - opus_int activity /* I Decision of Opus voice activity detector */ + const opus_int prefillFlag /* I Flag to indicate prefilling buffers no coding */ ) { opus_int n, i, nBits, flags, tmp_payloadSize_ms = 0, tmp_complexity = 0, ret = 0; @@ -167,7 +166,7 @@ opus_int silk_Encode( /* O Returns error co /* Check values in encoder control structure */ if( ( ret = check_control_input( encControl ) ) != 0 ) { - celt_assert( 0 ); + silk_assert( 0 ); RESTORE_STACK; return ret; } @@ -200,26 +199,16 @@ opus_int silk_Encode( /* O Returns error co tot_blocks = ( nBlocksOf10ms > 1 ) ? nBlocksOf10ms >> 1 : 1; curr_block = 0; if( prefillFlag ) { - silk_LP_state save_LP; /* Only accept input length of 10 ms */ if( nBlocksOf10ms != 1 ) { - celt_assert( 0 ); + silk_assert( 0 ); RESTORE_STACK; return SILK_ENC_INPUT_INVALID_NO_OF_SAMPLES; } - if ( prefillFlag == 2 ) { - save_LP = psEnc->state_Fxx[ 0 ].sCmn.sLP; - /* Save the sampling rate so the bandwidth switching code can keep handling transitions. */ - save_LP.saved_fs_kHz = psEnc->state_Fxx[ 0 ].sCmn.fs_kHz; - } /* Reset Encoder */ for( n = 0; n < encControl->nChannelsInternal; n++ ) { ret = silk_init_encoder( &psEnc->state_Fxx[ n ], psEnc->state_Fxx[ n ].sCmn.arch ); - /* Restore the variable LP state. */ - if ( prefillFlag == 2 ) { - psEnc->state_Fxx[ n ].sCmn.sLP = save_LP; - } - celt_assert( !ret ); + silk_assert( !ret ); } tmp_payloadSize_ms = encControl->payloadSize_ms; encControl->payloadSize_ms = 10; @@ -232,22 +221,23 @@ opus_int silk_Encode( /* O Returns error co } else { /* Only accept input lengths that are a multiple of 10 ms */ if( nBlocksOf10ms * encControl->API_sampleRate != 100 * nSamplesIn || nSamplesIn < 0 ) { - celt_assert( 0 ); + silk_assert( 0 ); RESTORE_STACK; return SILK_ENC_INPUT_INVALID_NO_OF_SAMPLES; } /* Make sure no more than one packet can be produced */ if( 1000 * (opus_int32)nSamplesIn > encControl->payloadSize_ms * encControl->API_sampleRate ) { - celt_assert( 0 ); + silk_assert( 0 ); RESTORE_STACK; return SILK_ENC_INPUT_INVALID_NO_OF_SAMPLES; } } + TargetRate_bps = silk_RSHIFT32( encControl->bitRate, encControl->nChannelsInternal - 1 ); for( n = 0; n < encControl->nChannelsInternal; n++ ) { /* Force the side channel to the same rate as the mid */ opus_int force_fs_kHz = (n==1) ? psEnc->state_Fxx[0].sCmn.fs_kHz : 0; - if( ( ret = silk_control_encoder( &psEnc->state_Fxx[ n ], encControl, psEnc->allowBandwidthSwitch, n, force_fs_kHz ) ) != 0 ) { + if( ( ret = silk_control_encoder( &psEnc->state_Fxx[ n ], encControl, TargetRate_bps, psEnc->allowBandwidthSwitch, n, force_fs_kHz ) ) != 0 ) { silk_assert( 0 ); RESTORE_STACK; return ret; @@ -259,7 +249,7 @@ opus_int silk_Encode( /* O Returns error co } psEnc->state_Fxx[ n ].sCmn.inDTX = psEnc->state_Fxx[ n ].sCmn.useDTX; } - celt_assert( encControl->nChannelsInternal == 1 || psEnc->state_Fxx[ 0 ].sCmn.fs_kHz == psEnc->state_Fxx[ 1 ].sCmn.fs_kHz ); + silk_assert( encControl->nChannelsInternal == 1 || psEnc->state_Fxx[ 0 ].sCmn.fs_kHz == psEnc->state_Fxx[ 1 ].sCmn.fs_kHz ); /* Input buffering/resampling and encoding */ nSamplesToBufferMax = @@ -317,7 +307,7 @@ opus_int silk_Encode( /* O Returns error co } psEnc->state_Fxx[ 0 ].sCmn.inputBufIx += nSamplesToBuffer; } else { - celt_assert( encControl->nChannelsAPI == 1 && encControl->nChannelsInternal == 1 ); + silk_assert( encControl->nChannelsAPI == 1 && encControl->nChannelsInternal == 1 ); silk_memcpy(buf, samplesIn, nSamplesFromInput*sizeof(opus_int16)); ret += silk_resampler( &psEnc->state_Fxx[ 0 ].sCmn.resampler_state, &psEnc->state_Fxx[ 0 ].sCmn.inputBuf[ psEnc->state_Fxx[ 0 ].sCmn.inputBufIx + 2 ], buf, nSamplesFromInput ); @@ -333,8 +323,8 @@ opus_int silk_Encode( /* O Returns error co /* Silk encoder */ if( psEnc->state_Fxx[ 0 ].sCmn.inputBufIx >= psEnc->state_Fxx[ 0 ].sCmn.frame_length ) { /* Enough data in input buffer, so encode */ - celt_assert( psEnc->state_Fxx[ 0 ].sCmn.inputBufIx == psEnc->state_Fxx[ 0 ].sCmn.frame_length ); - celt_assert( encControl->nChannelsInternal == 1 || psEnc->state_Fxx[ 1 ].sCmn.inputBufIx == psEnc->state_Fxx[ 1 ].sCmn.frame_length ); + silk_assert( psEnc->state_Fxx[ 0 ].sCmn.inputBufIx == psEnc->state_Fxx[ 0 ].sCmn.frame_length ); + silk_assert( encControl->nChannelsInternal == 1 || psEnc->state_Fxx[ 1 ].sCmn.inputBufIx == psEnc->state_Fxx[ 1 ].sCmn.frame_length ); /* Deal with LBRR data */ if( psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded == 0 && !prefillFlag ) { @@ -426,6 +416,7 @@ opus_int silk_Encode( /* O Returns error co /* Reset side channel encoder memory for first frame with side coding */ if( psEnc->prev_decode_only_middle == 1 ) { silk_memset( &psEnc->state_Fxx[ 1 ].sShape, 0, sizeof( psEnc->state_Fxx[ 1 ].sShape ) ); + silk_memset( &psEnc->state_Fxx[ 1 ].sPrefilt, 0, sizeof( psEnc->state_Fxx[ 1 ].sPrefilt ) ); silk_memset( &psEnc->state_Fxx[ 1 ].sCmn.sNSQ, 0, sizeof( psEnc->state_Fxx[ 1 ].sCmn.sNSQ ) ); silk_memset( psEnc->state_Fxx[ 1 ].sCmn.prev_NLSFq_Q15, 0, sizeof( psEnc->state_Fxx[ 1 ].sCmn.prev_NLSFq_Q15 ) ); silk_memset( &psEnc->state_Fxx[ 1 ].sCmn.sLP.In_LP_State, 0, sizeof( psEnc->state_Fxx[ 1 ].sCmn.sLP.In_LP_State ) ); @@ -436,7 +427,7 @@ opus_int silk_Encode( /* O Returns error co psEnc->state_Fxx[ 1 ].sCmn.sNSQ.prev_gain_Q16 = 65536; psEnc->state_Fxx[ 1 ].sCmn.first_frame_after_reset = 1; } - silk_encode_do_VAD_Fxx( &psEnc->state_Fxx[ 1 ], activity ); + silk_encode_do_VAD_Fxx( &psEnc->state_Fxx[ 1 ] ); } else { psEnc->state_Fxx[ 1 ].sCmn.VAD_flags[ psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded ] = 0; } @@ -451,7 +442,7 @@ opus_int silk_Encode( /* O Returns error co silk_memcpy( psEnc->state_Fxx[ 0 ].sCmn.inputBuf, psEnc->sStereo.sMid, 2 * sizeof( opus_int16 ) ); silk_memcpy( psEnc->sStereo.sMid, &psEnc->state_Fxx[ 0 ].sCmn.inputBuf[ psEnc->state_Fxx[ 0 ].sCmn.frame_length ], 2 * sizeof( opus_int16 ) ); } - silk_encode_do_VAD_Fxx( &psEnc->state_Fxx[ 0 ], activity ); + silk_encode_do_VAD_Fxx( &psEnc->state_Fxx[ 0 ] ); /* Encode */ for( n = 0; n < encControl->nChannelsInternal; n++ ) { @@ -566,10 +557,6 @@ opus_int silk_Encode( /* O Returns error co } } - encControl->signalType = psEnc->state_Fxx[0].sCmn.indices.signalType; - encControl->offset = silk_Quantization_Offsets_Q10 - [ psEnc->state_Fxx[0].sCmn.indices.signalType >> 1 ] - [ psEnc->state_Fxx[0].sCmn.indices.quantOffsetType ]; RESTORE_STACK; return ret; } diff --git a/thirdparty/opus/silk/encode_indices.c b/thirdparty/opus/silk/encode_indices.c index 4bcbc3347b..666c8c0b13 100644 --- a/thirdparty/opus/silk/encode_indices.c +++ b/thirdparty/opus/silk/encode_indices.c @@ -56,8 +56,8 @@ void silk_encode_indices( /* Encode signal type and quantizer offset */ /*******************************************/ typeOffset = 2 * psIndices->signalType + psIndices->quantOffsetType; - celt_assert( typeOffset >= 0 && typeOffset < 6 ); - celt_assert( encode_LBRR == 0 || typeOffset >= 2 ); + silk_assert( typeOffset >= 0 && typeOffset < 6 ); + silk_assert( encode_LBRR == 0 || typeOffset >= 2 ); if( encode_LBRR || typeOffset >= 2 ) { ec_enc_icdf( psRangeEnc, typeOffset - 2, silk_type_offset_VAD_iCDF, 8 ); } else { @@ -90,7 +90,7 @@ void silk_encode_indices( /****************/ ec_enc_icdf( psRangeEnc, psIndices->NLSFIndices[ 0 ], &psEncC->psNLSF_CB->CB1_iCDF[ ( psIndices->signalType >> 1 ) * psEncC->psNLSF_CB->nVectors ], 8 ); silk_NLSF_unpack( ec_ix, pred_Q8, psEncC->psNLSF_CB, psIndices->NLSFIndices[ 0 ] ); - celt_assert( psEncC->psNLSF_CB->order == psEncC->predictLPCOrder ); + silk_assert( psEncC->psNLSF_CB->order == psEncC->predictLPCOrder ); for( i = 0; i < psEncC->psNLSF_CB->order; i++ ) { if( psIndices->NLSFIndices[ i+1 ] >= NLSF_QUANT_MAX_AMPLITUDE ) { ec_enc_icdf( psRangeEnc, 2 * NLSF_QUANT_MAX_AMPLITUDE, &psEncC->psNLSF_CB->ec_iCDF[ ec_ix[ i ] ], 8 ); diff --git a/thirdparty/opus/silk/encode_pulses.c b/thirdparty/opus/silk/encode_pulses.c index 8a1999138b..ab00264f99 100644 --- a/thirdparty/opus/silk/encode_pulses.c +++ b/thirdparty/opus/silk/encode_pulses.c @@ -86,7 +86,7 @@ void silk_encode_pulses( silk_assert( 1 << LOG2_SHELL_CODEC_FRAME_LENGTH == SHELL_CODEC_FRAME_LENGTH ); iter = silk_RSHIFT( frame_length, LOG2_SHELL_CODEC_FRAME_LENGTH ); if( iter * SHELL_CODEC_FRAME_LENGTH < frame_length ) { - celt_assert( frame_length == 12 * 10 ); /* Make sure only happens for 10 ms @ 12 kHz */ + silk_assert( frame_length == 12 * 10 ); /* Make sure only happens for 10 ms @ 12 kHz */ iter++; silk_memset( &pulses[ frame_length ], 0, SHELL_CODEC_FRAME_LENGTH * sizeof(opus_int8)); } diff --git a/thirdparty/opus/silk/fixed/apply_sine_window_FIX.c b/thirdparty/opus/silk/fixed/apply_sine_window_FIX.c index 03e088a6de..4502b7130e 100644 --- a/thirdparty/opus/silk/fixed/apply_sine_window_FIX.c +++ b/thirdparty/opus/silk/fixed/apply_sine_window_FIX.c @@ -57,15 +57,15 @@ void silk_apply_sine_window( opus_int k, f_Q16, c_Q16; opus_int32 S0_Q16, S1_Q16; - celt_assert( win_type == 1 || win_type == 2 ); + silk_assert( win_type == 1 || win_type == 2 ); /* Length must be in a range from 16 to 120 and a multiple of 4 */ - celt_assert( length >= 16 && length <= 120 ); - celt_assert( ( length & 3 ) == 0 ); + silk_assert( length >= 16 && length <= 120 ); + silk_assert( ( length & 3 ) == 0 ); /* Frequency */ k = ( length >> 2 ) - 4; - celt_assert( k >= 0 && k <= 26 ); + silk_assert( k >= 0 && k <= 26 ); f_Q16 = (opus_int)freq_table_Q16[ k ]; /* Factor used for cosine approximation */ diff --git a/thirdparty/opus/silk/fixed/arm/warped_autocorrelation_FIX_arm.h b/thirdparty/opus/silk/fixed/arm/warped_autocorrelation_FIX_arm.h deleted file mode 100644 index 1992e43288..0000000000 --- a/thirdparty/opus/silk/fixed/arm/warped_autocorrelation_FIX_arm.h +++ /dev/null @@ -1,68 +0,0 @@ -/*********************************************************************** -Copyright (c) 2017 Google Inc. -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: -- Redistributions of source code must retain the above copyright notice, -this list of conditions and the following disclaimer. -- Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the -names of specific contributors, may be used to endorse or promote -products derived from this software without specific prior written -permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. -***********************************************************************/ - -#ifndef SILK_WARPED_AUTOCORRELATION_FIX_ARM_H -# define SILK_WARPED_AUTOCORRELATION_FIX_ARM_H - -# include "celt/arm/armcpu.h" - -# if defined(FIXED_POINT) - -# if defined(OPUS_ARM_MAY_HAVE_NEON_INTR) -void silk_warped_autocorrelation_FIX_neon( - opus_int32 *corr, /* O Result [order + 1] */ - opus_int *scale, /* O Scaling of the correlation vector */ - const opus_int16 *input, /* I Input data to correlate */ - const opus_int warping_Q16, /* I Warping coefficient */ - const opus_int length, /* I Length of input */ - const opus_int order /* I Correlation order (even) */ -); - -# if !defined(OPUS_HAVE_RTCD) && defined(OPUS_ARM_PRESUME_NEON) -# define OVERRIDE_silk_warped_autocorrelation_FIX (1) -# define silk_warped_autocorrelation_FIX(corr, scale, input, warping_Q16, length, order, arch) \ - ((void)(arch), PRESUME_NEON(silk_warped_autocorrelation_FIX)(corr, scale, input, warping_Q16, length, order)) -# endif -# endif - -# if !defined(OVERRIDE_silk_warped_autocorrelation_FIX) -/*Is run-time CPU detection enabled on this platform?*/ -# if defined(OPUS_HAVE_RTCD) && (defined(OPUS_ARM_MAY_HAVE_NEON_INTR) && !defined(OPUS_ARM_PRESUME_NEON_INTR)) -extern void (*const SILK_WARPED_AUTOCORRELATION_FIX_IMPL[OPUS_ARCHMASK+1])(opus_int32*, opus_int*, const opus_int16*, const opus_int, const opus_int, const opus_int); -# define OVERRIDE_silk_warped_autocorrelation_FIX (1) -# define silk_warped_autocorrelation_FIX(corr, scale, input, warping_Q16, length, order, arch) \ - ((*SILK_WARPED_AUTOCORRELATION_FIX_IMPL[(arch)&OPUS_ARCHMASK])(corr, scale, input, warping_Q16, length, order)) -# elif defined(OPUS_ARM_PRESUME_NEON_INTR) -# define OVERRIDE_silk_warped_autocorrelation_FIX (1) -# define silk_warped_autocorrelation_FIX(corr, scale, input, warping_Q16, length, order, arch) \ - ((void)(arch), silk_warped_autocorrelation_FIX_neon(corr, scale, input, warping_Q16, length, order)) -# endif -# endif - -# endif /* end FIXED_POINT */ - -#endif /* end SILK_WARPED_AUTOCORRELATION_FIX_ARM_H */ diff --git a/thirdparty/opus/silk/fixed/arm/warped_autocorrelation_FIX_neon_intr.c b/thirdparty/opus/silk/fixed/arm/warped_autocorrelation_FIX_neon_intr.c deleted file mode 100644 index 00a70cb51f..0000000000 --- a/thirdparty/opus/silk/fixed/arm/warped_autocorrelation_FIX_neon_intr.c +++ /dev/null @@ -1,260 +0,0 @@ -/*********************************************************************** -Copyright (c) 2017 Google Inc., Jean-Marc Valin -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: -- Redistributions of source code must retain the above copyright notice, -this list of conditions and the following disclaimer. -- Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. -- Neither the name of Internet Society, IETF or IETF Trust, nor the -names of specific contributors, may be used to endorse or promote -products derived from this software without specific prior written -permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. -***********************************************************************/ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include <arm_neon.h> -#ifdef OPUS_CHECK_ASM -# include <string.h> -#endif -#include "stack_alloc.h" -#include "main_FIX.h" - -static OPUS_INLINE void calc_corr( const opus_int32 *const input_QS, opus_int64 *const corr_QC, const opus_int offset, const int32x4_t state_QS_s32x4 ) -{ - int64x2_t corr_QC_s64x2[ 2 ], t_s64x2[ 2 ]; - const int32x4_t input_QS_s32x4 = vld1q_s32( input_QS + offset ); - corr_QC_s64x2[ 0 ] = vld1q_s64( corr_QC + offset + 0 ); - corr_QC_s64x2[ 1 ] = vld1q_s64( corr_QC + offset + 2 ); - t_s64x2[ 0 ] = vmull_s32( vget_low_s32( state_QS_s32x4 ), vget_low_s32( input_QS_s32x4 ) ); - t_s64x2[ 1 ] = vmull_s32( vget_high_s32( state_QS_s32x4 ), vget_high_s32( input_QS_s32x4 ) ); - corr_QC_s64x2[ 0 ] = vsraq_n_s64( corr_QC_s64x2[ 0 ], t_s64x2[ 0 ], 2 * QS - QC ); - corr_QC_s64x2[ 1 ] = vsraq_n_s64( corr_QC_s64x2[ 1 ], t_s64x2[ 1 ], 2 * QS - QC ); - vst1q_s64( corr_QC + offset + 0, corr_QC_s64x2[ 0 ] ); - vst1q_s64( corr_QC + offset + 2, corr_QC_s64x2[ 1 ] ); -} - -static OPUS_INLINE int32x4_t calc_state( const int32x4_t state_QS0_s32x4, const int32x4_t state_QS0_1_s32x4, const int32x4_t state_QS1_1_s32x4, const int32x4_t warping_Q16_s32x4 ) -{ - int32x4_t t_s32x4 = vsubq_s32( state_QS0_s32x4, state_QS0_1_s32x4 ); - t_s32x4 = vqdmulhq_s32( t_s32x4, warping_Q16_s32x4 ); - return vaddq_s32( state_QS1_1_s32x4, t_s32x4 ); -} - -void silk_warped_autocorrelation_FIX_neon( - opus_int32 *corr, /* O Result [order + 1] */ - opus_int *scale, /* O Scaling of the correlation vector */ - const opus_int16 *input, /* I Input data to correlate */ - const opus_int warping_Q16, /* I Warping coefficient */ - const opus_int length, /* I Length of input */ - const opus_int order /* I Correlation order (even) */ -) -{ - if( ( MAX_SHAPE_LPC_ORDER > 24 ) || ( order < 6 ) ) { - silk_warped_autocorrelation_FIX_c( corr, scale, input, warping_Q16, length, order ); - } else { - opus_int n, i, lsh; - opus_int64 corr_QC[ MAX_SHAPE_LPC_ORDER + 1 ] = { 0 }; /* In reverse order */ - opus_int64 corr_QC_orderT; - int64x2_t lsh_s64x2; - const opus_int orderT = ( order + 3 ) & ~3; - opus_int64 *corr_QCT; - opus_int32 *input_QS; - VARDECL( opus_int32, input_QST ); - VARDECL( opus_int32, state ); - SAVE_STACK; - - /* Order must be even */ - silk_assert( ( order & 1 ) == 0 ); - silk_assert( 2 * QS - QC >= 0 ); - - ALLOC( input_QST, length + 2 * MAX_SHAPE_LPC_ORDER, opus_int32 ); - - input_QS = input_QST; - /* input_QS has zero paddings in the beginning and end. */ - vst1q_s32( input_QS, vdupq_n_s32( 0 ) ); - input_QS += 4; - vst1q_s32( input_QS, vdupq_n_s32( 0 ) ); - input_QS += 4; - vst1q_s32( input_QS, vdupq_n_s32( 0 ) ); - input_QS += 4; - vst1q_s32( input_QS, vdupq_n_s32( 0 ) ); - input_QS += 4; - vst1q_s32( input_QS, vdupq_n_s32( 0 ) ); - input_QS += 4; - vst1q_s32( input_QS, vdupq_n_s32( 0 ) ); - input_QS += 4; - - /* Loop over samples */ - for( n = 0; n < length - 7; n += 8, input_QS += 8 ) { - const int16x8_t t0_s16x4 = vld1q_s16( input + n ); - vst1q_s32( input_QS + 0, vshll_n_s16( vget_low_s16( t0_s16x4 ), QS ) ); - vst1q_s32( input_QS + 4, vshll_n_s16( vget_high_s16( t0_s16x4 ), QS ) ); - } - for( ; n < length; n++, input_QS++ ) { - input_QS[ 0 ] = silk_LSHIFT32( (opus_int32)input[ n ], QS ); - } - vst1q_s32( input_QS, vdupq_n_s32( 0 ) ); - input_QS += 4; - vst1q_s32( input_QS, vdupq_n_s32( 0 ) ); - input_QS += 4; - vst1q_s32( input_QS, vdupq_n_s32( 0 ) ); - input_QS += 4; - vst1q_s32( input_QS, vdupq_n_s32( 0 ) ); - input_QS += 4; - vst1q_s32( input_QS, vdupq_n_s32( 0 ) ); - input_QS += 4; - vst1q_s32( input_QS, vdupq_n_s32( 0 ) ); - input_QS = input_QST + MAX_SHAPE_LPC_ORDER - orderT; - - /* The following loop runs ( length + order ) times, with ( order ) extra epilogues. */ - /* The zero paddings in input_QS guarantee corr_QC's correctness even with the extra epilogues. */ - /* The values of state_QS will be polluted by the extra epilogues, however they are temporary values. */ - - /* Keep the C code here to help understand the intrinsics optimization. */ - /* - { - opus_int32 state_QS[ 2 ][ MAX_SHAPE_LPC_ORDER + 1 ] = { 0 }; - opus_int32 *state_QST[ 3 ]; - state_QST[ 0 ] = state_QS[ 0 ]; - state_QST[ 1 ] = state_QS[ 1 ]; - for( n = 0; n < length + order; n++, input_QS++ ) { - state_QST[ 0 ][ orderT ] = input_QS[ orderT ]; - for( i = 0; i < orderT; i++ ) { - corr_QC[ i ] += silk_RSHIFT64( silk_SMULL( state_QST[ 0 ][ i ], input_QS[ i ] ), 2 * QS - QC ); - state_QST[ 1 ][ i ] = silk_SMLAWB( state_QST[ 1 ][ i + 1 ], state_QST[ 0 ][ i ] - state_QST[ 0 ][ i + 1 ], warping_Q16 ); - } - state_QST[ 2 ] = state_QST[ 0 ]; - state_QST[ 0 ] = state_QST[ 1 ]; - state_QST[ 1 ] = state_QST[ 2 ]; - } - } - */ - - { - const int32x4_t warping_Q16_s32x4 = vdupq_n_s32( warping_Q16 << 15 ); - const opus_int32 *in = input_QS + orderT; - opus_int o = orderT; - int32x4_t state_QS_s32x4[ 3 ][ 2 ]; - - ALLOC( state, length + orderT, opus_int32 ); - state_QS_s32x4[ 2 ][ 1 ] = vdupq_n_s32( 0 ); - - /* Calculate 8 taps of all inputs in each loop. */ - do { - state_QS_s32x4[ 0 ][ 0 ] = state_QS_s32x4[ 0 ][ 1 ] = - state_QS_s32x4[ 1 ][ 0 ] = state_QS_s32x4[ 1 ][ 1 ] = vdupq_n_s32( 0 ); - n = 0; - do { - calc_corr( input_QS + n, corr_QC, o - 8, state_QS_s32x4[ 0 ][ 0 ] ); - calc_corr( input_QS + n, corr_QC, o - 4, state_QS_s32x4[ 0 ][ 1 ] ); - state_QS_s32x4[ 2 ][ 1 ] = vld1q_s32( in + n ); - vst1q_lane_s32( state + n, state_QS_s32x4[ 0 ][ 0 ], 0 ); - state_QS_s32x4[ 2 ][ 0 ] = vextq_s32( state_QS_s32x4[ 0 ][ 0 ], state_QS_s32x4[ 0 ][ 1 ], 1 ); - state_QS_s32x4[ 2 ][ 1 ] = vextq_s32( state_QS_s32x4[ 0 ][ 1 ], state_QS_s32x4[ 2 ][ 1 ], 1 ); - state_QS_s32x4[ 0 ][ 0 ] = calc_state( state_QS_s32x4[ 0 ][ 0 ], state_QS_s32x4[ 2 ][ 0 ], state_QS_s32x4[ 1 ][ 0 ], warping_Q16_s32x4 ); - state_QS_s32x4[ 0 ][ 1 ] = calc_state( state_QS_s32x4[ 0 ][ 1 ], state_QS_s32x4[ 2 ][ 1 ], state_QS_s32x4[ 1 ][ 1 ], warping_Q16_s32x4 ); - state_QS_s32x4[ 1 ][ 0 ] = state_QS_s32x4[ 2 ][ 0 ]; - state_QS_s32x4[ 1 ][ 1 ] = state_QS_s32x4[ 2 ][ 1 ]; - } while( ++n < ( length + order ) ); - in = state; - o -= 8; - } while( o > 4 ); - - if( o ) { - /* Calculate the last 4 taps of all inputs. */ - opus_int32 *stateT = state; - silk_assert( o == 4 ); - state_QS_s32x4[ 0 ][ 0 ] = state_QS_s32x4[ 1 ][ 0 ] = vdupq_n_s32( 0 ); - n = length + order; - do { - calc_corr( input_QS, corr_QC, 0, state_QS_s32x4[ 0 ][ 0 ] ); - state_QS_s32x4[ 2 ][ 0 ] = vld1q_s32( stateT ); - vst1q_lane_s32( stateT, state_QS_s32x4[ 0 ][ 0 ], 0 ); - state_QS_s32x4[ 2 ][ 0 ] = vextq_s32( state_QS_s32x4[ 0 ][ 0 ], state_QS_s32x4[ 2 ][ 0 ], 1 ); - state_QS_s32x4[ 0 ][ 0 ] = calc_state( state_QS_s32x4[ 0 ][ 0 ], state_QS_s32x4[ 2 ][ 0 ], state_QS_s32x4[ 1 ][ 0 ], warping_Q16_s32x4 ); - state_QS_s32x4[ 1 ][ 0 ] = state_QS_s32x4[ 2 ][ 0 ]; - input_QS++; - stateT++; - } while( --n ); - } - } - - { - const opus_int16 *inputT = input; - int32x4_t t_s32x4; - int64x1_t t_s64x1; - int64x2_t t_s64x2 = vdupq_n_s64( 0 ); - for( n = 0; n <= length - 8; n += 8 ) { - int16x8_t input_s16x8 = vld1q_s16( inputT ); - t_s32x4 = vmull_s16( vget_low_s16( input_s16x8 ), vget_low_s16( input_s16x8 ) ); - t_s32x4 = vmlal_s16( t_s32x4, vget_high_s16( input_s16x8 ), vget_high_s16( input_s16x8 ) ); - t_s64x2 = vaddw_s32( t_s64x2, vget_low_s32( t_s32x4 ) ); - t_s64x2 = vaddw_s32( t_s64x2, vget_high_s32( t_s32x4 ) ); - inputT += 8; - } - t_s64x1 = vadd_s64( vget_low_s64( t_s64x2 ), vget_high_s64( t_s64x2 ) ); - corr_QC_orderT = vget_lane_s64( t_s64x1, 0 ); - for( ; n < length; n++ ) { - corr_QC_orderT += silk_SMULL( input[ n ], input[ n ] ); - } - corr_QC_orderT = silk_LSHIFT64( corr_QC_orderT, QC ); - corr_QC[ orderT ] = corr_QC_orderT; - } - - corr_QCT = corr_QC + orderT - order; - lsh = silk_CLZ64( corr_QC_orderT ) - 35; - lsh = silk_LIMIT( lsh, -12 - QC, 30 - QC ); - *scale = -( QC + lsh ); - silk_assert( *scale >= -30 && *scale <= 12 ); - lsh_s64x2 = vdupq_n_s64( lsh ); - for( i = 0; i <= order - 3; i += 4 ) { - int32x4_t corr_s32x4; - int64x2_t corr_QC0_s64x2, corr_QC1_s64x2; - corr_QC0_s64x2 = vld1q_s64( corr_QCT + i ); - corr_QC1_s64x2 = vld1q_s64( corr_QCT + i + 2 ); - corr_QC0_s64x2 = vshlq_s64( corr_QC0_s64x2, lsh_s64x2 ); - corr_QC1_s64x2 = vshlq_s64( corr_QC1_s64x2, lsh_s64x2 ); - corr_s32x4 = vcombine_s32( vmovn_s64( corr_QC1_s64x2 ), vmovn_s64( corr_QC0_s64x2 ) ); - corr_s32x4 = vrev64q_s32( corr_s32x4 ); - vst1q_s32( corr + order - i - 3, corr_s32x4 ); - } - if( lsh >= 0 ) { - for( ; i < order + 1; i++ ) { - corr[ order - i ] = (opus_int32)silk_CHECK_FIT32( silk_LSHIFT64( corr_QCT[ i ], lsh ) ); - } - } else { - for( ; i < order + 1; i++ ) { - corr[ order - i ] = (opus_int32)silk_CHECK_FIT32( silk_RSHIFT64( corr_QCT[ i ], -lsh ) ); - } - } - silk_assert( corr_QCT[ order ] >= 0 ); /* If breaking, decrease QC*/ - RESTORE_STACK; - } - -#ifdef OPUS_CHECK_ASM - { - opus_int32 corr_c[ MAX_SHAPE_LPC_ORDER + 1 ]; - opus_int scale_c; - silk_warped_autocorrelation_FIX_c( corr_c, &scale_c, input, warping_Q16, length, order ); - silk_assert( !memcmp( corr_c, corr, sizeof( corr_c[ 0 ] ) * ( order + 1 ) ) ); - silk_assert( scale_c == *scale ); - } -#endif -} diff --git a/thirdparty/opus/silk/fixed/burg_modified_FIX.c b/thirdparty/opus/silk/fixed/burg_modified_FIX.c index 274d4b28e1..17d0e0993c 100644 --- a/thirdparty/opus/silk/fixed/burg_modified_FIX.c +++ b/thirdparty/opus/silk/fixed/burg_modified_FIX.c @@ -37,7 +37,7 @@ POSSIBILITY OF SUCH DAMAGE. #define MAX_FRAME_SIZE 384 /* subfr_length * nb_subfr = ( 0.005 * 16000 + 16 ) * 4 = 384 */ #define QA 25 -#define N_BITS_HEAD_ROOM 3 +#define N_BITS_HEAD_ROOM 2 #define MIN_RSHIFTS -16 #define MAX_RSHIFTS (32 - QA) @@ -65,7 +65,7 @@ void silk_burg_modified_c( opus_int32 xcorr[ SILK_MAX_ORDER_LPC ]; opus_int64 C0_64; - celt_assert( subfr_length * nb_subfr <= MAX_FRAME_SIZE ); + silk_assert( subfr_length * nb_subfr <= MAX_FRAME_SIZE ); /* Compute autocorrelations, added over subframes */ C0_64 = silk_inner_prod16_aligned_64( x, x, subfr_length*nb_subfr, arch ); diff --git a/thirdparty/opus/silk/fixed/corrMatrix_FIX.c b/thirdparty/opus/silk/fixed/corrMatrix_FIX.c index 1b4a29c232..c1d437c785 100644 --- a/thirdparty/opus/silk/fixed/corrMatrix_FIX.c +++ b/thirdparty/opus/silk/fixed/corrMatrix_FIX.c @@ -58,7 +58,7 @@ void silk_corrVector_FIX( for( lag = 0; lag < order; lag++ ) { inner_prod = 0; for( i = 0; i < L; i++ ) { - inner_prod = silk_ADD_RSHIFT32( inner_prod, silk_SMULBB( ptr1[ i ], ptr2[i] ), rshifts ); + inner_prod += silk_RSHIFT32( silk_SMULBB( ptr1[ i ], ptr2[i] ), rshifts ); } Xt[ lag ] = inner_prod; /* X[:,lag]'*t */ ptr1--; /* Go to next column of X */ @@ -77,54 +77,61 @@ void silk_corrMatrix_FIX( const opus_int16 *x, /* I x vector [L + order - 1] used to form data matrix X */ const opus_int L, /* I Length of vectors */ const opus_int order, /* I Max lag for correlation */ + const opus_int head_room, /* I Desired headroom */ opus_int32 *XX, /* O Pointer to X'*X correlation matrix [ order x order ] */ - opus_int32 *nrg, /* O Energy of x vector */ - opus_int *rshifts, /* O Right shifts of correlations and energy */ + opus_int *rshifts, /* I/O Right shifts of correlations */ int arch /* I Run-time architecture */ ) { - opus_int i, j, lag; + opus_int i, j, lag, rshifts_local, head_room_rshifts; opus_int32 energy; const opus_int16 *ptr1, *ptr2; /* Calculate energy to find shift used to fit in 32 bits */ - silk_sum_sqr_shift( nrg, rshifts, x, L + order - 1 ); - energy = *nrg; + silk_sum_sqr_shift( &energy, &rshifts_local, x, L + order - 1 ); + /* Add shifts to get the desired head room */ + head_room_rshifts = silk_max( head_room - silk_CLZ32( energy ), 0 ); + + energy = silk_RSHIFT32( energy, head_room_rshifts ); + rshifts_local += head_room_rshifts; /* Calculate energy of first column (0) of X: X[:,0]'*X[:,0] */ /* Remove contribution of first order - 1 samples */ for( i = 0; i < order - 1; i++ ) { - energy -= silk_RSHIFT32( silk_SMULBB( x[ i ], x[ i ] ), *rshifts ); + energy -= silk_RSHIFT32( silk_SMULBB( x[ i ], x[ i ] ), rshifts_local ); + } + if( rshifts_local < *rshifts ) { + /* Adjust energy */ + energy = silk_RSHIFT32( energy, *rshifts - rshifts_local ); + rshifts_local = *rshifts; } /* Calculate energy of remaining columns of X: X[:,j]'*X[:,j] */ /* Fill out the diagonal of the correlation matrix */ matrix_ptr( XX, 0, 0, order ) = energy; - silk_assert( energy >= 0 ); ptr1 = &x[ order - 1 ]; /* First sample of column 0 of X */ for( j = 1; j < order; j++ ) { - energy = silk_SUB32( energy, silk_RSHIFT32( silk_SMULBB( ptr1[ L - j ], ptr1[ L - j ] ), *rshifts ) ); - energy = silk_ADD32( energy, silk_RSHIFT32( silk_SMULBB( ptr1[ -j ], ptr1[ -j ] ), *rshifts ) ); + energy = silk_SUB32( energy, silk_RSHIFT32( silk_SMULBB( ptr1[ L - j ], ptr1[ L - j ] ), rshifts_local ) ); + energy = silk_ADD32( energy, silk_RSHIFT32( silk_SMULBB( ptr1[ -j ], ptr1[ -j ] ), rshifts_local ) ); matrix_ptr( XX, j, j, order ) = energy; - silk_assert( energy >= 0 ); } ptr2 = &x[ order - 2 ]; /* First sample of column 1 of X */ /* Calculate the remaining elements of the correlation matrix */ - if( *rshifts > 0 ) { + if( rshifts_local > 0 ) { /* Right shifting used */ for( lag = 1; lag < order; lag++ ) { /* Inner product of column 0 and column lag: X[:,0]'*X[:,lag] */ energy = 0; for( i = 0; i < L; i++ ) { - energy += silk_RSHIFT32( silk_SMULBB( ptr1[ i ], ptr2[i] ), *rshifts ); + energy += silk_RSHIFT32( silk_SMULBB( ptr1[ i ], ptr2[i] ), rshifts_local ); } /* Calculate remaining off diagonal: X[:,j]'*X[:,j + lag] */ matrix_ptr( XX, lag, 0, order ) = energy; matrix_ptr( XX, 0, lag, order ) = energy; for( j = 1; j < ( order - lag ); j++ ) { - energy = silk_SUB32( energy, silk_RSHIFT32( silk_SMULBB( ptr1[ L - j ], ptr2[ L - j ] ), *rshifts ) ); - energy = silk_ADD32( energy, silk_RSHIFT32( silk_SMULBB( ptr1[ -j ], ptr2[ -j ] ), *rshifts ) ); + energy = silk_SUB32( energy, silk_RSHIFT32( silk_SMULBB( ptr1[ L - j ], ptr2[ L - j ] ), rshifts_local ) ); + energy = silk_ADD32( energy, silk_RSHIFT32( silk_SMULBB( ptr1[ -j ], ptr2[ -j ] ), rshifts_local ) ); matrix_ptr( XX, lag + j, j, order ) = energy; matrix_ptr( XX, j, lag + j, order ) = energy; } @@ -146,5 +153,6 @@ void silk_corrMatrix_FIX( ptr2--;/* Update pointer to first sample of next column (lag) in X */ } } + *rshifts = rshifts_local; } diff --git a/thirdparty/opus/silk/fixed/encode_frame_FIX.c b/thirdparty/opus/silk/fixed/encode_frame_FIX.c index a02bf87dbb..5ef44b03fc 100644 --- a/thirdparty/opus/silk/fixed/encode_frame_FIX.c +++ b/thirdparty/opus/silk/fixed/encode_frame_FIX.c @@ -29,7 +29,6 @@ POSSIBILITY OF SUCH DAMAGE. #include "config.h" #endif -#include <stdlib.h> #include "main_FIX.h" #include "stack_alloc.h" #include "tuning_parameters.h" @@ -38,33 +37,26 @@ POSSIBILITY OF SUCH DAMAGE. static OPUS_INLINE void silk_LBRR_encode_FIX( silk_encoder_state_FIX *psEnc, /* I/O Pointer to Silk FIX encoder state */ silk_encoder_control_FIX *psEncCtrl, /* I/O Pointer to Silk FIX encoder control struct */ - const opus_int16 x16[], /* I Input signal */ + const opus_int32 xfw_Q3[], /* I Input signal */ opus_int condCoding /* I The type of conditional coding used so far for this frame */ ); void silk_encode_do_VAD_FIX( - silk_encoder_state_FIX *psEnc, /* I/O Pointer to Silk FIX encoder state */ - opus_int activity /* I Decision of Opus voice activity detector */ + silk_encoder_state_FIX *psEnc /* I/O Pointer to Silk FIX encoder state */ ) { - const opus_int activity_threshold = SILK_FIX_CONST( SPEECH_ACTIVITY_DTX_THRES, 8 ); - /****************************/ /* Voice Activity Detection */ /****************************/ silk_VAD_GetSA_Q8( &psEnc->sCmn, psEnc->sCmn.inputBuf + 1, psEnc->sCmn.arch ); - /* If Opus VAD is inactive and Silk VAD is active: lower Silk VAD to just under the threshold */ - if( activity == VAD_NO_ACTIVITY && psEnc->sCmn.speech_activity_Q8 >= activity_threshold ) { - psEnc->sCmn.speech_activity_Q8 = activity_threshold - 1; - } /**************************************************/ /* Convert speech activity into VAD and DTX flags */ /**************************************************/ - if( psEnc->sCmn.speech_activity_Q8 < activity_threshold ) { + if( psEnc->sCmn.speech_activity_Q8 < SILK_FIX_CONST( SPEECH_ACTIVITY_DTX_THRES, 8 ) ) { psEnc->sCmn.indices.signalType = TYPE_NO_VOICE_ACTIVITY; psEnc->sCmn.noSpeechCounter++; - if( psEnc->sCmn.noSpeechCounter <= NB_SPEECH_FRAMES_BEFORE_DTX ) { + if( psEnc->sCmn.noSpeechCounter < NB_SPEECH_FRAMES_BEFORE_DTX ) { psEnc->sCmn.inDTX = 0; } else if( psEnc->sCmn.noSpeechCounter > MAX_CONSECUTIVE_DTX + NB_SPEECH_FRAMES_BEFORE_DTX ) { psEnc->sCmn.noSpeechCounter = NB_SPEECH_FRAMES_BEFORE_DTX; @@ -102,9 +94,6 @@ opus_int silk_encode_frame_FIX( opus_int16 ec_prevLagIndex_copy; opus_int ec_prevSignalType_copy; opus_int8 LastGainIndex_copy2; - opus_int gain_lock[ MAX_NB_SUBFR ] = {0}; - opus_int16 best_gain_mult[ MAX_NB_SUBFR ]; - opus_int best_sum[ MAX_NB_SUBFR ]; SAVE_STACK; /* This is totally unnecessary but many compilers (including gcc) are too dumb to realise it */ @@ -129,6 +118,7 @@ opus_int silk_encode_frame_FIX( silk_memcpy( x_frame + LA_SHAPE_MS * psEnc->sCmn.fs_kHz, psEnc->sCmn.inputBuf + 1, psEnc->sCmn.frame_length * sizeof( opus_int16 ) ); if( !psEnc->sCmn.prefillFlag ) { + VARDECL( opus_int32, xfw_Q3 ); VARDECL( opus_int16, res_pitch ); VARDECL( opus_uint8, ec_buf_copy ); opus_int16 *res_pitch_frame; @@ -142,7 +132,7 @@ opus_int silk_encode_frame_FIX( /*****************************************/ /* Find pitch lags, initial LPC analysis */ /*****************************************/ - silk_find_pitch_lags_FIX( psEnc, &sEncCtrl, res_pitch, x_frame - psEnc->sCmn.ltp_mem_length, psEnc->sCmn.arch ); + silk_find_pitch_lags_FIX( psEnc, &sEncCtrl, res_pitch, x_frame, psEnc->sCmn.arch ); /************************/ /* Noise shape analysis */ @@ -152,17 +142,23 @@ opus_int silk_encode_frame_FIX( /***************************************************/ /* Find linear prediction coefficients (LPC + LTP) */ /***************************************************/ - silk_find_pred_coefs_FIX( psEnc, &sEncCtrl, res_pitch_frame, x_frame, condCoding ); + silk_find_pred_coefs_FIX( psEnc, &sEncCtrl, res_pitch, x_frame, condCoding ); /****************************************/ /* Process gains */ /****************************************/ silk_process_gains_FIX( psEnc, &sEncCtrl, condCoding ); + /*****************************************/ + /* Prefiltering for noise shaper */ + /*****************************************/ + ALLOC( xfw_Q3, psEnc->sCmn.frame_length, opus_int32 ); + silk_prefilter_FIX( psEnc, &sEncCtrl, xfw_Q3, x_frame ); + /****************************************/ /* Low Bitrate Redundant Encoding */ /****************************************/ - silk_LBRR_encode_FIX( psEnc, &sEncCtrl, x_frame, condCoding ); + silk_LBRR_encode_FIX( psEnc, &sEncCtrl, xfw_Q3, condCoding ); /* Loop over quantizer and entropy coding to control bitrate */ maxIter = 6; @@ -198,21 +194,17 @@ opus_int silk_encode_frame_FIX( /* Noise shaping quantization */ /*****************************************/ if( psEnc->sCmn.nStatesDelayedDecision > 1 || psEnc->sCmn.warping_Q16 > 0 ) { - silk_NSQ_del_dec( &psEnc->sCmn, &psEnc->sCmn.sNSQ, &psEnc->sCmn.indices, x_frame, psEnc->sCmn.pulses, - sEncCtrl.PredCoef_Q12[ 0 ], sEncCtrl.LTPCoef_Q14, sEncCtrl.AR_Q13, sEncCtrl.HarmShapeGain_Q14, + silk_NSQ_del_dec( &psEnc->sCmn, &psEnc->sCmn.sNSQ, &psEnc->sCmn.indices, xfw_Q3, psEnc->sCmn.pulses, + sEncCtrl.PredCoef_Q12[ 0 ], sEncCtrl.LTPCoef_Q14, sEncCtrl.AR2_Q13, sEncCtrl.HarmShapeGain_Q14, sEncCtrl.Tilt_Q14, sEncCtrl.LF_shp_Q14, sEncCtrl.Gains_Q16, sEncCtrl.pitchL, sEncCtrl.Lambda_Q10, sEncCtrl.LTP_scale_Q14, psEnc->sCmn.arch ); } else { - silk_NSQ( &psEnc->sCmn, &psEnc->sCmn.sNSQ, &psEnc->sCmn.indices, x_frame, psEnc->sCmn.pulses, - sEncCtrl.PredCoef_Q12[ 0 ], sEncCtrl.LTPCoef_Q14, sEncCtrl.AR_Q13, sEncCtrl.HarmShapeGain_Q14, + silk_NSQ( &psEnc->sCmn, &psEnc->sCmn.sNSQ, &psEnc->sCmn.indices, xfw_Q3, psEnc->sCmn.pulses, + sEncCtrl.PredCoef_Q12[ 0 ], sEncCtrl.LTPCoef_Q14, sEncCtrl.AR2_Q13, sEncCtrl.HarmShapeGain_Q14, sEncCtrl.Tilt_Q14, sEncCtrl.LF_shp_Q14, sEncCtrl.Gains_Q16, sEncCtrl.pitchL, sEncCtrl.Lambda_Q10, sEncCtrl.LTP_scale_Q14, psEnc->sCmn.arch); } - if ( iter == maxIter && !found_lower ) { - silk_memcpy( &sRangeEnc_copy2, psRangeEnc, sizeof( ec_enc ) ); - } - /****************************************/ /* Encode Parameters */ /****************************************/ @@ -226,33 +218,6 @@ opus_int silk_encode_frame_FIX( nBits = ec_tell( psRangeEnc ); - /* If we still bust after the last iteration, do some damage control. */ - if ( iter == maxIter && !found_lower && nBits > maxBits ) { - silk_memcpy( psRangeEnc, &sRangeEnc_copy2, sizeof( ec_enc ) ); - - /* Keep gains the same as the last frame. */ - psEnc->sShape.LastGainIndex = sEncCtrl.lastGainIndexPrev; - for ( i = 0; i < psEnc->sCmn.nb_subfr; i++ ) { - psEnc->sCmn.indices.GainsIndices[ i ] = 4; - } - if (condCoding != CODE_CONDITIONALLY) { - psEnc->sCmn.indices.GainsIndices[ 0 ] = sEncCtrl.lastGainIndexPrev; - } - psEnc->sCmn.ec_prevLagIndex = ec_prevLagIndex_copy; - psEnc->sCmn.ec_prevSignalType = ec_prevSignalType_copy; - /* Clear all pulses. */ - for ( i = 0; i < psEnc->sCmn.frame_length; i++ ) { - psEnc->sCmn.pulses[ i ] = 0; - } - - silk_encode_indices( &psEnc->sCmn, psRangeEnc, psEnc->sCmn.nFramesEncoded, 0, condCoding ); - - silk_encode_pulses( psRangeEnc, psEnc->sCmn.indices.signalType, psEnc->sCmn.indices.quantOffsetType, - psEnc->sCmn.pulses, psEnc->sCmn.frame_length ); - - nBits = ec_tell( psRangeEnc ); - } - if( useCBR == 0 && iter == 0 && nBits <= maxBits ) { break; } @@ -262,7 +227,7 @@ opus_int silk_encode_frame_FIX( if( found_lower && ( gainsID == gainsID_lower || nBits > maxBits ) ) { /* Restore output state from earlier iteration that did meet the bitrate budget */ silk_memcpy( psRangeEnc, &sRangeEnc_copy2, sizeof( ec_enc ) ); - celt_assert( sRangeEnc_copy2.offs <= 1275 ); + silk_assert( sRangeEnc_copy2.offs <= 1275 ); silk_memcpy( psRangeEnc->buf, ec_buf_copy, sRangeEnc_copy2.offs ); silk_memcpy( &psEnc->sCmn.sNSQ, &sNSQ_copy2, sizeof( silk_nsq_state ) ); psEnc->sShape.LastGainIndex = LastGainIndex_copy2; @@ -290,7 +255,7 @@ opus_int silk_encode_frame_FIX( gainsID_lower = gainsID; /* Copy part of the output state */ silk_memcpy( &sRangeEnc_copy2, psRangeEnc, sizeof( ec_enc ) ); - celt_assert( psRangeEnc->offs <= 1275 ); + silk_assert( psRangeEnc->offs <= 1275 ); silk_memcpy( ec_buf_copy, psRangeEnc->buf, psRangeEnc->offs ); silk_memcpy( &sNSQ_copy2, &psEnc->sCmn.sNSQ, sizeof( silk_nsq_state ) ); LastGainIndex_copy2 = psEnc->sShape.LastGainIndex; @@ -300,35 +265,15 @@ opus_int silk_encode_frame_FIX( break; } - if ( !found_lower && nBits > maxBits ) { - int j; - for ( i = 0; i < psEnc->sCmn.nb_subfr; i++ ) { - int sum=0; - for ( j = i*psEnc->sCmn.subfr_length; j < (i+1)*psEnc->sCmn.subfr_length; j++ ) { - sum += abs( psEnc->sCmn.pulses[j] ); - } - if ( iter == 0 || (sum < best_sum[i] && !gain_lock[i]) ) { - best_sum[i] = sum; - best_gain_mult[i] = gainMult_Q8; - } else { - gain_lock[i] = 1; - } - } - } if( ( found_lower & found_upper ) == 0 ) { /* Adjust gain according to high-rate rate/distortion curve */ + opus_int32 gain_factor_Q16; + gain_factor_Q16 = silk_log2lin( silk_LSHIFT( nBits - maxBits, 7 ) / psEnc->sCmn.frame_length + SILK_FIX_CONST( 16, 7 ) ); + gain_factor_Q16 = silk_min_32( gain_factor_Q16, SILK_FIX_CONST( 2, 16 ) ); if( nBits > maxBits ) { - if (gainMult_Q8 < 16384) { - gainMult_Q8 *= 2; - } else { - gainMult_Q8 = 32767; - } - } else { - opus_int32 gain_factor_Q16; - gain_factor_Q16 = silk_log2lin( silk_LSHIFT( nBits - maxBits, 7 ) / psEnc->sCmn.frame_length + SILK_FIX_CONST( 16, 7 ) ); - gainMult_Q8 = silk_SMULWB( gain_factor_Q16, gainMult_Q8 ); + gain_factor_Q16 = silk_max_32( gain_factor_Q16, SILK_FIX_CONST( 1.3, 16 ) ); } - + gainMult_Q8 = silk_SMULWB( gain_factor_Q16, gainMult_Q8 ); } else { /* Adjust gain by interpolating */ gainMult_Q8 = gainMult_lower + silk_DIV32_16( silk_MUL( gainMult_upper - gainMult_lower, maxBits - nBits_lower ), nBits_upper - nBits_lower ); @@ -342,13 +287,7 @@ opus_int silk_encode_frame_FIX( } for( i = 0; i < psEnc->sCmn.nb_subfr; i++ ) { - opus_int16 tmp; - if ( gain_lock[i] ) { - tmp = best_gain_mult[i]; - } else { - tmp = gainMult_Q8; - } - sEncCtrl.Gains_Q16[ i ] = silk_LSHIFT_SAT32( silk_SMULWB( sEncCtrl.GainsUnq_Q16[ i ], tmp ), 8 ); + sEncCtrl.Gains_Q16[ i ] = silk_LSHIFT_SAT32( silk_SMULWB( sEncCtrl.GainsUnq_Q16[ i ], gainMult_Q8 ), 8 ); } /* Quantize gains */ @@ -392,7 +331,7 @@ opus_int silk_encode_frame_FIX( static OPUS_INLINE void silk_LBRR_encode_FIX( silk_encoder_state_FIX *psEnc, /* I/O Pointer to Silk FIX encoder state */ silk_encoder_control_FIX *psEncCtrl, /* I/O Pointer to Silk FIX encoder control struct */ - const opus_int16 x16[], /* I Input signal */ + const opus_int32 xfw_Q3[], /* I Input signal */ opus_int condCoding /* I The type of conditional coding used so far for this frame */ ) { @@ -431,14 +370,14 @@ static OPUS_INLINE void silk_LBRR_encode_FIX( /* Noise shaping quantization */ /*****************************************/ if( psEnc->sCmn.nStatesDelayedDecision > 1 || psEnc->sCmn.warping_Q16 > 0 ) { - silk_NSQ_del_dec( &psEnc->sCmn, &sNSQ_LBRR, psIndices_LBRR, x16, + silk_NSQ_del_dec( &psEnc->sCmn, &sNSQ_LBRR, psIndices_LBRR, xfw_Q3, psEnc->sCmn.pulses_LBRR[ psEnc->sCmn.nFramesEncoded ], psEncCtrl->PredCoef_Q12[ 0 ], psEncCtrl->LTPCoef_Q14, - psEncCtrl->AR_Q13, psEncCtrl->HarmShapeGain_Q14, psEncCtrl->Tilt_Q14, psEncCtrl->LF_shp_Q14, + psEncCtrl->AR2_Q13, psEncCtrl->HarmShapeGain_Q14, psEncCtrl->Tilt_Q14, psEncCtrl->LF_shp_Q14, psEncCtrl->Gains_Q16, psEncCtrl->pitchL, psEncCtrl->Lambda_Q10, psEncCtrl->LTP_scale_Q14, psEnc->sCmn.arch ); } else { - silk_NSQ( &psEnc->sCmn, &sNSQ_LBRR, psIndices_LBRR, x16, + silk_NSQ( &psEnc->sCmn, &sNSQ_LBRR, psIndices_LBRR, xfw_Q3, psEnc->sCmn.pulses_LBRR[ psEnc->sCmn.nFramesEncoded ], psEncCtrl->PredCoef_Q12[ 0 ], psEncCtrl->LTPCoef_Q14, - psEncCtrl->AR_Q13, psEncCtrl->HarmShapeGain_Q14, psEncCtrl->Tilt_Q14, psEncCtrl->LF_shp_Q14, + psEncCtrl->AR2_Q13, psEncCtrl->HarmShapeGain_Q14, psEncCtrl->Tilt_Q14, psEncCtrl->LF_shp_Q14, psEncCtrl->Gains_Q16, psEncCtrl->pitchL, psEncCtrl->Lambda_Q10, psEncCtrl->LTP_scale_Q14, psEnc->sCmn.arch ); } diff --git a/thirdparty/opus/silk/fixed/find_LPC_FIX.c b/thirdparty/opus/silk/fixed/find_LPC_FIX.c index c762a0f2a2..e11cdc86e6 100644 --- a/thirdparty/opus/silk/fixed/find_LPC_FIX.c +++ b/thirdparty/opus/silk/fixed/find_LPC_FIX.c @@ -92,7 +92,7 @@ void silk_find_LPC_FIX( silk_interpolate( NLSF0_Q15, psEncC->prev_NLSFq_Q15, NLSF_Q15, k, psEncC->predictLPCOrder ); /* Convert to LPC for residual energy evaluation */ - silk_NLSF2A( a_tmp_Q12, NLSF0_Q15, psEncC->predictLPCOrder, psEncC->arch ); + silk_NLSF2A( a_tmp_Q12, NLSF0_Q15, psEncC->predictLPCOrder ); /* Calculate residual energy with NLSF interpolation */ silk_LPC_analysis_filter( LPC_res, x, a_tmp_Q12, 2 * subfr_length, psEncC->predictLPCOrder, psEncC->arch ); @@ -146,6 +146,6 @@ void silk_find_LPC_FIX( silk_A2NLSF( NLSF_Q15, a_Q16, psEncC->predictLPCOrder ); } - celt_assert( psEncC->indices.NLSFInterpCoef_Q2 == 4 || ( psEncC->useInterpolatedNLSFs && !psEncC->first_frame_after_reset && psEncC->nb_subfr == MAX_NB_SUBFR ) ); + silk_assert( psEncC->indices.NLSFInterpCoef_Q2 == 4 || ( psEncC->useInterpolatedNLSFs && !psEncC->first_frame_after_reset && psEncC->nb_subfr == MAX_NB_SUBFR ) ); RESTORE_STACK; } diff --git a/thirdparty/opus/silk/fixed/find_LTP_FIX.c b/thirdparty/opus/silk/fixed/find_LTP_FIX.c index 62d4afb250..1314a28137 100644 --- a/thirdparty/opus/silk/fixed/find_LTP_FIX.c +++ b/thirdparty/opus/silk/fixed/find_LTP_FIX.c @@ -32,68 +32,214 @@ POSSIBILITY OF SUCH DAMAGE. #include "main_FIX.h" #include "tuning_parameters.h" +/* Head room for correlations */ +#define LTP_CORRS_HEAD_ROOM 2 + +void silk_fit_LTP( + opus_int32 LTP_coefs_Q16[ LTP_ORDER ], + opus_int16 LTP_coefs_Q14[ LTP_ORDER ] +); + void silk_find_LTP_FIX( - opus_int32 XXLTP_Q17[ MAX_NB_SUBFR * LTP_ORDER * LTP_ORDER ], /* O Correlation matrix */ - opus_int32 xXLTP_Q17[ MAX_NB_SUBFR * LTP_ORDER ], /* O Correlation vector */ - const opus_int16 r_ptr[], /* I Residual signal after LPC */ + opus_int16 b_Q14[ MAX_NB_SUBFR * LTP_ORDER ], /* O LTP coefs */ + opus_int32 WLTP[ MAX_NB_SUBFR * LTP_ORDER * LTP_ORDER ], /* O Weight for LTP quantization */ + opus_int *LTPredCodGain_Q7, /* O LTP coding gain */ + const opus_int16 r_lpc[], /* I residual signal after LPC signal + state for first 10 ms */ const opus_int lag[ MAX_NB_SUBFR ], /* I LTP lags */ - const opus_int subfr_length, /* I Subframe length */ - const opus_int nb_subfr, /* I Number of subframes */ + const opus_int32 Wght_Q15[ MAX_NB_SUBFR ], /* I weights */ + const opus_int subfr_length, /* I subframe length */ + const opus_int nb_subfr, /* I number of subframes */ + const opus_int mem_offset, /* I number of samples in LTP memory */ + opus_int corr_rshifts[ MAX_NB_SUBFR ], /* O right shifts applied to correlations */ int arch /* I Run-time architecture */ ) { - opus_int i, k, extra_shifts; - opus_int xx_shifts, xX_shifts, XX_shifts; - const opus_int16 *lag_ptr; - opus_int32 *XXLTP_Q17_ptr, *xXLTP_Q17_ptr; - opus_int32 xx, nrg, temp; - - xXLTP_Q17_ptr = xXLTP_Q17; - XXLTP_Q17_ptr = XXLTP_Q17; + opus_int i, k, lshift; + const opus_int16 *r_ptr, *lag_ptr; + opus_int16 *b_Q14_ptr; + + opus_int32 regu; + opus_int32 *WLTP_ptr; + opus_int32 b_Q16[ LTP_ORDER ], delta_b_Q14[ LTP_ORDER ], d_Q14[ MAX_NB_SUBFR ], nrg[ MAX_NB_SUBFR ], g_Q26; + opus_int32 w[ MAX_NB_SUBFR ], WLTP_max, max_abs_d_Q14, max_w_bits; + + opus_int32 temp32, denom32; + opus_int extra_shifts; + opus_int rr_shifts, maxRshifts, maxRshifts_wxtra, LZs; + opus_int32 LPC_res_nrg, LPC_LTP_res_nrg, div_Q16; + opus_int32 Rr[ LTP_ORDER ], rr[ MAX_NB_SUBFR ]; + opus_int32 wd, m_Q12; + + b_Q14_ptr = b_Q14; + WLTP_ptr = WLTP; + r_ptr = &r_lpc[ mem_offset ]; for( k = 0; k < nb_subfr; k++ ) { lag_ptr = r_ptr - ( lag[ k ] + LTP_ORDER / 2 ); - silk_sum_sqr_shift( &xx, &xx_shifts, r_ptr, subfr_length + LTP_ORDER ); /* xx in Q( -xx_shifts ) */ - silk_corrMatrix_FIX( lag_ptr, subfr_length, LTP_ORDER, XXLTP_Q17_ptr, &nrg, &XX_shifts, arch ); /* XXLTP_Q17_ptr and nrg in Q( -XX_shifts ) */ - extra_shifts = xx_shifts - XX_shifts; - if( extra_shifts > 0 ) { - /* Shift XX */ - xX_shifts = xx_shifts; - for( i = 0; i < LTP_ORDER * LTP_ORDER; i++ ) { - XXLTP_Q17_ptr[ i ] = silk_RSHIFT32( XXLTP_Q17_ptr[ i ], extra_shifts ); /* Q( -xX_shifts ) */ - } - nrg = silk_RSHIFT32( nrg, extra_shifts ); /* Q( -xX_shifts ) */ - } else if( extra_shifts < 0 ) { - /* Shift xx */ - xX_shifts = XX_shifts; - xx = silk_RSHIFT32( xx, -extra_shifts ); /* Q( -xX_shifts ) */ - } else { - xX_shifts = xx_shifts; + silk_sum_sqr_shift( &rr[ k ], &rr_shifts, r_ptr, subfr_length ); /* rr[ k ] in Q( -rr_shifts ) */ + + /* Assure headroom */ + LZs = silk_CLZ32( rr[k] ); + if( LZs < LTP_CORRS_HEAD_ROOM ) { + rr[ k ] = silk_RSHIFT_ROUND( rr[ k ], LTP_CORRS_HEAD_ROOM - LZs ); + rr_shifts += ( LTP_CORRS_HEAD_ROOM - LZs ); } - silk_corrVector_FIX( lag_ptr, r_ptr, subfr_length, LTP_ORDER, xXLTP_Q17_ptr, xX_shifts, arch ); /* xXLTP_Q17_ptr in Q( -xX_shifts ) */ + corr_rshifts[ k ] = rr_shifts; + silk_corrMatrix_FIX( lag_ptr, subfr_length, LTP_ORDER, LTP_CORRS_HEAD_ROOM, WLTP_ptr, &corr_rshifts[ k ], arch ); /* WLTP_fix_ptr in Q( -corr_rshifts[ k ] ) */ + + /* The correlation vector always has lower max abs value than rr and/or RR so head room is assured */ + silk_corrVector_FIX( lag_ptr, r_ptr, subfr_length, LTP_ORDER, Rr, corr_rshifts[ k ], arch ); /* Rr_fix_ptr in Q( -corr_rshifts[ k ] ) */ + if( corr_rshifts[ k ] > rr_shifts ) { + rr[ k ] = silk_RSHIFT( rr[ k ], corr_rshifts[ k ] - rr_shifts ); /* rr[ k ] in Q( -corr_rshifts[ k ] ) */ + } + silk_assert( rr[ k ] >= 0 ); + + regu = 1; + regu = silk_SMLAWB( regu, rr[ k ], SILK_FIX_CONST( LTP_DAMPING/3, 16 ) ); + regu = silk_SMLAWB( regu, matrix_ptr( WLTP_ptr, 0, 0, LTP_ORDER ), SILK_FIX_CONST( LTP_DAMPING/3, 16 ) ); + regu = silk_SMLAWB( regu, matrix_ptr( WLTP_ptr, LTP_ORDER-1, LTP_ORDER-1, LTP_ORDER ), SILK_FIX_CONST( LTP_DAMPING/3, 16 ) ); + silk_regularize_correlations_FIX( WLTP_ptr, &rr[k], regu, LTP_ORDER ); + + silk_solve_LDL_FIX( WLTP_ptr, LTP_ORDER, Rr, b_Q16 ); /* WLTP_fix_ptr and Rr_fix_ptr both in Q(-corr_rshifts[k]) */ + + /* Limit and store in Q14 */ + silk_fit_LTP( b_Q16, b_Q14_ptr ); + + /* Calculate residual energy */ + nrg[ k ] = silk_residual_energy16_covar_FIX( b_Q14_ptr, WLTP_ptr, Rr, rr[ k ], LTP_ORDER, 14 ); /* nrg_fix in Q( -corr_rshifts[ k ] ) */ + + /* temp = Wght[ k ] / ( nrg[ k ] * Wght[ k ] + 0.01f * subfr_length ); */ + extra_shifts = silk_min_int( corr_rshifts[ k ], LTP_CORRS_HEAD_ROOM ); + denom32 = silk_LSHIFT_SAT32( silk_SMULWB( nrg[ k ], Wght_Q15[ k ] ), 1 + extra_shifts ) + /* Q( -corr_rshifts[ k ] + extra_shifts ) */ + silk_RSHIFT( silk_SMULWB( (opus_int32)subfr_length, 655 ), corr_rshifts[ k ] - extra_shifts ); /* Q( -corr_rshifts[ k ] + extra_shifts ) */ + denom32 = silk_max( denom32, 1 ); + silk_assert( ((opus_int64)Wght_Q15[ k ] << 16 ) < silk_int32_MAX ); /* Wght always < 0.5 in Q0 */ + temp32 = silk_DIV32( silk_LSHIFT( (opus_int32)Wght_Q15[ k ], 16 ), denom32 ); /* Q( 15 + 16 + corr_rshifts[k] - extra_shifts ) */ + temp32 = silk_RSHIFT( temp32, 31 + corr_rshifts[ k ] - extra_shifts - 26 ); /* Q26 */ - /* At this point all correlations are in Q(-xX_shifts) */ - temp = silk_SMLAWB( 1, nrg, SILK_FIX_CONST( LTP_CORR_INV_MAX, 16 ) ); - temp = silk_max( temp, xx ); -TIC(div) -#if 0 + /* Limit temp such that the below scaling never wraps around */ + WLTP_max = 0; for( i = 0; i < LTP_ORDER * LTP_ORDER; i++ ) { - XXLTP_Q17_ptr[ i ] = silk_DIV32_varQ( XXLTP_Q17_ptr[ i ], temp, 17 ); + WLTP_max = silk_max( WLTP_ptr[ i ], WLTP_max ); } + lshift = silk_CLZ32( WLTP_max ) - 1 - 3; /* keep 3 bits free for vq_nearest_neighbor_fix */ + silk_assert( 26 - 18 + lshift >= 0 ); + if( 26 - 18 + lshift < 31 ) { + temp32 = silk_min_32( temp32, silk_LSHIFT( (opus_int32)1, 26 - 18 + lshift ) ); + } + + silk_scale_vector32_Q26_lshift_18( WLTP_ptr, temp32, LTP_ORDER * LTP_ORDER ); /* WLTP_ptr in Q( 18 - corr_rshifts[ k ] ) */ + + w[ k ] = matrix_ptr( WLTP_ptr, LTP_ORDER/2, LTP_ORDER/2, LTP_ORDER ); /* w in Q( 18 - corr_rshifts[ k ] ) */ + silk_assert( w[k] >= 0 ); + + r_ptr += subfr_length; + b_Q14_ptr += LTP_ORDER; + WLTP_ptr += LTP_ORDER * LTP_ORDER; + } + + maxRshifts = 0; + for( k = 0; k < nb_subfr; k++ ) { + maxRshifts = silk_max_int( corr_rshifts[ k ], maxRshifts ); + } + + /* Compute LTP coding gain */ + if( LTPredCodGain_Q7 != NULL ) { + LPC_LTP_res_nrg = 0; + LPC_res_nrg = 0; + silk_assert( LTP_CORRS_HEAD_ROOM >= 2 ); /* Check that no overflow will happen when adding */ + for( k = 0; k < nb_subfr; k++ ) { + LPC_res_nrg = silk_ADD32( LPC_res_nrg, silk_RSHIFT( silk_ADD32( silk_SMULWB( rr[ k ], Wght_Q15[ k ] ), 1 ), 1 + ( maxRshifts - corr_rshifts[ k ] ) ) ); /* Q( -maxRshifts ) */ + LPC_LTP_res_nrg = silk_ADD32( LPC_LTP_res_nrg, silk_RSHIFT( silk_ADD32( silk_SMULWB( nrg[ k ], Wght_Q15[ k ] ), 1 ), 1 + ( maxRshifts - corr_rshifts[ k ] ) ) ); /* Q( -maxRshifts ) */ + } + LPC_LTP_res_nrg = silk_max( LPC_LTP_res_nrg, 1 ); /* avoid division by zero */ + + div_Q16 = silk_DIV32_varQ( LPC_res_nrg, LPC_LTP_res_nrg, 16 ); + *LTPredCodGain_Q7 = ( opus_int )silk_SMULBB( 3, silk_lin2log( div_Q16 ) - ( 16 << 7 ) ); + + silk_assert( *LTPredCodGain_Q7 == ( opus_int )silk_SAT16( silk_MUL( 3, silk_lin2log( div_Q16 ) - ( 16 << 7 ) ) ) ); + } + + /* smoothing */ + /* d = sum( B, 1 ); */ + b_Q14_ptr = b_Q14; + for( k = 0; k < nb_subfr; k++ ) { + d_Q14[ k ] = 0; for( i = 0; i < LTP_ORDER; i++ ) { - xXLTP_Q17_ptr[ i ] = silk_DIV32_varQ( xXLTP_Q17_ptr[ i ], temp, 17 ); + d_Q14[ k ] += b_Q14_ptr[ i ]; } -#else - for( i = 0; i < LTP_ORDER * LTP_ORDER; i++ ) { - XXLTP_Q17_ptr[ i ] = (opus_int32)( silk_LSHIFT64( (opus_int64)XXLTP_Q17_ptr[ i ], 17 ) / temp ); + b_Q14_ptr += LTP_ORDER; + } + + /* m = ( w * d' ) / ( sum( w ) + 1e-3 ); */ + + /* Find maximum absolute value of d_Q14 and the bits used by w in Q0 */ + max_abs_d_Q14 = 0; + max_w_bits = 0; + for( k = 0; k < nb_subfr; k++ ) { + max_abs_d_Q14 = silk_max_32( max_abs_d_Q14, silk_abs( d_Q14[ k ] ) ); + /* w[ k ] is in Q( 18 - corr_rshifts[ k ] ) */ + /* Find bits needed in Q( 18 - maxRshifts ) */ + max_w_bits = silk_max_32( max_w_bits, 32 - silk_CLZ32( w[ k ] ) + corr_rshifts[ k ] - maxRshifts ); + } + + /* max_abs_d_Q14 = (5 << 15); worst case, i.e. LTP_ORDER * -silk_int16_MIN */ + silk_assert( max_abs_d_Q14 <= ( 5 << 15 ) ); + + /* How many bits is needed for w*d' in Q( 18 - maxRshifts ) in the worst case, of all d_Q14's being equal to max_abs_d_Q14 */ + extra_shifts = max_w_bits + 32 - silk_CLZ32( max_abs_d_Q14 ) - 14; + + /* Subtract what we got available; bits in output var plus maxRshifts */ + extra_shifts -= ( 32 - 1 - 2 + maxRshifts ); /* Keep sign bit free as well as 2 bits for accumulation */ + extra_shifts = silk_max_int( extra_shifts, 0 ); + + maxRshifts_wxtra = maxRshifts + extra_shifts; + + temp32 = silk_RSHIFT( 262, maxRshifts + extra_shifts ) + 1; /* 1e-3f in Q( 18 - (maxRshifts + extra_shifts) ) */ + wd = 0; + for( k = 0; k < nb_subfr; k++ ) { + /* w has at least 2 bits of headroom so no overflow should happen */ + temp32 = silk_ADD32( temp32, silk_RSHIFT( w[ k ], maxRshifts_wxtra - corr_rshifts[ k ] ) ); /* Q( 18 - maxRshifts_wxtra ) */ + wd = silk_ADD32( wd, silk_LSHIFT( silk_SMULWW( silk_RSHIFT( w[ k ], maxRshifts_wxtra - corr_rshifts[ k ] ), d_Q14[ k ] ), 2 ) ); /* Q( 18 - maxRshifts_wxtra ) */ + } + m_Q12 = silk_DIV32_varQ( wd, temp32, 12 ); + + b_Q14_ptr = b_Q14; + for( k = 0; k < nb_subfr; k++ ) { + /* w_fix[ k ] from Q( 18 - corr_rshifts[ k ] ) to Q( 16 ) */ + if( 2 - corr_rshifts[k] > 0 ) { + temp32 = silk_RSHIFT( w[ k ], 2 - corr_rshifts[ k ] ); + } else { + temp32 = silk_LSHIFT_SAT32( w[ k ], corr_rshifts[ k ] - 2 ); } + + g_Q26 = silk_MUL( + silk_DIV32( + SILK_FIX_CONST( LTP_SMOOTHING, 26 ), + silk_RSHIFT( SILK_FIX_CONST( LTP_SMOOTHING, 26 ), 10 ) + temp32 ), /* Q10 */ + silk_LSHIFT_SAT32( silk_SUB_SAT32( (opus_int32)m_Q12, silk_RSHIFT( d_Q14[ k ], 2 ) ), 4 ) ); /* Q16 */ + + temp32 = 0; for( i = 0; i < LTP_ORDER; i++ ) { - xXLTP_Q17_ptr[ i ] = (opus_int32)( silk_LSHIFT64( (opus_int64)xXLTP_Q17_ptr[ i ], 17 ) / temp ); + delta_b_Q14[ i ] = silk_max_16( b_Q14_ptr[ i ], 1638 ); /* 1638_Q14 = 0.1_Q0 */ + temp32 += delta_b_Q14[ i ]; /* Q14 */ } -#endif -TOC(div) - r_ptr += subfr_length; - XXLTP_Q17_ptr += LTP_ORDER * LTP_ORDER; - xXLTP_Q17_ptr += LTP_ORDER; + temp32 = silk_DIV32( g_Q26, temp32 ); /* Q14 -> Q12 */ + for( i = 0; i < LTP_ORDER; i++ ) { + b_Q14_ptr[ i ] = silk_LIMIT_32( (opus_int32)b_Q14_ptr[ i ] + silk_SMULWB( silk_LSHIFT_SAT32( temp32, 4 ), delta_b_Q14[ i ] ), -16000, 28000 ); + } + b_Q14_ptr += LTP_ORDER; + } +} + +void silk_fit_LTP( + opus_int32 LTP_coefs_Q16[ LTP_ORDER ], + opus_int16 LTP_coefs_Q14[ LTP_ORDER ] +) +{ + opus_int i; + + for( i = 0; i < LTP_ORDER; i++ ) { + LTP_coefs_Q14[ i ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( LTP_coefs_Q16[ i ], 2 ) ); } } diff --git a/thirdparty/opus/silk/fixed/find_pitch_lags_FIX.c b/thirdparty/opus/silk/fixed/find_pitch_lags_FIX.c index 6c3379f2bb..b8440a8247 100644 --- a/thirdparty/opus/silk/fixed/find_pitch_lags_FIX.c +++ b/thirdparty/opus/silk/fixed/find_pitch_lags_FIX.c @@ -44,7 +44,7 @@ void silk_find_pitch_lags_FIX( { opus_int buf_len, i, scale; opus_int32 thrhld_Q13, res_nrg; - const opus_int16 *x_ptr; + const opus_int16 *x_buf, *x_buf_ptr; VARDECL( opus_int16, Wsig ); opus_int16 *Wsig_ptr; opus_int32 auto_corr[ MAX_FIND_PITCH_LPC_ORDER + 1 ]; @@ -59,7 +59,9 @@ void silk_find_pitch_lags_FIX( buf_len = psEnc->sCmn.la_pitch + psEnc->sCmn.frame_length + psEnc->sCmn.ltp_mem_length; /* Safety check */ - celt_assert( buf_len >= psEnc->sCmn.pitch_LPC_win_length ); + silk_assert( buf_len >= psEnc->sCmn.pitch_LPC_win_length ); + + x_buf = x - psEnc->sCmn.ltp_mem_length; /*************************************/ /* Estimate LPC AR coefficients */ @@ -70,19 +72,19 @@ void silk_find_pitch_lags_FIX( ALLOC( Wsig, psEnc->sCmn.pitch_LPC_win_length, opus_int16 ); /* First LA_LTP samples */ - x_ptr = x + buf_len - psEnc->sCmn.pitch_LPC_win_length; + x_buf_ptr = x_buf + buf_len - psEnc->sCmn.pitch_LPC_win_length; Wsig_ptr = Wsig; - silk_apply_sine_window( Wsig_ptr, x_ptr, 1, psEnc->sCmn.la_pitch ); + silk_apply_sine_window( Wsig_ptr, x_buf_ptr, 1, psEnc->sCmn.la_pitch ); /* Middle un - windowed samples */ Wsig_ptr += psEnc->sCmn.la_pitch; - x_ptr += psEnc->sCmn.la_pitch; - silk_memcpy( Wsig_ptr, x_ptr, ( psEnc->sCmn.pitch_LPC_win_length - silk_LSHIFT( psEnc->sCmn.la_pitch, 1 ) ) * sizeof( opus_int16 ) ); + x_buf_ptr += psEnc->sCmn.la_pitch; + silk_memcpy( Wsig_ptr, x_buf_ptr, ( psEnc->sCmn.pitch_LPC_win_length - silk_LSHIFT( psEnc->sCmn.la_pitch, 1 ) ) * sizeof( opus_int16 ) ); /* Last LA_LTP samples */ Wsig_ptr += psEnc->sCmn.pitch_LPC_win_length - silk_LSHIFT( psEnc->sCmn.la_pitch, 1 ); - x_ptr += psEnc->sCmn.pitch_LPC_win_length - silk_LSHIFT( psEnc->sCmn.la_pitch, 1 ); - silk_apply_sine_window( Wsig_ptr, x_ptr, 2, psEnc->sCmn.la_pitch ); + x_buf_ptr += psEnc->sCmn.pitch_LPC_win_length - silk_LSHIFT( psEnc->sCmn.la_pitch, 1 ); + silk_apply_sine_window( Wsig_ptr, x_buf_ptr, 2, psEnc->sCmn.la_pitch ); /* Calculate autocorrelation sequence */ silk_autocorr( auto_corr, &scale, Wsig, psEnc->sCmn.pitch_LPC_win_length, psEnc->sCmn.pitchEstimationLPCOrder + 1, arch ); @@ -110,7 +112,7 @@ void silk_find_pitch_lags_FIX( /*****************************************/ /* LPC analysis filtering */ /*****************************************/ - silk_LPC_analysis_filter( res, x, A_Q12, buf_len, psEnc->sCmn.pitchEstimationLPCOrder, psEnc->sCmn.arch ); + silk_LPC_analysis_filter( res, x_buf, A_Q12, buf_len, psEnc->sCmn.pitchEstimationLPCOrder, psEnc->sCmn.arch ); if( psEnc->sCmn.indices.signalType != TYPE_NO_VOICE_ACTIVITY && psEnc->sCmn.first_frame_after_reset == 0 ) { /* Threshold for pitch estimator */ diff --git a/thirdparty/opus/silk/fixed/find_pred_coefs_FIX.c b/thirdparty/opus/silk/fixed/find_pred_coefs_FIX.c index 606d863347..d308e9cf5f 100644 --- a/thirdparty/opus/silk/fixed/find_pred_coefs_FIX.c +++ b/thirdparty/opus/silk/fixed/find_pred_coefs_FIX.c @@ -41,12 +41,13 @@ void silk_find_pred_coefs_FIX( ) { opus_int i; - opus_int32 invGains_Q16[ MAX_NB_SUBFR ], local_gains[ MAX_NB_SUBFR ]; + opus_int32 invGains_Q16[ MAX_NB_SUBFR ], local_gains[ MAX_NB_SUBFR ], Wght_Q15[ MAX_NB_SUBFR ]; opus_int16 NLSF_Q15[ MAX_LPC_ORDER ]; const opus_int16 *x_ptr; opus_int16 *x_pre_ptr; VARDECL( opus_int16, LPC_in_pre ); - opus_int32 min_gain_Q16, minInvGain_Q30; + opus_int32 tmp, min_gain_Q16, minInvGain_Q30; + opus_int LTP_corrs_rshift[ MAX_NB_SUBFR ]; SAVE_STACK; /* weighting for weighted least squares */ @@ -60,11 +61,13 @@ void silk_find_pred_coefs_FIX( /* Invert and normalize gains, and ensure that maximum invGains_Q16 is within range of a 16 bit int */ invGains_Q16[ i ] = silk_DIV32_varQ( min_gain_Q16, psEncCtrl->Gains_Q16[ i ], 16 - 2 ); - /* Limit inverse */ - invGains_Q16[ i ] = silk_max( invGains_Q16[ i ], 100 ); + /* Ensure Wght_Q15 a minimum value 1 */ + invGains_Q16[ i ] = silk_max( invGains_Q16[ i ], 363 ); /* Square the inverted gains */ silk_assert( invGains_Q16[ i ] == silk_SAT16( invGains_Q16[ i ] ) ); + tmp = silk_SMULWB( invGains_Q16[ i ], invGains_Q16[ i ] ); + Wght_Q15[ i ] = silk_RSHIFT( tmp, 1 ); /* Invert the inverted and normalized gains */ local_gains[ i ] = silk_DIV32( ( (opus_int32)1 << 16 ), invGains_Q16[ i ] ); @@ -74,24 +77,24 @@ void silk_find_pred_coefs_FIX( psEnc->sCmn.nb_subfr * psEnc->sCmn.predictLPCOrder + psEnc->sCmn.frame_length, opus_int16 ); if( psEnc->sCmn.indices.signalType == TYPE_VOICED ) { - VARDECL( opus_int32, xXLTP_Q17 ); - VARDECL( opus_int32, XXLTP_Q17 ); + VARDECL( opus_int32, WLTP ); /**********/ /* VOICED */ /**********/ - celt_assert( psEnc->sCmn.ltp_mem_length - psEnc->sCmn.predictLPCOrder >= psEncCtrl->pitchL[ 0 ] + LTP_ORDER / 2 ); + silk_assert( psEnc->sCmn.ltp_mem_length - psEnc->sCmn.predictLPCOrder >= psEncCtrl->pitchL[ 0 ] + LTP_ORDER / 2 ); - ALLOC( xXLTP_Q17, psEnc->sCmn.nb_subfr * LTP_ORDER, opus_int32 ); - ALLOC( XXLTP_Q17, psEnc->sCmn.nb_subfr * LTP_ORDER * LTP_ORDER, opus_int32 ); + ALLOC( WLTP, psEnc->sCmn.nb_subfr * LTP_ORDER * LTP_ORDER, opus_int32 ); /* LTP analysis */ - silk_find_LTP_FIX( XXLTP_Q17, xXLTP_Q17, res_pitch, - psEncCtrl->pitchL, psEnc->sCmn.subfr_length, psEnc->sCmn.nb_subfr, psEnc->sCmn.arch ); + silk_find_LTP_FIX( psEncCtrl->LTPCoef_Q14, WLTP, &psEncCtrl->LTPredCodGain_Q7, + res_pitch, psEncCtrl->pitchL, Wght_Q15, psEnc->sCmn.subfr_length, + psEnc->sCmn.nb_subfr, psEnc->sCmn.ltp_mem_length, LTP_corrs_rshift, psEnc->sCmn.arch ); /* Quantize LTP gain parameters */ silk_quant_LTP_gains( psEncCtrl->LTPCoef_Q14, psEnc->sCmn.indices.LTPIndex, &psEnc->sCmn.indices.PERIndex, - &psEnc->sCmn.sum_log_gain_Q7, &psEncCtrl->LTPredCodGain_Q7, XXLTP_Q17, xXLTP_Q17, psEnc->sCmn.subfr_length, psEnc->sCmn.nb_subfr, psEnc->sCmn.arch ); + &psEnc->sCmn.sum_log_gain_Q7, WLTP, psEnc->sCmn.mu_LTP_Q9, psEnc->sCmn.LTPQuantLowComplexity, psEnc->sCmn.nb_subfr, + psEnc->sCmn.arch); /* Control LTP scaling */ silk_LTP_scale_ctrl_FIX( psEnc, psEncCtrl, condCoding ); diff --git a/thirdparty/opus/silk/fixed/k2a_FIX.c b/thirdparty/opus/silk/fixed/k2a_FIX.c index 549f6eadaa..5fee599bcb 100644 --- a/thirdparty/opus/silk/fixed/k2a_FIX.c +++ b/thirdparty/opus/silk/fixed/k2a_FIX.c @@ -39,15 +39,14 @@ void silk_k2a( ) { opus_int k, n; - opus_int32 rc, tmp1, tmp2; + opus_int32 Atmp[ SILK_MAX_ORDER_LPC ]; for( k = 0; k < order; k++ ) { - rc = rc_Q15[ k ]; - for( n = 0; n < (k + 1) >> 1; n++ ) { - tmp1 = A_Q24[ n ]; - tmp2 = A_Q24[ k - n - 1 ]; - A_Q24[ n ] = silk_SMLAWB( tmp1, silk_LSHIFT( tmp2, 1 ), rc ); - A_Q24[ k - n - 1 ] = silk_SMLAWB( tmp2, silk_LSHIFT( tmp1, 1 ), rc ); + for( n = 0; n < k; n++ ) { + Atmp[ n ] = A_Q24[ n ]; + } + for( n = 0; n < k; n++ ) { + A_Q24[ n ] = silk_SMLAWB( A_Q24[ n ], silk_LSHIFT( Atmp[ k - n - 1 ], 1 ), rc_Q15[ k ] ); } A_Q24[ k ] = -silk_LSHIFT( (opus_int32)rc_Q15[ k ], 9 ); } diff --git a/thirdparty/opus/silk/fixed/k2a_Q16_FIX.c b/thirdparty/opus/silk/fixed/k2a_Q16_FIX.c index 1595aa6212..3b03987544 100644 --- a/thirdparty/opus/silk/fixed/k2a_Q16_FIX.c +++ b/thirdparty/opus/silk/fixed/k2a_Q16_FIX.c @@ -39,16 +39,15 @@ void silk_k2a_Q16( ) { opus_int k, n; - opus_int32 rc, tmp1, tmp2; + opus_int32 Atmp[ SILK_MAX_ORDER_LPC ]; for( k = 0; k < order; k++ ) { - rc = rc_Q16[ k ]; - for( n = 0; n < (k + 1) >> 1; n++ ) { - tmp1 = A_Q24[ n ]; - tmp2 = A_Q24[ k - n - 1 ]; - A_Q24[ n ] = silk_SMLAWW( tmp1, tmp2, rc ); - A_Q24[ k - n - 1 ] = silk_SMLAWW( tmp2, tmp1, rc ); + for( n = 0; n < k; n++ ) { + Atmp[ n ] = A_Q24[ n ]; } - A_Q24[ k ] = -silk_LSHIFT( rc, 8 ); + for( n = 0; n < k; n++ ) { + A_Q24[ n ] = silk_SMLAWW( A_Q24[ n ], Atmp[ k - n - 1 ], rc_Q16[ k ] ); + } + A_Q24[ k ] = -silk_LSHIFT( rc_Q16[ k ], 8 ); } } diff --git a/thirdparty/opus/silk/fixed/main_FIX.h b/thirdparty/opus/silk/fixed/main_FIX.h index 6d2112e511..375b5eb32e 100644 --- a/thirdparty/opus/silk/fixed/main_FIX.h +++ b/thirdparty/opus/silk/fixed/main_FIX.h @@ -36,11 +36,6 @@ POSSIBILITY OF SUCH DAMAGE. #include "debug.h" #include "entenc.h" -#if ((defined(OPUS_ARM_ASM) && defined(FIXED_POINT)) \ - || defined(OPUS_ARM_MAY_HAVE_NEON_INTR)) -#include "fixed/arm/warped_autocorrelation_FIX_arm.h" -#endif - #ifndef FORCE_CPP_BUILD #ifdef __cplusplus extern "C" @@ -52,9 +47,6 @@ extern "C" #define silk_encode_do_VAD_Fxx silk_encode_do_VAD_FIX #define silk_encode_frame_Fxx silk_encode_frame_FIX -#define QC 10 -#define QS 13 - /*********************/ /* Encoder Functions */ /*********************/ @@ -66,8 +58,7 @@ void silk_HP_variable_cutoff( /* Encoder main function */ void silk_encode_do_VAD_FIX( - silk_encoder_state_FIX *psEnc, /* I/O Pointer to Silk FIX encoder state */ - opus_int activity /* I Decision of Opus voice activity detector */ + silk_encoder_state_FIX *psEnc /* I/O Pointer to Silk FIX encoder state */ ); /* Encoder main function */ @@ -90,11 +81,33 @@ opus_int silk_init_encoder( opus_int silk_control_encoder( silk_encoder_state_Fxx *psEnc, /* I/O Pointer to Silk encoder state */ silk_EncControlStruct *encControl, /* I Control structure */ + const opus_int32 TargetRate_bps, /* I Target max bitrate (bps) */ const opus_int allow_bw_switch, /* I Flag to allow switching audio bandwidth */ const opus_int channelNb, /* I Channel number */ const opus_int force_fs_kHz ); +/****************/ +/* Prefiltering */ +/****************/ +void silk_prefilter_FIX( + silk_encoder_state_FIX *psEnc, /* I/O Encoder state */ + const silk_encoder_control_FIX *psEncCtrl, /* I Encoder control */ + opus_int32 xw_Q10[], /* O Weighted signal */ + const opus_int16 x[] /* I Speech signal */ +); + +void silk_warped_LPC_analysis_filter_FIX_c( + opus_int32 state[], /* I/O State [order + 1] */ + opus_int32 res_Q2[], /* O Residual signal [length] */ + const opus_int16 coef_Q13[], /* I Coefficients [order] */ + const opus_int16 input[], /* I Input signal [length] */ + const opus_int16 lambda_Q16, /* I Warping factor */ + const opus_int length, /* I Length of input signal */ + const opus_int order /* I Filter order (even) */ +); + + /**************************/ /* Noise shaping analysis */ /**************************/ @@ -108,7 +121,7 @@ void silk_noise_shape_analysis_FIX( ); /* Autocorrelations for a warped frequency axis */ -void silk_warped_autocorrelation_FIX_c( +void silk_warped_autocorrelation_FIX( opus_int32 *corr, /* O Result [order + 1] */ opus_int *scale, /* O Scaling of the correlation vector */ const opus_int16 *input, /* I Input data to correlate */ @@ -117,11 +130,6 @@ void silk_warped_autocorrelation_FIX_c( const opus_int order /* I Correlation order (even) */ ); -#if !defined(OVERRIDE_silk_warped_autocorrelation_FIX) -#define silk_warped_autocorrelation_FIX(corr, scale, input, warping_Q16, length, order, arch) \ - ((void)(arch), silk_warped_autocorrelation_FIX_c(corr, scale, input, warping_Q16, length, order)) -#endif - /* Calculation of LTP state scaling */ void silk_LTP_scale_ctrl_FIX( silk_encoder_state_FIX *psEnc, /* I/O encoder state */ @@ -160,12 +168,16 @@ void silk_find_LPC_FIX( /* LTP analysis */ void silk_find_LTP_FIX( - opus_int32 XXLTP_Q17[ MAX_NB_SUBFR * LTP_ORDER * LTP_ORDER ], /* O Correlation matrix */ - opus_int32 xXLTP_Q17[ MAX_NB_SUBFR * LTP_ORDER ], /* O Correlation vector */ - const opus_int16 r_lpc[], /* I Residual signal after LPC */ + opus_int16 b_Q14[ MAX_NB_SUBFR * LTP_ORDER ], /* O LTP coefs */ + opus_int32 WLTP[ MAX_NB_SUBFR * LTP_ORDER * LTP_ORDER ], /* O Weight for LTP quantization */ + opus_int *LTPredCodGain_Q7, /* O LTP coding gain */ + const opus_int16 r_lpc[], /* I residual signal after LPC signal + state for first 10 ms */ const opus_int lag[ MAX_NB_SUBFR ], /* I LTP lags */ - const opus_int subfr_length, /* I Subframe length */ - const opus_int nb_subfr, /* I Number of subframes */ + const opus_int32 Wght_Q15[ MAX_NB_SUBFR ], /* I weights */ + const opus_int subfr_length, /* I subframe length */ + const opus_int nb_subfr, /* I number of subframes */ + const opus_int mem_offset, /* I number of samples in LTP memory */ + opus_int corr_rshifts[ MAX_NB_SUBFR ], /* O right shifts applied to correlations */ int arch /* I Run-time architecture */ ); @@ -219,9 +231,9 @@ void silk_corrMatrix_FIX( const opus_int16 *x, /* I x vector [L + order - 1] used to form data matrix X */ const opus_int L, /* I Length of vectors */ const opus_int order, /* I Max lag for correlation */ + const opus_int head_room, /* I Desired headroom */ opus_int32 *XX, /* O Pointer to X'*X correlation matrix [ order x order ] */ - opus_int32 *nrg, /* O Energy of x vector */ - opus_int *rshifts, /* O Right shifts of correlations */ + opus_int *rshifts, /* I/O Right shifts of correlations */ int arch /* I Run-time architecture */ ); @@ -236,6 +248,22 @@ void silk_corrVector_FIX( int arch /* I Run-time architecture */ ); +/* Add noise to matrix diagonal */ +void silk_regularize_correlations_FIX( + opus_int32 *XX, /* I/O Correlation matrices */ + opus_int32 *xx, /* I/O Correlation values */ + opus_int32 noise, /* I Noise to add */ + opus_int D /* I Dimension of XX */ +); + +/* Solves Ax = b, assuming A is symmetric */ +void silk_solve_LDL_FIX( + opus_int32 *A, /* I Pointer to symetric square matrix A */ + opus_int M, /* I Size of matrix */ + const opus_int32 *b, /* I Pointer to b vector */ + opus_int32 *x_Q16 /* O Pointer to x solution vector */ +); + #ifndef FORCE_CPP_BUILD #ifdef __cplusplus } diff --git a/thirdparty/opus/silk/fixed/mips/noise_shape_analysis_FIX_mipsr1.h b/thirdparty/opus/silk/fixed/mips/noise_shape_analysis_FIX_mipsr1.h index 3999b5bd09..c30481e437 100644 --- a/thirdparty/opus/silk/fixed/mips/noise_shape_analysis_FIX_mipsr1.h +++ b/thirdparty/opus/silk/fixed/mips/noise_shape_analysis_FIX_mipsr1.h @@ -169,7 +169,7 @@ void silk_noise_shape_analysis_FIX( if( psEnc->sCmn.warping_Q16 > 0 ) { /* Calculate warped auto correlation */ - silk_warped_autocorrelation_FIX( auto_corr, &scale, x_windowed, warping_Q16, psEnc->sCmn.shapeWinLength, psEnc->sCmn.shapingLPCOrder, arch ); + silk_warped_autocorrelation_FIX( auto_corr, &scale, x_windowed, warping_Q16, psEnc->sCmn.shapeWinLength, psEnc->sCmn.shapingLPCOrder ); } else { /* Calculate regular auto correlation */ silk_autocorr( auto_corr, &scale, x_windowed, psEnc->sCmn.shapeWinLength, psEnc->sCmn.shapingLPCOrder + 1, arch ); @@ -224,8 +224,8 @@ void silk_noise_shape_analysis_FIX( silk_bwexpander_32( AR1_Q24, psEnc->sCmn.shapingLPCOrder, BWExp1_Q16 ); /* Ratio of prediction gains, in energy domain */ - pre_nrg_Q30 = silk_LPC_inverse_pred_gain_Q24( AR2_Q24, psEnc->sCmn.shapingLPCOrder, arch ); - nrg = silk_LPC_inverse_pred_gain_Q24( AR1_Q24, psEnc->sCmn.shapingLPCOrder, arch ); + pre_nrg_Q30 = silk_LPC_inverse_pred_gain_Q24( AR2_Q24, psEnc->sCmn.shapingLPCOrder ); + nrg = silk_LPC_inverse_pred_gain_Q24( AR1_Q24, psEnc->sCmn.shapingLPCOrder ); /*psEncCtrl->GainsPre[ k ] = 1.0f - 0.7f * ( 1.0f - pre_nrg / nrg ) = 0.3f + 0.7f * pre_nrg / nrg;*/ pre_nrg_Q30 = silk_LSHIFT32( silk_SMULWB( pre_nrg_Q30, SILK_FIX_CONST( 0.7, 15 ) ), 1 ); diff --git a/thirdparty/opus/silk/fixed/mips/prefilter_FIX_mipsr1.h b/thirdparty/opus/silk/fixed/mips/prefilter_FIX_mipsr1.h new file mode 100644 index 0000000000..21b256885f --- /dev/null +++ b/thirdparty/opus/silk/fixed/mips/prefilter_FIX_mipsr1.h @@ -0,0 +1,184 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +***********************************************************************/ +#ifndef __PREFILTER_FIX_MIPSR1_H__ +#define __PREFILTER_FIX_MIPSR1_H__ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "main_FIX.h" +#include "stack_alloc.h" +#include "tuning_parameters.h" + +#define OVERRIDE_silk_warped_LPC_analysis_filter_FIX +void silk_warped_LPC_analysis_filter_FIX( + opus_int32 state[], /* I/O State [order + 1] */ + opus_int32 res_Q2[], /* O Residual signal [length] */ + const opus_int16 coef_Q13[], /* I Coefficients [order] */ + const opus_int16 input[], /* I Input signal [length] */ + const opus_int16 lambda_Q16, /* I Warping factor */ + const opus_int length, /* I Length of input signal */ + const opus_int order, /* I Filter order (even) */ + int arch +) +{ + opus_int n, i; + opus_int32 acc_Q11, acc_Q22, tmp1, tmp2, tmp3, tmp4; + opus_int32 state_cur, state_next; + + (void)arch; + + /* Order must be even */ + /* Length must be even */ + + silk_assert( ( order & 1 ) == 0 ); + silk_assert( ( length & 1 ) == 0 ); + + for( n = 0; n < length; n+=2 ) { + /* Output of lowpass section */ + tmp2 = silk_SMLAWB( state[ 0 ], state[ 1 ], lambda_Q16 ); + state_cur = silk_LSHIFT( input[ n ], 14 ); + /* Output of allpass section */ + tmp1 = silk_SMLAWB( state[ 1 ], state[ 2 ] - tmp2, lambda_Q16 ); + state_next = tmp2; + acc_Q11 = silk_RSHIFT( order, 1 ); + acc_Q11 = silk_SMLAWB( acc_Q11, tmp2, coef_Q13[ 0 ] ); + + + /* Output of lowpass section */ + tmp4 = silk_SMLAWB( state_cur, state_next, lambda_Q16 ); + state[ 0 ] = silk_LSHIFT( input[ n+1 ], 14 ); + /* Output of allpass section */ + tmp3 = silk_SMLAWB( state_next, tmp1 - tmp4, lambda_Q16 ); + state[ 1 ] = tmp4; + acc_Q22 = silk_RSHIFT( order, 1 ); + acc_Q22 = silk_SMLAWB( acc_Q22, tmp4, coef_Q13[ 0 ] ); + + /* Loop over allpass sections */ + for( i = 2; i < order; i += 2 ) { + /* Output of allpass section */ + tmp2 = silk_SMLAWB( state[ i ], state[ i + 1 ] - tmp1, lambda_Q16 ); + state_cur = tmp1; + acc_Q11 = silk_SMLAWB( acc_Q11, tmp1, coef_Q13[ i - 1 ] ); + /* Output of allpass section */ + tmp1 = silk_SMLAWB( state[ i + 1 ], state[ i + 2 ] - tmp2, lambda_Q16 ); + state_next = tmp2; + acc_Q11 = silk_SMLAWB( acc_Q11, tmp2, coef_Q13[ i ] ); + + + /* Output of allpass section */ + tmp4 = silk_SMLAWB( state_cur, state_next - tmp3, lambda_Q16 ); + state[ i ] = tmp3; + acc_Q22 = silk_SMLAWB( acc_Q22, tmp3, coef_Q13[ i - 1 ] ); + /* Output of allpass section */ + tmp3 = silk_SMLAWB( state_next, tmp1 - tmp4, lambda_Q16 ); + state[ i + 1 ] = tmp4; + acc_Q22 = silk_SMLAWB( acc_Q22, tmp4, coef_Q13[ i ] ); + } + acc_Q11 = silk_SMLAWB( acc_Q11, tmp1, coef_Q13[ order - 1 ] ); + res_Q2[ n ] = silk_LSHIFT( (opus_int32)input[ n ], 2 ) - silk_RSHIFT_ROUND( acc_Q11, 9 ); + + state[ order ] = tmp3; + acc_Q22 = silk_SMLAWB( acc_Q22, tmp3, coef_Q13[ order - 1 ] ); + res_Q2[ n+1 ] = silk_LSHIFT( (opus_int32)input[ n+1 ], 2 ) - silk_RSHIFT_ROUND( acc_Q22, 9 ); + } +} + + + +/* Prefilter for finding Quantizer input signal */ +#define OVERRIDE_silk_prefilt_FIX +static inline void silk_prefilt_FIX( + silk_prefilter_state_FIX *P, /* I/O state */ + opus_int32 st_res_Q12[], /* I short term residual signal */ + opus_int32 xw_Q3[], /* O prefiltered signal */ + opus_int32 HarmShapeFIRPacked_Q12, /* I Harmonic shaping coeficients */ + opus_int Tilt_Q14, /* I Tilt shaping coeficient */ + opus_int32 LF_shp_Q14, /* I Low-frequancy shaping coeficients */ + opus_int lag, /* I Lag for harmonic shaping */ + opus_int length /* I Length of signals */ +) +{ + opus_int i, idx, LTP_shp_buf_idx; + opus_int32 n_LTP_Q12, n_Tilt_Q10, n_LF_Q10; + opus_int32 sLF_MA_shp_Q12, sLF_AR_shp_Q12; + opus_int16 *LTP_shp_buf; + + /* To speed up use temp variables instead of using the struct */ + LTP_shp_buf = P->sLTP_shp; + LTP_shp_buf_idx = P->sLTP_shp_buf_idx; + sLF_AR_shp_Q12 = P->sLF_AR_shp_Q12; + sLF_MA_shp_Q12 = P->sLF_MA_shp_Q12; + + if( lag > 0 ) { + for( i = 0; i < length; i++ ) { + /* unrolled loop */ + silk_assert( HARM_SHAPE_FIR_TAPS == 3 ); + idx = lag + LTP_shp_buf_idx; + n_LTP_Q12 = silk_SMULBB( LTP_shp_buf[ ( idx - HARM_SHAPE_FIR_TAPS / 2 - 1) & LTP_MASK ], HarmShapeFIRPacked_Q12 ); + n_LTP_Q12 = silk_SMLABT( n_LTP_Q12, LTP_shp_buf[ ( idx - HARM_SHAPE_FIR_TAPS / 2 ) & LTP_MASK ], HarmShapeFIRPacked_Q12 ); + n_LTP_Q12 = silk_SMLABB( n_LTP_Q12, LTP_shp_buf[ ( idx - HARM_SHAPE_FIR_TAPS / 2 + 1) & LTP_MASK ], HarmShapeFIRPacked_Q12 ); + + n_Tilt_Q10 = silk_SMULWB( sLF_AR_shp_Q12, Tilt_Q14 ); + n_LF_Q10 = silk_SMLAWB( silk_SMULWT( sLF_AR_shp_Q12, LF_shp_Q14 ), sLF_MA_shp_Q12, LF_shp_Q14 ); + + sLF_AR_shp_Q12 = silk_SUB32( st_res_Q12[ i ], silk_LSHIFT( n_Tilt_Q10, 2 ) ); + sLF_MA_shp_Q12 = silk_SUB32( sLF_AR_shp_Q12, silk_LSHIFT( n_LF_Q10, 2 ) ); + + LTP_shp_buf_idx = ( LTP_shp_buf_idx - 1 ) & LTP_MASK; + LTP_shp_buf[ LTP_shp_buf_idx ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( sLF_MA_shp_Q12, 12 ) ); + + xw_Q3[i] = silk_RSHIFT_ROUND( silk_SUB32( sLF_MA_shp_Q12, n_LTP_Q12 ), 9 ); + } + } + else + { + for( i = 0; i < length; i++ ) { + + n_LTP_Q12 = 0; + + n_Tilt_Q10 = silk_SMULWB( sLF_AR_shp_Q12, Tilt_Q14 ); + n_LF_Q10 = silk_SMLAWB( silk_SMULWT( sLF_AR_shp_Q12, LF_shp_Q14 ), sLF_MA_shp_Q12, LF_shp_Q14 ); + + sLF_AR_shp_Q12 = silk_SUB32( st_res_Q12[ i ], silk_LSHIFT( n_Tilt_Q10, 2 ) ); + sLF_MA_shp_Q12 = silk_SUB32( sLF_AR_shp_Q12, silk_LSHIFT( n_LF_Q10, 2 ) ); + + LTP_shp_buf_idx = ( LTP_shp_buf_idx - 1 ) & LTP_MASK; + LTP_shp_buf[ LTP_shp_buf_idx ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( sLF_MA_shp_Q12, 12 ) ); + + xw_Q3[i] = silk_RSHIFT_ROUND( sLF_MA_shp_Q12, 9 ); + } + } + + /* Copy temp variable back to state */ + P->sLF_AR_shp_Q12 = sLF_AR_shp_Q12; + P->sLF_MA_shp_Q12 = sLF_MA_shp_Q12; + P->sLTP_shp_buf_idx = LTP_shp_buf_idx; +} + +#endif /* __PREFILTER_FIX_MIPSR1_H__ */ diff --git a/thirdparty/opus/silk/fixed/mips/warped_autocorrelation_FIX_mipsr1.h b/thirdparty/opus/silk/fixed/mips/warped_autocorrelation_FIX_mipsr1.h index 66eb2ed26d..e803ef0fce 100644 --- a/thirdparty/opus/silk/fixed/mips/warped_autocorrelation_FIX_mipsr1.h +++ b/thirdparty/opus/silk/fixed/mips/warped_autocorrelation_FIX_mipsr1.h @@ -41,8 +41,8 @@ POSSIBILITY OF SUCH DAMAGE. #define QS 14 /* Autocorrelations for a warped frequency axis */ -#define OVERRIDE_silk_warped_autocorrelation_FIX_c -void silk_warped_autocorrelation_FIX_c( +#define OVERRIDE_silk_warped_autocorrelation_FIX +void silk_warped_autocorrelation_FIX( opus_int32 *corr, /* O Result [order + 1] */ opus_int *scale, /* O Scaling of the correlation vector */ const opus_int16 *input, /* I Input data to correlate */ diff --git a/thirdparty/opus/silk/fixed/noise_shape_analysis_FIX.c b/thirdparty/opus/silk/fixed/noise_shape_analysis_FIX.c index 85fea0bf09..22a89f75ae 100644 --- a/thirdparty/opus/silk/fixed/noise_shape_analysis_FIX.c +++ b/thirdparty/opus/silk/fixed/noise_shape_analysis_FIX.c @@ -57,79 +57,88 @@ static OPUS_INLINE opus_int32 warped_gain( /* gain in Q16*/ /* Convert warped filter coefficients to monic pseudo-warped coefficients and limit maximum */ /* amplitude of monic warped coefficients by using bandwidth expansion on the true coefficients */ static OPUS_INLINE void limit_warped_coefs( - opus_int32 *coefs_Q24, + opus_int32 *coefs_syn_Q24, + opus_int32 *coefs_ana_Q24, opus_int lambda_Q16, opus_int32 limit_Q24, opus_int order ) { opus_int i, iter, ind = 0; - opus_int32 tmp, maxabs_Q24, chirp_Q16, gain_Q16; + opus_int32 tmp, maxabs_Q24, chirp_Q16, gain_syn_Q16, gain_ana_Q16; opus_int32 nom_Q16, den_Q24; - opus_int32 limit_Q20, maxabs_Q20; /* Convert to monic coefficients */ lambda_Q16 = -lambda_Q16; for( i = order - 1; i > 0; i-- ) { - coefs_Q24[ i - 1 ] = silk_SMLAWB( coefs_Q24[ i - 1 ], coefs_Q24[ i ], lambda_Q16 ); + coefs_syn_Q24[ i - 1 ] = silk_SMLAWB( coefs_syn_Q24[ i - 1 ], coefs_syn_Q24[ i ], lambda_Q16 ); + coefs_ana_Q24[ i - 1 ] = silk_SMLAWB( coefs_ana_Q24[ i - 1 ], coefs_ana_Q24[ i ], lambda_Q16 ); } lambda_Q16 = -lambda_Q16; - nom_Q16 = silk_SMLAWB( SILK_FIX_CONST( 1.0, 16 ), -(opus_int32)lambda_Q16, lambda_Q16 ); - den_Q24 = silk_SMLAWB( SILK_FIX_CONST( 1.0, 24 ), coefs_Q24[ 0 ], lambda_Q16 ); - gain_Q16 = silk_DIV32_varQ( nom_Q16, den_Q24, 24 ); + nom_Q16 = silk_SMLAWB( SILK_FIX_CONST( 1.0, 16 ), -(opus_int32)lambda_Q16, lambda_Q16 ); + den_Q24 = silk_SMLAWB( SILK_FIX_CONST( 1.0, 24 ), coefs_syn_Q24[ 0 ], lambda_Q16 ); + gain_syn_Q16 = silk_DIV32_varQ( nom_Q16, den_Q24, 24 ); + den_Q24 = silk_SMLAWB( SILK_FIX_CONST( 1.0, 24 ), coefs_ana_Q24[ 0 ], lambda_Q16 ); + gain_ana_Q16 = silk_DIV32_varQ( nom_Q16, den_Q24, 24 ); for( i = 0; i < order; i++ ) { - coefs_Q24[ i ] = silk_SMULWW( gain_Q16, coefs_Q24[ i ] ); + coefs_syn_Q24[ i ] = silk_SMULWW( gain_syn_Q16, coefs_syn_Q24[ i ] ); + coefs_ana_Q24[ i ] = silk_SMULWW( gain_ana_Q16, coefs_ana_Q24[ i ] ); } - limit_Q20 = silk_RSHIFT(limit_Q24, 4); + for( iter = 0; iter < 10; iter++ ) { /* Find maximum absolute value */ maxabs_Q24 = -1; for( i = 0; i < order; i++ ) { - tmp = silk_abs_int32( coefs_Q24[ i ] ); + tmp = silk_max( silk_abs_int32( coefs_syn_Q24[ i ] ), silk_abs_int32( coefs_ana_Q24[ i ] ) ); if( tmp > maxabs_Q24 ) { maxabs_Q24 = tmp; ind = i; } } - /* Use Q20 to avoid any overflow when multiplying by (ind + 1) later. */ - maxabs_Q20 = silk_RSHIFT(maxabs_Q24, 4); - if( maxabs_Q20 <= limit_Q20 ) { + if( maxabs_Q24 <= limit_Q24 ) { /* Coefficients are within range - done */ return; } /* Convert back to true warped coefficients */ for( i = 1; i < order; i++ ) { - coefs_Q24[ i - 1 ] = silk_SMLAWB( coefs_Q24[ i - 1 ], coefs_Q24[ i ], lambda_Q16 ); + coefs_syn_Q24[ i - 1 ] = silk_SMLAWB( coefs_syn_Q24[ i - 1 ], coefs_syn_Q24[ i ], lambda_Q16 ); + coefs_ana_Q24[ i - 1 ] = silk_SMLAWB( coefs_ana_Q24[ i - 1 ], coefs_ana_Q24[ i ], lambda_Q16 ); } - gain_Q16 = silk_INVERSE32_varQ( gain_Q16, 32 ); + gain_syn_Q16 = silk_INVERSE32_varQ( gain_syn_Q16, 32 ); + gain_ana_Q16 = silk_INVERSE32_varQ( gain_ana_Q16, 32 ); for( i = 0; i < order; i++ ) { - coefs_Q24[ i ] = silk_SMULWW( gain_Q16, coefs_Q24[ i ] ); + coefs_syn_Q24[ i ] = silk_SMULWW( gain_syn_Q16, coefs_syn_Q24[ i ] ); + coefs_ana_Q24[ i ] = silk_SMULWW( gain_ana_Q16, coefs_ana_Q24[ i ] ); } /* Apply bandwidth expansion */ chirp_Q16 = SILK_FIX_CONST( 0.99, 16 ) - silk_DIV32_varQ( - silk_SMULWB( maxabs_Q20 - limit_Q20, silk_SMLABB( SILK_FIX_CONST( 0.8, 10 ), SILK_FIX_CONST( 0.1, 10 ), iter ) ), - silk_MUL( maxabs_Q20, ind + 1 ), 22 ); - silk_bwexpander_32( coefs_Q24, order, chirp_Q16 ); + silk_SMULWB( maxabs_Q24 - limit_Q24, silk_SMLABB( SILK_FIX_CONST( 0.8, 10 ), SILK_FIX_CONST( 0.1, 10 ), iter ) ), + silk_MUL( maxabs_Q24, ind + 1 ), 22 ); + silk_bwexpander_32( coefs_syn_Q24, order, chirp_Q16 ); + silk_bwexpander_32( coefs_ana_Q24, order, chirp_Q16 ); /* Convert to monic warped coefficients */ lambda_Q16 = -lambda_Q16; for( i = order - 1; i > 0; i-- ) { - coefs_Q24[ i - 1 ] = silk_SMLAWB( coefs_Q24[ i - 1 ], coefs_Q24[ i ], lambda_Q16 ); + coefs_syn_Q24[ i - 1 ] = silk_SMLAWB( coefs_syn_Q24[ i - 1 ], coefs_syn_Q24[ i ], lambda_Q16 ); + coefs_ana_Q24[ i - 1 ] = silk_SMLAWB( coefs_ana_Q24[ i - 1 ], coefs_ana_Q24[ i ], lambda_Q16 ); } lambda_Q16 = -lambda_Q16; nom_Q16 = silk_SMLAWB( SILK_FIX_CONST( 1.0, 16 ), -(opus_int32)lambda_Q16, lambda_Q16 ); - den_Q24 = silk_SMLAWB( SILK_FIX_CONST( 1.0, 24 ), coefs_Q24[ 0 ], lambda_Q16 ); - gain_Q16 = silk_DIV32_varQ( nom_Q16, den_Q24, 24 ); + den_Q24 = silk_SMLAWB( SILK_FIX_CONST( 1.0, 24 ), coefs_syn_Q24[ 0 ], lambda_Q16 ); + gain_syn_Q16 = silk_DIV32_varQ( nom_Q16, den_Q24, 24 ); + den_Q24 = silk_SMLAWB( SILK_FIX_CONST( 1.0, 24 ), coefs_ana_Q24[ 0 ], lambda_Q16 ); + gain_ana_Q16 = silk_DIV32_varQ( nom_Q16, den_Q24, 24 ); for( i = 0; i < order; i++ ) { - coefs_Q24[ i ] = silk_SMULWW( gain_Q16, coefs_Q24[ i ] ); + coefs_syn_Q24[ i ] = silk_SMULWW( gain_syn_Q16, coefs_syn_Q24[ i ] ); + coefs_ana_Q24[ i ] = silk_SMULWW( gain_ana_Q16, coefs_ana_Q24[ i ] ); } } silk_assert( 0 ); } -/* Disable MIPS version until it's updated. */ -#if 0 && defined(MIPSr1_ASM) +#if defined(MIPSr1_ASM) #include "mips/noise_shape_analysis_FIX_mipsr1.h" #endif @@ -146,13 +155,14 @@ void silk_noise_shape_analysis_FIX( ) { silk_shape_state_FIX *psShapeSt = &psEnc->sShape; - opus_int k, i, nSamples, nSegs, Qnrg, b_Q14, warping_Q16, scale = 0; - opus_int32 SNR_adj_dB_Q7, HarmShapeGain_Q16, Tilt_Q16, tmp32; - opus_int32 nrg, log_energy_Q7, log_energy_prev_Q7, energy_variation_Q7; - opus_int32 BWExp_Q16, gain_mult_Q16, gain_add_Q16, strength_Q16, b_Q8; + opus_int k, i, nSamples, Qnrg, b_Q14, warping_Q16, scale = 0; + opus_int32 SNR_adj_dB_Q7, HarmBoost_Q16, HarmShapeGain_Q16, Tilt_Q16, tmp32; + opus_int32 nrg, pre_nrg_Q30, log_energy_Q7, log_energy_prev_Q7, energy_variation_Q7; + opus_int32 delta_Q16, BWExp1_Q16, BWExp2_Q16, gain_mult_Q16, gain_add_Q16, strength_Q16, b_Q8; opus_int32 auto_corr[ MAX_SHAPE_LPC_ORDER + 1 ]; opus_int32 refl_coef_Q16[ MAX_SHAPE_LPC_ORDER ]; - opus_int32 AR_Q24[ MAX_SHAPE_LPC_ORDER ]; + opus_int32 AR1_Q24[ MAX_SHAPE_LPC_ORDER ]; + opus_int32 AR2_Q24[ MAX_SHAPE_LPC_ORDER ]; VARDECL( opus_int16, x_windowed ); const opus_int16 *x_ptr, *pitch_res_ptr; SAVE_STACK; @@ -199,14 +209,14 @@ void silk_noise_shape_analysis_FIX( if( psEnc->sCmn.indices.signalType == TYPE_VOICED ) { /* Initially set to 0; may be overruled in process_gains(..) */ psEnc->sCmn.indices.quantOffsetType = 0; + psEncCtrl->sparseness_Q8 = 0; } else { /* Sparseness measure, based on relative fluctuations of energy per 2 milliseconds */ nSamples = silk_LSHIFT( psEnc->sCmn.fs_kHz, 1 ); energy_variation_Q7 = 0; log_energy_prev_Q7 = 0; pitch_res_ptr = pitch_res; - nSegs = silk_SMULBB( SUB_FRAME_LENGTH_MS, psEnc->sCmn.nb_subfr ) / 2; - for( k = 0; k < nSegs; k++ ) { + for( k = 0; k < silk_SMULBB( SUB_FRAME_LENGTH_MS, psEnc->sCmn.nb_subfr ) / 2; k++ ) { silk_sum_sqr_shift( &nrg, &scale, pitch_res_ptr, nSamples ); nrg += silk_RSHIFT( nSamples, scale ); /* Q(-scale)*/ @@ -218,12 +228,18 @@ void silk_noise_shape_analysis_FIX( pitch_res_ptr += nSamples; } + psEncCtrl->sparseness_Q8 = silk_RSHIFT( silk_sigm_Q15( silk_SMULWB( energy_variation_Q7 - + SILK_FIX_CONST( 5.0, 7 ), SILK_FIX_CONST( 0.1, 16 ) ) ), 7 ); + /* Set quantization offset depending on sparseness measure */ - if( energy_variation_Q7 > SILK_FIX_CONST( ENERGY_VARIATION_THRESHOLD_QNT_OFFSET, 7 ) * (nSegs-1) ) { + if( psEncCtrl->sparseness_Q8 > SILK_FIX_CONST( SPARSENESS_THRESHOLD_QNT_OFFSET, 8 ) ) { psEnc->sCmn.indices.quantOffsetType = 0; } else { psEnc->sCmn.indices.quantOffsetType = 1; } + + /* Increase coding SNR for sparse signals */ + SNR_adj_dB_Q7 = silk_SMLAWB( SNR_adj_dB_Q7, SILK_FIX_CONST( SPARSE_SNR_INCR_dB, 15 ), psEncCtrl->sparseness_Q8 - SILK_FIX_CONST( 0.5, 8 ) ); } /*******************************/ @@ -231,8 +247,14 @@ void silk_noise_shape_analysis_FIX( /*******************************/ /* More BWE for signals with high prediction gain */ strength_Q16 = silk_SMULWB( psEncCtrl->predGain_Q16, SILK_FIX_CONST( FIND_PITCH_WHITE_NOISE_FRACTION, 16 ) ); - BWExp_Q16 = silk_DIV32_varQ( SILK_FIX_CONST( BANDWIDTH_EXPANSION, 16 ), + BWExp1_Q16 = BWExp2_Q16 = silk_DIV32_varQ( SILK_FIX_CONST( BANDWIDTH_EXPANSION, 16 ), silk_SMLAWW( SILK_FIX_CONST( 1.0, 16 ), strength_Q16, strength_Q16 ), 16 ); + delta_Q16 = silk_SMULWB( SILK_FIX_CONST( 1.0, 16 ) - silk_SMULBB( 3, psEncCtrl->coding_quality_Q14 ), + SILK_FIX_CONST( LOW_RATE_BANDWIDTH_EXPANSION_DELTA, 16 ) ); + BWExp1_Q16 = silk_SUB32( BWExp1_Q16, delta_Q16 ); + BWExp2_Q16 = silk_ADD32( BWExp2_Q16, delta_Q16 ); + /* BWExp1 will be applied after BWExp2, so make it relative */ + BWExp1_Q16 = silk_DIV32_16( silk_LSHIFT( BWExp1_Q16, 14 ), silk_RSHIFT( BWExp2_Q16, 2 ) ); if( psEnc->sCmn.warping_Q16 > 0 ) { /* Slightly more warping in analysis will move quantization noise up in frequency, where it's better masked */ @@ -262,7 +284,7 @@ void silk_noise_shape_analysis_FIX( if( psEnc->sCmn.warping_Q16 > 0 ) { /* Calculate warped auto correlation */ - silk_warped_autocorrelation_FIX( auto_corr, &scale, x_windowed, warping_Q16, psEnc->sCmn.shapeWinLength, psEnc->sCmn.shapingLPCOrder, arch ); + silk_warped_autocorrelation_FIX( auto_corr, &scale, x_windowed, warping_Q16, psEnc->sCmn.shapeWinLength, psEnc->sCmn.shapingLPCOrder ); } else { /* Calculate regular auto correlation */ silk_autocorr( auto_corr, &scale, x_windowed, psEnc->sCmn.shapeWinLength, psEnc->sCmn.shapingLPCOrder + 1, arch ); @@ -277,7 +299,7 @@ void silk_noise_shape_analysis_FIX( silk_assert( nrg >= 0 ); /* Convert reflection coefficients to prediction coefficients */ - silk_k2a_Q16( AR_Q24, refl_coef_Q16, psEnc->sCmn.shapingLPCOrder ); + silk_k2a_Q16( AR2_Q24, refl_coef_Q16, psEnc->sCmn.shapingLPCOrder ); Qnrg = -scale; /* range: -12...30*/ silk_assert( Qnrg >= -12 ); @@ -296,34 +318,40 @@ void silk_noise_shape_analysis_FIX( if( psEnc->sCmn.warping_Q16 > 0 ) { /* Adjust gain for warping */ - gain_mult_Q16 = warped_gain( AR_Q24, warping_Q16, psEnc->sCmn.shapingLPCOrder ); - silk_assert( psEncCtrl->Gains_Q16[ k ] > 0 ); - if( psEncCtrl->Gains_Q16[ k ] < SILK_FIX_CONST( 0.25, 16 ) ) { - psEncCtrl->Gains_Q16[ k ] = silk_SMULWW( psEncCtrl->Gains_Q16[ k ], gain_mult_Q16 ); + gain_mult_Q16 = warped_gain( AR2_Q24, warping_Q16, psEnc->sCmn.shapingLPCOrder ); + silk_assert( psEncCtrl->Gains_Q16[ k ] >= 0 ); + if ( silk_SMULWW( silk_RSHIFT_ROUND( psEncCtrl->Gains_Q16[ k ], 1 ), gain_mult_Q16 ) >= ( silk_int32_MAX >> 1 ) ) { + psEncCtrl->Gains_Q16[ k ] = silk_int32_MAX; } else { - psEncCtrl->Gains_Q16[ k ] = silk_SMULWW( silk_RSHIFT_ROUND( psEncCtrl->Gains_Q16[ k ], 1 ), gain_mult_Q16 ); - if ( psEncCtrl->Gains_Q16[ k ] >= ( silk_int32_MAX >> 1 ) ) { - psEncCtrl->Gains_Q16[ k ] = silk_int32_MAX; - } else { - psEncCtrl->Gains_Q16[ k ] = silk_LSHIFT32( psEncCtrl->Gains_Q16[ k ], 1 ); - } + psEncCtrl->Gains_Q16[ k ] = silk_SMULWW( psEncCtrl->Gains_Q16[ k ], gain_mult_Q16 ); } - silk_assert( psEncCtrl->Gains_Q16[ k ] > 0 ); } - /* Bandwidth expansion */ - silk_bwexpander_32( AR_Q24, psEnc->sCmn.shapingLPCOrder, BWExp_Q16 ); + /* Bandwidth expansion for synthesis filter shaping */ + silk_bwexpander_32( AR2_Q24, psEnc->sCmn.shapingLPCOrder, BWExp2_Q16 ); - if( psEnc->sCmn.warping_Q16 > 0 ) { - /* Convert to monic warped prediction coefficients and limit absolute values */ - limit_warped_coefs( AR_Q24, warping_Q16, SILK_FIX_CONST( 3.999, 24 ), psEnc->sCmn.shapingLPCOrder ); + /* Compute noise shaping filter coefficients */ + silk_memcpy( AR1_Q24, AR2_Q24, psEnc->sCmn.shapingLPCOrder * sizeof( opus_int32 ) ); - /* Convert from Q24 to Q13 and store in int16 */ - for( i = 0; i < psEnc->sCmn.shapingLPCOrder; i++ ) { - psEncCtrl->AR_Q13[ k * MAX_SHAPE_LPC_ORDER + i ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( AR_Q24[ i ], 11 ) ); - } - } else { - silk_LPC_fit( &psEncCtrl->AR_Q13[ k * MAX_SHAPE_LPC_ORDER ], AR_Q24, 13, 24, psEnc->sCmn.shapingLPCOrder ); + /* Bandwidth expansion for analysis filter shaping */ + silk_assert( BWExp1_Q16 <= SILK_FIX_CONST( 1.0, 16 ) ); + silk_bwexpander_32( AR1_Q24, psEnc->sCmn.shapingLPCOrder, BWExp1_Q16 ); + + /* Ratio of prediction gains, in energy domain */ + pre_nrg_Q30 = silk_LPC_inverse_pred_gain_Q24( AR2_Q24, psEnc->sCmn.shapingLPCOrder ); + nrg = silk_LPC_inverse_pred_gain_Q24( AR1_Q24, psEnc->sCmn.shapingLPCOrder ); + + /*psEncCtrl->GainsPre[ k ] = 1.0f - 0.7f * ( 1.0f - pre_nrg / nrg ) = 0.3f + 0.7f * pre_nrg / nrg;*/ + pre_nrg_Q30 = silk_LSHIFT32( silk_SMULWB( pre_nrg_Q30, SILK_FIX_CONST( 0.7, 15 ) ), 1 ); + psEncCtrl->GainsPre_Q14[ k ] = ( opus_int ) SILK_FIX_CONST( 0.3, 14 ) + silk_DIV32_varQ( pre_nrg_Q30, nrg, 14 ); + + /* Convert to monic warped prediction coefficients and limit absolute values */ + limit_warped_coefs( AR2_Q24, AR1_Q24, warping_Q16, SILK_FIX_CONST( 3.999, 24 ), psEnc->sCmn.shapingLPCOrder ); + + /* Convert from Q24 to Q13 and store in int16 */ + for( i = 0; i < psEnc->sCmn.shapingLPCOrder; i++ ) { + psEncCtrl->AR1_Q13[ k * MAX_SHAPE_LPC_ORDER + i ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( AR1_Q24[ i ], 11 ) ); + psEncCtrl->AR2_Q13[ k * MAX_SHAPE_LPC_ORDER + i ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( AR2_Q24[ i ], 11 ) ); } } @@ -340,6 +368,11 @@ void silk_noise_shape_analysis_FIX( psEncCtrl->Gains_Q16[ k ] = silk_ADD_POS_SAT32( psEncCtrl->Gains_Q16[ k ], gain_add_Q16 ); } + gain_mult_Q16 = SILK_FIX_CONST( 1.0, 16 ) + silk_RSHIFT_ROUND( silk_MLA( SILK_FIX_CONST( INPUT_TILT, 26 ), + psEncCtrl->coding_quality_Q14, SILK_FIX_CONST( HIGH_RATE_INPUT_TILT, 12 ) ), 10 ); + for( k = 0; k < psEnc->sCmn.nb_subfr; k++ ) { + psEncCtrl->GainsPre_Q14[ k ] = silk_SMULWB( gain_mult_Q16, psEncCtrl->GainsPre_Q14[ k ] ); + } /************************************************/ /* Control low-frequency shaping and noise tilt */ @@ -377,6 +410,14 @@ void silk_noise_shape_analysis_FIX( /****************************/ /* HARMONIC SHAPING CONTROL */ /****************************/ + /* Control boosting of harmonic frequencies */ + HarmBoost_Q16 = silk_SMULWB( silk_SMULWB( SILK_FIX_CONST( 1.0, 17 ) - silk_LSHIFT( psEncCtrl->coding_quality_Q14, 3 ), + psEnc->LTPCorr_Q15 ), SILK_FIX_CONST( LOW_RATE_HARMONIC_BOOST, 16 ) ); + + /* More harmonic boost for noisy input signals */ + HarmBoost_Q16 = silk_SMLAWB( HarmBoost_Q16, + SILK_FIX_CONST( 1.0, 16 ) - silk_LSHIFT( psEncCtrl->input_quality_Q14, 2 ), SILK_FIX_CONST( LOW_INPUT_QUALITY_HARMONIC_BOOST, 16 ) ); + if( USE_HARM_SHAPING && psEnc->sCmn.indices.signalType == TYPE_VOICED ) { /* More harmonic noise shaping for high bitrates or noisy input */ HarmShapeGain_Q16 = silk_SMLAWB( SILK_FIX_CONST( HARMONIC_SHAPING, 16 ), @@ -394,11 +435,14 @@ void silk_noise_shape_analysis_FIX( /* Smooth over subframes */ /*************************/ for( k = 0; k < MAX_NB_SUBFR; k++ ) { + psShapeSt->HarmBoost_smth_Q16 = + silk_SMLAWB( psShapeSt->HarmBoost_smth_Q16, HarmBoost_Q16 - psShapeSt->HarmBoost_smth_Q16, SILK_FIX_CONST( SUBFR_SMTH_COEF, 16 ) ); psShapeSt->HarmShapeGain_smth_Q16 = silk_SMLAWB( psShapeSt->HarmShapeGain_smth_Q16, HarmShapeGain_Q16 - psShapeSt->HarmShapeGain_smth_Q16, SILK_FIX_CONST( SUBFR_SMTH_COEF, 16 ) ); psShapeSt->Tilt_smth_Q16 = silk_SMLAWB( psShapeSt->Tilt_smth_Q16, Tilt_Q16 - psShapeSt->Tilt_smth_Q16, SILK_FIX_CONST( SUBFR_SMTH_COEF, 16 ) ); + psEncCtrl->HarmBoost_Q14[ k ] = ( opus_int )silk_RSHIFT_ROUND( psShapeSt->HarmBoost_smth_Q16, 2 ); psEncCtrl->HarmShapeGain_Q14[ k ] = ( opus_int )silk_RSHIFT_ROUND( psShapeSt->HarmShapeGain_smth_Q16, 2 ); psEncCtrl->Tilt_Q14[ k ] = ( opus_int )silk_RSHIFT_ROUND( psShapeSt->Tilt_smth_Q16, 2 ); } diff --git a/thirdparty/opus/silk/fixed/pitch_analysis_core_FIX.c b/thirdparty/opus/silk/fixed/pitch_analysis_core_FIX.c index 14729046d2..01bb9fc0a8 100644 --- a/thirdparty/opus/silk/fixed/pitch_analysis_core_FIX.c +++ b/thirdparty/opus/silk/fixed/pitch_analysis_core_FIX.c @@ -80,7 +80,7 @@ static void silk_P_Ana_calc_energy_st3( /* FIXED POINT CORE PITCH ANALYSIS FUNCTION */ /*************************************************************/ opus_int silk_pitch_analysis_core( /* O Voicing estimate: 0 voiced, 1 unvoiced */ - const opus_int16 *frame_unscaled, /* I Signal of length PE_FRAME_LENGTH_MS*Fs_kHz */ + const opus_int16 *frame, /* I Signal of length PE_FRAME_LENGTH_MS*Fs_kHz */ opus_int *pitch_out, /* O 4 pitch lag values */ opus_int16 *lagIndex, /* O Lag Index */ opus_int8 *contourIndex, /* O Pitch contour Index */ @@ -94,17 +94,16 @@ opus_int silk_pitch_analysis_core( /* O Voicing estimate: 0 int arch /* I Run-time architecture */ ) { - VARDECL( opus_int16, frame_8kHz_buf ); + VARDECL( opus_int16, frame_8kHz ); VARDECL( opus_int16, frame_4kHz ); - VARDECL( opus_int16, frame_scaled ); opus_int32 filt_state[ 6 ]; - const opus_int16 *frame, *frame_8kHz; + const opus_int16 *input_frame_ptr; opus_int i, k, d, j; VARDECL( opus_int16, C ); VARDECL( opus_int32, xcorr32 ); const opus_int16 *target_ptr, *basis_ptr; - opus_int32 cross_corr, normalizer, energy, energy_basis, energy_target; - opus_int d_srch[ PE_D_SRCH_LENGTH ], Cmax, length_d_srch, length_d_comp, shift; + opus_int32 cross_corr, normalizer, energy, shift, energy_basis, energy_target; + opus_int d_srch[ PE_D_SRCH_LENGTH ], Cmax, length_d_srch, length_d_comp; VARDECL( opus_int16, d_comp ); opus_int32 sum, threshold, lag_counter; opus_int CBimax, CBimax_new, CBimax_old, lag, start_lag, end_lag, lag_new; @@ -120,13 +119,12 @@ opus_int silk_pitch_analysis_core( /* O Voicing estimate: 0 opus_int32 delta_lag_log2_sqr_Q7, lag_log2_Q7, prevLag_log2_Q7, prev_lag_bias_Q13; const opus_int8 *Lag_CB_ptr; SAVE_STACK; - /* Check for valid sampling frequency */ - celt_assert( Fs_kHz == 8 || Fs_kHz == 12 || Fs_kHz == 16 ); + silk_assert( Fs_kHz == 8 || Fs_kHz == 12 || Fs_kHz == 16 ); /* Check for valid complexity setting */ - celt_assert( complexity >= SILK_PE_MIN_COMPLEX ); - celt_assert( complexity <= SILK_PE_MAX_COMPLEX ); + silk_assert( complexity >= SILK_PE_MIN_COMPLEX ); + silk_assert( complexity <= SILK_PE_MAX_COMPLEX ); silk_assert( search_thres1_Q16 >= 0 && search_thres1_Q16 <= (1<<16) ); silk_assert( search_thres2_Q13 >= 0 && search_thres2_Q13 <= (1<<13) ); @@ -139,33 +137,17 @@ opus_int silk_pitch_analysis_core( /* O Voicing estimate: 0 min_lag = PE_MIN_LAG_MS * Fs_kHz; max_lag = PE_MAX_LAG_MS * Fs_kHz - 1; - /* Downscale input if necessary */ - silk_sum_sqr_shift( &energy, &shift, frame_unscaled, frame_length ); - shift += 3 - silk_CLZ32( energy ); /* at least two bits headroom */ - ALLOC( frame_scaled, frame_length, opus_int16 ); - if( shift > 0 ) { - shift = silk_RSHIFT( shift + 1, 1 ); - for( i = 0; i < frame_length; i++ ) { - frame_scaled[ i ] = silk_RSHIFT( frame_unscaled[ i ], shift ); - } - frame = frame_scaled; - } else { - frame = frame_unscaled; - } - - ALLOC( frame_8kHz_buf, ( Fs_kHz == 8 ) ? 1 : frame_length_8kHz, opus_int16 ); /* Resample from input sampled at Fs_kHz to 8 kHz */ + ALLOC( frame_8kHz, frame_length_8kHz, opus_int16 ); if( Fs_kHz == 16 ) { silk_memset( filt_state, 0, 2 * sizeof( opus_int32 ) ); - silk_resampler_down2( filt_state, frame_8kHz_buf, frame, frame_length ); - frame_8kHz = frame_8kHz_buf; + silk_resampler_down2( filt_state, frame_8kHz, frame, frame_length ); } else if( Fs_kHz == 12 ) { silk_memset( filt_state, 0, 6 * sizeof( opus_int32 ) ); - silk_resampler_down2_3( filt_state, frame_8kHz_buf, frame, frame_length ); - frame_8kHz = frame_8kHz_buf; + silk_resampler_down2_3( filt_state, frame_8kHz, frame, frame_length ); } else { - celt_assert( Fs_kHz == 8 ); - frame_8kHz = frame; + silk_assert( Fs_kHz == 8 ); + silk_memcpy( frame_8kHz, frame, frame_length_8kHz * sizeof(opus_int16) ); } /* Decimate again to 4 kHz */ @@ -178,6 +160,19 @@ opus_int silk_pitch_analysis_core( /* O Voicing estimate: 0 frame_4kHz[ i ] = silk_ADD_SAT16( frame_4kHz[ i ], frame_4kHz[ i - 1 ] ); } + /******************************************************************************* + ** Scale 4 kHz signal down to prevent correlations measures from overflowing + ** find scaling as max scaling for each 8kHz(?) subframe + *******************************************************************************/ + + /* Inner product is calculated with different lengths, so scale for the worst case */ + silk_sum_sqr_shift( &energy, &shift, frame_4kHz, frame_length_4kHz ); + if( shift > 0 ) { + shift = silk_RSHIFT( shift, 1 ); + for( i = 0; i < frame_length_4kHz; i++ ) { + frame_4kHz[ i ] = silk_RSHIFT( frame_4kHz[ i ], shift ); + } + } /****************************************************************************** * FIRST STAGE, operating in 4 khz @@ -188,14 +183,14 @@ opus_int silk_pitch_analysis_core( /* O Voicing estimate: 0 target_ptr = &frame_4kHz[ silk_LSHIFT( SF_LENGTH_4KHZ, 2 ) ]; for( k = 0; k < nb_subfr >> 1; k++ ) { /* Check that we are within range of the array */ - celt_assert( target_ptr >= frame_4kHz ); - celt_assert( target_ptr + SF_LENGTH_8KHZ <= frame_4kHz + frame_length_4kHz ); + silk_assert( target_ptr >= frame_4kHz ); + silk_assert( target_ptr + SF_LENGTH_8KHZ <= frame_4kHz + frame_length_4kHz ); basis_ptr = target_ptr - MIN_LAG_4KHZ; /* Check that we are within range of the array */ - celt_assert( basis_ptr >= frame_4kHz ); - celt_assert( basis_ptr + SF_LENGTH_8KHZ <= frame_4kHz + frame_length_4kHz ); + silk_assert( basis_ptr >= frame_4kHz ); + silk_assert( basis_ptr + SF_LENGTH_8KHZ <= frame_4kHz + frame_length_4kHz ); celt_pitch_xcorr( target_ptr, target_ptr - MAX_LAG_4KHZ, xcorr32, SF_LENGTH_8KHZ, MAX_LAG_4KHZ - MIN_LAG_4KHZ + 1, arch ); @@ -249,7 +244,7 @@ opus_int silk_pitch_analysis_core( /* O Voicing estimate: 0 /* Sort */ length_d_srch = silk_ADD_LSHIFT32( 4, complexity, 1 ); - celt_assert( 3 * length_d_srch <= PE_D_SRCH_LENGTH ); + silk_assert( 3 * length_d_srch <= PE_D_SRCH_LENGTH ); silk_insertion_sort_decreasing_int16( C, d_srch, CSTRIDE_4KHZ, length_d_srch ); @@ -274,7 +269,7 @@ opus_int silk_pitch_analysis_core( /* O Voicing estimate: 0 break; } } - celt_assert( length_d_srch > 0 ); + silk_assert( length_d_srch > 0 ); ALLOC( d_comp, D_COMP_STRIDE, opus_int16 ); for( i = D_COMP_MIN; i < D_COMP_MAX; i++ ) { @@ -316,6 +311,18 @@ opus_int silk_pitch_analysis_core( /* O Voicing estimate: 0 ** SECOND STAGE, operating at 8 kHz, on lag sections with high correlation *************************************************************************************/ + /****************************************************************************** + ** Scale signal down to avoid correlations measures from overflowing + *******************************************************************************/ + /* find scaling as max scaling for each subframe */ + silk_sum_sqr_shift( &energy, &shift, frame_8kHz, frame_length_8kHz ); + if( shift > 0 ) { + shift = silk_RSHIFT( shift, 1 ); + for( i = 0; i < frame_length_8kHz; i++ ) { + frame_8kHz[ i ] = silk_RSHIFT( frame_8kHz[ i ], shift ); + } + } + /********************************************************************************* * Find energy of each subframe projected onto its history, for a range of delays *********************************************************************************/ @@ -325,8 +332,8 @@ opus_int silk_pitch_analysis_core( /* O Voicing estimate: 0 for( k = 0; k < nb_subfr; k++ ) { /* Check that we are within range of the array */ - celt_assert( target_ptr >= frame_8kHz ); - celt_assert( target_ptr + SF_LENGTH_8KHZ <= frame_8kHz + frame_length_8kHz ); + silk_assert( target_ptr >= frame_8kHz ); + silk_assert( target_ptr + SF_LENGTH_8KHZ <= frame_8kHz + frame_length_8kHz ); energy_target = silk_ADD32( silk_inner_prod_aligned( target_ptr, target_ptr, SF_LENGTH_8KHZ, arch ), 1 ); for( j = 0; j < length_d_comp; j++ ) { @@ -455,6 +462,24 @@ opus_int silk_pitch_analysis_core( /* O Voicing estimate: 0 silk_assert( *LTPCorr_Q15 >= 0 ); if( Fs_kHz > 8 ) { + VARDECL( opus_int16, scratch_mem ); + /***************************************************************************/ + /* Scale input signal down to avoid correlations measures from overflowing */ + /***************************************************************************/ + /* find scaling as max scaling for each subframe */ + silk_sum_sqr_shift( &energy, &shift, frame, frame_length ); + ALLOC( scratch_mem, shift > 0 ? frame_length : ALLOC_NONE, opus_int16 ); + if( shift > 0 ) { + /* Move signal to scratch mem because the input signal should be unchanged */ + shift = silk_RSHIFT( shift, 1 ); + for( i = 0; i < frame_length; i++ ) { + scratch_mem[ i ] = silk_RSHIFT( frame[ i ], shift ); + } + input_frame_ptr = scratch_mem; + } else { + input_frame_ptr = frame; + } + /* Search in original signal */ CBimax_old = CBimax; @@ -494,14 +519,14 @@ opus_int silk_pitch_analysis_core( /* O Voicing estimate: 0 /* Calculate the correlations and energies needed in stage 3 */ ALLOC( energies_st3, nb_subfr * nb_cbk_search, silk_pe_stage3_vals ); ALLOC( cross_corr_st3, nb_subfr * nb_cbk_search, silk_pe_stage3_vals ); - silk_P_Ana_calc_corr_st3( cross_corr_st3, frame, start_lag, sf_length, nb_subfr, complexity, arch ); - silk_P_Ana_calc_energy_st3( energies_st3, frame, start_lag, sf_length, nb_subfr, complexity, arch ); + silk_P_Ana_calc_corr_st3( cross_corr_st3, input_frame_ptr, start_lag, sf_length, nb_subfr, complexity, arch ); + silk_P_Ana_calc_energy_st3( energies_st3, input_frame_ptr, start_lag, sf_length, nb_subfr, complexity, arch ); lag_counter = 0; silk_assert( lag == silk_SAT16( lag ) ); contour_bias_Q15 = silk_DIV32_16( SILK_FIX_CONST( PE_FLATCONTOUR_BIAS, 15 ), lag ); - target_ptr = &frame[ PE_LTP_MEM_LENGTH_MS * Fs_kHz ]; + target_ptr = &input_frame_ptr[ PE_LTP_MEM_LENGTH_MS * Fs_kHz ]; energy_target = silk_ADD32( silk_inner_prod_aligned( target_ptr, target_ptr, nb_subfr * sf_length, arch ), 1 ); for( d = start_lag; d <= end_lag; d++ ) { for( j = 0; j < nb_cbk_search; j++ ) { @@ -550,7 +575,7 @@ opus_int silk_pitch_analysis_core( /* O Voicing estimate: 0 *lagIndex = (opus_int16)( lag - MIN_LAG_8KHZ ); *contourIndex = (opus_int8)CBimax; } - celt_assert( *lagIndex >= 0 ); + silk_assert( *lagIndex >= 0 ); /* return as voiced */ RESTORE_STACK; return 0; @@ -587,8 +612,8 @@ static void silk_P_Ana_calc_corr_st3( const opus_int8 *Lag_range_ptr, *Lag_CB_ptr; SAVE_STACK; - celt_assert( complexity >= SILK_PE_MIN_COMPLEX ); - celt_assert( complexity <= SILK_PE_MAX_COMPLEX ); + silk_assert( complexity >= SILK_PE_MIN_COMPLEX ); + silk_assert( complexity <= SILK_PE_MAX_COMPLEX ); if( nb_subfr == PE_MAX_NB_SUBFR ) { Lag_range_ptr = &silk_Lag_range_stage3[ complexity ][ 0 ][ 0 ]; @@ -596,7 +621,7 @@ static void silk_P_Ana_calc_corr_st3( nb_cbk_search = silk_nb_cbk_searchs_stage3[ complexity ]; cbk_size = PE_NB_CBKS_STAGE3_MAX; } else { - celt_assert( nb_subfr == PE_MAX_NB_SUBFR >> 1); + silk_assert( nb_subfr == PE_MAX_NB_SUBFR >> 1); Lag_range_ptr = &silk_Lag_range_stage3_10_ms[ 0 ][ 0 ]; Lag_CB_ptr = &silk_CB_lags_stage3_10_ms[ 0 ][ 0 ]; nb_cbk_search = PE_NB_CBKS_STAGE3_10MS; @@ -612,7 +637,7 @@ static void silk_P_Ana_calc_corr_st3( /* Calculate the correlations for each subframe */ lag_low = matrix_ptr( Lag_range_ptr, k, 0, 2 ); lag_high = matrix_ptr( Lag_range_ptr, k, 1, 2 ); - celt_assert(lag_high-lag_low+1 <= SCRATCH_SIZE); + silk_assert(lag_high-lag_low+1 <= SCRATCH_SIZE); celt_pitch_xcorr( target_ptr, target_ptr - start_lag - lag_high, xcorr32, sf_length, lag_high - lag_low + 1, arch ); for( j = lag_low; j <= lag_high; j++ ) { silk_assert( lag_counter < SCRATCH_SIZE ); @@ -659,8 +684,8 @@ static void silk_P_Ana_calc_energy_st3( const opus_int8 *Lag_range_ptr, *Lag_CB_ptr; SAVE_STACK; - celt_assert( complexity >= SILK_PE_MIN_COMPLEX ); - celt_assert( complexity <= SILK_PE_MAX_COMPLEX ); + silk_assert( complexity >= SILK_PE_MIN_COMPLEX ); + silk_assert( complexity <= SILK_PE_MAX_COMPLEX ); if( nb_subfr == PE_MAX_NB_SUBFR ) { Lag_range_ptr = &silk_Lag_range_stage3[ complexity ][ 0 ][ 0 ]; @@ -668,7 +693,7 @@ static void silk_P_Ana_calc_energy_st3( nb_cbk_search = silk_nb_cbk_searchs_stage3[ complexity ]; cbk_size = PE_NB_CBKS_STAGE3_MAX; } else { - celt_assert( nb_subfr == PE_MAX_NB_SUBFR >> 1); + silk_assert( nb_subfr == PE_MAX_NB_SUBFR >> 1); Lag_range_ptr = &silk_Lag_range_stage3_10_ms[ 0 ][ 0 ]; Lag_CB_ptr = &silk_CB_lags_stage3_10_ms[ 0 ][ 0 ]; nb_cbk_search = PE_NB_CBKS_STAGE3_10MS; diff --git a/thirdparty/opus/silk/fixed/prefilter_FIX.c b/thirdparty/opus/silk/fixed/prefilter_FIX.c new file mode 100644 index 0000000000..6a8e35152e --- /dev/null +++ b/thirdparty/opus/silk/fixed/prefilter_FIX.c @@ -0,0 +1,221 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +***********************************************************************/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "main_FIX.h" +#include "stack_alloc.h" +#include "tuning_parameters.h" + +#if defined(MIPSr1_ASM) +#include "mips/prefilter_FIX_mipsr1.h" +#endif + + +#if !defined(OVERRIDE_silk_warped_LPC_analysis_filter_FIX) +#define silk_warped_LPC_analysis_filter_FIX(state, res_Q2, coef_Q13, input, lambda_Q16, length, order, arch) \ + ((void)(arch),silk_warped_LPC_analysis_filter_FIX_c(state, res_Q2, coef_Q13, input, lambda_Q16, length, order)) +#endif + +/* Prefilter for finding Quantizer input signal */ +static OPUS_INLINE void silk_prefilt_FIX( + silk_prefilter_state_FIX *P, /* I/O state */ + opus_int32 st_res_Q12[], /* I short term residual signal */ + opus_int32 xw_Q3[], /* O prefiltered signal */ + opus_int32 HarmShapeFIRPacked_Q12, /* I Harmonic shaping coeficients */ + opus_int Tilt_Q14, /* I Tilt shaping coeficient */ + opus_int32 LF_shp_Q14, /* I Low-frequancy shaping coeficients */ + opus_int lag, /* I Lag for harmonic shaping */ + opus_int length /* I Length of signals */ +); + +void silk_warped_LPC_analysis_filter_FIX_c( + opus_int32 state[], /* I/O State [order + 1] */ + opus_int32 res_Q2[], /* O Residual signal [length] */ + const opus_int16 coef_Q13[], /* I Coefficients [order] */ + const opus_int16 input[], /* I Input signal [length] */ + const opus_int16 lambda_Q16, /* I Warping factor */ + const opus_int length, /* I Length of input signal */ + const opus_int order /* I Filter order (even) */ +) +{ + opus_int n, i; + opus_int32 acc_Q11, tmp1, tmp2; + + /* Order must be even */ + silk_assert( ( order & 1 ) == 0 ); + + for( n = 0; n < length; n++ ) { + /* Output of lowpass section */ + tmp2 = silk_SMLAWB( state[ 0 ], state[ 1 ], lambda_Q16 ); + state[ 0 ] = silk_LSHIFT( input[ n ], 14 ); + /* Output of allpass section */ + tmp1 = silk_SMLAWB( state[ 1 ], state[ 2 ] - tmp2, lambda_Q16 ); + state[ 1 ] = tmp2; + acc_Q11 = silk_RSHIFT( order, 1 ); + acc_Q11 = silk_SMLAWB( acc_Q11, tmp2, coef_Q13[ 0 ] ); + /* Loop over allpass sections */ + for( i = 2; i < order; i += 2 ) { + /* Output of allpass section */ + tmp2 = silk_SMLAWB( state[ i ], state[ i + 1 ] - tmp1, lambda_Q16 ); + state[ i ] = tmp1; + acc_Q11 = silk_SMLAWB( acc_Q11, tmp1, coef_Q13[ i - 1 ] ); + /* Output of allpass section */ + tmp1 = silk_SMLAWB( state[ i + 1 ], state[ i + 2 ] - tmp2, lambda_Q16 ); + state[ i + 1 ] = tmp2; + acc_Q11 = silk_SMLAWB( acc_Q11, tmp2, coef_Q13[ i ] ); + } + state[ order ] = tmp1; + acc_Q11 = silk_SMLAWB( acc_Q11, tmp1, coef_Q13[ order - 1 ] ); + res_Q2[ n ] = silk_LSHIFT( (opus_int32)input[ n ], 2 ) - silk_RSHIFT_ROUND( acc_Q11, 9 ); + } +} + +void silk_prefilter_FIX( + silk_encoder_state_FIX *psEnc, /* I/O Encoder state */ + const silk_encoder_control_FIX *psEncCtrl, /* I Encoder control */ + opus_int32 xw_Q3[], /* O Weighted signal */ + const opus_int16 x[] /* I Speech signal */ +) +{ + silk_prefilter_state_FIX *P = &psEnc->sPrefilt; + opus_int j, k, lag; + opus_int32 tmp_32; + const opus_int16 *AR1_shp_Q13; + const opus_int16 *px; + opus_int32 *pxw_Q3; + opus_int HarmShapeGain_Q12, Tilt_Q14; + opus_int32 HarmShapeFIRPacked_Q12, LF_shp_Q14; + VARDECL( opus_int32, x_filt_Q12 ); + VARDECL( opus_int32, st_res_Q2 ); + opus_int16 B_Q10[ 2 ]; + SAVE_STACK; + + /* Set up pointers */ + px = x; + pxw_Q3 = xw_Q3; + lag = P->lagPrev; + ALLOC( x_filt_Q12, psEnc->sCmn.subfr_length, opus_int32 ); + ALLOC( st_res_Q2, psEnc->sCmn.subfr_length, opus_int32 ); + for( k = 0; k < psEnc->sCmn.nb_subfr; k++ ) { + /* Update Variables that change per sub frame */ + if( psEnc->sCmn.indices.signalType == TYPE_VOICED ) { + lag = psEncCtrl->pitchL[ k ]; + } + + /* Noise shape parameters */ + HarmShapeGain_Q12 = silk_SMULWB( (opus_int32)psEncCtrl->HarmShapeGain_Q14[ k ], 16384 - psEncCtrl->HarmBoost_Q14[ k ] ); + silk_assert( HarmShapeGain_Q12 >= 0 ); + HarmShapeFIRPacked_Q12 = silk_RSHIFT( HarmShapeGain_Q12, 2 ); + HarmShapeFIRPacked_Q12 |= silk_LSHIFT( (opus_int32)silk_RSHIFT( HarmShapeGain_Q12, 1 ), 16 ); + Tilt_Q14 = psEncCtrl->Tilt_Q14[ k ]; + LF_shp_Q14 = psEncCtrl->LF_shp_Q14[ k ]; + AR1_shp_Q13 = &psEncCtrl->AR1_Q13[ k * MAX_SHAPE_LPC_ORDER ]; + + /* Short term FIR filtering*/ + silk_warped_LPC_analysis_filter_FIX( P->sAR_shp, st_res_Q2, AR1_shp_Q13, px, + psEnc->sCmn.warping_Q16, psEnc->sCmn.subfr_length, psEnc->sCmn.shapingLPCOrder, psEnc->sCmn.arch ); + + /* Reduce (mainly) low frequencies during harmonic emphasis */ + B_Q10[ 0 ] = silk_RSHIFT_ROUND( psEncCtrl->GainsPre_Q14[ k ], 4 ); + tmp_32 = silk_SMLABB( SILK_FIX_CONST( INPUT_TILT, 26 ), psEncCtrl->HarmBoost_Q14[ k ], HarmShapeGain_Q12 ); /* Q26 */ + tmp_32 = silk_SMLABB( tmp_32, psEncCtrl->coding_quality_Q14, SILK_FIX_CONST( HIGH_RATE_INPUT_TILT, 12 ) ); /* Q26 */ + tmp_32 = silk_SMULWB( tmp_32, -psEncCtrl->GainsPre_Q14[ k ] ); /* Q24 */ + tmp_32 = silk_RSHIFT_ROUND( tmp_32, 14 ); /* Q10 */ + B_Q10[ 1 ]= silk_SAT16( tmp_32 ); + x_filt_Q12[ 0 ] = silk_MLA( silk_MUL( st_res_Q2[ 0 ], B_Q10[ 0 ] ), P->sHarmHP_Q2, B_Q10[ 1 ] ); + for( j = 1; j < psEnc->sCmn.subfr_length; j++ ) { + x_filt_Q12[ j ] = silk_MLA( silk_MUL( st_res_Q2[ j ], B_Q10[ 0 ] ), st_res_Q2[ j - 1 ], B_Q10[ 1 ] ); + } + P->sHarmHP_Q2 = st_res_Q2[ psEnc->sCmn.subfr_length - 1 ]; + + silk_prefilt_FIX( P, x_filt_Q12, pxw_Q3, HarmShapeFIRPacked_Q12, Tilt_Q14, LF_shp_Q14, lag, psEnc->sCmn.subfr_length ); + + px += psEnc->sCmn.subfr_length; + pxw_Q3 += psEnc->sCmn.subfr_length; + } + + P->lagPrev = psEncCtrl->pitchL[ psEnc->sCmn.nb_subfr - 1 ]; + RESTORE_STACK; +} + +#ifndef OVERRIDE_silk_prefilt_FIX +/* Prefilter for finding Quantizer input signal */ +static OPUS_INLINE void silk_prefilt_FIX( + silk_prefilter_state_FIX *P, /* I/O state */ + opus_int32 st_res_Q12[], /* I short term residual signal */ + opus_int32 xw_Q3[], /* O prefiltered signal */ + opus_int32 HarmShapeFIRPacked_Q12, /* I Harmonic shaping coeficients */ + opus_int Tilt_Q14, /* I Tilt shaping coeficient */ + opus_int32 LF_shp_Q14, /* I Low-frequancy shaping coeficients */ + opus_int lag, /* I Lag for harmonic shaping */ + opus_int length /* I Length of signals */ +) +{ + opus_int i, idx, LTP_shp_buf_idx; + opus_int32 n_LTP_Q12, n_Tilt_Q10, n_LF_Q10; + opus_int32 sLF_MA_shp_Q12, sLF_AR_shp_Q12; + opus_int16 *LTP_shp_buf; + + /* To speed up use temp variables instead of using the struct */ + LTP_shp_buf = P->sLTP_shp; + LTP_shp_buf_idx = P->sLTP_shp_buf_idx; + sLF_AR_shp_Q12 = P->sLF_AR_shp_Q12; + sLF_MA_shp_Q12 = P->sLF_MA_shp_Q12; + + for( i = 0; i < length; i++ ) { + if( lag > 0 ) { + /* unrolled loop */ + silk_assert( HARM_SHAPE_FIR_TAPS == 3 ); + idx = lag + LTP_shp_buf_idx; + n_LTP_Q12 = silk_SMULBB( LTP_shp_buf[ ( idx - HARM_SHAPE_FIR_TAPS / 2 - 1) & LTP_MASK ], HarmShapeFIRPacked_Q12 ); + n_LTP_Q12 = silk_SMLABT( n_LTP_Q12, LTP_shp_buf[ ( idx - HARM_SHAPE_FIR_TAPS / 2 ) & LTP_MASK ], HarmShapeFIRPacked_Q12 ); + n_LTP_Q12 = silk_SMLABB( n_LTP_Q12, LTP_shp_buf[ ( idx - HARM_SHAPE_FIR_TAPS / 2 + 1) & LTP_MASK ], HarmShapeFIRPacked_Q12 ); + } else { + n_LTP_Q12 = 0; + } + + n_Tilt_Q10 = silk_SMULWB( sLF_AR_shp_Q12, Tilt_Q14 ); + n_LF_Q10 = silk_SMLAWB( silk_SMULWT( sLF_AR_shp_Q12, LF_shp_Q14 ), sLF_MA_shp_Q12, LF_shp_Q14 ); + + sLF_AR_shp_Q12 = silk_SUB32( st_res_Q12[ i ], silk_LSHIFT( n_Tilt_Q10, 2 ) ); + sLF_MA_shp_Q12 = silk_SUB32( sLF_AR_shp_Q12, silk_LSHIFT( n_LF_Q10, 2 ) ); + + LTP_shp_buf_idx = ( LTP_shp_buf_idx - 1 ) & LTP_MASK; + LTP_shp_buf[ LTP_shp_buf_idx ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( sLF_MA_shp_Q12, 12 ) ); + + xw_Q3[i] = silk_RSHIFT_ROUND( silk_SUB32( sLF_MA_shp_Q12, n_LTP_Q12 ), 9 ); + } + + /* Copy temp variable back to state */ + P->sLF_AR_shp_Q12 = sLF_AR_shp_Q12; + P->sLF_MA_shp_Q12 = sLF_MA_shp_Q12; + P->sLTP_shp_buf_idx = LTP_shp_buf_idx; +} +#endif /* OVERRIDE_silk_prefilt_FIX */ diff --git a/thirdparty/opus/silk/fixed/residual_energy16_FIX.c b/thirdparty/opus/silk/fixed/residual_energy16_FIX.c index 7f130f3d3d..ebffb2a66f 100644 --- a/thirdparty/opus/silk/fixed/residual_energy16_FIX.c +++ b/thirdparty/opus/silk/fixed/residual_energy16_FIX.c @@ -47,10 +47,10 @@ opus_int32 silk_residual_energy16_covar_FIX( const opus_int32 *pRow; /* Safety checks */ - celt_assert( D >= 0 ); - celt_assert( D <= 16 ); - celt_assert( cQ > 0 ); - celt_assert( cQ < 16 ); + silk_assert( D >= 0 ); + silk_assert( D <= 16 ); + silk_assert( cQ > 0 ); + silk_assert( cQ < 16 ); lshifts = 16 - cQ; Qxtra = lshifts; diff --git a/thirdparty/opus/silk/fixed/residual_energy_FIX.c b/thirdparty/opus/silk/fixed/residual_energy_FIX.c index 6c7cade9a0..41f74778e8 100644 --- a/thirdparty/opus/silk/fixed/residual_energy_FIX.c +++ b/thirdparty/opus/silk/fixed/residual_energy_FIX.c @@ -58,7 +58,7 @@ void silk_residual_energy_FIX( /* Filter input to create the LPC residual for each frame half, and measure subframe energies */ ALLOC( LPC_res, ( MAX_NB_SUBFR >> 1 ) * offset, opus_int16 ); - celt_assert( ( nb_subfr >> 1 ) * ( MAX_NB_SUBFR >> 1 ) == nb_subfr ); + silk_assert( ( nb_subfr >> 1 ) * ( MAX_NB_SUBFR >> 1 ) == nb_subfr ); for( i = 0; i < nb_subfr >> 1; i++ ) { /* Calculate half frame LPC residual signal including preceding samples */ silk_LPC_analysis_filter( LPC_res, x_ptr, a_Q12[ i ], ( MAX_NB_SUBFR >> 1 ) * offset, LPC_order, arch ); diff --git a/thirdparty/opus/silk/fixed/schur64_FIX.c b/thirdparty/opus/silk/fixed/schur64_FIX.c index 4b7e19ea59..764a10ef3e 100644 --- a/thirdparty/opus/silk/fixed/schur64_FIX.c +++ b/thirdparty/opus/silk/fixed/schur64_FIX.c @@ -43,7 +43,7 @@ opus_int32 silk_schur64( /* O returns residual ene opus_int32 C[ SILK_MAX_ORDER_LPC + 1 ][ 2 ]; opus_int32 Ctmp1_Q30, Ctmp2_Q30, rc_tmp_Q31; - celt_assert( order >= 0 && order <= SILK_MAX_ORDER_LPC ); + silk_assert( order==6||order==8||order==10||order==12||order==14||order==16 ); /* Check for invalid input */ if( c[ 0 ] <= 0 ) { @@ -51,10 +51,9 @@ opus_int32 silk_schur64( /* O returns residual ene return 0; } - k = 0; - do { + for( k = 0; k < order + 1; k++ ) { C[ k ][ 0 ] = C[ k ][ 1 ] = c[ k ]; - } while( ++k <= order ); + } for( k = 0; k < order; k++ ) { /* Check that we won't be getting an unstable rc, otherwise stop here. */ diff --git a/thirdparty/opus/silk/fixed/schur_FIX.c b/thirdparty/opus/silk/fixed/schur_FIX.c index 2840f6b1aa..c4c0ef23b4 100644 --- a/thirdparty/opus/silk/fixed/schur_FIX.c +++ b/thirdparty/opus/silk/fixed/schur_FIX.c @@ -43,29 +43,28 @@ opus_int32 silk_schur( /* O Returns residual ene opus_int32 C[ SILK_MAX_ORDER_LPC + 1 ][ 2 ]; opus_int32 Ctmp1, Ctmp2, rc_tmp_Q15; - celt_assert( order >= 0 && order <= SILK_MAX_ORDER_LPC ); + silk_assert( order==6||order==8||order==10||order==12||order==14||order==16 ); /* Get number of leading zeros */ lz = silk_CLZ32( c[ 0 ] ); /* Copy correlations and adjust level to Q30 */ - k = 0; if( lz < 2 ) { /* lz must be 1, so shift one to the right */ - do { + for( k = 0; k < order + 1; k++ ) { C[ k ][ 0 ] = C[ k ][ 1 ] = silk_RSHIFT( c[ k ], 1 ); - } while( ++k <= order ); + } } else if( lz > 2 ) { /* Shift to the left */ lz -= 2; - do { + for( k = 0; k < order + 1; k++ ) { C[ k ][ 0 ] = C[ k ][ 1 ] = silk_LSHIFT( c[ k ], lz ); - } while( ++k <= order ); + } } else { /* No need to shift */ - do { + for( k = 0; k < order + 1; k++ ) { C[ k ][ 0 ] = C[ k ][ 1 ] = c[ k ]; - } while( ++k <= order ); + } } for( k = 0; k < order; k++ ) { diff --git a/thirdparty/opus/silk/fixed/solve_LS_FIX.c b/thirdparty/opus/silk/fixed/solve_LS_FIX.c new file mode 100644 index 0000000000..51d7d49d02 --- /dev/null +++ b/thirdparty/opus/silk/fixed/solve_LS_FIX.c @@ -0,0 +1,249 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +***********************************************************************/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "main_FIX.h" +#include "stack_alloc.h" +#include "tuning_parameters.h" + +/*****************************/ +/* Internal function headers */ +/*****************************/ + +typedef struct { + opus_int32 Q36_part; + opus_int32 Q48_part; +} inv_D_t; + +/* Factorize square matrix A into LDL form */ +static OPUS_INLINE void silk_LDL_factorize_FIX( + opus_int32 *A, /* I/O Pointer to Symetric Square Matrix */ + opus_int M, /* I Size of Matrix */ + opus_int32 *L_Q16, /* I/O Pointer to Square Upper triangular Matrix */ + inv_D_t *inv_D /* I/O Pointer to vector holding inverted diagonal elements of D */ +); + +/* Solve Lx = b, when L is lower triangular and has ones on the diagonal */ +static OPUS_INLINE void silk_LS_SolveFirst_FIX( + const opus_int32 *L_Q16, /* I Pointer to Lower Triangular Matrix */ + opus_int M, /* I Dim of Matrix equation */ + const opus_int32 *b, /* I b Vector */ + opus_int32 *x_Q16 /* O x Vector */ +); + +/* Solve L^t*x = b, where L is lower triangular with ones on the diagonal */ +static OPUS_INLINE void silk_LS_SolveLast_FIX( + const opus_int32 *L_Q16, /* I Pointer to Lower Triangular Matrix */ + const opus_int M, /* I Dim of Matrix equation */ + const opus_int32 *b, /* I b Vector */ + opus_int32 *x_Q16 /* O x Vector */ +); + +static OPUS_INLINE void silk_LS_divide_Q16_FIX( + opus_int32 T[], /* I/O Numenator vector */ + inv_D_t *inv_D, /* I 1 / D vector */ + opus_int M /* I dimension */ +); + +/* Solves Ax = b, assuming A is symmetric */ +void silk_solve_LDL_FIX( + opus_int32 *A, /* I Pointer to symetric square matrix A */ + opus_int M, /* I Size of matrix */ + const opus_int32 *b, /* I Pointer to b vector */ + opus_int32 *x_Q16 /* O Pointer to x solution vector */ +) +{ + VARDECL( opus_int32, L_Q16 ); + opus_int32 Y[ MAX_MATRIX_SIZE ]; + inv_D_t inv_D[ MAX_MATRIX_SIZE ]; + SAVE_STACK; + + silk_assert( M <= MAX_MATRIX_SIZE ); + ALLOC( L_Q16, M * M, opus_int32 ); + + /*************************************************** + Factorize A by LDL such that A = L*D*L', + where L is lower triangular with ones on diagonal + ****************************************************/ + silk_LDL_factorize_FIX( A, M, L_Q16, inv_D ); + + /**************************************************** + * substitute D*L'*x = Y. ie: + L*D*L'*x = b => L*Y = b <=> Y = inv(L)*b + ******************************************************/ + silk_LS_SolveFirst_FIX( L_Q16, M, b, Y ); + + /**************************************************** + D*L'*x = Y <=> L'*x = inv(D)*Y, because D is + diagonal just multiply with 1/d_i + ****************************************************/ + silk_LS_divide_Q16_FIX( Y, inv_D, M ); + + /**************************************************** + x = inv(L') * inv(D) * Y + *****************************************************/ + silk_LS_SolveLast_FIX( L_Q16, M, Y, x_Q16 ); + RESTORE_STACK; +} + +static OPUS_INLINE void silk_LDL_factorize_FIX( + opus_int32 *A, /* I/O Pointer to Symetric Square Matrix */ + opus_int M, /* I Size of Matrix */ + opus_int32 *L_Q16, /* I/O Pointer to Square Upper triangular Matrix */ + inv_D_t *inv_D /* I/O Pointer to vector holding inverted diagonal elements of D */ +) +{ + opus_int i, j, k, status, loop_count; + const opus_int32 *ptr1, *ptr2; + opus_int32 diag_min_value, tmp_32, err; + opus_int32 v_Q0[ MAX_MATRIX_SIZE ], D_Q0[ MAX_MATRIX_SIZE ]; + opus_int32 one_div_diag_Q36, one_div_diag_Q40, one_div_diag_Q48; + + silk_assert( M <= MAX_MATRIX_SIZE ); + + status = 1; + diag_min_value = silk_max_32( silk_SMMUL( silk_ADD_SAT32( A[ 0 ], A[ silk_SMULBB( M, M ) - 1 ] ), SILK_FIX_CONST( FIND_LTP_COND_FAC, 31 ) ), 1 << 9 ); + for( loop_count = 0; loop_count < M && status == 1; loop_count++ ) { + status = 0; + for( j = 0; j < M; j++ ) { + ptr1 = matrix_adr( L_Q16, j, 0, M ); + tmp_32 = 0; + for( i = 0; i < j; i++ ) { + v_Q0[ i ] = silk_SMULWW( D_Q0[ i ], ptr1[ i ] ); /* Q0 */ + tmp_32 = silk_SMLAWW( tmp_32, v_Q0[ i ], ptr1[ i ] ); /* Q0 */ + } + tmp_32 = silk_SUB32( matrix_ptr( A, j, j, M ), tmp_32 ); + + if( tmp_32 < diag_min_value ) { + tmp_32 = silk_SUB32( silk_SMULBB( loop_count + 1, diag_min_value ), tmp_32 ); + /* Matrix not positive semi-definite, or ill conditioned */ + for( i = 0; i < M; i++ ) { + matrix_ptr( A, i, i, M ) = silk_ADD32( matrix_ptr( A, i, i, M ), tmp_32 ); + } + status = 1; + break; + } + D_Q0[ j ] = tmp_32; /* always < max(Correlation) */ + + /* two-step division */ + one_div_diag_Q36 = silk_INVERSE32_varQ( tmp_32, 36 ); /* Q36 */ + one_div_diag_Q40 = silk_LSHIFT( one_div_diag_Q36, 4 ); /* Q40 */ + err = silk_SUB32( (opus_int32)1 << 24, silk_SMULWW( tmp_32, one_div_diag_Q40 ) ); /* Q24 */ + one_div_diag_Q48 = silk_SMULWW( err, one_div_diag_Q40 ); /* Q48 */ + + /* Save 1/Ds */ + inv_D[ j ].Q36_part = one_div_diag_Q36; + inv_D[ j ].Q48_part = one_div_diag_Q48; + + matrix_ptr( L_Q16, j, j, M ) = 65536; /* 1.0 in Q16 */ + ptr1 = matrix_adr( A, j, 0, M ); + ptr2 = matrix_adr( L_Q16, j + 1, 0, M ); + for( i = j + 1; i < M; i++ ) { + tmp_32 = 0; + for( k = 0; k < j; k++ ) { + tmp_32 = silk_SMLAWW( tmp_32, v_Q0[ k ], ptr2[ k ] ); /* Q0 */ + } + tmp_32 = silk_SUB32( ptr1[ i ], tmp_32 ); /* always < max(Correlation) */ + + /* tmp_32 / D_Q0[j] : Divide to Q16 */ + matrix_ptr( L_Q16, i, j, M ) = silk_ADD32( silk_SMMUL( tmp_32, one_div_diag_Q48 ), + silk_RSHIFT( silk_SMULWW( tmp_32, one_div_diag_Q36 ), 4 ) ); + + /* go to next column */ + ptr2 += M; + } + } + } + + silk_assert( status == 0 ); +} + +static OPUS_INLINE void silk_LS_divide_Q16_FIX( + opus_int32 T[], /* I/O Numenator vector */ + inv_D_t *inv_D, /* I 1 / D vector */ + opus_int M /* I dimension */ +) +{ + opus_int i; + opus_int32 tmp_32; + opus_int32 one_div_diag_Q36, one_div_diag_Q48; + + for( i = 0; i < M; i++ ) { + one_div_diag_Q36 = inv_D[ i ].Q36_part; + one_div_diag_Q48 = inv_D[ i ].Q48_part; + + tmp_32 = T[ i ]; + T[ i ] = silk_ADD32( silk_SMMUL( tmp_32, one_div_diag_Q48 ), silk_RSHIFT( silk_SMULWW( tmp_32, one_div_diag_Q36 ), 4 ) ); + } +} + +/* Solve Lx = b, when L is lower triangular and has ones on the diagonal */ +static OPUS_INLINE void silk_LS_SolveFirst_FIX( + const opus_int32 *L_Q16, /* I Pointer to Lower Triangular Matrix */ + opus_int M, /* I Dim of Matrix equation */ + const opus_int32 *b, /* I b Vector */ + opus_int32 *x_Q16 /* O x Vector */ +) +{ + opus_int i, j; + const opus_int32 *ptr32; + opus_int32 tmp_32; + + for( i = 0; i < M; i++ ) { + ptr32 = matrix_adr( L_Q16, i, 0, M ); + tmp_32 = 0; + for( j = 0; j < i; j++ ) { + tmp_32 = silk_SMLAWW( tmp_32, ptr32[ j ], x_Q16[ j ] ); + } + x_Q16[ i ] = silk_SUB32( b[ i ], tmp_32 ); + } +} + +/* Solve L^t*x = b, where L is lower triangular with ones on the diagonal */ +static OPUS_INLINE void silk_LS_SolveLast_FIX( + const opus_int32 *L_Q16, /* I Pointer to Lower Triangular Matrix */ + const opus_int M, /* I Dim of Matrix equation */ + const opus_int32 *b, /* I b Vector */ + opus_int32 *x_Q16 /* O x Vector */ +) +{ + opus_int i, j; + const opus_int32 *ptr32; + opus_int32 tmp_32; + + for( i = M - 1; i >= 0; i-- ) { + ptr32 = matrix_adr( L_Q16, 0, i, M ); + tmp_32 = 0; + for( j = M - 1; j > i; j-- ) { + tmp_32 = silk_SMLAWW( tmp_32, ptr32[ silk_SMULBB( j, M ) ], x_Q16[ j ] ); + } + x_Q16[ i ] = silk_SUB32( b[ i ], tmp_32 ); + } +} diff --git a/thirdparty/opus/silk/fixed/structs_FIX.h b/thirdparty/opus/silk/fixed/structs_FIX.h index 2774a97b24..3294b25128 100644 --- a/thirdparty/opus/silk/fixed/structs_FIX.h +++ b/thirdparty/opus/silk/fixed/structs_FIX.h @@ -48,16 +48,30 @@ typedef struct { } silk_shape_state_FIX; /********************************/ +/* Prefilter state */ +/********************************/ +typedef struct { + opus_int16 sLTP_shp[ LTP_BUF_LENGTH ]; + opus_int32 sAR_shp[ MAX_SHAPE_LPC_ORDER + 1 ]; + opus_int sLTP_shp_buf_idx; + opus_int32 sLF_AR_shp_Q12; + opus_int32 sLF_MA_shp_Q12; + opus_int32 sHarmHP_Q2; + opus_int32 rand_seed; + opus_int lagPrev; +} silk_prefilter_state_FIX; + +/********************************/ /* Encoder state FIX */ /********************************/ typedef struct { silk_encoder_state sCmn; /* Common struct, shared with floating-point code */ silk_shape_state_FIX sShape; /* Shape state */ + silk_prefilter_state_FIX sPrefilt; /* Prefilter State */ /* Buffer for find pitch and noise shape analysis */ silk_DWORD_ALIGN opus_int16 x_buf[ 2 * MAX_FRAME_LENGTH + LA_SHAPE_MAX ];/* Buffer for find pitch and noise shape analysis */ opus_int LTPCorr_Q15; /* Normalized correlation from pitch lag estimator */ - opus_int32 resNrgSmth; } silk_encoder_state_FIX; /************************/ @@ -73,8 +87,11 @@ typedef struct { /* Noise shaping parameters */ /* Testing */ - silk_DWORD_ALIGN opus_int16 AR_Q13[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ]; + silk_DWORD_ALIGN opus_int16 AR1_Q13[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ]; + silk_DWORD_ALIGN opus_int16 AR2_Q13[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ]; opus_int32 LF_shp_Q14[ MAX_NB_SUBFR ]; /* Packs two int16 coefficients per int32 value */ + opus_int GainsPre_Q14[ MAX_NB_SUBFR ]; + opus_int HarmBoost_Q14[ MAX_NB_SUBFR ]; opus_int Tilt_Q14[ MAX_NB_SUBFR ]; opus_int HarmShapeGain_Q14[ MAX_NB_SUBFR ]; opus_int Lambda_Q10; @@ -82,6 +99,7 @@ typedef struct { opus_int coding_quality_Q14; /* measures */ + opus_int sparseness_Q8; opus_int32 predGain_Q16; opus_int LTPredCodGain_Q7; opus_int32 ResNrg[ MAX_NB_SUBFR ]; /* Residual energy per subframe */ diff --git a/thirdparty/opus/silk/fixed/warped_autocorrelation_FIX.c b/thirdparty/opus/silk/fixed/warped_autocorrelation_FIX.c index 5c79553bc0..6ca6c1184d 100644 --- a/thirdparty/opus/silk/fixed/warped_autocorrelation_FIX.c +++ b/thirdparty/opus/silk/fixed/warped_autocorrelation_FIX.c @@ -31,14 +31,17 @@ POSSIBILITY OF SUCH DAMAGE. #include "main_FIX.h" +#define QC 10 +#define QS 14 + #if defined(MIPSr1_ASM) #include "mips/warped_autocorrelation_FIX_mipsr1.h" #endif +#ifndef OVERRIDE_silk_warped_autocorrelation_FIX /* Autocorrelations for a warped frequency axis */ -#ifndef OVERRIDE_silk_warped_autocorrelation_FIX_c -void silk_warped_autocorrelation_FIX_c( +void silk_warped_autocorrelation_FIX( opus_int32 *corr, /* O Result [order + 1] */ opus_int *scale, /* O Scaling of the correlation vector */ const opus_int16 *input, /* I Input data to correlate */ @@ -53,7 +56,7 @@ void silk_warped_autocorrelation_FIX_c( opus_int64 corr_QC[ MAX_SHAPE_LPC_ORDER + 1 ] = { 0 }; /* Order must be even */ - celt_assert( ( order & 1 ) == 0 ); + silk_assert( ( order & 1 ) == 0 ); silk_assert( 2 * QS - QC >= 0 ); /* Loop over samples */ @@ -89,4 +92,4 @@ void silk_warped_autocorrelation_FIX_c( } silk_assert( corr_QC[ 0 ] >= 0 ); /* If breaking, decrease QC*/ } -#endif /* OVERRIDE_silk_warped_autocorrelation_FIX_c */ +#endif /* OVERRIDE_silk_warped_autocorrelation_FIX */ diff --git a/thirdparty/opus/silk/fixed/x86/burg_modified_FIX_sse4_1.c b/thirdparty/opus/silk/fixed/x86/burg_modified_FIX_sse.c index bbb1ce0fcc..3c3583c5fc 100644 --- a/thirdparty/opus/silk/fixed/x86/burg_modified_FIX_sse4_1.c +++ b/thirdparty/opus/silk/fixed/x86/burg_modified_FIX_sse.c @@ -72,7 +72,7 @@ void silk_burg_modified_sse4_1( __m128i FIRST_3210, LAST_3210, ATMP_3210, TMP1_3210, TMP2_3210, T1_3210, T2_3210, PTR_3210, SUBFR_3210, X1_3210, X2_3210; __m128i CONST1 = _mm_set1_epi32(1); - celt_assert( subfr_length * nb_subfr <= MAX_FRAME_SIZE ); + silk_assert( subfr_length * nb_subfr <= MAX_FRAME_SIZE ); /* Compute autocorrelations, added over subframes */ silk_sum_sqr_shift( &C0, &rshifts, x, nb_subfr * subfr_length ); diff --git a/thirdparty/opus/silk/fixed/x86/prefilter_FIX_sse.c b/thirdparty/opus/silk/fixed/x86/prefilter_FIX_sse.c new file mode 100644 index 0000000000..488a603f5d --- /dev/null +++ b/thirdparty/opus/silk/fixed/x86/prefilter_FIX_sse.c @@ -0,0 +1,160 @@ +/* Copyright (c) 2014, Cisco Systems, INC + Written by XiangMingZhu WeiZhou MinPeng YanWang + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <xmmintrin.h> +#include <emmintrin.h> +#include <smmintrin.h> +#include "main.h" +#include "celt/x86/x86cpu.h" + +void silk_warped_LPC_analysis_filter_FIX_sse4_1( + opus_int32 state[], /* I/O State [order + 1] */ + opus_int32 res_Q2[], /* O Residual signal [length] */ + const opus_int16 coef_Q13[], /* I Coefficients [order] */ + const opus_int16 input[], /* I Input signal [length] */ + const opus_int16 lambda_Q16, /* I Warping factor */ + const opus_int length, /* I Length of input signal */ + const opus_int order /* I Filter order (even) */ +) +{ + opus_int n, i; + opus_int32 acc_Q11, tmp1, tmp2; + + /* Order must be even */ + silk_assert( ( order & 1 ) == 0 ); + + if (order == 10) + { + if (0 == lambda_Q16) + { + __m128i coef_Q13_3210, coef_Q13_7654; + __m128i coef_Q13_0123, coef_Q13_4567; + __m128i state_0123, state_4567; + __m128i xmm_product1, xmm_product2; + __m128i xmm_tempa, xmm_tempb; + + register opus_int32 sum; + register opus_int32 state_8, state_9, state_a; + register opus_int64 coef_Q13_8, coef_Q13_9; + + silk_assert( length > 0 ); + + coef_Q13_3210 = OP_CVTEPI16_EPI32_M64( &coef_Q13[ 0 ] ); + coef_Q13_7654 = OP_CVTEPI16_EPI32_M64( &coef_Q13[ 4 ] ); + + coef_Q13_0123 = _mm_shuffle_epi32( coef_Q13_3210, _MM_SHUFFLE( 0, 1, 2, 3 ) ); + coef_Q13_4567 = _mm_shuffle_epi32( coef_Q13_7654, _MM_SHUFFLE( 0, 1, 2, 3 ) ); + + coef_Q13_8 = (opus_int64) coef_Q13[ 8 ]; + coef_Q13_9 = (opus_int64) coef_Q13[ 9 ]; + + state_0123 = _mm_loadu_si128( (__m128i *)(&state[ 0 ] ) ); + state_4567 = _mm_loadu_si128( (__m128i *)(&state[ 4 ] ) ); + + state_0123 = _mm_shuffle_epi32( state_0123, _MM_SHUFFLE( 0, 1, 2, 3 ) ); + state_4567 = _mm_shuffle_epi32( state_4567, _MM_SHUFFLE( 0, 1, 2, 3 ) ); + + state_8 = state[ 8 ]; + state_9 = state[ 9 ]; + state_a = 0; + + for( n = 0; n < length; n++ ) + { + xmm_product1 = _mm_mul_epi32( coef_Q13_0123, state_0123 ); /* 64-bit multiply, only 2 pairs */ + xmm_product2 = _mm_mul_epi32( coef_Q13_4567, state_4567 ); + + xmm_tempa = _mm_shuffle_epi32( state_0123, _MM_SHUFFLE( 0, 1, 2, 3 ) ); + xmm_tempb = _mm_shuffle_epi32( state_4567, _MM_SHUFFLE( 0, 1, 2, 3 ) ); + + xmm_product1 = _mm_srli_epi64( xmm_product1, 16 ); /* >> 16, zero extending works */ + xmm_product2 = _mm_srli_epi64( xmm_product2, 16 ); + + xmm_tempa = _mm_mul_epi32( coef_Q13_3210, xmm_tempa ); + xmm_tempb = _mm_mul_epi32( coef_Q13_7654, xmm_tempb ); + + xmm_tempa = _mm_srli_epi64( xmm_tempa, 16 ); + xmm_tempb = _mm_srli_epi64( xmm_tempb, 16 ); + + xmm_tempa = _mm_add_epi32( xmm_tempa, xmm_product1 ); + xmm_tempb = _mm_add_epi32( xmm_tempb, xmm_product2 ); + xmm_tempa = _mm_add_epi32( xmm_tempa, xmm_tempb ); + + sum = (coef_Q13_8 * state_8) >> 16; + sum += (coef_Q13_9 * state_9) >> 16; + + xmm_tempa = _mm_add_epi32( xmm_tempa, _mm_shuffle_epi32( xmm_tempa, _MM_SHUFFLE( 0, 0, 0, 2 ) ) ); + sum += _mm_cvtsi128_si32( xmm_tempa); + res_Q2[ n ] = silk_LSHIFT( (opus_int32)input[ n ], 2 ) - silk_RSHIFT_ROUND( ( 5 + sum ), 9); + + /* move right */ + state_a = state_9; + state_9 = state_8; + state_8 = _mm_cvtsi128_si32( state_4567 ); + state_4567 = _mm_alignr_epi8( state_0123, state_4567, 4 ); + + state_0123 = _mm_alignr_epi8( _mm_cvtsi32_si128( silk_LSHIFT( input[ n ], 14 ) ), state_0123, 4 ); + } + + _mm_storeu_si128( (__m128i *)( &state[ 0 ] ), _mm_shuffle_epi32( state_0123, _MM_SHUFFLE( 0, 1, 2, 3 ) ) ); + _mm_storeu_si128( (__m128i *)( &state[ 4 ] ), _mm_shuffle_epi32( state_4567, _MM_SHUFFLE( 0, 1, 2, 3 ) ) ); + state[ 8 ] = state_8; + state[ 9 ] = state_9; + state[ 10 ] = state_a; + + return; + } + } + + for( n = 0; n < length; n++ ) { + /* Output of lowpass section */ + tmp2 = silk_SMLAWB( state[ 0 ], state[ 1 ], lambda_Q16 ); + state[ 0 ] = silk_LSHIFT( input[ n ], 14 ); + /* Output of allpass section */ + tmp1 = silk_SMLAWB( state[ 1 ], state[ 2 ] - tmp2, lambda_Q16 ); + state[ 1 ] = tmp2; + acc_Q11 = silk_RSHIFT( order, 1 ); + acc_Q11 = silk_SMLAWB( acc_Q11, tmp2, coef_Q13[ 0 ] ); + /* Loop over allpass sections */ + for( i = 2; i < order; i += 2 ) { + /* Output of allpass section */ + tmp2 = silk_SMLAWB( state[ i ], state[ i + 1 ] - tmp1, lambda_Q16 ); + state[ i ] = tmp1; + acc_Q11 = silk_SMLAWB( acc_Q11, tmp1, coef_Q13[ i - 1 ] ); + /* Output of allpass section */ + tmp1 = silk_SMLAWB( state[ i + 1 ], state[ i + 2 ] - tmp2, lambda_Q16 ); + state[ i + 1 ] = tmp2; + acc_Q11 = silk_SMLAWB( acc_Q11, tmp2, coef_Q13[ i ] ); + } + state[ order ] = tmp1; + acc_Q11 = silk_SMLAWB( acc_Q11, tmp1, coef_Q13[ order - 1 ] ); + res_Q2[ n ] = silk_LSHIFT( (opus_int32)input[ n ], 2 ) - silk_RSHIFT_ROUND( acc_Q11, 9 ); + } +} diff --git a/thirdparty/opus/silk/fixed/x86/vector_ops_FIX_sse4_1.c b/thirdparty/opus/silk/fixed/x86/vector_ops_FIX_sse.c index c1e90564d0..c1e90564d0 100644 --- a/thirdparty/opus/silk/fixed/x86/vector_ops_FIX_sse4_1.c +++ b/thirdparty/opus/silk/fixed/x86/vector_ops_FIX_sse.c diff --git a/thirdparty/opus/silk/float/LPC_analysis_filter_FLP.c b/thirdparty/opus/silk/float/LPC_analysis_filter_FLP.c index 0e1a1fed0f..cae89a0a18 100644 --- a/thirdparty/opus/silk/float/LPC_analysis_filter_FLP.c +++ b/thirdparty/opus/silk/float/LPC_analysis_filter_FLP.c @@ -215,7 +215,7 @@ void silk_LPC_analysis_filter_FLP( const opus_int Order /* I LPC order */ ) { - celt_assert( Order <= length ); + silk_assert( Order <= length ); switch( Order ) { case 6: @@ -239,7 +239,7 @@ void silk_LPC_analysis_filter_FLP( break; default: - celt_assert( 0 ); + silk_assert( 0 ); break; } diff --git a/thirdparty/opus/silk/float/LPC_inv_pred_gain_FLP.c b/thirdparty/opus/silk/float/LPC_inv_pred_gain_FLP.c index 2be2122d61..25178bacdd 100644 --- a/thirdparty/opus/silk/float/LPC_inv_pred_gain_FLP.c +++ b/thirdparty/opus/silk/float/LPC_inv_pred_gain_FLP.c @@ -31,7 +31,8 @@ POSSIBILITY OF SUCH DAMAGE. #include "SigProc_FIX.h" #include "SigProc_FLP.h" -#include "define.h" + +#define RC_THRESHOLD 0.9999f /* compute inverse of LPC prediction gain, and */ /* test if LPC coefficients are stable (all poles within unit circle) */ @@ -42,32 +43,34 @@ silk_float silk_LPC_inverse_pred_gain_FLP( /* O return inverse prediction ga ) { opus_int k, n; - double invGain, rc, rc_mult1, rc_mult2, tmp1, tmp2; - silk_float Atmp[ SILK_MAX_ORDER_LPC ]; + double invGain, rc, rc_mult1, rc_mult2; + silk_float Atmp[ 2 ][ SILK_MAX_ORDER_LPC ]; + silk_float *Aold, *Anew; - silk_memcpy( Atmp, A, order * sizeof(silk_float) ); + Anew = Atmp[ order & 1 ]; + silk_memcpy( Anew, A, order * sizeof(silk_float) ); invGain = 1.0; for( k = order - 1; k > 0; k-- ) { - rc = -Atmp[ k ]; - rc_mult1 = 1.0f - rc * rc; - invGain *= rc_mult1; - if( invGain * MAX_PREDICTION_POWER_GAIN < 1.0f ) { + rc = -Anew[ k ]; + if( rc > RC_THRESHOLD || rc < -RC_THRESHOLD ) { return 0.0f; } + rc_mult1 = 1.0f - rc * rc; rc_mult2 = 1.0f / rc_mult1; - for( n = 0; n < (k + 1) >> 1; n++ ) { - tmp1 = Atmp[ n ]; - tmp2 = Atmp[ k - n - 1 ]; - Atmp[ n ] = (silk_float)( ( tmp1 - tmp2 * rc ) * rc_mult2 ); - Atmp[ k - n - 1 ] = (silk_float)( ( tmp2 - tmp1 * rc ) * rc_mult2 ); + invGain *= rc_mult1; + /* swap pointers */ + Aold = Anew; + Anew = Atmp[ k & 1 ]; + for( n = 0; n < k; n++ ) { + Anew[ n ] = (silk_float)( ( Aold[ n ] - Aold[ k - n - 1 ] * rc ) * rc_mult2 ); } } - rc = -Atmp[ 0 ]; - rc_mult1 = 1.0f - rc * rc; - invGain *= rc_mult1; - if( invGain * MAX_PREDICTION_POWER_GAIN < 1.0f ) { + rc = -Anew[ 0 ]; + if( rc > RC_THRESHOLD || rc < -RC_THRESHOLD ) { return 0.0f; } + rc_mult1 = 1.0f - rc * rc; + invGain *= rc_mult1; return (silk_float)invGain; } diff --git a/thirdparty/opus/silk/float/SigProc_FLP.h b/thirdparty/opus/silk/float/SigProc_FLP.h index 953de8b09e..f0cb3733be 100644 --- a/thirdparty/opus/silk/float/SigProc_FLP.h +++ b/thirdparty/opus/silk/float/SigProc_FLP.h @@ -68,6 +68,13 @@ void silk_k2a_FLP( opus_int32 order /* I prediction order */ ); +/* Solve the normal equations using the Levinson-Durbin recursion */ +silk_float silk_levinsondurbin_FLP( /* O prediction error energy */ + silk_float A[], /* O prediction coefficients [order] */ + const silk_float corr[], /* I input auto-correlations [order + 1] */ + const opus_int order /* I prediction order */ +); + /* compute autocorrelation */ void silk_autocorrelation_FLP( silk_float *results, /* O result (length correlationCount) */ diff --git a/thirdparty/opus/silk/float/apply_sine_window_FLP.c b/thirdparty/opus/silk/float/apply_sine_window_FLP.c index e49e717991..6aae57c0ab 100644 --- a/thirdparty/opus/silk/float/apply_sine_window_FLP.c +++ b/thirdparty/opus/silk/float/apply_sine_window_FLP.c @@ -45,10 +45,10 @@ void silk_apply_sine_window_FLP( opus_int k; silk_float freq, c, S0, S1; - celt_assert( win_type == 1 || win_type == 2 ); + silk_assert( win_type == 1 || win_type == 2 ); /* Length must be multiple of 4 */ - celt_assert( ( length & 3 ) == 0 ); + silk_assert( ( length & 3 ) == 0 ); freq = PI / ( length + 1 ); diff --git a/thirdparty/opus/silk/float/burg_modified_FLP.c b/thirdparty/opus/silk/float/burg_modified_FLP.c index 756b76a35b..ea5dc25a93 100644 --- a/thirdparty/opus/silk/float/burg_modified_FLP.c +++ b/thirdparty/opus/silk/float/burg_modified_FLP.c @@ -52,7 +52,7 @@ silk_float silk_burg_modified_FLP( /* O returns residual energy double CAf[ SILK_MAX_ORDER_LPC + 1 ], CAb[ SILK_MAX_ORDER_LPC + 1 ]; double Af[ SILK_MAX_ORDER_LPC ]; - celt_assert( subfr_length * nb_subfr <= MAX_FRAME_SIZE ); + silk_assert( subfr_length * nb_subfr <= MAX_FRAME_SIZE ); /* Compute autocorrelations, added over subframes */ C0 = silk_energy_FLP( x, nb_subfr * subfr_length ); diff --git a/thirdparty/opus/silk/float/encode_frame_FLP.c b/thirdparty/opus/silk/float/encode_frame_FLP.c index b029c3f5ca..2092a4d9e2 100644 --- a/thirdparty/opus/silk/float/encode_frame_FLP.c +++ b/thirdparty/opus/silk/float/encode_frame_FLP.c @@ -29,7 +29,6 @@ POSSIBILITY OF SUCH DAMAGE. #include "config.h" #endif -#include <stdlib.h> #include "main_FLP.h" #include "tuning_parameters.h" @@ -42,28 +41,21 @@ static OPUS_INLINE void silk_LBRR_encode_FLP( ); void silk_encode_do_VAD_FLP( - silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */ - opus_int activity /* I Decision of Opus voice activity detector */ + silk_encoder_state_FLP *psEnc /* I/O Encoder state FLP */ ) { - const opus_int activity_threshold = SILK_FIX_CONST( SPEECH_ACTIVITY_DTX_THRES, 8 ); - /****************************/ /* Voice Activity Detection */ /****************************/ silk_VAD_GetSA_Q8( &psEnc->sCmn, psEnc->sCmn.inputBuf + 1, psEnc->sCmn.arch ); - /* If Opus VAD is inactive and Silk VAD is active: lower Silk VAD to just under the threshold */ - if( activity == VAD_NO_ACTIVITY && psEnc->sCmn.speech_activity_Q8 >= activity_threshold ) { - psEnc->sCmn.speech_activity_Q8 = activity_threshold - 1; - } /**************************************************/ /* Convert speech activity into VAD and DTX flags */ /**************************************************/ - if( psEnc->sCmn.speech_activity_Q8 < activity_threshold ) { + if( psEnc->sCmn.speech_activity_Q8 < SILK_FIX_CONST( SPEECH_ACTIVITY_DTX_THRES, 8 ) ) { psEnc->sCmn.indices.signalType = TYPE_NO_VOICE_ACTIVITY; psEnc->sCmn.noSpeechCounter++; - if( psEnc->sCmn.noSpeechCounter <= NB_SPEECH_FRAMES_BEFORE_DTX ) { + if( psEnc->sCmn.noSpeechCounter < NB_SPEECH_FRAMES_BEFORE_DTX ) { psEnc->sCmn.inDTX = 0; } else if( psEnc->sCmn.noSpeechCounter > MAX_CONSECUTIVE_DTX + NB_SPEECH_FRAMES_BEFORE_DTX ) { psEnc->sCmn.noSpeechCounter = NB_SPEECH_FRAMES_BEFORE_DTX; @@ -93,6 +85,7 @@ opus_int silk_encode_frame_FLP( silk_encoder_control_FLP sEncCtrl; opus_int i, iter, maxIter, found_upper, found_lower, ret = 0; silk_float *x_frame, *res_pitch_frame; + silk_float xfw[ MAX_FRAME_LENGTH ]; silk_float res_pitch[ 2 * MAX_FRAME_LENGTH + LA_PITCH_MAX ]; ec_enc sRangeEnc_copy, sRangeEnc_copy2; silk_nsq_state sNSQ_copy, sNSQ_copy2; @@ -104,9 +97,6 @@ opus_int silk_encode_frame_FLP( opus_int8 LastGainIndex_copy2; opus_int32 pGains_Q16[ MAX_NB_SUBFR ]; opus_uint8 ec_buf_copy[ 1275 ]; - opus_int gain_lock[ MAX_NB_SUBFR ] = {0}; - opus_int16 best_gain_mult[ MAX_NB_SUBFR ]; - opus_int best_sum[ MAX_NB_SUBFR ]; /* This is totally unnecessary but many compilers (including gcc) are too dumb to realise it */ LastGainIndex_copy2 = nBits_lower = nBits_upper = gainMult_lower = gainMult_upper = 0; @@ -149,17 +139,22 @@ opus_int silk_encode_frame_FLP( /***************************************************/ /* Find linear prediction coefficients (LPC + LTP) */ /***************************************************/ - silk_find_pred_coefs_FLP( psEnc, &sEncCtrl, res_pitch_frame, x_frame, condCoding ); + silk_find_pred_coefs_FLP( psEnc, &sEncCtrl, res_pitch, x_frame, condCoding ); /****************************************/ /* Process gains */ /****************************************/ silk_process_gains_FLP( psEnc, &sEncCtrl, condCoding ); + /*****************************************/ + /* Prefiltering for noise shaper */ + /*****************************************/ + silk_prefilter_FLP( psEnc, &sEncCtrl, xfw, x_frame ); + /****************************************/ /* Low Bitrate Redundant Encoding */ /****************************************/ - silk_LBRR_encode_FLP( psEnc, &sEncCtrl, x_frame, condCoding ); + silk_LBRR_encode_FLP( psEnc, &sEncCtrl, xfw, condCoding ); /* Loop over quantizer and entroy coding to control bitrate */ maxIter = 6; @@ -193,11 +188,7 @@ opus_int silk_encode_frame_FLP( /*****************************************/ /* Noise shaping quantization */ /*****************************************/ - silk_NSQ_wrapper_FLP( psEnc, &sEncCtrl, &psEnc->sCmn.indices, &psEnc->sCmn.sNSQ, psEnc->sCmn.pulses, x_frame ); - - if ( iter == maxIter && !found_lower ) { - silk_memcpy( &sRangeEnc_copy2, psRangeEnc, sizeof( ec_enc ) ); - } + silk_NSQ_wrapper_FLP( psEnc, &sEncCtrl, &psEnc->sCmn.indices, &psEnc->sCmn.sNSQ, psEnc->sCmn.pulses, xfw ); /****************************************/ /* Encode Parameters */ @@ -212,33 +203,6 @@ opus_int silk_encode_frame_FLP( nBits = ec_tell( psRangeEnc ); - /* If we still bust after the last iteration, do some damage control. */ - if ( iter == maxIter && !found_lower && nBits > maxBits ) { - silk_memcpy( psRangeEnc, &sRangeEnc_copy2, sizeof( ec_enc ) ); - - /* Keep gains the same as the last frame. */ - psEnc->sShape.LastGainIndex = sEncCtrl.lastGainIndexPrev; - for ( i = 0; i < psEnc->sCmn.nb_subfr; i++ ) { - psEnc->sCmn.indices.GainsIndices[ i ] = 4; - } - if (condCoding != CODE_CONDITIONALLY) { - psEnc->sCmn.indices.GainsIndices[ 0 ] = sEncCtrl.lastGainIndexPrev; - } - psEnc->sCmn.ec_prevLagIndex = ec_prevLagIndex_copy; - psEnc->sCmn.ec_prevSignalType = ec_prevSignalType_copy; - /* Clear all pulses. */ - for ( i = 0; i < psEnc->sCmn.frame_length; i++ ) { - psEnc->sCmn.pulses[ i ] = 0; - } - - silk_encode_indices( &psEnc->sCmn, psRangeEnc, psEnc->sCmn.nFramesEncoded, 0, condCoding ); - - silk_encode_pulses( psRangeEnc, psEnc->sCmn.indices.signalType, psEnc->sCmn.indices.quantOffsetType, - psEnc->sCmn.pulses, psEnc->sCmn.frame_length ); - - nBits = ec_tell( psRangeEnc ); - } - if( useCBR == 0 && iter == 0 && nBits <= maxBits ) { break; } @@ -248,7 +212,7 @@ opus_int silk_encode_frame_FLP( if( found_lower && ( gainsID == gainsID_lower || nBits > maxBits ) ) { /* Restore output state from earlier iteration that did meet the bitrate budget */ silk_memcpy( psRangeEnc, &sRangeEnc_copy2, sizeof( ec_enc ) ); - celt_assert( sRangeEnc_copy2.offs <= 1275 ); + silk_assert( sRangeEnc_copy2.offs <= 1275 ); silk_memcpy( psRangeEnc->buf, ec_buf_copy, sRangeEnc_copy2.offs ); silk_memcpy( &psEnc->sCmn.sNSQ, &sNSQ_copy2, sizeof( silk_nsq_state ) ); psEnc->sShape.LastGainIndex = LastGainIndex_copy2; @@ -259,9 +223,7 @@ opus_int silk_encode_frame_FLP( if( nBits > maxBits ) { if( found_lower == 0 && iter >= 2 ) { /* Adjust the quantizer's rate/distortion tradeoff and discard previous "upper" results */ - sEncCtrl.Lambda = silk_max_float(sEncCtrl.Lambda*1.5f, 1.5f); - /* Reducing dithering can help us hit the target. */ - psEnc->sCmn.indices.quantOffsetType = 0; + sEncCtrl.Lambda *= 1.5f; found_upper = 0; gainsID_upper = -1; } else { @@ -278,7 +240,7 @@ opus_int silk_encode_frame_FLP( gainsID_lower = gainsID; /* Copy part of the output state */ silk_memcpy( &sRangeEnc_copy2, psRangeEnc, sizeof( ec_enc ) ); - celt_assert( psRangeEnc->offs <= 1275 ); + silk_assert( psRangeEnc->offs <= 1275 ); silk_memcpy( ec_buf_copy, psRangeEnc->buf, psRangeEnc->offs ); silk_memcpy( &sNSQ_copy2, &psEnc->sCmn.sNSQ, sizeof( silk_nsq_state ) ); LastGainIndex_copy2 = psEnc->sShape.LastGainIndex; @@ -288,34 +250,15 @@ opus_int silk_encode_frame_FLP( break; } - if ( !found_lower && nBits > maxBits ) { - int j; - for ( i = 0; i < psEnc->sCmn.nb_subfr; i++ ) { - int sum=0; - for ( j = i*psEnc->sCmn.subfr_length; j < (i+1)*psEnc->sCmn.subfr_length; j++ ) { - sum += abs( psEnc->sCmn.pulses[j] ); - } - if ( iter == 0 || (sum < best_sum[i] && !gain_lock[i]) ) { - best_sum[i] = sum; - best_gain_mult[i] = gainMult_Q8; - } else { - gain_lock[i] = 1; - } - } - } if( ( found_lower & found_upper ) == 0 ) { /* Adjust gain according to high-rate rate/distortion curve */ + opus_int32 gain_factor_Q16; + gain_factor_Q16 = silk_log2lin( silk_LSHIFT( nBits - maxBits, 7 ) / psEnc->sCmn.frame_length + SILK_FIX_CONST( 16, 7 ) ); + gain_factor_Q16 = silk_min_32( gain_factor_Q16, SILK_FIX_CONST( 2, 16 ) ); if( nBits > maxBits ) { - if (gainMult_Q8 < 16384) { - gainMult_Q8 *= 2; - } else { - gainMult_Q8 = 32767; - } - } else { - opus_int32 gain_factor_Q16; - gain_factor_Q16 = silk_log2lin( silk_LSHIFT( nBits - maxBits, 7 ) / psEnc->sCmn.frame_length + SILK_FIX_CONST( 16, 7 ) ); - gainMult_Q8 = silk_SMULWB( gain_factor_Q16, gainMult_Q8 ); + gain_factor_Q16 = silk_max_32( gain_factor_Q16, SILK_FIX_CONST( 1.3, 16 ) ); } + gainMult_Q8 = silk_SMULWB( gain_factor_Q16, gainMult_Q8 ); } else { /* Adjust gain by interpolating */ gainMult_Q8 = gainMult_lower + ( ( gainMult_upper - gainMult_lower ) * ( maxBits - nBits_lower ) ) / ( nBits_upper - nBits_lower ); @@ -329,13 +272,7 @@ opus_int silk_encode_frame_FLP( } for( i = 0; i < psEnc->sCmn.nb_subfr; i++ ) { - opus_int16 tmp; - if ( gain_lock[i] ) { - tmp = best_gain_mult[i]; - } else { - tmp = gainMult_Q8; - } - pGains_Q16[ i ] = silk_LSHIFT_SAT32( silk_SMULWB( sEncCtrl.GainsUnq_Q16[ i ], tmp ), 8 ); + pGains_Q16[ i ] = silk_LSHIFT_SAT32( silk_SMULWB( sEncCtrl.GainsUnq_Q16[ i ], gainMult_Q8 ), 8 ); } /* Quantize gains */ diff --git a/thirdparty/opus/silk/float/energy_FLP.c b/thirdparty/opus/silk/float/energy_FLP.c index 7bc7173c9c..24b8179f9e 100644 --- a/thirdparty/opus/silk/float/energy_FLP.c +++ b/thirdparty/opus/silk/float/energy_FLP.c @@ -37,12 +37,13 @@ double silk_energy_FLP( opus_int dataSize ) { - opus_int i; + opus_int i, dataSize4; double result; /* 4x unrolled loop */ result = 0.0; - for( i = 0; i < dataSize - 3; i += 4 ) { + dataSize4 = dataSize & 0xFFFC; + for( i = 0; i < dataSize4; i += 4 ) { result += data[ i + 0 ] * (double)data[ i + 0 ] + data[ i + 1 ] * (double)data[ i + 1 ] + data[ i + 2 ] * (double)data[ i + 2 ] + diff --git a/thirdparty/opus/silk/float/find_LPC_FLP.c b/thirdparty/opus/silk/float/find_LPC_FLP.c index fa3ffe7f8b..fcfe1c3681 100644 --- a/thirdparty/opus/silk/float/find_LPC_FLP.c +++ b/thirdparty/opus/silk/float/find_LPC_FLP.c @@ -73,7 +73,7 @@ void silk_find_LPC_FLP( silk_interpolate( NLSF0_Q15, psEncC->prev_NLSFq_Q15, NLSF_Q15, k, psEncC->predictLPCOrder ); /* Convert to LPC for residual energy evaluation */ - silk_NLSF2A_FLP( a_tmp, NLSF0_Q15, psEncC->predictLPCOrder, psEncC->arch ); + silk_NLSF2A_FLP( a_tmp, NLSF0_Q15, psEncC->predictLPCOrder ); /* Calculate residual energy with LSF interpolation */ silk_LPC_analysis_filter_FLP( LPC_res, a_tmp, x, 2 * subfr_length, psEncC->predictLPCOrder ); @@ -99,6 +99,6 @@ void silk_find_LPC_FLP( silk_A2NLSF_FLP( NLSF_Q15, a, psEncC->predictLPCOrder ); } - celt_assert( psEncC->indices.NLSFInterpCoef_Q2 == 4 || + silk_assert( psEncC->indices.NLSFInterpCoef_Q2 == 4 || ( psEncC->useInterpolatedNLSFs && !psEncC->first_frame_after_reset && psEncC->nb_subfr == MAX_NB_SUBFR ) ); } diff --git a/thirdparty/opus/silk/float/find_LTP_FLP.c b/thirdparty/opus/silk/float/find_LTP_FLP.c index f97064930e..7229996014 100644 --- a/thirdparty/opus/silk/float/find_LTP_FLP.c +++ b/thirdparty/opus/silk/float/find_LTP_FLP.c @@ -33,32 +33,100 @@ POSSIBILITY OF SUCH DAMAGE. #include "tuning_parameters.h" void silk_find_LTP_FLP( - silk_float XX[ MAX_NB_SUBFR * LTP_ORDER * LTP_ORDER ], /* O Weight for LTP quantization */ - silk_float xX[ MAX_NB_SUBFR * LTP_ORDER ], /* O Weight for LTP quantization */ - const silk_float r_ptr[], /* I LPC residual */ - const opus_int lag[ MAX_NB_SUBFR ], /* I LTP lags */ + silk_float b[ MAX_NB_SUBFR * LTP_ORDER ], /* O LTP coefs */ + silk_float WLTP[ MAX_NB_SUBFR * LTP_ORDER * LTP_ORDER ], /* O Weight for LTP quantization */ + silk_float *LTPredCodGain, /* O LTP coding gain */ + const silk_float r_lpc[], /* I LPC residual */ + const opus_int lag[ MAX_NB_SUBFR ], /* I LTP lags */ + const silk_float Wght[ MAX_NB_SUBFR ], /* I Weights */ const opus_int subfr_length, /* I Subframe length */ - const opus_int nb_subfr /* I number of subframes */ + const opus_int nb_subfr, /* I number of subframes */ + const opus_int mem_offset /* I Number of samples in LTP memory */ ) { - opus_int k; - silk_float *xX_ptr, *XX_ptr; - const silk_float *lag_ptr; - silk_float xx, temp; + opus_int i, k; + silk_float *b_ptr, temp, *WLTP_ptr; + silk_float LPC_res_nrg, LPC_LTP_res_nrg; + silk_float d[ MAX_NB_SUBFR ], m, g, delta_b[ LTP_ORDER ]; + silk_float w[ MAX_NB_SUBFR ], nrg[ MAX_NB_SUBFR ], regu; + silk_float Rr[ LTP_ORDER ], rr[ MAX_NB_SUBFR ]; + const silk_float *r_ptr, *lag_ptr; - xX_ptr = xX; - XX_ptr = XX; + b_ptr = b; + WLTP_ptr = WLTP; + r_ptr = &r_lpc[ mem_offset ]; for( k = 0; k < nb_subfr; k++ ) { lag_ptr = r_ptr - ( lag[ k ] + LTP_ORDER / 2 ); - silk_corrMatrix_FLP( lag_ptr, subfr_length, LTP_ORDER, XX_ptr ); - silk_corrVector_FLP( lag_ptr, r_ptr, subfr_length, LTP_ORDER, xX_ptr ); - xx = ( silk_float )silk_energy_FLP( r_ptr, subfr_length + LTP_ORDER ); - temp = 1.0f / silk_max( xx, LTP_CORR_INV_MAX * 0.5f * ( XX_ptr[ 0 ] + XX_ptr[ 24 ] ) + 1.0f ); - silk_scale_vector_FLP( XX_ptr, temp, LTP_ORDER * LTP_ORDER ); - silk_scale_vector_FLP( xX_ptr, temp, LTP_ORDER ); - r_ptr += subfr_length; - XX_ptr += LTP_ORDER * LTP_ORDER; - xX_ptr += LTP_ORDER; + silk_corrMatrix_FLP( lag_ptr, subfr_length, LTP_ORDER, WLTP_ptr ); + silk_corrVector_FLP( lag_ptr, r_ptr, subfr_length, LTP_ORDER, Rr ); + + rr[ k ] = ( silk_float )silk_energy_FLP( r_ptr, subfr_length ); + regu = 1.0f + rr[ k ] + + matrix_ptr( WLTP_ptr, 0, 0, LTP_ORDER ) + + matrix_ptr( WLTP_ptr, LTP_ORDER-1, LTP_ORDER-1, LTP_ORDER ); + regu *= LTP_DAMPING / 3; + silk_regularize_correlations_FLP( WLTP_ptr, &rr[ k ], regu, LTP_ORDER ); + silk_solve_LDL_FLP( WLTP_ptr, LTP_ORDER, Rr, b_ptr ); + + /* Calculate residual energy */ + nrg[ k ] = silk_residual_energy_covar_FLP( b_ptr, WLTP_ptr, Rr, rr[ k ], LTP_ORDER ); + + temp = Wght[ k ] / ( nrg[ k ] * Wght[ k ] + 0.01f * subfr_length ); + silk_scale_vector_FLP( WLTP_ptr, temp, LTP_ORDER * LTP_ORDER ); + w[ k ] = matrix_ptr( WLTP_ptr, LTP_ORDER / 2, LTP_ORDER / 2, LTP_ORDER ); + + r_ptr += subfr_length; + b_ptr += LTP_ORDER; + WLTP_ptr += LTP_ORDER * LTP_ORDER; + } + + /* Compute LTP coding gain */ + if( LTPredCodGain != NULL ) { + LPC_LTP_res_nrg = 1e-6f; + LPC_res_nrg = 0.0f; + for( k = 0; k < nb_subfr; k++ ) { + LPC_res_nrg += rr[ k ] * Wght[ k ]; + LPC_LTP_res_nrg += nrg[ k ] * Wght[ k ]; + } + + silk_assert( LPC_LTP_res_nrg > 0 ); + *LTPredCodGain = 3.0f * silk_log2( LPC_res_nrg / LPC_LTP_res_nrg ); + } + + /* Smoothing */ + /* d = sum( B, 1 ); */ + b_ptr = b; + for( k = 0; k < nb_subfr; k++ ) { + d[ k ] = 0; + for( i = 0; i < LTP_ORDER; i++ ) { + d[ k ] += b_ptr[ i ]; + } + b_ptr += LTP_ORDER; + } + /* m = ( w * d' ) / ( sum( w ) + 1e-3 ); */ + temp = 1e-3f; + for( k = 0; k < nb_subfr; k++ ) { + temp += w[ k ]; + } + m = 0; + for( k = 0; k < nb_subfr; k++ ) { + m += d[ k ] * w[ k ]; + } + m = m / temp; + + b_ptr = b; + for( k = 0; k < nb_subfr; k++ ) { + g = LTP_SMOOTHING / ( LTP_SMOOTHING + w[ k ] ) * ( m - d[ k ] ); + temp = 0; + for( i = 0; i < LTP_ORDER; i++ ) { + delta_b[ i ] = silk_max_float( b_ptr[ i ], 0.1f ); + temp += delta_b[ i ]; + } + temp = g / temp; + for( i = 0; i < LTP_ORDER; i++ ) { + b_ptr[ i ] = b_ptr[ i ] + delta_b[ i ] * temp; + } + b_ptr += LTP_ORDER; } } diff --git a/thirdparty/opus/silk/float/find_pitch_lags_FLP.c b/thirdparty/opus/silk/float/find_pitch_lags_FLP.c index dedbcd2836..f3b22d25ce 100644 --- a/thirdparty/opus/silk/float/find_pitch_lags_FLP.c +++ b/thirdparty/opus/silk/float/find_pitch_lags_FLP.c @@ -56,7 +56,7 @@ void silk_find_pitch_lags_FLP( buf_len = psEnc->sCmn.la_pitch + psEnc->sCmn.frame_length + psEnc->sCmn.ltp_mem_length; /* Safety check */ - celt_assert( buf_len >= psEnc->sCmn.pitch_LPC_win_length ); + silk_assert( buf_len >= psEnc->sCmn.pitch_LPC_win_length ); x_buf = x - psEnc->sCmn.ltp_mem_length; diff --git a/thirdparty/opus/silk/float/find_pred_coefs_FLP.c b/thirdparty/opus/silk/float/find_pred_coefs_FLP.c index dcf7c5202d..1af4fe5f1b 100644 --- a/thirdparty/opus/silk/float/find_pred_coefs_FLP.c +++ b/thirdparty/opus/silk/float/find_pred_coefs_FLP.c @@ -41,9 +41,8 @@ void silk_find_pred_coefs_FLP( ) { opus_int i; - silk_float XXLTP[ MAX_NB_SUBFR * LTP_ORDER * LTP_ORDER ]; - silk_float xXLTP[ MAX_NB_SUBFR * LTP_ORDER ]; - silk_float invGains[ MAX_NB_SUBFR ]; + silk_float WLTP[ MAX_NB_SUBFR * LTP_ORDER * LTP_ORDER ]; + silk_float invGains[ MAX_NB_SUBFR ], Wght[ MAX_NB_SUBFR ]; opus_int16 NLSF_Q15[ MAX_LPC_ORDER ]; const silk_float *x_ptr; silk_float *x_pre_ptr, LPC_in_pre[ MAX_NB_SUBFR * MAX_LPC_ORDER + MAX_FRAME_LENGTH ]; @@ -53,20 +52,23 @@ void silk_find_pred_coefs_FLP( for( i = 0; i < psEnc->sCmn.nb_subfr; i++ ) { silk_assert( psEncCtrl->Gains[ i ] > 0.0f ); invGains[ i ] = 1.0f / psEncCtrl->Gains[ i ]; + Wght[ i ] = invGains[ i ] * invGains[ i ]; } if( psEnc->sCmn.indices.signalType == TYPE_VOICED ) { /**********/ /* VOICED */ /**********/ - celt_assert( psEnc->sCmn.ltp_mem_length - psEnc->sCmn.predictLPCOrder >= psEncCtrl->pitchL[ 0 ] + LTP_ORDER / 2 ); + silk_assert( psEnc->sCmn.ltp_mem_length - psEnc->sCmn.predictLPCOrder >= psEncCtrl->pitchL[ 0 ] + LTP_ORDER / 2 ); /* LTP analysis */ - silk_find_LTP_FLP( XXLTP, xXLTP, res_pitch, psEncCtrl->pitchL, psEnc->sCmn.subfr_length, psEnc->sCmn.nb_subfr ); + silk_find_LTP_FLP( psEncCtrl->LTPCoef, WLTP, &psEncCtrl->LTPredCodGain, res_pitch, + psEncCtrl->pitchL, Wght, psEnc->sCmn.subfr_length, psEnc->sCmn.nb_subfr, psEnc->sCmn.ltp_mem_length ); /* Quantize LTP gain parameters */ silk_quant_LTP_gains_FLP( psEncCtrl->LTPCoef, psEnc->sCmn.indices.LTPIndex, &psEnc->sCmn.indices.PERIndex, - &psEnc->sCmn.sum_log_gain_Q7, &psEncCtrl->LTPredCodGain, XXLTP, xXLTP, psEnc->sCmn.subfr_length, psEnc->sCmn.nb_subfr, psEnc->sCmn.arch ); + &psEnc->sCmn.sum_log_gain_Q7, WLTP, psEnc->sCmn.mu_LTP_Q9, psEnc->sCmn.LTPQuantLowComplexity, psEnc->sCmn.nb_subfr, + psEnc->sCmn.arch ); /* Control LTP scaling */ silk_LTP_scale_ctrl_FLP( psEnc, psEncCtrl, condCoding ); diff --git a/thirdparty/opus/silk/float/inner_product_FLP.c b/thirdparty/opus/silk/float/inner_product_FLP.c index cdd39d24ce..029c012911 100644 --- a/thirdparty/opus/silk/float/inner_product_FLP.c +++ b/thirdparty/opus/silk/float/inner_product_FLP.c @@ -38,12 +38,13 @@ double silk_inner_product_FLP( opus_int dataSize ) { - opus_int i; + opus_int i, dataSize4; double result; /* 4x unrolled loop */ result = 0.0; - for( i = 0; i < dataSize - 3; i += 4 ) { + dataSize4 = dataSize & 0xFFFC; + for( i = 0; i < dataSize4; i += 4 ) { result += data1[ i + 0 ] * (double)data2[ i + 0 ] + data1[ i + 1 ] * (double)data2[ i + 1 ] + data1[ i + 2 ] * (double)data2[ i + 2 ] + diff --git a/thirdparty/opus/silk/float/k2a_FLP.c b/thirdparty/opus/silk/float/k2a_FLP.c index 1448008dbb..12af4e7669 100644 --- a/thirdparty/opus/silk/float/k2a_FLP.c +++ b/thirdparty/opus/silk/float/k2a_FLP.c @@ -39,16 +39,15 @@ void silk_k2a_FLP( ) { opus_int k, n; - silk_float rck, tmp1, tmp2; + silk_float Atmp[ SILK_MAX_ORDER_LPC ]; for( k = 0; k < order; k++ ) { - rck = rc[ k ]; - for( n = 0; n < (k + 1) >> 1; n++ ) { - tmp1 = A[ n ]; - tmp2 = A[ k - n - 1 ]; - A[ n ] = tmp1 + tmp2 * rck; - A[ k - n - 1 ] = tmp2 + tmp1 * rck; + for( n = 0; n < k; n++ ) { + Atmp[ n ] = A[ n ]; } - A[ k ] = -rck; + for( n = 0; n < k; n++ ) { + A[ n ] += Atmp[ k - n - 1 ] * rc[ k ]; + } + A[ k ] = -rc[ k ]; } } diff --git a/thirdparty/opus/silk/float/levinsondurbin_FLP.c b/thirdparty/opus/silk/float/levinsondurbin_FLP.c new file mode 100644 index 0000000000..f0ba606981 --- /dev/null +++ b/thirdparty/opus/silk/float/levinsondurbin_FLP.c @@ -0,0 +1,81 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +***********************************************************************/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "SigProc_FLP.h" + +/* Solve the normal equations using the Levinson-Durbin recursion */ +silk_float silk_levinsondurbin_FLP( /* O prediction error energy */ + silk_float A[], /* O prediction coefficients [order] */ + const silk_float corr[], /* I input auto-correlations [order + 1] */ + const opus_int order /* I prediction order */ +) +{ + opus_int i, mHalf, m; + silk_float min_nrg, nrg, t, km, Atmp1, Atmp2; + + min_nrg = 1e-12f * corr[ 0 ] + 1e-9f; + nrg = corr[ 0 ]; + nrg = silk_max_float(min_nrg, nrg); + A[ 0 ] = corr[ 1 ] / nrg; + nrg -= A[ 0 ] * corr[ 1 ]; + nrg = silk_max_float(min_nrg, nrg); + + for( m = 1; m < order; m++ ) + { + t = corr[ m + 1 ]; + for( i = 0; i < m; i++ ) { + t -= A[ i ] * corr[ m - i ]; + } + + /* reflection coefficient */ + km = t / nrg; + + /* residual energy */ + nrg -= km * t; + nrg = silk_max_float(min_nrg, nrg); + + mHalf = m >> 1; + for( i = 0; i < mHalf; i++ ) { + Atmp1 = A[ i ]; + Atmp2 = A[ m - i - 1 ]; + A[ m - i - 1 ] -= km * Atmp1; + A[ i ] -= km * Atmp2; + } + if( m & 1 ) { + A[ mHalf ] -= km * A[ mHalf ]; + } + A[ m ] = km; + } + + /* return the residual energy */ + return nrg; +} + diff --git a/thirdparty/opus/silk/float/main_FLP.h b/thirdparty/opus/silk/float/main_FLP.h index 5dc0ccf4a4..e5a75972e5 100644 --- a/thirdparty/opus/silk/float/main_FLP.h +++ b/thirdparty/opus/silk/float/main_FLP.h @@ -56,8 +56,7 @@ void silk_HP_variable_cutoff( /* Encoder main function */ void silk_encode_do_VAD_FLP( - silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */ - opus_int activity /* I Decision of Opus voice activity detector */ + silk_encoder_state_FLP *psEnc /* I/O Encoder state FLP */ ); /* Encoder main function */ @@ -80,11 +79,22 @@ opus_int silk_init_encoder( opus_int silk_control_encoder( silk_encoder_state_FLP *psEnc, /* I/O Pointer to Silk encoder state FLP */ silk_EncControlStruct *encControl, /* I Control structure */ + const opus_int32 TargetRate_bps, /* I Target max bitrate (bps) */ const opus_int allow_bw_switch, /* I Flag to allow switching audio bandwidth */ const opus_int channelNb, /* I Channel number */ const opus_int force_fs_kHz ); +/****************/ +/* Prefiltering */ +/****************/ +void silk_prefilter_FLP( + silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */ + const silk_encoder_control_FLP *psEncCtrl, /* I Encoder control FLP */ + silk_float xw[], /* O Weighted signal */ + const silk_float x[] /* I Speech signal */ +); + /**************************/ /* Noise shaping analysis */ /**************************/ @@ -143,12 +153,15 @@ void silk_find_LPC_FLP( /* LTP analysis */ void silk_find_LTP_FLP( - silk_float XX[ MAX_NB_SUBFR * LTP_ORDER * LTP_ORDER ], /* O Weight for LTP quantization */ - silk_float xX[ MAX_NB_SUBFR * LTP_ORDER ], /* O Weight for LTP quantization */ - const silk_float r_ptr[], /* I LPC residual */ + silk_float b[ MAX_NB_SUBFR * LTP_ORDER ], /* O LTP coefs */ + silk_float WLTP[ MAX_NB_SUBFR * LTP_ORDER * LTP_ORDER ], /* O Weight for LTP quantization */ + silk_float *LTPredCodGain, /* O LTP coding gain */ + const silk_float r_lpc[], /* I LPC residual */ const opus_int lag[ MAX_NB_SUBFR ], /* I LTP lags */ + const silk_float Wght[ MAX_NB_SUBFR ], /* I Weights */ const opus_int subfr_length, /* I Subframe length */ - const opus_int nb_subfr /* I number of subframes */ + const opus_int nb_subfr, /* I number of subframes */ + const opus_int mem_offset /* I Number of samples in LTP memory */ ); void silk_LTP_analysis_filter_FLP( @@ -185,15 +198,14 @@ void silk_LPC_analysis_filter_FLP( /* LTP tap quantizer */ void silk_quant_LTP_gains_FLP( - silk_float B[ MAX_NB_SUBFR * LTP_ORDER ], /* O Quantized LTP gains */ + silk_float B[ MAX_NB_SUBFR * LTP_ORDER ], /* I/O (Un-)quantized LTP gains */ opus_int8 cbk_index[ MAX_NB_SUBFR ], /* O Codebook index */ opus_int8 *periodicity_index, /* O Periodicity index */ opus_int32 *sum_log_gain_Q7, /* I/O Cumulative max prediction gain */ - silk_float *pred_gain_dB, /* O LTP prediction gain */ - const silk_float XX[ MAX_NB_SUBFR * LTP_ORDER * LTP_ORDER ], /* I Correlation matrix */ - const silk_float xX[ MAX_NB_SUBFR * LTP_ORDER ], /* I Correlation vector */ - const opus_int subfr_len, /* I Number of samples per subframe */ - const opus_int nb_subfr, /* I Number of subframes */ + const silk_float W[ MAX_NB_SUBFR * LTP_ORDER * LTP_ORDER ], /* I Error weights */ + const opus_int mu_Q10, /* I Mu value (R/D tradeoff) */ + const opus_int lowComplexity, /* I Flag for low complexity */ + const opus_int nb_subfr, /* I number of subframes */ int arch /* I Run-time architecture */ ); @@ -233,6 +245,22 @@ void silk_corrVector_FLP( silk_float *Xt /* O X'*t correlation vector [order] */ ); +/* Add noise to matrix diagonal */ +void silk_regularize_correlations_FLP( + silk_float *XX, /* I/O Correlation matrices */ + silk_float *xx, /* I/O Correlation values */ + const silk_float noise, /* I Noise energy to add */ + const opus_int D /* I Dimension of XX */ +); + +/* Function to solve linear equation Ax = b, where A is an MxM symmetric matrix */ +void silk_solve_LDL_FLP( + silk_float *A, /* I/O Symmetric square matrix, out: reg. */ + const opus_int M, /* I Size of matrix */ + const silk_float *b, /* I Pointer to b vector */ + silk_float *x /* O Pointer to x solution vector */ +); + /* Apply sine window to signal vector. */ /* Window types: */ /* 1 -> sine window from 0 to pi/2 */ @@ -257,8 +285,7 @@ void silk_A2NLSF_FLP( void silk_NLSF2A_FLP( silk_float *pAR, /* O LPC coefficients [ LPC_order ] */ const opus_int16 *NLSF_Q15, /* I NLSF vector [ LPC_order ] */ - const opus_int LPC_order, /* I LPC order */ - int arch /* I Run-time architecture */ + const opus_int LPC_order /* I LPC order */ ); /* Limit, stabilize, and quantize NLSFs */ diff --git a/thirdparty/opus/silk/float/noise_shape_analysis_FLP.c b/thirdparty/opus/silk/float/noise_shape_analysis_FLP.c index cb3d8a50b7..65f6ea5870 100644 --- a/thirdparty/opus/silk/float/noise_shape_analysis_FLP.c +++ b/thirdparty/opus/silk/float/noise_shape_analysis_FLP.c @@ -55,21 +55,25 @@ static OPUS_INLINE silk_float warped_gain( /* Convert warped filter coefficients to monic pseudo-warped coefficients and limit maximum */ /* amplitude of monic warped coefficients by using bandwidth expansion on the true coefficients */ static OPUS_INLINE void warped_true2monic_coefs( - silk_float *coefs, + silk_float *coefs_syn, + silk_float *coefs_ana, silk_float lambda, silk_float limit, opus_int order ) { opus_int i, iter, ind = 0; - silk_float tmp, maxabs, chirp, gain; + silk_float tmp, maxabs, chirp, gain_syn, gain_ana; /* Convert to monic coefficients */ for( i = order - 1; i > 0; i-- ) { - coefs[ i - 1 ] -= lambda * coefs[ i ]; + coefs_syn[ i - 1 ] -= lambda * coefs_syn[ i ]; + coefs_ana[ i - 1 ] -= lambda * coefs_ana[ i ]; } - gain = ( 1.0f - lambda * lambda ) / ( 1.0f + lambda * coefs[ 0 ] ); + gain_syn = ( 1.0f - lambda * lambda ) / ( 1.0f + lambda * coefs_syn[ 0 ] ); + gain_ana = ( 1.0f - lambda * lambda ) / ( 1.0f + lambda * coefs_ana[ 0 ] ); for( i = 0; i < order; i++ ) { - coefs[ i ] *= gain; + coefs_syn[ i ] *= gain_syn; + coefs_ana[ i ] *= gain_ana; } /* Limit */ @@ -77,7 +81,7 @@ static OPUS_INLINE void warped_true2monic_coefs( /* Find maximum absolute value */ maxabs = -1.0f; for( i = 0; i < order; i++ ) { - tmp = silk_abs_float( coefs[ i ] ); + tmp = silk_max( silk_abs_float( coefs_syn[ i ] ), silk_abs_float( coefs_ana[ i ] ) ); if( tmp > maxabs ) { maxabs = tmp; ind = i; @@ -90,59 +94,36 @@ static OPUS_INLINE void warped_true2monic_coefs( /* Convert back to true warped coefficients */ for( i = 1; i < order; i++ ) { - coefs[ i - 1 ] += lambda * coefs[ i ]; + coefs_syn[ i - 1 ] += lambda * coefs_syn[ i ]; + coefs_ana[ i - 1 ] += lambda * coefs_ana[ i ]; } - gain = 1.0f / gain; + gain_syn = 1.0f / gain_syn; + gain_ana = 1.0f / gain_ana; for( i = 0; i < order; i++ ) { - coefs[ i ] *= gain; + coefs_syn[ i ] *= gain_syn; + coefs_ana[ i ] *= gain_ana; } /* Apply bandwidth expansion */ chirp = 0.99f - ( 0.8f + 0.1f * iter ) * ( maxabs - limit ) / ( maxabs * ( ind + 1 ) ); - silk_bwexpander_FLP( coefs, order, chirp ); + silk_bwexpander_FLP( coefs_syn, order, chirp ); + silk_bwexpander_FLP( coefs_ana, order, chirp ); /* Convert to monic warped coefficients */ for( i = order - 1; i > 0; i-- ) { - coefs[ i - 1 ] -= lambda * coefs[ i ]; + coefs_syn[ i - 1 ] -= lambda * coefs_syn[ i ]; + coefs_ana[ i - 1 ] -= lambda * coefs_ana[ i ]; } - gain = ( 1.0f - lambda * lambda ) / ( 1.0f + lambda * coefs[ 0 ] ); + gain_syn = ( 1.0f - lambda * lambda ) / ( 1.0f + lambda * coefs_syn[ 0 ] ); + gain_ana = ( 1.0f - lambda * lambda ) / ( 1.0f + lambda * coefs_ana[ 0 ] ); for( i = 0; i < order; i++ ) { - coefs[ i ] *= gain; + coefs_syn[ i ] *= gain_syn; + coefs_ana[ i ] *= gain_ana; } } silk_assert( 0 ); } -static OPUS_INLINE void limit_coefs( - silk_float *coefs, - silk_float limit, - opus_int order -) { - opus_int i, iter, ind = 0; - silk_float tmp, maxabs, chirp; - - for( iter = 0; iter < 10; iter++ ) { - /* Find maximum absolute value */ - maxabs = -1.0f; - for( i = 0; i < order; i++ ) { - tmp = silk_abs_float( coefs[ i ] ); - if( tmp > maxabs ) { - maxabs = tmp; - ind = i; - } - } - if( maxabs <= limit ) { - /* Coefficients are within range - done */ - return; - } - - /* Apply bandwidth expansion */ - chirp = 0.99f - ( 0.8f + 0.1f * iter ) * ( maxabs - limit ) / ( maxabs * ( ind + 1 ) ); - silk_bwexpander_FLP( coefs, order, chirp ); - } - silk_assert( 0 ); -} - /* Compute noise shaping coefficients and initial gain values */ void silk_noise_shape_analysis_FLP( silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */ @@ -152,13 +133,12 @@ void silk_noise_shape_analysis_FLP( ) { silk_shape_state_FLP *psShapeSt = &psEnc->sShape; - opus_int k, nSamples, nSegs; - silk_float SNR_adj_dB, HarmShapeGain, Tilt; - silk_float nrg, log_energy, log_energy_prev, energy_variation; - silk_float BWExp, gain_mult, gain_add, strength, b, warping; + opus_int k, nSamples; + silk_float SNR_adj_dB, HarmBoost, HarmShapeGain, Tilt; + silk_float nrg, pre_nrg, log_energy, log_energy_prev, energy_variation; + silk_float delta, BWExp1, BWExp2, gain_mult, gain_add, strength, b, warping; silk_float x_windowed[ SHAPE_LPC_WIN_MAX ]; silk_float auto_corr[ MAX_SHAPE_LPC_ORDER + 1 ]; - silk_float rc[ MAX_SHAPE_LPC_ORDER + 1 ]; const silk_float *x_ptr, *pitch_res_ptr; /* Point to start of first LPC analysis block */ @@ -196,14 +176,14 @@ void silk_noise_shape_analysis_FLP( if( psEnc->sCmn.indices.signalType == TYPE_VOICED ) { /* Initially set to 0; may be overruled in process_gains(..) */ psEnc->sCmn.indices.quantOffsetType = 0; + psEncCtrl->sparseness = 0.0f; } else { /* Sparseness measure, based on relative fluctuations of energy per 2 milliseconds */ nSamples = 2 * psEnc->sCmn.fs_kHz; energy_variation = 0.0f; log_energy_prev = 0.0f; pitch_res_ptr = pitch_res; - nSegs = silk_SMULBB( SUB_FRAME_LENGTH_MS, psEnc->sCmn.nb_subfr ) / 2; - for( k = 0; k < nSegs; k++ ) { + for( k = 0; k < silk_SMULBB( SUB_FRAME_LENGTH_MS, psEnc->sCmn.nb_subfr ) / 2; k++ ) { nrg = ( silk_float )nSamples + ( silk_float )silk_energy_FLP( pitch_res_ptr, nSamples ); log_energy = silk_log2( nrg ); if( k > 0 ) { @@ -212,13 +192,17 @@ void silk_noise_shape_analysis_FLP( log_energy_prev = log_energy; pitch_res_ptr += nSamples; } + psEncCtrl->sparseness = silk_sigmoid( 0.4f * ( energy_variation - 5.0f ) ); /* Set quantization offset depending on sparseness measure */ - if( energy_variation > ENERGY_VARIATION_THRESHOLD_QNT_OFFSET * (nSegs-1) ) { + if( psEncCtrl->sparseness > SPARSENESS_THRESHOLD_QNT_OFFSET ) { psEnc->sCmn.indices.quantOffsetType = 0; } else { psEnc->sCmn.indices.quantOffsetType = 1; } + + /* Increase coding SNR for sparse signals */ + SNR_adj_dB += SPARSE_SNR_INCR_dB * ( psEncCtrl->sparseness - 0.5f ); } /*******************************/ @@ -226,10 +210,19 @@ void silk_noise_shape_analysis_FLP( /*******************************/ /* More BWE for signals with high prediction gain */ strength = FIND_PITCH_WHITE_NOISE_FRACTION * psEncCtrl->predGain; /* between 0.0 and 1.0 */ - BWExp = BANDWIDTH_EXPANSION / ( 1.0f + strength * strength ); - - /* Slightly more warping in analysis will move quantization noise up in frequency, where it's better masked */ - warping = (silk_float)psEnc->sCmn.warping_Q16 / 65536.0f + 0.01f * psEncCtrl->coding_quality; + BWExp1 = BWExp2 = BANDWIDTH_EXPANSION / ( 1.0f + strength * strength ); + delta = LOW_RATE_BANDWIDTH_EXPANSION_DELTA * ( 1.0f - 0.75f * psEncCtrl->coding_quality ); + BWExp1 -= delta; + BWExp2 += delta; + /* BWExp1 will be applied after BWExp2, so make it relative */ + BWExp1 /= BWExp2; + + if( psEnc->sCmn.warping_Q16 > 0 ) { + /* Slightly more warping in analysis will move quantization noise up in frequency, where it's better masked */ + warping = (silk_float)psEnc->sCmn.warping_Q16 / 65536.0f + 0.01f * psEncCtrl->coding_quality; + } else { + warping = 0.0f; + } /********************************************/ /* Compute noise shaping AR coefs and gains */ @@ -259,28 +252,37 @@ void silk_noise_shape_analysis_FLP( } /* Add white noise, as a fraction of energy */ - auto_corr[ 0 ] += auto_corr[ 0 ] * SHAPE_WHITE_NOISE_FRACTION + 1.0f; + auto_corr[ 0 ] += auto_corr[ 0 ] * SHAPE_WHITE_NOISE_FRACTION; /* Convert correlations to prediction coefficients, and compute residual energy */ - nrg = silk_schur_FLP( rc, auto_corr, psEnc->sCmn.shapingLPCOrder ); - silk_k2a_FLP( &psEncCtrl->AR[ k * MAX_SHAPE_LPC_ORDER ], rc, psEnc->sCmn.shapingLPCOrder ); + nrg = silk_levinsondurbin_FLP( &psEncCtrl->AR2[ k * MAX_SHAPE_LPC_ORDER ], auto_corr, psEnc->sCmn.shapingLPCOrder ); psEncCtrl->Gains[ k ] = ( silk_float )sqrt( nrg ); if( psEnc->sCmn.warping_Q16 > 0 ) { /* Adjust gain for warping */ - psEncCtrl->Gains[ k ] *= warped_gain( &psEncCtrl->AR[ k * MAX_SHAPE_LPC_ORDER ], warping, psEnc->sCmn.shapingLPCOrder ); + psEncCtrl->Gains[ k ] *= warped_gain( &psEncCtrl->AR2[ k * MAX_SHAPE_LPC_ORDER ], warping, psEnc->sCmn.shapingLPCOrder ); } /* Bandwidth expansion for synthesis filter shaping */ - silk_bwexpander_FLP( &psEncCtrl->AR[ k * MAX_SHAPE_LPC_ORDER ], psEnc->sCmn.shapingLPCOrder, BWExp ); + silk_bwexpander_FLP( &psEncCtrl->AR2[ k * MAX_SHAPE_LPC_ORDER ], psEnc->sCmn.shapingLPCOrder, BWExp2 ); - if( psEnc->sCmn.warping_Q16 > 0 ) { - /* Convert to monic warped prediction coefficients and limit absolute values */ - warped_true2monic_coefs( &psEncCtrl->AR[ k * MAX_SHAPE_LPC_ORDER ], warping, 3.999f, psEnc->sCmn.shapingLPCOrder ); - } else { - /* Limit absolute values */ - limit_coefs( &psEncCtrl->AR[ k * MAX_SHAPE_LPC_ORDER ], 3.999f, psEnc->sCmn.shapingLPCOrder ); - } + /* Compute noise shaping filter coefficients */ + silk_memcpy( + &psEncCtrl->AR1[ k * MAX_SHAPE_LPC_ORDER ], + &psEncCtrl->AR2[ k * MAX_SHAPE_LPC_ORDER ], + psEnc->sCmn.shapingLPCOrder * sizeof( silk_float ) ); + + /* Bandwidth expansion for analysis filter shaping */ + silk_bwexpander_FLP( &psEncCtrl->AR1[ k * MAX_SHAPE_LPC_ORDER ], psEnc->sCmn.shapingLPCOrder, BWExp1 ); + + /* Ratio of prediction gains, in energy domain */ + pre_nrg = silk_LPC_inverse_pred_gain_FLP( &psEncCtrl->AR2[ k * MAX_SHAPE_LPC_ORDER ], psEnc->sCmn.shapingLPCOrder ); + nrg = silk_LPC_inverse_pred_gain_FLP( &psEncCtrl->AR1[ k * MAX_SHAPE_LPC_ORDER ], psEnc->sCmn.shapingLPCOrder ); + psEncCtrl->GainsPre[ k ] = 1.0f - 0.7f * ( 1.0f - pre_nrg / nrg ); + + /* Convert to monic warped prediction coefficients and limit absolute values */ + warped_true2monic_coefs( &psEncCtrl->AR2[ k * MAX_SHAPE_LPC_ORDER ], &psEncCtrl->AR1[ k * MAX_SHAPE_LPC_ORDER ], + warping, 3.999f, psEnc->sCmn.shapingLPCOrder ); } /*****************/ @@ -294,6 +296,11 @@ void silk_noise_shape_analysis_FLP( psEncCtrl->Gains[ k ] += gain_add; } + gain_mult = 1.0f + INPUT_TILT + psEncCtrl->coding_quality * HIGH_RATE_INPUT_TILT; + for( k = 0; k < psEnc->sCmn.nb_subfr; k++ ) { + psEncCtrl->GainsPre[ k ] *= gain_mult; + } + /************************************************/ /* Control low-frequency shaping and noise tilt */ /************************************************/ @@ -324,6 +331,12 @@ void silk_noise_shape_analysis_FLP( /****************************/ /* HARMONIC SHAPING CONTROL */ /****************************/ + /* Control boosting of harmonic frequencies */ + HarmBoost = LOW_RATE_HARMONIC_BOOST * ( 1.0f - psEncCtrl->coding_quality ) * psEnc->LTPCorr; + + /* More harmonic boost for noisy input signals */ + HarmBoost += LOW_INPUT_QUALITY_HARMONIC_BOOST * ( 1.0f - psEncCtrl->input_quality ); + if( USE_HARM_SHAPING && psEnc->sCmn.indices.signalType == TYPE_VOICED ) { /* Harmonic noise shaping */ HarmShapeGain = HARMONIC_SHAPING; @@ -342,6 +355,8 @@ void silk_noise_shape_analysis_FLP( /* Smooth over subframes */ /*************************/ for( k = 0; k < psEnc->sCmn.nb_subfr; k++ ) { + psShapeSt->HarmBoost_smth += SUBFR_SMTH_COEF * ( HarmBoost - psShapeSt->HarmBoost_smth ); + psEncCtrl->HarmBoost[ k ] = psShapeSt->HarmBoost_smth; psShapeSt->HarmShapeGain_smth += SUBFR_SMTH_COEF * ( HarmShapeGain - psShapeSt->HarmShapeGain_smth ); psEncCtrl->HarmShapeGain[ k ] = psShapeSt->HarmShapeGain_smth; psShapeSt->Tilt_smth += SUBFR_SMTH_COEF * ( Tilt - psShapeSt->Tilt_smth ); diff --git a/thirdparty/opus/silk/float/pitch_analysis_core_FLP.c b/thirdparty/opus/silk/float/pitch_analysis_core_FLP.c index f351bc3718..d0e637a29d 100644 --- a/thirdparty/opus/silk/float/pitch_analysis_core_FLP.c +++ b/thirdparty/opus/silk/float/pitch_analysis_core_FLP.c @@ -109,11 +109,11 @@ opus_int silk_pitch_analysis_core_FLP( /* O Voicing estimate: 0 voiced, const opus_int8 *Lag_CB_ptr; /* Check for valid sampling frequency */ - celt_assert( Fs_kHz == 8 || Fs_kHz == 12 || Fs_kHz == 16 ); + silk_assert( Fs_kHz == 8 || Fs_kHz == 12 || Fs_kHz == 16 ); /* Check for valid complexity setting */ - celt_assert( complexity >= SILK_PE_MIN_COMPLEX ); - celt_assert( complexity <= SILK_PE_MAX_COMPLEX ); + silk_assert( complexity >= SILK_PE_MIN_COMPLEX ); + silk_assert( complexity <= SILK_PE_MAX_COMPLEX ); silk_assert( search_thres1 >= 0.0f && search_thres1 <= 1.0f ); silk_assert( search_thres2 >= 0.0f && search_thres2 <= 1.0f ); @@ -148,7 +148,7 @@ opus_int silk_pitch_analysis_core_FLP( /* O Voicing estimate: 0 voiced, silk_resampler_down2_3( filt_state, frame_8_FIX, frame_12_FIX, frame_length ); silk_short2float_array( frame_8kHz, frame_8_FIX, frame_length_8kHz ); } else { - celt_assert( Fs_kHz == 8 ); + silk_assert( Fs_kHz == 8 ); silk_float2short_array( frame_8_FIX, frame, frame_length_8kHz ); } @@ -159,7 +159,7 @@ opus_int silk_pitch_analysis_core_FLP( /* O Voicing estimate: 0 voiced, /* Low-pass filter */ for( i = frame_length_4kHz - 1; i > 0; i-- ) { - frame_4kHz[ i ] = silk_ADD_SAT16( frame_4kHz[ i ], frame_4kHz[ i - 1 ] ); + frame_4kHz[ i ] += frame_4kHz[ i - 1 ]; } /****************************************************************************** @@ -169,14 +169,14 @@ opus_int silk_pitch_analysis_core_FLP( /* O Voicing estimate: 0 voiced, target_ptr = &frame_4kHz[ silk_LSHIFT( sf_length_4kHz, 2 ) ]; for( k = 0; k < nb_subfr >> 1; k++ ) { /* Check that we are within range of the array */ - celt_assert( target_ptr >= frame_4kHz ); - celt_assert( target_ptr + sf_length_8kHz <= frame_4kHz + frame_length_4kHz ); + silk_assert( target_ptr >= frame_4kHz ); + silk_assert( target_ptr + sf_length_8kHz <= frame_4kHz + frame_length_4kHz ); basis_ptr = target_ptr - min_lag_4kHz; /* Check that we are within range of the array */ - celt_assert( basis_ptr >= frame_4kHz ); - celt_assert( basis_ptr + sf_length_8kHz <= frame_4kHz + frame_length_4kHz ); + silk_assert( basis_ptr >= frame_4kHz ); + silk_assert( basis_ptr + sf_length_8kHz <= frame_4kHz + frame_length_4kHz ); celt_pitch_xcorr( target_ptr, target_ptr-max_lag_4kHz, xcorr, sf_length_8kHz, max_lag_4kHz - min_lag_4kHz + 1, arch ); @@ -215,7 +215,7 @@ opus_int silk_pitch_analysis_core_FLP( /* O Voicing estimate: 0 voiced, /* Sort */ length_d_srch = 4 + 2 * complexity; - celt_assert( 3 * length_d_srch <= PE_D_SRCH_LENGTH ); + silk_assert( 3 * length_d_srch <= PE_D_SRCH_LENGTH ); silk_insertion_sort_decreasing_FLP( &C[ 0 ][ min_lag_4kHz ], d_srch, max_lag_4kHz - min_lag_4kHz + 1, length_d_srch ); /* Escape if correlation is very low already here */ @@ -238,7 +238,7 @@ opus_int silk_pitch_analysis_core_FLP( /* O Voicing estimate: 0 voiced, break; } } - celt_assert( length_d_srch > 0 ); + silk_assert( length_d_srch > 0 ); for( i = min_lag_8kHz - 5; i < max_lag_8kHz + 5; i++ ) { d_comp[ i ] = 0; @@ -471,7 +471,7 @@ opus_int silk_pitch_analysis_core_FLP( /* O Voicing estimate: 0 voiced, *lagIndex = (opus_int16)( lag - min_lag_8kHz ); *contourIndex = (opus_int8)CBimax; } - celt_assert( *lagIndex >= 0 ); + silk_assert( *lagIndex >= 0 ); /* return as voiced */ return 0; } @@ -506,8 +506,8 @@ static void silk_P_Ana_calc_corr_st3( opus_val32 xcorr[ SCRATCH_SIZE ]; const opus_int8 *Lag_range_ptr, *Lag_CB_ptr; - celt_assert( complexity >= SILK_PE_MIN_COMPLEX ); - celt_assert( complexity <= SILK_PE_MAX_COMPLEX ); + silk_assert( complexity >= SILK_PE_MIN_COMPLEX ); + silk_assert( complexity <= SILK_PE_MAX_COMPLEX ); if( nb_subfr == PE_MAX_NB_SUBFR ) { Lag_range_ptr = &silk_Lag_range_stage3[ complexity ][ 0 ][ 0 ]; @@ -515,7 +515,7 @@ static void silk_P_Ana_calc_corr_st3( nb_cbk_search = silk_nb_cbk_searchs_stage3[ complexity ]; cbk_size = PE_NB_CBKS_STAGE3_MAX; } else { - celt_assert( nb_subfr == PE_MAX_NB_SUBFR >> 1); + silk_assert( nb_subfr == PE_MAX_NB_SUBFR >> 1); Lag_range_ptr = &silk_Lag_range_stage3_10_ms[ 0 ][ 0 ]; Lag_CB_ptr = &silk_CB_lags_stage3_10_ms[ 0 ][ 0 ]; nb_cbk_search = PE_NB_CBKS_STAGE3_10MS; @@ -572,8 +572,8 @@ static void silk_P_Ana_calc_energy_st3( silk_float scratch_mem[ SCRATCH_SIZE ]; const opus_int8 *Lag_range_ptr, *Lag_CB_ptr; - celt_assert( complexity >= SILK_PE_MIN_COMPLEX ); - celt_assert( complexity <= SILK_PE_MAX_COMPLEX ); + silk_assert( complexity >= SILK_PE_MIN_COMPLEX ); + silk_assert( complexity <= SILK_PE_MAX_COMPLEX ); if( nb_subfr == PE_MAX_NB_SUBFR ) { Lag_range_ptr = &silk_Lag_range_stage3[ complexity ][ 0 ][ 0 ]; @@ -581,7 +581,7 @@ static void silk_P_Ana_calc_energy_st3( nb_cbk_search = silk_nb_cbk_searchs_stage3[ complexity ]; cbk_size = PE_NB_CBKS_STAGE3_MAX; } else { - celt_assert( nb_subfr == PE_MAX_NB_SUBFR >> 1); + silk_assert( nb_subfr == PE_MAX_NB_SUBFR >> 1); Lag_range_ptr = &silk_Lag_range_stage3_10_ms[ 0 ][ 0 ]; Lag_CB_ptr = &silk_CB_lags_stage3_10_ms[ 0 ][ 0 ]; nb_cbk_search = PE_NB_CBKS_STAGE3_10MS; diff --git a/thirdparty/opus/silk/float/prefilter_FLP.c b/thirdparty/opus/silk/float/prefilter_FLP.c new file mode 100644 index 0000000000..8bc32fb410 --- /dev/null +++ b/thirdparty/opus/silk/float/prefilter_FLP.c @@ -0,0 +1,206 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +***********************************************************************/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "main_FLP.h" +#include "tuning_parameters.h" + +/* +* Prefilter for finding Quantizer input signal +*/ +static OPUS_INLINE void silk_prefilt_FLP( + silk_prefilter_state_FLP *P, /* I/O state */ + silk_float st_res[], /* I */ + silk_float xw[], /* O */ + silk_float *HarmShapeFIR, /* I */ + silk_float Tilt, /* I */ + silk_float LF_MA_shp, /* I */ + silk_float LF_AR_shp, /* I */ + opus_int lag, /* I */ + opus_int length /* I */ +); + +static void silk_warped_LPC_analysis_filter_FLP( + silk_float state[], /* I/O State [order + 1] */ + silk_float res[], /* O Residual signal [length] */ + const silk_float coef[], /* I Coefficients [order] */ + const silk_float input[], /* I Input signal [length] */ + const silk_float lambda, /* I Warping factor */ + const opus_int length, /* I Length of input signal */ + const opus_int order /* I Filter order (even) */ +) +{ + opus_int n, i; + silk_float acc, tmp1, tmp2; + + /* Order must be even */ + silk_assert( ( order & 1 ) == 0 ); + + for( n = 0; n < length; n++ ) { + /* Output of lowpass section */ + tmp2 = state[ 0 ] + lambda * state[ 1 ]; + state[ 0 ] = input[ n ]; + /* Output of allpass section */ + tmp1 = state[ 1 ] + lambda * ( state[ 2 ] - tmp2 ); + state[ 1 ] = tmp2; + acc = coef[ 0 ] * tmp2; + /* Loop over allpass sections */ + for( i = 2; i < order; i += 2 ) { + /* Output of allpass section */ + tmp2 = state[ i ] + lambda * ( state[ i + 1 ] - tmp1 ); + state[ i ] = tmp1; + acc += coef[ i - 1 ] * tmp1; + /* Output of allpass section */ + tmp1 = state[ i + 1 ] + lambda * ( state[ i + 2 ] - tmp2 ); + state[ i + 1 ] = tmp2; + acc += coef[ i ] * tmp2; + } + state[ order ] = tmp1; + acc += coef[ order - 1 ] * tmp1; + res[ n ] = input[ n ] - acc; + } +} + +/* +* silk_prefilter. Main prefilter function +*/ +void silk_prefilter_FLP( + silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */ + const silk_encoder_control_FLP *psEncCtrl, /* I Encoder control FLP */ + silk_float xw[], /* O Weighted signal */ + const silk_float x[] /* I Speech signal */ +) +{ + silk_prefilter_state_FLP *P = &psEnc->sPrefilt; + opus_int j, k, lag; + silk_float HarmShapeGain, Tilt, LF_MA_shp, LF_AR_shp; + silk_float B[ 2 ]; + const silk_float *AR1_shp; + const silk_float *px; + silk_float *pxw; + silk_float HarmShapeFIR[ 3 ]; + silk_float st_res[ MAX_SUB_FRAME_LENGTH + MAX_LPC_ORDER ]; + + /* Set up pointers */ + px = x; + pxw = xw; + lag = P->lagPrev; + for( k = 0; k < psEnc->sCmn.nb_subfr; k++ ) { + /* Update Variables that change per sub frame */ + if( psEnc->sCmn.indices.signalType == TYPE_VOICED ) { + lag = psEncCtrl->pitchL[ k ]; + } + + /* Noise shape parameters */ + HarmShapeGain = psEncCtrl->HarmShapeGain[ k ] * ( 1.0f - psEncCtrl->HarmBoost[ k ] ); + HarmShapeFIR[ 0 ] = 0.25f * HarmShapeGain; + HarmShapeFIR[ 1 ] = 32767.0f / 65536.0f * HarmShapeGain; + HarmShapeFIR[ 2 ] = 0.25f * HarmShapeGain; + Tilt = psEncCtrl->Tilt[ k ]; + LF_MA_shp = psEncCtrl->LF_MA_shp[ k ]; + LF_AR_shp = psEncCtrl->LF_AR_shp[ k ]; + AR1_shp = &psEncCtrl->AR1[ k * MAX_SHAPE_LPC_ORDER ]; + + /* Short term FIR filtering */ + silk_warped_LPC_analysis_filter_FLP( P->sAR_shp, st_res, AR1_shp, px, + (silk_float)psEnc->sCmn.warping_Q16 / 65536.0f, psEnc->sCmn.subfr_length, psEnc->sCmn.shapingLPCOrder ); + + /* Reduce (mainly) low frequencies during harmonic emphasis */ + B[ 0 ] = psEncCtrl->GainsPre[ k ]; + B[ 1 ] = -psEncCtrl->GainsPre[ k ] * + ( psEncCtrl->HarmBoost[ k ] * HarmShapeGain + INPUT_TILT + psEncCtrl->coding_quality * HIGH_RATE_INPUT_TILT ); + pxw[ 0 ] = B[ 0 ] * st_res[ 0 ] + B[ 1 ] * P->sHarmHP; + for( j = 1; j < psEnc->sCmn.subfr_length; j++ ) { + pxw[ j ] = B[ 0 ] * st_res[ j ] + B[ 1 ] * st_res[ j - 1 ]; + } + P->sHarmHP = st_res[ psEnc->sCmn.subfr_length - 1 ]; + + silk_prefilt_FLP( P, pxw, pxw, HarmShapeFIR, Tilt, LF_MA_shp, LF_AR_shp, lag, psEnc->sCmn.subfr_length ); + + px += psEnc->sCmn.subfr_length; + pxw += psEnc->sCmn.subfr_length; + } + P->lagPrev = psEncCtrl->pitchL[ psEnc->sCmn.nb_subfr - 1 ]; +} + +/* +* Prefilter for finding Quantizer input signal +*/ +static OPUS_INLINE void silk_prefilt_FLP( + silk_prefilter_state_FLP *P, /* I/O state */ + silk_float st_res[], /* I */ + silk_float xw[], /* O */ + silk_float *HarmShapeFIR, /* I */ + silk_float Tilt, /* I */ + silk_float LF_MA_shp, /* I */ + silk_float LF_AR_shp, /* I */ + opus_int lag, /* I */ + opus_int length /* I */ +) +{ + opus_int i; + opus_int idx, LTP_shp_buf_idx; + silk_float n_Tilt, n_LF, n_LTP; + silk_float sLF_AR_shp, sLF_MA_shp; + silk_float *LTP_shp_buf; + + /* To speed up use temp variables instead of using the struct */ + LTP_shp_buf = P->sLTP_shp; + LTP_shp_buf_idx = P->sLTP_shp_buf_idx; + sLF_AR_shp = P->sLF_AR_shp; + sLF_MA_shp = P->sLF_MA_shp; + + for( i = 0; i < length; i++ ) { + if( lag > 0 ) { + silk_assert( HARM_SHAPE_FIR_TAPS == 3 ); + idx = lag + LTP_shp_buf_idx; + n_LTP = LTP_shp_buf[ ( idx - HARM_SHAPE_FIR_TAPS / 2 - 1) & LTP_MASK ] * HarmShapeFIR[ 0 ]; + n_LTP += LTP_shp_buf[ ( idx - HARM_SHAPE_FIR_TAPS / 2 ) & LTP_MASK ] * HarmShapeFIR[ 1 ]; + n_LTP += LTP_shp_buf[ ( idx - HARM_SHAPE_FIR_TAPS / 2 + 1) & LTP_MASK ] * HarmShapeFIR[ 2 ]; + } else { + n_LTP = 0; + } + + n_Tilt = sLF_AR_shp * Tilt; + n_LF = sLF_AR_shp * LF_AR_shp + sLF_MA_shp * LF_MA_shp; + + sLF_AR_shp = st_res[ i ] - n_Tilt; + sLF_MA_shp = sLF_AR_shp - n_LF; + + LTP_shp_buf_idx = ( LTP_shp_buf_idx - 1 ) & LTP_MASK; + LTP_shp_buf[ LTP_shp_buf_idx ] = sLF_MA_shp; + + xw[ i ] = sLF_MA_shp - n_LTP; + } + /* Copy temp variable back to state */ + P->sLF_AR_shp = sLF_AR_shp; + P->sLF_MA_shp = sLF_MA_shp; + P->sLTP_shp_buf_idx = LTP_shp_buf_idx; +} diff --git a/thirdparty/opus/silk/float/residual_energy_FLP.c b/thirdparty/opus/silk/float/residual_energy_FLP.c index 1bd07b33a4..b2e03a86a4 100644 --- a/thirdparty/opus/silk/float/residual_energy_FLP.c +++ b/thirdparty/opus/silk/float/residual_energy_FLP.c @@ -47,7 +47,7 @@ silk_float silk_residual_energy_covar_FLP( /* O silk_float tmp, nrg = 0.0f, regularization; /* Safety checks */ - celt_assert( D >= 0 ); + silk_assert( D >= 0 ); regularization = REGULARIZATION_FACTOR * ( wXX[ 0 ] + wXX[ D * D - 1 ] ); for( k = 0; k < MAX_ITERATIONS_RESIDUAL_NRG; k++ ) { diff --git a/thirdparty/opus/silk/float/schur_FLP.c b/thirdparty/opus/silk/float/schur_FLP.c index 8526c748d3..ee436f8351 100644 --- a/thirdparty/opus/silk/float/schur_FLP.c +++ b/thirdparty/opus/silk/float/schur_FLP.c @@ -38,23 +38,22 @@ silk_float silk_schur_FLP( /* O returns residual energy ) { opus_int k, n; - double C[ SILK_MAX_ORDER_LPC + 1 ][ 2 ]; - double Ctmp1, Ctmp2, rc_tmp; + silk_float C[ SILK_MAX_ORDER_LPC + 1 ][ 2 ]; + silk_float Ctmp1, Ctmp2, rc_tmp; - celt_assert( order >= 0 && order <= SILK_MAX_ORDER_LPC ); + silk_assert( order==6||order==8||order==10||order==12||order==14||order==16 ); /* Copy correlations */ - k = 0; - do { + for( k = 0; k < order+1; k++ ) { C[ k ][ 0 ] = C[ k ][ 1 ] = auto_corr[ k ]; - } while( ++k <= order ); + } for( k = 0; k < order; k++ ) { /* Get reflection coefficient */ rc_tmp = -C[ k + 1 ][ 0 ] / silk_max_float( C[ 0 ][ 1 ], 1e-9f ); /* Save the output */ - refl_coef[ k ] = (silk_float)rc_tmp; + refl_coef[ k ] = rc_tmp; /* Update correlations */ for( n = 0; n < order - k; n++ ) { @@ -66,5 +65,6 @@ silk_float silk_schur_FLP( /* O returns residual energy } /* Return residual energy */ - return (silk_float)C[ 0 ][ 1 ]; + return C[ 0 ][ 1 ]; } + diff --git a/thirdparty/opus/silk/float/solve_LS_FLP.c b/thirdparty/opus/silk/float/solve_LS_FLP.c new file mode 100644 index 0000000000..7c90d665a0 --- /dev/null +++ b/thirdparty/opus/silk/float/solve_LS_FLP.c @@ -0,0 +1,207 @@ +/*********************************************************************** +Copyright (c) 2006-2011, Skype Limited. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +***********************************************************************/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "main_FLP.h" +#include "tuning_parameters.h" + +/********************************************************************** + * LDL Factorisation. Finds the upper triangular matrix L and the diagonal + * Matrix D (only the diagonal elements returned in a vector)such that + * the symmetric matric A is given by A = L*D*L'. + **********************************************************************/ +static OPUS_INLINE void silk_LDL_FLP( + silk_float *A, /* I/O Pointer to Symetric Square Matrix */ + opus_int M, /* I Size of Matrix */ + silk_float *L, /* I/O Pointer to Square Upper triangular Matrix */ + silk_float *Dinv /* I/O Pointer to vector holding the inverse diagonal elements of D */ +); + +/********************************************************************** + * Function to solve linear equation Ax = b, when A is a MxM lower + * triangular matrix, with ones on the diagonal. + **********************************************************************/ +static OPUS_INLINE void silk_SolveWithLowerTriangularWdiagOnes_FLP( + const silk_float *L, /* I Pointer to Lower Triangular Matrix */ + opus_int M, /* I Dim of Matrix equation */ + const silk_float *b, /* I b Vector */ + silk_float *x /* O x Vector */ +); + +/********************************************************************** + * Function to solve linear equation (A^T)x = b, when A is a MxM lower + * triangular, with ones on the diagonal. (ie then A^T is upper triangular) + **********************************************************************/ +static OPUS_INLINE void silk_SolveWithUpperTriangularFromLowerWdiagOnes_FLP( + const silk_float *L, /* I Pointer to Lower Triangular Matrix */ + opus_int M, /* I Dim of Matrix equation */ + const silk_float *b, /* I b Vector */ + silk_float *x /* O x Vector */ +); + +/********************************************************************** + * Function to solve linear equation Ax = b, when A is a MxM + * symmetric square matrix - using LDL factorisation + **********************************************************************/ +void silk_solve_LDL_FLP( + silk_float *A, /* I/O Symmetric square matrix, out: reg. */ + const opus_int M, /* I Size of matrix */ + const silk_float *b, /* I Pointer to b vector */ + silk_float *x /* O Pointer to x solution vector */ +) +{ + opus_int i; + silk_float L[ MAX_MATRIX_SIZE ][ MAX_MATRIX_SIZE ]; + silk_float T[ MAX_MATRIX_SIZE ]; + silk_float Dinv[ MAX_MATRIX_SIZE ]; /* inverse diagonal elements of D*/ + + silk_assert( M <= MAX_MATRIX_SIZE ); + + /*************************************************** + Factorize A by LDL such that A = L*D*(L^T), + where L is lower triangular with ones on diagonal + ****************************************************/ + silk_LDL_FLP( A, M, &L[ 0 ][ 0 ], Dinv ); + + /**************************************************** + * substitute D*(L^T) = T. ie: + L*D*(L^T)*x = b => L*T = b <=> T = inv(L)*b + ******************************************************/ + silk_SolveWithLowerTriangularWdiagOnes_FLP( &L[ 0 ][ 0 ], M, b, T ); + + /**************************************************** + D*(L^T)*x = T <=> (L^T)*x = inv(D)*T, because D is + diagonal just multiply with 1/d_i + ****************************************************/ + for( i = 0; i < M; i++ ) { + T[ i ] = T[ i ] * Dinv[ i ]; + } + /**************************************************** + x = inv(L') * inv(D) * T + *****************************************************/ + silk_SolveWithUpperTriangularFromLowerWdiagOnes_FLP( &L[ 0 ][ 0 ], M, T, x ); +} + +static OPUS_INLINE void silk_SolveWithUpperTriangularFromLowerWdiagOnes_FLP( + const silk_float *L, /* I Pointer to Lower Triangular Matrix */ + opus_int M, /* I Dim of Matrix equation */ + const silk_float *b, /* I b Vector */ + silk_float *x /* O x Vector */ +) +{ + opus_int i, j; + silk_float temp; + const silk_float *ptr1; + + for( i = M - 1; i >= 0; i-- ) { + ptr1 = matrix_adr( L, 0, i, M ); + temp = 0; + for( j = M - 1; j > i ; j-- ) { + temp += ptr1[ j * M ] * x[ j ]; + } + temp = b[ i ] - temp; + x[ i ] = temp; + } +} + +static OPUS_INLINE void silk_SolveWithLowerTriangularWdiagOnes_FLP( + const silk_float *L, /* I Pointer to Lower Triangular Matrix */ + opus_int M, /* I Dim of Matrix equation */ + const silk_float *b, /* I b Vector */ + silk_float *x /* O x Vector */ +) +{ + opus_int i, j; + silk_float temp; + const silk_float *ptr1; + + for( i = 0; i < M; i++ ) { + ptr1 = matrix_adr( L, i, 0, M ); + temp = 0; + for( j = 0; j < i; j++ ) { + temp += ptr1[ j ] * x[ j ]; + } + temp = b[ i ] - temp; + x[ i ] = temp; + } +} + +static OPUS_INLINE void silk_LDL_FLP( + silk_float *A, /* I/O Pointer to Symetric Square Matrix */ + opus_int M, /* I Size of Matrix */ + silk_float *L, /* I/O Pointer to Square Upper triangular Matrix */ + silk_float *Dinv /* I/O Pointer to vector holding the inverse diagonal elements of D */ +) +{ + opus_int i, j, k, loop_count, err = 1; + silk_float *ptr1, *ptr2; + double temp, diag_min_value; + silk_float v[ MAX_MATRIX_SIZE ], D[ MAX_MATRIX_SIZE ]; /* temp arrays*/ + + silk_assert( M <= MAX_MATRIX_SIZE ); + + diag_min_value = FIND_LTP_COND_FAC * 0.5f * ( A[ 0 ] + A[ M * M - 1 ] ); + for( loop_count = 0; loop_count < M && err == 1; loop_count++ ) { + err = 0; + for( j = 0; j < M; j++ ) { + ptr1 = matrix_adr( L, j, 0, M ); + temp = matrix_ptr( A, j, j, M ); /* element in row j column j*/ + for( i = 0; i < j; i++ ) { + v[ i ] = ptr1[ i ] * D[ i ]; + temp -= ptr1[ i ] * v[ i ]; + } + if( temp < diag_min_value ) { + /* Badly conditioned matrix: add white noise and run again */ + temp = ( loop_count + 1 ) * diag_min_value - temp; + for( i = 0; i < M; i++ ) { + matrix_ptr( A, i, i, M ) += ( silk_float )temp; + } + err = 1; + break; + } + D[ j ] = ( silk_float )temp; + Dinv[ j ] = ( silk_float )( 1.0f / temp ); + matrix_ptr( L, j, j, M ) = 1.0f; + + ptr1 = matrix_adr( A, j, 0, M ); + ptr2 = matrix_adr( L, j + 1, 0, M); + for( i = j + 1; i < M; i++ ) { + temp = 0.0; + for( k = 0; k < j; k++ ) { + temp += ptr2[ k ] * v[ k ]; + } + matrix_ptr( L, i, j, M ) = ( silk_float )( ( ptr1[ i ] - temp ) * Dinv[ j ] ); + ptr2 += M; /* go to next column*/ + } + } + } + silk_assert( err == 0 ); +} + diff --git a/thirdparty/opus/silk/float/sort_FLP.c b/thirdparty/opus/silk/float/sort_FLP.c index 0e18f31950..f08d7592c5 100644 --- a/thirdparty/opus/silk/float/sort_FLP.c +++ b/thirdparty/opus/silk/float/sort_FLP.c @@ -47,9 +47,9 @@ void silk_insertion_sort_decreasing_FLP( opus_int i, j; /* Safety checks */ - celt_assert( K > 0 ); - celt_assert( L > 0 ); - celt_assert( L >= K ); + silk_assert( K > 0 ); + silk_assert( L > 0 ); + silk_assert( L >= K ); /* Write start indices in index vector */ for( i = 0; i < K; i++ ) { diff --git a/thirdparty/opus/silk/float/structs_FLP.h b/thirdparty/opus/silk/float/structs_FLP.h index 3150b386e4..14d647ced2 100644 --- a/thirdparty/opus/silk/float/structs_FLP.h +++ b/thirdparty/opus/silk/float/structs_FLP.h @@ -42,16 +42,32 @@ extern "C" /********************************/ typedef struct { opus_int8 LastGainIndex; + silk_float HarmBoost_smth; silk_float HarmShapeGain_smth; silk_float Tilt_smth; } silk_shape_state_FLP; /********************************/ +/* Prefilter state */ +/********************************/ +typedef struct { + silk_float sLTP_shp[ LTP_BUF_LENGTH ]; + silk_float sAR_shp[ MAX_SHAPE_LPC_ORDER + 1 ]; + opus_int sLTP_shp_buf_idx; + silk_float sLF_AR_shp; + silk_float sLF_MA_shp; + silk_float sHarmHP; + opus_int32 rand_seed; + opus_int lagPrev; +} silk_prefilter_state_FLP; + +/********************************/ /* Encoder state FLP */ /********************************/ typedef struct { silk_encoder_state sCmn; /* Common struct, shared with fixed-point code */ silk_shape_state_FLP sShape; /* Noise shaping state */ + silk_prefilter_state_FLP sPrefilt; /* Prefilter State */ /* Buffer for find pitch and noise shape analysis */ silk_float x_buf[ 2 * MAX_FRAME_LENGTH + LA_SHAPE_MAX ];/* Buffer for find pitch and noise shape analysis */ @@ -70,9 +86,12 @@ typedef struct { opus_int pitchL[ MAX_NB_SUBFR ]; /* Noise shaping parameters */ - silk_float AR[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ]; + silk_float AR1[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ]; + silk_float AR2[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ]; silk_float LF_MA_shp[ MAX_NB_SUBFR ]; silk_float LF_AR_shp[ MAX_NB_SUBFR ]; + silk_float GainsPre[ MAX_NB_SUBFR ]; + silk_float HarmBoost[ MAX_NB_SUBFR ]; silk_float Tilt[ MAX_NB_SUBFR ]; silk_float HarmShapeGain[ MAX_NB_SUBFR ]; silk_float Lambda; @@ -80,6 +99,7 @@ typedef struct { silk_float coding_quality; /* Measures */ + silk_float sparseness; silk_float predGain; silk_float LTPredCodGain; silk_float ResNrg[ MAX_NB_SUBFR ]; /* Residual energy per subframe */ diff --git a/thirdparty/opus/silk/float/warped_autocorrelation_FLP.c b/thirdparty/opus/silk/float/warped_autocorrelation_FLP.c index 09186e73d4..542414f48e 100644 --- a/thirdparty/opus/silk/float/warped_autocorrelation_FLP.c +++ b/thirdparty/opus/silk/float/warped_autocorrelation_FLP.c @@ -42,11 +42,11 @@ void silk_warped_autocorrelation_FLP( { opus_int n, i; double tmp1, tmp2; - double state[ MAX_SHAPE_LPC_ORDER + 1 ] = { 0 }; - double C[ MAX_SHAPE_LPC_ORDER + 1 ] = { 0 }; + double state[ MAX_SHAPE_LPC_ORDER + 1 ] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }; + double C[ MAX_SHAPE_LPC_ORDER + 1 ] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }; /* Order must be even */ - celt_assert( ( order & 1 ) == 0 ); + silk_assert( ( order & 1 ) == 0 ); /* Loop over samples */ for( n = 0; n < length; n++ ) { diff --git a/thirdparty/opus/silk/float/wrappers_FLP.c b/thirdparty/opus/silk/float/wrappers_FLP.c index ad90b874a4..6666b8efaa 100644 --- a/thirdparty/opus/silk/float/wrappers_FLP.c +++ b/thirdparty/opus/silk/float/wrappers_FLP.c @@ -54,14 +54,13 @@ void silk_A2NLSF_FLP( void silk_NLSF2A_FLP( silk_float *pAR, /* O LPC coefficients [ LPC_order ] */ const opus_int16 *NLSF_Q15, /* I NLSF vector [ LPC_order ] */ - const opus_int LPC_order, /* I LPC order */ - int arch /* I Run-time architecture */ + const opus_int LPC_order /* I LPC order */ ) { opus_int i; opus_int16 a_fix_Q12[ MAX_LPC_ORDER ]; - silk_NLSF2A( a_fix_Q12, NLSF_Q15, LPC_order, arch ); + silk_NLSF2A( a_fix_Q12, NLSF_Q15, LPC_order ); for( i = 0; i < LPC_order; i++ ) { pAR[ i ] = ( silk_float )a_fix_Q12[ i ] * ( 1.0f / 4096.0f ); @@ -103,14 +102,14 @@ void silk_NSQ_wrapper_FLP( ) { opus_int i, j; - opus_int16 x16[ MAX_FRAME_LENGTH ]; + opus_int32 x_Q3[ MAX_FRAME_LENGTH ]; opus_int32 Gains_Q16[ MAX_NB_SUBFR ]; silk_DWORD_ALIGN opus_int16 PredCoef_Q12[ 2 ][ MAX_LPC_ORDER ]; opus_int16 LTPCoef_Q14[ LTP_ORDER * MAX_NB_SUBFR ]; opus_int LTP_scale_Q14; /* Noise shaping parameters */ - opus_int16 AR_Q13[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ]; + opus_int16 AR2_Q13[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ]; opus_int32 LF_shp_Q14[ MAX_NB_SUBFR ]; /* Packs two int16 coefficients per int32 value */ opus_int Lambda_Q10; opus_int Tilt_Q14[ MAX_NB_SUBFR ]; @@ -120,7 +119,7 @@ void silk_NSQ_wrapper_FLP( /* Noise shape parameters */ for( i = 0; i < psEnc->sCmn.nb_subfr; i++ ) { for( j = 0; j < psEnc->sCmn.shapingLPCOrder; j++ ) { - AR_Q13[ i * MAX_SHAPE_LPC_ORDER + j ] = silk_float2int( psEncCtrl->AR[ i * MAX_SHAPE_LPC_ORDER + j ] * 8192.0f ); + AR2_Q13[ i * MAX_SHAPE_LPC_ORDER + j ] = silk_float2int( psEncCtrl->AR2[ i * MAX_SHAPE_LPC_ORDER + j ] * 8192.0f ); } } @@ -156,16 +155,16 @@ void silk_NSQ_wrapper_FLP( /* Convert input to fix */ for( i = 0; i < psEnc->sCmn.frame_length; i++ ) { - x16[ i ] = silk_float2int( x[ i ] ); + x_Q3[ i ] = silk_float2int( 8.0f * x[ i ] ); } /* Call NSQ */ if( psEnc->sCmn.nStatesDelayedDecision > 1 || psEnc->sCmn.warping_Q16 > 0 ) { - silk_NSQ_del_dec( &psEnc->sCmn, psNSQ, psIndices, x16, pulses, PredCoef_Q12[ 0 ], LTPCoef_Q14, - AR_Q13, HarmShapeGain_Q14, Tilt_Q14, LF_shp_Q14, Gains_Q16, psEncCtrl->pitchL, Lambda_Q10, LTP_scale_Q14, psEnc->sCmn.arch ); + silk_NSQ_del_dec( &psEnc->sCmn, psNSQ, psIndices, x_Q3, pulses, PredCoef_Q12[ 0 ], LTPCoef_Q14, + AR2_Q13, HarmShapeGain_Q14, Tilt_Q14, LF_shp_Q14, Gains_Q16, psEncCtrl->pitchL, Lambda_Q10, LTP_scale_Q14, psEnc->sCmn.arch ); } else { - silk_NSQ( &psEnc->sCmn, psNSQ, psIndices, x16, pulses, PredCoef_Q12[ 0 ], LTPCoef_Q14, - AR_Q13, HarmShapeGain_Q14, Tilt_Q14, LF_shp_Q14, Gains_Q16, psEncCtrl->pitchL, Lambda_Q10, LTP_scale_Q14, psEnc->sCmn.arch ); + silk_NSQ( &psEnc->sCmn, psNSQ, psIndices, x_Q3, pulses, PredCoef_Q12[ 0 ], LTPCoef_Q14, + AR2_Q13, HarmShapeGain_Q14, Tilt_Q14, LF_shp_Q14, Gains_Q16, psEncCtrl->pitchL, Lambda_Q10, LTP_scale_Q14, psEnc->sCmn.arch ); } } @@ -173,35 +172,31 @@ void silk_NSQ_wrapper_FLP( /* Floating-point Silk LTP quantiation wrapper */ /***********************************************/ void silk_quant_LTP_gains_FLP( - silk_float B[ MAX_NB_SUBFR * LTP_ORDER ], /* O Quantized LTP gains */ + silk_float B[ MAX_NB_SUBFR * LTP_ORDER ], /* I/O (Un-)quantized LTP gains */ opus_int8 cbk_index[ MAX_NB_SUBFR ], /* O Codebook index */ opus_int8 *periodicity_index, /* O Periodicity index */ opus_int32 *sum_log_gain_Q7, /* I/O Cumulative max prediction gain */ - silk_float *pred_gain_dB, /* O LTP prediction gain */ - const silk_float XX[ MAX_NB_SUBFR * LTP_ORDER * LTP_ORDER ], /* I Correlation matrix */ - const silk_float xX[ MAX_NB_SUBFR * LTP_ORDER ], /* I Correlation vector */ - const opus_int subfr_len, /* I Number of samples per subframe */ - const opus_int nb_subfr, /* I Number of subframes */ + const silk_float W[ MAX_NB_SUBFR * LTP_ORDER * LTP_ORDER ], /* I Error weights */ + const opus_int mu_Q10, /* I Mu value (R/D tradeoff) */ + const opus_int lowComplexity, /* I Flag for low complexity */ + const opus_int nb_subfr, /* I number of subframes */ int arch /* I Run-time architecture */ ) { - opus_int i, pred_gain_dB_Q7; + opus_int i; opus_int16 B_Q14[ MAX_NB_SUBFR * LTP_ORDER ]; - opus_int32 XX_Q17[ MAX_NB_SUBFR * LTP_ORDER * LTP_ORDER ]; - opus_int32 xX_Q17[ MAX_NB_SUBFR * LTP_ORDER ]; + opus_int32 W_Q18[ MAX_NB_SUBFR*LTP_ORDER*LTP_ORDER ]; - for( i = 0; i < nb_subfr * LTP_ORDER * LTP_ORDER; i++ ) { - XX_Q17[ i ] = (opus_int32)silk_float2int( XX[ i ] * 131072.0f ); - } for( i = 0; i < nb_subfr * LTP_ORDER; i++ ) { - xX_Q17[ i ] = (opus_int32)silk_float2int( xX[ i ] * 131072.0f ); + B_Q14[ i ] = (opus_int16)silk_float2int( B[ i ] * 16384.0f ); + } + for( i = 0; i < nb_subfr * LTP_ORDER * LTP_ORDER; i++ ) { + W_Q18[ i ] = (opus_int32)silk_float2int( W[ i ] * 262144.0f ); } - silk_quant_LTP_gains( B_Q14, cbk_index, periodicity_index, sum_log_gain_Q7, &pred_gain_dB_Q7, XX_Q17, xX_Q17, subfr_len, nb_subfr, arch ); + silk_quant_LTP_gains( B_Q14, cbk_index, periodicity_index, sum_log_gain_Q7, W_Q18, mu_Q10, lowComplexity, nb_subfr, arch ); for( i = 0; i < nb_subfr * LTP_ORDER; i++ ) { B[ i ] = (silk_float)B_Q14[ i ] * ( 1.0f / 16384.0f ); } - - *pred_gain_dB = (silk_float)pred_gain_dB_Q7 * ( 1.0f / 128.0f ); } diff --git a/thirdparty/opus/silk/gain_quant.c b/thirdparty/opus/silk/gain_quant.c index ee65245aa3..64ccd0611b 100644 --- a/thirdparty/opus/silk/gain_quant.c +++ b/thirdparty/opus/silk/gain_quant.c @@ -76,7 +76,6 @@ void silk_gains_quant( /* Accumulate deltas */ if( ind[ k ] > double_step_size_threshold ) { *prev_ind += silk_LSHIFT( ind[ k ], 1 ) - double_step_size_threshold; - *prev_ind = silk_min_int( *prev_ind, N_LEVELS_QGAIN - 1 ); } else { *prev_ind += ind[ k ]; } diff --git a/thirdparty/opus/silk/init_decoder.c b/thirdparty/opus/silk/init_decoder.c index 16c03dcd1c..f887c67886 100644 --- a/thirdparty/opus/silk/init_decoder.c +++ b/thirdparty/opus/silk/init_decoder.c @@ -44,7 +44,6 @@ opus_int silk_init_decoder( /* Used to deactivate LSF interpolation */ psDec->first_frame_after_reset = 1; psDec->prev_gain_Q16 = 65536; - psDec->arch = opus_select_arch(); /* Reset CNG state */ silk_CNG_Reset( psDec ); diff --git a/thirdparty/opus/silk/interpolate.c b/thirdparty/opus/silk/interpolate.c index 833c28ef8e..1bd8ca4d53 100644 --- a/thirdparty/opus/silk/interpolate.c +++ b/thirdparty/opus/silk/interpolate.c @@ -42,8 +42,8 @@ void silk_interpolate( { opus_int i; - celt_assert( ifact_Q2 >= 0 ); - celt_assert( ifact_Q2 <= 4 ); + silk_assert( ifact_Q2 >= 0 ); + silk_assert( ifact_Q2 <= 4 ); for( i = 0; i < d; i++ ) { xi[ i ] = (opus_int16)silk_ADD_RSHIFT( x0[ i ], silk_SMULBB( x1[ i ] - x0[ i ], ifact_Q2 ), 2 ); diff --git a/thirdparty/opus/silk/lin2log.c b/thirdparty/opus/silk/lin2log.c index 0d5155aa86..d4fe515321 100644 --- a/thirdparty/opus/silk/lin2log.c +++ b/thirdparty/opus/silk/lin2log.c @@ -41,6 +41,6 @@ opus_int32 silk_lin2log( silk_CLZ_FRAC( inLin, &lz, &frac_Q7 ); /* Piece-wise parabolic approximation */ - return silk_ADD_LSHIFT32( silk_SMLAWB( frac_Q7, silk_MUL( frac_Q7, 128 - frac_Q7 ), 179 ), 31 - lz, 7 ); + return silk_LSHIFT( 31 - lz, 7 ) + silk_SMLAWB( frac_Q7, silk_MUL( frac_Q7, 128 - frac_Q7 ), 179 ); } diff --git a/thirdparty/opus/silk/macros.h b/thirdparty/opus/silk/macros.h index 3c67b6e5d9..d3ca347520 100644 --- a/thirdparty/opus/silk/macros.h +++ b/thirdparty/opus/silk/macros.h @@ -36,6 +36,14 @@ POSSIBILITY OF SUCH DAMAGE. #include "opus_defines.h" #include "arch.h" +#if OPUS_GNUC_PREREQ(3, 0) +#define opus_likely(x) (__builtin_expect(!!(x), 1)) +#define opus_unlikely(x) (__builtin_expect(!!(x), 0)) +#else +#define opus_likely(x) (!!(x)) +#define opus_unlikely(x) (!!(x)) +#endif + /* This is an OPUS_INLINE header file for general platform. */ /* (a32 * (opus_int32)((opus_int16)(b32))) >> 16 output have to be 32bit int */ diff --git a/thirdparty/opus/silk/main.h b/thirdparty/opus/silk/main.h index 1a33eed549..2f90d68f7d 100644 --- a/thirdparty/opus/silk/main.h +++ b/thirdparty/opus/silk/main.h @@ -42,10 +42,6 @@ POSSIBILITY OF SUCH DAMAGE. #include "x86/main_sse.h" #endif -#if (defined(OPUS_ARM_ASM) || defined(OPUS_ARM_MAY_HAVE_NEON_INTR)) -#include "arm/NSQ_del_dec_arm.h" -#endif - /* Convert Left/Right stereo signal to adaptive Mid/Side representation */ void silk_stereo_LR_to_MS( stereo_enc_state *state, /* I/O State */ @@ -113,22 +109,22 @@ void silk_stereo_decode_mid_only( /* Encodes signs of excitation */ void silk_encode_signs( - ec_enc *psRangeEnc, /* I/O Compressor data structure */ - const opus_int8 pulses[], /* I pulse signal */ - opus_int length, /* I length of input */ - const opus_int signalType, /* I Signal type */ - const opus_int quantOffsetType, /* I Quantization offset type */ - const opus_int sum_pulses[ MAX_NB_SHELL_BLOCKS ] /* I Sum of absolute pulses per block */ + ec_enc *psRangeEnc, /* I/O Compressor data structure */ + const opus_int8 pulses[], /* I pulse signal */ + opus_int length, /* I length of input */ + const opus_int signalType, /* I Signal type */ + const opus_int quantOffsetType, /* I Quantization offset type */ + const opus_int sum_pulses[ MAX_NB_SHELL_BLOCKS ] /* I Sum of absolute pulses per block */ ); /* Decodes signs of excitation */ void silk_decode_signs( - ec_dec *psRangeDec, /* I/O Compressor data structure */ - opus_int16 pulses[], /* I/O pulse signal */ - opus_int length, /* I length of input */ - const opus_int signalType, /* I Signal type */ - const opus_int quantOffsetType, /* I Quantization offset type */ - const opus_int sum_pulses[ MAX_NB_SHELL_BLOCKS ] /* I Sum of absolute pulses per block */ + ec_dec *psRangeDec, /* I/O Compressor data structure */ + opus_int16 pulses[], /* I/O pulse signal */ + opus_int length, /* I length of input */ + const opus_int signalType, /* I Signal type */ + const opus_int quantOffsetType, /* I Quantization offset type */ + const opus_int sum_pulses[ MAX_NB_SHELL_BLOCKS ] /* I Sum of absolute pulses per block */ ); /* Check encoder control struct */ @@ -209,37 +205,37 @@ void silk_interpolate( /* LTP tap quantizer */ void silk_quant_LTP_gains( - opus_int16 B_Q14[ MAX_NB_SUBFR * LTP_ORDER ], /* O Quantized LTP gains */ + opus_int16 B_Q14[ MAX_NB_SUBFR * LTP_ORDER ], /* I/O (un)quantized LTP gains */ opus_int8 cbk_index[ MAX_NB_SUBFR ], /* O Codebook Index */ opus_int8 *periodicity_index, /* O Periodicity Index */ opus_int32 *sum_gain_dB_Q7, /* I/O Cumulative max prediction gain */ - opus_int *pred_gain_dB_Q7, /* O LTP prediction gain */ - const opus_int32 XX_Q17[ MAX_NB_SUBFR*LTP_ORDER*LTP_ORDER ], /* I Correlation matrix in Q18 */ - const opus_int32 xX_Q17[ MAX_NB_SUBFR*LTP_ORDER ], /* I Correlation vector in Q18 */ - const opus_int subfr_len, /* I Number of samples per subframe */ - const opus_int nb_subfr, /* I Number of subframes */ + const opus_int32 W_Q18[ MAX_NB_SUBFR*LTP_ORDER*LTP_ORDER ], /* I Error Weights in Q18 */ + opus_int mu_Q9, /* I Mu value (R/D tradeoff) */ + opus_int lowComplexity, /* I Flag for low complexity */ + const opus_int nb_subfr, /* I number of subframes */ int arch /* I Run-time architecture */ ); /* Entropy constrained matrix-weighted VQ, for a single input data vector */ void silk_VQ_WMat_EC_c( opus_int8 *ind, /* O index of best codebook vector */ - opus_int32 *res_nrg_Q15, /* O best residual energy */ - opus_int32 *rate_dist_Q8, /* O best total bitrate */ + opus_int32 *rate_dist_Q14, /* O best weighted quant error + mu * rate */ opus_int *gain_Q7, /* O sum of absolute LTP coefficients */ - const opus_int32 *XX_Q17, /* I correlation matrix */ - const opus_int32 *xX_Q17, /* I correlation vector */ + const opus_int16 *in_Q14, /* I input vector to be quantized */ + const opus_int32 *W_Q18, /* I weighting matrix */ const opus_int8 *cb_Q7, /* I codebook */ const opus_uint8 *cb_gain_Q7, /* I codebook effective gain */ const opus_uint8 *cl_Q5, /* I code length for each codebook vector */ - const opus_int subfr_len, /* I number of samples per subframe */ + const opus_int mu_Q9, /* I tradeoff betw. weighted error and rate */ const opus_int32 max_gain_Q7, /* I maximum sum of absolute LTP coefficients */ - const opus_int L /* I number of vectors in codebook */ + opus_int L /* I number of vectors in codebook */ ); #if !defined(OVERRIDE_silk_VQ_WMat_EC) -#define silk_VQ_WMat_EC(ind, res_nrg_Q15, rate_dist_Q8, gain_Q7, XX_Q17, xX_Q17, cb_Q7, cb_gain_Q7, cl_Q5, subfr_len, max_gain_Q7, L, arch) \ - ((void)(arch),silk_VQ_WMat_EC_c(ind, res_nrg_Q15, rate_dist_Q8, gain_Q7, XX_Q17, xX_Q17, cb_Q7, cb_gain_Q7, cl_Q5, subfr_len, max_gain_Q7, L)) +#define silk_VQ_WMat_EC(ind, rate_dist_Q14, gain_Q7, in_Q14, W_Q18, cb_Q7, cb_gain_Q7, cl_Q5, \ + mu_Q9, max_gain_Q7, L, arch) \ + ((void)(arch),silk_VQ_WMat_EC_c(ind, rate_dist_Q14, gain_Q7, in_Q14, W_Q18, cb_Q7, cb_gain_Q7, cl_Q5, \ + mu_Q9, max_gain_Q7, L)) #endif /************************************/ @@ -247,14 +243,14 @@ void silk_VQ_WMat_EC_c( /************************************/ void silk_NSQ_c( - const silk_encoder_state *psEncC, /* I Encoder State */ + const silk_encoder_state *psEncC, /* I/O Encoder State */ silk_nsq_state *NSQ, /* I/O NSQ state */ SideInfoIndices *psIndices, /* I/O Quantization Indices */ - const opus_int16 x16[], /* I Input */ + const opus_int32 x_Q3[], /* I Prefiltered input signal */ opus_int8 pulses[], /* O Quantized pulse signal */ const opus_int16 PredCoef_Q12[ 2 * MAX_LPC_ORDER ], /* I Short term prediction coefs */ const opus_int16 LTPCoef_Q14[ LTP_ORDER * MAX_NB_SUBFR ], /* I Long term prediction coefs */ - const opus_int16 AR_Q13[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ], /* I Noise shaping coefs */ + const opus_int16 AR2_Q13[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ], /* I Noise shaping coefs */ const opus_int HarmShapeGain_Q14[ MAX_NB_SUBFR ], /* I Long term shaping coefs */ const opus_int Tilt_Q14[ MAX_NB_SUBFR ], /* I Spectral tilt */ const opus_int32 LF_shp_Q14[ MAX_NB_SUBFR ], /* I Low frequency shaping coefs */ @@ -265,22 +261,22 @@ void silk_NSQ_c( ); #if !defined(OVERRIDE_silk_NSQ) -#define silk_NSQ(psEncC, NSQ, psIndices, x16, pulses, PredCoef_Q12, LTPCoef_Q14, AR_Q13, \ +#define silk_NSQ(psEncC, NSQ, psIndices, x_Q3, pulses, PredCoef_Q12, LTPCoef_Q14, AR2_Q13, \ HarmShapeGain_Q14, Tilt_Q14, LF_shp_Q14, Gains_Q16, pitchL, Lambda_Q10, LTP_scale_Q14, arch) \ - ((void)(arch),silk_NSQ_c(psEncC, NSQ, psIndices, x16, pulses, PredCoef_Q12, LTPCoef_Q14, AR_Q13, \ + ((void)(arch),silk_NSQ_c(psEncC, NSQ, psIndices, x_Q3, pulses, PredCoef_Q12, LTPCoef_Q14, AR2_Q13, \ HarmShapeGain_Q14, Tilt_Q14, LF_shp_Q14, Gains_Q16, pitchL, Lambda_Q10, LTP_scale_Q14)) #endif /* Noise shaping using delayed decision */ void silk_NSQ_del_dec_c( - const silk_encoder_state *psEncC, /* I Encoder State */ + const silk_encoder_state *psEncC, /* I/O Encoder State */ silk_nsq_state *NSQ, /* I/O NSQ state */ SideInfoIndices *psIndices, /* I/O Quantization Indices */ - const opus_int16 x16[], /* I Input */ + const opus_int32 x_Q3[], /* I Prefiltered input signal */ opus_int8 pulses[], /* O Quantized pulse signal */ const opus_int16 PredCoef_Q12[ 2 * MAX_LPC_ORDER ], /* I Short term prediction coefs */ const opus_int16 LTPCoef_Q14[ LTP_ORDER * MAX_NB_SUBFR ], /* I Long term prediction coefs */ - const opus_int16 AR_Q13[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ], /* I Noise shaping coefs */ + const opus_int16 AR2_Q13[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ], /* I Noise shaping coefs */ const opus_int HarmShapeGain_Q14[ MAX_NB_SUBFR ], /* I Long term shaping coefs */ const opus_int Tilt_Q14[ MAX_NB_SUBFR ], /* I Spectral tilt */ const opus_int32 LF_shp_Q14[ MAX_NB_SUBFR ], /* I Low frequency shaping coefs */ @@ -291,9 +287,9 @@ void silk_NSQ_del_dec_c( ); #if !defined(OVERRIDE_silk_NSQ_del_dec) -#define silk_NSQ_del_dec(psEncC, NSQ, psIndices, x16, pulses, PredCoef_Q12, LTPCoef_Q14, AR_Q13, \ +#define silk_NSQ_del_dec(psEncC, NSQ, psIndices, x_Q3, pulses, PredCoef_Q12, LTPCoef_Q14, AR2_Q13, \ HarmShapeGain_Q14, Tilt_Q14, LF_shp_Q14, Gains_Q16, pitchL, Lambda_Q10, LTP_scale_Q14, arch) \ - ((void)(arch),silk_NSQ_del_dec_c(psEncC, NSQ, psIndices, x16, pulses, PredCoef_Q12, LTPCoef_Q14, AR_Q13, \ + ((void)(arch),silk_NSQ_del_dec_c(psEncC, NSQ, psIndices, x_Q3, pulses, PredCoef_Q12, LTPCoef_Q14, AR2_Q13, \ HarmShapeGain_Q14, Tilt_Q14, LF_shp_Q14, Gains_Q16, pitchL, Lambda_Q10, LTP_scale_Q14)) #endif @@ -350,7 +346,6 @@ void silk_NLSF_VQ( opus_int32 err_Q26[], /* O Quantization errors [K] */ const opus_int16 in_Q15[], /* I Input vectors to be quantized [LPC_order] */ const opus_uint8 pCB_Q8[], /* I Codebook vectors [K*LPC_order] */ - const opus_int16 pWght_Q9[], /* I Codebook weights [K*LPC_order] */ const opus_int K, /* I Number of codebook vectors */ const opus_int LPC_order /* I Number of LPCs */ ); diff --git a/thirdparty/opus/silk/mips/NSQ_del_dec_mipsr1.h b/thirdparty/opus/silk/mips/NSQ_del_dec_mipsr1.h index cd70713a8f..ad1cfe2a9b 100644 --- a/thirdparty/opus/silk/mips/NSQ_del_dec_mipsr1.h +++ b/thirdparty/opus/silk/mips/NSQ_del_dec_mipsr1.h @@ -61,7 +61,7 @@ static inline void silk_noise_shape_quantizer_del_dec( opus_int predictLPCOrder, /* I Prediction filter order */ opus_int warping_Q16, /* I */ opus_int nStatesDelayedDecision, /* I Number of states in decision tree */ - opus_int *smpl_buf_idx, /* I/O Index to newest samples in buffers */ + opus_int *smpl_buf_idx, /* I Index to newest samples in buffers */ opus_int decisionDelay, /* I */ int arch /* I */ ) @@ -323,9 +323,8 @@ static inline void silk_noise_shape_quantizer_del_dec( psSS[ 1 ].xq_Q14 = xq_Q14; } - *smpl_buf_idx = ( *smpl_buf_idx - 1 ) % DECISION_DELAY; - if( *smpl_buf_idx < 0 ) *smpl_buf_idx += DECISION_DELAY; - last_smple_idx = ( *smpl_buf_idx + decisionDelay ) % DECISION_DELAY; + *smpl_buf_idx = ( *smpl_buf_idx - 1 ) & DECISION_DELAY_MASK; /* Index to newest samples */ + last_smple_idx = ( *smpl_buf_idx + decisionDelay ) & DECISION_DELAY_MASK; /* Index to decisionDelay old samples */ /* Find winner */ RDmin_Q10 = psSampleState[ 0 ][ 0 ].RD_Q10; diff --git a/thirdparty/opus/silk/mips/sigproc_fix_mipsr1.h b/thirdparty/opus/silk/mips/sigproc_fix_mipsr1.h index 51520c0a6f..3b0a695365 100644 --- a/thirdparty/opus/silk/mips/sigproc_fix_mipsr1.h +++ b/thirdparty/opus/silk/mips/sigproc_fix_mipsr1.h @@ -28,6 +28,11 @@ POSSIBILITY OF SUCH DAMAGE. #ifndef SILK_SIGPROC_FIX_MIPSR1_H #define SILK_SIGPROC_FIX_MIPSR1_H +#ifdef __cplusplus +extern "C" +{ +#endif + #undef silk_SAT16 static inline short int silk_SAT16(int a) { diff --git a/thirdparty/opus/silk/process_NLSFs.c b/thirdparty/opus/silk/process_NLSFs.c index d130809541..0ab71f0163 100644 --- a/thirdparty/opus/silk/process_NLSFs.c +++ b/thirdparty/opus/silk/process_NLSFs.c @@ -48,7 +48,7 @@ void silk_process_NLSFs( silk_assert( psEncC->speech_activity_Q8 >= 0 ); silk_assert( psEncC->speech_activity_Q8 <= SILK_FIX_CONST( 1.0, 8 ) ); - celt_assert( psEncC->useInterpolatedNLSFs == 1 || psEncC->indices.NLSFInterpCoef_Q2 == ( 1 << 2 ) ); + silk_assert( psEncC->useInterpolatedNLSFs == 1 || psEncC->indices.NLSFInterpCoef_Q2 == ( 1 << 2 ) ); /***********************/ /* Calculate mu values */ @@ -60,7 +60,7 @@ void silk_process_NLSFs( NLSF_mu_Q20 = silk_ADD_RSHIFT( NLSF_mu_Q20, NLSF_mu_Q20, 1 ); } - celt_assert( NLSF_mu_Q20 > 0 ); + silk_assert( NLSF_mu_Q20 > 0 ); silk_assert( NLSF_mu_Q20 <= SILK_FIX_CONST( 0.005, 20 ) ); /* Calculate NLSF weights */ @@ -89,7 +89,7 @@ void silk_process_NLSFs( NLSF_mu_Q20, psEncC->NLSF_MSVQ_Survivors, psEncC->indices.signalType ); /* Convert quantized NLSFs back to LPC coefficients */ - silk_NLSF2A( PredCoef_Q12[ 1 ], pNLSF_Q15, psEncC->predictLPCOrder, psEncC->arch ); + silk_NLSF2A( PredCoef_Q12[ 1 ], pNLSF_Q15, psEncC->predictLPCOrder ); if( doInterpolate ) { /* Calculate the interpolated, quantized LSF vector for the first half */ @@ -97,11 +97,11 @@ void silk_process_NLSFs( psEncC->indices.NLSFInterpCoef_Q2, psEncC->predictLPCOrder ); /* Convert back to LPC coefficients */ - silk_NLSF2A( PredCoef_Q12[ 0 ], pNLSF0_temp_Q15, psEncC->predictLPCOrder, psEncC->arch ); + silk_NLSF2A( PredCoef_Q12[ 0 ], pNLSF0_temp_Q15, psEncC->predictLPCOrder ); } else { /* Copy LPC coefficients for first half from second half */ - celt_assert( psEncC->predictLPCOrder <= MAX_LPC_ORDER ); + silk_assert( psEncC->predictLPCOrder <= MAX_LPC_ORDER ); silk_memcpy( PredCoef_Q12[ 0 ], PredCoef_Q12[ 1 ], psEncC->predictLPCOrder * sizeof( opus_int16 ) ); } } diff --git a/thirdparty/opus/silk/quant_LTP_gains.c b/thirdparty/opus/silk/quant_LTP_gains.c index d6b8eff8d1..513a8c4468 100644 --- a/thirdparty/opus/silk/quant_LTP_gains.c +++ b/thirdparty/opus/silk/quant_LTP_gains.c @@ -33,15 +33,14 @@ POSSIBILITY OF SUCH DAMAGE. #include "tuning_parameters.h" void silk_quant_LTP_gains( - opus_int16 B_Q14[ MAX_NB_SUBFR * LTP_ORDER ], /* O Quantized LTP gains */ + opus_int16 B_Q14[ MAX_NB_SUBFR * LTP_ORDER ], /* I/O (un)quantized LTP gains */ opus_int8 cbk_index[ MAX_NB_SUBFR ], /* O Codebook Index */ opus_int8 *periodicity_index, /* O Periodicity Index */ opus_int32 *sum_log_gain_Q7, /* I/O Cumulative max prediction gain */ - opus_int *pred_gain_dB_Q7, /* O LTP prediction gain */ - const opus_int32 XX_Q17[ MAX_NB_SUBFR*LTP_ORDER*LTP_ORDER ], /* I Correlation matrix in Q18 */ - const opus_int32 xX_Q17[ MAX_NB_SUBFR*LTP_ORDER ], /* I Correlation vector in Q18 */ - const opus_int subfr_len, /* I Number of samples per subframe */ - const opus_int nb_subfr, /* I Number of subframes */ + const opus_int32 W_Q18[ MAX_NB_SUBFR*LTP_ORDER*LTP_ORDER ], /* I Error Weights in Q18 */ + opus_int mu_Q9, /* I Mu value (R/D tradeoff) */ + opus_int lowComplexity, /* I Flag for low complexity */ + const opus_int nb_subfr, /* I number of subframes */ int arch /* I Run-time architecture */ ) { @@ -50,16 +49,16 @@ void silk_quant_LTP_gains( const opus_uint8 *cl_ptr_Q5; const opus_int8 *cbk_ptr_Q7; const opus_uint8 *cbk_gain_ptr_Q7; - const opus_int32 *XX_Q17_ptr, *xX_Q17_ptr; - opus_int32 res_nrg_Q15_subfr, res_nrg_Q15, rate_dist_Q7_subfr, rate_dist_Q7, min_rate_dist_Q7; - opus_int32 sum_log_gain_tmp_Q7, best_sum_log_gain_Q7, max_gain_Q7; - opus_int gain_Q7; + const opus_int16 *b_Q14_ptr; + const opus_int32 *W_Q18_ptr; + opus_int32 rate_dist_Q14_subfr, rate_dist_Q14, min_rate_dist_Q14; + opus_int32 sum_log_gain_tmp_Q7, best_sum_log_gain_Q7, max_gain_Q7, gain_Q7; /***************************************************/ /* iterate over different codebooks with different */ /* rates/distortions, and choose best */ /***************************************************/ - min_rate_dist_Q7 = silk_int32_MAX; + min_rate_dist_Q14 = silk_int32_MAX; best_sum_log_gain_Q7 = 0; for( k = 0; k < 3; k++ ) { /* Safety margin for pitch gain control, to take into account factors @@ -71,47 +70,53 @@ void silk_quant_LTP_gains( cbk_gain_ptr_Q7 = silk_LTP_vq_gain_ptrs_Q7[ k ]; cbk_size = silk_LTP_vq_sizes[ k ]; - /* Set up pointers to first subframe */ - XX_Q17_ptr = XX_Q17; - xX_Q17_ptr = xX_Q17; + /* Set up pointer to first subframe */ + W_Q18_ptr = W_Q18; + b_Q14_ptr = B_Q14; - res_nrg_Q15 = 0; - rate_dist_Q7 = 0; + rate_dist_Q14 = 0; sum_log_gain_tmp_Q7 = *sum_log_gain_Q7; for( j = 0; j < nb_subfr; j++ ) { max_gain_Q7 = silk_log2lin( ( SILK_FIX_CONST( MAX_SUM_LOG_GAIN_DB / 6.0, 7 ) - sum_log_gain_tmp_Q7 ) + SILK_FIX_CONST( 7, 7 ) ) - gain_safety; + silk_VQ_WMat_EC( &temp_idx[ j ], /* O index of best codebook vector */ - &res_nrg_Q15_subfr, /* O residual energy */ - &rate_dist_Q7_subfr, /* O best weighted quantization error + mu * rate */ + &rate_dist_Q14_subfr, /* O best weighted quantization error + mu * rate */ &gain_Q7, /* O sum of absolute LTP coefficients */ - XX_Q17_ptr, /* I correlation matrix */ - xX_Q17_ptr, /* I correlation vector */ + b_Q14_ptr, /* I input vector to be quantized */ + W_Q18_ptr, /* I weighting matrix */ cbk_ptr_Q7, /* I codebook */ cbk_gain_ptr_Q7, /* I codebook effective gains */ cl_ptr_Q5, /* I code length for each codebook vector */ - subfr_len, /* I number of samples per subframe */ + mu_Q9, /* I tradeoff between weighted error and rate */ max_gain_Q7, /* I maximum sum of absolute LTP coefficients */ cbk_size, /* I number of vectors in codebook */ arch /* I Run-time architecture */ ); - res_nrg_Q15 = silk_ADD_POS_SAT32( res_nrg_Q15, res_nrg_Q15_subfr ); - rate_dist_Q7 = silk_ADD_POS_SAT32( rate_dist_Q7, rate_dist_Q7_subfr ); + rate_dist_Q14 = silk_ADD_POS_SAT32( rate_dist_Q14, rate_dist_Q14_subfr ); sum_log_gain_tmp_Q7 = silk_max(0, sum_log_gain_tmp_Q7 + silk_lin2log( gain_safety + gain_Q7 ) - SILK_FIX_CONST( 7, 7 )); - XX_Q17_ptr += LTP_ORDER * LTP_ORDER; - xX_Q17_ptr += LTP_ORDER; + b_Q14_ptr += LTP_ORDER; + W_Q18_ptr += LTP_ORDER * LTP_ORDER; } - if( rate_dist_Q7 <= min_rate_dist_Q7 ) { - min_rate_dist_Q7 = rate_dist_Q7; + /* Avoid never finding a codebook */ + rate_dist_Q14 = silk_min( silk_int32_MAX - 1, rate_dist_Q14 ); + + if( rate_dist_Q14 < min_rate_dist_Q14 ) { + min_rate_dist_Q14 = rate_dist_Q14; *periodicity_index = (opus_int8)k; silk_memcpy( cbk_index, temp_idx, nb_subfr * sizeof( opus_int8 ) ); best_sum_log_gain_Q7 = sum_log_gain_tmp_Q7; } + + /* Break early in low-complexity mode if rate distortion is below threshold */ + if( lowComplexity && ( rate_dist_Q14 < silk_LTP_gain_middle_avg_RD_Q14 ) ) { + break; + } } cbk_ptr_Q7 = silk_LTP_vq_ptrs_Q7[ *periodicity_index ]; @@ -120,13 +125,5 @@ void silk_quant_LTP_gains( B_Q14[ j * LTP_ORDER + k ] = silk_LSHIFT( cbk_ptr_Q7[ cbk_index[ j ] * LTP_ORDER + k ], 7 ); } } - - if( nb_subfr == 2 ) { - res_nrg_Q15 = silk_RSHIFT32( res_nrg_Q15, 1 ); - } else { - res_nrg_Q15 = silk_RSHIFT32( res_nrg_Q15, 2 ); - } - *sum_log_gain_Q7 = best_sum_log_gain_Q7; - *pred_gain_dB_Q7 = (opus_int)silk_SMULBB( -3, silk_lin2log( res_nrg_Q15 ) - ( 15 << 7 ) ); } diff --git a/thirdparty/opus/silk/resampler.c b/thirdparty/opus/silk/resampler.c index 1f11e50891..374fbb3722 100644 --- a/thirdparty/opus/silk/resampler.c +++ b/thirdparty/opus/silk/resampler.c @@ -91,14 +91,14 @@ opus_int silk_resampler_init( if( forEnc ) { if( ( Fs_Hz_in != 8000 && Fs_Hz_in != 12000 && Fs_Hz_in != 16000 && Fs_Hz_in != 24000 && Fs_Hz_in != 48000 ) || ( Fs_Hz_out != 8000 && Fs_Hz_out != 12000 && Fs_Hz_out != 16000 ) ) { - celt_assert( 0 ); + silk_assert( 0 ); return -1; } S->inputDelay = delay_matrix_enc[ rateID( Fs_Hz_in ) ][ rateID( Fs_Hz_out ) ]; } else { if( ( Fs_Hz_in != 8000 && Fs_Hz_in != 12000 && Fs_Hz_in != 16000 ) || ( Fs_Hz_out != 8000 && Fs_Hz_out != 12000 && Fs_Hz_out != 16000 && Fs_Hz_out != 24000 && Fs_Hz_out != 48000 ) ) { - celt_assert( 0 ); + silk_assert( 0 ); return -1; } S->inputDelay = delay_matrix_dec[ rateID( Fs_Hz_in ) ][ rateID( Fs_Hz_out ) ]; @@ -151,7 +151,7 @@ opus_int silk_resampler_init( S->Coefs = silk_Resampler_1_6_COEFS; } else { /* None available */ - celt_assert( 0 ); + silk_assert( 0 ); return -1; } } else { @@ -181,9 +181,9 @@ opus_int silk_resampler( opus_int nSamples; /* Need at least 1 ms of input data */ - celt_assert( inLen >= S->Fs_in_kHz ); + silk_assert( inLen >= S->Fs_in_kHz ); /* Delay can't exceed the 1 ms of buffering */ - celt_assert( S->inputDelay <= S->Fs_in_kHz ); + silk_assert( S->inputDelay <= S->Fs_in_kHz ); nSamples = S->Fs_in_kHz - S->inputDelay; diff --git a/thirdparty/opus/silk/resampler_down2.c b/thirdparty/opus/silk/resampler_down2.c index 971d7bfd4a..cec3634640 100644 --- a/thirdparty/opus/silk/resampler_down2.c +++ b/thirdparty/opus/silk/resampler_down2.c @@ -43,8 +43,8 @@ void silk_resampler_down2( opus_int32 k, len2 = silk_RSHIFT32( inLen, 1 ); opus_int32 in32, out32, Y, X; - celt_assert( silk_resampler_down2_0 > 0 ); - celt_assert( silk_resampler_down2_1 < 0 ); + silk_assert( silk_resampler_down2_0 > 0 ); + silk_assert( silk_resampler_down2_1 < 0 ); /* Internal variables and state are in Q10 format */ for( k = 0; k < len2; k++ ) { diff --git a/thirdparty/opus/silk/resampler_private_down_FIR.c b/thirdparty/opus/silk/resampler_private_down_FIR.c index 3e8735a35a..783e42b356 100644 --- a/thirdparty/opus/silk/resampler_private_down_FIR.c +++ b/thirdparty/opus/silk/resampler_private_down_FIR.c @@ -136,7 +136,7 @@ static OPUS_INLINE opus_int16 *silk_resampler_private_down_FIR_INTERPOL( } break; default: - celt_assert( 0 ); + silk_assert( 0 ); } return out; } diff --git a/thirdparty/opus/silk/sort.c b/thirdparty/opus/silk/sort.c index 4fba16f831..7187c9efb1 100644 --- a/thirdparty/opus/silk/sort.c +++ b/thirdparty/opus/silk/sort.c @@ -48,9 +48,9 @@ void silk_insertion_sort_increasing( opus_int i, j; /* Safety checks */ - celt_assert( K > 0 ); - celt_assert( L > 0 ); - celt_assert( L >= K ); + silk_assert( K > 0 ); + silk_assert( L > 0 ); + silk_assert( L >= K ); /* Write start indices in index vector */ for( i = 0; i < K; i++ ) { @@ -96,9 +96,9 @@ void silk_insertion_sort_decreasing_int16( opus_int value; /* Safety checks */ - celt_assert( K > 0 ); - celt_assert( L > 0 ); - celt_assert( L >= K ); + silk_assert( K > 0 ); + silk_assert( L > 0 ); + silk_assert( L >= K ); /* Write start indices in index vector */ for( i = 0; i < K; i++ ) { @@ -141,7 +141,7 @@ void silk_insertion_sort_increasing_all_values_int16( opus_int i, j; /* Safety checks */ - celt_assert( L > 0 ); + silk_assert( L > 0 ); /* Sort vector elements by value, increasing order */ for( i = 1; i < L; i++ ) { diff --git a/thirdparty/opus/silk/stereo_LR_to_MS.c b/thirdparty/opus/silk/stereo_LR_to_MS.c index c8226663c8..dda0298de2 100644 --- a/thirdparty/opus/silk/stereo_LR_to_MS.c +++ b/thirdparty/opus/silk/stereo_LR_to_MS.c @@ -109,7 +109,7 @@ void silk_stereo_LR_to_MS( if( total_rate_bps < 1 ) { total_rate_bps = 1; } - min_mid_rate_bps = silk_SMLABB( 2000, fs_kHz, 600 ); + min_mid_rate_bps = silk_SMLABB( 2000, fs_kHz, 900 ); silk_assert( min_mid_rate_bps < 32767 ); /* Default bitrate distribution: 8 parts for Mid and (5+3*frac) parts for Side. so: mid_rate = ( 8 / ( 13 + 3 * frac ) ) * total_ rate */ frac_3_Q16 = silk_MUL( 3, frac_Q16 ); diff --git a/thirdparty/opus/silk/stereo_encode_pred.c b/thirdparty/opus/silk/stereo_encode_pred.c index 03becb6736..e6dd195066 100644 --- a/thirdparty/opus/silk/stereo_encode_pred.c +++ b/thirdparty/opus/silk/stereo_encode_pred.c @@ -41,11 +41,11 @@ void silk_stereo_encode_pred( /* Entropy coding */ n = 5 * ix[ 0 ][ 2 ] + ix[ 1 ][ 2 ]; - celt_assert( n < 25 ); + silk_assert( n < 25 ); ec_enc_icdf( psRangeEnc, n, silk_stereo_pred_joint_iCDF, 8 ); for( n = 0; n < 2; n++ ) { - celt_assert( ix[ n ][ 0 ] < 3 ); - celt_assert( ix[ n ][ 1 ] < STEREO_QUANT_SUB_STEPS ); + silk_assert( ix[ n ][ 0 ] < 3 ); + silk_assert( ix[ n ][ 1 ] < STEREO_QUANT_SUB_STEPS ); ec_enc_icdf( psRangeEnc, ix[ n ][ 0 ], silk_uniform3_iCDF, 8 ); ec_enc_icdf( psRangeEnc, ix[ n ][ 1 ], silk_uniform5_iCDF, 8 ); } diff --git a/thirdparty/opus/silk/structs.h b/thirdparty/opus/silk/structs.h index 3380c757b2..827829dc6f 100644 --- a/thirdparty/opus/silk/structs.h +++ b/thirdparty/opus/silk/structs.h @@ -48,7 +48,6 @@ typedef struct { opus_int32 sLPC_Q14[ MAX_SUB_FRAME_LENGTH + NSQ_LPC_BUF_LENGTH ]; opus_int32 sAR2_Q14[ MAX_SHAPE_LPC_ORDER ]; opus_int32 sLF_AR_shp_Q14; - opus_int32 sDiff_shp_Q14; opus_int lagPrev; opus_int sLTP_buf_idx; opus_int sLTP_shp_buf_idx; @@ -78,7 +77,6 @@ typedef struct { opus_int32 In_LP_State[ 2 ]; /* Low pass filter state */ opus_int32 transition_frame_no; /* Counter which is mapped to a cut-off frequency */ opus_int mode; /* Operating mode, <0: switch down, >0: switch up; 0: do nothing */ - opus_int32 saved_fs_kHz; /* If non-zero, holds the last sampling rate before a bandwidth switching reset. */ } silk_LP_state; /* Structure containing NLSF codebook */ @@ -88,7 +86,6 @@ typedef struct { const opus_int16 quantStepSize_Q16; const opus_int16 invQuantStepSize_Q6; const opus_uint8 *CB1_NLSF_Q8; - const opus_int16 *CB1_Wght_Q9; const opus_uint8 *CB1_iCDF; const opus_uint8 *pred_Q8; const opus_uint8 *ec_sel; @@ -172,6 +169,8 @@ typedef struct { opus_int pitchEstimationComplexity; /* Complexity level for pitch estimator */ opus_int pitchEstimationLPCOrder; /* Whitening filter order for pitch estimator */ opus_int32 pitchEstimationThreshold_Q16; /* Threshold for pitch estimator */ + opus_int LTPQuantLowComplexity; /* Flag for low complexity LTP quantization */ + opus_int mu_LTP_Q9; /* Rate-distortion tradeoff in LTP quantization */ opus_int32 sum_log_gain_Q7; /* Cumulative max prediction gain */ opus_int NLSF_MSVQ_Survivors; /* Number of survivors in NLSF MSVQ */ opus_int first_frame_after_reset; /* Flag for deactivating NLSF interpolation, pitch prediction */ @@ -302,7 +301,6 @@ typedef struct { /* Stuff used for PLC */ opus_int lossCnt; opus_int prevSignalType; - int arch; silk_PLC_struct sPLC; diff --git a/thirdparty/opus/silk/sum_sqr_shift.c b/thirdparty/opus/silk/sum_sqr_shift.c index 4fd0c3d7d5..129df191d8 100644 --- a/thirdparty/opus/silk/sum_sqr_shift.c +++ b/thirdparty/opus/silk/sum_sqr_shift.c @@ -41,40 +41,43 @@ void silk_sum_sqr_shift( ) { opus_int i, shft; - opus_uint32 nrg_tmp; - opus_int32 nrg; + opus_int32 nrg_tmp, nrg; - /* Do a first run with the maximum shift we could have. */ - shft = 31-silk_CLZ32(len); - /* Let's be conservative with rounding and start with nrg=len. */ - nrg = len; - for( i = 0; i < len - 1; i += 2 ) { - nrg_tmp = silk_SMULBB( x[ i ], x[ i ] ); - nrg_tmp = silk_SMLABB_ovflw( nrg_tmp, x[ i + 1 ], x[ i + 1 ] ); - nrg = (opus_int32)silk_ADD_RSHIFT_uint( nrg, nrg_tmp, shft ); + nrg = 0; + shft = 0; + len--; + for( i = 0; i < len; i += 2 ) { + nrg = silk_SMLABB_ovflw( nrg, x[ i ], x[ i ] ); + nrg = silk_SMLABB_ovflw( nrg, x[ i + 1 ], x[ i + 1 ] ); + if( nrg < 0 ) { + /* Scale down */ + nrg = (opus_int32)silk_RSHIFT_uint( (opus_uint32)nrg, 2 ); + shft = 2; + i+=2; + break; + } } - if( i < len ) { - /* One sample left to process */ - nrg_tmp = silk_SMULBB( x[ i ], x[ i ] ); - nrg = (opus_int32)silk_ADD_RSHIFT_uint( nrg, nrg_tmp, shft ); - } - silk_assert( nrg >= 0 ); - /* Make sure the result will fit in a 32-bit signed integer with two bits - of headroom. */ - shft = silk_max_32(0, shft+3 - silk_CLZ32(nrg)); - nrg = 0; - for( i = 0 ; i < len - 1; i += 2 ) { + for( ; i < len; i += 2 ) { nrg_tmp = silk_SMULBB( x[ i ], x[ i ] ); nrg_tmp = silk_SMLABB_ovflw( nrg_tmp, x[ i + 1 ], x[ i + 1 ] ); - nrg = (opus_int32)silk_ADD_RSHIFT_uint( nrg, nrg_tmp, shft ); + nrg = (opus_int32)silk_ADD_RSHIFT_uint( nrg, (opus_uint32)nrg_tmp, shft ); + if( nrg < 0 ) { + /* Scale down */ + nrg = (opus_int32)silk_RSHIFT_uint( (opus_uint32)nrg, 2 ); + shft += 2; + } } - if( i < len ) { + if( i == len ) { /* One sample left to process */ nrg_tmp = silk_SMULBB( x[ i ], x[ i ] ); nrg = (opus_int32)silk_ADD_RSHIFT_uint( nrg, nrg_tmp, shft ); } - silk_assert( nrg >= 0 ); + /* Make sure to have at least one extra leading zero (two leading zeros in total) */ + if( nrg & 0xC0000000 ) { + nrg = silk_RSHIFT_uint( (opus_uint32)nrg, 2 ); + shft += 2; + } /* Output arguments */ *shift = shft; diff --git a/thirdparty/opus/silk/tables.h b/thirdparty/opus/silk/tables.h index 95230c451a..7fea6fda39 100644 --- a/thirdparty/opus/silk/tables.h +++ b/thirdparty/opus/silk/tables.h @@ -76,8 +76,10 @@ extern const opus_uint8 silk_NLSF_EXT_iCDF[ 7 ]; extern const opus_uint8 silk_LTP_per_index_iCDF[ 3 ]; /* 3 */ extern const opus_uint8 * const silk_LTP_gain_iCDF_ptrs[ NB_LTP_CBKS ]; /* 3 */ extern const opus_uint8 * const silk_LTP_gain_BITS_Q5_ptrs[ NB_LTP_CBKS ]; /* 3 */ +extern const opus_int16 silk_LTP_gain_middle_avg_RD_Q14; extern const opus_int8 * const silk_LTP_vq_ptrs_Q7[ NB_LTP_CBKS ]; /* 168 */ extern const opus_uint8 * const silk_LTP_vq_gain_ptrs_Q7[NB_LTP_CBKS]; + extern const opus_int8 silk_LTP_vq_sizes[ NB_LTP_CBKS ]; /* 3 */ extern const opus_uint8 silk_LTPscale_iCDF[ 3 ]; /* 4 */ @@ -97,6 +99,12 @@ extern const opus_uint8 silk_NLSF_interpolation_factor_iCDF[ 5 ]; extern const silk_NLSF_CB_struct silk_NLSF_CB_WB; /* 1040 */ extern const silk_NLSF_CB_struct silk_NLSF_CB_NB_MB; /* 728 */ +/* Piece-wise linear mapping from bitrate in kbps to coding quality in dB SNR */ +extern const opus_int32 silk_TargetRate_table_NB[ TARGET_RATE_TAB_SZ ]; /* 32 */ +extern const opus_int32 silk_TargetRate_table_MB[ TARGET_RATE_TAB_SZ ]; /* 32 */ +extern const opus_int32 silk_TargetRate_table_WB[ TARGET_RATE_TAB_SZ ]; /* 32 */ +extern const opus_int16 silk_SNR_table_Q1[ TARGET_RATE_TAB_SZ ]; /* 32 */ + /* Quantization offsets */ extern const opus_int16 silk_Quantization_Offsets_Q10[ 2 ][ 2 ]; /* 8 */ diff --git a/thirdparty/opus/silk/tables_LTP.c b/thirdparty/opus/silk/tables_LTP.c index 5e12c8643e..0e6a0254d5 100644 --- a/thirdparty/opus/silk/tables_LTP.c +++ b/thirdparty/opus/silk/tables_LTP.c @@ -51,6 +51,8 @@ static const opus_uint8 silk_LTP_gain_iCDF_2[32] = { 24, 20, 16, 12, 9, 5, 2, 0 }; +const opus_int16 silk_LTP_gain_middle_avg_RD_Q14 = 12304; + static const opus_uint8 silk_LTP_gain_BITS_Q5_0[8] = { 15, 131, 138, 138, 155, 155, 173, 173 }; diff --git a/thirdparty/opus/silk/tables_NLSF_CB_NB_MB.c b/thirdparty/opus/silk/tables_NLSF_CB_NB_MB.c index 195d5b95bd..8c59d207aa 100644 --- a/thirdparty/opus/silk/tables_NLSF_CB_NB_MB.c +++ b/thirdparty/opus/silk/tables_NLSF_CB_NB_MB.c @@ -74,41 +74,6 @@ static const opus_uint8 silk_NLSF_CB1_NB_MB_Q8[ 320 ] = { 64, 84, 104, 118, 156, 177, 201, 230 }; -static const opus_int16 silk_NLSF_CB1_Wght_Q9[ 320 ] = { - 2897, 2314, 2314, 2314, 2287, 2287, 2314, 2300, 2327, 2287, - 2888, 2580, 2394, 2367, 2314, 2274, 2274, 2274, 2274, 2194, - 2487, 2340, 2340, 2314, 2314, 2314, 2340, 2340, 2367, 2354, - 3216, 2766, 2340, 2340, 2314, 2274, 2221, 2207, 2261, 2194, - 2460, 2474, 2367, 2394, 2394, 2394, 2394, 2367, 2407, 2314, - 3479, 3056, 2127, 2207, 2274, 2274, 2274, 2287, 2314, 2261, - 3282, 3141, 2580, 2394, 2247, 2221, 2207, 2194, 2194, 2114, - 4096, 3845, 2221, 2620, 2620, 2407, 2314, 2394, 2367, 2074, - 3178, 3244, 2367, 2221, 2553, 2434, 2340, 2314, 2167, 2221, - 3338, 3488, 2726, 2194, 2261, 2460, 2354, 2367, 2207, 2101, - 2354, 2420, 2327, 2367, 2394, 2420, 2420, 2420, 2460, 2367, - 3779, 3629, 2434, 2527, 2367, 2274, 2274, 2300, 2207, 2048, - 3254, 3225, 2713, 2846, 2447, 2327, 2300, 2300, 2274, 2127, - 3263, 3300, 2753, 2806, 2447, 2261, 2261, 2247, 2127, 2101, - 2873, 2981, 2633, 2367, 2407, 2354, 2194, 2247, 2247, 2114, - 3225, 3197, 2633, 2580, 2274, 2181, 2247, 2221, 2221, 2141, - 3178, 3310, 2740, 2407, 2274, 2274, 2274, 2287, 2194, 2114, - 3141, 3272, 2460, 2061, 2287, 2500, 2367, 2487, 2434, 2181, - 3507, 3282, 2314, 2700, 2647, 2474, 2367, 2394, 2340, 2127, - 3423, 3535, 3038, 3056, 2300, 1950, 2221, 2274, 2274, 2274, - 3404, 3366, 2087, 2687, 2873, 2354, 2420, 2274, 2474, 2540, - 3760, 3488, 1950, 2660, 2897, 2527, 2394, 2367, 2460, 2261, - 3028, 3272, 2740, 2888, 2740, 2154, 2127, 2287, 2234, 2247, - 3695, 3657, 2025, 1969, 2660, 2700, 2580, 2500, 2327, 2367, - 3207, 3413, 2354, 2074, 2888, 2888, 2340, 2487, 2247, 2167, - 3338, 3366, 2846, 2780, 2327, 2154, 2274, 2287, 2114, 2061, - 2327, 2300, 2181, 2167, 2181, 2367, 2633, 2700, 2700, 2553, - 2407, 2434, 2221, 2261, 2221, 2221, 2340, 2420, 2607, 2700, - 3038, 3244, 2806, 2888, 2474, 2074, 2300, 2314, 2354, 2380, - 2221, 2154, 2127, 2287, 2500, 2793, 2793, 2620, 2580, 2367, - 3676, 3713, 2234, 1838, 2181, 2753, 2726, 2673, 2513, 2207, - 2793, 3160, 2726, 2553, 2846, 2513, 2181, 2394, 2221, 2181 -}; - static const opus_uint8 silk_NLSF_CB1_iCDF_NB_MB[ 64 ] = { 212, 178, 148, 129, 108, 96, 85, 82, 79, 77, 61, 59, 57, 56, 51, 49, @@ -185,7 +150,6 @@ const silk_NLSF_CB_struct silk_NLSF_CB_NB_MB = SILK_FIX_CONST( 0.18, 16 ), SILK_FIX_CONST( 1.0 / 0.18, 6 ), silk_NLSF_CB1_NB_MB_Q8, - silk_NLSF_CB1_Wght_Q9, silk_NLSF_CB1_iCDF_NB_MB, silk_NLSF_PRED_NB_MB_Q8, silk_NLSF_CB2_SELECT_NB_MB, diff --git a/thirdparty/opus/silk/tables_NLSF_CB_WB.c b/thirdparty/opus/silk/tables_NLSF_CB_WB.c index 5cc9f57bff..50af87eb2e 100644 --- a/thirdparty/opus/silk/tables_NLSF_CB_WB.c +++ b/thirdparty/opus/silk/tables_NLSF_CB_WB.c @@ -98,41 +98,6 @@ static const opus_uint8 silk_NLSF_CB1_WB_Q8[ 512 ] = { 110, 119, 129, 141, 175, 198, 218, 237 }; -static const opus_int16 silk_NLSF_CB1_WB_Wght_Q9[ 512 ] = { - 3657, 2925, 2925, 2925, 2925, 2925, 2925, 2925, 2925, 2925, 2925, 2925, 2963, 2963, 2925, 2846, - 3216, 3085, 2972, 3056, 3056, 3010, 3010, 3010, 2963, 2963, 3010, 2972, 2888, 2846, 2846, 2726, - 3920, 4014, 2981, 3207, 3207, 2934, 3056, 2846, 3122, 3244, 2925, 2846, 2620, 2553, 2780, 2925, - 3516, 3197, 3010, 3103, 3019, 2888, 2925, 2925, 2925, 2925, 2888, 2888, 2888, 2888, 2888, 2753, - 5054, 5054, 2934, 3573, 3385, 3056, 3085, 2793, 3160, 3160, 2972, 2846, 2513, 2540, 2753, 2888, - 4428, 4149, 2700, 2753, 2972, 3010, 2925, 2846, 2981, 3019, 2925, 2925, 2925, 2925, 2888, 2726, - 3620, 3019, 2972, 3056, 3056, 2873, 2806, 3056, 3216, 3047, 2981, 3291, 3291, 2981, 3310, 2991, - 5227, 5014, 2540, 3338, 3526, 3385, 3197, 3094, 3376, 2981, 2700, 2647, 2687, 2793, 2846, 2673, - 5081, 5174, 4615, 4428, 2460, 2897, 3047, 3207, 3169, 2687, 2740, 2888, 2846, 2793, 2846, 2700, - 3122, 2888, 2963, 2925, 2925, 2925, 2925, 2963, 2963, 2963, 2963, 2925, 2925, 2963, 2963, 2963, - 4202, 3207, 2981, 3103, 3010, 2888, 2888, 2925, 2972, 2873, 2916, 3019, 2972, 3010, 3197, 2873, - 3760, 3760, 3244, 3103, 2981, 2888, 2925, 2888, 2972, 2934, 2793, 2793, 2846, 2888, 2888, 2660, - 3854, 4014, 3207, 3122, 3244, 2934, 3047, 2963, 2963, 3085, 2846, 2793, 2793, 2793, 2793, 2580, - 3845, 4080, 3357, 3516, 3094, 2740, 3010, 2934, 3122, 3085, 2846, 2846, 2647, 2647, 2846, 2806, - 5147, 4894, 3225, 3845, 3441, 3169, 2897, 3413, 3451, 2700, 2580, 2673, 2740, 2846, 2806, 2753, - 4109, 3789, 3291, 3160, 2925, 2888, 2888, 2925, 2793, 2740, 2793, 2740, 2793, 2846, 2888, 2806, - 5081, 5054, 3047, 3545, 3244, 3056, 3085, 2944, 3103, 2897, 2740, 2740, 2740, 2846, 2793, 2620, - 4309, 4309, 2860, 2527, 3207, 3376, 3376, 3075, 3075, 3376, 3056, 2846, 2647, 2580, 2726, 2753, - 3056, 2916, 2806, 2888, 2740, 2687, 2897, 3103, 3150, 3150, 3216, 3169, 3056, 3010, 2963, 2846, - 4375, 3882, 2925, 2888, 2846, 2888, 2846, 2846, 2888, 2888, 2888, 2846, 2888, 2925, 2888, 2846, - 2981, 2916, 2916, 2981, 2981, 3056, 3122, 3216, 3150, 3056, 3010, 2972, 2972, 2972, 2925, 2740, - 4229, 4149, 3310, 3347, 2925, 2963, 2888, 2981, 2981, 2846, 2793, 2740, 2846, 2846, 2846, 2793, - 4080, 4014, 3103, 3010, 2925, 2925, 2925, 2888, 2925, 2925, 2846, 2846, 2846, 2793, 2888, 2780, - 4615, 4575, 3169, 3441, 3207, 2981, 2897, 3038, 3122, 2740, 2687, 2687, 2687, 2740, 2793, 2700, - 4149, 4269, 3789, 3657, 2726, 2780, 2888, 2888, 3010, 2972, 2925, 2846, 2687, 2687, 2793, 2888, - 4215, 3554, 2753, 2846, 2846, 2888, 2888, 2888, 2925, 2925, 2888, 2925, 2925, 2925, 2963, 2888, - 5174, 4921, 2261, 3432, 3789, 3479, 3347, 2846, 3310, 3479, 3150, 2897, 2460, 2487, 2753, 2925, - 3451, 3685, 3122, 3197, 3357, 3047, 3207, 3207, 2981, 3216, 3085, 2925, 2925, 2687, 2540, 2434, - 2981, 3010, 2793, 2793, 2740, 2793, 2846, 2972, 3056, 3103, 3150, 3150, 3150, 3103, 3010, 3010, - 2944, 2873, 2687, 2726, 2780, 3010, 3432, 3545, 3357, 3244, 3056, 3010, 2963, 2925, 2888, 2846, - 3019, 2944, 2897, 3010, 3010, 2972, 3019, 3103, 3056, 3056, 3010, 2888, 2846, 2925, 2925, 2888, - 3920, 3967, 3010, 3197, 3357, 3216, 3291, 3291, 3479, 3704, 3441, 2726, 2181, 2460, 2580, 2607 -}; - static const opus_uint8 silk_NLSF_CB1_iCDF_WB[ 64 ] = { 225, 204, 201, 184, 183, 175, 158, 154, 153, 135, 119, 115, 113, 110, 109, 99, @@ -223,7 +188,6 @@ const silk_NLSF_CB_struct silk_NLSF_CB_WB = SILK_FIX_CONST( 0.15, 16 ), SILK_FIX_CONST( 1.0 / 0.15, 6 ), silk_NLSF_CB1_WB_Q8, - silk_NLSF_CB1_WB_Wght_Q9, silk_NLSF_CB1_iCDF_WB, silk_NLSF_PRED_WB_Q8, silk_NLSF_CB2_SELECT_WB, diff --git a/thirdparty/opus/silk/tables_other.c b/thirdparty/opus/silk/tables_other.c index e34d90777b..398686bf26 100644 --- a/thirdparty/opus/silk/tables_other.c +++ b/thirdparty/opus/silk/tables_other.c @@ -38,6 +38,20 @@ extern "C" { #endif +/* Piece-wise linear mapping from bitrate in kbps to coding quality in dB SNR */ +const opus_int32 silk_TargetRate_table_NB[ TARGET_RATE_TAB_SZ ] = { + 0, 8000, 9400, 11500, 13500, 17500, 25000, MAX_TARGET_RATE_BPS +}; +const opus_int32 silk_TargetRate_table_MB[ TARGET_RATE_TAB_SZ ] = { + 0, 9000, 12000, 14500, 18500, 24500, 35500, MAX_TARGET_RATE_BPS +}; +const opus_int32 silk_TargetRate_table_WB[ TARGET_RATE_TAB_SZ ] = { + 0, 10500, 14000, 17000, 21500, 28500, 42000, MAX_TARGET_RATE_BPS +}; +const opus_int16 silk_SNR_table_Q1[ TARGET_RATE_TAB_SZ ] = { + 18, 29, 38, 40, 46, 52, 62, 84 +}; + /* Tables for stereo predictor coding */ const opus_int16 silk_stereo_pred_quant_Q13[ STEREO_QUANT_TAB_SIZE ] = { -13732, -10050, -8266, -7526, -6500, -5000, -2950, -820, diff --git a/thirdparty/opus/silk/tuning_parameters.h b/thirdparty/opus/silk/tuning_parameters.h index d70275fd8f..5b8f404235 100644 --- a/thirdparty/opus/silk/tuning_parameters.h +++ b/thirdparty/opus/silk/tuning_parameters.h @@ -53,12 +53,19 @@ extern "C" /* LPC analysis regularization */ #define FIND_LPC_COND_FAC 1e-5f +/* LTP analysis defines */ +#define FIND_LTP_COND_FAC 1e-5f +#define LTP_DAMPING 0.05f +#define LTP_SMOOTHING 0.1f + +/* LTP quantization settings */ +#define MU_LTP_QUANT_NB 0.03f +#define MU_LTP_QUANT_MB 0.025f +#define MU_LTP_QUANT_WB 0.02f + /* Max cumulative LTP gain */ #define MAX_SUM_LOG_GAIN_DB 250.0f -/* LTP analysis defines */ -#define LTP_CORR_INV_MAX 0.03f - /***********************/ /* High pass filtering */ /***********************/ @@ -96,16 +103,25 @@ extern "C" #define SPARSE_SNR_INCR_dB 2.0f /* threshold for sparseness measure above which to use lower quantization offset during unvoiced */ -#define ENERGY_VARIATION_THRESHOLD_QNT_OFFSET 0.6f +#define SPARSENESS_THRESHOLD_QNT_OFFSET 0.75f /* warping control */ #define WARPING_MULTIPLIER 0.015f /* fraction added to first autocorrelation value */ -#define SHAPE_WHITE_NOISE_FRACTION 3e-5f +#define SHAPE_WHITE_NOISE_FRACTION 5e-5f /* noise shaping filter chirp factor */ -#define BANDWIDTH_EXPANSION 0.94f +#define BANDWIDTH_EXPANSION 0.95f + +/* difference between chirp factors for analysis and synthesis noise shaping filters at low bitrates */ +#define LOW_RATE_BANDWIDTH_EXPANSION_DELTA 0.01f + +/* extra harmonic boosting (signal shaping) at low bitrates */ +#define LOW_RATE_HARMONIC_BOOST 0.1f + +/* extra harmonic boosting (signal shaping) for noisy input signals */ +#define LOW_INPUT_QUALITY_HARMONIC_BOOST 0.1f /* harmonic noise shaping */ #define HARMONIC_SHAPING 0.3f diff --git a/thirdparty/opus/silk/x86/NSQ_del_dec_sse4_1.c b/thirdparty/opus/silk/x86/NSQ_del_dec_sse.c index 2c75ede2dd..21d4a8bc1e 100644 --- a/thirdparty/opus/silk/x86/NSQ_del_dec_sse4_1.c +++ b/thirdparty/opus/silk/x86/NSQ_del_dec_sse.c @@ -107,12 +107,12 @@ static OPUS_INLINE void silk_noise_shape_quantizer_del_dec_sse4_1( opus_int predictLPCOrder, /* I Prediction filter order */ opus_int warping_Q16, /* I */ opus_int nStatesDelayedDecision, /* I Number of states in decision tree */ - opus_int *smpl_buf_idx, /* I/O Index to newest samples in buffers */ + opus_int *smpl_buf_idx, /* I Index to newest samples in buffers */ opus_int decisionDelay /* I */ ); void silk_NSQ_del_dec_sse4_1( - const silk_encoder_state *psEncC, /* I Encoder State */ + const silk_encoder_state *psEncC, /* I/O Encoder State */ silk_nsq_state *NSQ, /* I/O NSQ state */ SideInfoIndices *psIndices, /* I/O Quantization Indices */ const opus_int32 x_Q3[], /* I Prefiltered input signal */ @@ -234,8 +234,7 @@ void silk_NSQ_del_dec_sse4_1( psDD = &psDelDec[ Winner_ind ]; last_smple_idx = smpl_buf_idx + decisionDelay; for( i = 0; i < decisionDelay; i++ ) { - last_smple_idx = ( last_smple_idx - 1 ) % DECISION_DELAY; - if( last_smple_idx < 0 ) last_smple_idx += DECISION_DELAY; + last_smple_idx = ( last_smple_idx - 1 ) & DECISION_DELAY_MASK; pulses[ i - decisionDelay ] = (opus_int8)silk_RSHIFT_ROUND( psDD->Q_Q10[ last_smple_idx ], 10 ); pxq[ i - decisionDelay ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( silk_SMULWW( psDD->Xq_Q14[ last_smple_idx ], Gains_Q16[ 1 ] ), 14 ) ); @@ -247,7 +246,7 @@ void silk_NSQ_del_dec_sse4_1( /* Rewhiten with new A coefs */ start_idx = psEncC->ltp_mem_length - lag - psEncC->predictLPCOrder - LTP_ORDER / 2; - celt_assert( start_idx > 0 ); + silk_assert( start_idx > 0 ); silk_LPC_analysis_filter( &sLTP[ start_idx ], &NSQ->xq[ start_idx + k * psEncC->subfr_length ], A_Q12, psEncC->ltp_mem_length - start_idx, psEncC->predictLPCOrder, psEncC->arch ); @@ -286,8 +285,7 @@ void silk_NSQ_del_dec_sse4_1( last_smple_idx = smpl_buf_idx + decisionDelay; Gain_Q10 = silk_RSHIFT32( Gains_Q16[ psEncC->nb_subfr - 1 ], 6 ); for( i = 0; i < decisionDelay; i++ ) { - last_smple_idx = ( last_smple_idx - 1 ) % DECISION_DELAY; - if( last_smple_idx < 0 ) last_smple_idx += DECISION_DELAY; + last_smple_idx = ( last_smple_idx - 1 ) & DECISION_DELAY_MASK; pulses[ i - decisionDelay ] = (opus_int8)silk_RSHIFT_ROUND( psDD->Q_Q10[ last_smple_idx ], 10 ); pxq[ i - decisionDelay ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( silk_SMULWW( psDD->Xq_Q14[ last_smple_idx ], Gain_Q10 ), 8 ) ); @@ -301,6 +299,7 @@ void silk_NSQ_del_dec_sse4_1( NSQ->lagPrev = pitchL[ psEncC->nb_subfr - 1 ]; /* Save quantized speech signal */ + /* DEBUG_STORE_DATA( enc.pcm, &NSQ->xq[psEncC->ltp_mem_length], psEncC->frame_length * sizeof( opus_int16 ) ) */ silk_memmove( NSQ->xq, &NSQ->xq[ psEncC->frame_length ], psEncC->ltp_mem_length * sizeof( opus_int16 ) ); silk_memmove( NSQ->sLTP_shp_Q14, &NSQ->sLTP_shp_Q14[ psEncC->frame_length ], psEncC->ltp_mem_length * sizeof( opus_int32 ) ); RESTORE_STACK; @@ -334,7 +333,7 @@ static OPUS_INLINE void silk_noise_shape_quantizer_del_dec_sse4_1( opus_int predictLPCOrder, /* I Prediction filter order */ opus_int warping_Q16, /* I */ opus_int nStatesDelayedDecision, /* I Number of states in decision tree */ - opus_int *smpl_buf_idx, /* I/O Index to newest samples in buffers */ + opus_int *smpl_buf_idx, /* I Index to newest samples in buffers */ opus_int decisionDelay /* I */ ) { @@ -353,7 +352,7 @@ static OPUS_INLINE void silk_noise_shape_quantizer_del_dec_sse4_1( __m128i b_Q12_0123, b_sr_Q12_0123; SAVE_STACK; - celt_assert( nStatesDelayedDecision > 0 ); + silk_assert( nStatesDelayedDecision > 0 ); ALLOC( psSampleState, nStatesDelayedDecision, NSQ_sample_pair ); shp_lag_ptr = &NSQ->sLTP_shp_Q14[ NSQ->sLTP_shp_buf_idx - lag + HARM_SHAPE_FIR_TAPS / 2 ]; @@ -639,9 +638,8 @@ static OPUS_INLINE void silk_noise_shape_quantizer_del_dec_sse4_1( psSS[ 1 ].xq_Q14 = xq_Q14; } } - *smpl_buf_idx = ( *smpl_buf_idx - 1 ) % DECISION_DELAY; - if( *smpl_buf_idx < 0 ) *smpl_buf_idx += DECISION_DELAY; - last_smple_idx = ( *smpl_buf_idx + decisionDelay ) % DECISION_DELAY; + *smpl_buf_idx = ( *smpl_buf_idx - 1 ) & DECISION_DELAY_MASK; /* Index to newest samples */ + last_smple_idx = ( *smpl_buf_idx + decisionDelay ) & DECISION_DELAY_MASK; /* Index to decisionDelay old samples */ /* Find winner */ RDmin_Q10 = psSampleState[ 0 ][ 0 ].RD_Q10; diff --git a/thirdparty/opus/silk/x86/NSQ_sse4_1.c b/thirdparty/opus/silk/x86/NSQ_sse.c index b0315e35fc..bb3c5f1955 100644 --- a/thirdparty/opus/silk/x86/NSQ_sse4_1.c +++ b/thirdparty/opus/silk/x86/NSQ_sse.c @@ -71,7 +71,7 @@ static OPUS_INLINE void silk_noise_shape_quantizer_10_16_sse4_1( ); void silk_NSQ_sse4_1( - const silk_encoder_state *psEncC, /* I Encoder State */ + const silk_encoder_state *psEncC, /* I/O Encoder State */ silk_nsq_state *NSQ, /* I/O NSQ state */ SideInfoIndices *psIndices, /* I/O Quantization Indices */ const opus_int32 x_Q3[], /* I Prefiltered input signal */ @@ -199,7 +199,7 @@ void silk_NSQ_sse4_1( if( ( k & ( 3 - silk_LSHIFT( LSF_interpolation_flag, 1 ) ) ) == 0 ) { /* Rewhiten with new A coefs */ start_idx = psEncC->ltp_mem_length - lag - psEncC->predictLPCOrder - LTP_ORDER / 2; - celt_assert( start_idx > 0 ); + silk_assert( start_idx > 0 ); silk_LPC_analysis_filter( &sLTP[ start_idx ], &NSQ->xq[ start_idx + k * psEncC->subfr_length ], A_Q12, psEncC->ltp_mem_length - start_idx, psEncC->predictLPCOrder, psEncC->arch ); @@ -233,6 +233,7 @@ void silk_NSQ_sse4_1( NSQ->lagPrev = pitchL[ psEncC->nb_subfr - 1 ]; /* Save quantized speech and noise shaping signals */ + /* DEBUG_STORE_DATA( enc.pcm, &NSQ->xq[ psEncC->ltp_mem_length ], psEncC->frame_length * sizeof( opus_int16 ) ) */ silk_memmove( NSQ->xq, &NSQ->xq[ psEncC->frame_length ], psEncC->ltp_mem_length * sizeof( opus_int16 ) ); silk_memmove( NSQ->sLTP_shp_Q14, &NSQ->sLTP_shp_Q14[ psEncC->frame_length ], psEncC->ltp_mem_length * sizeof( opus_int32 ) ); RESTORE_STACK; diff --git a/thirdparty/opus/silk/x86/VAD_sse4_1.c b/thirdparty/opus/silk/x86/VAD_sse.c index d02ddf4ad0..4e90f4410d 100644 --- a/thirdparty/opus/silk/x86/VAD_sse4_1.c +++ b/thirdparty/opus/silk/x86/VAD_sse.c @@ -65,9 +65,9 @@ opus_int silk_VAD_GetSA_Q8_sse4_1( /* O Return value, 0 if s /* Safety checks */ silk_assert( VAD_N_BANDS == 4 ); - celt_assert( MAX_FRAME_LENGTH >= psEncC->frame_length ); - celt_assert( psEncC->frame_length <= 512 ); - celt_assert( psEncC->frame_length == 8 * silk_RSHIFT( psEncC->frame_length, 3 ) ); + silk_assert( MAX_FRAME_LENGTH >= psEncC->frame_length ); + silk_assert( psEncC->frame_length <= 512 ); + silk_assert( psEncC->frame_length == 8 * silk_RSHIFT( psEncC->frame_length, 3 ) ); /***********************/ /* Filter and Decimate */ diff --git a/thirdparty/opus/silk/x86/VQ_WMat_EC_sse4_1.c b/thirdparty/opus/silk/x86/VQ_WMat_EC_sse.c index 74d6c6d0ec..74d6c6d0ec 100644 --- a/thirdparty/opus/silk/x86/VQ_WMat_EC_sse4_1.c +++ b/thirdparty/opus/silk/x86/VQ_WMat_EC_sse.c diff --git a/thirdparty/opus/silk/x86/main_sse.h b/thirdparty/opus/silk/x86/main_sse.h index 2f15d44869..d8d61310ed 100644 --- a/thirdparty/opus/silk/x86/main_sse.h +++ b/thirdparty/opus/silk/x86/main_sse.h @@ -34,7 +34,6 @@ # if defined(OPUS_X86_MAY_HAVE_SSE4_1) -#if 0 /* FIXME: SSE disabled until silk_VQ_WMat_EC_sse4_1() gets updated. */ # define OVERRIDE_silk_VQ_WMat_EC void silk_VQ_WMat_EC_sse4_1( @@ -80,13 +79,11 @@ extern void (*const SILK_VQ_WMAT_EC_IMPL[OPUS_ARCHMASK + 1])( mu_Q9, max_gain_Q7, L)) #endif -#endif -#if 0 /* FIXME: SSE disabled until the NSQ code gets updated. */ # define OVERRIDE_silk_NSQ void silk_NSQ_sse4_1( - const silk_encoder_state *psEncC, /* I Encoder State */ + const silk_encoder_state *psEncC, /* I/O Encoder State */ silk_nsq_state *NSQ, /* I/O NSQ state */ SideInfoIndices *psIndices, /* I/O Quantization Indices */ const opus_int32 x_Q3[], /* I Prefiltered input signal */ @@ -113,7 +110,7 @@ void silk_NSQ_sse4_1( #else extern void (*const SILK_NSQ_IMPL[OPUS_ARCHMASK + 1])( - const silk_encoder_state *psEncC, /* I Encoder State */ + const silk_encoder_state *psEncC, /* I/O Encoder State */ silk_nsq_state *NSQ, /* I/O NSQ state */ SideInfoIndices *psIndices, /* I/O Quantization Indices */ const opus_int32 x_Q3[], /* I Prefiltered input signal */ @@ -140,7 +137,7 @@ extern void (*const SILK_NSQ_IMPL[OPUS_ARCHMASK + 1])( # define OVERRIDE_silk_NSQ_del_dec void silk_NSQ_del_dec_sse4_1( - const silk_encoder_state *psEncC, /* I Encoder State */ + const silk_encoder_state *psEncC, /* I/O Encoder State */ silk_nsq_state *NSQ, /* I/O NSQ state */ SideInfoIndices *psIndices, /* I/O Quantization Indices */ const opus_int32 x_Q3[], /* I Prefiltered input signal */ @@ -167,7 +164,7 @@ void silk_NSQ_del_dec_sse4_1( #else extern void (*const SILK_NSQ_DEL_DEC_IMPL[OPUS_ARCHMASK + 1])( - const silk_encoder_state *psEncC, /* I Encoder State */ + const silk_encoder_state *psEncC, /* I/O Encoder State */ silk_nsq_state *NSQ, /* I/O NSQ state */ SideInfoIndices *psIndices, /* I/O Quantization Indices */ const opus_int32 x_Q3[], /* I Prefiltered input signal */ @@ -190,7 +187,6 @@ extern void (*const SILK_NSQ_DEL_DEC_IMPL[OPUS_ARCHMASK + 1])( HarmShapeGain_Q14, Tilt_Q14, LF_shp_Q14, Gains_Q16, pitchL, Lambda_Q10, LTP_scale_Q14)) #endif -#endif void silk_noise_shape_quantizer( silk_nsq_state *NSQ, /* I/O NSQ state */ @@ -242,6 +238,39 @@ extern opus_int (*const SILK_VAD_GETSA_Q8_IMPL[OPUS_ARCHMASK + 1])( silk_encoder_state *psEnC, const opus_int16 pIn[]); +# define OVERRIDE_silk_warped_LPC_analysis_filter_FIX + +#endif + +void silk_warped_LPC_analysis_filter_FIX_sse4_1( + opus_int32 state[], /* I/O State [order + 1] */ + opus_int32 res_Q2[], /* O Residual signal [length] */ + const opus_int16 coef_Q13[], /* I Coefficients [order] */ + const opus_int16 input[], /* I Input signal [length] */ + const opus_int16 lambda_Q16, /* I Warping factor */ + const opus_int length, /* I Length of input signal */ + const opus_int order /* I Filter order (even) */ +); + +#if defined(OPUS_X86_PRESUME_SSE4_1) +#define silk_warped_LPC_analysis_filter_FIX(state, res_Q2, coef_Q13, input, lambda_Q16, length, order, arch) \ + ((void)(arch),silk_warped_LPC_analysis_filter_FIX_c(state, res_Q2, coef_Q13, input, lambda_Q16, length, order)) + +#else + +extern void (*const SILK_WARPED_LPC_ANALYSIS_FILTER_FIX_IMPL[OPUS_ARCHMASK + 1])( + opus_int32 state[], /* I/O State [order + 1] */ + opus_int32 res_Q2[], /* O Residual signal [length] */ + const opus_int16 coef_Q13[], /* I Coefficients [order] */ + const opus_int16 input[], /* I Input signal [length] */ + const opus_int16 lambda_Q16, /* I Warping factor */ + const opus_int length, /* I Length of input signal */ + const opus_int order /* I Filter order (even) */ +); + +# define silk_warped_LPC_analysis_filter_FIX(state, res_Q2, coef_Q13, input, lambda_Q16, length, order, arch) \ + ((*SILK_WARPED_LPC_ANALYSIS_FILTER_FIX_IMPL[(arch) & OPUS_ARCHMASK])(state, res_Q2, coef_Q13, input, lambda_Q16, length, order)) + #endif # endif diff --git a/thirdparty/opus/silk/x86/x86_silk_map.c b/thirdparty/opus/silk/x86/x86_silk_map.c index 32dcc3cab7..818841f2c1 100644 --- a/thirdparty/opus/silk/x86/x86_silk_map.c +++ b/thirdparty/opus/silk/x86/x86_silk_map.c @@ -66,9 +66,8 @@ opus_int (*const SILK_VAD_GETSA_Q8_IMPL[ OPUS_ARCHMASK + 1 ] )( MAY_HAVE_SSE4_1( silk_VAD_GetSA_Q8 ) /* avx */ }; -#if 0 /* FIXME: SSE disabled until the NSQ code gets updated. */ void (*const SILK_NSQ_IMPL[ OPUS_ARCHMASK + 1 ] )( - const silk_encoder_state *psEncC, /* I Encoder State */ + const silk_encoder_state *psEncC, /* I/O Encoder State */ silk_nsq_state *NSQ, /* I/O NSQ state */ SideInfoIndices *psIndices, /* I/O Quantization Indices */ const opus_int32 x_Q3[], /* I Prefiltered input signal */ @@ -90,9 +89,7 @@ void (*const SILK_NSQ_IMPL[ OPUS_ARCHMASK + 1 ] )( MAY_HAVE_SSE4_1( silk_NSQ ), /* sse4.1 */ MAY_HAVE_SSE4_1( silk_NSQ ) /* avx */ }; -#endif -#if 0 /* FIXME: SSE disabled until silk_VQ_WMat_EC_sse4_1() gets updated. */ void (*const SILK_VQ_WMAT_EC_IMPL[ OPUS_ARCHMASK + 1 ] )( opus_int8 *ind, /* O index of best codebook vector */ opus_int32 *rate_dist_Q14, /* O best weighted quant error + mu * rate */ @@ -112,11 +109,9 @@ void (*const SILK_VQ_WMAT_EC_IMPL[ OPUS_ARCHMASK + 1 ] )( MAY_HAVE_SSE4_1( silk_VQ_WMat_EC ), /* sse4.1 */ MAY_HAVE_SSE4_1( silk_VQ_WMat_EC ) /* avx */ }; -#endif -#if 0 /* FIXME: SSE disabled until the NSQ code gets updated. */ void (*const SILK_NSQ_DEL_DEC_IMPL[ OPUS_ARCHMASK + 1 ] )( - const silk_encoder_state *psEncC, /* I Encoder State */ + const silk_encoder_state *psEncC, /* I/O Encoder State */ silk_nsq_state *NSQ, /* I/O NSQ state */ SideInfoIndices *psIndices, /* I/O Quantization Indices */ const opus_int32 x_Q3[], /* I Prefiltered input signal */ @@ -138,10 +133,25 @@ void (*const SILK_NSQ_DEL_DEC_IMPL[ OPUS_ARCHMASK + 1 ] )( MAY_HAVE_SSE4_1( silk_NSQ_del_dec ), /* sse4.1 */ MAY_HAVE_SSE4_1( silk_NSQ_del_dec ) /* avx */ }; -#endif #if defined(FIXED_POINT) +void (*const SILK_WARPED_LPC_ANALYSIS_FILTER_FIX_IMPL[ OPUS_ARCHMASK + 1 ] )( + opus_int32 state[], /* I/O State [order + 1] */ + opus_int32 res_Q2[], /* O Residual signal [length] */ + const opus_int16 coef_Q13[], /* I Coefficients [order] */ + const opus_int16 input[], /* I Input signal [length] */ + const opus_int16 lambda_Q16, /* I Warping factor */ + const opus_int length, /* I Length of input signal */ + const opus_int order /* I Filter order (even) */ +) = { + silk_warped_LPC_analysis_filter_FIX_c, /* non-sse */ + silk_warped_LPC_analysis_filter_FIX_c, + silk_warped_LPC_analysis_filter_FIX_c, + MAY_HAVE_SSE4_1( silk_warped_LPC_analysis_filter_FIX ), /* sse4.1 */ + MAY_HAVE_SSE4_1( silk_warped_LPC_analysis_filter_FIX ) /* avx */ +}; + void (*const SILK_BURG_MODIFIED_IMPL[ OPUS_ARCHMASK + 1 ] )( opus_int32 *res_nrg, /* O Residual energy */ opus_int *res_nrg_Q, /* O Residual energy Q value */ diff --git a/thirdparty/opus/stream.c b/thirdparty/opus/stream.c index 6a85197a66..0238a6b31b 100644 --- a/thirdparty/opus/stream.c +++ b/thirdparty/opus/stream.c @@ -235,7 +235,8 @@ void *op_fopen(OpusFileCallbacks *_cb,const char *_path,const char *_mode){ fp=fopen(_path,_mode); #else fp=NULL; - { + if(_path==NULL||_mode==NULL)errno=EINVAL; + else{ wchar_t *wpath; wchar_t *wmode; wpath=op_utf8_to_utf16(_path); @@ -265,7 +266,8 @@ void *op_freopen(OpusFileCallbacks *_cb,const char *_path,const char *_mode, fp=freopen(_path,_mode,(FILE *)_stream); #else fp=NULL; - { + if(_path==NULL||_mode==NULL)errno=EINVAL; + else{ wchar_t *wpath; wchar_t *wmode; wpath=op_utf8_to_utf16(_path); |