10000 Add object fit for RTCVideoView. · linuxerwang/flutter-webrtc@8d818dc · GitHub
[go: up one dir, main page]

Skip to content

Commit 8d818dc

Browse files
committed
Add object fit for RTCVideoView.
1 parent c9bda52 commit 8d818dc

File tree

1 file changed

+41
-16
lines changed

1 file changed

+41
-16
lines changed

lib/rtc_video_view.dart

Lines changed: 41 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -42,12 +42,12 @@ class RTCVideoRenderer {
4242
int get textureId => _textureId;
4343

4444
double get aspectRatio => (_width == 0 || _height == 0)
45-
? 1
45+
? 1.0
4646
: (_rotation == 90 || _rotation == 270)
4747
? _height / _width
4848
: _width / _height;
4949

50-
bool get flipHorizintal => _mirror;
50+
bool get mirror => _mirror;
5151

5252
set mirror(bool mirror) {
5353
_mirror = mirror;
@@ -56,8 +56,13 @@ class RTCVideoRenderer {
5656
}
5757
}
5858

59+
RTCVideoViewObjectFit get objectFit => _objectFit;
60+
5961
set objectFit(RTCVideoViewObjectFit objectFit) {
6062
_objectFit = objectFit;
63+
if (this.onStateChanged != null) {
64+
this.onStateChanged();
65+
}
6166
}
6267

6368
set srcObject(MediaStream stream) {
@@ -114,6 +119,7 @@ class RTCVideoView extends StatefulWidget {
114119
class _RTCVideoViewState extends State<RTCVideoView> {
115120
final RTCVideoRenderer _renderer;
116121
double _aspectRatio;
122+
RTCVideoViewObjectFit _objectFit;
117123
bool _mirror;
118124
_RTCVideoViewState(this._renderer);
119125

@@ -122,7 +128,8 @@ class _RTCVideoViewState extends State<RTCVideoView> {
122128
super.initState();
123129
_setCallbacks();
124130
_aspectRatio = _renderer.aspectRatio;
125-
_mirror = _renderer.flipHorizintal;
131+
_mirror = _renderer.mirror;
132+
_objectFit = _renderer.objectFit;
126133
}
127134

128135
@override
@@ -135,24 +142,42 @@ class _RTCVideoViewState extends State<RTCVideoView> {
135142
_renderer.onStateChanged = () {
136143
setState(() {
137144
_aspectRatio = _renderer.aspectRatio;
138-
_mirror = _renderer.flipHorizintal;
145+
_mirror = _renderer.mirror;
146+
_objectFit = _renderer.objectFit;
139147
});
140148
};
141149
}
142150

151+
Widget _buildVideoView(BoxConstraints constraints) {
152+
return Container(
153+
width: constraints.maxWidth,
154+
height: constraints.maxHeight,
155+
child: FittedBox(
156+
fit:
157+
_objectFit == RTCVideoViewObjectFit.RTCVideoViewObjectFitContain
158+
? BoxFit.contain
159+
: BoxFit.cover,
160+
child: new Center(
161+
child: new SizedBox(
162+
width: constraints.maxHeight * _aspectRatio,
163+
height: constraints.maxHeight,
164+
child: new Transform(
165+
transform: Matrix4.identity()
166+
..rotateY(_mirror ? -pi : 0.0),
167+
alignment: FractionalOffset.center,
168+
child:
169+
new Texture(textureId: _renderer._textureId))))));
170+
}
171+
143172
@override
144173
Widget build(BuildContext context) {
145< AEFC code>-
return new Center(
146-
child: (_renderer._textureId == null || _renderer._srcObject == null)
147-
? new Container()
148-
: new Transform(
149-
transform: Matrix4.identity()
150-
..setEntry(3, 2, 0.001)
151-
..rotateX(0.0)
152-
..rotateY(_mirror ? -pi : 0.0),
153-
alignment: FractionalOffset.center,
154-
child: new AspectRatio(
155-
aspectRatio: _aspectRatio,
156-
child: new Texture(textureId: _renderer._textureId))));
174+
bool renderVideo =
175+
(_renderer._textureId != null && _renderer._srcObject != null);
176+
177+
return new LayoutBuilder(
178+
builder: (BuildContext context, BoxConstraints constraints) {
179+
return new Center(
180+
child: renderVideo ? _buildVideoView(constraints) : new Container());
181+
});
157182
}
158183
}

0 commit comments

Comments
 (0)
0