Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Closed captions #796

Merged
merged 61 commits into from
Jan 15, 2025
Merged
Show file tree
Hide file tree
Changes from 58 commits
Commits
Show all changes
61 commits
Select commit Hold shift + click to select a range
d901f1a
Closed captions
Brazol Nov 18, 2024
2020a8c
call state tweaks
Brazol Nov 18, 2024
1e007ab
linter fixes
Brazol Nov 18, 2024
1b404ff
tweak
Brazol Nov 18, 2024
88286a9
Merge branch 'main' into feat/closed-captions
Brazol Nov 18, 2024
e90a190
tweaks to the CC widget in dogfooding
Brazol Nov 21, 2024
a90358f
Video filters
Brazol Nov 25, 2024
f6c6793
tweak
Brazol Nov 25, 2024
8950bda
fix
Brazol Nov 26, 2024
6fdc9a8
custom filter added
Brazol Nov 28, 2024
53fe00f
Merge branch 'main' into feat/video-filters
Brazol Nov 28, 2024
bf3dd81
fix
Brazol Nov 28, 2024
cc84e45
Merge branch 'feat/video-filters' of github.com:GetStream/stream-vide…
Brazol Nov 28, 2024
1532ddf
Merge branch 'main' into feat/closed-captions
Brazol Nov 28, 2024
df1a9b9
tweaks
Brazol Dec 3, 2024
3f7f6a0
Merge branch 'main' into feat/video-filters
Brazol Dec 4, 2024
32432a7
Merge branch 'main' into feat/video-filters
Brazol Dec 6, 2024
113d635
Codec negotiation
Brazol Dec 18, 2024
8f1740f
client publish options added
Brazol Dec 18, 2024
fcc31d4
force TF build
Brazol Dec 18, 2024
b5803fb
dep fix
Brazol Dec 18, 2024
c227fdb
replace duplicate resource bundle name
Brazol Dec 18, 2024
1583116
fixed target name
Brazol Dec 18, 2024
1c38e60
use xcode 16 to distribte
Brazol Dec 18, 2024
143725a
podfile test
Brazol Dec 18, 2024
b8eded5
remove duplicate bundle
Brazol Dec 19, 2024
8c989b1
remove resource bundle 2
Brazol Dec 19, 2024
6706e94
podfile fix
Brazol Dec 19, 2024
e004341
fixes
Brazol Dec 19, 2024
78f9539
tweaks
Brazol Dec 20, 2024
3357696
don't log stats request
Brazol Dec 20, 2024
633de62
setting publish options when reconnecting
Brazol Dec 20, 2024
172e1a8
log tweaks
Brazol Dec 20, 2024
f71e9c3
dogfooding: disable autocorrect in call id input
Brazol Dec 20, 2024
9d80980
announce tracks change for reconnect
Brazol Dec 21, 2024
655d7be
enable env switcher
Brazol Dec 23, 2024
8b9d35e
log tweak
Brazol Dec 23, 2024
950b91a
added codec to track info
Brazol Dec 23, 2024
5fa2344
added muted to track info
Brazol Dec 23, 2024
be223ac
renamed retention to visibility
Brazol Dec 30, 2024
46ed60b
Merge branch 'main' into feat/video-filters
Brazol Dec 30, 2024
59966c1
Merge branch 'feat/video-filters' into feat/codec-negotiation
Brazol Dec 30, 2024
b3d6fac
revert temp changes
Brazol Dec 30, 2024
2ecdf43
publish option id added to trackinfo
Brazol Jan 7, 2025
61af094
fmtp line
Brazol Jan 7, 2025
f4f064d
Merge branch 'main' into feat/codec-negotiation
Brazol Jan 9, 2025
dd4be45
fix
Brazol Jan 9, 2025
cdabfb5
fix for race between negotiation and initial track creation
Brazol Jan 10, 2025
30c3fc0
Merge branch 'main' into feat/codec-negotiation
Brazol Jan 10, 2025
3f59119
cleanup
Brazol Jan 10, 2025
db0c2d3
Merge branch 'feat/codec-negotiation' of github.com:GetStream/stream-…
Brazol Jan 10, 2025
8080780
tweaks
Brazol Jan 10, 2025
d96d19f
Merge branch 'feat/codec-negotiation' into feat/closed-captions
Brazol Jan 10, 2025
46e2981
regenerated open api models and applied changes
Brazol Jan 13, 2025
37fd5c6
regenerated models from older definitions
Brazol Jan 14, 2025
4d5bc91
fix for openapi model
Brazol Jan 14, 2025
f8a8488
changelog
Brazol Jan 14, 2025
4fa3f53
Merge branch 'feat/codec-negotiation' into feat/closed-captions
deven98 Jan 15, 2025
e0e3e4e
fixes
Brazol Jan 15, 2025
11f1ca6
imports tweak
Brazol Jan 15, 2025
4b2e2ec
Merge branch 'main' into feat/closed-captions
Brazol Jan 15, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions dogfooding/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ For a more basic example of how to use the Stream Video Flutter package, check o

