Skip to content

Commit 57a202c

Browse files
committed
Deprecate usage of 'video.src = URL.createObjectURL(stream)' in favor of 'video.srcObject = stream' only MediaStream are not Blob anymore.
1 parent 71f26e8 commit 57a202c

7 files changed

+22
-135
lines changed

CHANGELOG.md

+6
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
1+
#### Version 5.0.3
2+
3+
* Deprecate usage of `video.src = URL.createObjectURL(stream)` in favor of `video.srcObject = stream` only MediaStream are not Blob anymore.
4+
15
#### Version 5.0.2
6+
27
* Set default deployment target to 10.2
38
* Remove callback based API
49
* Implement RTCPeerConnection.getSenders|getReceivers|addTrack|removeTrack
@@ -12,6 +17,7 @@
1217
* fix TypeError: undefined is not an object (evaluating 'stream.id') when removing stream [PR #383](https://github.com/cordova-rtc/cordova-plugin-iosrtc/pull/383) by @hthetiot via @l7s).
1318

1419
#### Version 5.0.1
20+
1521
* fix typo on iosrtcPlugin.swift
1622

1723
#### Version 5.0.0

FAQ.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# FAQ
22

3-
**Q:** What about `<video>` elements and `video.src = URL.createObjectURL(stream)`? do I need custom HTML tags or functions to display WebRTC videos?
3+
**Q:** What about `<video>` elements and `video.srcObject = stream`? do I need custom HTML tags or functions to display WebRTC videos?
44

55
**A:** No. Just use an HTML video element as usual, really. The plugin will properly place a native *UIView* layer on top of it by respecting (most of) its [CSS properties](docs/videoCSS.md).
66

dist/cordova-plugin-iosrtc.js

+7-67
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,6 @@ var originalMediaStreamTrack = MediaStreamTrack.originalMediaStreamTrack;
143143

144144
/**
145145
* Expose the MediaStream class.
146-
* Make MediaStream be a Blob so it can be consumed by URL.createObjectURL().
147146
*/
148147
function MediaStream(arg, id) {
149148
debug('new MediaStream(arg) | [arg:%o]', arg);
@@ -2470,7 +2469,6 @@ function dump() {
24702469

24712470
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
24722471
},{"./MediaStream":4,"./MediaStreamTrack":6,"./RTCIceCandidate":9,"./RTCPeerConnection":10,"./RTCSessionDescription":11,"./enumerateDevices":14,"./getUserMedia":15,"./videoElementsHandler":17,"cordova/exec":undefined,"debug":18,"domready":20}],17:[function(_dereq_,module,exports){
2473-
(function (global){
24742472
/**
24752473
* Expose a function that must be called when the library is loaded.
24762474
* And also a helper function.
@@ -2491,12 +2489,6 @@ var
24912489
* Local variables.
24922490
*/
24932491

2494-
// RegExp for MediaStream blobId.
2495-
MEDIASTREAM_ID_REGEXP = new RegExp(/^MediaStream_/),
2496-
2497-
// RegExp for Blob URI.
2498-
BLOB_URI_REGEX = new RegExp(/^blob:/),
2499-
25002492
// Dictionary of MediaStreamRenderers (provided via module argument).
25012493
// - key: MediaStreamRenderer id.
25022494
// - value: MediaStreamRenderer.
@@ -2517,8 +2509,8 @@ var
25172509
// HTML video element.
25182510
video = mutation.target;
25192511

2520-
// .src or .srcObject removed.
2521-
if (!video.src && !video.srcObject) {
2512+
// .srcObject removed.
2513+
if (!video.srcObject) {
25222514
// If this video element was previously handling a MediaStreamRenderer, release it.
25232515
releaseMediaStreamRenderer(video);
25242516
continue;
@@ -2643,13 +2635,13 @@ function videoElementsHandler(_mediaStreams, _mediaStreamRenderers) {
26432635
function observeVideo(video) {
26442636
debug('observeVideo()');
26452637

2646-
// If the video already has a src/srcObject property but is not yet handled by the plugin
2638+
// If the video already has a srcObject property but is not yet handled by the plugin
26472639
// then handle it now.
2648-
if ((video.src || video.srcObject) && !video._iosrtcMediaStreamRendererId) {
2640+
if ((video.srcObject) && !video._iosrtcMediaStreamRendererId) {
26492641
handleVideo(video);
26502642
}
26512643

2652-
// Add .src observer to the video element.
2644+
// Add .srcObject observer to the video element.
26532645
videoObserver.observe(video, {
26542646
// Set to true if additions and removals of the target node's child elements (including text
26552647
// nodes) are to be observed.
@@ -2668,16 +2660,7 @@ function observeVideo(video) {
26682660
characterDataOldValue: false,
26692661
// Set to an array of attribute local names (without namespace) if not all attribute mutations
26702662
// need to be observed.
2671-
attributeFilter: ['src', 'srcObject']
2672-
});
2673-
2674-
// Intercept video 'error' events if it's due to the attached MediaStream.
2675-
video.addEventListener('error', function (event) {
2676-
if (video.error.code === global.MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED && BLOB_URI_REGEX.test(video.src)) {
2677-
debug('stopping "error" event propagation for video element');
2678-
2679-
event.stopImmediatePropagation();
2680-
}
2663+
attributeFilter: ['srcObject']
26812664
});
26822665
}
26832666

@@ -2688,51 +2671,10 @@ function observeVideo(video) {
26882671

26892672
function handleVideo(video) {
26902673
var
2691-
xhr = new XMLHttpRequest(),
26922674
stream;
26932675

2694-
// The app has set video.src.
2695-
if (video.src) {
2696-
xhr.open('GET', video.src, true);
2697-
xhr.responseType = 'blob';
2698-
xhr.onload = function () {
2699-
if (xhr.status !== 200) {
2700-
// If this video element was previously handling a MediaStreamRenderer, release it.
2701-
releaseMediaStreamRenderer(video);
2702-
2703-
return;
2704-
}
2705-
2706-
var reader = new FileReader();
2707-
2708-
// Some versions of Safari fail to set onloadend property, some others do not react
2709-
// on 'loadend' event. Try everything here.
2710-
try {
2711-
reader.onloadend = onloadend;
2712-
} catch (error) {
2713-
reader.addEventListener('loadend', onloadend);
2714-
}
2715-
reader.readAsText(xhr.response);
2716-
2717-
function onloadend() {
2718-
var mediaStreamBlobId = reader.result;
2719-
2720-
// The retrieved URL does not point to a MediaStream.
2721-
if (!mediaStreamBlobId || typeof mediaStreamBlobId !== 'string' || !MEDIASTREAM_ID_REGEXP.test(mediaStreamBlobId)) {
2722-
// If this video element was previously handling a MediaStreamRenderer, release it.
2723-
releaseMediaStreamRenderer(video);
2724-
2725-
return;
2726-
}
2727-
2728-
provideMediaStreamRenderer(video, mediaStreamBlobId);
2729-
}
2730-
};
2731-
xhr.send();
2732-
}
2733-
27342676
// The app has set video.srcObject.
2735-
else if (video.srcObject) {
2677+
if (video.srcObject) {
27362678
stream = video.srcObject;
27372679

27382680
if (!stream.getBlobId()) {
@@ -2805,7 +2747,6 @@ function provideMediaStreamRenderer(video, mediaStreamBlobId) {
28052747
});
28062748
}
28072749

2808-
28092750
function releaseMediaStreamRenderer(video) {
28102751
if (!video._iosrtcMediaStreamRendererId) {
28112752
return;
@@ -2826,7 +2767,6 @@ function releaseMediaStreamRenderer(video) {
28262767
delete video.readyState;
28272768
}
28282769

2829-
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
28302770
},{"./MediaStreamRenderer":5,"debug":18}],18:[function(_dereq_,module,exports){
28312771
(function (process){
28322772
/* eslint-env browser */

docs/iosrtc.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ peerconnection.addEventListener('addstream', function (event) {
163163
cordova.plugins.iosrtc.observeVideo(video);
164164

165165
// Attach the MediaStream to it.
166-
video.src = URL.createObjectURL(event.stream);
166+
video.srcObject = event.stream;
167167

168168
// When the stream is ready to be rendered then append the video
169169
// element to the DOM.

extra/renderer-and-libwebrtc-tests.js

-1
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,6 @@ function TestGetUserMedia() {
9696

9797
localStream = stream;
9898
srcObjectStream = localVideoEl.srcObject = localStream;
99-
//localVideoEl.src = window.URL.createObjectURL(stream);
10099

101100
} catch (err) {
102101
console.log('srcObject.err', err);

js/MediaStream.js

-1
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ var originalMediaStreamTrack = MediaStreamTrack.originalMediaStreamTrack;
3737

3838
/**
3939
* Expose the MediaStream class.
40-
* Make MediaStream be a Blob so it can be consumed by URL.createObjectURL().
4140
*/
4241
function MediaStream(arg, id) {
4342
debug('new MediaStream(arg) | [arg:%o]', arg);

js/videoElementsHandler.js

+7-64
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,6 @@ var
1818
* Local variables.
1919
*/
2020

21-
// RegExp for MediaStream blobId.
22-
MEDIASTREAM_ID_REGEXP = new RegExp(/^MediaStream_/),
23-
24-
// RegExp for Blob URI.
25-
BLOB_URI_REGEX = new RegExp(/^blob:/),
26-
2721
// Dictionary of MediaStreamRenderers (provided via module argument).
2822
// - key: MediaStreamRenderer id.
2923
// - value: MediaStreamRenderer.
@@ -44,8 +38,8 @@ var
4438
// HTML video element.
4539
video = mutation.target;
4640

47-
// .src or .srcObject removed.
48-
if (!video.src && !video.srcObject) {
41+
// .srcObject removed.
42+
if (!video.srcObject) {
4943
// If this video element was previously handling a MediaStreamRenderer, release it.
5044
releaseMediaStreamRenderer(video);
5145
continue;
@@ -170,13 +164,13 @@ function videoElementsHandler(_mediaStreams, _mediaStreamRenderers) {
170164
function observeVideo(video) {
171165
debug('observeVideo()');
172166

173-
// If the video already has a src/srcObject property but is not yet handled by the plugin
167+
// If the video already has a srcObject property but is not yet handled by the plugin
174168
// then handle it now.
175-
if ((video.src || video.srcObject) && !video._iosrtcMediaStreamRendererId) {
169+
if ((video.srcObject) && !video._iosrtcMediaStreamRendererId) {
176170
handleVideo(video);
177171
}
178172

179-
// Add .src observer to the video element.
173+
// Add .srcObject observer to the video element.
180174
videoObserver.observe(video, {
181175
// Set to true if additions and removals of the target node's child elements (including text
182176
// nodes) are to be observed.
@@ -195,16 +189,7 @@ function observeVideo(video) {
195189
characterDataOldValue: false,
196190
// Set to an array of attribute local names (without namespace) if not all attribute mutations
197191
// need to be observed.
198-
attributeFilter: ['src', 'srcObject']
199-
});
200-
201-
// Intercept video 'error' events if it's due to the attached MediaStream.
202-
video.addEventListener('error', function (event) {
203-
if (video.error.code === global.MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED && BLOB_URI_REGEX.test(video.src)) {
204-
debug('stopping "error" event propagation for video element');
205-
206-
event.stopImmediatePropagation();
207-
}
192+
attributeFilter: ['srcObject']
208193
});
209194
}
210195

@@ -215,51 +200,10 @@ function observeVideo(video) {
215200

216201
function handleVideo(video) {
217202
var
218-
xhr = new XMLHttpRequest(),
219203
stream;
220204

221-
// The app has set video.src.
222-
if (video.src) {
223-
xhr.open('GET', video.src, true);
224-
xhr.responseType = 'blob';
225-
xhr.onload = function () {
226-
if (xhr.status !== 200) {
227-
// If this video element was previously handling a MediaStreamRenderer, release it.
228-
releaseMediaStreamRenderer(video);
229-
230-
return;
231-
}
232-
233-
var reader = new FileReader();
234-
235-
// Some versions of Safari fail to set onloadend property, some others do not react
236-
// on 'loadend' event. Try everything here.
237-
try {
238-
reader.onloadend = onloadend;
239-
} catch (error) {
240-
reader.addEventListener('loadend', onloadend);
241-
}
242-
reader.readAsText(xhr.response);
243-
244-
function onloadend() {
245-
var mediaStreamBlobId = reader.result;
246-
247-
// The retrieved URL does not point to a MediaStream.
248-
if (!mediaStreamBlobId || typeof mediaStreamBlobId !== 'string' || !MEDIASTREAM_ID_REGEXP.test(mediaStreamBlobId)) {
249-
// If this video element was previously handling a MediaStreamRenderer, release it.
250-
releaseMediaStreamRenderer(video);
251-
252-
return;
253-
}
254-
255-
provideMediaStreamRenderer(video, mediaStreamBlobId);
256-
}
257-
};
258-
xhr.send();
259-
}
260-
261205
// The app has set video.srcObject.
262-
else if (video.srcObject) {
206+
if (video.srcObject) {
263207
stream = video.srcObject;
264208

265209
if (!stream.getBlobId()) {
@@ -332,7 +276,6 @@ function provideMediaStreamRenderer(video, mediaStreamBlobId) {
332276
});
333277
}
334278

335-
336279
function releaseMediaStreamRenderer(video) {
337280
if (!video._iosrtcMediaStreamRendererId) {
338281
return;

0 commit comments

Comments
 (0)