Skip to content

Commit de7a208

Browse files
author
aeinstein
committed
properly close
1 parent 56f4272 commit de7a208

14 files changed

+6083
-6670
lines changed

dist/webrtmp.js

Lines changed: 1015 additions & 1120 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/webrtmp.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/webrtmp.worker.js

Lines changed: 4899 additions & 5362 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/webrtmp.worker.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/flv/transmuxer.js

Lines changed: 2 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
import {TransmuxingEvents} from "../utils/utils";
2121
import EventEmitter from "../utils/event_emitter";
2222
import MP4Remuxer from "../formats/mp4-remuxer";
23-
import MediaInfo from "../formats/media-info";
2423
import Browser from "../utils/browser";
2524
import Log from "../utils/logger";
2625

@@ -32,39 +31,21 @@ class Transmuxer {
3231

3332
this._config = config;
3433

35-
this._currentSegmentIndex = 0;
36-
37-
this._mediaInfo = null;
38-
this._ioctl = null;
39-
4034
this._pendingSeekTime = null;
4135
this._pendingResolveSeekPoint = null;
4236

43-
this._statisticsReporter = null;
44-
4537
this._remuxer = new MP4Remuxer(this._config);
4638
this._remuxer.onInitSegment = this._onRemuxerInitSegmentArrival.bind(this);
4739
this._remuxer.onMediaSegment = this._onRemuxerMediaSegmentArrival.bind(this);
4840
}
4941

5042
destroy() {
51-
this._mediaInfo = null;
52-
this._mediaDataSource = null;
53-
54-
if (this._statisticsReporter) {
55-
this._disableStatisticsReporter();
56-
}
57-
if (this._ioctl) {
58-
this._ioctl.destroy();
59-
this._ioctl = null;
60-
}
61-
6243
if (this._remuxer) {
6344
this._remuxer.destroy();
6445
this._remuxer = null;
6546
}
6647

67-
this._emitter.removeAllListeners();
48+
this._emitter.removeAllListener();
6849
this._emitter = null;
6950
}
7051

@@ -85,62 +66,7 @@ class Transmuxer {
8566
}
8667

8768
stop() {
88-
this._internalAbort();
89-
}
90-
91-
_internalAbort() {
92-
if (this._ioctl) {
93-
this._ioctl.destroy();
94-
this._ioctl = null;
95-
}
96-
}
97-
98-
_searchSegmentIndexContains(milliseconds) {
99-
let segments = this._mediaDataSource.segments;
100-
let idx = segments.length - 1;
101-
102-
for (let i = 0; i < segments.length; i++) {
103-
if (milliseconds < segments[i].timestampBase) {
104-
idx = i - 1;
105-
break;
106-
}
107-
}
108-
return idx;
109-
}
110-
111-
_onMediaInfo(mediaInfo) {
112-
if (this._mediaInfo == null) {
113-
// Store first segment's mediainfo as global mediaInfo
114-
this._mediaInfo = Object.assign({}, mediaInfo);
115-
this._mediaInfo.keyframesIndex = null;
116-
this._mediaInfo.segments = [];
117-
//this._mediaInfo.segmentCount = this._mediaDataSource.segments.length;
118-
Object.setPrototypeOf(this._mediaInfo, MediaInfo.prototype);
119-
}
120-
121-
let segmentInfo = Object.assign({}, mediaInfo);
122-
Object.setPrototypeOf(segmentInfo, MediaInfo.prototype);
123-
this._mediaInfo.segments[this._currentSegmentIndex] = segmentInfo;
124-
125-
// notify mediaInfo update
126-
this._reportSegmentMediaInfo(this._currentSegmentIndex);
127-
128-
/*
129-
if (this._pendingSeekTime != null) {
130-
Promise.resolve().then(() => {
131-
let target = this._pendingSeekTime;
132-
this._pendingSeekTime = null;
133-
this.seek(target);
134-
});
135-
}*/
136-
}
137-
138-
_onMetaDataArrived(metadata) {
139-
this._emitter.emit(TransmuxingEvents.METADATA_ARRIVED, metadata);
140-
}
141-
142-
_onScriptDataArrived(data) {
143-
this._emitter.emit(TransmuxingEvents.SCRIPTDATA_ARRIVED, data);
69+
// this._internalAbort();
14470
}
14571