- **Testing Ground**: Used by Stream developers for feature validation and bug testing.

- **Closed Captions**: Test closed captions during video calls.

## Getting Started

To set up and run the app, follow these steps:
Expand Down
2 changes: 1 addition & 1 deletion dogfooding/ios/Flutter/AppFrameworkInfo.plist
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,6 @@
<key>CFBundleVersion</key>
<string>1.0</string>
<key>MinimumOSVersion</key>
<string>11.0</string>
<string>12.0</string>
</dict>
</plist>
2 changes: 1 addition & 1 deletion dogfooding/ios/Podfile
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ post_install do |installer|
installer.pods_project.targets.each do |target|
flutter_additional_ios_build_settings(target)
end

# fix xcode 15 DT_TOOLCHAIN_DIR - remove after fix oficially - https://github.com/CocoaPods/CocoaPods/issues/12065
installer.aggregate_targets.each do |target|
target.xcconfigs.each do |variant, xcconfig|
Expand Down
16 changes: 12 additions & 4 deletions dogfooding/lib/screens/call_screen.dart
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import 'package:stream_video_flutter/stream_video_flutter.dart' hide User;
import 'package:flutter_dogfooding/core/repos/user_chat_repository.dart';
import '../app/user_auth_controller.dart';
import '../di/injector.dart';
import '../widgets/closed_captions_widget.dart';

