1
0
mirror of https://github.com/vector-im/riotX-android synced 2025-10-06 00:02:48 +02:00

Compare commits

...

680 Commits

Author SHA1 Message Date
ericdecanini
92492c95c1 Fixes errors and gets first test passing 2022-07-19 15:44:29 +02:00
ericdecanini
ed8212a8c0 Post cherry pick fix 2022-07-19 15:44:24 +02:00
ericdecanini
427f53dce7 Post cherry pick fix 2022-07-19 15:43:15 +02:00
ericdecanini
91008785cb Fixes errors and gets first test passing 2022-07-08 11:56:00 +01:00
ericdecanini
c8e33532f7 Refactors AppStateHandler into interface implementation pattern 2022-07-08 10:05:05 +01:00
ericdecanini
8ef89958b3 Improves formatting in AppStateHandler 2022-07-07 16:59:38 +01:00
ericdecanini
067c485e4f Merge remote-tracking branch 'origin/develop' into feature/nfe/legacy_group_removal
# Conflicts:
#	vector/src/main/java/im/vector/app/features/grouplist/GroupSummaryItem.kt
#	vector/src/main/java/im/vector/app/features/home/HomeDetailViewModel.kt
#	vector/src/main/java/im/vector/app/features/home/room/list/RoomListSectionBuilderSpace.kt
2022-07-07 15:44:42 +01:00
Adam Brown
8a68b31f1b Merge branch '1.4.27-RC2' into develop 2022-07-07 11:29:49 +01:00
Benoit Marty
1659ca001d Merge pull request #6491 from vector-im/dependabot/gradle/flipper-0.153.0
Bump flipper from 0.152.0 to 0.153.0
2022-07-07 12:28:10 +02:00
Adam Brown
7f1bcacd97 Merge branch 'hotfix/v1.4.27' into develop 2022-07-07 11:26:59 +01:00
Adam Brown
67d5289f01 Merge pull request #6462 from vector-im/feature/fga/fix_6461
Timeline: fix validation of timeline event changes
2022-07-07 11:25:33 +01:00
Adam Brown
3e770f9efa Merge pull request #6474 from vector-im/feature/fga/fix_6463
Fix crashes when opening Thread (#6463)
2022-07-07 11:12:28 +01:00
Adam Brown
4126e6418b Merge pull request #6469 from vector-im/feature/bma/fix_crash_on_DefaultBackgroundDetectionObserver
Fix ConcurrentModificationException on BackgroundDetectionObserver
2022-07-07 10:58:26 +01:00
ganfra
8abae6f917 Use executeTransactionAwait (need realm refresh in this case) 2022-07-07 09:40:54 +01:00
dependabot[bot]
7c3257942c Bump flipper from 0.152.0 to 0.153.0
Bumps `flipper` from 0.152.0 to 0.153.0.

Updates `flipper` from 0.152.0 to 0.153.0
- [Release notes](https://github.com/facebook/flipper/releases)
- [Commits](https://github.com/facebook/flipper/compare/v0.152.0...v0.153.0)

Updates `flipper-network-plugin` from 0.152.0 to 0.153.0
- [Release notes](https://github.com/facebook/flipper/releases)
- [Commits](https://github.com/facebook/flipper/compare/v0.152.0...v0.153.0)

---
updated-dependencies:
- dependency-name: com.facebook.flipper:flipper
  dependency-type: direct:production
  update-type: version-update:semver-minor
- dependency-name: com.facebook.flipper:flipper-network-plugin
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-07-06 23:05:35 +00:00
ganfra
19fc97ba0f Use executeTransactionAwait (need realm refresh in this case) 2022-07-06 19:33:34 +02:00
Adam Brown
2cbb5306f9 generating 1.4.27 changelog and updating version 2022-07-06 16:11:11 +01:00
Adam Brown
310c4b4a24 Fixing crash when sharing plain text, such as a url 2022-07-06 15:20:43 +01:00
ganfra
6f74f28561 Fix crashes when opening Thread (#6463) 2022-07-06 15:19:40 +01:00
ganfra
6b8bbf2574 Timeline: fix validation of timeline event changes 2022-07-06 15:19:26 +01:00
Benoit Marty
41a3a07bf6 Fix ConcurrentModificationException on BackgroundDetectionObserver 2022-07-06 15:18:52 +01:00
Benoit Marty
09f158e85d Merge pull request #6468 from vector-im/bmarty-patch-1
Fix typo
2022-07-06 15:52:11 +02:00
Adam Brown
89348995c2 Merge pull request #6467 from vector-im/feature/adm/share-text-crash
Crash - Sharing text
2022-07-06 11:24:56 +01:00
Benoit Marty
7616912411 Merge pull request #6436 from vector-im/feature/bma/activity_fragment_1_5_0
Upgrade androidx activity and fragment to 1.5.0
2022-07-06 11:44:22 +02:00
ganfra
0743140973 Fix crashes when opening Thread (#6463) 2022-07-05 17:00:01 +02:00
Benoit Marty
d957e24747 Merge pull request #6458 from vector-im/feature/bma/android_services
Rename Android Service to use `AndroidService` suffix
2022-07-05 14:07:36 +02:00
Adam Brown
03202080b3 suppressing unused string resource 2022-07-05 11:17:10 +01:00
Benoit Marty
b68e01cda4 Changelog 2022-07-05 12:11:50 +02:00
Benoit Marty
b847d8cf36 Fix ConcurrentModificationException on BackgroundDetectionObserver 2022-07-05 12:06:49 +02:00
Benoit Marty
16c6cdf108 Fix typo 2022-07-05 11:45:01 +02:00
Adam Brown
3c092c4e2a adding changelog entry 2022-07-05 10:37:41 +01:00
Benoit Marty
4f19034a94 Exclude AndroidService from coverage metrics. 2022-07-05 11:17:40 +02:00
ganfra
f58ba13ef0 Timeline: fix validation of timeline event changes 2022-07-05 10:41:22 +02:00
Benoit Marty
a51d626fe8 Changelog 2022-07-05 09:40:27 +02:00
Benoit Marty
35325db407 Merge pull request #6456 from vector-im/bmarty-patch-1
Fix copy paste issue
2022-07-05 09:39:11 +02:00
Benoit Marty
f0c8c3fd63 Rename Android Service to use AndroidService suffix to limit confusion with our Matrix SDK Services 2022-07-04 21:39:01 +02:00
Benoit Marty
293a177148 Quick rework, better to search for expected MenuItem 2022-07-04 21:27:28 +02:00
Benoit Marty
3e42cec4ec Fix detekt issue. 2022-07-04 21:15:38 +02:00
Benoit Marty
57f42ed0f5 Fix copy paste issue 2022-07-04 21:10:51 +02:00
Adam Brown
2c444527bd Merge pull request #6447 from cloudrac3r/fix-html-entities
Fix HTML entities being displayed in messages
2022-07-04 17:31:34 +01:00
Adam Brown
dd397b9a48 splitting the share intent handling from the attachments helper
- decouples the attachment callback
2022-07-04 17:14:49 +01:00
Benoit Marty
d43c802c90 Changelog 2022-07-04 17:48:35 +02:00
Benoit Marty
1355178fee Fix compilation issue for Fragment 2022-07-04 17:42:58 +02:00
Benoit Marty
81505d3802 Menu: extract management to a common interface / Migrate Fragments 2022-07-04 17:30:06 +02:00
Adam Brown
8811f752e5 converting if/else to when 2022-07-04 16:15:01 +01:00
Benoit Marty
be099dcae0 Menu: extract management to a common interface / Migrate Activities 2022-07-04 17:10:12 +02:00
Adam Brown
abf35d730d Merge pull request #6157 from vector-im/feature/adm/ftue-msisdn-confirmation
[FTUE] MSISDN / Phone number confirmation
2022-07-04 11:29:39 +01:00
Maxime NATUREL
f3e7d0daff Merge pull request #6431 from vector-im/fix/mna/closed-poll-visible-votes
[Poll] - Wrong votes in closed poll after removing 2 previous polls (PSG-590)
2022-07-04 11:33:26 +02:00
Maxime NATUREL
906fe8be76 Merge pull request #6425 from vector-im/fix/mna/undisclosed-poll-description
[Poll] - Add a description under undisclosed poll when not ended (PSB-134)
2022-07-04 11:20:59 +02:00
Adam Brown
2a36dc8ee5 using confirmation copy for the confirmation code entry field 2022-07-04 09:44:45 +01:00
Benoit Marty
941c2a792f Merge pull request #6409 from vector-im/dependabot/gradle/com.google.gms-google-services-4.3.13
Bump google-services from 4.3.10 to 4.3.13
2022-07-04 10:24:26 +02:00
Adam Brown
daecd7d43a returning the error result directly from the when 2022-07-04 09:21:15 +01:00
Maxime NATUREL
26aaf84806 Renaming field to votesStatus 2022-07-04 10:14:15 +02:00
Benoit Marty
cadd5c050b Merge pull request #6450 from cloudrac3r/fix-attach-gallery
Gallery picker can pick external images (not just videos)
2022-07-04 09:44:50 +02:00
Cadence Ember
b8734a23a9 Gallery picker can pick external images 2022-07-04 16:42:43 +12:00
Cadence Ember
a53ad39e1a Add comments for the EventHtmlRenderer file 2022-07-04 01:07:38 +12:00
Cadence Ember
84bb11c1bf Fix HTML entities being displayed in messages
Initially reported in #6445. Fixes #6445.
This was a regression from #6357.

The fix is to enable Markwon's HTML entities processor.
2022-07-04 01:07:14 +12:00
Benoit Marty
93b7e1094c Merge pull request #6434 from vector-im/feature/bca/check_serialized_frozen
Simple check to prevent frozen class modificaiton
2022-07-01 18:01:08 +02:00
Benoit Marty
f7a0615105 Fix warning on onMultiWindowModeChanged method overriding. 2022-07-01 17:35:01 +02:00
Valere
8dc57fe2f0 Merge pull request #5853 from vector-im/feature/aris/crypto_share_room_keys_past_messages
Share Megolm session keys when inviting a new user
2022-07-01 17:33:43 +02:00
Benoit Marty
397614121c Fix warning on onPictureInPictureModeChanged method overriding. 2022-07-01 17:30:48 +02:00
Benoit Marty
944b447d93 Fix regression when closing the screen to create a DM from the toolbar. Rework this part a bit. 2022-07-01 17:06:02 +02:00
Benoit Marty
aae6e20f9c Migration to activity 1.5.0. Rework menu management 2022-07-01 17:06:02 +02:00
Eric Decanini
bdb49f5946 Merge pull request #5398 from vector-im/bugfix/eric/softlogout-ux-broken
Fixes broken SoftLogout UX for homeservers that support both Password and SSO
2022-07-01 15:52:48 +01:00
Valere
d281f9dde5 use XXX not TODO 2022-07-01 16:07:03 +02:00
Maxime NATUREL
d5b375e82b Merge pull request #6414 from vector-im/feature/mna/reply-to-lls
[Location sharing] - Reply action on a live message (PSG-343)
2022-07-01 16:03:02 +02:00
Valere
6fd99dc302 resist ConnectivityManager$TooManyRequestsException 2022-07-01 15:56:03 +02:00
Valere
90a4e71b06 update flacky test 2022-07-01 14:30:21 +02:00
Maxime NATUREL
f5e33ca980 Fix unit tests 2022-07-01 14:27:10 +02:00
Adam Brown
82feda476d removing unused imports 2022-07-01 13:18:09 +01:00
Adam Brown
5e9e65e10f using clear error on change extension 2022-07-01 13:05:26 +01:00
Adam Brown
be3d419290 adding phone number confirmation resending 2022-07-01 12:14:34 +01:00
Adam Brown
e6e079a071 adding barebone phone confirmation fragment, copied from the phone number input 2022-07-01 12:14:02 +01:00
Adam Brown
e326188aa8 Merge pull request #6108 from vector-im/feature/adm/ftue-msisdn-entry
FTUE - Msisdn (phone number) entry
2022-07-01 12:07:57 +01:00
Adam Brown
bfa50f186a formatting 2022-07-01 11:14:25 +01:00
Adam Brown
f2db4be479 fixing formatting/unused imports 2022-07-01 11:14:25 +01:00
Adam Brown
0bbc74b193 injects the phonenumberutil and adds testcases around the parsing 2022-07-01 11:14:25 +01:00
Adam Brown
27b1bc9e66 handling msisdn 401 errors as success within the registration wizard delegate 2022-07-01 11:14:25 +01:00
Adam Brown
7617309058 hooking up, styling and applying copy to the phone number fragment 2022-07-01 11:14:24 +01:00
Adam Brown
a8b73f0cf9 applying autofill hints for phonenumber and email entry 2022-07-01 11:13:57 +01:00
Adam Brown
df6ebcacd1 adding msisdn fragment and layout, copied from email input 2022-07-01 11:12:45 +01:00
Valere
a92fae6d25 add change log 2022-07-01 12:00:26 +02:00
Benoit Marty
1297ccd45c Fix first compilation errors 2022-07-01 11:58:01 +02:00
Valere
28ca03cc67 Simple check to prevent frozen class modificaiton 2022-07-01 11:54:30 +02:00
Benoit Marty
c6a89c738a Merge pull request #6419 from vector-im/dependabot/gradle/androidx.activity-activity-1.5.0
Bump activity from 1.4.0 to 1.5.0
2022-07-01 11:47:49 +02:00
Benoit Marty
529898d9fa Merge pull request #6420 from vector-im/dependabot/gradle/fragment-1.5.0
Bump fragment from 1.4.1 to 1.5.0
2022-07-01 11:47:18 +02:00
Benoit Marty
9a2beb5017 Merge pull request #6416 from vector-im/dependabot/gradle/flipper-0.152.0
Bump flipper from 0.151.1 to 0.152.0
2022-07-01 11:43:53 +02:00
Valere
08cb6de83d Fix migration 2022-07-01 11:08:35 +02:00
Valere
fb5f0cbd00 Fix test compilation 2022-07-01 09:43:17 +02:00
Valere
e7322e8524 outdated configuration 2022-07-01 09:43:17 +02:00
Valere
5a67c39c7f reuse code for test 2022-07-01 09:43:17 +02:00
Valere
a885ff5e47 Fix test 2022-07-01 09:43:17 +02:00
Valere
b0907de582 Fix migration 2022-07-01 09:43:17 +02:00
Valere
ddd82441bd kdoc 2022-07-01 09:43:17 +02:00
Valere
8e829c6aad Add lab flag and more tests 2022-07-01 09:43:17 +02:00
Valere
d9fb58fbcb Fix tests 2022-07-01 09:42:31 +02:00
Valere
f64adeba7f fix bad sender key export 2022-07-01 09:42:31 +02:00
Valere
34145f0374 post rebase fix 2022-07-01 09:42:31 +02:00
ariskotsomitopoulos
df241dbdb8 Fix broken unit test 2022-07-01 09:42:31 +02:00
ariskotsomitopoulos
010cf540b6 Fix broken unit test 2022-07-01 09:42:31 +02:00
ariskotsomitopoulos
55fdff4242 Resolve merge conflicts 2022-07-01 09:42:31 +02:00
ariskotsomitopoulos
d3a516b05d Enhance key sharing to respect matrix configuration 2022-07-01 09:42:31 +02:00
ariskotsomitopoulos
a9a7400fef Add MXCryptoConfig flag for key history sharing
Add shared_history flag to sessionBackupData
2022-07-01 09:42:31 +02:00
Valere
fb352ffa38 quick format 2022-07-01 09:42:31 +02:00
Valere
d8d808d0b4 removed deprecated annotation, CI don't like 2022-07-01 09:42:31 +02:00
Valere
8c26592d46 cleaning 2022-07-01 09:42:31 +02:00
Valere
9b8e45ebfe share keys for history take2 2022-07-01 09:42:31 +02:00
Valere
93aac8faea post rebase fix 2022-07-01 09:42:31 +02:00
ariskotsomitopoulos
2e88998b05 Add integration tests for shared keys rotation on room history visibility change 2022-07-01 09:42:31 +02:00
ariskotsomitopoulos
3a5b737639 Fix existing E2eeSanityTests to support changes for key history sharing 2022-07-01 09:42:31 +02:00
ariskotsomitopoulos
28dd507a74 Add crypto shared history sanity test 2022-07-01 09:42:31 +02:00
ariskotsomitopoulos
96f0d52753 Update copyright 2022-07-01 09:42:31 +02:00
ariskotsomitopoulos
45c80de333 Add changelog 2022-07-01 09:42:31 +02:00
ariskotsomitopoulos
243463adbc Add logs 2022-07-01 09:42:31 +02:00
ariskotsomitopoulos
395d48f946 Refactor code structure and improve naming 2022-07-01 09:42:31 +02:00
ariskotsomitopoulos
497f7cf044 Rotate our session when there is a room history visibility change since the last outboundSession 2022-07-01 09:42:31 +02:00
ariskotsomitopoulos
d6358dcb16 Prevent injecting a forged encrypted message and using session_id/sender_key of another room. 2022-07-01 09:42:31 +02:00
ariskotsomitopoulos
28a3ae264c Remove sharedHistory from OlmInboundGroupSessionWrapper2 while there are migration issues, and use only the equivalent DB entity value 2022-07-01 09:42:31 +02:00
ariskotsomitopoulos
dd3928f075 Remove sendSharedHistoryKeys while we will only share latest messages 2022-07-01 09:42:31 +02:00
ariskotsomitopoulos
b3bfd05ecb - Share only the first chunk of inbound sessions instead of the whole key history
- Download keys if the user is unknown (first invite)
2022-07-01 09:42:31 +02:00
ariskotsomitopoulos
e861edd544 Implement history key sharing functionality with respect to room visibility settings 2022-07-01 09:42:31 +02:00
ariskotsomitopoulos
6e57aeb9e5 Add roomId in InboundSessionEntity for better performance
Add shared history flag to InboundSessionEntity
2022-07-01 09:42:31 +02:00
ariskotsomitopoulos
98b55457b5 Add sendSharedHistoryKeys in crypto service 2022-07-01 09:42:31 +02:00
ariskotsomitopoulos
34713d5023 Add sharing existing inbound sessions functionality on new room invites 2022-07-01 09:42:31 +02:00
Benoit Marty
e2a55fb6f6 Merge pull request #4364 from vector-im/yostyle/open_url_on_browser_task
Open URL on external browser task
2022-06-30 22:36:26 +02:00
Benoit Marty
c77ecc6a21 Merge pull request #6288 from deepbluev7/nico/stable-aliases
Use stable endpoint for alias management
2022-06-30 22:30:14 +02:00
Benoit Marty
58580f1e6a Merge pull request #6413 from vector-im/feature/bma/room_member_loading
Show a loader if all the Room Member are not yet loaded.
2022-06-30 17:13:50 +02:00
Benoit Marty
fbbd6b1a90 Remove unused import 2022-06-30 17:13:13 +02:00
Benoit Marty
98a7f7df4d Merge pull request #6429 from vector-im/feature/bma/fragile_data
Add `android:hasFragileUserData="true"` in the manifest
2022-06-30 17:11:27 +02:00
ganfra
6d1dd089f0 Update versions 2022-06-30 16:58:51 +02:00
ganfra
415b0d4820 Merge branch 'release/v1.4.26' into develop 2022-06-30 16:55:52 +02:00
Adam Brown
72c4af0026 Merge pull request #6263 from vector-im/feature/adm/ftue-forgot-password
[FTUE] Forgot password
2022-06-30 15:40:09 +01:00
ganfra
fcc1838aed Merge branch 'release/v1.4.26' into main 2022-06-30 16:40:06 +02:00
ganfra
a9d704f273 Update CHANGES 2022-06-30 16:35:37 +02:00
Adam Brown
054c0435a8 Merge pull request #6130 from vector-im/dependabot/gradle/io.realm-realm-gradle-plugin-10.11.0
Bump realm-gradle-plugin from 10.9.0 to 10.11.0
2022-06-30 15:00:21 +01:00
Adam Brown
ea71a8b5c2 Merge pull request #6415 from vector-im/feature/adm/replacing-epoxy-layout-id
Replacing epoxy item annotation layout references with getDefaultLayoutId
2022-06-30 14:58:46 +01:00
Benoit Marty
90e851a4bc Merge pull request #6392 from vector-im/feature/bma/safe_clearWith
Ensure clearWith lambda is deleting all the list item
2022-06-30 15:46:53 +02:00
ganfra
2b629f130f Merge pull request #6428 from vector-im/feature/fga/fix_weblate
Feature/fga/fix weblate
2022-06-30 15:18:10 +02:00
Maxime NATUREL
18efa84e3a Adding changelog entry 2022-06-30 14:58:32 +02:00
Maxime NATUREL
a8d43538f1 Explicitely hiding votes when disclosed poll 2022-06-30 14:51:07 +02:00
Benoit Marty
e53dd1e1a1 Improve readability. 2022-06-30 14:50:20 +02:00
ganfra
88346ffc68 Weblate: also clean trads 2022-06-30 14:36:52 +02:00
Benoit Marty
6608264d15 Merge pull request #6424 from vector-im/feature/bma/release_recipe
Replace 5 manual steps to 1 command line step
2022-06-30 14:24:14 +02:00
Benoit Marty
0c98a2f81f Changelog 2022-06-30 14:20:45 +02:00
Benoit Marty
2118eaea90 Format file 2022-06-30 14:19:20 +02:00
Benoit Marty
52b07021a7 Add android:hasFragileUserData="true" to the manifest. See details in #2352 2022-06-30 14:19:04 +02:00
ganfra
4bdde101b8 Clean the TODO delete (UnusedResource not compatible with string template) 2022-06-30 12:26:51 +02:00
ganfra
6f38f9c2e6 Merge pull request #6427 from RiotTranslateBot/weblate-element-android-element-app
Translations update from Weblate
2022-06-30 11:55:32 +02:00
Adam Brown
0d084648a3 showing a toast on password reset confirmation 2022-06-30 10:44:06 +01:00
Weblate
53a8098caa Merge branch 'origin/develop' into Weblate. 2022-06-30 09:34:40 +00:00
Adam Brown
d0e5b3eb21 lifting duplicated event_base layout to the base class, with the option for children to override 2022-06-30 09:46:20 +01:00
Adam Brown
a815ac996b using vector model for consistency 2022-06-30 09:45:56 +01:00
Benoit Marty
1556e5d078 Replace 5 manual steps to 1 command line step 2022-06-30 10:23:34 +02:00
Maxime NATUREL
55bb6fa21a Adding changelog entry 2022-06-30 10:13:41 +02:00
Maxime NATUREL
9fb19af39c Adding a description under undisclosed poll when not yet ended 2022-06-30 10:13:41 +02:00
Benoit Marty
8da88f9263 Merge pull request #6417 from vector-im/dependabot/gradle/com.googlecode.libphonenumber-libphonenumber-8.12.51
Bump libphonenumber from 8.12.50 to 8.12.51
2022-06-30 09:07:47 +02:00
ganfra
778269f831 Merge pull request #6410 from vector-im/feature/fga/load_room_members_by_chunk
Feature/fga/load room members by chunk
2022-06-30 08:56:43 +02:00
dependabot[bot]
356718dc9a Bump fragment from 1.4.1 to 1.5.0
Bumps `fragment` from 1.4.1 to 1.5.0.

Updates `fragment-ktx` from 1.4.1 to 1.5.0

Updates `fragment-testing` from 1.4.1 to 1.5.0

---
updated-dependencies:
- dependency-name: androidx.fragment:fragment-ktx
  dependency-type: direct:production
  update-type: version-update:semver-minor
- dependency-name: androidx.fragment:fragment-testing
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-06-29 23:11:02 +00:00
dependabot[bot]
62a20ba69d Bump activity from 1.4.0 to 1.5.0
Bumps activity from 1.4.0 to 1.5.0.

---
updated-dependencies:
- dependency-name: androidx.activity:activity
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-06-29 23:10:20 +00:00
dependabot[bot]
5a02bca442 Bump libphonenumber from 8.12.50 to 8.12.51
Bumps [libphonenumber](https://github.com/google/libphonenumber) from 8.12.50 to 8.12.51.
- [Release notes](https://github.com/google/libphonenumber/releases)
- [Changelog](https://github.com/google/libphonenumber/blob/master/making-metadata-changes.md)
- [Commits](https://github.com/google/libphonenumber/compare/v8.12.50...v8.12.51)

---
updated-dependencies:
- dependency-name: com.googlecode.libphonenumber:libphonenumber
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-06-29 23:09:57 +00:00
dependabot[bot]
85504162a5 Bump flipper from 0.151.1 to 0.152.0
Bumps `flipper` from 0.151.1 to 0.152.0.

Updates `flipper` from 0.151.1 to 0.152.0
- [Release notes](https://github.com/facebook/flipper/releases)
- [Commits](https://github.com/facebook/flipper/compare/v0.151.1...v0.152.0)

Updates `flipper-network-plugin` from 0.151.1 to 0.152.0
- [Release notes](https://github.com/facebook/flipper/releases)
- [Commits](https://github.com/facebook/flipper/compare/v0.151.1...v0.152.0)

---
updated-dependencies:
- dependency-name: com.facebook.flipper:flipper
  dependency-type: direct:production
  update-type: version-update:semver-minor
- dependency-name: com.facebook.flipper:flipper-network-plugin
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-06-29 23:09:50 +00:00
random
a903a19d2d Translated using Weblate (Italian)
Currently translated at 100.0% (64 of 64 strings)

Translation: Element Android/Element Android Store
Translate-URL: https://translate.element.io/projects/element-android/element-store/it/
2022-06-29 19:32:22 +00:00
LinAGKar
fb2505fcfe Translated using Weblate (Swedish)
Currently translated at 100.0% (64 of 64 strings)

Translation: Element Android/Element Android Store
Translate-URL: https://translate.element.io/projects/element-android/element-store/sv/
2022-06-29 19:32:21 +00:00
LinAGKar
fabb345107 Translated using Weblate (Swedish)
Currently translated at 100.0% (2239 of 2239 strings)

Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/sv/
2022-06-29 19:32:19 +00:00
Nui Harime
45cb013e1a Translated using Weblate (Russian)
Currently translated at 99.7% (2233 of 2239 strings)

Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/ru/
2022-06-29 19:32:19 +00:00
ganfra
b446ceded8 LoadRoomMember: fix presence 2022-06-29 19:01:23 +02:00
Adam Brown
c603b780cf extracting common breaker background selection to ftue extensions 2022-06-29 17:47:28 +01:00
Adam Brown
7df7df7541 removing unused imports 2022-06-29 17:40:25 +01:00
Adam Brown
85264401cc adding changelog entry 2022-06-29 17:35:45 +01:00
Adam Brown
d2fbe26182 removing no longer needed butterknife dependency 2022-06-29 17:22:57 +01:00
Adam Brown
33ca5753f1 replacing epoxy item annotation layout references with getDefaultLayoutId override 2022-06-29 17:21:05 +01:00
ericdecanini
4cf97d48c9 Merge remote-tracking branch 'origin/develop' into bugfix/eric/softlogout-ux-broken
# Conflicts:
#	matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/DefaultAuthenticationService.kt
#	matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/registration/DefaultRegistrationWizard.kt
#	vector/src/main/java/im/vector/app/features/login/LoginActivity.kt
#	vector/src/main/java/im/vector/app/features/signout/soft/SoftLogoutController.kt
2022-06-29 15:53:22 +02:00
Benoit Marty
e75070be91 Use a DataSrouce instead of a Task and return a non Optional Boolean. 2022-06-29 15:35:00 +02:00
Adam Brown
1361852721 triggering an initial enabled state when using associateContentStateWith and extracts the resetting of errors on content change to an extension 2022-06-29 14:15:39 +01:00
Benoit Marty
a0025bc99b Update after PR review. 2022-06-29 15:05:26 +02:00
Maxime NATUREL
f5d3bcbb94 Sending a reply to a live location share 2022-06-29 15:04:57 +02:00
Maxime NATUREL
0a0eb08de9 Adding changelog entry 2022-06-29 15:04:57 +02:00
Maxime NATUREL
65b949071a Introducing a use case to check if a message can have reply action 2022-06-29 15:04:57 +02:00
Adam Brown
7c0d340bd0 formatting 2022-06-29 13:39:36 +01:00
Adam Brown
80ec0aaf05 removing new password isEnabled check using the isEmail validator, this check is wrong but also not needed due to associateContentStateWith above 2022-06-29 13:39:17 +01:00
Adam Brown
382a936e0a fixing method call grouping 2022-06-29 13:35:02 +01:00
Onuray Sahin
abea68557b Merge pull request #6350 from vector-im/feature/ons/promote_live_location_labs_flag
Promote live location labs flag [PSF-959]
2022-06-29 15:26:39 +03:00
Benoit Marty
f278e2884a Fix detekt issue. 2022-06-29 14:18:36 +02:00
Benoit Marty
ce718d9370 Merge pull request #6408 from vector-im/dependabot/gradle/com.facebook.soloader-soloader-0.10.4
Bump soloader from 0.10.3 to 0.10.4
2022-06-29 13:20:40 +02:00
Benoit Marty
7c4df42aa8 changelog 2022-06-29 12:24:10 +02:00
Benoit Marty
e91be2b599 Show a loader if all the Room Member are not yet loaded. 2022-06-29 12:19:17 +02:00
ganfra
1a33f6e094 Merge branch 'develop' into feature/fga/load_room_members_by_chunk 2022-06-29 11:45:52 +02:00
ganfra
7d349bdfc3 Cleanup 2022-06-29 11:38:15 +02:00
ganfra
9233007d97 LoadRoomMembers: add changelog 2022-06-29 11:37:15 +02:00
ganfra
61c5bbc444 LoadRoomMembers: handle room member event a bit more efficiently 2022-06-29 11:35:31 +02:00
ganfra
63f0cce561 LoadRoomMembers: exclude Membership.Leave 2022-06-29 11:34:43 +02:00
ganfra
3a216759a1 LoadRoomMembers: divide by chunk 2022-06-29 11:32:38 +02:00
dependabot[bot]
bbe3613aa6 Bump soloader from 0.10.3 to 0.10.4
Bumps [soloader](https://github.com/facebook/soloader) from 0.10.3 to 0.10.4.
- [Release notes](https://github.com/facebook/soloader/releases)
- [Commits](https://github.com/facebook/soloader/compare/v0.10.3...v0.10.4)

---
updated-dependencies:
- dependency-name: com.facebook.soloader:soloader
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-06-29 08:33:21 +00:00
Benoit Marty
2a32a780cf Merge pull request #6399 from vector-im/feature/bma/flipper_version
Avoid multiple PR from Dependabot when Flipper is upgraded.
2022-06-29 10:32:24 +02:00
Benoit Marty
ec65267750 Merge pull request #6403 from vector-im/feature/bma/ci_no_daemon
Try no daemon on CI
2022-06-29 10:32:05 +02:00
Maxime NATUREL
e7a68907f9 Merge pull request #6365 from vector-im/feature/mna/start-lls-from-other-device
[Location sharing] - Stop any active live before starting a new one (PSF-942)
2022-06-29 09:47:26 +02:00
Maxime NATUREL
d112f860a2 Merge pull request #6356 from vector-im/fix/mna/stop-lls-from-other-device
[Location sharing] - Make stop of a live from another device possible (PSF-1060)
2022-06-29 09:45:44 +02:00
dependabot[bot]
93559aee63 Bump google-services from 4.3.10 to 4.3.13
Bumps google-services from 4.3.10 to 4.3.13.

---
updated-dependencies:
- dependency-name: com.google.gms:google-services
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-06-28 23:07:28 +00:00
Adam Brown
1a986e7437 Merge pull request #6385 from vector-im/dependabot/gradle/com.autonomousapps.dependency-analysis-1.9.0
Bump com.autonomousapps.dependency-analysis from 1.8.0 to 1.9.0
2022-06-28 19:16:25 +01:00
Florian Renaud
69488642f8 Merge pull request #6352 from vector-im/dependabot/gradle/org.jetbrains.dokka-dokka-gradle-plugin-1.7.0
Bump dokka-gradle-plugin from 1.6.21 to 1.7.0
2022-06-28 18:13:52 +02:00
Onuray Sahin
3ec8c77d17 Code review fix. 2022-06-28 17:12:52 +03:00
Benoit Marty
6fda2cc7b3 Merge pull request #6101 from chagai95/native-lookup-fixes
Native lookup fixes
2022-06-28 15:43:35 +02:00
Benoit Marty
e44c9aa126 Try no using the gradle daemon on CI 2022-06-28 15:36:07 +02:00
Benoit Marty
dc63d41c97 Harmonize values of CI_GRADLE_ARG_PROPERTIES 2022-06-28 15:35:04 +02:00
Nui Harime
9941281107 Added translation using Weblate (Rusyn) 2022-06-28 13:31:32 +00:00
Adam Brown
f17129b660 removing unused dependencies and marking soloader and ignored from dependency check (as it's dynamic) 2022-06-28 14:05:01 +01:00
Maxime NATUREL
7b0878daf9 Remove non necessary prefix in logs 2022-06-28 14:49:35 +02:00
Maxime NATUREL
ca7b469d28 Adding changelog entry 2022-06-28 14:36:38 +02:00
Maxime NATUREL
324b3cc68c Updating the unit tests 2022-06-28 14:36:38 +02:00
Maxime NATUREL
c2c58f81d8 Stopping existing active live when starting a new one 2022-06-28 14:36:36 +02:00
Benoit Marty
667db71fb9 Avoid multiple PR from Dependabot when Flipper is upgraded. 2022-06-28 14:27:55 +02:00
Benoit Marty
80b94821a0 Merge pull request #6387 from vector-im/dependabot/gradle/com.facebook.flipper-flipper-network-plugin-0.151.1
Bump flipper-network-plugin from 0.150.0 to 0.151.1
2022-06-28 14:21:59 +02:00
Benoit Marty
87c650bcba Merge pull request #6386 from vector-im/dependabot/gradle/com.facebook.flipper-flipper-0.151.1
Bump flipper from 0.150.0 to 0.151.1
2022-06-28 14:21:36 +02:00
Benoit Marty
c50c9b9ae8 Merge pull request #6396 from vector-im/feature/manu/pr-optional-2nd-review
Update the PR process doc to come back to one reviewer
2022-06-28 14:20:52 +02:00
Maxime NATUREL
70996655e1 Change context inside the get live summary use case 2022-06-28 14:15:41 +02:00
Maxime NATUREL
8476fba5ff Use a TestDispatcher in the FakeSession 2022-06-28 14:15:00 +02:00
Valere
a2aa0471c5 Merge pull request #6328 from vector-im/feature/bca/verif_resist_no_age
Feature/bca/verif resist no age
2022-06-28 14:13:37 +02:00
Onuray Sahin
2fe03a0016 Code review fixes. 2022-06-28 15:06:42 +03:00
Maxime NATUREL
5b3711b634 Mutualizing mock of asFlow extension 2022-06-28 14:04:50 +02:00
Onuray Sahin
320915e0a1 Code review fixes. 2022-06-28 14:52:01 +03:00
manuroe
65b634fe95 Update the PR process doc to come back to one reviewer
with optional additional reviewers
2022-06-28 12:32:01 +02:00
Benoit Marty
98df2d82db Changelog 2022-06-28 12:03:34 +02:00
Benoit Marty
9866bfefed Ensure clearWith lambda is deleting all the list item, else we will get an infinite loop. This specific error will help to figure out what is happening. 2022-06-28 11:56:41 +02:00
Valere
82e68472dc code review update 2022-06-28 11:28:06 +02:00
Benoit Marty
69920a6e46 Split long line 2022-06-28 09:26:29 +02:00
Maxime NATUREL
af3718d202 Merge pull request #6376 from vector-im/fix/mna/geo-uri-pattern
[Location Share] - Adding missing prefix "u=" for uncertainty in geo URI (PSF-945)
2022-06-28 09:24:55 +02:00
dependabot[bot]
0e463875f9 Bump flipper-network-plugin from 0.150.0 to 0.151.1
Bumps [flipper-network-plugin](https://github.com/facebook/flipper) from 0.150.0 to 0.151.1.
- [Release notes](https://github.com/facebook/flipper/releases)
- [Commits](https://github.com/facebook/flipper/compare/v0.150.0...v0.151.1)

---
updated-dependencies:
- dependency-name: com.facebook.flipper:flipper-network-plugin
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-06-27 23:12:39 +00:00
dependabot[bot]
a8c1214417 Bump flipper from 0.150.0 to 0.151.1
Bumps [flipper](https://github.com/facebook/flipper) from 0.150.0 to 0.151.1.
- [Release notes](https://github.com/facebook/flipper/releases)
- [Commits](https://github.com/facebook/flipper/compare/v0.150.0...v0.151.1)

---
updated-dependencies:
- dependency-name: com.facebook.flipper:flipper
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-06-27 23:11:59 +00:00
dependabot[bot]
a82ddf5d5c Bump com.autonomousapps.dependency-analysis from 1.8.0 to 1.9.0
Bumps com.autonomousapps.dependency-analysis from 1.8.0 to 1.9.0.

---
updated-dependencies:
- dependency-name: com.autonomousapps.dependency-analysis
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-06-27 23:11:43 +00:00
Benoit Marty
a398391908 Merge pull request #6366 from vector-im/feature/ons/poll_view_state_unit_tests
Poll view state unit tests [PSF-1130]
2022-06-27 19:59:13 +02:00
Adam Brown
2a46fbe77c ignoring negative margin required by the checkbox alignment 2022-06-27 17:54:45 +01:00
Benoit Marty
1f34d368a2 Merge branch 'hotfix/1.4.25' into main 2022-06-27 18:03:45 +02:00
Benoit Marty
8679ba9a38 Merge branch 'hotfix/1.4.25' into develop 2022-06-27 18:03:44 +02:00
Benoit Marty
2f8aeb991e Merge hotfix 1.4.25 to develop 2022-06-27 18:03:22 +02:00
Benoit Marty
e0b378e2be Delete all the chunks in one step. 2022-06-27 17:37:04 +02:00
Onuray Sahin
863cc7e0fc Code review fix. 2022-06-27 18:37:03 +03:00
Maxime NATUREL
1df71d31e2 Small improvements in tests 2022-06-27 17:27:27 +02:00
Benoit Marty
d17152cbe2 Delete all the timelineEvents 2022-06-27 17:23:30 +02:00
Maxime NATUREL
5fa3b3f168 Fix pseudo code in comments 2022-06-27 17:18:28 +02:00
Maxime NATUREL
4c3f6db55c Fix code quality issues 2022-06-27 16:39:46 +02:00
Adam Brown
ef4889a1b3 fixing missing fake given 2022-06-27 15:19:29 +01:00
Maxime NATUREL
0488ce822f Updating location tracker tests 2022-06-27 16:13:02 +02:00
Benoit Marty
43f4dae62b Bump android-embedded_fcm_distributor from 2.0.0 to 2.1.1 (#6331)
* Bump android-embedded_fcm_distributor from 2.0.0 to 2.1.1

Bumps [android-embedded_fcm_distributor](https://github.com/UnifiedPush/android-embedded_fcm_distributor) from 2.0.0 to 2.1.1.
- [Release notes](https://github.com/UnifiedPush/android-embedded_fcm_distributor/releases)
- [Commits](https://github.com/UnifiedPush/android-embedded_fcm_distributor/compare/2.0.0...2.1.1)

---
updated-dependencies:
- dependency-name: com.github.UnifiedPush:android-embedded_fcm_distributor
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Fix compilation issue

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Benoit Marty <benoit@matrix.org>
2022-06-27 15:51:53 +02:00
Maxime NATUREL
3b09323ee4 Avoid stopping location service twice 2022-06-27 15:10:54 +02:00
Maxime NATUREL
353a8a70eb Using SharedFlow instead of callback for location updates to remove the need of synchronization 2022-06-27 15:07:09 +02:00
Benoit Marty
78a6e2354f Update CHANGES.md 2022-06-27 15:04:36 +02:00
Benoit Marty
95969253b5 Prepare hotfix 1.4.25 2022-06-27 14:50:05 +02:00
Benoit Marty
c9a28c1cf1 Fix migration issue. We had an infinite migration, since clearWith wait for the list to be empty. 2022-06-27 14:50:05 +02:00
Onuray Sahin
30115fa2b9 Code review fixes. 2022-06-27 15:43:21 +03:00
Onuray Sahin
8100a2e674 Remove duplicated unit tests. 2022-06-27 15:19:26 +03:00
Adam Brown
5bb397f35e using next instead of done copy when confirming reset email link 2022-06-27 13:08:32 +01:00
Adam Brown
0a0c322963 adding extra padding between reset button and checkbox to match designs 2022-06-27 13:08:32 +01:00
Adam Brown
7971a74614 fixing code quality warnings 2022-06-27 13:08:32 +01:00
Adam Brown
71d1024fe9 adding changelog entry 2022-06-27 13:08:32 +01:00
Adam Brown
eb84072a05 updating test names to read better 2022-06-27 13:08:32 +01:00
Adam Brown
f40f838a9f making the new password visibility toggleable 2022-06-27 13:08:32 +01:00
Adam Brown
1d3b4e9829 formatting 2022-06-27 13:08:31 +01:00
Adam Brown
0d80bdfd41 updating xml ids to reflect their context 2022-06-27 13:06:43 +01:00
Adam Brown
16481df0f7 handling the reset password completion step within the view model and emitting view events to move the flow forwards 2022-06-27 13:06:42 +01:00
Onuray Sahin
4f9b361346 Fix ready poll unit test. 2022-06-27 15:06:08 +03:00
Adam Brown
47cedfb522 hiding the reset password input by default 2022-06-27 13:05:27 +01:00
Adam Brown
7ef8193a93 fixing reset fragments not removing previous screens when moving to the next step 2022-06-27 13:05:26 +01:00
Adam Brown
3c03bae4c5 adding test around resending reset password email 2022-06-27 12:55:51 +01:00
Adam Brown
4200b4b5e9 taking into account the servers ability to sign out all devices 2022-06-27 12:55:50 +01:00
Adam Brown
7a4a6030db adding a password entry confirmation page for the reset password flow 2022-06-27 12:54:32 +01:00
Onuray Sahin
d7c2dbe83f Fix voted poll unit test. 2022-06-27 14:48:58 +03:00
Adam Brown
9abf6e37d1 adding updated forgot password email input and breaker screens 2022-06-27 12:43:54 +01:00
Johannes Marbach
c3ae0c2251 Merge pull request #6369 from vector-im/johannes/expose-profile-tag
Expose pusher profile tag in advanced settings
2022-06-27 13:33:36 +02:00
Adam Brown
dcffc35041 adding forgot password button to login screen 2022-06-27 12:28:54 +01:00
Onuray Sahin
6f4e079a2e Fix undisclosed poll unit test. 2022-06-27 14:07:26 +03:00
Adam Brown
1d573e3f5d Merge pull request #6357 from cloudrac3r/fix-formatted-message-display
Fix formatted_body being parsed as Markdown
2022-06-27 12:07:18 +01:00
Onuray Sahin
1a668da077 Fix ended poll unit test. 2022-06-27 13:57:35 +03:00
Onuray Sahin
a9358e98b2 Fix sending poll unit test. 2022-06-27 13:39:21 +03:00
Valere
9929d6a4eb Update button design 2022-06-27 10:13:18 +02:00
Adam Brown
ccb4f2d1dd Merge pull request #6207 from vector-im/feature/adm/sdk-signout-all-devices
SDK - Logout all devices
2022-06-27 08:30:04 +01:00
Valere
c4c62acdaa Add change log 2022-06-27 09:14:20 +02:00
Valere
142c87314c show option to accept other verif not ready 2022-06-27 09:14:20 +02:00
Valere
622ada7125 ensure ageLocalTs is set 2022-06-27 09:14:20 +02:00
Robin NICOLE
abc0e51f1e Translated using Weblate (English (United Kingdom))
Currently translated at 0.8% (19 of 2239 strings)

Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/en_GB/
2022-06-27 02:32:24 +00:00
Noômen Ben Hassin
5c64724bf8 Translated using Weblate (Italian)
Currently translated at 95.3% (61 of 64 strings)

Translation: Element Android/Element Android Store
Translate-URL: https://translate.element.io/projects/element-android/element-store/it/
2022-06-27 02:32:24 +00:00
Ihor Hordiichuk
b956615a23 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (64 of 64 strings)

Translation: Element Android/Element Android Store
Translate-URL: https://translate.element.io/projects/element-android/element-store/uk/
2022-06-27 02:32:22 +00:00
Ihor Hordiichuk
d342a86cbc Translated using Weblate (Ukrainian)
Currently translated at 100.0% (2239 of 2239 strings)

Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/uk/
2022-06-27 02:32:21 +00:00
Nui Harime
7e4b8ac868 Translated using Weblate (Russian)
Currently translated at 98.8% (2213 of 2239 strings)

Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/ru/
2022-06-27 02:32:20 +00:00
Arusekk
484657ccf9 Translated using Weblate (Polish)
Currently translated at 99.9% (2238 of 2239 strings)

Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/pl/
2022-06-27 02:32:18 +00:00
Szimszon
0e94bffd5c Translated using Weblate (Hungarian)
Currently translated at 100.0% (2239 of 2239 strings)

Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/hu/
2022-06-27 02:32:17 +00:00
iaiz
838b9477ef Translated using Weblate (Spanish)
Currently translated at 99.5% (2228 of 2239 strings)

Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/es/
2022-06-27 02:32:17 +00:00
Glandos
20d96eda85 Translated using Weblate (French)
Currently translated at 100.0% (64 of 64 strings)

Translation: Element Android/Element Android Store
Translate-URL: https://translate.element.io/projects/element-android/element-store/fr/
2022-06-25 11:32:18 +00:00
Glandos
bed5f28c2f Translated using Weblate (French)
Currently translated at 100.0% (2239 of 2239 strings)

Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/fr/
2022-06-25 11:32:17 +00:00
Cadence Ember
e940736938 Combine plugin creation and configuration
As requested in PR feedback.
2022-06-25 15:27:56 +12:00
Maxime NATUREL
d3fb12da19 Copy lists/maps when iterating to avoid concurrent exceptions 2022-06-24 17:37:17 +02:00
Maxime NATUREL
c581564bb1 Remove non necessary main Handler in LocationSharingService 2022-06-24 17:09:33 +02:00
Maxime NATUREL
f57c46de9a Remove non necessary @Synchronized annotations in LocationSharingServiceConnection 2022-06-24 17:08:14 +02:00
Onuray Sahin
e63fa2d83f Move epoxy related poll functions back to MessageItemFactory. 2022-06-24 17:28:59 +03:00
Adam Brown
e655a54064 removing duplicate fake method 2022-06-24 15:08:48 +01:00
Adam Brown
c6ef972e3c adding missing fullstop and removing unused import 2022-06-24 15:08:48 +01:00
Adam Brown
7ac46a2fd1 using consistent parameter name 2022-06-24 15:08:48 +01:00
Adam Brown
4f09160697 adding logout_devices parameter to the password change sdk api, matching reset password 2022-06-24 15:08:48 +01:00
Adam Brown
d9fd627bb1 passing the control of logout devices to the homeserver capabilities model from the entity 2022-06-24 15:08:48 +01:00
Adam Brown
6e3283cb34 moving homeserver feature for logout all devices to the selected homeserver state via the LoginFlowResult 2022-06-24 15:08:48 +01:00
Adam Brown
2d44e47e6a adding can control sign out homeserver version flag to the HomeserverCapabilities
- Includes DB version update and HomeserverCapability migration
2022-06-24 15:08:47 +01:00
Adam Brown
62e8394218 adding changelog entry 2022-06-24 15:05:18 +01:00
Adam Brown
a2646c56cf adding the logout all devices state to the reset state in preparation for the UI to take it into account 2022-06-24 15:05:18 +01:00
Adam Brown
f21e30f7c7 passing the logout devices parameters to the account/password endpoint 2022-06-24 15:05:18 +01:00
Adam Brown
c10254dbfa exposing if the homeserver supports signing out all devices when starting the reset process 2022-06-24 15:05:18 +01:00
Adam Brown
924e668023 adding missing loading state when confirming password reset
- adds reset test cases to the onboarding view model
2022-06-24 15:05:18 +01:00
Onuray Sahin
532bc18b1e Refactor poll item view state factory. 2022-06-24 16:52:16 +03:00
Maxime NATUREL
945026730c Use ActiveSessionHolder in stop live use case 2022-06-24 15:12:38 +02:00
Maxime NATUREL
519d43ceb7 Simplify loop to remove room args 2022-06-24 14:33:19 +02:00
Adam Brown
6b75e2c993 Merge pull request #6370 from vector-im/bugfix/adm/ci-tasks-crashing
Fix CI lint tasks unexpectedly crashing
2022-06-24 13:20:55 +01:00
Adam Brown
c7881fc55e Merge pull request #6372 from vector-im/bugfix/adm/wrong-error-on-sign-in
Fixing wrong error message when signing in with wrong credentials
2022-06-24 13:15:31 +01:00
Maxime NATUREL
81e14c7c3b Observing live status in DB from location sharing Android service 2022-06-24 10:45:49 +02:00
Maxime NATUREL
3cffedd353 Changing in API to get livedata on a live of a given id 2022-06-24 10:45:49 +02:00
Maxime NATUREL
785ce03e67 Synchronizing access to map of roomArgs 2022-06-24 10:45:48 +02:00
Maxime NATUREL
9a39354332 Adding use case to retrieve flow on live summaries given a list of event ids 2022-06-24 10:45:48 +02:00
Maxime NATUREL
96da695473 Service API to listen live summaries given a list of event ids 2022-06-24 10:45:48 +02:00
Maxime NATUREL
3ab941eace Adding changelog entry 2022-06-24 10:45:48 +02:00
Maxime NATUREL
d50b0fbb6b Adding unit tests for the stop live use case 2022-06-24 10:45:48 +02:00
Maxime NATUREL
8406b2a4eb Adding use case to stop live location share
WIP
2022-06-24 10:45:48 +02:00
Adam Brown
cd72563d8b Merge pull request #6374 from vector-im/dependabot/gradle/com.autonomousapps.dependency-analysis-1.8.0
Bump com.autonomousapps.dependency-analysis from 1.7.0 to 1.8.0
2022-06-24 08:57:24 +01:00
Maxime NATUREL
e26393b1b5 Adding changelog entry 2022-06-24 09:40:52 +02:00
dependabot[bot]
bd4263861e Bump com.autonomousapps.dependency-analysis from 1.7.0 to 1.8.0
Bumps com.autonomousapps.dependency-analysis from 1.7.0 to 1.8.0.

---
updated-dependencies:
- dependency-name: com.autonomousapps.dependency-analysis
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-06-23 23:09:46 +00:00
Adam Brown
84ece3b575 ignoring inferred registration disabled when going through the sign in flow 2022-06-23 18:17:33 +01:00
Maxime NATUREL
a4cae9ef07 Fixing missing "u=" in geo URI pattern for uncertainty 2022-06-23 17:40:16 +02:00
Adam Brown
eef904b3d5 applying jvm memory settings to CI linting tasks
- should stop the task crashing on the CI
2022-06-23 16:35:37 +01:00
Johannes Marbach
231bd6292a Remove empty textStyle properties
Signed-off-by: Johannes Marbach <johannesm@element.io>
2022-06-23 12:14:02 +02:00
Johannes Marbach
ec073552bd Expose pusher profile tag in advanced settings
Signed-off-by: Johannes Marbach <johannesm@element.io>
2022-06-23 10:56:28 +02:00
dependabot[bot]
fb4c83b3c4 Bump dokka-gradle-plugin from 1.6.21 to 1.7.0
Bumps dokka-gradle-plugin from 1.6.21 to 1.7.0.

---
updated-dependencies:
- dependency-name: org.jetbrains.dokka:dokka-gradle-plugin
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-06-23 08:33:40 +00:00
Adam Brown
2ab2af90e9 Merge pull request #6294 from vector-im/dependabot/gradle/org.owasp-dependency-check-gradle-7.1.1
Bump dependency-check-gradle from 7.1.0.1 to 7.1.1
2022-06-23 09:32:46 +01:00
Adam Brown
1cfcc18407 Merge pull request #6322 from vector-im/dependabot/gradle/androidx.annotation-annotation-1.4.0
Bump annotation from 1.3.0 to 1.4.0
2022-06-23 09:31:59 +01:00
Adam Brown
4779b78616 Merge pull request #6274 from vector-im/dependabot/gradle/mavericks-2.7.0
Bump mavericks from 2.6.1 to 2.7.0
2022-06-23 09:31:26 +01:00
Adam Brown
1a898a8ad5 Merge pull request #6343 from vector-im/dependabot/gradle/com.facebook.flipper-flipper-0.150.0
Bump flipper from 0.149.0 to 0.150.0
2022-06-23 09:30:10 +01:00
Adam Brown
d6abd176fc Merge pull request #6354 from vector-im/dependabot/gradle/kotlinCoroutines-1.6.3
Bump kotlinCoroutines from 1.6.2 to 1.6.3
2022-06-23 09:29:39 +01:00
Onuray Sahin
2be43e9294 Test isVotable function. 2022-06-22 17:18:17 +03:00
Onuray Sahin
a7bc2ef3bc Changelog added. 2022-06-22 16:45:22 +03:00
Onuray Sahin
aab558af09 Test ended poll option view states. 2022-06-22 16:40:11 +03:00
Onuray Sahin
d0d2929a84 Test undisclosed option view states. 2022-06-22 16:29:19 +03:00
dependabot[bot]
4e6e5041d8 Bump flipper from 0.149.0 to 0.150.0
Bumps [flipper](https://github.com/facebook/flipper) from 0.149.0 to 0.150.0.
- [Release notes](https://github.com/facebook/flipper/releases)
- [Commits](https://github.com/facebook/flipper/compare/v0.149.0...v0.150.0)

---
updated-dependencies:
- dependency-name: com.facebook.flipper:flipper
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-06-22 13:04:17 +00:00
Benoit Marty
29d4916a2e Cleanup of #5187 (#6326)
Update design and behaviour on widget permission bottom sheet
2022-06-22 15:04:02 +02:00
Benoit Marty
c4e578a653 Merge pull request #6344 from vector-im/dependabot/gradle/com.facebook.flipper-flipper-network-plugin-0.150.0
Bump flipper-network-plugin from 0.149.0 to 0.150.0
2022-06-22 15:02:46 +02:00
Benoit Marty
37371ac024 Merge pull request #6360 from vector-im/dependabot/gradle/com.autonomousapps.dependency-analysis-1.7.0
Bump com.autonomousapps.dependency-analysis from 1.5.0 to 1.7.0
2022-06-22 15:01:25 +02:00
Adam Brown
9925cf9996 Merge pull request #6362 from vector-im/bugfix/adm/dispatch-to-crash
Fixing concurrent `dispatchTo` crash
2022-06-22 14:00:20 +01:00
Benoit Marty
03d6ace3ae Merge pull request #6359 from vector-im/dependabot/gradle/com.kgurgul.flipper-flipper-realm-android-2.2.0
Bump flipper-realm-android from 2.1.0 to 2.2.0
2022-06-22 14:54:52 +02:00
Adam Brown
0aacde9d9d updating version for next development cycle
- also fixes wrong version in changes doc
2022-06-22 13:48:56 +01:00
Adam Brown
dff0f9d1bc Merge branch 'main' into develop 2022-06-22 13:47:31 +01:00
Onuray Sahin
8bb421a916 Test poll voted option view states. 2022-06-22 15:44:28 +03:00
Onuray Sahin
0f0492db3b Test ready option view states. 2022-06-22 15:27:04 +03:00
Adam Brown
8ada26529a updating version for 1.4.24 hotfix
- is a hotfix for 1.4.22
2022-06-22 12:37:17 +01:00
Adam Brown
23cd6dae42 fixing concurrent dispatch crash by using copy on write set
- whilst closing the session, we iterate through all the listeners calling onSessionStopped however some implementations also use this callback to remove themselves from the listeners, causing the concurrent modification crash
2022-06-22 12:19:06 +01:00
Onuray Sahin
2cf40cbcf2 Test sending option view states. 2022-06-22 14:05:42 +03:00
Benoit Marty
a525ede25d Fix migration to 30. Seems that isNull with long path is not working correctly. 2022-06-22 11:50:43 +01:00
Adam Brown
4e42bedde9 Fix migration to 30. Seems that isNull with long path is not working correctly. (#6361) 2022-06-22 11:49:38 +01:00
Onuray Sahin
5a948891f0 Test ready poll state. 2022-06-22 13:27:52 +03:00
Onuray Sahin
2c5ddca821 Test voted poll state. 2022-06-22 13:21:50 +03:00
Onuray Sahin
0fe4b9f07f Test undisclosed poll state. 2022-06-22 12:57:50 +03:00
Benoit Marty
8bea64bc0c Fix migration to 30. Seems that isNull with long path is not working correctly. 2022-06-22 11:56:54 +02:00
Onuray Sahin
8854b81977 Test ended poll state. 2022-06-22 12:34:52 +03:00
Onuray Sahin
a886e93c7e Test sending poll state. 2022-06-22 12:13:53 +03:00
Adam Brown
a8cd6ca497 Merge branch 'main' into develop 2022-06-22 08:49:48 +01:00
Johan Smits
6da4245efb Translated using Weblate (Dutch)
Currently translated at 100.0% (2239 of 2239 strings)

Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/nl/
2022-06-22 06:32:16 +00:00
Priit Jõerüüt
cd6d06529e Translated using Weblate (Estonian)
Currently translated at 100.0% (2239 of 2239 strings)

Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/et/
2022-06-22 06:32:16 +00:00
Cadence Ember
216de6c050 Lint (import ordering) 2022-06-22 13:10:30 +12:00
dependabot[bot]
f1056898ed Bump com.autonomousapps.dependency-analysis from 1.5.0 to 1.7.0
Bumps [com.autonomousapps.dependency-analysis](https://github.com/autonomousapps/dependency-analysis-android-gradle-plugin) from 1.5.0 to 1.7.0.
- [Release notes](https://github.com/autonomousapps/dependency-analysis-android-gradle-plugin/releases)
- [Changelog](https://github.com/autonomousapps/dependency-analysis-android-gradle-plugin/blob/main/CHANGELOG.md)
- [Commits](https://github.com/autonomousapps/dependency-analysis-android-gradle-plugin/compare/v1.5.0...v1.7.0)

---
updated-dependencies:
- dependency-name: com.autonomousapps.dependency-analysis
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-06-21 23:43:06 +00:00
dependabot[bot]
c81866f34e Bump flipper-realm-android from 2.1.0 to 2.2.0
Bumps [flipper-realm-android](https://github.com/kamgurgul/Flipper-Realm) from 2.1.0 to 2.2.0.
- [Release notes](https://github.com/kamgurgul/Flipper-Realm/releases)
- [Commits](https://github.com/kamgurgul/Flipper-Realm/compare/2.1.0...2.2.0)

---
updated-dependencies:
- dependency-name: com.kgurgul.flipper:flipper-realm-android
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-06-21 23:41:39 +00:00
Onuray Sahin
77dfd5f826 Create initial test class. 2022-06-21 17:26:26 +03:00
Cadence Ember
592f890fac Fix formatted_body being parsed as Markdown
Background: Clients write Markdown and convert it to HTML before
sending the event. All events are formatted as HTML. However, if an
HTML formatted event happened to include markdown characters, Element
Android would incorrectly render that markdown.

For example, an event with formatted_body: "*test*" should be
displayed as literally *test* with no effects, but Element Android
incorrectly displayed it as test in italics.

This commit fixes this behaviour, making Element Android not parse
Markdown in HTML messages.

From the perspective of most users it will appear that backslash
escapes now work properly (even though this wasn't the real issue).
2022-06-22 02:24:07 +12:00
Onuray Sahin
bd9fa48312 Refactor poll item factory to make it testable. 2022-06-21 17:03:56 +03:00
Adam Brown
9ddded4996 generating 1.4.23 changelog 2022-06-21 14:56:33 +01:00
Adam Brown
f56703abc4 updating version for hotfix release 2022-06-21 14:48:14 +01:00
ganfra
0f29f7848b Feature/fga/simplify timeline logic (#6318)
* Sync: delete all previous chunks in case of gappy sync

* Chunk: dont link chunks if we find existing timeline event (keep multiple timeline events in db)

* Timeline : remove some unused code

* Clean and add changelog

* Timeline: set named argument

* Timeline: avoid restarting the timeline when there is a CancellationException due to permalink

* Timeline: add migration to clean up old (broken) chunks

* Update matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/migration/MigrateSessionTo030.kt

Co-authored-by: Benoit Marty <benoitm@matrix.org>

* Timeline: try to fix test

* ignoring broken instrumentation test in order to release

Co-authored-by: ganfra <francoisg@element.io>
Co-authored-by: Benoit Marty <benoitm@matrix.org>
Co-authored-by: Adam Brown <adampsbrown@gmail.com>
2022-06-21 14:47:13 +01:00
ganfra
b07e0a47e8 Feature/fga/simplify timeline logic (#6318)
* Sync: delete all previous chunks in case of gappy sync

* Chunk: dont link chunks if we find existing timeline event (keep multiple timeline events in db)

* Timeline : remove some unused code

* Clean and add changelog

* Timeline: set named argument

* Timeline: avoid restarting the timeline when there is a CancellationException due to permalink

* Timeline: add migration to clean up old (broken) chunks

* Update matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/migration/MigrateSessionTo030.kt

Co-authored-by: Benoit Marty <benoitm@matrix.org>

* Timeline: try to fix test

* ignoring broken instrumentation test in order to release

Co-authored-by: ganfra <francoisg@element.io>
Co-authored-by: Benoit Marty <benoitm@matrix.org>
Co-authored-by: Adam Brown <adampsbrown@gmail.com>
2022-06-21 14:42:50 +01:00
Adam Brown
41431cd1d2 Merge pull request #6307 from vector-im/feature/adm/ci-test-coverage
Missing unit test coverage
2022-06-21 10:17:42 +01:00
Adam Brown
8754f230d3 removing debug log 2022-06-21 09:15:28 +01:00
Adam Brown
42be961681 applying sanity test filter to the start params 2022-06-21 09:15:28 +01:00
Adam Brown
a76b6e522b splitting unit and instrumentation test tasks so that we can configure the android plugin testCoverage parameter
- there's a bug that causes the output to be invalid for unit tests
2022-06-21 09:15:27 +01:00
dependabot[bot]
6d53bf667c Bump kotlinCoroutines from 1.6.2 to 1.6.3
Bumps `kotlinCoroutines` from 1.6.2 to 1.6.3.

Updates `kotlinx-coroutines-core` from 1.6.2 to 1.6.3
- [Release notes](https://github.com/Kotlin/kotlinx.coroutines/releases)
- [Changelog](https://github.com/Kotlin/kotlinx.coroutines/blob/master/CHANGES.md)
- [Commits](https://github.com/Kotlin/kotlinx.coroutines/compare/1.6.2...1.6.3)

Updates `kotlinx-coroutines-android` from 1.6.2 to 1.6.3
- [Release notes](https://github.com/Kotlin/kotlinx.coroutines/releases)
- [Changelog](https://github.com/Kotlin/kotlinx.coroutines/blob/master/CHANGES.md)
- [Commits](https://github.com/Kotlin/kotlinx.coroutines/compare/1.6.2...1.6.3)

Updates `kotlinx-coroutines-test` from 1.6.2 to 1.6.3
- [Release notes](https://github.com/Kotlin/kotlinx.coroutines/releases)
- [Changelog](https://github.com/Kotlin/kotlinx.coroutines/blob/master/CHANGES.md)
- [Commits](https://github.com/Kotlin/kotlinx.coroutines/compare/1.6.2...1.6.3)

---
updated-dependencies:
- dependency-name: org.jetbrains.kotlinx:kotlinx-coroutines-core
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: org.jetbrains.kotlinx:kotlinx-coroutines-android
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: org.jetbrains.kotlinx:kotlinx-coroutines-test
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-06-20 23:11:06 +00:00
Jorge Martín
b5aedd4626 Re-implement lock screen feature using our own implementation. 2022-06-20 17:38:05 +02:00
Onuray Sahin
ab34bb6df7 Changelog added. 2022-06-20 17:10:00 +03:00
Onuray Sahin
80abe1f675 Show live location promotional bottom sheet. 2022-06-20 17:04:56 +03:00
Onuray Sahin
13144f078a Implement live location promotional bottom sheet. 2022-06-20 15:41:43 +03:00
Onuray Sahin
b37dce7da7 Create layout for promoting live location labs flag. 2022-06-20 15:19:22 +03:00
Maxime NATUREL
32c6281dd2 Merge pull request #6316 from vector-im/fix/mna/crash-offline-lls
[Location sharing] Fix crash when starting/stopping a live when offline (PSF-1124)
2022-06-20 14:00:56 +02:00
Maxime NATUREL
0948cab31f Merge pull request #6304 from vector-im/feature/mna/location-sharing-service-api
[SDK] Improve location sharing service api (PSF-1004)
2022-06-20 13:48:13 +02:00
Maxime NATUREL
7ddec674fb Fixing unit tests after rebase 2022-06-20 13:06:25 +02:00
Onuray Sahin
9641ff132d Show live location sharing option even if labs flag is disabled. 2022-06-20 13:58:28 +03:00
Jorge Martin Espinosa
65bc4acbab Fix flaky tests for voice recording feature (#6330) 2022-06-20 09:23:02 +00:00
Maxime NATUREL
9047d9d62c Fixing coding style issues 2022-06-20 11:17:30 +02:00
Maxime NATUREL
082b39e651 Adding return type in the doc for stop API 2022-06-20 11:17:30 +02:00
Maxime NATUREL
eb503b8ab6 Adding a changelog entry 2022-06-20 11:17:30 +02:00
Maxime NATUREL
e1fc6fa727 Adding tests to cover errors thrown during start/stop process 2022-06-20 11:17:30 +02:00
Maxime NATUREL
3e05431e6f Fixing unit tests 2022-06-20 11:17:30 +02:00
Maxime NATUREL
6c0b7f7b43 Renaming a variable to be more precise 2022-06-20 11:17:30 +02:00
Maxime NATUREL
fc98057042 Forward error to UI in map screen 2022-06-20 11:17:30 +02:00
Maxime NATUREL
31bb9eaac8 Forward error to UI in timeline screen 2022-06-20 11:17:30 +02:00
Maxime NATUREL
9eba3034db Catching crash when offline during stop of a live location share 2022-06-20 11:17:30 +02:00
Maxime NATUREL
e55c378683 Catching crash when offline during start of a live location share 2022-06-20 11:17:30 +02:00
Maxime NATUREL
b16ccf5098 Fix unit tests after rebase 2022-06-20 10:16:27 +02:00
Maxime NATUREL
dcca546c4b Fixing pusherTask tests 2022-06-20 09:28:35 +02:00
Maxime NATUREL
d0b598463f Adding test for stop live location share task 2022-06-20 09:28:35 +02:00
Maxime NATUREL
af039371e1 Adding test for start live location share task 2022-06-20 09:28:35 +02:00
Maxime NATUREL
8860dac759 Improving send locations tasks tests 2022-06-20 09:28:35 +02:00
Maxime NATUREL
8d2a914c64 Wip 2022-06-20 09:28:35 +02:00
Maxime NATUREL
707507202d Renaming method to create static location event 2022-06-20 09:28:35 +02:00
Maxime NATUREL
879cafc8d1 Unit test for send live location task 2022-06-20 09:28:35 +02:00
Maxime NATUREL
1ecc42c903 Unit test for send static location task 2022-06-20 09:28:35 +02:00
Maxime NATUREL
f981900cf3 Unit test for start/stop live location share 2022-06-20 09:28:35 +02:00
Maxime NATUREL
fb7fbced39 Unit test for live location sending 2022-06-20 09:28:35 +02:00
Maxime NATUREL
7332c08bb4 Unit test for static location sending 2022-06-20 09:28:35 +02:00
Maxime NATUREL
7d4df8be09 Unit test for method to get live data of active lives 2022-06-20 09:28:35 +02:00
Maxime NATUREL
752434acb4 Adding changelog entry 2022-06-20 09:28:35 +02:00
Maxime NATUREL
7b159c5b71 Send live location API 2022-06-20 09:28:35 +02:00
Maxime NATUREL
9b61c1aead Send static location API 2022-06-20 09:28:35 +02:00
Maxime NATUREL
632064ffde Stop live location share API 2022-06-20 09:28:33 +02:00
Maxime NATUREL
29f48249e2 Start live location share API 2022-06-20 09:26:51 +02:00
Maxime NATUREL
539d134b77 Merge pull request #6267 from vector-im/feature/mna/6155-tests-lls-aggregation
Adding unit tests for live location sharing aggregation code (PSF-1063)
2022-06-20 09:19:38 +02:00
Auri B. P
61ff944994 Translated using Weblate (Catalan)
Currently translated at 100.0% (2239 of 2239 strings)

Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/ca/
2022-06-19 20:32:15 +00:00
dependabot[bot]
3db8e0b045 Bump flipper-network-plugin from 0.149.0 to 0.150.0
Bumps [flipper-network-plugin](https://github.com/facebook/flipper) from 0.149.0 to 0.150.0.
- [Release notes](https://github.com/facebook/flipper/releases)
- [Commits](https://github.com/facebook/flipper/compare/v0.149.0...v0.150.0)

---
updated-dependencies:
- dependency-name: com.facebook.flipper:flipper-network-plugin
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-06-17 23:18:10 +00:00
Benoit Marty
3dcec85dea Merge pull request #6340 from vector-im/feature/bma/test_flipper
Add link to the Matrix room.
2022-06-17 18:02:19 +02:00
Maxime NATUREL
ac4b33647d Mutualizing some similar tests with different parameters 2022-06-17 17:55:43 +02:00
Maxime NATUREL
2c96179383 Renaming helpers to clarify purpose 2022-06-17 17:55:43 +02:00
Maxime NATUREL
e3981f42e9 Introducing FakeWorkManager 2022-06-17 17:55:43 +02:00
Maxime NATUREL
b9b1e2b397 Adding tests on location data aggregation 2022-06-17 17:55:43 +02:00
Maxime NATUREL
6386c1603f Adding tests on beacon info aggregation 2022-06-17 17:55:43 +02:00
Maxime NATUREL
dccc3b457d Adding more tests on ignored cases 2022-06-17 17:55:43 +02:00
Maxime NATUREL
51b930147a Adding some tests on ignored cases 2022-06-17 17:55:43 +02:00
Maxime NATUREL
dc95f4553e Adding changelog entry 2022-06-17 17:55:43 +02:00
Maxime NATUREL
cd74f09d70 Merge pull request #5923 from vector-im/fix/mna/issue-5913-location-tracker
[Location tracker] - Fix some location tracking issues (PSF-1000)
2022-06-17 17:53:48 +02:00
Benoit Marty
ba0898831b Fix compilation issue 2022-06-17 17:22:31 +02:00
Maxime NATUREL
dee5dfd187 Add synchronized annotations to protect from concurrent access to callbacks 2022-06-17 17:04:54 +02:00
Benoit Marty
706e8e7627 Ensure the test is less flaky... 2022-06-17 16:54:18 +02:00
Benoit Marty
705b55c57a Use handy kotlin.time.Duration.Companion and remove default value. 2022-06-17 16:53:33 +02:00
random
9bf147e5b6 Translated using Weblate (Italian)
Currently translated at 100.0% (2239 of 2239 strings)

Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/it/
2022-06-17 13:32:14 +00:00
Danial Behzadi
a278483f1c Translated using Weblate (Persian)
Currently translated at 100.0% (2239 of 2239 strings)

Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/fa/
2022-06-17 13:32:14 +00:00
Benoit Marty
663812b90b Format file 2022-06-17 15:21:23 +02:00
Benoit Marty
daa571957a Replace task by much faster dependencyCheckAnalyze 2022-06-17 13:20:37 +02:00
Benoit Marty
ba8fcf9de3 Suppress issue on a tool. 2022-06-17 12:17:09 +02:00
Maxime NATUREL
162fd0a840 Call unmockAll after each test 2022-06-17 11:34:33 +02:00
Maxime NATUREL
a1aa337edb Stop location tracking only when callbacks list is empty to avoid non wanting stop 2022-06-17 11:34:33 +02:00
Maxime NATUREL
1b88cc39a9 Use method reference when sorting providers 2022-06-17 11:34:32 +02:00
Maxime NATUREL
755d743b06 Encapsulate callbacks calls into try/catch block 2022-06-17 11:34:32 +02:00
Maxime NATUREL
260f73b0c2 Adding unit tests for LocationTracker 2022-06-17 11:34:32 +02:00
Maxime NATUREL
45d3fe7c07 Call no provider available callback only providers list is empty 2022-06-17 11:34:32 +02:00
Maxime NATUREL
b686d30b1c Prioritise providers: Fused, GPS and then others 2022-06-17 11:34:32 +02:00
Maxime NATUREL
a8c36e5e70 Using Debouncer to debounce location updates 2022-06-17 11:34:32 +02:00
Maxime NATUREL
5e6422b64c Updating changelog 2022-06-17 11:34:32 +02:00
Maxime NATUREL
c61412520d Debouncing location updates 2022-06-17 11:34:32 +02:00
Maxime NATUREL
7860173fa2 Notify of the latest known location among all last known locations 2022-06-17 11:34:32 +02:00
Maxime NATUREL
0011eda8e0 Adding changelog entry 2022-06-17 11:34:32 +02:00
Onuray Sahin
242cc28daa Merge pull request #6320 from vector-im/feature/ons/poll_unit_tests
CreatePollViewModel unit tests [PSF-1122]
2022-06-17 12:14:01 +03:00
Eric Decanini
674e538131 Merge pull request #6154 from vector-im/bugfix/eric/fix-upgrade-room
Fixes /upgraderoom command not doing anything
2022-06-17 10:55:26 +02:00
Benoit Marty
3942e9bfa9 Add link to the Matrix room. 2022-06-17 09:46:13 +02:00
dependabot[bot]
a3774c1161 Bump android-embedded_fcm_distributor from 2.0.0 to 2.1.1
Bumps [android-embedded_fcm_distributor](https://github.com/UnifiedPush/android-embedded_fcm_distributor) from 2.0.0 to 2.1.1.
- [Release notes](https://github.com/UnifiedPush/android-embedded_fcm_distributor/releases)
- [Commits](https://github.com/UnifiedPush/android-embedded_fcm_distributor/compare/2.0.0...2.1.1)

---
updated-dependencies:
- dependency-name: com.github.UnifiedPush:android-embedded_fcm_distributor
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-06-16 23:08:07 +00:00
Onuray Sahin
712a38e26a Apply Maxime's fix to get latest state. 2022-06-16 18:27:00 +03:00
Benoit Marty
8238cd7f57 Merge pull request #6319 from vector-im/feature/bma/stateEventQuery
Enforce query on state event
2022-06-16 17:13:17 +02:00
Benoit Marty
fe7515761a Merge pull request #6300 from vector-im/feature/bma/flipper
Setup Flipper
2022-06-16 16:44:05 +02:00
Onuray Sahin
14a4a8edd7 Workaround for mavericks bug (https://github.com/airbnb/mavericks/issues/599). 2022-06-16 17:30:17 +03:00
Benoit Marty
16ca26569f Merge pull request #6228 from vector-im/feature/bma/unifiedPush2
UnifiedPush
2022-06-16 16:09:31 +02:00
Adam Brown
d37b273eee Merge pull request #6271 from vector-im/feature/adm/full-matrix-id-homeserver-switching
[FTUE] Switch homeserver on full matrix id entry
2022-06-16 14:23:12 +01:00
Benoit Marty
3557121758 Fix test compilation 2022-06-16 14:13:03 +02:00
Adam Brown
7558d71ec2 removing extra blank line 2022-06-16 12:47:40 +01:00
Benoit Marty
7bd2184b26 Rename fun. 2022-06-16 13:42:48 +02:00
Onuray Sahin
a1d35ae9e4 Move fake class into the right package. 2022-06-16 14:23:25 +03:00
Onuray Sahin
f13dfb8291 Test poll view state when poll option is deleted. 2022-06-16 14:11:17 +03:00
Adam Brown
4f86ad0934 Merge pull request #6297 from vector-im/feature/adm/opt-in-screenshots-in-bug-report
Making bug report screenshots opt in instead of opt out
2022-06-16 12:08:25 +01:00
Onuray Sahin
841b63b819 Test poll view events when poll is edited. 2022-06-16 13:40:39 +03:00
Onuray Sahin
b558d14a48 Create fake room services. 2022-06-16 13:40:00 +03:00
Onuray Sahin
94c0a020fb Rename test data class. 2022-06-16 13:39:32 +03:00
Adam Brown
6a66125286 formatting 2022-06-16 11:19:14 +01:00
Adam Brown
30f5e2bb6c adding test around matrix user id check 2022-06-16 11:18:38 +01:00
Adam Brown
19de43dd65 adding changelog entry 2022-06-16 11:18:38 +01:00
Adam Brown
c6bae6812d adding unavailable homeserver error messaging in the registration page 2022-06-16 11:18:38 +01:00
Adam Brown
d71d37c1ce adding tests around the result _on_ helper callbacks 2022-06-16 11:18:38 +01:00
Adam Brown
b25fd4a540 adding tests around the login error parsing 2022-06-16 11:18:38 +01:00
Adam Brown
f89b9305e8 handling the unavailable homeserver error case in the error formatting as this is now possible via full matrix id handling# 2022-06-16 11:18:38 +01:00
Adam Brown
3a97cfcc36 updating the selected homeserver when we detect a full matrix id within the username field in the login/register input fields 2022-06-16 11:18:37 +01:00
Benoit Marty
e0fe91f54b Remove alias. 2022-06-16 12:17:54 +02:00
Benoit Marty
90f16c6736 Remove unused dep. 2022-06-16 12:16:07 +02:00
Adam Brown
17f8009ce0 only removing the edit server fragment when homeserver edits are complete 2022-06-16 11:08:08 +01:00
Adam Brown
825f14d919 ignoring text suggestions on username inputs, to avoid the spell checker introducing word breaks 2022-06-16 11:08:07 +01:00
Adam Brown
d8814974c5 makes the bug report screenshot preview always visible 2022-06-16 10:58:28 +01:00
Benoit Marty
d978d0a6b4 Delete obsolete comment. 2022-06-16 11:56:30 +02:00
Adam Brown
b78fb532ff Merge pull request #6091 from vector-im/feature/adm/ftue-register-test-cases
FTUE - Stage selection and Registration action testing
2022-06-16 10:54:10 +01:00
Eric Decanini
2f2dae89f7 Merge pull request #6290 from vector-im/bugfix/eric/fix-large-image-crash
Fixes large images crashing when opened in timeline
2022-06-16 11:04:00 +02:00
dependabot[bot]
3367c059e9 Bump annotation from 1.3.0 to 1.4.0
Bumps annotation from 1.3.0 to 1.4.0.

---
updated-dependencies:
- dependency-name: androidx.annotation:annotation
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-06-16 08:40:08 +00:00
Adam Brown
baae7375af Merge pull request #6296 from vector-im/feature/adm/attach-ics
Allow sharing text mimetype content via android's share menu
2022-06-16 09:33:21 +01:00
Linerly
7dbe472e79 Translated using Weblate (Indonesian)
Currently translated at 100.0% (64 of 64 strings)

Translation: Element Android/Element Android Store
Translate-URL: https://translate.element.io/projects/element-android/element-store/id/
2022-06-16 04:32:25 +00:00
waclaw66
135d879038 Translated using Weblate (Czech)
Currently translated at 100.0% (64 of 64 strings)

Translation: Element Android/Element Android Store
Translate-URL: https://translate.element.io/projects/element-android/element-store/cs/
2022-06-16 04:32:24 +00:00
Jeff Huang
49b8c6f946 Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (64 of 64 strings)

Translation: Element Android/Element Android Store
Translate-URL: https://translate.element.io/projects/element-android/element-store/zh_Hant/
2022-06-16 04:32:22 +00:00
Danial Behzadi
42272c7067 Translated using Weblate (Persian)
Currently translated at 100.0% (64 of 64 strings)

Translation: Element Android/Element Android Store
Translate-URL: https://translate.element.io/projects/element-android/element-store/fa/
2022-06-16 04:32:21 +00:00
Priit Jõerüüt
baefec80a0 Translated using Weblate (Estonian)
Currently translated at 100.0% (64 of 64 strings)

Translation: Element Android/Element Android Store
Translate-URL: https://translate.element.io/projects/element-android/element-store/et/
2022-06-16 04:32:20 +00:00
Ihor Hordiichuk
9577be02bc Translated using Weblate (Ukrainian)
Currently translated at 100.0% (64 of 64 strings)

Translation: Element Android/Element Android Store
Translate-URL: https://translate.element.io/projects/element-android/element-store/uk/
2022-06-16 04:32:19 +00:00
Jozef Gaal
34e4a082c2 Translated using Weblate (Slovak)
Currently translated at 100.0% (64 of 64 strings)

Translation: Element Android/Element Android Store
Translate-URL: https://translate.element.io/projects/element-android/element-store/sk/
2022-06-16 04:32:18 +00:00
lvre
73f3f68eff Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (64 of 64 strings)

Translation: Element Android/Element Android Store
Translate-URL: https://translate.element.io/projects/element-android/element-store/pt_BR/
2022-06-16 04:32:17 +00:00
Jeff Huang
373a3008a9 Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (2239 of 2239 strings)

Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/zh_Hant/
2022-06-16 04:32:15 +00:00
Ihor Hordiichuk
5e5dc41088 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (2239 of 2239 strings)

Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/uk/
2022-06-16 04:32:15 +00:00
Jozef Gaal
450e917a1f Translated using Weblate (Slovak)
Currently translated at 100.0% (2239 of 2239 strings)

Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/sk/
2022-06-16 04:32:15 +00:00
lvre
c1a8183a54 Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (2239 of 2239 strings)

Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/pt_BR/
2022-06-16 04:32:15 +00:00
Linerly
2612c02ef1 Translated using Weblate (Indonesian)
Currently translated at 100.0% (2239 of 2239 strings)

Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/id/
2022-06-16 04:32:15 +00:00
Thomas Bertels
cbd0a12422 Translated using Weblate (French)
Currently translated at 99.9% (2238 of 2239 strings)

Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/fr/
2022-06-16 04:32:14 +00:00
Danial Behzadi
fb2c9fb002 Translated using Weblate (Persian)
Currently translated at 100.0% (2239 of 2239 strings)

Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/fa/
2022-06-16 04:32:14 +00:00
Priit Jõerüüt
d545ed82ec Translated using Weblate (Estonian)
Currently translated at 100.0% (2239 of 2239 strings)

Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/et/
2022-06-16 04:32:14 +00:00
waclaw66
c43eda932b Translated using Weblate (Czech)
Currently translated at 100.0% (2239 of 2239 strings)

Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/cs/
2022-06-16 04:32:14 +00:00
Auri B. P
0736e41ea7 Translated using Weblate (Catalan)
Currently translated at 100.0% (2239 of 2239 strings)

Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/ca/
2022-06-16 04:32:14 +00:00
Benoit Marty
ee23118079 Merge pull request #6298 from vector-im/dependabot/github_actions/actions/setup-python-4
Bump actions/setup-python from 3 to 4
2022-06-15 21:52:18 +02:00
Benoit Marty
d5a4e764f2 Changelog 2022-06-15 21:16:57 +02:00
Onuray Sahin
ec3248d714 Lint fixes. 2022-06-15 21:34:04 +03:00
Onuray Sahin
934d860bea Changelog added. 2022-06-15 21:25:44 +03:00
Benoit Marty
a4dd279352 Ensure we do not use QueryStringValue.NoCondition or QueryStringValue.IsNull to query for State Event.
Also remove default value for those parameters.
2022-06-15 19:20:26 +02:00
Onuray Sahin
24d59eba87 Test poll view events when create poll is requested. 2022-06-15 17:51:13 +03:00
Benoit Marty
0abeb3306e Bad copy paste in comment 2022-06-15 16:14:20 +02:00
Benoit Marty
514c4234f2 Add MatrixConfiguration network interceptors after all the other, to ensure to view all the network request headers in Flipper. 2022-06-15 16:14:20 +02:00
Benoit Marty
aea94d79eb Add documentation for Flipper 2022-06-15 16:14:20 +02:00
Benoit Marty
e12103387d Setup Flipper
Move getLastSession() to the SessionManager
Create `DebugService`
Move `logDbUsageInfo()` to `DebugService`
2022-06-15 16:14:20 +02:00
Benoit Marty
cbfe0d64b5 Merge pull request #6208 from vector-im/feature/jorgem/6203-remove-usage-of-ffmpeg-kit
Replace ffmpeg-kit with libopus and libopusenc
2022-06-15 15:43:33 +02:00
Onuray Sahin
0ed9a1885c Test poll view state with a question and max number of options. 2022-06-15 15:55:02 +03:00
Michael Kaye
c9553d31e9 Merge pull request #6308 from vector-im/michaelk/exodus
Run exodus privacy scanner on all PRs
2022-06-15 12:30:00 +01:00
Michael Kaye
063f082fac Run exodus on all PR branches.
Build the release APK for each PR commit, run exodus against that APK.
2022-06-15 11:41:46 +01:00
Jorge Martín
c204f41bec Try to fix tests, address review comments. 2022-06-15 11:37:50 +02:00
Jorge Martín
64334c3437 Add some tests 2022-06-15 11:34:23 +02:00
Jorge Martín
2fbec133b6 Address review comments, fix quality check issues. 2022-06-15 11:34:23 +02:00
Jorge Martín
155842f8bc Add some doc comments 2022-06-15 11:34:23 +02:00
Jorge Martín
b993bd9aef Fix crash when asking for Mic permissions, stopRecord is called with no codec 2022-06-15 11:34:23 +02:00
Jorge Martín
fa2d9e90ed Fix copyright in C++ files 2022-06-15 11:34:23 +02:00
Jorge Martín
6fc278eb2b Replace ffmpeg-kit with libopus and libopusenc. 2022-06-15 11:34:23 +02:00
Benoit Marty
49681982ae I have done some manual test, this should be fine. 2022-06-14 16:55:36 +02:00
Benoit Marty
0147eb4b22 Fix test 2022-06-14 16:44:21 +02:00
Benoit Marty
2174b1105f Move companion at the bottom of the class. 2022-06-14 16:36:56 +02:00
Benoit Marty
279b9b5d6a Be lenient on the Json format for received data in a Push. 2022-06-14 16:33:04 +02:00
Adam Brown
ded7b1e0d0 updating current version 2022-06-14 15:16:56 +01:00
chagai95
c2707d4538 Wrong import order 2022-06-14 14:08:22 +02:00
ericdecanini
c10d4a7382 Slight formatting improvement 2022-06-14 10:21:45 +02:00
dependabot[bot]
7908c4ba2e Bump actions/setup-python from 3 to 4
Bumps [actions/setup-python](https://github.com/actions/setup-python) from 3 to 4.
- [Release notes](https://github.com/actions/setup-python/releases)
- [Commits](https://github.com/actions/setup-python/compare/v3...v4)

---
updated-dependencies:
- dependency-name: actions/setup-python
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-06-13 23:05:19 +00:00
Adam Brown
979dec75de making bugreport screenshots opt in instead of optout 2022-06-13 18:06:53 +01:00
Adam Brown
9725396582 allowing text content types to be shared via android share menu 2022-06-13 17:42:30 +01:00
dependabot[bot]
53c0609c38 Bump mavericks from 2.6.1 to 2.7.0
Bumps `mavericks` from 2.6.1 to 2.7.0.

Updates `mavericks` from 2.6.1 to 2.7.0
- [Release notes](https://github.com/airbnb/mavericks/releases)
- [Changelog](https://github.com/airbnb/mavericks/blob/main/CHANGELOG.md)
- [Commits](https://github.com/airbnb/mavericks/commits)

Updates `mavericks-testing` from 2.6.1 to 2.7.0
- [Release notes](https://github.com/airbnb/mavericks/releases)
- [Changelog](https://github.com/airbnb/mavericks/blob/main/CHANGELOG.md)
- [Commits](https://github.com/airbnb/mavericks/commits)

---
updated-dependencies:
- dependency-name: com.airbnb.android:mavericks
  dependency-type: direct:production
  update-type: version-update:semver-minor
- dependency-name: com.airbnb.android:mavericks-testing
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-06-13 15:37:13 +00:00
Onuray Sahin
1f04e73fcb Test poll view state with a question and enough number of options. 2022-06-13 17:49:57 +03:00
Benoit Marty
56e6f512fc Rename setting key for clarity 2022-06-13 16:38:07 +02:00
Benoit Marty
d1e2a903b4 Add test for the notification settings. 2022-06-13 16:36:32 +02:00
Benoit Marty
55bac9ba0f Give time to the tests to perform 2022-06-13 16:29:45 +02:00
Onuray Sahin
0bf37abca1 Test poll views state with enough number of options but without a question. 2022-06-13 15:58:13 +03:00
Onuray Sahin
5b35534c3d Test poll view state without enough options. 2022-06-13 15:54:33 +03:00
Onuray Sahin
19de21535b Test initial poll view state. 2022-06-13 15:53:25 +03:00
Onuray Sahin
cffa3270dd Create dummy data for poll view states. 2022-06-13 15:49:54 +03:00
dependabot[bot]
2cc881a5d0 Bump dependency-check-gradle from 7.1.0.1 to 7.1.1
Bumps dependency-check-gradle from 7.1.0.1 to 7.1.1.

---
updated-dependencies:
- dependency-name: org.owasp:dependency-check-gradle
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-06-13 12:12:55 +00:00
Benoit Marty
c7d021ece6 Extract parser to its own file and add unit test. 2022-06-13 13:59:16 +02:00
ericdecanini
2f70c1bd4d Adds changelog file 2022-06-13 12:10:38 +02:00
ericdecanini
978de65124 Fixes large images crashing when opened 2022-06-13 12:01:21 +02:00
NIkita Fedrunov
e1ceb227c6 trailing commas 2022-06-13 10:56:10 +02:00
NIkita Fedrunov
be51dba7cf code review fixes + changed text for group links fallback 2022-06-13 10:54:21 +02:00
Nicolas Werner
75a6986770 Remove comment referencing msc2432
Signed-off-by: Nicolas Werner <nicolas.werner@hotmail.de>
2022-06-13 09:57:33 +02:00
Nicolas Werner
d07557a5ee Fix overlooked path as well
Signed-off-by: Nicolas Werner <nicolas.werner@hotmail.de>
2022-06-12 18:05:26 +02:00
Nicolas Werner
a7bb0efc93 Add changelog
Signed-off-by: Nicolas Werner <nicolas.werner@hotmail.de>
2022-06-12 15:13:27 +02:00
Nicolas Werner
0c3ea4f923 Use stable endpoint for alias management
This increases compatibility with homeservers and allows them to remove
Element Android specific workaround.

fixes #4830
see https://github.com/ruma/ruma/pull/936
see https://github.com/matrix-org/synapse/issues/8334
see https://github.com/matrix-org/synapse/pull/9224

Signed-off-by: Nicolas Werner <nicolas.werner@hotmail.de>
2022-06-12 15:05:15 +02:00
dependabot[bot]
2d654da691 Bump realm-gradle-plugin from 10.9.0 to 10.11.0
Bumps [realm-gradle-plugin](https://github.com/realm/realm-java) from 10.9.0 to 10.11.0.
- [Release notes](https://github.com/realm/realm-java/releases)
- [Changelog](https://github.com/realm/realm-java/blob/v10.11.0/CHANGELOG.md)
- [Commits](https://github.com/realm/realm-java/compare/v10.9.0...v10.11.0)

---
updated-dependencies:
- dependency-name: io.realm:realm-gradle-plugin
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-06-10 13:25:27 +02:00
Adam Brown
6681d4fe17 formatting 2022-06-09 17:39:15 +01:00
Benoit Marty
b1e062a204 Fix small issue on the settings. 2022-06-09 17:19:52 +02:00
Benoit Marty
33911c880c Update documentation after @p1gp1g review. 2022-06-09 15:59:43 +02:00
Benoit Marty
4a54674159 This module now have Kotlin code. 2022-06-09 15:38:31 +02:00
NIkita Fedrunov
70f100fa18 RoomListSectionBuilderSpace name changed 2022-06-09 14:22:37 +02:00
NIkita Fedrunov
fef6da5efd invite chooser fragment clean up 2022-06-09 14:21:22 +02:00
NIkita Fedrunov
85306e0e27 removed unused import 2022-06-09 13:19:33 +02:00
NIkita Fedrunov
1e59442da2 added toast for unsupported groups permalink handling 2022-06-09 13:15:02 +02:00
NIkita Fedrunov
eee10642f5 legacy groups removal 2022-06-09 13:01:55 +02:00
Benoit Marty
2f2ee1b894 Format project (only modified files, there are other fomatting issues). 2022-06-09 10:38:38 +02:00
Benoit Marty
c43122a6f8 Explain why the data are different when received from Firebase and from UnifiedPush.
Author: @p1gp1g
2022-06-09 10:18:06 +02:00
Benoit Marty
2b8d1dd11c Write documentation about UnifiedPush.
Introduction is inspired from #2743.
2022-06-09 10:18:06 +02:00
Benoit Marty
3560ac95d1 Create a Kotlin Config object in vector-config module, for easy configuration. 2022-06-09 10:18:06 +02:00
Benoit Marty
5846ad5768 Inject constructor of BackgroundSyncStarter and FcmHelper 2022-06-09 10:18:06 +02:00
Benoit Marty
3c72ee6e0c Unregister UP when signing out 2022-06-09 10:18:06 +02:00
Benoit Marty
905934b9d4 Rename method for clarity 2022-06-09 10:18:06 +02:00
Benoit Marty
a139756dbc Fix an issue with empty endpoint. It can happen if the endpoint is manually removed from the distributor. 2022-06-09 10:18:06 +02:00
Benoit Marty
87087197e5 shorter code 2022-06-09 10:18:06 +02:00
Benoit Marty
639c570150 Create extension to get app names 2022-06-09 10:18:06 +02:00
Benoit Marty
fc66e5f120 Ignore if no change is done - bugfix 2022-06-09 10:18:06 +02:00
Benoit Marty
a5378d6e94 avoid runBlocking 2022-06-09 10:18:06 +02:00
Benoit Marty
fb7df5bf46 Ignore if no change is done. 2022-06-09 10:18:06 +02:00
Benoit Marty
420144dceb Fix back issue on the dialog.
Should split UI a bit more.
2022-06-09 10:18:06 +02:00
Benoit Marty
110c17e57d No need to have a mutable list here. 2022-06-09 10:18:06 +02:00
Benoit Marty
18b49068c1 Change BuildConfig field to a VectorFeature. 2022-06-09 10:18:06 +02:00
Benoit Marty
80d42f0963 Remove unused methods / clarify API 2022-06-09 10:18:06 +02:00
Benoit Marty
35e0a0af33 Detekt 2022-06-09 10:18:06 +02:00
Benoit Marty
6cc2a36ee1 Add explicit Json names 2022-06-09 10:18:06 +02:00
Benoit Marty
cdfb728a73 Clarify the data classes for the Json parsing 2022-06-09 10:18:06 +02:00
Benoit Marty
45768c5251 Small cleanup 2022-06-09 10:18:06 +02:00
Benoit Marty
bbbeb4b283 Extract storage to its own class. 2022-06-09 10:18:06 +02:00
Benoit Marty
bdb2d29666 Catch 404 2022-06-09 10:18:06 +02:00
Benoit Marty
3f6b5292d4 Add summary to the notification with the current value. 2022-06-09 10:18:06 +02:00
Benoit Marty
76bc6a5e0a Move the setting at the beginning of the section 2022-06-09 10:18:06 +02:00
Benoit Marty
fb8408c3da Small cleanup 2022-06-09 10:18:06 +02:00
Benoit Marty
4018113c88 Better usage of Timber. 2022-06-09 10:18:06 +02:00
Benoit Marty
77601f61fb typo 2022-06-09 10:18:06 +02:00
Benoit Marty
ff6aa1147c VectorPreferences can be injected. 2022-06-09 10:18:06 +02:00
Benoit Marty
ad8cb22863 We need an Activity to display the dialog 2022-06-09 10:18:06 +02:00
Benoit Marty
ddf6a69a69 Small cleanup 2022-06-09 10:18:06 +02:00
Benoit Marty
399e95a247 setOnDismissListener should cover all the cases. 2022-06-09 10:18:06 +02:00
Benoit Marty
cc80bf986c Use plurals 2022-06-09 10:18:06 +02:00
Benoit Marty
12d969b2c0 Prefer using toString() 2022-06-09 10:18:06 +02:00
Benoit Marty
74de9c82c0 Small rework 2022-06-09 10:18:06 +02:00
Benoit Marty
9216d8ba32 Small cleanup 2022-06-09 10:18:06 +02:00
Benoit Marty
f1e57d2970 Use .orEmpty() instead of ?: "" 2022-06-09 10:18:06 +02:00
Benoit Marty
5e10449746 Use the RawService to do network request. 2022-06-09 10:18:06 +02:00
Benoit Marty
674e3a72c4 Make UnifiedPushHelper a regular class and inject the context in the constructor to clean up the API 2022-06-09 10:18:06 +02:00
Benoit Marty
96acb61fa1 Add unifiedpush to the project dict. 2022-06-09 10:16:59 +02:00
Benoit Marty
09a918bac4 Cleanup 2022-06-09 10:16:59 +02:00
Benoit Marty
42811751fb Move ALLOW_EXTERNAL_UNIFIEDPUSH_DISTRIB to defaultConfig and document it. 2022-06-09 10:16:59 +02:00
Benoit Marty
d88d27985e Sort alphabetically. 2022-06-09 10:16:59 +02:00
Benoit Marty
ee7fccf072 Fix compilation issues after rebase 2022-06-09 10:16:59 +02:00
sim
7eca405693 Update UnifiedPush libs
Signed-off-by: sim <git@sgougeon.fr>
2022-06-09 10:16:59 +02:00
sim
f774f46627 Check custom unifiedpush gateway 2022-06-09 10:16:59 +02:00
sim
1069f77bd5 Lint 2022-06-09 10:16:59 +02:00
sim
f00257f461 Add UnifiedPush troubleshoot 2022-06-09 10:16:59 +02:00
sim
848adc415f Add UnifiedPush settings 2022-06-09 10:16:59 +02:00
sim
04b297b261 Add UnifiedPush support 2022-06-09 10:16:59 +02:00
Adam Brown
befcfe8c5b renaming success type to something more concrete 2022-06-09 08:52:29 +01:00
Adam Brown
88167a0287 fixing import ordering 2022-06-09 08:52:29 +01:00
Adam Brown
ef1356f4dd replacing comment extracted function (also convered by a test case) 2022-06-09 08:52:29 +01:00
Adam Brown
ba18c6f3e2 extracting registration action business logic to the handler abstraction and adding tests
- renames the existing handler to a wizard delegate
2022-06-09 08:52:28 +01:00
ericdecanini
2f9517f69d Merge remote-tracking branch 'origin/develop' into bugfix/eric/fix-upgrade-room 2022-06-08 13:17:58 +02:00
ericdecanini
31b245b8e3 Changes test name 2022-06-08 09:38:30 +02:00
ericdecanini
d586f64338 Removes emit method from DataSource 2022-06-03 14:53:26 +02:00
ericdecanini
a5fd11c204 Fixes detekt error 2022-06-03 12:50:05 +02:00
ericdecanini
9c1c87ba5d Fixes detekt error on java doc 2022-06-03 12:05:12 +02:00
ericdecanini
f3d7127f17 Fixes lint error 2022-06-03 11:41:47 +02:00
ganfra
c48fd7708c Increase extraBufferCapacity (and allow configuration) and validate behavior with tests 2022-05-31 20:11:54 +02:00
ericdecanini
e84f012b73 Changes set method name to emit 2022-05-26 15:45:18 +02:00
ericdecanini
b0ce32e97e Adds changelog file 2022-05-25 15:37:31 +02:00
ericdecanini
f831252e35 Fixes UpgradeRoom command not working 2022-05-23 14:09:29 +02:00
ericdecanini
b9b0e84704 Adds set method to MutableDataSource 2022-05-23 14:09:18 +02:00
chagai95
f949c517b6 import timber and use .roomService() 2022-05-20 15:52:43 +02:00
chagai95
f90078c593 Merge branch 'vector-im:develop' into native-lookup-fixes 2022-05-20 15:51:14 +02:00
chagai95
8c783f9414 Create 6101.bugfix 2022-05-19 15:12:04 +02:00
chagai95
30fe3773ae refactor - better naming, return native user id and not sip user id and create a dm with the native user instead of with the sip user 2022-05-19 15:03:51 +02:00
ericdecanini
fe27451532 Fixes lint error 2022-05-18 12:09:34 +02:00
ericdecanini
a71c50c638 Fixes lint error 2022-05-18 11:38:38 +02:00
ericdecanini
61b8053b9b Moves LoginType to sdk api package 2022-05-18 11:23:34 +02:00
ericdecanini
6a3044cb2e Fixes post merge errors 2022-05-17 14:46:02 +02:00
ericdecanini
b12549831e Merge remote-tracking branch 'origin/develop' into bugfix/eric/softlogout-ux-broken
# Conflicts:
#	matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/db/SessionParamsMapper.kt
#	matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/registration/DefaultRegistrationWizard.kt
#	vector/src/main/java/im/vector/app/features/login/LoginActivity.kt
#	vector/src/main/java/im/vector/app/features/signout/soft/SoftLogoutController.kt
#	vector/src/main/java/im/vector/app/features/signout/soft/SoftLogoutViewModel.kt
2022-05-17 14:24:35 +02:00
ericdecanini
92d177a68e Makes MigrateAuthTo005 class internal 2022-04-20 20:05:54 +02:00
ericdecanini
9b479ca8c0 Merge remote-tracking branch 'origin/develop' into bugfix/eric/softlogout-ux-broken 2022-04-20 18:23:27 +02:00
ericdecanini
ce579c1dd3 Merge remote-tracking branch 'origin/develop' into bugfix/eric/softlogout-ux-broken
# Conflicts:
#	vector/src/main/java/im/vector/app/features/login/LoginActivity.kt
#	vector/src/main/java/im/vector/app/features/signout/soft/SoftLogoutController.kt
2022-03-28 15:59:50 +02:00
ericdecanini
5fcae7f4e6 Adds direct and custom types to soft logout disambiguation 2022-03-15 18:03:54 +01:00
ericdecanini
21459db634 Replaces login type unknown value with name in migration 2022-03-15 15:23:03 +01:00
ericdecanini
ef59faf160 Adds error throw for LoginActivity LoginMode Unknown 2022-03-15 15:05:33 +01:00
ericdecanini
a173accfa5 Replaces use of LoginType.value with name 2022-03-15 14:59:09 +01:00
ericdecanini
ae540297b1 Adds custom and direct login types 2022-03-15 14:53:59 +01:00
ericdecanini
70b5b9855a Removes debug global error 2022-03-09 12:26:52 +01:00
ericdecanini
ec57ff1b03 Adds attempt at SSO session restore 2022-03-09 11:07:39 +01:00
ericdecanini
6836a12557 Fixes legal comments 2022-03-07 13:49:23 +01:00
ericdecanini
04af8b2360 Changes LoginActivity onSignModeSelected SSO case 2022-03-07 13:38:30 +01:00
ericdecanini
e1f227a545 Fixes legal comments in matrix sdk files added 2022-03-07 13:14:10 +01:00
ericdecanini
0d75273121 Adds stubbing and verification for migration setRequired 2022-03-07 12:22:25 +01:00
ericdecanini
085dd943ff Fixes wrong legal comment on LoginType 2022-03-07 12:13:33 +01:00
ericdecanini
e8432f3140 Adds setRequired to migration 2022-03-07 12:07:41 +01:00
ericdecanini
22b21b8c7f Adds changelog file 2022-03-07 10:53:43 +01:00
ericdecanini
6338941885 Temporarily removes unit tests 2022-03-07 10:28:48 +01:00
ericdecanini
858923846d Adds Uri static mocking 2022-03-07 09:56:44 +01:00
ericdecanini
9bd3254e41 Removes HomeServerConnectionConfigFixture in fake adapter 2022-03-04 23:27:21 +01:00
ericdecanini
7896bf9023 Removes HomeServerConnectionConfigFixture 2022-03-04 21:36:10 +01:00
ericdecanini
2d07b80ace Fixes broken migration test 2022-03-04 21:14:27 +01:00
ericdecanini
c996f876a2 Fixes Uri EMPTY must not be null 2022-03-04 21:10:52 +01:00
ericdecanini
489670cf6b Adds validation failed test for SessionParamsCreator 2022-03-04 21:07:12 +01:00
ericdecanini
bcd802d335 Changes login types in wizards 2022-03-04 20:58:30 +01:00
ericdecanini
bb2369dad2 Fixes broken tests due to uninitialised HomeServerConnectionConfig homeServerUri 2022-03-04 15:02:03 +01:00
ericdecanini
275505b3e6 Fixes lint errors 2022-03-04 14:53:16 +01:00
ericdecanini
92f87a3a5a Adds login type handling to SoftLogoutController 2022-03-04 14:51:39 +01:00
ericdecanini
2fda593c3c Adds login types to auth flows 2022-03-04 14:29:42 +01:00
ericdecanini
32bde5a344 Adds loginType UNSUPPORTED 2022-03-04 14:24:47 +01:00
ericdecanini
ea53462107 Adds loginType to DefaultLegacySessionImporter 2022-03-03 17:54:45 +01:00
ericdecanini
40dee006dd Refactors SessionCreator with added tests 2022-03-03 17:51:50 +01:00
ericdecanini
47d5d09af2 Fixes lint errors 2022-03-03 14:46:11 +01:00
ericdecanini
d3d99dd3ba Replaces mocks with fixtures in fake json adapters 2022-03-03 13:21:04 +01:00
ericdecanini
b82efe95bd Moves test packages 2022-03-03 13:18:02 +01:00
ericdecanini
dffd568e14 Adds AuthTo005 realm migration 2022-03-03 13:14:49 +01:00
ericdecanini
d33081c349 Refactors SessionParamsMapperTest by adding fake json adapters 2022-03-03 11:47:31 +01:00
ericdecanini
187502c358 Refactors SessionParamsMapperTest by adding fake moshi 2022-03-03 11:32:23 +01:00
ericdecanini
25e73e5bd0 Adds SessionParamsMapper tests 2022-03-03 10:56:07 +01:00
ericdecanini
209a442d5b Adds LoginType to SessionParams and its entity 2022-03-03 10:55:51 +01:00
ericdecanini
12dc8a8112 Tests sso login mode 2022-03-02 15:23:39 +01:00
ericdecanini
448e8e001f Reimplements soft logout simulation 2022-03-02 14:51:22 +01:00
ericdecanini
dab866d170 Forces soft logout to be true for testing 2022-03-02 12:30:28 +01:00
yostyle
31ec8d39d8 Open url on external browser task 2021-10-28 17:36:27 +02:00
941 changed files with 25434 additions and 7138 deletions

View File

@@ -100,12 +100,20 @@ body:
##### Release on MavenCentral
- [ ] Checkout the branch `main`
- [ ] Run the command `./gradlew publish --no-daemon --no-parallel`. You'll need some non-public element to do so
- [ ] Run the command `./gradlew closeAndReleaseRepository`. If it is working well, you can jump directly to the final step of this section.
If `./gradlew closeAndReleaseRepository` fails (for instance, several repositories are waiting to be handled), you have to close and release the repository manually. Do the following steps:
- [ ] Connect to https://s01.oss.sonatype.org
- [ ] Click on Staging Repositories and check the the files have been uploaded
- [ ] Click on close
- [ ] Wait (check Activity tab until step "Repository closed" is displayed)
- [ ] Click on release. The staging repository will disappear
Final step
- [ ] Check that the release is available in https://repo1.maven.org/maven2/org/matrix/android/matrix-android-sdk2/ (it can take a few minutes)
##### Release on GitHub

View File

@@ -8,8 +8,9 @@ on:
# Enrich gradle.properties for CI/CD
env:
CI_GRADLE_ARG_PROPERTIES: >
-Porg.gradle.jvmargs=-Xmx2g
-Porg.gradle.jvmargs=-Xmx4g
-Porg.gradle.parallel=false
--no-daemon
jobs:
debug:
@@ -46,8 +47,9 @@ jobs:
release:
name: Build unsigned GPlay APKs
runs-on: ubuntu-latest
if: github.ref == 'refs/heads/main'
# Only runs on main, no concurrency.
concurrency:
group: ${{ github.ref == 'refs/head/main' && format('build-release-apk-main-{0}', github.sha) || github.ref == 'refs/heads/develop' && format('build-release-apk-develop-{0}', github.sha) || format('build-debug-{0}', github.ref) }}
cancel-in-progress: ${{ github.ref != 'refs/head/main' }}
steps:
- uses: actions/checkout@v3
- uses: actions/cache@v3
@@ -59,7 +61,7 @@ jobs:
restore-keys: |
${{ runner.os }}-gradle-
- name: Assemble GPlay unsigned apk
run: ./gradlew clean assembleGplayRelease $CI_GRADLE_ARG_PROPERTIES --stacktrace
run: ./gradlew clean assembleGplayRelease $CI_GRADLE_ARG_PROPERTIES --stacktrace
- name: Upload Gplay unsigned APKs
uses: actions/upload-artifact@v3
with:
@@ -67,4 +69,26 @@ jobs:
path: |
vector/build/outputs/apk/*/release/*.apk
# TODO add exodus checks
exodus:
runs-on: ubuntu-latest
needs: release
steps:
- name: Obtain apk from artifact
id: download
uses: actions/download-artifact@v3
with:
name: vector-gplay-release-unsigned
- name: Show apks in artifact
run: ls -R ${{steps.download.outputs.download-path}}
- name: Execute exodus-standalone
uses: docker://exodusprivacy/exodus-standalone:latest
with:
args: /github/workspace/gplay/release/vector-gplay-universal-release-unsigned.apk -j -o /github/workspace/exodus.json
- name: Upload exodus json report
uses: actions/upload-artifact@v3
with:
name: exodus.json
path: |
exodus.json
- name: Check for trackers
run: "jq -e '.trackers == []' exodus.json > /dev/null || { echo '::error static analysis identified user tracking library' ; exit 1; }"

View File

@@ -13,6 +13,7 @@ env:
CI_GRADLE_ARG_PROPERTIES: >
-Porg.gradle.jvmargs=-Xmx4g
-Porg.gradle.parallel=false
--no-daemon
jobs:
@@ -41,7 +42,7 @@ jobs:
steps:
- uses: actions/checkout@v3
- name: Set up Python 3.8
uses: actions/setup-python@v3
uses: actions/setup-python@v4
with:
python-version: 3.8
- uses: actions/cache@v3

View File

@@ -9,6 +9,8 @@ on:
env:
CI_GRADLE_ARG_PROPERTIES: >
-Porg.gradle.jvmargs=-Xmx4g
-Porg.gradle.parallel=false
--no-daemon
jobs:
check:
@@ -113,13 +115,13 @@ jobs:
steps:
- uses: actions/checkout@v3
- name: Dependency analysis
run: ./gradlew buildHealth $CI_GRADLE_ARG_PROPERTIES
run: ./gradlew dependencyCheckAnalyze $CI_GRADLE_ARG_PROPERTIES
- name: Upload dependency analysis
if: always()
uses: actions/upload-artifact@v3
with:
name: dependency-analysis
path: build/reports/dependency-analysis/build-health-report.txt
path: build/reports/dependency-check-report.html
# Lint for main module
android-lint:
@@ -140,7 +142,7 @@ jobs:
restore-keys: |
${{ runner.os }}-gradle-
- name: Lint analysis
run: ./gradlew clean :vector:lint --stacktrace
run: ./gradlew clean :vector:lint --stacktrace $CI_GRADLE_ARG_PROPERTIES
- name: Upload reports
if: always()
uses: actions/upload-artifact@v3
@@ -173,7 +175,7 @@ jobs:
restore-keys: |
${{ runner.os }}-gradle-
- name: Lint ${{ matrix.target }} release
run: ./gradlew clean lint${{ matrix.target }}Release --stacktrace
run: ./gradlew clean lint${{ matrix.target }}Release --stacktrace $CI_GRADLE_ARG_PROPERTIES
- name: Upload ${{ matrix.target }} linting report
if: always()
uses: actions/upload-artifact@v3
@@ -193,7 +195,7 @@ jobs:
- uses: actions/checkout@v3
- name: Run detekt
run: |
./gradlew detekt
./gradlew detekt $CI_GRADLE_ARG_PROPERTIES
- name: Upload reports
if: always()
uses: actions/upload-artifact@v3

View File

@@ -13,7 +13,7 @@ jobs:
steps:
- uses: actions/checkout@v3
- name: Set up Python 3.8
uses: actions/setup-python@v3
uses: actions/setup-python@v4
with:
python-version: 3.8
- name: Install Prerequisite dependencies
@@ -40,7 +40,7 @@ jobs:
steps:
- uses: actions/checkout@v3
- name: Set up Python 3.8
uses: actions/setup-python@v3
uses: actions/setup-python@v4
with:
python-version: 3.8
- name: Install Prerequisite dependencies

View File

@@ -8,8 +8,9 @@ on:
# Enrich gradle.properties for CI/CD
env:
CI_GRADLE_ARG_PROPERTIES: >
-Porg.gradle.jvmargs=-Xmx2g
-Porg.gradle.jvmargs=-Xmx4g
-Porg.gradle.parallel=false
--no-daemon
jobs:
tests:
@@ -28,7 +29,7 @@ jobs:
distribution: 'adopt'
java-version: '11'
- uses: gradle/gradle-build-action@v2
- uses: actions/setup-python@v3
- uses: actions/setup-python@v4
with:
python-version: 3.8
- uses: michaelkaye/setup-matrix-synapse@v1.0.3
@@ -49,7 +50,10 @@ jobs:
emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none
disable-animations: true
emulator-build: 7425822
script: ./gradlew theCodeCoverageReport -Pandroid.testInstrumentationRunnerArguments.notPackage=im.vector.app.ui --stacktrace $CI_GRADLE_ARG_PROPERTIES
script: |
./gradlew unitTestsWithCoverage --stacktrace $CI_GRADLE_ARG_PROPERTIES
./gradlew instrumentationTestsWithCoverage --stacktrace $CI_GRADLE_ARG_PROPERTIES
./gradlew generateCoverageReport --stacktrace $CI_GRADLE_ARG_PROPERTIES
# NB: continue-on-error marks steps.tests.conclusion = 'success' but leaves stes.tests.outcome = 'failure'
- name: Run all the codecoverage tests at once (retry if emulator failed)
uses: reactivecircus/android-emulator-runner@v2
@@ -62,7 +66,10 @@ jobs:
emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none
disable-animations: true
emulator-build: 7425822
script: ./gradlew theCodeCoverageReport -Pandroid.testInstrumentationRunnerArguments.notPackage=im.vector.app.ui --stacktrace $CI_GRADLE_ARG_PROPERTIES
script: |
./gradlew unitTestsWithCoverage --stacktrace $CI_GRADLE_ARG_PROPERTIES
./gradlew instrumentationTestsWithCoverage --stacktrace $CI_GRADLE_ARG_PROPERTIES
./gradlew generateCoverageReport --stacktrace $CI_GRADLE_ARG_PROPERTIES
- run: ./gradlew sonarqube $CI_GRADLE_ARG_PROPERTIES
if: always() # we may have failed a previous step and retried, that's OK
env:

2
.gitignore vendored
View File

@@ -16,4 +16,4 @@
/fastlane/private
/fastlane/report.xml
/library/build
/**/build

View File

@@ -40,6 +40,7 @@
<w>sygnal</w>
<w>threepid</w>
<w>uisi</w>
<w>unifiedpush</w>
<w>unpublish</w>
<w>unwedging</w>
<w>vctr</w>

View File

@@ -1,3 +1,92 @@
Changes in Element v1.4.27 (2022-07-06)
=======================================
Bugfixes 🐛
----------
- Fixes crash when sharing plain text, such as a url ([#6451](https://github.com/vector-im/element-android/issues/6451))
- Fix crashes on Timeline [Thread] due to range validation ([#6461](https://github.com/vector-im/element-android/issues/6461))
- Fix crashes when opening Thread ([#6463](https://github.com/vector-im/element-android/issues/6463))
- Fix ConcurrentModificationException on BackgroundDetectionObserver ([#6469](https://github.com/vector-im/element-android/issues/6469))
Changes in Element v1.4.26 (2022-06-30)
=======================================
Features ✨
----------
- Use UnifiedPush and allows user to have push without FCM. ([#3448](https://github.com/vector-im/element-android/issues/3448))
- Replace ffmpeg-kit with libopus and libopusenc. ([#6203](https://github.com/vector-im/element-android/issues/6203))
- Improve lock screen implementation. ([#6217](https://github.com/vector-im/element-android/issues/6217))
- Allow sharing text based content via android's share menu (eg .ics files) ([#6285](https://github.com/vector-im/element-android/issues/6285))
- Promote live location labs flag ([#6350](https://github.com/vector-im/element-android/issues/6350))
- [Location sharing] - Stop any active live before starting a new one ([#6364](https://github.com/vector-im/element-android/issues/6364))
- Expose pusher profile tag in advanced settings ([#6369](https://github.com/vector-im/element-android/issues/6369))
Bugfixes 🐛
----------
- Fixes concurrent modification crash when signing out or launching the app ([#5821](https://github.com/vector-im/element-android/issues/5821))
- Refactor - better naming, return native user id and not sip user id and create a dm with the native user instead of with the sip user. ([#6101](https://github.com/vector-im/element-android/issues/6101))
- Fixed /upgraderoom command not doing anything ([#6154](https://github.com/vector-im/element-android/issues/6154))
- Fixed crash when opening large images in the timeline ([#6290](https://github.com/vector-im/element-android/issues/6290))
- [Location sharing] Fix crash when starting/stopping a live when offline ([#6315](https://github.com/vector-im/element-android/issues/6315))
- Fix loop in timeline and simplify management of chunks and timeline events. ([#6318](https://github.com/vector-im/element-android/issues/6318))
- Update design and behaviour on widget permission bottom sheet ([#6326](https://github.com/vector-im/element-android/issues/6326))
- Fix | Some user verification requests couldn't be accepted/declined ([#6328](https://github.com/vector-im/element-android/issues/6328))
- [Location sharing] Fix stop of a live not possible from another device ([#6349](https://github.com/vector-im/element-android/issues/6349))
- Fix backslash escapes in formatted messages ([#6357](https://github.com/vector-im/element-android/issues/6357))
- Fixes wrong error message when signing in with wrong credentials ([#6371](https://github.com/vector-im/element-android/issues/6371))
- [Location Share] - Adding missing prefix "u=" for uncertainty in geo URI ([#6375](https://github.com/vector-im/element-android/issues/6375))
In development 🚧
----------------
- FTUE - Adds automatic homeserver selection when typing a full matrix id during registration or login ([#6162](https://github.com/vector-im/element-android/issues/6162))
Improved Documentation 📚
------------------------
- Update the PR process doc to come back to one reviewer with optional additional reviewers. ([#6396](https://github.com/vector-im/element-android/issues/6396))
SDK API changes ⚠️
------------------
- Group all location sharing related API into LocationSharingService ([#5864](https://github.com/vector-im/element-android/issues/5864))
- Add support for MSC2457 - opting in or out of logging out all devices when changing password ([#6191](https://github.com/vector-im/element-android/issues/6191))
- Create `QueryStateEventValue` to do query on `stateKey` for State Event. Also remove the default parameter values for those type. ([#6319](https://github.com/vector-im/element-android/issues/6319))
Other changes
-------------
- - Notify of the latest known location in LocationTracker to avoid multiple locations at start
- Debounce location updates
- Improve location providers access ([#5913](https://github.com/vector-im/element-android/issues/5913))
- Add unit tests for LiveLocationAggregationProcessor code ([#6155](https://github.com/vector-im/element-android/issues/6155))
- Making screenshots in bug reports opt in instead of opt out ([#6261](https://github.com/vector-im/element-android/issues/6261))
- Setup [Flipper](https://fbflipper.com/) ([#6300](https://github.com/vector-im/element-android/issues/6300))
- CreatePollViewModel unit tests ([#6320](https://github.com/vector-im/element-android/issues/6320))
- Fix flaky test in voice recording feature. ([#6329](https://github.com/vector-im/element-android/issues/6329))
- Poll view state unit tests ([#6366](https://github.com/vector-im/element-android/issues/6366))
- Let LoadRoomMembersTask insert by chunk to release db. ([#6394](https://github.com/vector-im/element-android/issues/6394))
Changes in Element v1.4.25 (2022-06-27)
=======================================
Bugfixes 🐛
----------
- Second attempt to fix session database migration to version 30.
Changes in Element v1.4.24 (2022-06-22)
=======================================
Bugfixes 🐛
----------
- First attempt to fix session database migration to version 30.
Changes in Element v1.4.23 (2022-06-21)
=======================================
Bugfixes 🐛
----------
- Fix loop in timeline and simplify management of chunks and timeline events. ([#6318](https://github.com/vector-im/element-android/issues/6318))
Changes in Element v1.4.22 (2022-06-14)
=======================================

View File

@@ -24,12 +24,12 @@ buildscript {
classpath libs.gradle.gradlePlugin
classpath libs.gradle.kotlinPlugin
classpath libs.gradle.hiltPlugin
classpath 'com.google.gms:google-services:4.3.10'
classpath 'com.google.gms:google-services:4.3.13'
classpath 'org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:3.4.0.2513'
classpath 'com.google.android.gms:oss-licenses-plugin:0.10.5'
classpath "com.likethesalad.android:stem-plugin:2.1.1"
classpath 'org.owasp:dependency-check-gradle:7.1.0.1'
classpath "org.jetbrains.dokka:dokka-gradle-plugin:1.6.21"
classpath 'org.owasp:dependency-check-gradle:7.1.1'
classpath "org.jetbrains.dokka:dokka-gradle-plugin:1.7.0"
classpath "org.jetbrains.kotlinx:kotlinx-knit:0.4.0"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
@@ -43,7 +43,7 @@ plugins {
id "io.gitlab.arturbosch.detekt" version "1.20.0"
// Dependency Analysis
id 'com.autonomousapps.dependency-analysis' version "1.5.0"
id 'com.autonomousapps.dependency-analysis' version "1.9.0"
}
// https://github.com/jeremylong/DependencyCheck
@@ -168,7 +168,7 @@ def launchTask = getGradle()
.toString()
.toLowerCase()
if (launchTask.contains("codeCoverageReport".toLowerCase())) {
if (launchTask.contains("coverage".toLowerCase())) {
apply from: 'coverage.gradle'
}
@@ -191,7 +191,7 @@ sonarqube {
property "sonar.links.issue", "https://github.com/vector-im/element-android/issues"
property "sonar.organization", "new_vector_ltd_organization"
property "sonar.java.coveragePlugin", "jacoco"
property "sonar.coverage.jacoco.xmlReportPaths", "${project.buildDir}/reports/jacoco/theCodeCoverageReport/theCodeCoverageReport.xml"
property "sonar.coverage.jacoco.xmlReportPaths", "${project.buildDir}/reports/jacoco/generateCoverageReport/generateCoverageReport.xml"
property "sonar.login", project.hasProperty("SONAR_LOGIN") ? SONAR_LOGIN : "invalid"
}
}
@@ -252,11 +252,7 @@ dependencyAnalysis {
exclude("org.json:json") // Used in unit tests, overwrites the one bundled into Android
}
}
project(":library:ui-styles") {
onUnusedDependencies {
exclude("com.github.vector-im:PFLockScreen-Android") // False positive
}
}
project(":library:ui-styles")
project(":matrix-sdk-android") {
onUnusedDependencies {
exclude("io.reactivex.rxjava2:rxkotlin") // Transitively required for mocking realm as monarchy doesn't expose Rx
@@ -271,6 +267,8 @@ dependencyAnalysis {
onUnusedDependencies {
// False positives
exclude(
"androidx.fragment:fragment-testing",
"com.facebook.soloader:soloader",
"com.vanniktech:emoji-google",
"com.vanniktech:emoji-material",
"org.maplibre.gl:android-plugin-annotation-v9",

1
changelog.d/5284.wip Normal file
View File

@@ -0,0 +1 @@
FTUE - Adds support for resetting the password during the FTUE onboarding journey

1
changelog.d/5398.bugfix Normal file
View File

@@ -0,0 +1 @@
Adds LoginType to SessionParams to fix soft logout form not showing for SSO and Password type

1
changelog.d/5733.misc Normal file
View File

@@ -0,0 +1 @@
Communities/Groups are removed completely

1
changelog.d/5733.sdk Normal file
View File

@@ -0,0 +1 @@
Communities/Groups are removed completely

1
changelog.d/5853.feature Normal file
View File

@@ -0,0 +1 @@
Improve user experience when he is first invited to a room. Users will be able to decrypt and view previous messages

1
changelog.d/6288.bugfix Normal file
View File

@@ -0,0 +1 @@
Use stable endpoint for alias management instead of MSC2432. Contributed by Nico.

1
changelog.d/6389.misc Normal file
View File

@@ -0,0 +1 @@
Replacing Epoxy annotation layout id references with getDefaultLayoutId

1
changelog.d/6392.misc Normal file
View File

@@ -0,0 +1 @@
Ensure `RealmList<T>.clearWith()` extension is correctly used.

1
changelog.d/6401.feature Normal file
View File

@@ -0,0 +1 @@
[Location sharing] - Reply action on a live message

1
changelog.d/6413.feature Normal file
View File

@@ -0,0 +1 @@
Show a loader if all the Room Members are not yet loaded.

1
changelog.d/6423.misc Normal file
View File

@@ -0,0 +1 @@
[Poll] - Add a description under undisclosed poll when not ended

1
changelog.d/6429.misc Normal file
View File

@@ -0,0 +1 @@
Add `android:hasFragileUserData="true"` in the manifest

1
changelog.d/6430.bugfix Normal file
View File

@@ -0,0 +1 @@
[Poll] Fixes visible and wrong votes in closed poll after removing 2 previous polls

1
changelog.d/6434.misc Normal file
View File

@@ -0,0 +1 @@
Add code check to prevent modification of frozen class

1
changelog.d/6436.misc Normal file
View File

@@ -0,0 +1 @@
Let your Activity or Fragment implement `VectorMenuProvider` if they provide a menu.

1
changelog.d/6442.bugfix Normal file
View File

@@ -0,0 +1 @@
Fix HTML entities being displayed in messages

1
changelog.d/6450.bugfix Normal file
View File

@@ -0,0 +1 @@
Gallery picker can pick external images

1
changelog.d/6451.bugfix Normal file
View File

@@ -0,0 +1 @@
Fixes crash when sharing plain text, such as a url

1
changelog.d/6458.misc Normal file
View File

@@ -0,0 +1 @@
Rename Android Service to use `AndroidService` suffix

1
changelog.d/6461.bugfix Normal file
View File

@@ -0,0 +1 @@
Fix crashes on Timeline [Thread] due to range validation

1
changelog.d/6463.bugfix Normal file
View File

@@ -0,0 +1 @@
Fix crashes when opening Thread

1
changelog.d/6469.bugfix Normal file
View File

@@ -0,0 +1 @@
Fix ConcurrentModificationException on BackgroundDetectionObserver

View File

@@ -7,6 +7,7 @@ def excludes = [
'**/*Activity*',
'**/*Fragment*',
'**/*Application*',
'**/*AndroidService*',
// We would like to exclude android widgets as well but our naming is inconsistent
@@ -24,11 +25,13 @@ def excludes = [
def initializeReport(report, projects, classExcludes) {
projects.each { project -> project.apply plugin: 'jacoco' }
report.executionData { fileTree(rootProject.rootDir.absolutePath).include(
"**/build/outputs/unit_test_code_coverage/**/*.exec",
"**/build/outputs/code_coverage/**/coverage.ec"
) }
report.executionData {
fileTree(rootProject.rootDir.absolutePath).include(
"**/build/**/*.exec",
"**/build/outputs/code_coverage/**/coverage.ec",
)
}
report.reports {
xml.enabled true
html.enabled true
@@ -43,13 +46,11 @@ def initializeReport(report, projects, classExcludes) {
switch (project) {
case { project.plugins.hasPlugin("com.android.application") }:
androidClassDirs.add("${project.buildDir}/tmp/kotlin-classes/gplayDebug")
androidSourceDirs.add("${project.buildDir}/generated/source/kapt/gplayDebug")
androidSourceDirs.add("${project.projectDir}/src/main/kotlin")
androidSourceDirs.add("${project.projectDir}/src/main/java")
break
case { project.plugins.hasPlugin("com.android.library") }:
androidClassDirs.add("${project.buildDir}/tmp/kotlin-classes/debug")
androidSourceDirs.add("${project.buildDir}/generated/source/kapt/debug")
androidSourceDirs.add("${project.projectDir}/src/main/kotlin")
androidSourceDirs.add("${project.projectDir}/src/main/java")
break
@@ -70,18 +71,21 @@ def collectProjects(predicate) {
return subprojects.findAll { it.buildFile.isFile() && predicate(it) }
}
task theCodeCoverageReport(type: JacocoReport) {
task generateCoverageReport(type: JacocoReport) {
outputs.upToDateWhen { false }
rootProject.apply plugin: 'jacoco'
tasks.withType(Test) {
jacoco.includeNoLocationClasses = true
}
def projects = collectProjects { ['vector','matrix-sdk-android'].contains(it.name) }
dependsOn {
[':vector:testGplayDebugUnitTest'] +
[':vector:connectedGplayDebugAndroidTest'] +
[':matrix-sdk-android:testDebugUnitTest'] +
[':matrix-sdk-android:connectedDebugAndroidTest']
}
def projects = collectProjects { ['vector', 'matrix-sdk-android'].contains(it.name) }
initializeReport(it, projects, excludes)
}
task unitTestsWithCoverage(type: GradleBuild) {
// the 7.1.3 android gradle plugin has a bug where enableTestCoverage generates invalid coverage
startParameter.projectProperties.coverage = [enableTestCoverage: false]
tasks = [':vector:testGplayDebugUnitTest', ':matrix-sdk-android:testDebugUnitTest']
}
task instrumentationTestsWithCoverage(type: GradleBuild) {
startParameter.projectProperties.coverage = [enableTestCoverage: true]
startParameter.projectProperties['android.testInstrumentationRunnerArguments.notPackage'] = 'im.vector.app.ui'
tasks = [':vector:connectedGplayDebugAndroidTest', 'matrix-sdk-android:connectedDebugAndroidTest']
}

View File

@@ -13,7 +13,7 @@ ext.versions = [
def gradle = "7.1.3"
// Ref: https://kotlinlang.org/releases.html
def kotlin = "1.6.21"
def kotlinCoroutines = "1.6.2"
def kotlinCoroutines = "1.6.3"
def dagger = "2.42"
def retrofit = "2.9.0"
def arrow = "0.8.2"
@@ -21,20 +21,21 @@ def markwon = "4.6.2"
def moshi = "1.13.0"
def lifecycle = "2.4.1"
def flowBinding = "1.2.0"
def flipper = "0.153.0"
def epoxy = "4.6.2"
def mavericks = "2.6.1"
def mavericks = "2.7.0"
def glide = "4.13.2"
def bigImageViewer = "1.8.1"
def jjwt = "0.11.5"
def vanniktechEmoji = "0.15.0"
def fragment = "1.5.0"
// Testing
def mockk = "1.12.4"
def mockk = "1.12.3" // We need to use 1.12.3 to have mocking in androidTest until a new version is released: https://github.com/mockk/mockk/issues/819
def espresso = "3.4.0"
def androidxTest = "1.4.0"
def androidxOrchestrator = "1.4.1"
ext.libs = [
gradle : [
'gradlePlugin' : "com.android.tools.build:gradle:$gradle",
@@ -48,12 +49,16 @@ ext.libs = [
'coroutinesTest' : "org.jetbrains.kotlinx:kotlinx-coroutines-test:$kotlinCoroutines"
],
androidx : [
'activity' : "androidx.activity:activity:1.4.0",
'annotation' : "androidx.annotation:annotation:1.4.0",
'activity' : "androidx.activity:activity:1.5.0",
'annotations' : "androidx.annotation:annotation:1.3.0",
'appCompat' : "androidx.appcompat:appcompat:1.4.2",
'biometric' : "androidx.biometric:biometric:1.1.0",
'core' : "androidx.core:core-ktx:1.8.0",
'recyclerview' : "androidx.recyclerview:recyclerview:1.2.1",
'exifinterface' : "androidx.exifinterface:exifinterface:1.3.3",
'fragmentKtx' : "androidx.fragment:fragment-ktx:1.4.1",
'fragmentKtx' : "androidx.fragment:fragment-ktx:$fragment",
'fragmentTesting' : "androidx.fragment:fragment-testing:$fragment",
'constraintLayout' : "androidx.constraintlayout:constraintlayout:2.1.4",
'work' : "androidx.work:work-runtime-ktx:2.7.1",
'autoFill' : "androidx.autofill:autofill:1.1.0",
@@ -84,10 +89,16 @@ ext.libs = [
'dagger' : "com.google.dagger:dagger:$dagger",
'daggerCompiler' : "com.google.dagger:dagger-compiler:$dagger",
'hilt' : "com.google.dagger:hilt-android:$dagger",
'hiltAndroidTesting' : "com.google.dagger:hilt-android-testing:$dagger",
'hiltCompiler' : "com.google.dagger:hilt-compiler:$dagger"
],
flipper : [
'flipper' : "com.facebook.flipper:flipper:$flipper",
'flipperNetworkPlugin' : "com.facebook.flipper:flipper-network-plugin:$flipper",
],
squareup : [
'moshi' : "com.squareup.moshi:moshi:$moshi",
'moshiKt' : "com.squareup.moshi:moshi-kotlin:$moshi",
'moshiKotlin' : "com.squareup.moshi:moshi-kotlin-codegen:$moshi",
'retrofit' : "com.squareup.retrofit2:retrofit:$retrofit",
'retrofitMoshi' : "com.squareup.retrofit2:converter-moshi:$retrofit"
@@ -153,3 +164,5 @@ ext.libs = [
'junit' : "junit:junit:4.13.2"
]
]

View File

@@ -9,6 +9,7 @@ ext.groups = [
'com.github.jetradarmobile',
'com.github.MatrixFrog',
'com.github.tapadoo',
'com.github.UnifiedPush',
'com.github.vector-im',
'com.github.yalantis',
'com.github.Zhuinden',
@@ -31,6 +32,7 @@ ext.groups = [
],
group: [
'com.android',
'com.android.ndk.thirdparty',
'com.android.tools',
'com.google.firebase',
'com.google.testing.platform',
@@ -52,6 +54,7 @@ ext.groups = [
'com.dropbox.core',
'com.soywiz.korlibs.korte',
'com.facebook.fbjni',
'com.facebook.flipper',
'com.facebook.fresco',
'com.facebook.infer.annotation',
'com.facebook.soloader',
@@ -93,6 +96,7 @@ ext.groups = [
'com.ibm.icu',
'com.jakewharton.android.repackaged',
'com.jakewharton.timber',
'com.kgurgul.flipper',
'com.linkedin.dexmaker',
'com.mapbox.mapboxsdk',
'com.nulab-inc',
@@ -168,6 +172,7 @@ ext.groups = [
'org.glassfish.jaxb',
'org.hamcrest',
'org.jacoco',
'org.java-websocket',
'org.jetbrains',
'org.jetbrains.dokka',
'org.jetbrains.intellij.deps',

58
docs/flipper.md Normal file
View File

@@ -0,0 +1,58 @@
# Flipper
<!--- TOC -->
* [Introduction](#introduction)
* [Setup](#setup)
* [Troubleshoot](#troubleshoot)
* [No device found issue](#no-device-found-issue)
* [Diagnostic Activity](#diagnostic-activity)
* [Other](#other)
* [Links](#links)
<!--- END -->
## Introduction
[Flipper](https://fbflipper.com) is a powerful tool from Meta, which allow to inspect the running application details and states from your computer.
Flipper is configured in the Element Android project to let the developers be able to:
- inspect all the Realm databases content;
- do layout inspection;
- see the crash logs;
- see the logcat;
- see all the network requests;
- see all the SharedPreferences;
- take screenshots and record videos of the device;
- and more!
## Setup
- Install Flipper on your computer. Follow instructions here: https://fbflipper.com/docs/getting-started/index/
- Run the debug version of Element on an emulator or on a real device.
### Troubleshoot
#### No device found issue
The configuration of the Flipper application has to be updated. The issue has been asked and answered here: https://stackoverflow.com/questions/71744103/android-emulator-unable-to-connect-to-flipper/72608113#72608113
#### Diagnostic Activity
Flipper comes with a Diagnostic Activity that you can start from command line using:
```shell
adb shell am start -n im.vector.app.debug/com.facebook.flipper.android.diagnostics.FlipperDiagnosticActivity
```
It provides some log which can help to figure out what's going on client side.
#### Other
https://fbflipper.com/docs/getting-started/troubleshooting/android/ may help.
## Links
- Official Flipper website: https://fbflipper.com
- Realm Plugin for Flipper: https://github.com/kamgurgul/Flipper-Realm
- Dedicated Matrix room: https://matrix.to/#/#unifiedpush:matrix.org

View File

@@ -83,15 +83,16 @@ Exceptions can occur:
##### PR Review Assignment
We use automatic assignment for PR reviews. A PR is automatically routed by GitHub to 2 team members using the round robin algorithm. The process is the following:
We use automatic assignment for PR reviews. **A PR is automatically routed by GitHub to one team member** using the round robin algorithm. Additional reviewers can be used for complex changes or when the first reviewer is not confident enough on the changes.
The process is the following:
- The PR creator can assign specific people if they have another Android developer in their team or they think a specific reviewer should take a look at the PR.
- If there are missing reviewers, the PR creator assigns the [element-android-reviewers](https://github.com/orgs/vector-im/teams/element-android-reviewers) team as a reviewer.
- GitHub automatically assigns other reviewers. If one of the chosen reviewers is not available (holiday, etc.), remove them and set again the team, GitHub will select another reviewer.
- The PR creator selects the [element-android-reviewers](https://github.com/orgs/vector-im/teams/element-android-reviewers) team as a reviewer.
- GitHub automatically assign the reviewer. If the reviewer is not available (holiday, etc.), remove them and set again the team, GitHub will select another reviewer.
- Alternatively, the PR creator can directly assign specific people if they have another Android developer in their team or they think a specific reviewer should take a look at their PR.
- Reviewers get a notification to make the review: they review the code following the good practice (see the rest of this document).
- After making their own review, if they feel not confident enough, they can ask another person for a full review, or they can tag someone within a PR comment to check specific lines.
For PRs coming from the community, the issue wrangler can assign either the team [element-android-reviewers](https://github.com/orgs/vector-im/teams/element-android-reviewers) or any members directly.
For PRs coming from the community, the issue wrangler can assign either the team [element-android-reviewers](https://github.com/orgs/vector-im/teams/element-android-reviewers) or any member directly.
##### PR review time
@@ -102,6 +103,7 @@ Some tips to achieve it:
- Set up your GH notifications correctly
- Check your pulls page: [https://github.com/pulls](https://github.com/pulls)
- Check your pending assigned PRs before starting or resuming your day to day tasks
- If you are busy with high priority tasks, inform the author. They will find another developer
It is hard to define a deadline for a review. It depends on the PR size and the complexity. Let's start with a goal of 24h (working day!) for a PR smaller than 500 lines. If bigger, the submitter and the reviewer should discuss.
@@ -189,7 +191,7 @@ Examples of prefixes:
- `[Bugfix]`
- etc.
Also, it's still possible to add labels to the PRs, such as `A-` or `T-` labels, even if this is not a string requirement. We prefer to spend time to add labels on issues.
Also, it's still possible to add labels to the PRs, such as `A-` or `T-` labels, even if this is not a strong requirement. We prefer to spend time to add labels on issues.
##### PR description

58
docs/unifiedpush.md Normal file
View File

@@ -0,0 +1,58 @@
# UnifiedPush
<!--- TOC -->
* [Introduction](#introduction)
* [Configuration in Element-Android and their forks](#configuration-in-element-android-and-their-forks)
* [Enabling and disabling the feature](#enabling-and-disabling-the-feature)
* [Override the configuration at runtime](#override-the-configuration-at-runtime)
* [Enabling the feature](#enabling-the-feature)
* [Disabling the feature](#disabling-the-feature)
* [Useful links](#useful-links)
<!--- END -->
## Introduction
The recently started UnifiedPush project is an Android protocol and library for apps to be able to receive distributor-agnostic push notifications.
The *F-Droid* and *Gplay* flavors of Element Android support UnifiedPush, so the user can use any distributor installed on their devices. This would make it possible to have push notifications without depending on Google services or libraries. Currently, the main distributors are [ntfy](https://ntfy.sh) which does not require any setup (like manual registration) to use the public server and [NextPush](https://github.com/UP-NextPush/android), available as a nextcloud application.
The *Gplay* variant uses a UnifiedPush library which basically embed a FCM distributor built into the application (so a user doesn't need to do anything other than install the app to get FCM notifications). This variant uses Google Services to receive notifications if the user has not installed any distributor.
The *F-Droid* variant does not use this library to avoid any proprietary blob. It will use a polling service if the user has not installed any distributor.
In all cases, if there are other distributors available, the user will have to opt-in to one of them in the preferences.
## Configuration in Element-Android and their forks
### Enabling and disabling the feature
Allowing the user to use an alternative distributor can be changed in [Config](../vector-config/src/main/java/im/vector/app/config/Config.kt). The flag is named `ALLOW_EXTERNAL_UNIFIED_PUSH_DISTRIBUTORS`. Default value is `true`.
#### Override the configuration at runtime
On debug version, it is possible to override this configuration at runtime, using the `Feature` screen. The Feature is named `Allow external UnifiedPush distributors`.
#### Enabling the feature
This is the default behavior of Element Android.
If `ALLOW_EXTERNAL_UNIFIED_PUSH_DISTRIBUTORS` is set to true, it allows any available external UnifiedPush distributor to be chosen by the user.
- For Gplay variant it means that FCM will be used by default, but user can choose another UnifiedPush distributor;
- For F-Droid variant, it means that background polling will be used by default, but user can choose another UnifiedPush distributor.
- On the UI, the setting to choose an alternative distributor will be visible to the user, and some tests in the notification troubleshoot screen will shown.
- For F-Droid, if the user has chosen a distributor, the settings to configure the background polling will be hidden.
#### Disabling the feature
If `ALLOW_EXTERNAL_UNIFIED_PUSH_DISTRIBUTORS` is set to false, it prevents the usage of external UnifiedPush distributors.
- For Gplay variant it means that only FCM will be used;
- For F-Droid variant, it means that only background polling will be used.
- On the UI, the setting to choose an alternative distributor will be hidden to the user, and some tests in the notification troubleshoot screen will be hidden.
### Useful links
- UnifiedPush official website: [https://unifiedpush.org/](https://unifiedpush.org/)
- List of available distributors can be retrieved here: [https://unifiedpush.org/users/distributors/](https://unifiedpush.org/users/distributors/)
- UnifiedPush project discussion can occurs here: [#unifiedpush:matrix.org](https://matrix.to/#/#unifiedpush:matrix.org)

View File

@@ -0,0 +1,2 @@
Hlavní změny v této verzi: Opravy různých chyb a vylepšení stability.
Úplný seznam změn: https://github.com/vector-im/element-android/releases

View File

@@ -0,0 +1,2 @@
Hlavní změny v této verzi: Opravy různých chyb a vylepšení stability.
Úplný seznam změn: https://github.com/vector-im/element-android/releases

View File

@@ -0,0 +1,2 @@
Hlavní změny v této verzi: Opravy různých chyb a vylepšení stability.
Úplný seznam změn: https://github.com/vector-im/element-android/releases

View File

@@ -0,0 +1,2 @@
Main changes in this version: Various bug fixes and stability improvements.
Full changelog: https://github.com/vector-im/element-android/releases

View File

@@ -0,0 +1,2 @@
Main changes in this version: Various bug fixes and stability improvements.
Full changelog: https://github.com/vector-im/element-android/releases

View File

@@ -0,0 +1,2 @@
Main changes in this version: Various bug fixes and stability improvements.
Full changelog: https://github.com/vector-im/element-android/releases

View File

@@ -0,0 +1,2 @@
Main changes in this version: Use UnifiedPush and allows user to have push without FCM.
Full changelog: https://github.com/vector-im/element-android/releases

View File

@@ -0,0 +1,2 @@
Main changes in this version: Various bug fixes and stability improvements.
Full changelog: https://github.com/vector-im/element-android/releases

View File

@@ -0,0 +1,2 @@
Põhilised muutused selles versioonis: erinevate vigade parandused ja stabiilsust edendavad kohendused.
Kogu ingliskeelne muudatuste logi: https://github.com/vector-im/element-android/releases

View File

@@ -0,0 +1,2 @@
Põhilised muutused selles versioonis: erinevate vigade parandused ja stabiilsust edendavad kohendused.
Kogu ingliskeelne muudatuste logi: https://github.com/vector-im/element-android/releases

View File

@@ -0,0 +1,2 @@
Põhilised muutused selles versioonis: erinevate vigade parandused ja stabiilsust edendavad kohendused.
Kogu ingliskeelne muudatuste logi: https://github.com/vector-im/element-android/releases

View File

@@ -0,0 +1,2 @@
تغییرات عمده در این نگارش: رفع اشکال‌های مختلف و بهبودهای پایداری.
گزارش دگرگونی کامل: https://github.com/vector-im/element-android/releases

View File

@@ -0,0 +1,2 @@
تغییرات عمده در این نگارش: رفع اشکال‌های مختلف و بهبودهای پایداری.
گزارش دگرگونی کامل: https://github.com/vector-im/element-android/releases

View File

@@ -0,0 +1,2 @@
تغییرات عمده در این نگارش: رفع اشکال‌های مختلف و بهبودهای پایداری.
گزارش دگرگونی کامل: https://github.com/vector-im/element-android/releases

View File

@@ -0,0 +1,2 @@
Principaux changements pour cette version : Plusieurs corrections de bogues et daméliorations de stabilité.
Intégralité des changements : https://github.com/vector-im/element-android/releases

View File

@@ -0,0 +1,2 @@
Principaux changements pour cette version : Plusieurs corrections de bogues et daméliorations de stabilité.
Intégralité des changements : https://github.com/vector-im/element-android/releases

View File

@@ -0,0 +1,2 @@
Principaux changements pour cette version : Plusieurs corrections de bogues et daméliorations de stabilité.
Intégralité des changements : https://github.com/vector-im/element-android/releases

View File

@@ -0,0 +1,2 @@
Perubahan utama dalam versi ini: Banyak perbaikan kutu dan perbaikan stabilitas.
Catatan perubahan lanjutan: https://github.com/vector-im/element-android/releases

View File

@@ -0,0 +1,2 @@
Perubahan utama dalam versi ini: Banyak perbaikan kutu dan perbaikan stabilitas.
Catatan perubahan lanjutan: https://github.com/vector-im/element-android/releases

View File

@@ -0,0 +1,2 @@
Perubahan utama dalam versi ini: Banyak perbaikan kutu dan perbaikan stabilitas.
Catatan perubahan lanjutan: https://github.com/vector-im/element-android/releases

View File

@@ -0,0 +1,2 @@
Modifiche principali in questa versione: varie correzioni di errori e miglioramenti della stabilità.
Cronologia completa: https://github.com/vector-im/element-android/releases

View File

@@ -0,0 +1,2 @@
Modifiche principali in questa versione: varie correzioni di errori e miglioramenti della stabilità.
Cronologia completa: https://github.com/vector-im/element-android/releases

View File

@@ -0,0 +1,2 @@
Modifiche principali in questa versione: varie correzioni di errori e miglioramenti della stabilità.
Cronologia completa: https://github.com/vector-im/element-android/releases

View File

@@ -0,0 +1,2 @@
Principais mudanças nesta versão: Vários consertos de bugs e melhorias de estabilidade.
Changelog completo: https://github.com/vector-im/element-android/releases

View File

@@ -0,0 +1,2 @@
Principais mudanças nesta versão: Vários consertos de bugs e melhorias de estabilidade.
Changelog completo: https://github.com/vector-im/element-android/releases

View File

@@ -0,0 +1,2 @@
Principais mudanças nesta versão: Vários consertos de bugs e melhorias de estabilidade.
Changelog completo: https://github.com/vector-im/element-android/releases

View File

@@ -0,0 +1,2 @@
Hlavné zmeny v tejto verzii: Rôzne opravy chýb a vylepšenia stability.
Úplný zoznam zmien: https://github.com/vector-im/element-android/releases

View File

@@ -0,0 +1,2 @@
Hlavné zmeny v tejto verzii: Rôzne opravy chýb a vylepšenia stability.
Úplný zoznam zmien: https://github.com/vector-im/element-android/releases

View File

@@ -0,0 +1,2 @@
Hlavné zmeny v tejto verzii: Rôzne opravy chýb a vylepšenia stability.
Úplný zoznam zmien: https://github.com/vector-im/element-android/releases

View File

@@ -0,0 +1,2 @@
Huvudsakliga ändringar i den här versionen: Diverse buggfixar och stabilitetsförbättringar.
Full ändringslogg: https://github.com/vector-im/element-android/releases

View File

@@ -0,0 +1,2 @@
Huvudsakliga ändringar i den här versionen: Diverse buggfixar och stabilitetsförbättringar.
Full ändringslogg: https://github.com/vector-im/element-android/releases

View File

@@ -0,0 +1,2 @@
Huvudsakliga ändringar i den här versionen: Diverse buggfixar och stabilitetsförbättringar.
Full ändringslogg: https://github.com/vector-im/element-android/releases

View File

@@ -1,2 +1,2 @@
Основні зміни в цій версії: Початкова реалізація тредів повідомлень. Повідомлення бульбашки.
Основні зміни в цій версії: Початкова реалізація гілок повідомлень. Повідомлення бульбашки.
Вичерпний перелік змін: https://github.com/vector-im/element-android/releases/tag/v1.4.0

View File

@@ -1,2 +1,2 @@
Основні зміни в цій версії: Хронологія тредів працює наживо і швидше. Усунуто різні вади й поліпшено стабільність.
Основні зміни в цій версії: Хронологія гілок працює наживо і швидше. Усунуто різні вади й поліпшено стабільність.
Вичерпний перелік змін: https://github.com/vector-im/element-android/releases/tag/v1.4.6

View File

@@ -1,2 +1,2 @@
Основні зміни в цій версії: Хронологія тредів працює наживо і швидше. Усунуто різні вади й поліпшено стабільність.
Основні зміни в цій версії: Хронологія гілок працює наживо і швидше. Усунуто різні вади й поліпшено стабільність.
Вичерпний перелік змін: https://github.com/vector-im/element-android/releases

View File

@@ -0,0 +1,2 @@
Основні зміни в цій версії: Усунуто різні вади й поліпшено стабільність.
Вичерпний перелік змін: https://github.com/vector-im/element-android/releases

View File

@@ -0,0 +1,2 @@
Основні зміни в цій версії: Усунуто різні вади й поліпшено стабільність.
Вичерпний перелік змін: https://github.com/vector-im/element-android/releases

View File

@@ -0,0 +1,2 @@
Основні зміни в цій версії: Усунуто різні вади й поліпшено стабільність.
Вичерпний перелік змін: https://github.com/vector-im/element-android/releases

View File

@@ -0,0 +1,2 @@
此版本中的主要變動:多個臭蟲修復與穩定性改善。
完整的變更紀錄https://github.com/vector-im/element-android/releases

View File

@@ -0,0 +1,2 @@
此版本中的主要變動:多個臭蟲修復與穩定性改善。
完整的變更紀錄https://github.com/vector-im/element-android/releases

View File

@@ -0,0 +1,2 @@
此版本中的主要變動:多個臭蟲修復與穩定性改善。
完整的變更紀錄https://github.com/vector-im/element-android/releases

View File

@@ -2,7 +2,6 @@ apply plugin: 'com.android.library'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-parcelize'
apply plugin: 'kotlin-kapt'
apply plugin: 'com.jakewharton.butterknife'
buildscript {
repositories {
@@ -15,9 +14,6 @@ buildscript {
url 'https://repo1.maven.org/maven2'
}
}
dependencies {
classpath 'com.jakewharton:butterknife-gradle-plugin:10.2.3'
}
}
android {

View File

@@ -29,7 +29,7 @@ import com.airbnb.epoxy.EpoxyModelClass
import com.airbnb.epoxy.EpoxyModelWithHolder
import im.vector.lib.core.utils.epoxy.charsequence.EpoxyCharSequence
@EpoxyModelClass(layout = R2.layout.item_jv_base_value)
@EpoxyModelClass
internal abstract class ValueItem : EpoxyModelWithHolder<ValueItem.Holder>() {
@EpoxyAttribute
@@ -44,6 +44,8 @@ internal abstract class ValueItem : EpoxyModelWithHolder<ValueItem.Holder>() {
@EpoxyAttribute(EpoxyAttribute.Option.DoNotHash)
var itemClickListener: View.OnClickListener? = null
override fun getDefaultLayout() = R.layout.item_jv_base_value
override fun bind(holder: Holder) {
super.bind(holder)
holder.textView.text = text?.charSequence

View File

@@ -49,7 +49,7 @@ class MediaPicker : Picker<MultiPickerBaseMediaType>() {
return Intent(Intent.ACTION_GET_CONTENT).apply {
addCategory(Intent.CATEGORY_OPENABLE)
putExtra(Intent.EXTRA_ALLOW_MULTIPLE, !single)
type = "video/*, image/*"
type = "*/*"
val mimeTypes = arrayOf("image/*", "video/*")
putExtra(Intent.EXTRA_MIME_TYPES, mimeTypes)
}

10
library/opusencoder/.gitignore vendored Normal file
View File

@@ -0,0 +1,10 @@
*.iml
.gradle
/local.properties
/.idea
.DS_Store
/build
/captures
*.cxx
app/.cxx/*
.externalNativeBuild

View File

@@ -0,0 +1,40 @@
apply plugin: 'com.android.library'
apply plugin: 'kotlin-android'
android {
ndkVersion "21.3.6528147"
compileSdkVersion 31
buildToolsVersion "31.0.0"
defaultConfig {
minSdkVersion 18
targetSdkVersion 31
versionCode 1
versionName "1.0"
externalNativeBuild {
ndk {
abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
}
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
externalNativeBuild {
cmake {
path "src/main/cpp/CMakeLists.txt"
}
}
}
dependencies {
implementation libs.androidx.annotation
}

View File

@@ -0,0 +1,2 @@
<?xml version="1.0"?>
<manifest package="im.vector.opusencoder" xmlns:android="http://schemas.android.com/apk/res/android"/>

View File

@@ -0,0 +1,61 @@
# For more information about using CMake with Android Studio, read the
# documentation: https://d.android.com/studio/projects/add-native-code.html
# Sets the minimum version of CMake required to build the native library.
cmake_minimum_required(VERSION 3.4.1)
set(CMAKE_CXX_STANDARD 14)
# Creates and names a library, sets it as either STATIC
# or SHARED, and provides the relative paths to its source code.
# You can define multiple libraries, and CMake builds them for you.
# Gradle automatically packages shared libraries with your APK.
set(distribution_OPUS_DIR ${CMAKE_SOURCE_DIR}/opus)
add_library(lib_opus SHARED IMPORTED)
set_target_properties(lib_opus PROPERTIES IMPORTED_LOCATION
${distribution_OPUS_DIR}/libs/${ANDROID_ABI}/libopus.so)
add_library(lib_opusenc SHARED IMPORTED)
set_target_properties(lib_opusenc PROPERTIES IMPORTED_LOCATION
${distribution_OPUS_DIR}/libs/${ANDROID_ABI}/libopusenc.so)
add_library( # Sets the name of the library.
opuscodec
# Sets the library as a shared library.
SHARED
# Provides a relative path to your source file(s).
codec/CodecOggOpus.cpp
opuscodec.cpp)
target_include_directories(opuscodec PRIVATE
${distribution_OPUS_DIR}/include)
# Searches for a specified prebuilt library and stores the path as a
# variable. Because CMake includes system libraries in the search path by
# default, you only need to specify the name of the public NDK library
# you want to add. CMake verifies that the library exists before
# completing its build.
find_library( # Sets the name of the path variable.
log-lib
# Specifies the name of the NDK library that
# you want CMake to locate.
log )
# Specifies libraries CMake should link to your target library. You
# can link multiple libraries, such as libraries you define in this
# build script, prebuilt third-party libraries, or system libraries.
target_link_libraries( # Specifies the target library.
opuscodec
android
lib_opusenc
lib_opus
# Links the target library to the log library
# included in the NDK.
${log-lib} )

View File

@@ -0,0 +1,63 @@
/*
* Copyright (c) 2022 New Vector Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "CodecOggOpus.h"
#include "../utils/Logger.h"
int ret;
int CodecOggOpus::encoderInit(char* filePath, int sampleRate) {
// Create default, empty comment header
comments = ope_comments_create();
// Mono audio
int numChannels = 1;
// Channel Mapping Family 0, used for mono/stereo streams
int family = 0;
// Create encoder to encode PCM chunks and write the result to a file with the OggOpus framing
encoder = ope_encoder_create_file(filePath, comments, sampleRate, numChannels, family, &ret);
if (ret != OPE_OK) {
LOGE(TAG, "Creation of OggOpusEnc failed.");
return ret;
}
return OPE_OK;
}
int CodecOggOpus::setBitrate(int bitrate) {
ret = ope_encoder_ctl(encoder, OPUS_SET_BITRATE_REQUEST, bitrate);
if (ret != OPE_OK) {
LOGE(TAG, "Could not set bitrate.");
return ret;
}
return OPE_OK;
}
int CodecOggOpus::writeFrame(short* frame, int samplesPerChannel) {
// Encode the raw PCM-16 buffer to Opus and write it to the ogg file
return ope_encoder_write(encoder, frame, samplesPerChannel);
}
void CodecOggOpus::encoderRelease() {
// Finish any pending encode/write operations
ope_encoder_drain(encoder);
// De-init the encoder instance
ope_encoder_destroy(encoder);
// De-init the comment header struct
ope_comments_destroy(comments);
}
CodecOggOpus::~CodecOggOpus() {
encoderRelease();
}

View File

@@ -0,0 +1,52 @@
/*
* Copyright (c) 2022 New Vector Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef ELEMENT_ANDROID_CODECOGGOPUS_H
#define ELEMENT_ANDROID_CODECOGGOPUS_H
#include <opusenc.h>
/**
* This class is a wrapper around libopusenc, used to encode and write Opus frames into an Ogg file.
*
* The usual flow would be:
*
* 1. Use encoderInit to initialize the internal encoder with the sample rate and the path to write the encoded frames to.
* 2. (Optional) set the bitrate to use.
* 3. While recording, read PCM-16 chunks from the recorder, feed them to the encoder using writeFrame.
* 4. When finished, call encoderRelease to free some resources.
*/
class CodecOggOpus {
private:
const char *TAG = "CodecOggOpus";
OggOpusEnc* encoder;
OggOpusComments* comments;
public:
int encoderInit(char* filePath, int sampleRate);
int setBitrate(int bitrate);
int writeFrame(short *frame, int samplesPerChannel);
void encoderRelease();
~CodecOggOpus();
};
#endif //ELEMENT_ANDROID_CODECOGGOPUS_H

View File

@@ -0,0 +1,981 @@
/* Copyright (c) 2010-2011 Xiph.Org Foundation, Skype Limited
Written by Jean-Marc Valin and Koen Vos */
/*
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.h
* @brief Opus reference implementation API
*/
#ifndef OPUS_H
#define OPUS_H
#include "opus_types.h"
#include "opus_defines.h"
#ifdef __cplusplus
extern "C" {
#endif
/**
* @mainpage Opus
*
* The Opus codec is designed for interactive speech and audio transmission over the Internet.
* It is designed by the IETF Codec Working Group and incorporates technology from
* Skype's SILK codec and Xiph.Org's CELT codec.
*
* The Opus codec is designed to handle a wide range of interactive audio applications,
* including Voice over IP, videoconferencing, in-game chat, and even remote live music
* performances. It can scale from low bit-rate narrowband speech to very high quality
* stereo music. Its main features are:
* @li Sampling rates from 8 to 48 kHz
* @li Bit-rates from 6 kb/s to 510 kb/s
* @li Support for both constant bit-rate (CBR) and variable bit-rate (VBR)
* @li Audio bandwidth from narrowband to full-band
* @li Support for speech and music
* @li Support for mono and stereo
* @li Support for multichannel (up to 255 channels)
* @li Frame sizes from 2.5 ms to 60 ms
* @li Good loss robustness and packet loss concealment (PLC)
* @li Floating point and fixed-point implementation
*
* Documentation sections:
* @li @ref opus_encoder
* @li @ref opus_decoder
* @li @ref opus_repacketizer
* @li @ref opus_multistream
* @li @ref opus_libinfo
* @li @ref opus_custom
*/
/** @defgroup opus_encoder Opus Encoder
* @{
*
* @brief This page describes the process and functions used to encode Opus.
*
* Since Opus is a stateful codec, the encoding process starts with creating an encoder
* state. This can be done with:
*
* @code
* int error;
* OpusEncoder *enc;
* enc = opus_encoder_create(Fs, channels, application, &error);
* @endcode
*
* From this point, @c enc can be used for encoding an audio stream. An encoder state
* @b must @b not be used for more than one stream at the same time. Similarly, the encoder
* state @b must @b not be re-initialized for each frame.
*
* While opus_encoder_create() allocates memory for the state, it's also possible
* to initialize pre-allocated memory:
*
* @code
* int size;
* int error;
* OpusEncoder *enc;
* size = opus_encoder_get_size(channels);
* enc = malloc(size);
* error = opus_encoder_init(enc, Fs, channels, application);
* @endcode
*
* where opus_encoder_get_size() returns the required size for the encoder state. Note that
* future versions of this code may change the size, so no assuptions should be made about it.
*
* The encoder state is always continuous in memory and only a shallow copy is sufficient
* to copy it (e.g. memcpy())
*
* It is possible to change some of the encoder's settings using the opus_encoder_ctl()
* interface. All these settings already default to the recommended value, so they should
* only be changed when necessary. The most common settings one may want to change are:
*
* @code
* opus_encoder_ctl(enc, OPUS_SET_BITRATE(bitrate));
* opus_encoder_ctl(enc, OPUS_SET_COMPLEXITY(complexity));
* opus_encoder_ctl(enc, OPUS_SET_SIGNAL(signal_type));
* @endcode
*
* where
*
* @arg bitrate is in bits per second (b/s)
* @arg complexity is a value from 1 to 10, where 1 is the lowest complexity and 10 is the highest
* @arg signal_type is either OPUS_AUTO (default), OPUS_SIGNAL_VOICE, or OPUS_SIGNAL_MUSIC
*
* See @ref opus_encoderctls and @ref opus_genericctls for a complete list of parameters that can be set or queried. Most parameters can be set or changed at any time during a stream.
*
* To encode a frame, opus_encode() or opus_encode_float() must be called with exactly one frame (2.5, 5, 10, 20, 40 or 60 ms) of audio data:
* @code
* len = opus_encode(enc, audio_frame, frame_size, packet, max_packet);
* @endcode
*
* where
* <ul>
* <li>audio_frame is the audio data in opus_int16 (or float for opus_encode_float())</li>
* <li>frame_size is the duration of the frame in samples (per channel)</li>
* <li>packet is the byte array to which the compressed data is written</li>
* <li>max_packet is the maximum number of bytes that can be written in the packet (4000 bytes is recommended).
* Do not use max_packet to control VBR target bitrate, instead use the #OPUS_SET_BITRATE CTL.</li>
* </ul>
*
* opus_encode() and opus_encode_float() return the number of bytes actually written to the packet.
* The return value <b>can be negative</b>, which indicates that an error has occurred. If the return value
* is 2 bytes or less, then the packet does not need to be transmitted (DTX).
*
* Once the encoder state if no longer needed, it can be destroyed with
*
* @code
* opus_encoder_destroy(enc);
* @endcode
*
* If the encoder was created with opus_encoder_init() rather than opus_encoder_create(),
* then no action is required aside from potentially freeing the memory that was manually
* allocated for it (calling free(enc) for the example above)
*
*/
/** Opus encoder state.
* This contains the complete state of an Opus encoder.
* It is position independent and can be freely copied.
* @see opus_encoder_create,opus_encoder_init
*/
typedef struct OpusEncoder OpusEncoder;
/** Gets the size of an <code>OpusEncoder</code> structure.
* @param[in] channels <tt>int</tt>: Number of channels.
* This must be 1 or 2.
* @returns The size in bytes.
*/
OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_encoder_get_size(int channels);
/**
*/
/** Allocates and initializes an encoder state.
* There are three coding modes:
*
* @ref OPUS_APPLICATION_VOIP gives best quality at a given bitrate for voice
* signals. It enhances the input signal by high-pass filtering and
* emphasizing formants and harmonics. Optionally it includes in-band
* forward error correction to protect against packet loss. Use this
* mode for typical VoIP applications. Because of the enhancement,
* even at high bitrates the output may sound different from the input.
*
* @ref OPUS_APPLICATION_AUDIO gives best quality at a given bitrate for most
* non-voice signals like music. Use this mode for music and mixed
* (music/voice) content, broadcast, and applications requiring less
* than 15 ms of coding delay.
*
* @ref OPUS_APPLICATION_RESTRICTED_LOWDELAY configures low-delay mode that
* disables the speech-optimized mode in exchange for slightly reduced delay.
* This mode can only be set on an newly initialized or freshly reset encoder
* because it changes the codec delay.
*
* This is useful when the caller knows that the speech-optimized modes will not be needed (use with caution).
* @param [in] Fs <tt>opus_int32</tt>: Sampling rate of input signal (Hz)
* This must be one of 8000, 12000, 16000,
* 24000, or 48000.
* @param [in] channels <tt>int</tt>: Number of channels (1 or 2) in input signal
* @param [in] application <tt>int</tt>: Coding mode (@ref OPUS_APPLICATION_VOIP/@ref OPUS_APPLICATION_AUDIO/@ref OPUS_APPLICATION_RESTRICTED_LOWDELAY)
* @param [out] error <tt>int*</tt>: @ref opus_errorcodes
* @note Regardless of the sampling rate and number channels selected, the Opus encoder
* can switch to a lower audio bandwidth or number of channels if the bitrate
* selected is too low. This also means that it is safe to always use 48 kHz stereo input
* and let the encoder optimize the encoding.
*/
OPUS_EXPORT OPUS_WARN_UNUSED_RESULT OpusEncoder *opus_encoder_create(
opus_int32 Fs,
int channels,
int application,
int *error
);
/** Initializes a previously allocated encoder state
* The memory pointed to by st must be at least the size returned by opus_encoder_get_size().
* This is intended for applications which use their own allocator instead of malloc.
* @see opus_encoder_create(),opus_encoder_get_size()
* To reset a previously initialized state, use the #OPUS_RESET_STATE CTL.
* @param [in] st <tt>OpusEncoder*</tt>: Encoder state
* @param [in] Fs <tt>opus_int32</tt>: Sampling rate of input signal (Hz)
* This must be one of 8000, 12000, 16000,
* 24000, or 48000.
* @param [in] channels <tt>int</tt>: Number of channels (1 or 2) in input signal
* @param [in] application <tt>int</tt>: Coding mode (OPUS_APPLICATION_VOIP/OPUS_APPLICATION_AUDIO/OPUS_APPLICATION_RESTRICTED_LOWDELAY)
* @retval #OPUS_OK Success or @ref opus_errorcodes
*/
OPUS_EXPORT int opus_encoder_init(
OpusEncoder *st,
opus_int32 Fs,
int channels,
int application
) OPUS_ARG_NONNULL(1);
/** Encodes an Opus frame.
* @param [in] st <tt>OpusEncoder*</tt>: Encoder state
* @param [in] pcm <tt>opus_int16*</tt>: Input signal (interleaved if 2 channels). length is frame_size*channels*sizeof(opus_int16)
* @param [in] 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 opus_int32 opus_encode(
OpusEncoder *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 an Opus frame from floating point input.
* @param [in] st <tt>OpusEncoder*</tt>: Encoder state
* @param [in] pcm <tt>float*</tt>: Input in float format (interleaved if 2 channels), 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.
* length is frame_size*channels*sizeof(float)
* @param [in] 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 opus_int32 opus_encode_float(
OpusEncoder *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>OpusEncoder</code> allocated by opus_encoder_create().
* @param[in] st <tt>OpusEncoder*</tt>: State to be freed.
*/
OPUS_EXPORT void opus_encoder_destroy(OpusEncoder *st);
/** Perform a CTL function on an Opus encoder.
*
* Generally the request and subsequent arguments are generated
* by a convenience macro.
* @param st <tt>OpusEncoder*</tt>: Encoder state.
* @param request This and all remaining parameters should be replaced by one
* of the convenience macros in @ref opus_genericctls or
* @ref opus_encoderctls.
* @see opus_genericctls
* @see opus_encoderctls
*/
OPUS_EXPORT int opus_encoder_ctl(OpusEncoder *st, int request, ...) OPUS_ARG_NONNULL(1);
/**@}*/
/** @defgroup opus_decoder Opus Decoder
* @{
*
* @brief This page describes the process and functions used to decode Opus.
*
* The decoding process also starts with creating a decoder
* state. This can be done with:
* @code
* int error;
* OpusDecoder *dec;
* dec = opus_decoder_create(Fs, channels, &error);
* @endcode
* where
* @li Fs is the sampling rate and must be 8000, 12000, 16000, 24000, or 48000
* @li channels is the number of channels (1 or 2)
* @li error will hold the error code in case of failure (or #OPUS_OK on success)
* @li the return value is a newly created decoder state to be used for decoding
*
* While opus_decoder_create() allocates memory for the state, it's also possible
* to initialize pre-allocated memory:
* @code
* int size;
* int error;
* OpusDecoder *dec;
* size = opus_decoder_get_size(channels);
* dec = malloc(size);
* error = opus_decoder_init(dec, Fs, channels);
* @endcode
* where opus_decoder_get_size() returns the required size for the decoder state. Note that
* future versions of this code may change the size, so no assuptions should be made about it.
*
* The decoder state is always continuous in memory and only a shallow copy is sufficient
* to copy it (e.g. memcpy())
*
* To decode a frame, opus_decode() or opus_decode_float() must be called with a packet of compressed audio data:
* @code
* frame_size = opus_decode(dec, packet, len, decoded, max_size, 0);
* @endcode
* where
*
* @li packet is the byte array containing the compressed data
* @li len is the exact number of bytes contained in the packet
* @li decoded is the decoded audio data in opus_int16 (or float for opus_decode_float())
* @li max_size is the max duration of the frame in samples (per channel) that can fit into the decoded_frame array
*
* opus_decode() and opus_decode_float() return the number of samples (per channel) decoded from the packet.
* If that value is negative, then an error has occurred. This can occur if the packet is corrupted or if the audio
* buffer is too small to hold the decoded audio.
*
* Opus is a stateful codec with overlapping blocks and as a result Opus
* packets are not coded independently of each other. Packets must be
* passed into the decoder serially and in the correct order for a correct
* decode. Lost packets can be replaced with loss concealment by calling
* the decoder with a null pointer and zero length for the missing packet.
*
* A single codec state may only be accessed from a single thread at
* a time and any required locking must be performed by the caller. Separate
* streams must be decoded with separate decoder states and can be decoded
* in parallel unless the library was compiled with NONTHREADSAFE_PSEUDOSTACK
* defined.
*
*/
/** Opus decoder state.
* This contains the complete state of an Opus decoder.
* It is position independent and can be freely copied.
* @see opus_decoder_create,opus_decoder_init
*/
typedef struct OpusDecoder OpusDecoder;
/** Gets the size of an <code>OpusDecoder</code> structure.
* @param [in] channels <tt>int</tt>: Number of channels.
* This must be 1 or 2.
* @returns The size in bytes.
*/
OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_decoder_get_size(int channels);
/** Allocates and initializes a decoder state.
* @param [in] Fs <tt>opus_int32</tt>: Sample rate to decode at (Hz).
* This must be one of 8000, 12000, 16000,
* 24000, or 48000.
* @param [in] channels <tt>int</tt>: Number of channels (1 or 2) to decode
* @param [out] error <tt>int*</tt>: #OPUS_OK Success or @ref opus_errorcodes
*
* Internally Opus stores data at 48000 Hz, so that should be the default
* value for Fs. However, the decoder can efficiently decode to buffers
* at 8, 12, 16, and 24 kHz so if for some reason the caller cannot use
* data at the full sample rate, or knows the compressed data doesn't
* use the full frequency range, it can request decoding at a reduced
* rate. Likewise, the decoder is capable of filling in either mono or
* interleaved stereo pcm buffers, at the caller's request.
*/
OPUS_EXPORT OPUS_WARN_UNUSED_RESULT OpusDecoder *opus_decoder_create(
opus_int32 Fs,
int channels,
int *error
);
/** Initializes a previously allocated decoder state.
* The state must be at least the size returned by opus_decoder_get_size().
* This is intended for applications which use their own allocator instead of malloc. @see opus_decoder_create,opus_decoder_get_size
* To reset a previously initialized state, use the #OPUS_RESET_STATE CTL.
* @param [in] st <tt>OpusDecoder*</tt>: Decoder state.
* @param [in] Fs <tt>opus_int32</tt>: Sampling rate to decode to (Hz).
* This must be one of 8000, 12000, 16000,
* 24000, or 48000.
* @param [in] channels <tt>int</tt>: Number of channels (1 or 2) to decode
* @retval #OPUS_OK Success or @ref opus_errorcodes
*/
OPUS_EXPORT int opus_decoder_init(
OpusDecoder *st,
opus_int32 Fs,
int channels
) OPUS_ARG_NONNULL(1);
/** Decode an Opus packet.
* @param [in] st <tt>OpusDecoder*</tt>: Decoder state
* @param [in] data <tt>char*</tt>: Input payload. Use a NULL pointer to indicate packet loss
* @param [in] len <tt>opus_int32</tt>: Number of bytes in payload*
* @param [out] pcm <tt>opus_int16*</tt>: Output signal (interleaved if 2 channels). length
* is frame_size*channels*sizeof(opus_int16)
* @param [in] frame_size Number of samples per channel of available space in \a pcm.
* If this is less than the maximum packet duration (120ms; 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 [in] 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 decoded samples or @ref opus_errorcodes
*/
OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_decode(
OpusDecoder *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 an Opus packet with floating point output.
* @param [in] st <tt>OpusDecoder*</tt>: Decoder state
* @param [in] data <tt>char*</tt>: Input payload. Use a NULL pointer to indicate packet loss
* @param [in] len <tt>opus_int32</tt>: Number of bytes in payload
* @param [out] pcm <tt>float*</tt>: Output signal (interleaved if 2 channels). length
* is frame_size*channels*sizeof(float)
* @param [in] frame_size Number of samples per channel of available space in \a pcm.
* If this is less than the maximum packet duration (120ms; 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 [in] 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 decoded samples or @ref opus_errorcodes
*/
OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_decode_float(
OpusDecoder *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 an Opus decoder.
*
* Generally the request and subsequent arguments are generated
* by a convenience macro.
* @param st <tt>OpusDecoder*</tt>: Decoder state.
* @param request This and all remaining parameters should be replaced by one
* of the convenience macros in @ref opus_genericctls or
* @ref opus_decoderctls.
* @see opus_genericctls
* @see opus_decoderctls
*/
OPUS_EXPORT int opus_decoder_ctl(OpusDecoder *st, int request, ...) OPUS_ARG_NONNULL(1);
/** Frees an <code>OpusDecoder</code> allocated by opus_decoder_create().
* @param[in] st <tt>OpusDecoder*</tt>: State to be freed.
*/
OPUS_EXPORT void opus_decoder_destroy(OpusDecoder *st);
/** Parse an opus packet into one or more frames.
* Opus_decode will perform this operation internally so most applications do
* not need to use this function.
* This function does not copy the frames, the returned pointers are pointers into
* the input packet.
* @param [in] data <tt>char*</tt>: Opus packet to be parsed
* @param [in] len <tt>opus_int32</tt>: size of data
* @param [out] out_toc <tt>char*</tt>: TOC pointer
* @param [out] frames <tt>char*[48]</tt> encapsulated frames
* @param [out] size <tt>opus_int16[48]</tt> sizes of the encapsulated frames
* @param [out] payload_offset <tt>int*</tt>: returns the position of the payload within the packet (in bytes)
* @returns number of frames
*/
OPUS_EXPORT int opus_packet_parse(
const unsigned char *data,
opus_int32 len,
unsigned char *out_toc,
const unsigned char *frames[48],
opus_int16 size[48],
int *payload_offset
) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(5);
/** Gets the bandwidth of an Opus packet.
* @param [in] data <tt>char*</tt>: Opus packet
* @retval OPUS_BANDWIDTH_NARROWBAND Narrowband (4kHz bandpass)
* @retval OPUS_BANDWIDTH_MEDIUMBAND Mediumband (6kHz bandpass)
* @retval OPUS_BANDWIDTH_WIDEBAND Wideband (8kHz bandpass)
* @retval OPUS_BANDWIDTH_SUPERWIDEBAND Superwideband (12kHz bandpass)
* @retval OPUS_BANDWIDTH_FULLBAND Fullband (20kHz bandpass)
* @retval OPUS_INVALID_PACKET The compressed data passed is corrupted or of an unsupported type
*/
OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_packet_get_bandwidth(const unsigned char *data) OPUS_ARG_NONNULL(1);
/** Gets the number of samples per frame from an Opus packet.
* @param [in] data <tt>char*</tt>: Opus packet.
* This must contain at least one byte of
* data.
* @param [in] Fs <tt>opus_int32</tt>: Sampling rate in Hz.
* This must be a multiple of 400, or
* inaccurate results will be returned.
* @returns Number of samples per frame.
*/
OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_packet_get_samples_per_frame(const unsigned char *data, opus_int32 Fs) OPUS_ARG_NONNULL(1);
/** Gets the number of channels from an Opus packet.
* @param [in] data <tt>char*</tt>: Opus packet
* @returns Number of channels
* @retval OPUS_INVALID_PACKET The compressed data passed is corrupted or of an unsupported type
*/
OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_packet_get_nb_channels(const unsigned char *data) OPUS_ARG_NONNULL(1);
/** Gets the number of frames in an Opus packet.
* @param [in] packet <tt>char*</tt>: Opus packet
* @param [in] len <tt>opus_int32</tt>: Length of packet
* @returns Number of frames
* @retval OPUS_BAD_ARG Insufficient data was passed to the function
* @retval OPUS_INVALID_PACKET The compressed data passed is corrupted or of an unsupported type
*/
OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_packet_get_nb_frames(const unsigned char packet[], opus_int32 len) OPUS_ARG_NONNULL(1);
/** Gets the number of samples of an Opus packet.
* @param [in] packet <tt>char*</tt>: Opus packet
* @param [in] len <tt>opus_int32</tt>: Length of packet
* @param [in] Fs <tt>opus_int32</tt>: Sampling rate in Hz.
* This must be a multiple of 400, or
* inaccurate results will be returned.
* @returns Number of samples
* @retval OPUS_BAD_ARG Insufficient data was passed to the function
* @retval OPUS_INVALID_PACKET The compressed data passed is corrupted or of an unsupported type
*/
OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_packet_get_nb_samples(const unsigned char packet[], opus_int32 len, opus_int32 Fs) OPUS_ARG_NONNULL(1);
/** Gets the number of samples of an Opus packet.
* @param [in] dec <tt>OpusDecoder*</tt>: Decoder state
* @param [in] packet <tt>char*</tt>: Opus packet
* @param [in] len <tt>opus_int32</tt>: Length of packet
* @returns Number of samples
* @retval OPUS_BAD_ARG Insufficient data was passed to the function
* @retval OPUS_INVALID_PACKET The compressed data passed is corrupted or of an unsupported type
*/
OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_decoder_get_nb_samples(const OpusDecoder *dec, const unsigned char packet[], opus_int32 len) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2);
/** Applies soft-clipping to bring a float signal within the [-1,1] range. If
* the signal is already in that range, nothing is done. If there are values
* outside of [-1,1], then the signal is clipped as smoothly as possible to
* both fit in the range and avoid creating excessive distortion in the
* process.
* @param [in,out] pcm <tt>float*</tt>: Input PCM and modified PCM
* @param [in] frame_size <tt>int</tt> Number of samples per channel to process
* @param [in] channels <tt>int</tt>: Number of channels
* @param [in,out] softclip_mem <tt>float*</tt>: State memory for the soft clipping process (one float per channel, initialized to zero)
*/
OPUS_EXPORT void opus_pcm_soft_clip(float *pcm, int frame_size, int channels, float *softclip_mem);
/**@}*/
/** @defgroup opus_repacketizer Repacketizer
* @{
*
* The repacketizer can be used to merge multiple Opus packets into a single
* packet or alternatively to split Opus packets that have previously been
* merged. Splitting valid Opus packets is always guaranteed to succeed,
* whereas merging valid packets only succeeds if all frames have the same
* mode, bandwidth, and frame size, and when the total duration of the merged
* packet is no more than 120 ms. The 120 ms limit comes from the
* specification and limits decoder memory requirements at a point where
* framing overhead becomes negligible.
*
* The repacketizer currently only operates on elementary Opus
* streams. It will not manipualte multistream packets successfully, except in
* the degenerate case where they consist of data from a single stream.
*
* The repacketizing process starts with creating a repacketizer state, either
* by calling opus_repacketizer_create() or by allocating the memory yourself,
* e.g.,
* @code
* OpusRepacketizer *rp;
* rp = (OpusRepacketizer*)malloc(opus_repacketizer_get_size());
* if (rp != NULL)
* opus_repacketizer_init(rp);
* @endcode
*
* Then the application should submit packets with opus_repacketizer_cat(),
* extract new packets with opus_repacketizer_out() or
* opus_repacketizer_out_range(), and then reset the state for the next set of
* input packets via opus_repacketizer_init().
*
* For example, to split a sequence of packets into individual frames:
* @code
* unsigned char *data;
* int len;
* while (get_next_packet(&data, &len))
* {
* unsigned char out[1276];
* opus_int32 out_len;
* int nb_frames;
* int err;
* int i;
* err = opus_repacketizer_cat(rp, data, len);
* if (err != OPUS_OK)
* {
* release_packet(data);
* return err;
* }
* nb_frames = opus_repacketizer_get_nb_frames(rp);
* for (i = 0; i < nb_frames; i++)
* {
* out_len = opus_repacketizer_out_range(rp, i, i+1, out, sizeof(out));
* if (out_len < 0)
* {
* release_packet(data);
* return (int)out_len;
* }
* output_next_packet(out, out_len);
* }
* opus_repacketizer_init(rp);
* release_packet(data);
* }
* @endcode
*
* Alternatively, to combine a sequence of frames into packets that each
* contain up to <code>TARGET_DURATION_MS</code> milliseconds of data:
* @code
* // The maximum number of packets with duration TARGET_DURATION_MS occurs
* // when the frame size is 2.5 ms, for a total of (TARGET_DURATION_MS*2/5)
* // packets.
* unsigned char *data[(TARGET_DURATION_MS*2/5)+1];
* opus_int32 len[(TARGET_DURATION_MS*2/5)+1];
* int nb_packets;
* unsigned char out[1277*(TARGET_DURATION_MS*2/2)];
* opus_int32 out_len;
* int prev_toc;
* nb_packets = 0;
* while (get_next_packet(data+nb_packets, len+nb_packets))
* {
* int nb_frames;
* int err;
* nb_frames = opus_packet_get_nb_frames(data[nb_packets], len[nb_packets]);
* if (nb_frames < 1)
* {
* release_packets(data, nb_packets+1);
* return nb_frames;
* }
* nb_frames += opus_repacketizer_get_nb_frames(rp);
* // If adding the next packet would exceed our target, or it has an
* // incompatible TOC sequence, output the packets we already have before
* // submitting it.
* // N.B., The nb_packets > 0 check ensures we've submitted at least one
* // packet since the last call to opus_repacketizer_init(). Otherwise a
* // single packet longer than TARGET_DURATION_MS would cause us to try to
* // output an (invalid) empty packet. It also ensures that prev_toc has
* // been set to a valid value. Additionally, len[nb_packets] > 0 is
* // guaranteed by the call to opus_packet_get_nb_frames() above, so the
* // reference to data[nb_packets][0] should be valid.
* if (nb_packets > 0 && (
* ((prev_toc & 0xFC) != (data[nb_packets][0] & 0xFC)) ||
* opus_packet_get_samples_per_frame(data[nb_packets], 48000)*nb_frames >
* TARGET_DURATION_MS*48))
* {
* out_len = opus_repacketizer_out(rp, out, sizeof(out));
* if (out_len < 0)
* {
* release_packets(data, nb_packets+1);
* return (int)out_len;
* }
* output_next_packet(out, out_len);
* opus_repacketizer_init(rp);
* release_packets(data, nb_packets);
* data[0] = data[nb_packets];
* len[0] = len[nb_packets];
* nb_packets = 0;
* }
* err = opus_repacketizer_cat(rp, data[nb_packets], len[nb_packets]);
* if (err != OPUS_OK)
* {
* release_packets(data, nb_packets+1);
* return err;
* }
* prev_toc = data[nb_packets][0];
* nb_packets++;
* }
* // Output the final, partial packet.
* if (nb_packets > 0)
* {
* out_len = opus_repacketizer_out(rp, out, sizeof(out));
* release_packets(data, nb_packets);
* if (out_len < 0)
* return (int)out_len;
* output_next_packet(out, out_len);
* }
* @endcode
*
* An alternate way of merging packets is to simply call opus_repacketizer_cat()
* unconditionally until it fails. At that point, the merged packet can be
* obtained with opus_repacketizer_out() and the input packet for which
* opus_repacketizer_cat() needs to be re-added to a newly reinitialized
* repacketizer state.
*/
typedef struct OpusRepacketizer OpusRepacketizer;
/** Gets the size of an <code>OpusRepacketizer</code> structure.
* @returns The size in bytes.
*/
OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_repacketizer_get_size(void);
/** (Re)initializes a previously allocated repacketizer state.
* The state must be at least the size returned by opus_repacketizer_get_size().
* This can be used for applications which use their own allocator instead of
* malloc().
* It must also be called to reset the queue of packets waiting to be
* repacketized, which is necessary if the maximum packet duration of 120 ms
* is reached or if you wish to submit packets with a different Opus
* configuration (coding mode, audio bandwidth, frame size, or channel count).
* Failure to do so will prevent a new packet from being added with
* opus_repacketizer_cat().
* @see opus_repacketizer_create
* @see opus_repacketizer_get_size
* @see opus_repacketizer_cat
* @param rp <tt>OpusRepacketizer*</tt>: The repacketizer state to
* (re)initialize.
* @returns A pointer to the same repacketizer state that was passed in.
*/
OPUS_EXPORT OpusRepacketizer *opus_repacketizer_init(OpusRepacketizer *rp) OPUS_ARG_NONNULL(1);
/** Allocates memory and initializes the new repacketizer with
* opus_repacketizer_init().
*/
OPUS_EXPORT OPUS_WARN_UNUSED_RESULT OpusRepacketizer *opus_repacketizer_create(void);
/** Frees an <code>OpusRepacketizer</code> allocated by
* opus_repacketizer_create().
* @param[in] rp <tt>OpusRepacketizer*</tt>: State to be freed.
*/
OPUS_EXPORT void opus_repacketizer_destroy(OpusRepacketizer *rp);
/** Add a packet to the current repacketizer state.
* This packet must match the configuration of any packets already submitted
* for repacketization since the last call to opus_repacketizer_init().
* This means that it must have the same coding mode, audio bandwidth, frame
* size, and channel count.
* This can be checked in advance by examining the top 6 bits of the first
* byte of the packet, and ensuring they match the top 6 bits of the first
* byte of any previously submitted packet.
* The total duration of audio in the repacketizer state also must not exceed
* 120 ms, the maximum duration of a single packet, after adding this packet.
*
* The contents of the current repacketizer state can be extracted into new
* packets using opus_repacketizer_out() or opus_repacketizer_out_range().
*
* In order to add a packet with a different configuration or to add more
* audio beyond 120 ms, you must clear the repacketizer state by calling
* opus_repacketizer_init().
* If a packet is too large to add to the current repacketizer state, no part
* of it is added, even if it contains multiple frames, some of which might
* fit.
* If you wish to be able to add parts of such packets, you should first use
* another repacketizer to split the packet into pieces and add them
* individually.
* @see opus_repacketizer_out_range
* @see opus_repacketizer_out
* @see opus_repacketizer_init
* @param rp <tt>OpusRepacketizer*</tt>: The repacketizer state to which to
* add the packet.
* @param[in] data <tt>const unsigned char*</tt>: The packet data.
* The application must ensure
* this pointer remains valid
* until the next call to
* opus_repacketizer_init() or
* opus_repacketizer_destroy().
* @param len <tt>opus_int32</tt>: The number of bytes in the packet data.
* @returns An error code indicating whether or not the operation succeeded.
* @retval #OPUS_OK The packet's contents have been added to the repacketizer
* state.
* @retval #OPUS_INVALID_PACKET The packet did not have a valid TOC sequence,
* the packet's TOC sequence was not compatible
* with previously submitted packets (because
* the coding mode, audio bandwidth, frame size,
* or channel count did not match), or adding
* this packet would increase the total amount of
* audio stored in the repacketizer state to more
* than 120 ms.
*/
OPUS_EXPORT int opus_repacketizer_cat(OpusRepacketizer *rp, const unsigned char *data, opus_int32 len) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2);
/** Construct a new packet from data previously submitted to the repacketizer
* state via opus_repacketizer_cat().
* @param rp <tt>OpusRepacketizer*</tt>: The repacketizer state from which to
* construct the new packet.
* @param begin <tt>int</tt>: The index of the first frame in the current
* repacketizer state to include in the output.
* @param end <tt>int</tt>: One past the index of the last frame in the
* current repacketizer state to include in the
* output.
* @param[out] data <tt>const unsigned char*</tt>: The buffer in which to
* store the output packet.
* @param maxlen <tt>opus_int32</tt>: The maximum number of bytes to store in
* the output buffer. In order to guarantee
* success, this should be at least
* <code>1276</code> for a single frame,
* or for multiple frames,
* <code>1277*(end-begin)</code>.
* However, <code>1*(end-begin)</code> plus
* the size of all packet data submitted to
* the repacketizer since the last call to
* opus_repacketizer_init() or
* opus_repacketizer_create() is also
* sufficient, and possibly much smaller.
* @returns The total size of the output packet on success, or an error code
* on failure.
* @retval #OPUS_BAD_ARG <code>[begin,end)</code> was an invalid range of
* frames (begin < 0, begin >= end, or end >
* opus_repacketizer_get_nb_frames()).
* @retval #OPUS_BUFFER_TOO_SMALL \a maxlen was insufficient to contain the
* complete output packet.
*/
OPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_repacketizer_out_range(OpusRepacketizer *rp, int begin, int end, unsigned char *data, opus_int32 maxlen) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(4);
/** Return the total number of frames contained in packet data submitted to
* the repacketizer state so far via opus_repacketizer_cat() since the last
* call to opus_repacketizer_init() or opus_repacketizer_create().
* This defines the valid range of packets that can be extracted with
* opus_repacketizer_out_range() or opus_repacketizer_out().
* @param rp <tt>OpusRepacketizer*</tt>: The repacketizer state containing the
* frames.
* @returns The total number of frames contained in the packet data submitted
* to the repacketizer state.
*/
OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_repacketizer_get_nb_frames(OpusRepacketizer *rp) OPUS_ARG_NONNULL(1);
/** Construct a new packet from data previously submitted to the repacketizer
* state via opus_repacketizer_cat().
* This is a convenience routine that returns all the data submitted so far
* in a single packet.
* It is equivalent to calling
* @code
* opus_repacketizer_out_range(rp, 0, opus_repacketizer_get_nb_frames(rp),
* data, maxlen)
* @endcode
* @param rp <tt>OpusRepacketizer*</tt>: The repacketizer state from which to
* construct the new packet.
* @param[out] data <tt>const unsigned char*</tt>: The buffer in which to
* store the output packet.
* @param maxlen <tt>opus_int32</tt>: The maximum number of bytes to store in
* the output buffer. In order to guarantee
* success, this should be at least
* <code>1277*opus_repacketizer_get_nb_frames(rp)</code>.
* However,
* <code>1*opus_repacketizer_get_nb_frames(rp)</code>
* plus the size of all packet data
* submitted to the repacketizer since the
* last call to opus_repacketizer_init() or
* opus_repacketizer_create() is also
* sufficient, and possibly much smaller.
* @returns The total size of the output packet on success, or an error code
* on failure.
* @retval #OPUS_BUFFER_TOO_SMALL \a maxlen was insufficient to contain the
* complete output packet.
*/
OPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_repacketizer_out(OpusRepacketizer *rp, unsigned char *data, opus_int32 maxlen) OPUS_ARG_NONNULL(1);
/** Pads a given Opus packet to a larger size (possibly changing the TOC sequence).
* @param[in,out] data <tt>const unsigned char*</tt>: The buffer containing the
* packet to pad.
* @param len <tt>opus_int32</tt>: The size of the packet.
* This must be at least 1.
* @param new_len <tt>opus_int32</tt>: The desired size of the packet after padding.
* This must be at least as large as len.
* @returns an error code
* @retval #OPUS_OK \a on success.
* @retval #OPUS_BAD_ARG \a len was less than 1 or new_len was less than len.
* @retval #OPUS_INVALID_PACKET \a data did not contain a valid Opus packet.
*/
OPUS_EXPORT int opus_packet_pad(unsigned char *data, opus_int32 len, opus_int32 new_len);
/** Remove all padding from a given Opus packet and rewrite the TOC sequence to
* minimize space usage.
* @param[in,out] data <tt>const unsigned char*</tt>: The buffer containing the
* packet to strip.
* @param len <tt>opus_int32</tt>: The size of the packet.
* This must be at least 1.
* @returns The new size of the output packet on success, or an error code
* on failure.
* @retval #OPUS_BAD_ARG \a len was less than 1.
* @retval #OPUS_INVALID_PACKET \a data did not contain a valid Opus packet.
*/
OPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_packet_unpad(unsigned char *data, opus_int32 len);
/** Pads a given Opus multi-stream packet to a larger size (possibly changing the TOC sequence).
* @param[in,out] data <tt>const unsigned char*</tt>: The buffer containing the
* packet to pad.
* @param len <tt>opus_int32</tt>: The size of the packet.
* This must be at least 1.
* @param new_len <tt>opus_int32</tt>: The desired size of the packet after padding.
* This must be at least 1.
* @param nb_streams <tt>opus_int32</tt>: The number of streams (not channels) in the packet.
* This must be at least as large as len.
* @returns an error code
* @retval #OPUS_OK \a on success.
* @retval #OPUS_BAD_ARG \a len was less than 1.
* @retval #OPUS_INVALID_PACKET \a data did not contain a valid Opus packet.
*/
OPUS_EXPORT int opus_multistream_packet_pad(unsigned char *data, opus_int32 len, opus_int32 new_len, int nb_streams);
/** Remove all padding from a given Opus multi-stream packet and rewrite the TOC sequence to
* minimize space usage.
* @param[in,out] data <tt>const unsigned char*</tt>: The buffer containing the
* packet to strip.
* @param len <tt>opus_int32</tt>: The size of the packet.
* This must be at least 1.
* @param nb_streams <tt>opus_int32</tt>: The number of streams (not channels) in the packet.
* This must be at least 1.
* @returns The new size of the output packet on success, or an error code
* on failure.
* @retval #OPUS_BAD_ARG \a len was less than 1 or new_len was less than len.
* @retval #OPUS_INVALID_PACKET \a data did not contain a valid Opus packet.
*/
OPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_multistream_packet_unpad(unsigned char *data, opus_int32 len, int nb_streams);
/**@}*/
#ifdef __cplusplus
}
#endif
#endif /* OPUS_H */

View File

@@ -0,0 +1,342 @@
/* Copyright (c) 2007-2008 CSIRO
Copyright (c) 2007-2009 Xiph.Org Foundation
Copyright (c) 2008-2012 Gregory Maxwell
Written by Jean-Marc Valin and Gregory Maxwell */
/*
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_custom.h
@brief Opus-Custom reference implementation API
*/
#ifndef OPUS_CUSTOM_H
#define OPUS_CUSTOM_H
#include "opus_defines.h"
#ifdef __cplusplus
extern "C" {
#endif
#ifdef CUSTOM_MODES
# define OPUS_CUSTOM_EXPORT OPUS_EXPORT
# define OPUS_CUSTOM_EXPORT_STATIC OPUS_EXPORT
#else
# define OPUS_CUSTOM_EXPORT
# ifdef OPUS_BUILD
# define OPUS_CUSTOM_EXPORT_STATIC static OPUS_INLINE
# else
# define OPUS_CUSTOM_EXPORT_STATIC
# endif
#endif
/** @defgroup opus_custom Opus Custom
* @{
* Opus Custom is an optional part of the Opus specification and
* reference implementation which uses a distinct API from the regular
* API and supports frame sizes that are not normally supported.\ Use
* of Opus Custom is discouraged for all but very special applications
* for which a frame size different from 2.5, 5, 10, or 20 ms is needed
* (for either complexity or latency reasons) and where interoperability
* is less important.
*
* In addition to the interoperability limitations the use of Opus custom
* disables a substantial chunk of the codec and generally lowers the
* quality available at a given bitrate. Normally when an application needs
* a different frame size from the codec it should buffer to match the
* sizes but this adds a small amount of delay which may be important
* in some very low latency applications. Some transports (especially
* constant rate RF transports) may also work best with frames of
* particular durations.
*
* Libopus only supports custom modes if they are enabled at compile time.
*
* The Opus Custom API is similar to the regular API but the
* @ref opus_encoder_create and @ref opus_decoder_create calls take
* an additional mode parameter which is a structure produced by
* a call to @ref opus_custom_mode_create. Both the encoder and decoder
* must create a mode using the same sample rate (fs) and frame size
* (frame size) so these parameters must either be signaled out of band
* or fixed in a particular implementation.
*
* Similar to regular Opus the custom modes support on the fly frame size
* switching, but the sizes available depend on the particular frame size in
* use. For some initial frame sizes on a single on the fly size is available.
*/
/** Contains the state of an encoder. One encoder state is needed
for each stream. It is initialized once at the beginning of the
stream. Do *not* re-initialize the state for every frame.
@brief Encoder state
*/
typedef struct OpusCustomEncoder OpusCustomEncoder;
/** State of the decoder. One decoder state is needed for each stream.
It is initialized once at the beginning of the stream. Do *not*
re-initialize the state for every frame.
@brief Decoder state
*/
typedef struct OpusCustomDecoder OpusCustomDecoder;
/** The mode contains all the information necessary to create an
encoder. Both the encoder and decoder need to be initialized
with exactly the same mode, otherwise the output will be
corrupted.
@brief Mode configuration
*/
typedef struct OpusCustomMode OpusCustomMode;
/** Creates a new mode struct. This will be passed to an encoder or
* decoder. The mode MUST NOT BE DESTROYED until the encoders and
* decoders that use it are destroyed as well.
* @param [in] Fs <tt>int</tt>: Sampling rate (8000 to 96000 Hz)
* @param [in] frame_size <tt>int</tt>: Number of samples (per channel) to encode in each
* packet (64 - 1024, prime factorization must contain zero or more 2s, 3s, or 5s and no other primes)
* @param [out] error <tt>int*</tt>: Returned error code (if NULL, no error will be returned)
* @return A newly created mode
*/
OPUS_CUSTOM_EXPORT OPUS_WARN_UNUSED_RESULT OpusCustomMode *opus_custom_mode_create(opus_int32 Fs, int frame_size, int *error);
/** Destroys a mode struct. Only call this after all encoders and
* decoders using this mode are destroyed as well.
* @param [in] mode <tt>OpusCustomMode*</tt>: Mode to be freed.
*/
OPUS_CUSTOM_EXPORT void opus_custom_mode_destroy(OpusCustomMode *mode);
#if !defined(OPUS_BUILD) || defined(CELT_ENCODER_C)
/* Encoder */
/** Gets the size of an OpusCustomEncoder structure.
* @param [in] mode <tt>OpusCustomMode *</tt>: Mode configuration
* @param [in] channels <tt>int</tt>: Number of channels
* @returns size
*/
OPUS_CUSTOM_EXPORT_STATIC OPUS_WARN_UNUSED_RESULT int opus_custom_encoder_get_size(
const OpusCustomMode *mode,
int channels
) OPUS_ARG_NONNULL(1);
# ifdef CUSTOM_MODES
/** Initializes a previously allocated encoder state
* The memory pointed to by st must be the size returned by opus_custom_encoder_get_size.
* This is intended for applications which use their own allocator instead of malloc.
* @see opus_custom_encoder_create(),opus_custom_encoder_get_size()
* To reset a previously initialized state use the OPUS_RESET_STATE CTL.
* @param [in] st <tt>OpusCustomEncoder*</tt>: Encoder state
* @param [in] mode <tt>OpusCustomMode *</tt>: Contains all the information about the characteristics of
* the stream (must be the same characteristics as used for the
* decoder)
* @param [in] channels <tt>int</tt>: Number of channels
* @return OPUS_OK Success or @ref opus_errorcodes
*/
OPUS_CUSTOM_EXPORT int opus_custom_encoder_init(
OpusCustomEncoder *st,
const OpusCustomMode *mode,
int channels
) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2);
# endif
#endif
/** Creates a new encoder state. Each stream needs its own encoder
* state (can't be shared across simultaneous streams).
* @param [in] mode <tt>OpusCustomMode*</tt>: Contains all the information about the characteristics of
* the stream (must be the same characteristics as used for the
* decoder)
* @param [in] channels <tt>int</tt>: Number of channels
* @param [out] error <tt>int*</tt>: Returns an error code
* @return Newly created encoder state.
*/
OPUS_CUSTOM_EXPORT OPUS_WARN_UNUSED_RESULT OpusCustomEncoder *opus_custom_encoder_create(
const OpusCustomMode *mode,
int channels,
int *error
) OPUS_ARG_NONNULL(1);
/** Destroys a an encoder state.
* @param[in] st <tt>OpusCustomEncoder*</tt>: State to be freed.
*/
OPUS_CUSTOM_EXPORT void opus_custom_encoder_destroy(OpusCustomEncoder *st);
/** Encodes a frame of audio.
* @param [in] st <tt>OpusCustomEncoder*</tt>: Encoder state
* @param [in] pcm <tt>float*</tt>: PCM audio in float format, 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. There must be exactly
* frame_size samples per channel.
* @param [in] frame_size <tt>int</tt>: Number of samples per frame of input signal
* @param [out] compressed <tt>char *</tt>: The compressed data is written here. This may not alias pcm and must be at least maxCompressedBytes long.
* @param [in] maxCompressedBytes <tt>int</tt>: Maximum number of bytes to use for compressing the frame
* (can change from one frame to another)
* @return Number of bytes written to "compressed".
* If negative, an error has occurred (see error codes). It is IMPORTANT that
* the length returned be somehow transmitted to the decoder. Otherwise, no
* decoding is possible.
*/
OPUS_CUSTOM_EXPORT OPUS_WARN_UNUSED_RESULT int opus_custom_encode_float(
OpusCustomEncoder *st,
const float *pcm,
int frame_size,
unsigned char *compressed,
int maxCompressedBytes
) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2) OPUS_ARG_NONNULL(4);
/** Encodes a frame of audio.
* @param [in] st <tt>OpusCustomEncoder*</tt>: Encoder state
* @param [in] pcm <tt>opus_int16*</tt>: PCM audio in signed 16-bit format (native endian).
* There must be exactly frame_size samples per channel.
* @param [in] frame_size <tt>int</tt>: Number of samples per frame of input signal
* @param [out] compressed <tt>char *</tt>: The compressed data is written here. This may not alias pcm and must be at least maxCompressedBytes long.
* @param [in] maxCompressedBytes <tt>int</tt>: Maximum number of bytes to use for compressing the frame
* (can change from one frame to another)
* @return Number of bytes written to "compressed".
* If negative, an error has occurred (see error codes). It is IMPORTANT that
* the length returned be somehow transmitted to the decoder. Otherwise, no
* decoding is possible.
*/
OPUS_CUSTOM_EXPORT OPUS_WARN_UNUSED_RESULT int opus_custom_encode(
OpusCustomEncoder *st,
const opus_int16 *pcm,
int frame_size,
unsigned char *compressed,
int maxCompressedBytes
) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2) OPUS_ARG_NONNULL(4);
/** Perform a CTL function on an Opus custom encoder.
*
* Generally the request and subsequent arguments are generated
* by a convenience macro.
* @see opus_encoderctls
*/
OPUS_CUSTOM_EXPORT int opus_custom_encoder_ctl(OpusCustomEncoder * OPUS_RESTRICT st, int request, ...) OPUS_ARG_NONNULL(1);
#if !defined(OPUS_BUILD) || defined(CELT_DECODER_C)
/* Decoder */
/** Gets the size of an OpusCustomDecoder structure.
* @param [in] mode <tt>OpusCustomMode *</tt>: Mode configuration
* @param [in] channels <tt>int</tt>: Number of channels
* @returns size
*/
OPUS_CUSTOM_EXPORT_STATIC OPUS_WARN_UNUSED_RESULT int opus_custom_decoder_get_size(
const OpusCustomMode *mode,
int channels
) OPUS_ARG_NONNULL(1);
/** Initializes a previously allocated decoder state
* The memory pointed to by st must be the size returned by opus_custom_decoder_get_size.
* This is intended for applications which use their own allocator instead of malloc.
* @see opus_custom_decoder_create(),opus_custom_decoder_get_size()
* To reset a previously initialized state use the OPUS_RESET_STATE CTL.
* @param [in] st <tt>OpusCustomDecoder*</tt>: Decoder state
* @param [in] mode <tt>OpusCustomMode *</tt>: Contains all the information about the characteristics of
* the stream (must be the same characteristics as used for the
* encoder)
* @param [in] channels <tt>int</tt>: Number of channels
* @return OPUS_OK Success or @ref opus_errorcodes
*/
OPUS_CUSTOM_EXPORT_STATIC int opus_custom_decoder_init(
OpusCustomDecoder *st,
const OpusCustomMode *mode,
int channels
) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2);
#endif
/** Creates a new decoder state. Each stream needs its own decoder state (can't
* be shared across simultaneous streams).
* @param [in] mode <tt>OpusCustomMode</tt>: Contains all the information about the characteristics of the
* stream (must be the same characteristics as used for the encoder)
* @param [in] channels <tt>int</tt>: Number of channels
* @param [out] error <tt>int*</tt>: Returns an error code
* @return Newly created decoder state.
*/
OPUS_CUSTOM_EXPORT OPUS_WARN_UNUSED_RESULT OpusCustomDecoder *opus_custom_decoder_create(
const OpusCustomMode *mode,
int channels,
int *error
) OPUS_ARG_NONNULL(1);
/** Destroys a an decoder state.
* @param[in] st <tt>OpusCustomDecoder*</tt>: State to be freed.
*/
OPUS_CUSTOM_EXPORT void opus_custom_decoder_destroy(OpusCustomDecoder *st);
/** Decode an opus custom frame with floating point output
* @param [in] st <tt>OpusCustomDecoder*</tt>: Decoder state
* @param [in] data <tt>char*</tt>: Input payload. Use a NULL pointer to indicate packet loss
* @param [in] len <tt>int</tt>: Number of bytes in payload
* @param [out] pcm <tt>float*</tt>: Output signal (interleaved if 2 channels). length
* is frame_size*channels*sizeof(float)
* @param [in] frame_size Number of samples per channel of available space in *pcm.
* @returns Number of decoded samples or @ref opus_errorcodes
*/
OPUS_CUSTOM_EXPORT OPUS_WARN_UNUSED_RESULT int opus_custom_decode_float(
OpusCustomDecoder *st,
const unsigned char *data,
int len,
float *pcm,
int frame_size
) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(4);
/** Decode an opus custom frame
* @param [in] st <tt>OpusCustomDecoder*</tt>: Decoder state
* @param [in] data <tt>char*</tt>: Input payload. Use a NULL pointer to indicate packet loss
* @param [in] len <tt>int</tt>: Number of bytes in payload
* @param [out] pcm <tt>opus_int16*</tt>: Output signal (interleaved if 2 channels). length
* is frame_size*channels*sizeof(opus_int16)
* @param [in] frame_size Number of samples per channel of available space in *pcm.
* @returns Number of decoded samples or @ref opus_errorcodes
*/
OPUS_CUSTOM_EXPORT OPUS_WARN_UNUSED_RESULT int opus_custom_decode(
OpusCustomDecoder *st,
const unsigned char *data,
int len,
opus_int16 *pcm,
int frame_size
) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(4);
/** Perform a CTL function on an Opus custom decoder.
*
* Generally the request and subsequent arguments are generated
* by a convenience macro.
* @see opus_genericctls
*/
OPUS_CUSTOM_EXPORT int opus_custom_decoder_ctl(OpusCustomDecoder * OPUS_RESTRICT st, int request, ...) OPUS_ARG_NONNULL(1);
/**@}*/
#ifdef __cplusplus
}
#endif
#endif /* OPUS_CUSTOM_H */

View File

@@ -0,0 +1,788 @@
/* Copyright (c) 2010-2011 Xiph.Org Foundation, Skype Limited
Written by Jean-Marc Valin and Koen Vos */
/*
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_defines.h
* @brief Opus reference implementation constants
*/
#ifndef OPUS_DEFINES_H
#define OPUS_DEFINES_H
#include "opus_types.h"
#ifdef __cplusplus
extern "C" {
#endif
/** @defgroup opus_errorcodes Error codes
* @{
*/
/** No error @hideinitializer*/
#define OPUS_OK 0
/** One or more invalid/out of range arguments @hideinitializer*/
#define OPUS_BAD_ARG -1
/** Not enough bytes allocated in the buffer @hideinitializer*/
#define OPUS_BUFFER_TOO_SMALL -2
/** An internal error was detected @hideinitializer*/
#define OPUS_INTERNAL_ERROR -3
/** The compressed data passed is corrupted @hideinitializer*/
#define OPUS_INVALID_PACKET -4
/** Invalid/unsupported request number @hideinitializer*/
#define OPUS_UNIMPLEMENTED -5
/** An encoder or decoder structure is invalid or already freed @hideinitializer*/
#define OPUS_INVALID_STATE -6
/** Memory allocation has failed @hideinitializer*/
#define OPUS_ALLOC_FAIL -7
/**@}*/
/** @cond OPUS_INTERNAL_DOC */
/**Export control for opus functions */
#ifndef OPUS_EXPORT
# if defined(WIN32)
# if defined(OPUS_BUILD) && defined(DLL_EXPORT)
# define OPUS_EXPORT __declspec(dllexport)
# else
# define OPUS_EXPORT
# endif
# elif defined(__GNUC__) && defined(OPUS_BUILD)
# define OPUS_EXPORT __attribute__ ((visibility ("default")))
# else
# define OPUS_EXPORT
# endif
#endif
# if !defined(OPUS_GNUC_PREREQ)
# if defined(__GNUC__)&&defined(__GNUC_MINOR__)
# define OPUS_GNUC_PREREQ(_maj,_min) \
((__GNUC__<<16)+__GNUC_MINOR__>=((_maj)<<16)+(_min))
# else
# define OPUS_GNUC_PREREQ(_maj,_min) 0
# endif
# endif
#if (!defined(__STDC_VERSION__) || (__STDC_VERSION__ < 199901L) )
# if OPUS_GNUC_PREREQ(3,0)
# define OPUS_RESTRICT __restrict__
# elif (defined(_MSC_VER) && _MSC_VER >= 1400)
# define OPUS_RESTRICT __restrict
# else
# define OPUS_RESTRICT
# endif
#else
# define OPUS_RESTRICT restrict
#endif
#if (!defined(__STDC_VERSION__) || (__STDC_VERSION__ < 199901L) )
# if OPUS_GNUC_PREREQ(2,7)
# define OPUS_INLINE __inline__
# elif (defined(_MSC_VER))
# define OPUS_INLINE __inline
# else
# define OPUS_INLINE
# endif
#else
# define OPUS_INLINE inline
#endif
/**Warning attributes for opus functions
* NONNULL is not used in OPUS_BUILD to avoid the compiler optimizing out
* some paranoid null checks. */
#if defined(__GNUC__) && OPUS_GNUC_PREREQ(3, 4)
# define OPUS_WARN_UNUSED_RESULT __attribute__ ((__warn_unused_result__))
#else
# define OPUS_WARN_UNUSED_RESULT
#endif
#if !defined(OPUS_BUILD) && defined(__GNUC__) && OPUS_GNUC_PREREQ(3, 4)
# define OPUS_ARG_NONNULL(_x) __attribute__ ((__nonnull__(_x)))
#else
# define OPUS_ARG_NONNULL(_x)
#endif
/** These are the actual Encoder CTL ID numbers.
* They should not be used directly by applications.
* In general, SETs should be even and GETs should be odd.*/
#define OPUS_SET_APPLICATION_REQUEST 4000
#define OPUS_GET_APPLICATION_REQUEST 4001
#define OPUS_SET_BITRATE_REQUEST 4002
#define OPUS_GET_BITRATE_REQUEST 4003
#define OPUS_SET_MAX_BANDWIDTH_REQUEST 4004
#define OPUS_GET_MAX_BANDWIDTH_REQUEST 4005
#define OPUS_SET_VBR_REQUEST 4006
#define OPUS_GET_VBR_REQUEST 4007
#define OPUS_SET_BANDWIDTH_REQUEST 4008
#define OPUS_GET_BANDWIDTH_REQUEST 4009
#define OPUS_SET_COMPLEXITY_REQUEST 4010
#define OPUS_GET_COMPLEXITY_REQUEST 4011
#define OPUS_SET_INBAND_FEC_REQUEST 4012
#define OPUS_GET_INBAND_FEC_REQUEST 4013
#define OPUS_SET_PACKET_LOSS_PERC_REQUEST 4014
#define OPUS_GET_PACKET_LOSS_PERC_REQUEST 4015
#define OPUS_SET_DTX_REQUEST 4016
#define OPUS_GET_DTX_REQUEST 4017
#define OPUS_SET_VBR_CONSTRAINT_REQUEST 4020
#define OPUS_GET_VBR_CONSTRAINT_REQUEST 4021
#define OPUS_SET_FORCE_CHANNELS_REQUEST 4022
#define OPUS_GET_FORCE_CHANNELS_REQUEST 4023
#define OPUS_SET_SIGNAL_REQUEST 4024
#define OPUS_GET_SIGNAL_REQUEST 4025
#define OPUS_GET_LOOKAHEAD_REQUEST 4027
/* #define OPUS_RESET_STATE 4028 */
#define OPUS_GET_SAMPLE_RATE_REQUEST 4029
#define OPUS_GET_FINAL_RANGE_REQUEST 4031
#define OPUS_GET_PITCH_REQUEST 4033
#define OPUS_SET_GAIN_REQUEST 4034
#define OPUS_GET_GAIN_REQUEST 4045 /* Should have been 4035 */
#define OPUS_SET_LSB_DEPTH_REQUEST 4036
#define OPUS_GET_LSB_DEPTH_REQUEST 4037
#define OPUS_GET_LAST_PACKET_DURATION_REQUEST 4039
#define OPUS_SET_EXPERT_FRAME_DURATION_REQUEST 4040
#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
/** Defines for the presence of extended APIs. */
#define OPUS_HAVE_OPUS_PROJECTION_H
/* 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))
#define __opus_check_int_ptr(ptr) ((ptr) + ((ptr) - (opus_int32*)(ptr)))
#define __opus_check_uint_ptr(ptr) ((ptr) + ((ptr) - (opus_uint32*)(ptr)))
#define __opus_check_val16_ptr(ptr) ((ptr) + ((ptr) - (opus_val16*)(ptr)))
/** @endcond */
/** @defgroup opus_ctlvalues Pre-defined values for CTL interface
* @see opus_genericctls, opus_encoderctls
* @{
*/
/* Values for the various encoder CTLs */
#define OPUS_AUTO -1000 /**<Auto/default setting @hideinitializer*/
#define OPUS_BITRATE_MAX -1 /**<Maximum bitrate @hideinitializer*/
/** Best for most VoIP/videoconference applications where listening quality and intelligibility matter most
* @hideinitializer */
#define OPUS_APPLICATION_VOIP 2048
/** Best for broadcast/high-fidelity application where the decoded audio should be as close as possible to the input
* @hideinitializer */
#define OPUS_APPLICATION_AUDIO 2049
/** Only use when lowest-achievable latency is what matters most. Voice-optimized modes cannot be used.
* @hideinitializer */
#define OPUS_APPLICATION_RESTRICTED_LOWDELAY 2051
#define OPUS_SIGNAL_VOICE 3001 /**< Signal being encoded is voice */
#define OPUS_SIGNAL_MUSIC 3002 /**< Signal being encoded is music */
#define OPUS_BANDWIDTH_NARROWBAND 1101 /**< 4 kHz bandpass @hideinitializer*/
#define OPUS_BANDWIDTH_MEDIUMBAND 1102 /**< 6 kHz bandpass @hideinitializer*/
#define OPUS_BANDWIDTH_WIDEBAND 1103 /**< 8 kHz bandpass @hideinitializer*/
#define OPUS_BANDWIDTH_SUPERWIDEBAND 1104 /**<12 kHz bandpass @hideinitializer*/
#define OPUS_BANDWIDTH_FULLBAND 1105 /**<20 kHz bandpass @hideinitializer*/
#define OPUS_FRAMESIZE_ARG 5000 /**< Select frame size from the argument (default) */
#define OPUS_FRAMESIZE_2_5_MS 5001 /**< Use 2.5 ms frames */
#define OPUS_FRAMESIZE_5_MS 5002 /**< Use 5 ms frames */
#define OPUS_FRAMESIZE_10_MS 5003 /**< Use 10 ms frames */
#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 */
/**@}*/
/** @defgroup opus_encoderctls Encoder related CTLs
*
* These are convenience macros for use with the \c opus_encode_ctl
* interface. They are used to generate the appropriate series of
* arguments for that call, passing the correct type, size and so
* on as expected for each particular request.
*
* Some usage examples:
*
* @code
* int ret;
* ret = opus_encoder_ctl(enc_ctx, OPUS_SET_BANDWIDTH(OPUS_AUTO));
* if (ret != OPUS_OK) return ret;
*
* opus_int32 rate;
* opus_encoder_ctl(enc_ctx, OPUS_GET_BANDWIDTH(&rate));
*
* opus_encoder_ctl(enc_ctx, OPUS_RESET_STATE);
* @endcode
*
* @see opus_genericctls, opus_encoder
* @{
*/
/** Configures the encoder's computational complexity.
* The supported range is 0-10 inclusive with 10 representing the highest complexity.
* @see OPUS_GET_COMPLEXITY
* @param[in] x <tt>opus_int32</tt>: Allowed values: 0-10, inclusive.
*
* @hideinitializer */
#define OPUS_SET_COMPLEXITY(x) OPUS_SET_COMPLEXITY_REQUEST, __opus_check_int(x)
/** Gets the encoder's complexity configuration.
* @see OPUS_SET_COMPLEXITY
* @param[out] x <tt>opus_int32 *</tt>: Returns a value in the range 0-10,
* inclusive.
* @hideinitializer */
#define OPUS_GET_COMPLEXITY(x) OPUS_GET_COMPLEXITY_REQUEST, __opus_check_int_ptr(x)
/** Configures the bitrate in the encoder.
* Rates from 500 to 512000 bits per second are meaningful, as well as the
* special values #OPUS_AUTO and #OPUS_BITRATE_MAX.
* The value #OPUS_BITRATE_MAX can be used to cause the codec to use as much
* rate as it can, which is useful for controlling the rate by adjusting the
* output buffer size.
* @see OPUS_GET_BITRATE
* @param[in] x <tt>opus_int32</tt>: Bitrate in bits per second. The default
* is determined based on the number of
* channels and the input sampling rate.
* @hideinitializer */
#define OPUS_SET_BITRATE(x) OPUS_SET_BITRATE_REQUEST, __opus_check_int(x)
/** Gets the encoder's bitrate configuration.
* @see OPUS_SET_BITRATE
* @param[out] x <tt>opus_int32 *</tt>: Returns the bitrate in bits per second.
* The default is determined based on the
* number of channels and the input
* sampling rate.
* @hideinitializer */
#define OPUS_GET_BITRATE(x) OPUS_GET_BITRATE_REQUEST, __opus_check_int_ptr(x)
/** Enables or disables variable bitrate (VBR) in the encoder.
* The configured bitrate may not be met exactly because frames must
* be an integer number of bytes in length.
* @see OPUS_GET_VBR
* @see OPUS_SET_VBR_CONSTRAINT
* @param[in] x <tt>opus_int32</tt>: Allowed values:
* <dl>
* <dt>0</dt><dd>Hard CBR. For LPC/hybrid modes at very low bit-rate, this can
* cause noticeable quality degradation.</dd>
* <dt>1</dt><dd>VBR (default). The exact type of VBR is controlled by
* #OPUS_SET_VBR_CONSTRAINT.</dd>
* </dl>
* @hideinitializer */
#define OPUS_SET_VBR(x) OPUS_SET_VBR_REQUEST, __opus_check_int(x)
/** Determine if variable bitrate (VBR) is enabled in the encoder.
* @see OPUS_SET_VBR
* @see OPUS_GET_VBR_CONSTRAINT
* @param[out] x <tt>opus_int32 *</tt>: Returns one of the following values:
* <dl>
* <dt>0</dt><dd>Hard CBR.</dd>
* <dt>1</dt><dd>VBR (default). The exact type of VBR may be retrieved via
* #OPUS_GET_VBR_CONSTRAINT.</dd>
* </dl>
* @hideinitializer */
#define OPUS_GET_VBR(x) OPUS_GET_VBR_REQUEST, __opus_check_int_ptr(x)
/** Enables or disables constrained VBR in the encoder.
* This setting is ignored when the encoder is in CBR mode.
* @warning Only the MDCT mode of Opus currently heeds the constraint.
* Speech mode ignores it completely, hybrid mode may fail to obey it
* if the LPC layer uses more bitrate than the constraint would have
* permitted.
* @see OPUS_GET_VBR_CONSTRAINT
* @see OPUS_SET_VBR
* @param[in] x <tt>opus_int32</tt>: Allowed values:
* <dl>
* <dt>0</dt><dd>Unconstrained VBR.</dd>
* <dt>1</dt><dd>Constrained VBR (default). This creates a maximum of one
* frame of buffering delay assuming a transport with a
* serialization speed of the nominal bitrate.</dd>
* </dl>
* @hideinitializer */
#define OPUS_SET_VBR_CONSTRAINT(x) OPUS_SET_VBR_CONSTRAINT_REQUEST, __opus_check_int(x)
/** Determine if constrained VBR is enabled in the encoder.
* @see OPUS_SET_VBR_CONSTRAINT
* @see OPUS_GET_VBR
* @param[out] x <tt>opus_int32 *</tt>: Returns one of the following values:
* <dl>
* <dt>0</dt><dd>Unconstrained VBR.</dd>
* <dt>1</dt><dd>Constrained VBR (default).</dd>
* </dl>
* @hideinitializer */
#define OPUS_GET_VBR_CONSTRAINT(x) OPUS_GET_VBR_CONSTRAINT_REQUEST, __opus_check_int_ptr(x)
/** Configures mono/stereo forcing in the encoder.
* This can force the encoder to produce packets encoded as either mono or
* stereo, regardless of the format of the input audio. This is useful when
* the caller knows that the input signal is currently a mono source embedded
* in a stereo stream.
* @see OPUS_GET_FORCE_CHANNELS
* @param[in] x <tt>opus_int32</tt>: Allowed values:
* <dl>
* <dt>#OPUS_AUTO</dt><dd>Not forced (default)</dd>
* <dt>1</dt> <dd>Forced mono</dd>
* <dt>2</dt> <dd>Forced stereo</dd>
* </dl>
* @hideinitializer */
#define OPUS_SET_FORCE_CHANNELS(x) OPUS_SET_FORCE_CHANNELS_REQUEST, __opus_check_int(x)
/** Gets the encoder's forced channel configuration.
* @see OPUS_SET_FORCE_CHANNELS
* @param[out] x <tt>opus_int32 *</tt>:
* <dl>
* <dt>#OPUS_AUTO</dt><dd>Not forced (default)</dd>
* <dt>1</dt> <dd>Forced mono</dd>
* <dt>2</dt> <dd>Forced stereo</dd>
* </dl>
* @hideinitializer */
#define OPUS_GET_FORCE_CHANNELS(x) OPUS_GET_FORCE_CHANNELS_REQUEST, __opus_check_int_ptr(x)
/** Configures the maximum bandpass that the encoder will select automatically.
* Applications should normally use this instead of #OPUS_SET_BANDWIDTH
* (leaving that set to the default, #OPUS_AUTO). This allows the
* application to set an upper bound based on the type of input it is
* providing, but still gives the encoder the freedom to reduce the bandpass
* when the bitrate becomes too low, for better overall quality.
* @see OPUS_GET_MAX_BANDWIDTH
* @param[in] x <tt>opus_int32</tt>: Allowed values:
* <dl>
* <dt>OPUS_BANDWIDTH_NARROWBAND</dt> <dd>4 kHz passband</dd>
* <dt>OPUS_BANDWIDTH_MEDIUMBAND</dt> <dd>6 kHz passband</dd>
* <dt>OPUS_BANDWIDTH_WIDEBAND</dt> <dd>8 kHz passband</dd>
* <dt>OPUS_BANDWIDTH_SUPERWIDEBAND</dt><dd>12 kHz passband</dd>
* <dt>OPUS_BANDWIDTH_FULLBAND</dt> <dd>20 kHz passband (default)</dd>
* </dl>
* @hideinitializer */
#define OPUS_SET_MAX_BANDWIDTH(x) OPUS_SET_MAX_BANDWIDTH_REQUEST, __opus_check_int(x)
/** Gets the encoder's configured maximum allowed bandpass.
* @see OPUS_SET_MAX_BANDWIDTH
* @param[out] x <tt>opus_int32 *</tt>: Allowed values:
* <dl>
* <dt>#OPUS_BANDWIDTH_NARROWBAND</dt> <dd>4 kHz passband</dd>
* <dt>#OPUS_BANDWIDTH_MEDIUMBAND</dt> <dd>6 kHz passband</dd>
* <dt>#OPUS_BANDWIDTH_WIDEBAND</dt> <dd>8 kHz passband</dd>
* <dt>#OPUS_BANDWIDTH_SUPERWIDEBAND</dt><dd>12 kHz passband</dd>
* <dt>#OPUS_BANDWIDTH_FULLBAND</dt> <dd>20 kHz passband (default)</dd>
* </dl>
* @hideinitializer */
#define OPUS_GET_MAX_BANDWIDTH(x) OPUS_GET_MAX_BANDWIDTH_REQUEST, __opus_check_int_ptr(x)
/** Sets the encoder's bandpass to a specific value.
* This prevents the encoder from automatically selecting the bandpass based
* on the available bitrate. If an application knows the bandpass of the input
* audio it is providing, it should normally use #OPUS_SET_MAX_BANDWIDTH
* instead, which still gives the encoder the freedom to reduce the bandpass
* when the bitrate becomes too low, for better overall quality.
* @see OPUS_GET_BANDWIDTH
* @param[in] x <tt>opus_int32</tt>: Allowed values:
* <dl>
* <dt>#OPUS_AUTO</dt> <dd>(default)</dd>
* <dt>#OPUS_BANDWIDTH_NARROWBAND</dt> <dd>4 kHz passband</dd>
* <dt>#OPUS_BANDWIDTH_MEDIUMBAND</dt> <dd>6 kHz passband</dd>
* <dt>#OPUS_BANDWIDTH_WIDEBAND</dt> <dd>8 kHz passband</dd>
* <dt>#OPUS_BANDWIDTH_SUPERWIDEBAND</dt><dd>12 kHz passband</dd>
* <dt>#OPUS_BANDWIDTH_FULLBAND</dt> <dd>20 kHz passband</dd>
* </dl>
* @hideinitializer */
#define OPUS_SET_BANDWIDTH(x) OPUS_SET_BANDWIDTH_REQUEST, __opus_check_int(x)
/** Configures the type of signal being encoded.
* This is a hint which helps the encoder's mode selection.
* @see OPUS_GET_SIGNAL
* @param[in] x <tt>opus_int32</tt>: Allowed values:
* <dl>
* <dt>#OPUS_AUTO</dt> <dd>(default)</dd>
* <dt>#OPUS_SIGNAL_VOICE</dt><dd>Bias thresholds towards choosing LPC or Hybrid modes.</dd>
* <dt>#OPUS_SIGNAL_MUSIC</dt><dd>Bias thresholds towards choosing MDCT modes.</dd>
* </dl>
* @hideinitializer */
#define OPUS_SET_SIGNAL(x) OPUS_SET_SIGNAL_REQUEST, __opus_check_int(x)
/** Gets the encoder's configured signal type.
* @see OPUS_SET_SIGNAL
* @param[out] x <tt>opus_int32 *</tt>: Returns one of the following values:
* <dl>
* <dt>#OPUS_AUTO</dt> <dd>(default)</dd>
* <dt>#OPUS_SIGNAL_VOICE</dt><dd>Bias thresholds towards choosing LPC or Hybrid modes.</dd>
* <dt>#OPUS_SIGNAL_MUSIC</dt><dd>Bias thresholds towards choosing MDCT modes.</dd>
* </dl>
* @hideinitializer */
#define OPUS_GET_SIGNAL(x) OPUS_GET_SIGNAL_REQUEST, __opus_check_int_ptr(x)
/** Configures the encoder's intended application.
* The initial value is a mandatory argument to the encoder_create function.
* @see OPUS_GET_APPLICATION
* @param[in] x <tt>opus_int32</tt>: Returns one of the following values:
* <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>
* @hideinitializer */
#define OPUS_SET_APPLICATION(x) OPUS_SET_APPLICATION_REQUEST, __opus_check_int(x)
/** Gets the encoder's configured application.
* @see OPUS_SET_APPLICATION
* @param[out] x <tt>opus_int32 *</tt>: Returns one of the following values:
* <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>
* @hideinitializer */
#define OPUS_GET_APPLICATION(x) OPUS_GET_APPLICATION_REQUEST, __opus_check_int_ptr(x)
/** Gets the total samples of delay added by the entire codec.
* This can be queried by the encoder and then the provided number of samples can be
* skipped on from the start of the decoder's output to provide time aligned input
* and output. From the perspective of a decoding application the real data begins this many
* samples late.
*
* The decoder contribution to this delay is identical for all decoders, but the
* encoder portion of the delay may vary from implementation to implementation,
* version to version, or even depend on the encoder's initial configuration.
* Applications needing delay compensation should call this CTL rather than
* hard-coding a value.
* @param[out] x <tt>opus_int32 *</tt>: Number of lookahead samples
* @hideinitializer */
#define OPUS_GET_LOOKAHEAD(x) OPUS_GET_LOOKAHEAD_REQUEST, __opus_check_int_ptr(x)
/** Configures the encoder's use of inband forward error correction (FEC).
* @note This is only applicable to the LPC layer
* @see OPUS_GET_INBAND_FEC
* @param[in] x <tt>opus_int32</tt>: Allowed values:
* <dl>
* <dt>0</dt><dd>Disable inband FEC (default).</dd>
* <dt>1</dt><dd>Enable inband FEC.</dd>
* </dl>
* @hideinitializer */
#define OPUS_SET_INBAND_FEC(x) OPUS_SET_INBAND_FEC_REQUEST, __opus_check_int(x)
/** Gets encoder's configured use of inband forward error correction.
* @see OPUS_SET_INBAND_FEC
* @param[out] x <tt>opus_int32 *</tt>: Returns one of the following values:
* <dl>
* <dt>0</dt><dd>Inband FEC disabled (default).</dd>
* <dt>1</dt><dd>Inband FEC enabled.</dd>
* </dl>
* @hideinitializer */
#define OPUS_GET_INBAND_FEC(x) OPUS_GET_INBAND_FEC_REQUEST, __opus_check_int_ptr(x)
/** Configures the encoder's expected packet loss percentage.
* Higher values trigger progressively more loss resistant behavior in the encoder
* at the expense of quality at a given bitrate in the absence of packet loss, but
* greater quality under loss.
* @see OPUS_GET_PACKET_LOSS_PERC
* @param[in] x <tt>opus_int32</tt>: Loss percentage in the range 0-100, inclusive (default: 0).
* @hideinitializer */
#define OPUS_SET_PACKET_LOSS_PERC(x) OPUS_SET_PACKET_LOSS_PERC_REQUEST, __opus_check_int(x)
/** Gets the encoder's configured packet loss percentage.
* @see OPUS_SET_PACKET_LOSS_PERC
* @param[out] x <tt>opus_int32 *</tt>: Returns the configured loss percentage
* in the range 0-100, inclusive (default: 0).
* @hideinitializer */
#define OPUS_GET_PACKET_LOSS_PERC(x) OPUS_GET_PACKET_LOSS_PERC_REQUEST, __opus_check_int_ptr(x)
/** Configures the encoder's use of discontinuous transmission (DTX).
* @note This is only applicable to the LPC layer
* @see OPUS_GET_DTX
* @param[in] x <tt>opus_int32</tt>: Allowed values:
* <dl>
* <dt>0</dt><dd>Disable DTX (default).</dd>
* <dt>1</dt><dd>Enabled DTX.</dd>
* </dl>
* @hideinitializer */
#define OPUS_SET_DTX(x) OPUS_SET_DTX_REQUEST, __opus_check_int(x)
/** Gets encoder's configured use of discontinuous transmission.
* @see OPUS_SET_DTX
* @param[out] x <tt>opus_int32 *</tt>: Returns one of the following values:
* <dl>
* <dt>0</dt><dd>DTX disabled (default).</dd>
* <dt>1</dt><dd>DTX enabled.</dd>
* </dl>
* @hideinitializer */
#define OPUS_GET_DTX(x) OPUS_GET_DTX_REQUEST, __opus_check_int_ptr(x)
/** Configures the depth of signal being encoded.
*
* This is a hint which helps the encoder identify silence and near-silence.
* It represents the number of significant bits of linear intensity below
* which the signal contains ignorable quantization or other noise.
*
* For example, OPUS_SET_LSB_DEPTH(14) would be an appropriate setting
* for G.711 u-law input. OPUS_SET_LSB_DEPTH(16) would be appropriate
* for 16-bit linear pcm input with opus_encode_float().
*
* When using opus_encode() instead of opus_encode_float(), or when libopus
* is compiled for fixed-point, the encoder uses the minimum of the value
* set here and the value 16.
*
* @see OPUS_GET_LSB_DEPTH
* @param[in] x <tt>opus_int32</tt>: Input precision in bits, between 8 and 24
* (default: 24).
* @hideinitializer */
#define OPUS_SET_LSB_DEPTH(x) OPUS_SET_LSB_DEPTH_REQUEST, __opus_check_int(x)
/** Gets the encoder's configured signal depth.
* @see OPUS_SET_LSB_DEPTH
* @param[out] x <tt>opus_int32 *</tt>: Input precision in bits, between 8 and
* 24 (default: 24).
* @hideinitializer */
#define OPUS_GET_LSB_DEPTH(x) OPUS_GET_LSB_DEPTH_REQUEST, __opus_check_int_ptr(x)
/** Configures the encoder's use of variable duration frames.
* When variable duration is enabled, the encoder is free to use a shorter frame
* size than the one requested in the opus_encode*() call.
* It is then the user's responsibility
* to verify how much audio was encoded by checking the ToC byte of the encoded
* packet. The part of the audio that was not encoded needs to be resent to the
* encoder for the next call. Do not use this option unless you <b>really</b>
* know what you are doing.
* @see OPUS_GET_EXPERT_FRAME_DURATION
* @param[in] x <tt>opus_int32</tt>: Allowed values:
* <dl>
* <dt>OPUS_FRAMESIZE_ARG</dt><dd>Select frame size from the argument (default).</dd>
* <dt>OPUS_FRAMESIZE_2_5_MS</dt><dd>Use 2.5 ms frames.</dd>
* <dt>OPUS_FRAMESIZE_5_MS</dt><dd>Use 5 ms frames.</dd>
* <dt>OPUS_FRAMESIZE_10_MS</dt><dd>Use 10 ms frames.</dd>
* <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>
* </dl>
* @hideinitializer */
#define OPUS_SET_EXPERT_FRAME_DURATION(x) OPUS_SET_EXPERT_FRAME_DURATION_REQUEST, __opus_check_int(x)
/** Gets the encoder's configured use of variable duration frames.
* @see OPUS_SET_EXPERT_FRAME_DURATION
* @param[out] x <tt>opus_int32 *</tt>: Returns one of the following values:
* <dl>
* <dt>OPUS_FRAMESIZE_ARG</dt><dd>Select frame size from the argument (default).</dd>
* <dt>OPUS_FRAMESIZE_2_5_MS</dt><dd>Use 2.5 ms frames.</dd>
* <dt>OPUS_FRAMESIZE_5_MS</dt><dd>Use 5 ms frames.</dd>
* <dt>OPUS_FRAMESIZE_10_MS</dt><dd>Use 10 ms frames.</dd>
* <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>
* </dl>
* @hideinitializer */
#define OPUS_GET_EXPERT_FRAME_DURATION(x) OPUS_GET_EXPERT_FRAME_DURATION_REQUEST, __opus_check_int_ptr(x)
/** If set to 1, disables almost all use of prediction, making frames almost
* completely independent. This reduces quality.
* @see OPUS_GET_PREDICTION_DISABLED
* @param[in] x <tt>opus_int32</tt>: Allowed values:
* <dl>
* <dt>0</dt><dd>Enable prediction (default).</dd>
* <dt>1</dt><dd>Disable prediction.</dd>
* </dl>
* @hideinitializer */
#define OPUS_SET_PREDICTION_DISABLED(x) OPUS_SET_PREDICTION_DISABLED_REQUEST, __opus_check_int(x)
/** Gets the encoder's configured prediction status.
* @see OPUS_SET_PREDICTION_DISABLED
* @param[out] x <tt>opus_int32 *</tt>: Returns one of the following values:
* <dl>
* <dt>0</dt><dd>Prediction enabled (default).</dd>
* <dt>1</dt><dd>Prediction disabled.</dd>
* </dl>
* @hideinitializer */
#define OPUS_GET_PREDICTION_DISABLED(x) OPUS_GET_PREDICTION_DISABLED_REQUEST, __opus_check_int_ptr(x)
/**@}*/
/** @defgroup opus_genericctls Generic CTLs
*
* These macros are used with the \c opus_decoder_ctl and
* \c opus_encoder_ctl calls to generate a particular
* request.
*
* When called on an \c OpusDecoder they apply to that
* particular decoder instance. When called on an
* \c OpusEncoder they apply to the corresponding setting
* on that encoder instance, if present.
*
* Some usage examples:
*
* @code
* int ret;
* opus_int32 pitch;
* ret = opus_decoder_ctl(dec_ctx, OPUS_GET_PITCH(&pitch));
* if (ret == OPUS_OK) return ret;
*
* opus_encoder_ctl(enc_ctx, OPUS_RESET_STATE);
* opus_decoder_ctl(dec_ctx, OPUS_RESET_STATE);
*
* opus_int32 enc_bw, dec_bw;
* opus_encoder_ctl(enc_ctx, OPUS_GET_BANDWIDTH(&enc_bw));
* opus_decoder_ctl(dec_ctx, OPUS_GET_BANDWIDTH(&dec_bw));
* if (enc_bw != dec_bw) {
* printf("packet bandwidth mismatch!\n");
* }
* @endcode
*
* @see opus_encoder, opus_decoder_ctl, opus_encoder_ctl, opus_decoderctls, opus_encoderctls
* @{
*/
/** Resets the codec state to be equivalent to a freshly initialized state.
* This should be called when switching streams in order to prevent
* the back to back decoding from giving different results from
* one at a time decoding.
* @hideinitializer */
#define OPUS_RESET_STATE 4028
/** Gets the final state of the codec's entropy coder.
* This is used for testing purposes,
* The encoder and decoder state should be identical after coding a payload
* (assuming no data corruption or software bugs)
*
* @param[out] x <tt>opus_uint32 *</tt>: Entropy coder state
*
* @hideinitializer */
#define OPUS_GET_FINAL_RANGE(x) OPUS_GET_FINAL_RANGE_REQUEST, __opus_check_uint_ptr(x)
/** Gets the encoder's configured bandpass or the decoder's last bandpass.
* @see OPUS_SET_BANDWIDTH
* @param[out] x <tt>opus_int32 *</tt>: Returns one of the following values:
* <dl>
* <dt>#OPUS_AUTO</dt> <dd>(default)</dd>
* <dt>#OPUS_BANDWIDTH_NARROWBAND</dt> <dd>4 kHz passband</dd>
* <dt>#OPUS_BANDWIDTH_MEDIUMBAND</dt> <dd>6 kHz passband</dd>
* <dt>#OPUS_BANDWIDTH_WIDEBAND</dt> <dd>8 kHz passband</dd>
* <dt>#OPUS_BANDWIDTH_SUPERWIDEBAND</dt><dd>12 kHz passband</dd>
* <dt>#OPUS_BANDWIDTH_FULLBAND</dt> <dd>20 kHz passband</dd>
* </dl>
* @hideinitializer */
#define OPUS_GET_BANDWIDTH(x) OPUS_GET_BANDWIDTH_REQUEST, __opus_check_int_ptr(x)
/** Gets the sampling rate the encoder or decoder was initialized with.
* This simply returns the <code>Fs</code> value passed to opus_encoder_init()
* or opus_decoder_init().
* @param[out] x <tt>opus_int32 *</tt>: Sampling rate of encoder or decoder.
* @hideinitializer
*/
#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)
/**@}*/
/** @defgroup opus_decoderctls Decoder related CTLs
* @see opus_genericctls, opus_encoderctls, opus_decoder
* @{
*/
/** Configures decoder gain adjustment.
* Scales the decoded output by a factor specified in Q8 dB units.
* This has a maximum range of -32768 to 32767 inclusive, and returns
* OPUS_BAD_ARG otherwise. The default is zero indicating no adjustment.
* This setting survives decoder reset.
*
* gain = pow(10, x/(20.0*256))
*
* @param[in] x <tt>opus_int32</tt>: Amount to scale PCM signal by in Q8 dB units.
* @hideinitializer */
#define OPUS_SET_GAIN(x) OPUS_SET_GAIN_REQUEST, __opus_check_int(x)
/** Gets the decoder's configured gain adjustment. @see OPUS_SET_GAIN
*
* @param[out] x <tt>opus_int32 *</tt>: Amount to scale PCM signal by in Q8 dB units.
* @hideinitializer */
#define OPUS_GET_GAIN(x) OPUS_GET_GAIN_REQUEST, __opus_check_int_ptr(x)
/** Gets the duration (in samples) of the last packet successfully decoded or concealed.
* @param[out] x <tt>opus_int32 *</tt>: Number of samples (at current sampling rate).
* @hideinitializer */
#define OPUS_GET_LAST_PACKET_DURATION(x) OPUS_GET_LAST_PACKET_DURATION_REQUEST, __opus_check_int_ptr(x)
/** Gets the pitch of the last decoded frame, if available.
* This can be used for any post-processing algorithm requiring the use of pitch,
* e.g. time stretching/shortening. If the last frame was not voiced, or if the
* pitch was not coded in the frame, then zero is returned.
*
* This CTL is only implemented for decoder instances.
*
* @param[out] x <tt>opus_int32 *</tt>: pitch period at 48 kHz (or 0 if not available)
*
* @hideinitializer */
#define OPUS_GET_PITCH(x) OPUS_GET_PITCH_REQUEST, __opus_check_int_ptr(x)
/**@}*/
/** @defgroup opus_libinfo Opus library information functions
* @{
*/
/** Converts an opus error code into a human readable string.
*
* @param[in] error <tt>int</tt>: Error number
* @returns Error string
*/
OPUS_EXPORT const char *opus_strerror(int error);
/** Gets the libopus version string.
*
* Applications may look for the substring "-fixed" in the version string to
* determine whether they have a fixed-point or floating-point build at
* runtime.
*
* @returns Version string
*/
OPUS_EXPORT const char *opus_get_version_string(void);
/**@}*/
#ifdef __cplusplus
}
#endif
#endif /* OPUS_DEFINES_H */

View File

@@ -0,0 +1,660 @@
/* Copyright (c) 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.
*/
/**
* @file opus_multistream.h
* @brief Opus reference implementation multistream API
*/
#ifndef OPUS_MULTISTREAM_H
#define OPUS_MULTISTREAM_H
#include "opus.h"
#ifdef __cplusplus
extern "C" {
#endif
/** @cond OPUS_INTERNAL_DOC */
/** Macros to trigger compilation errors when the wrong types are provided to a
* CTL. */
/**@{*/
#define __opus_check_encstate_ptr(ptr) ((ptr) + ((ptr) - (OpusEncoder**)(ptr)))
#define __opus_check_decstate_ptr(ptr) ((ptr) + ((ptr) - (OpusDecoder**)(ptr)))
/**@}*/
/** These are the actual encoder and decoder CTL ID numbers.
* They should not be used directly by applications.
* In general, SETs should be even and GETs should be odd.*/
/**@{*/
#define OPUS_MULTISTREAM_GET_ENCODER_STATE_REQUEST 5120
#define OPUS_MULTISTREAM_GET_DECODER_STATE_REQUEST 5122
/**@}*/
/** @endcond */
/** @defgroup opus_multistream_ctls Multistream specific encoder and decoder CTLs
*
* These are convenience macros that are specific to the
* opus_multistream_encoder_ctl() and opus_multistream_decoder_ctl()
* interface.
* The CTLs from @ref opus_genericctls, @ref opus_encoderctls, and
* @ref opus_decoderctls may be applied to a multistream encoder or decoder as
* well.
* In addition, you may retrieve the encoder or decoder state for an specific
* stream via #OPUS_MULTISTREAM_GET_ENCODER_STATE or
* #OPUS_MULTISTREAM_GET_DECODER_STATE and apply CTLs to it individually.
*/
/**@{*/
/** Gets the encoder state for an individual stream of a multistream encoder.
* @param[in] x <tt>opus_int32</tt>: The index of the stream whose encoder you
* wish to retrieve.
* This must be non-negative and less than
* the <code>streams</code> parameter used
* to initialize the encoder.
* @param[out] y <tt>OpusEncoder**</tt>: Returns a pointer to the given
* encoder state.
* @retval OPUS_BAD_ARG The index of the requested stream was out of range.
* @hideinitializer
*/
#define OPUS_MULTISTREAM_GET_ENCODER_STATE(x,y) OPUS_MULTISTREAM_GET_ENCODER_STATE_REQUEST, __opus_check_int(x), __opus_check_encstate_ptr(y)
/** Gets the decoder state for an individual stream of a multistream decoder.
* @param[in] x <tt>opus_int32</tt>: The index of the stream whose decoder you
* wish to retrieve.
* This must be non-negative and less than
* the <code>streams</code> parameter used
* to initialize the decoder.
* @param[out] y <tt>OpusDecoder**</tt>: Returns a pointer to the given
* decoder state.
* @retval OPUS_BAD_ARG The index of the requested stream was out of range.
* @hideinitializer
*/
#define OPUS_MULTISTREAM_GET_DECODER_STATE(x,y) OPUS_MULTISTREAM_GET_DECODER_STATE_REQUEST, __opus_check_int(x), __opus_check_decstate_ptr(y)
/**@}*/
/** @defgroup opus_multistream Opus Multistream API
* @{
*
* The multistream API allows individual Opus streams to be combined into a
* single packet, enabling support for up to 255 channels. Unlike an
* elementary Opus stream, the encoder and decoder must negotiate the channel
* configuration before the decoder can successfully interpret the data in the
* packets produced by the encoder. Some basic information, such as packet
* duration, can be computed without any special negotiation.
*
* The format for multistream Opus packets is defined in
* <a href="https://tools.ietf.org/html/rfc7845">RFC 7845</a>
* and is based on the self-delimited Opus framing described in Appendix B of
* <a href="https://tools.ietf.org/html/rfc6716">RFC 6716</a>.
* Normal Opus packets are just a degenerate case of multistream Opus packets,
* and can be encoded or decoded with the multistream API by setting
* <code>streams</code> to <code>1</code> when initializing the encoder or
* decoder.
*
* Multistream Opus streams can contain up to 255 elementary Opus streams.
* These may be either "uncoupled" or "coupled", indicating that the decoder
* is configured to decode them to either 1 or 2 channels, respectively.
* The streams are ordered so that all coupled streams appear at the
* beginning.
*
* A <code>mapping</code> table defines which decoded channel <code>i</code>
* should be used for each input/output (I/O) channel <code>j</code>. This table is
* typically provided as an unsigned char array.
* Let <code>i = mapping[j]</code> be the index for I/O channel <code>j</code>.
* If <code>i < 2*coupled_streams</code>, then I/O channel <code>j</code> is
* encoded as the left channel of stream <code>(i/2)</code> if <code>i</code>
* is even, or as the right channel of stream <code>(i/2)</code> if
* <code>i</code> is odd. Otherwise, I/O channel <code>j</code> is encoded as
* mono in stream <code>(i - coupled_streams)</code>, unless it has the special
* value 255, in which case it is omitted from the encoding entirely (the
* decoder will reproduce it as silence). Each value <code>i</code> must either
* be the special value 255 or be less than <code>streams + coupled_streams</code>.
*
* The output channels specified by the encoder
* should use the
* <a href="https://www.xiph.org/vorbis/doc/Vorbis_I_spec.html#x1-810004.3.9">Vorbis
* channel ordering</a>. A decoder may wish to apply an additional permutation
* to the mapping the encoder used to achieve a different output channel
* order (e.g. for outputing in WAV order).
*
* Each multistream packet contains an Opus packet for each stream, and all of
* the Opus packets in a single multistream packet must have the same
* duration. Therefore the duration of a multistream packet can be extracted
* from the TOC sequence of the first stream, which is located at the
* beginning of the packet, just like an elementary Opus stream:
*
* @code
* int nb_samples;
* int nb_frames;
* nb_frames = opus_packet_get_nb_frames(data, len);
* if (nb_frames < 1)
* return nb_frames;
* nb_samples = opus_packet_get_samples_per_frame(data, 48000) * nb_frames;
* @endcode
*
* The general encoding and decoding process proceeds exactly the same as in
* the normal @ref opus_encoder and @ref opus_decoder APIs.
* See their documentation for an overview of how to use the corresponding
* multistream functions.
*/
/** Opus multistream encoder state.
* This contains the complete state of a multistream Opus encoder.
* It is position independent and can be freely copied.
* @see opus_multistream_encoder_create
* @see opus_multistream_encoder_init
*/
typedef struct OpusMSEncoder OpusMSEncoder;
/** Opus multistream decoder state.
* This contains the complete state of a multistream Opus decoder.
* It is position independent and can be freely copied.
* @see opus_multistream_decoder_create
* @see opus_multistream_decoder_init
*/
typedef struct OpusMSDecoder OpusMSDecoder;
/**\name Multistream encoder functions */
/**@{*/
/** Gets the size of an OpusMSEncoder structure.
* @param streams <tt>int</tt>: The total number of streams to encode from the
* input.
* This must be no more than 255.
* @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 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_multistream_encoder_get_size(
int streams,
int coupled_streams
);
OPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_multistream_surround_encoder_get_size(
int channels,
int mapping_family
);
/** Allocates and initializes a multistream encoder state.
* Call opus_multistream_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 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[in] mapping <code>const unsigned char[channels]</code>: Mapping from
* encoded channels to input channels, as described in
* @ref opus_multistream. As an extra constraint, the
* multistream encoder does not allow encoding coupled
* streams for which one channel is unused since this
* is never a good idea.
* @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 OpusMSEncoder *opus_multistream_encoder_create(
opus_int32 Fs,
int channels,
int streams,
int coupled_streams,
const unsigned char *mapping,
int application,
int *error
) OPUS_ARG_NONNULL(5);
OPUS_EXPORT OPUS_WARN_UNUSED_RESULT OpusMSEncoder *opus_multistream_surround_encoder_create(
opus_int32 Fs,
int channels,
int mapping_family,
int *streams,
int *coupled_streams,
unsigned char *mapping,
int application,
int *error
) OPUS_ARG_NONNULL(4) OPUS_ARG_NONNULL(5) OPUS_ARG_NONNULL(6);
/** Initialize a previously allocated multistream encoder state.
* The memory pointed to by \a st must be at least the size returned by
* opus_multistream_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_multistream_encoder_create
* @see opus_multistream_encoder_get_size
* @param st <tt>OpusMSEncoder*</tt>: Multistream 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[in] mapping <code>const unsigned char[channels]</code>: Mapping from
* encoded channels to input channels, as described in
* @ref opus_multistream. As an extra constraint, the
* multistream encoder does not allow encoding coupled
* streams for which one channel is unused since this
* is never a good idea.
* @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_multistream_encoder_init(
OpusMSEncoder *st,
opus_int32 Fs,
int channels,
int streams,
int coupled_streams,
const unsigned char *mapping,
int application
) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(6);
OPUS_EXPORT int opus_multistream_surround_encoder_init(
OpusMSEncoder *st,
opus_int32 Fs,
int channels,
int mapping_family,
int *streams,
int *coupled_streams,
unsigned char *mapping,
int application
) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(5) OPUS_ARG_NONNULL(6) OPUS_ARG_NONNULL(7);
/** Encodes a multistream Opus frame.
* @param st <tt>OpusMSEncoder*</tt>: Multistream 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_multistream_encode(
OpusMSEncoder *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 multistream Opus frame from floating point input.
* @param st <tt>OpusMSEncoder*</tt>: Multistream 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_multistream_encode_float(
OpusMSEncoder *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>OpusMSEncoder</code> allocated by
* opus_multistream_encoder_create().
* @param st <tt>OpusMSEncoder*</tt>: Multistream encoder state to be freed.
*/
OPUS_EXPORT void opus_multistream_encoder_destroy(OpusMSEncoder *st);
/** Perform a CTL function on a multistream Opus encoder.
*
* Generally the request and subsequent arguments are generated by a
* convenience macro.
* @param st <tt>OpusMSEncoder*</tt>: Multistream 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, or @ref opus_multistream_ctls.
* @see opus_genericctls
* @see opus_encoderctls
* @see opus_multistream_ctls
*/
OPUS_EXPORT int opus_multistream_encoder_ctl(OpusMSEncoder *st, int request, ...) OPUS_ARG_NONNULL(1);
/**@}*/
/**\name Multistream decoder functions */
/**@{*/
/** Gets the size of an <code>OpusMSDecoder</code> structure.
* @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_multistream_decoder_get_size(
int streams,
int coupled_streams
);
/** Allocates and initializes a multistream decoder state.
* Call opus_multistream_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] mapping <code>const unsigned char[channels]</code>: Mapping from
* coded channels to output channels, as described in
* @ref opus_multistream.
* @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 OpusMSDecoder *opus_multistream_decoder_create(
opus_int32 Fs,
int channels,
int streams,
int coupled_streams,
const unsigned char *mapping,
int *error
) OPUS_ARG_NONNULL(5);
/** Intialize a previously allocated decoder state object.
* The memory pointed to by \a st must be at least the size returned by
* opus_multistream_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_multistream_decoder_create
* @see opus_multistream_deocder_get_size
* @param st <tt>OpusMSEncoder*</tt>: Multistream 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] mapping <code>const unsigned char[channels]</code>: Mapping from
* coded channels to output channels, as described in
* @ref opus_multistream.
* @returns #OPUS_OK on success, or an error code (see @ref opus_errorcodes)
* on failure.
*/
OPUS_EXPORT int opus_multistream_decoder_init(
OpusMSDecoder *st,
opus_int32 Fs,
int channels,
int streams,
int coupled_streams,
const unsigned char *mapping
) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(6);
/** Decode a multistream Opus packet.
* @param st <tt>OpusMSDecoder*</tt>: Multistream 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_multistream_decode(
OpusMSDecoder *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 multistream Opus packet with floating point output.
* @param st <tt>OpusMSDecoder*</tt>: Multistream 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_multistream_decode_float(
OpusMSDecoder *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 multistream Opus decoder.
*
* Generally the request and subsequent arguments are generated by a
* convenience macro.
* @param st <tt>OpusMSDecoder*</tt>: Multistream 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, or @ref opus_multistream_ctls.
* @see opus_genericctls
* @see opus_decoderctls
* @see opus_multistream_ctls
*/
OPUS_EXPORT int opus_multistream_decoder_ctl(OpusMSDecoder *st, int request, ...) OPUS_ARG_NONNULL(1);
/** Frees an <code>OpusMSDecoder</code> allocated by
* opus_multistream_decoder_create().
* @param st <tt>OpusMSDecoder</tt>: Multistream decoder state to be freed.
*/
OPUS_EXPORT void opus_multistream_decoder_destroy(OpusMSDecoder *st);
/**@}*/
/**@}*/
#ifdef __cplusplus
}
#endif
#endif /* OPUS_MULTISTREAM_H */

View File

@@ -0,0 +1,568 @@
/* 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 */

View File

@@ -0,0 +1,166 @@
/* (C) COPYRIGHT 1994-2002 Xiph.Org Foundation */
/* Modified 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.
*/
/* opus_types.h based on ogg_types.h from libogg */
/**
@file opus_types.h
@brief Opus reference implementation types
*/
#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))
#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__)
# include <_G_config.h>
typedef _G_int32_t opus_int32;
typedef _G_uint32_t opus_uint32;
typedef _G_int16 opus_int16;
typedef _G_uint16 opus_uint16;
# elif defined(__MINGW32__)
typedef short opus_int16;
typedef unsigned short opus_uint16;
typedef int opus_int32;
typedef unsigned int opus_uint32;
# elif defined(__MWERKS__)
typedef int opus_int32;
typedef unsigned int opus_uint32;
typedef short opus_int16;
typedef unsigned short opus_uint16;
# else
/* MSVC/Borland */
typedef __int32 opus_int32;
typedef unsigned __int32 opus_uint32;
typedef __int16 opus_int16;
typedef unsigned __int16 opus_uint16;
# endif
#elif defined(__MACOS__)
# include <sys/types.h>
typedef SInt16 opus_int16;
typedef UInt16 opus_uint16;
typedef SInt32 opus_int32;
typedef UInt32 opus_uint32;
#elif (defined(__APPLE__) && defined(__MACH__)) /* MacOS X Framework build */
# include <sys/types.h>
typedef int16_t opus_int16;
typedef u_int16_t opus_uint16;
typedef int32_t opus_int32;
typedef u_int32_t opus_uint32;
#elif defined(__BEOS__)
/* Be */
# include <inttypes.h>
typedef int16 opus_int16;
typedef u_int16 opus_uint16;
typedef int32_t opus_int32;
typedef u_int32_t opus_uint32;
#elif defined (__EMX__)
/* OS/2 GCC */
typedef short opus_int16;
typedef unsigned short opus_uint16;
typedef int opus_int32;
typedef unsigned int opus_uint32;
#elif defined (DJGPP)
/* DJGPP */
typedef short opus_int16;
typedef unsigned short opus_uint16;
typedef int opus_int32;
typedef unsigned int opus_uint32;
#elif defined(R5900)
/* PS2 EE */
typedef int opus_int32;
typedef unsigned opus_uint32;
typedef short opus_int16;
typedef unsigned short opus_uint16;
#elif defined(__SYMBIAN32__)
/* Symbian GCC */
typedef signed short opus_int16;
typedef unsigned short opus_uint16;
typedef signed int opus_int32;
typedef unsigned int opus_uint32;
#elif defined(CONFIG_TI_C54X) || defined (CONFIG_TI_C55X)
typedef short opus_int16;
typedef unsigned short opus_uint16;
typedef long opus_int32;
typedef unsigned long opus_uint32;
#elif defined(CONFIG_TI_C6X)
typedef short opus_int16;
typedef unsigned short opus_uint16;
typedef int opus_int32;
typedef unsigned int opus_uint32;
#else
/* Give up, take a reasonable guess */
typedef short opus_int16;
typedef unsigned short opus_uint16;
typedef int opus_int32;
typedef unsigned int opus_uint32;
#endif
#endif /* OPUS_TYPES_H */

View File

@@ -0,0 +1,358 @@
/* Copyright (c) 2017 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.
*/
#if !defined(_opusenc_h)
# define _opusenc_h (1)
/**\mainpage
\section Introduction
This is the documentation for the <tt>libopusenc</tt> C API.
The <tt>libopusenc</tt> package provides a convenient high-level API for
encoding Ogg Opus files.
\section Organization
The main API is divided into several sections:
- \ref encoding
- \ref comments
- \ref encoder_ctl
- \ref callbacks
- \ref error_codes
\section Overview
The <tt>libopusfile</tt> API provides an easy way to encode Ogg Opus files using
<tt>libopus</tt>.
*/
# if defined(__cplusplus)
extern "C" {
# endif
#include <opus.h>
#ifndef OPE_EXPORT
# if defined(WIN32)
# if defined(OPE_BUILD) && defined(DLL_EXPORT)
# define OPE_EXPORT __declspec(dllexport)
# else
# define OPE_EXPORT
# endif
# elif defined(__GNUC__) && defined(OPE_BUILD)
# define OPE_EXPORT __attribute__ ((visibility ("default")))
# else
# define OPE_EXPORT
# endif
#endif
/**\defgroup error_codes Error Codes*/
/*@{*/
/**\name List of possible error codes
Many of the functions in this library return a negative error code when a
function fails.
This list provides a brief explanation of the common errors.
See each individual function for more details on what a specific error code
means in that context.*/
/*@{*/
/* Bump this when we change the API. */
/** API version for this header. Can be used to check for features at compile time. */
#define OPE_API_VERSION 0
#define OPE_OK 0
/* Based on the relevant libopus code minus 10. */
#define OPE_BAD_ARG -11
#define OPE_INTERNAL_ERROR -13
#define OPE_UNIMPLEMENTED -15
#define OPE_ALLOC_FAIL -17
/* Specific to libopusenc. */
#define OPE_CANNOT_OPEN -30
#define OPE_TOO_LATE -31
#define OPE_UNRECOVERABLE -32
#define OPE_INVALID_PICTURE -33
#define OPE_INVALID_ICON -34
/*@}*/
/*@}*/
/* These are the "raw" request values -- they should usually not be used. */
#define OPE_SET_DECISION_DELAY_REQUEST 14000
#define OPE_GET_DECISION_DELAY_REQUEST 14001
#define OPE_SET_MUXING_DELAY_REQUEST 14002
#define OPE_GET_MUXING_DELAY_REQUEST 14003
#define OPE_SET_COMMENT_PADDING_REQUEST 14004
#define OPE_GET_COMMENT_PADDING_REQUEST 14005
#define OPE_SET_SERIALNO_REQUEST 14006
#define OPE_GET_SERIALNO_REQUEST 14007
#define OPE_SET_PACKET_CALLBACK_REQUEST 14008
/*#define OPE_GET_PACKET_CALLBACK_REQUEST 14009*/
#define OPE_SET_HEADER_GAIN_REQUEST 14010
#define OPE_GET_HEADER_GAIN_REQUEST 14011
/**\defgroup encoder_ctl Encoding Options*/
/*@{*/
/**\name Control parameters
Macros for setting encoder options.*/
/*@{*/
#define OPE_SET_DECISION_DELAY(x) OPE_SET_DECISION_DELAY_REQUEST, __opus_check_int(x)
#define OPE_GET_DECISION_DELAY(x) OPE_GET_DECISION_DELAY_REQUEST, __opus_check_int_ptr(x)
#define OPE_SET_MUXING_DELAY(x) OPE_SET_MUXING_DELAY_REQUEST, __opus_check_int(x)
#define OPE_GET_MUXING_DELAY(x) OPE_GET_MUXING_DELAY_REQUEST, __opus_check_int_ptr(x)
#define OPE_SET_COMMENT_PADDING(x) OPE_SET_COMMENT_PADDING_REQUEST, __opus_check_int(x)
#define OPE_GET_COMMENT_PADDING(x) OPE_GET_COMMENT_PADDING_REQUEST, __opus_check_int_ptr(x)
#define OPE_SET_SERIALNO(x) OPE_SET_SERIALNO_REQUEST, __opus_check_int(x)
#define OPE_GET_SERIALNO(x) OPE_GET_SERIALNO_REQUEST, __opus_check_int_ptr(x)
/* FIXME: Add type-checking macros to these. */
#define OPE_SET_PACKET_CALLBACK(x,u) OPE_SET_PACKET_CALLBACK_REQUEST, (x), (u)
/*#define OPE_GET_PACKET_CALLBACK(x,u) OPE_GET_PACKET_CALLBACK_REQUEST, (x), (u)*/
#define OPE_SET_HEADER_GAIN(x,u) OPE_SET_HEADER_GAIN_REQUEST, __opus_check_int(x)
#define OPE_GET_HEADER_GAIN(x,u) OPE_GET_HEADER_GAIN_REQUEST, __opus_check_int_ptr(x)
/*@}*/
/*@}*/
/**\defgroup callbacks Callback Functions */
/*@{*/
/**\name Callback functions
These are the callbacks that can be implemented for an encoder.*/
/*@{*/
/** Called for writing a page. */
typedef int (*ope_write_func)(void *user_data, const unsigned char *ptr, opus_int32 len);
/** Called for closing a stream. */
typedef int (*ope_close_func)(void *user_data);
/** Called on every packet encoded (including header). */
typedef int (*ope_packet_func)(void *user_data, const unsigned char *packet_ptr, opus_int32 packet_len, opus_uint32 flags);
/** Callback functions for accessing the stream. */
typedef struct {
/** Callback for writing to the stream. */
ope_write_func write;
/** Callback for closing the stream. */
ope_close_func close;
} OpusEncCallbacks;
/*@}*/
/*@}*/
/** Opaque comments struct. */
typedef struct OggOpusComments OggOpusComments;
/** Opaque encoder struct. */
typedef struct OggOpusEnc OggOpusEnc;
/**\defgroup comments Comments Handling */
/*@{*/
/**\name Functions for handling comments
These functions make it possible to add comments and pictures to Ogg Opus files.*/
/*@{*/
/** Create a new comments object.
\return Newly-created comments object. */
OPE_EXPORT OggOpusComments *ope_comments_create(void);
/** Create a deep copy of a comments object.
\param comments Comments object to copy
\return Deep copy of input. */
OPE_EXPORT OggOpusComments *ope_comments_copy(OggOpusComments *comments);
/** Destroys a comments object.
\param comments Comments object to destroy*/
OPE_EXPORT void ope_comments_destroy(OggOpusComments *comments);
/** Add a comment.
\param[in,out] comments Where to add the comments
\param tag Tag for the comment (must not contain = char)
\param val Value for the tag
\return Error code
*/
OPE_EXPORT int ope_comments_add(OggOpusComments *comments, const char *tag, const char *val);
/** Add a comment as a single tag=value string.
\param[in,out] comments Where to add the comments
\param tag_and_val string of the form tag=value (must contain = char)
\return Error code
*/
OPE_EXPORT int ope_comments_add_string(OggOpusComments *comments, const char *tag_and_val);
/** Add a picture.
\param[in,out] comments Where to add the comments
\param filename File name for the picture
\param picture_type Type of picture (-1 for default)
\param description Description (NULL means no comment)
\return Error code
*/
OPE_EXPORT int ope_comments_add_picture(OggOpusComments *comments, const char *filename, int picture_type, const char *description);
/*@}*/
/*@}*/
/**\defgroup encoding Encoding */
/*@{*/
/**\name Functions for encoding Ogg Opus files
These functions make it possible to encode Ogg Opus files.*/
/*@{*/
/** Create a new OggOpus file.
\param path Path where to create the file
\param comments Comments associated with the stream
\param rate Input sampling rate (48 kHz is faster)
\param channels Number of channels
\param family Mapping family (0 for mono/stereo, 1 for surround)
\param[out] error Error code (NULL if no error is to be returned)
\return Newly-created encoder.
*/
OPE_EXPORT OggOpusEnc *ope_encoder_create_file(const char *path, OggOpusComments *comments, opus_int32 rate, int channels, int family, int *error);
/** Create a new OggOpus stream to be handled using callbacks
\param callbacks Callback functions
\param user_data Pointer to be associated with the stream and passed to the callbacks
\param comments Comments associated with the stream
\param rate Input sampling rate (48 kHz is faster)
\param channels Number of channels
\param family Mapping family (0 for mono/stereo, 1 for surround)
\param[out] error Error code (NULL if no error is to be returned)
\return Newly-created encoder.
*/
OPE_EXPORT OggOpusEnc *ope_encoder_create_callbacks(const OpusEncCallbacks *callbacks, void *user_data,
OggOpusComments *comments, opus_int32 rate, int channels, int family, int *error);
/** Create a new OggOpus stream to be used along with.ope_encoder_get_page().
This is mostly useful for muxing with other streams.
\param comments Comments associated with the stream
\param rate Input sampling rate (48 kHz is faster)
\param channels Number of channels
\param family Mapping family (0 for mono/stereo, 1 for surround)
\param[out] error Error code (NULL if no error is to be returned)
\return Newly-created encoder.
*/
OPE_EXPORT OggOpusEnc *ope_encoder_create_pull(OggOpusComments *comments, opus_int32 rate, int channels, int family, int *error);
/** Add/encode any number of float samples to the stream.
\param[in,out] enc Encoder
\param pcm Floating-point PCM values in the +/-1 range (interleaved if multiple channels)
\param samples_per_channel Number of samples for each channel
\return Error code*/
OPE_EXPORT int ope_encoder_write_float(OggOpusEnc *enc, const float *pcm, int samples_per_channel);
/** Add/encode any number of 16-bit linear samples to the stream.
\param[in,out] enc Encoder
\param pcm Linear 16-bit PCM values in the [-32768,32767] range (interleaved if multiple channels)
\param samples_per_channel Number of samples for each channel
\return Error code*/
OPE_EXPORT int ope_encoder_write(OggOpusEnc *enc, const opus_int16 *pcm, int samples_per_channel);
/** Get the next page from the stream (only if using ope_encoder_create_pull()).
\param[in,out] enc Encoder
\param[out] page Next available encoded page
\param[out] len Size (in bytes) of the page returned
\param flush If non-zero, forces a flush of the page (if any data avaiable)
\return 1 if there is a page available, 0 if not. */
OPE_EXPORT int ope_encoder_get_page(OggOpusEnc *enc, unsigned char **page, opus_int32 *len, int flush);
/** Finalizes the stream, but does not deallocate the object.
\param[in,out] enc Encoder
\return Error code
*/
OPE_EXPORT int ope_encoder_drain(OggOpusEnc *enc);
/** Deallocates the obect. Make sure to ope_drain() first.
\param[in,out] enc Encoder
*/
OPE_EXPORT void ope_encoder_destroy(OggOpusEnc *enc);
/** Ends the stream and create a new stream within the same file.
\param[in,out] enc Encoder
\param comments Comments associated with the stream
\return Error code
*/
OPE_EXPORT int ope_encoder_chain_current(OggOpusEnc *enc, OggOpusComments *comments);
/** Ends the stream and create a new file.
\param[in,out] enc Encoder
\param path Path where to write the new file
\param comments Comments associated with the stream
\return Error code
*/
OPE_EXPORT int ope_encoder_continue_new_file(OggOpusEnc *enc, const char *path, OggOpusComments *comments);
/** Ends the stream and create a new file (callback-based).
\param[in,out] enc Encoder
\param user_data Pointer to be associated with the new stream and passed to the callbacks
\param comments Comments associated with the stream
\return Error code
*/
OPE_EXPORT int ope_encoder_continue_new_callbacks(OggOpusEnc *enc, void *user_data, OggOpusComments *comments);
/** Write out the header now rather than wait for audio to begin.
\param[in,out] enc Encoder
\return Error code
*/
OPE_EXPORT int ope_encoder_flush_header(OggOpusEnc *enc);
/** Sets encoder options.
\param[in,out] enc Encoder
\param request Use a request macro
\return Error code
*/
OPE_EXPORT int ope_encoder_ctl(OggOpusEnc *enc, int request, ...);
/** Converts a libopusenc error code into a human readable string.
*
* @param error Error number
* @returns Error string
*/
OPE_EXPORT const char *ope_strerror(int error);
/** Returns a string representing the version of libopusenc being used at run time.
\return A string describing the version of this library */
OPE_EXPORT const char *ope_get_version_string(void);
/** ABI version for this header. Can be used to check for features at run time.
\return An integer representing the ABI version */
OPE_EXPORT int ope_get_abi_version(void);
/*@}*/
/*@}*/
# if defined(__cplusplus)
}
# endif
#endif

Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More