diff --git a/dashboard-ui/css/images/media/qualityflyout.png b/dashboard-ui/css/images/media/qualityflyout.png new file mode 100644 index 0000000000..da7ab544c9 Binary files /dev/null and b/dashboard-ui/css/images/media/qualityflyout.png differ diff --git a/dashboard-ui/css/images/media/selected.png b/dashboard-ui/css/images/media/selected.png new file mode 100644 index 0000000000..00d65f8fc3 Binary files /dev/null and b/dashboard-ui/css/images/media/selected.png differ diff --git a/dashboard-ui/css/site.css b/dashboard-ui/css/site.css index 4c0b2ba12a..3b8781db36 100644 --- a/dashboard-ui/css/site.css +++ b/dashboard-ui/css/site.css @@ -910,7 +910,11 @@ input[type="range"]::-ms-fill-upper { } .selectedMediaFlyoutOption { - background-color: #e4F4FF; + background-color: #d9F4FF; + background-image: url(images/media/selected.png); + background-repeat: no-repeat; + background-position: right top; + background-size: 16px 16px; } .mediaFlyoutOptionImage { diff --git a/dashboard-ui/scripts/mediaplayer.js b/dashboard-ui/scripts/mediaplayer.js index 56e2200bda..619436d71e 100644 --- a/dashboard-ui/scripts/mediaplayer.js +++ b/dashboard-ui/scripts/mediaplayer.js @@ -38,7 +38,7 @@ } function isFullScreen() { - return document.fullscreenEnabled || document.mozFullscreenEnabled || document.webkitIsFullScreen ? true : false; + return document.fullscreenEnabled || document.mozFullscreenEnabled || document.webkitIsFullScreen || document.mozFullScreen ? true : false; } $(document).on('webkitfullscreenchange mozfullscreenchange fullscreenchange', function () { @@ -76,7 +76,7 @@ function onPlaybackStopped() { - currentTimeElement.hide(); + currentTimeElement.empty(); var endTime = this.currentTime; @@ -141,6 +141,12 @@ if (params.SubtitleStreamIndex != null) { currentSrc = replaceQueryString(currentSrc, 'SubtitleStreamIndex', params.SubtitleStreamIndex); } + if (params.MaxWidth != null) { + currentSrc = replaceQueryString(currentSrc, 'MaxWidth', params.MaxWidth); + } + if (params.VideoBitrate != null) { + currentSrc = replaceQueryString(currentSrc, 'VideoBitrate', params.VideoBitrate); + } clearProgressInterval(); @@ -246,6 +252,19 @@ hideFlyout($('#subtitleFlyout')); }); + + $('#qualityFlyout').on('click', '.mediaFlyoutOption', function () { + + if (!$(this).hasClass('selectedMediaFlyoutOption')) { + + var maxWidth = parseInt(this.getAttribute('data-maxwidth')); + var videoBitrate = parseInt(this.getAttribute('data-videobitrate')); + + changeStream(getCurrentTicks(), { MaxWidth: maxWidth, VideoBitrate: videoBitrate }); + } + + hideFlyout($('#qualityFlyout')); + }); }); function endsWith(text, pattern) { @@ -392,8 +411,6 @@ var duration = this.duration; isStaticStream = duration && !isNaN(duration) && duration != Number.POSITIVE_INFINITY && duration != Number.NEGATIVE_INFINITY; - currentTimeElement.show(); - audioElement.off("play.once"); ApiClient.reportPlaybackStart(Dashboard.getCurrentUserId(), item.Id); @@ -434,19 +451,32 @@ // Account for screen rotation. Use the larger dimension as the width. var screenWidth = Math.max(screen.height, screen.width); - var screenHeight = Math.min(screen.height, screen.width); var baseParams = { audioChannels: 2, audioBitrate: 128000, - videoBitrate: 1500000, - maxWidth: screenWidth, - maxHeight: screenHeight, + videoBitrate: 2000000, + maxWidth: Math.min(screenWidth, 1280), StartTimeTicks: 0, SubtitleStreamIndex: getInitialSubtitleStreamIndex(item.MediaStreams, user), AudioStreamIndex: getInitialAudioStreamIndex(item.MediaStreams, user) }; + var videoStream = item.MediaStreams.filter(function (i) { + return i.Type == "Video"; + })[0]; + + if (videoStream && videoStream.Width) { + + if (videoStream.Width >= 1280) { + baseParams.videoBitrate = 2000000; + } + + else if (videoStream.Width >= 720) { + baseParams.videoBitrate = 400000; + } + } + if (startPosition) { baseParams.StartTimeTicks = startPosition; } @@ -454,31 +484,20 @@ var mp4VideoUrl = ApiClient.getUrl('Videos/' + item.Id + '/stream.mp4', $.extend({}, baseParams, { videoCodec: 'h264', audioCodec: 'aac', - profile: 'high', - videoBitrate: 2500000 - })); - - var tsVideoUrl = ApiClient.getUrl('Videos/' + item.Id + '/stream.ts', $.extend({}, baseParams, { - videoCodec: 'h264', - audioCodec: 'aac', - profile: 'high', - videoBitrate: 2500000 + profile: 'baseline', + level: 3 })); var webmVideoUrl = ApiClient.getUrl('Videos/' + item.Id + '/stream.webm', $.extend({}, baseParams, { videoCodec: 'vpx', - audioCodec: 'Vorbis', - videoBitrate: 2500000 + audioCodec: 'Vorbis' })); var hlsVideoUrl = ApiClient.getUrl('Videos/' + item.Id + '/stream.m3u8', $.extend({}, baseParams, { videoCodec: 'h264', - audioCodec: 'aac' - })); - - var ogvVideoUrl = ApiClient.getUrl('Videos/' + item.Id + '/stream.ogv', $.extend({}, baseParams, { - videoCodec: 'theora', - audioCodec: 'Vorbis' + audioCodec: 'aac', + profile: 'baseline', + level: 3 })); var html = ''; @@ -488,16 +507,14 @@ // Can't autoplay in these browsers so we need to use the full controls if ($.browser.msie || $.browser.android || $.browser.iphone || $.browser.ipad) { - html += '