class CallScreen extends StatefulWidget {
const CallScreen({
Expand Down Expand Up @@ -154,10 +155,17 @@ class _CallScreenState extends State<CallScreen> {
callParticipantsBuilder: (context, call, callState) {
return Stack(
children: [
StreamCallParticipants(
call: call,
participants: callState.callParticipants,
layoutMode: _currentLayoutMode,
Column(
children: [
Expanded(
child: StreamCallParticipants(
call: call,
participants: callState.callParticipants,
layoutMode: _currentLayoutMode,
),
),
ClosedCaptionsWidget(call: call),
],
),
if (_moreMenuVisible) ...[
GestureDetector(
Expand Down
277 changes: 161 additions & 116 deletions dogfooding/lib/screens/call_stats_screen.dart
Original file line number Diff line number Diff line change
Expand Up @@ -28,134 +28,180 @@ class CallStatsScreen extends StatelessWidget {
final subscriberBitrate = state?.subscriberStats?.bitrateKbps;
final publisherBitrate = state?.publisherStats?.bitrateKbps;

return Scaffold(
appBar: AppBar(
title: Text(
'Stats',
style: textTheme.title3.apply(color: Colors.white),
),
centerTitle: true,
backgroundColor: Theme.of(context).scaffoldBackgroundColor,
actions: [
IconButton(
icon: const Icon(
Icons.close,
color: Colors.white,
),
onPressed: () {
Navigator.of(context).pop();
},
return SafeArea(
top: false,
child: Scaffold(
appBar: AppBar(
title: Text(
'Stats',
style: textTheme.title3.apply(color: Colors.white),
),
],
),
body: SingleChildScrollView(
child: Column(
children: [
ListTile(
leading: StreamUserAvatar(user: currentUser!),
title: const Text(
'Call ID',
style: TextStyle(color: Colors.white),
),
subtitle: Text(
call.callCid.value,
style: const TextStyle(color: Colors.white),
centerTitle: true,
backgroundColor: Theme.of(context).scaffoldBackgroundColor,
actions: [
IconButton(
icon: const Icon(
Icons.close,
color: Colors.white,
),
onPressed: () {
Navigator.of(context).pop();
},
),
if (snapshot.hasData) ...[
Padding(
padding: const EdgeInsets.all(16.0),
child: Row(
],
),
body: SingleChildScrollView(
child: Column(
children: [
ListTile(
leading: StreamUserAvatar(user: currentUser!),
title: const Text(
'Call ID',
style: TextStyle(color: Colors.white),
),
subtitle: Text(
call.callCid.value,
style: const TextStyle(color: Colors.white),
),
),
if (snapshot.hasData) ...[
Padding(
padding: const EdgeInsets.all(16.0),
child: Row(
children: [
const Icon(Icons.network_check,
color: Colors.white),
const SizedBox(width: 8),
Text(
'Call latency',
style:
textTheme.title3.apply(color: Colors.white),
),
],
),
),
const Padding(
padding: EdgeInsets.symmetric(horizontal: 16.0),
child: Text(
'Very high latency values may reduce call quality, cause lag, and make the call less enjoyable.',
style: TextStyle(color: Colors.white),
),
),
const SizedBox(
height: 16,
),
SizedBox(
height: 200,
child: StatsLatencyChart(
latencyHistory: state!.latencyHistory,
),
),
const SizedBox(
height: 16,
),
Padding(
padding: const EdgeInsets.all(16.0),
child: Row(
children: [
const Icon(Icons.bar_chart, color: Colors.white),
const SizedBox(width: 8),
Text(
'Call performance',
style:
textTheme.title3.apply(color: Colors.white),
),
],
),
),
const Padding(
padding: EdgeInsets.symmetric(horizontal: 16.0),
child: Text(
'Review the key data points below to assess call performance.',
style: TextStyle(color: Colors.white),
),
),
const SizedBox(
height: 16,
),
Row(
children: [
const Icon(Icons.network_check, color: Colors.white),
const SizedBox(width: 8),
Text(
'Call latency',
style: textTheme.title3.apply(color: Colors.white),
Expanded(
child: LatencyOrJitterItem(
title: 'Latency',
value: state.publisherStats?.latency ?? 0,
),
),
],
),
),
const Padding(
padding: EdgeInsets.symmetric(horizontal: 16.0),
child: Text(
'Very high latency values may reduce call quality, cause lag, and make the call less enjoyable.',
style: TextStyle(color: Colors.white),
Row(
children: [
Expanded(
child: LatencyOrJitterItem(
title: 'Receive jitter',
value: state.subscriberStats?.jitterInMs,
),
),
Expanded(
child: LatencyOrJitterItem(
title: 'Publish jitter',
value: state.publisherStats?.jitterInMs,
),
),
],
),
),
const SizedBox(
height: 16,
),
SizedBox(
height: 200,
child: StatsLatencyChart(
latencyHistory: state!.latencyHistory,
Row(
children: [
Expanded(
child: StatsItem(
title: 'Publish bitrate',
value: publisherBitrate == null
? '--'
: '${state.publisherStats?.bitrateKbps} Kbps',
),
),
Expanded(
child: StatsItem(
title: 'Receive bitrate',
value: subscriberBitrate == null
? '--'
: '${state.subscriberStats?.bitrateKbps} Kbps',
),
),
],
),
),
const SizedBox(
height: 16,
),
Padding(
padding: const EdgeInsets.all(16.0),
child: Row(
Row(
children: [
const Icon(Icons.bar_chart, color: Colors.white),
const SizedBox(width: 8),
Text(
'Call performance',
style: textTheme.title3.apply(color: Colors.white),
Expanded(
child: StatsItem(
title: 'Publish resolution',
value:
"${state.publisherStats?.resolution} | ${state.publisherStats?.videoCodec?.join('+')}",
),
),
Expanded(
child: StatsItem(
title: 'Reveive resolution',
value:
"${state.subscriberStats?.resolution} | ${state.subscriberStats?.videoCodec?.join('+')}",
),
),
],
),
),
const Padding(
padding: EdgeInsets.symmetric(horizontal: 16.0),
child: Text(
'Review the key data points below to assess call performance.',
style: TextStyle(color: Colors.white),
StatsItem(
title: 'Region',
value: state.localStats?.sfu,
),
),
const SizedBox(
height: 16,
),
LatencyOrJitterItem(
title: 'Latency',
value: state.publisherStats?.latency ?? 0,
),
LatencyOrJitterItem(
title: 'Receive jitter',
value: state.subscriberStats?.jitterInMs,
),
LatencyOrJitterItem(
title: 'Publish jitter',
value: state.publisherStats?.jitterInMs,
),
StatsItem(
title: 'Region',
value: state.localStats?.sfu,
),
StatsItem(
title: 'SDK Version',
value: state.localStats?.sdkVersion,
),
StatsItem(
title: 'WebRTC Version',
value: state.localStats?.webRtcVersion,
),
StatsItem(
title: 'Publish bitrate',
value: publisherBitrate == null
? '--'
: '${state.publisherStats?.bitrateKbps} Kbps',
),
StatsItem(
title: 'Receive bitrate',
value: subscriberBitrate == null
? '--'
: '${state.subscriberStats?.bitrateKbps} Kbps',
),
]
],
StatsItem(
title: 'SDK Version',
value: state.localStats?.sdkVersion,
),
StatsItem(
title: 'WebRTC Version',
value: state.localStats?.webRtcVersion,
),
]
],
),
),
),
);
Expand Down Expand Up @@ -205,7 +251,7 @@ class StatsItem extends StatelessWidget {
final theme = StreamVideoTheme.of(context);

return Container(
margin: const EdgeInsets.symmetric(horizontal: 16, vertical: 8),
margin: const EdgeInsets.symmetric(horizontal: 8, vertical: 8),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(16),
color: AppColorPalette.buttonSecondary,
Expand All @@ -232,7 +278,6 @@ class StatsItem extends StatelessWidget {
),
),
if (trailing != null) ...[
const Spacer(),
trailing!,
],
],
Expand Down
Loading
Loading