14672
_onRemuxerInitSegmentArrival(type, initSegment) {

src/index.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
*/
2020

2121

22-
import {WebRTMP} from "./webrtmp";
22+
import { WebRTMP } from "./webrtmp";
2323

2424
export { WebRTMP } from "./webrtmp";
2525

src/rtmp/RTMPMediaMessageHandler.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,7 @@ class RTMPMediaMessageHandler{
133133
}
134134

135135
destroy() {
136+
this._transmuxer.destroy();
136137
this._mediaInfo = null;
137138
this._metadata = null;
138139
this._audioMetadata = null;

src/rtmp/RTMPMessageHandler.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,12 @@ class RTMPMessageHandler {
7373
}
7474
}
7575

76+
destroy(){
77+
this.media_handler.destroy();
78+
this.media_handler = null;
79+
this.chunk_parser = null
80+
}
81+
7682
/**
7783
*
7884
* @param {Uint8Array} data

src/utils/event_emitter.js

Lines changed: 57 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import Log from "../utils/logger";
2323
class EventEmitter{
2424
ListenerList = [];
2525
TAG = "EventEmitter";
26+
waiters = [];
2627

2728
constructor() {
2829
}
@@ -31,18 +32,35 @@ class EventEmitter{
3132
*
3233
* @param {String} event
3334
* @param {Function} listener
35+
* @param {boolean} modal
3436
*/
35-
addEventListener(event, listener){
37+
addEventListener(event, listener, modal = false){
38+
Log.d(this.TAG, "addEventListener: " + event);
39+
40+
for(let i = 0; i < this.ListenerList.length;i++){
41+
let entry = this.ListenerList[i];
42+
if(entry[0] === event) {
43+
if (modal || entry[1] === listener) {
44+
Log.w(this.TAG, "Listener already registered, overriding");
45+
return;
46+
}
47+
}
48+
}
3649
this.ListenerList.push([event, listener]);
3750
}
3851

52+
waitForEvent(event, callback){
53+
this.waiters.push([event, callback]);
54+
}
55+
3956
/**
4057
*
4158
* @param {String} event
4259
* @param {Function} listener
60+
* @param {boolean} modal
4361
*/
44-
addListener(event, listener){
45-
this.ListenerList.push([event, listener]);
62+
addListener(event, listener, modal){
63+
this.addEventListener(event, listener, modal);
4664
}
4765

4866

@@ -51,21 +69,41 @@ class EventEmitter{
5169
* @param {String} event
5270
* @param {Function} listener
5371
*/
54-
removeListener(event, listener){
72+
removeEventListener(event, listener){
73+
Log.d(this.TAG, "removeEventListener: " + event);
74+
5575
for(let i = 0; i < this.ListenerList.length;i++){
5676
let entry = this.ListenerList[i];
57-
if(entry[0] == event && entry[1] == listener){
77+
if(entry[0] === event && entry[1] === listener){
5878
this.ListenerList.splice(i,1);
5979
return;
6080
}
6181
}
6282
}
6383

84+
removeListener(event, listener){
85+
this.removeEventListener(event, listener);
86+
}
87+
6488
/**
6589
* Remove all listener
6690
*/
67-
removeAllListeners(){
68-
this.ListenerList = [];
91+
removeAllEventListener(event){
92+
Log.d(this.TAG, "removeAllEventListener: ", event);
93+
if(event) {
94+
for(let i = 0; i < this.ListenerList.length;i++) {
95+
let entry = this.ListenerList[i];
96+
if(entry[0] === event){
97+
this.ListenerList.splice(i,1);
98+
i--;
99+
}
100+
}
101+
} else
102+
this.ListenerList = [];
103+
}
104+
105+
removeAllListener(event){
106+
this.removeAllEventListener(event);
69107
}
70108

71109
/**
@@ -75,6 +113,18 @@ class EventEmitter{
75113
*/
76114
emit(event, ...data){
77115
Log.t(this.TAG, "emit EVENT: " + event, ...data);
116+
117+
for(let i = 0; i < this.waiters.length;i++){
118+
let entry = this.waiters[i];
119+
120+
if(entry[0] === event){
121+
Log.d(this.TAG, "hit waiting event: " + event);
122+
entry[1].call(this, ...data);
123+
this.waiters.splice(i,1);
124+
i--;
125+
}
126+
}
127+
78128
for(let i = 0; i < this.ListenerList.length;i++){
79129
let entry = this.ListenerList[i];
80130
if(entry[0] === event){

src/utils/mse-controller.js

Lines changed: 29 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ class MSEController {
8282
this.detachMediaElement();
8383
}
8484
this.e = null;
85-
this._emitter.removeAllListeners();
85+
this._emitter.removeAllListener();
8686
this._emitter = null;
8787
}
8888

@@ -95,6 +95,7 @@ class MSEController {
9595
}
9696

9797
attachMediaElement(mediaElement) {
98+
Log.i(this.TAG, "attach");
9899
if (this._mediaSource) {
99100
throw new IllegalStateException('MediaSource has been attached to an HTMLMediaElement!');
100101
}
@@ -109,8 +110,20 @@ class MSEController {
109110
}
110111

111112
detachMediaElement() {
113+
Log.i(this.TAG, "detach");
114+
112115
if (this._mediaSource) {
113116
let ms = this._mediaSource;
117+
118+
if (ms.readyState === 'open') {
119+
try {
120+
ms.endOfStream();
121+
} catch (error) {
122+
Log.e(this.TAG, error.message);
123+
}
124+
}
125+
126+
114127
for (let type in this._sourceBuffers) {
115128
// pending segments should be discard
116129
let ps = this._pendingSegments[type];
@@ -122,9 +135,11 @@ class MSEController {
122135
// remove all sourcebuffers
123136
let sb = this._sourceBuffers[type];
124137
if (sb) {
138+
Log.i(this.TAG, "try to remove sourcebuffer: " + type);
125139
if (ms.readyState !== 'closed') {
126140
// ms edge can throw an error: Unexpected call to method or property access
127141
try {
142+
Log.i(this.TAG, "removing sourcebuffer: " + type);
128143
ms.removeSourceBuffer(sb);
129144
} catch (error) {
130145
Log.e(this.TAG, error.message);
@@ -136,27 +151,33 @@ class MSEController {
136151
this._sourceBuffers[type] = null;
137152
}
138153
}
139-
if (ms.readyState === 'open') {
140-
try {
141-
ms.endOfStream();
142-
} catch (error) {
143-
Log.e(this.TAG, error.message);
144-
}
145-
}
154+
155+
156+
157+
// proprerly remove sourcebuffers
158+
/*
159+
for(let mimeType in this._sourceBuffers) {
160+
this._mediaSource.removeSourceBuffer(this._sourceBuffers[mimeType]);
161+
}*/
162+
146163
ms.removeEventListener('sourceopen', this.e.onSourceOpen);
147164
ms.removeEventListener('sourceended', this.e.onSourceEnded);
148165
ms.removeEventListener('sourceclose', this.e.onSourceClose);
149166
this._pendingSourceBufferInit = [];
150167
this._isBufferFull = false;
151168
this._idrList.clear();
152169
this._mediaSource = null;
170+
171+
} else {
172+
Log.w(this.TAG, "no mediasource attached");
153173
}
154174

155175
if (this._mediaElement) {
156176
this._mediaElement.src = '';
157177
this._mediaElement.removeAttribute('src');
158178
this._mediaElement = null;
159179
}
180+
160181
if (this._mediaSourceObjectURL) {
161182
window.URL.revokeObjectURL(this._mediaSourceObjectURL);
162183
this._mediaSourceObjectURL = null;

0 commit comments

Comments
 (0)