···169169 hls.currentLevel = -1;
170170 hls.loadLevel = -1;
171171 }
172172- const quality = hlsLevelToQuality(hls.levels[hls.currentLevel]);
173173- emit("changedquality", quality);
172172+ // Only emit quality when we have a valid level index (>= 0)
173173+ // When automaticQuality is true, currentLevel is -1, so we wait for LEVEL_SWITCHED event
174174+ if (hls.currentLevel >= 0) {
175175+ const quality = hlsLevelToQuality(hls.levels[hls.currentLevel]);
176176+ emit("changedquality", quality);
177177+ }
174178 }
175179176180 function setupSource(vid: HTMLVideoElement, src: LoadableSource) {
···189193 autoStartLoad: true,
190194 maxBufferLength: 120, // 120 seconds
191195 maxMaxBufferLength: 240,
196196+ abrEwmaDefaultEstimate: 5 * 1000 * 1000, // 5 Mbps default bandwidth estimate for better ABR decisions
192197 fragLoadPolicy: {
193198 default: {
194199 maxLoadTimeMs: 30 * 1000, // allow it load extra long, fragments are slow if requested for the first time on an origin