1enJQ.fn.videoInitialize = function (options) { 2 3 var settings = { 4 'canPlayType': 'video/mp4; codecs="avc1.42E01E, mp4a.40.2"', 5 'width': 640, 6 'height': 360, 7 'preferHTML5': true, /* changing this will mean try to use HTML5 before Flash */ 8 'playHTML5': false, 9 'minimumFlashVersion': [9, 115], // minimum version for H264 flash playback 10 'videoElementId': 'video_element', 11 'mute': false, 12 'time': true, 13 'autoPlay': false, 14 'titleREC_ID': '', 15 'videoContainer': 'video_placeholder', 16 'flashplayer': '/apps/jwplayer/player.swf', 17 'expressInstall': '/apps/jwplayer/expressInstall.swf', 18 'file': '', 19 'image': '', 20 'autostart': false, 21 'plugins': '', 22 'skin': '/apps/jwplayer/hybrid-01282011.zip', 23 'volume': 83, 24 'controlbar': 'over', 25 'allowfullscreen': true, 26 'allowscriptaccess': "always", 27 'wmode': 'opaque', 28 'menu': false, 29 'playSettings': "" 30 }; 31 var clip; 32 var currentClipID; 33 var playerTimerID = 0; 34 var self = this; 35 var inDebugMode = false; 36 var $videoContainer; 37 var playerTimers = {}; 38 39 if (options) { 40 try { 41 enJQ.extend(settings, options); 42 } catch (expv) { 43 if (window.console && settings.debug) 44 console.log(expv); 45 } 46 } 47 this.settings = settings; // is this access only? 48 settings.autostart = settings.autoPlay; 49 50 $videoContainer = settings.$videoContainer; 51 this.$videoContainer = $videoContainer; 52 settings.$videoContainer = ''; 53 54 if (!$videoContainer) { 55 if (enJQ('#video_page').width() < 828) { 56 enJQ('#video_page').addClass('below1 below-start'); 57 } 58 initializationSettings.width = 640; 59 initializationSettings.height = 360; 60 var pageWidth = enJQ('#video_page').width() - (enJQ('#video-feature-area').outerWidth() - enJQ('#video-feature-area').width()); 61 if (pageWidth < initializationSettings.width) { 62 initializationSettings.height = pageWidth * (initializationSettings.height / initializationSettings.width); 63 initializationSettings.width = pageWidth; 64 document.getElementById('hd-link').style.display = 'none'; 65 document.getElementById('sd-link').style.display = 'none'; 66 } 67 enJQ('#big-video').css({ 68 'width': initializationSettings.width 69 }); 70 enJQ('#video_player').css({ 71 'width': initializationSettings.width, 72 'height': initializationSettings.height 73 }); 74 $videoContainer = enJQ('#video_player'); 75 } 76 77 78 var debug = function (msg) { 79 if (inDebugMode) { 80 try { 81 window.console.log(msg); 82 } catch (e) { 83 } 84 } 85 } 86 87 88 var jwplayerDefaults = { 89 id: 'jwplayer', 90 swf: '/apps/jwplayer/player.swf', 91 height: settings.height, 92 width: settings.width, 93 file: '/apps/video/videostreams_xml.jsp?v=' + settings.titleREC_ID, 94 plugins: 'qualitymonitor' 95 }; 96 97 var getClipID = function () { 98 return clipID; 99 } 100 101 var getStartTime = function () { 102 return clipStartTime; 103 } 104 105 var insertVideo = function (video_url) { 106 updateAttrb(settings.uniquePlayerID, "settings", settings); 107 if (settings.fallbackURL.indexOf("mp4") == -1) { 108 if (window.console) 109 console.log("ATTENTION. FallbackURL = " + settings.fallbackURL); 110 } 111 if (settings.playHTML5) { 112 113 const mpdSrc = '/apps/video/videostreams_dash.mpd?v=' + settings.titleREC_ID + '&inc=image'; 114 const m3u8Src = '/apps/video/videostreams_m3u8.m3u8?v=' + settings.titleREC_ID + '&inc=image'; 115 116 117 var htmlStr = '<en-video data-mpd-src="' + mpdSrc + '" data-m3u8-src="' + m3u8Src + '" src="' + settings.fallbackURL + '" id="' + settings.videoContainer + '" controls poster="' + settings.clip.info.imgSrc720 + '"' + (settings.autostart ? " autoplay" : "") + " " + settings.playSettings + " " + ' preload="metadata">'; 118 if (typeof settings.captionLanguageCodes !== "undefined" && settings.captionLanguageCodes != null && settings.captionLanguageCodes.length > 0) { 119 for (var i = 0; i < settings.captionLanguageCodes.length; i++) { 120 var caption_code = settings.captionLanguageCodes[i].split("|")[0]; 121 var caption_label = settings.captionLanguageCodes[i].split("|")[1].split(" ")[0]; 122 var caption_is_default = settings.captionLanguageCodes[i].split("|")[2]; 123 htmlStr += '<track label="' + caption_label + '" kind="subtitles" srclang="' + caption_code + '" src="/apps/video/captions.jsp?videoREC_ID=' + settings.titleREC_ID + '&languageCode=' + caption_code + '" ' + ((caption_is_default > 0) ? "default" : "") + ' />'; 124 } 125 } 126 htmlStr += '</en-video>'; 127 128 $videoContainer.empty().append(htmlStr); 129 130 const enVideo = document.getElementById(settings.videoContainer); 131 enVideo.addEventListener('play', function() { 132 var obj = {}; 133 obj.id = settings.uniquePlayerID || "unique"; 134 obj.oldstate = "IDLE"; 135 obj.newstate = "BUFFERING"; 136 videoInterface.onPlayerStateChange(obj); 137 }); 138 139 } else { 140 if (getCookie("httpFallback") == null || getCookie("httpFallback") == "") { 141 settings.file = jwplayerDefaults.file + "&inc=image"; 142 settings.provider = ''; 143 } else { 144 if (settings.fallbackURL && settings.fallbackURL.indexOf("//") == 0) { 145 settings.file = window.location.protocol + settings.fallbackURL; 146 } else { 147 settings.file = settings.fallbackURL; 148 } 149 settings.provider = 'http'; 150 } 151 if (settings.debug == true) { 152 settings.plugins = 'qualitymonitor'; 153 } 154 if (settings.placeholder) { 155 settings.image = settings.placeholder; 156 } 157 if (settings.useSmallPlayer == true) { 158 settings.skin = '/apps/jwplayer/hybrid-small-01282011.zip'; 159 } 160 if (settings.playerID != "") { 161 settings.id = settings.playerID; 162 } 163 //Just to trigger express install if necessary 164 //xi.embedSWF(settings.flashplayer, "noflash", "1", "1", "9.0.115", settings.expressInstall, {}, {}, {}); 165 166 jwplayer(settings.videoContainer).setup(settings); 167 } 168 } 169 170 var configureVideoLinks = function (bitrates) { 171 var urls = {}; 172 if ((bitrates.length == 1 || bitrates.length == 2) && bitrates[0].url.match(/small/)) { 173 urls.medium = bitrates[0].url.replace(/mp4:/, ""); 174 return urls; 175 } 176 for (key in bitrates) { 177 if (typeof bitrates[key].url == 'undefined') { 178 continue; 179 } 180 if (bitrates[key].url.match(/small/)) { 181 urls.small = bitrates[key].url.replace(/mp4:/, ""); 182 } else if (bitrates[key].url.match(/medium/)) { 183 urls.medium = bitrates[key].url.replace(/mp4:/, ""); 184 } else if (bitrates[key].url.match(/large/)) { 185 urls.large = bitrates[key].url.replace(/mp4:/, ""); 186 } else if (bitrates[key].url.match(/hd/)) { 187 urls.hd = bitrates[key].url.replace(/mp4:/, ""); 188 } 189 } 190 if (bitrates.length != 0 && urls.small == null && urls.medium == null && urls.large == null && urls.hd == null) { 191 for (i = 0; i < bitrates.length; i++) { 192 if (bitrates[i].url.match(/\.mp4/)) { 193 urls.medium = bitrates[i].url.replace(/mp4:/, ""); 194 } 195 } 196 } 197 if (bitrates.length != 0 && urls.small == null && urls.medium == null && urls.large == null && urls.hd == null) { 198 urls.medium = bitrates[0].url.replace(/mp4:/, ""); 199 } 200 return urls; 201 } 202 203 204 this.switchTo = function (data) { 205 currentClipID = data.info.titleREC_ID; 206 if (data.bitrates) 207 settings.urls = configureVideoLinks(data.bitrates); 208 if (settings.playHTML5) { 209 settings.titleREC_ID = data.info.titleREC_ID; 210 settings.clip = { ...data }; 211 212 insertVideo(); 213 214 resetAttrb('unique'); 215 updateAttrb('unique', "settings", settings); 216 updateAttrb('unique', "data", data); 217 } else { 218 jwplayer(settings.videoContainer).remove(); 219 220 var tmp = document.getElementById("video_player"); 221 if (tmp) { 222 tmp.innerHTML = "<div id='" + settings.videoContainer + "'></div>"; 223 } 224 225 settings.start = ''; 226 settings.provider = ''; 227 settings.autostart = "true"; 228 229 if (settings.urls.xsmall && settings.urls.xsmall.indexOf(".mp4") > 0) { 230 settings.fallbackURL = '//' + data.info.mmsUri + "/mmroot" + settings.urls.xsmall; 231 } else if (settings.urls.small && settings.urls.small.indexOf(".mp4") > 0) { 232 settings.fallbackURL = '//' + data.info.mmsUri + "/mmroot" + settings.urls.small; 233 } else if (settings.urls.medium && settings.urls.medium.indexOf(".mp4") > 0) { 234 settings.fallbackURL = '//' + data.info.mmsUri + "/mmroot" + settings.urls.medium; 235 } else if (settings.urls.large && settings.urls.large.indexOf(".mp4") > 0) { 236 settings.fallbackURL = '//' + data.info.mmsUri + "/mmroot" + settings.urls.large; 237 } else if (settings.urls.hd && settings.urls.hd.indexOf(".mp4") > 0) { 238 settings.fallbackURL = '//' + data.info.mmsUri + "/mmroot" + settings.urls.hd; 239 } 240 241 if (getCookie("httpFallback") == null || getCookie("httpFallback") == "" || settings.fallbackURL.indexOf(".mp4") == -1) {
242 settings.file = '/apps/video/videostreams_xml.jsp?v=' + data.info.titleREC_ID; 243 settings.provider = ''; 244 } else { 245 settings.file = settings.fallbackURL; 246 settings.provider = 'http'; 247 } 248 249 settings.image = data.info.imgSrc720; 250 if (settings.debug == true) { 251 settings.plugins = 'qualitymonitor'; 252 } 253 if (settings.placeholder) { 254 settings.image = settings.placeholder; 255 } 256 if (settings.useSmallPlayer == true) { 257 settings.skin = '/apps/jwplayer/hybrid-small-01282011.zip'; 258 } 259 settings.titleREC_ID = data.info.titleREC_ID; 260 //swfobject.embedSWF(settings.player, settings.videoContainer, "100%", "100%", "9.0.115", settings.expressInstall, settings.flashvars, settings.params, settings.attributes); 261 resetAttrb('unique'); 262 updateAttrb('unique', "settings", settings); 263 updateAttrb('unique', "data", data); 264 265 //Just to trigger express install if necessary 266 //xi.embedSWF(settings.flashplayer, "noflash", "1", "1", "9.0.115", settings.expressInstall, {}, {}, {}); 267 268 jwplayer(settings.videoContainer).setup(settings); 269 } 270 } 271 272 this.changeWidth = function (new_width, success) { 273 var $videoElement = enJQ('#' + settings.videoContainer); 274 var new_height = parseInt(new_width * (1 / ($videoContainer.width() / $videoContainer.height()))); 275 276 if (false && settings.playHTML5) { 277 // can do below, works for html5 as well 278 } else { 279 var newDimensions = {width: new_width, height: new_height}; 280 $videoElement.css(newDimensions); 281 $videoContainer.css(newDimensions); 282 } 283 284 if (enJQ.isFunction(success)) success(); 285 } 286 287 var hasMP4Video = function () { 288 if (settings.urls.medium.match(/\.mp4/)) { 289 return true; 290 } 291 return false; 292 } 293 294 var supports_h264_baseline_video = function () { 295 var supports_video = function () { 296 return !!document.createElement('video').canPlayType; 297 } 298 if (!supports_video()) { 299 return false; 300 } 301 var v = document.createElement("video"); 302 return v.canPlayType(settings.canPlayType); 303 } 304 305 this.onPlayerSeek = function (obj) { 306 var uniquePlayerID = obj.id.replace("video_placeholder", ""); 307 if (uniquePlayerID == "" && obj.id == "video_placeholder") { 308 //pages except single.jsp. Because there can be only one player on the page. 309 uniquePlayerID = "unique"; 310 } 311 updateAttrb(uniquePlayerID, "isSeeking", true); 312 } 313 314 this.onMeta = function (obj) { 315 if (obj && obj.code && obj.code == "NetConnection.Connect.Success" && obj.id) { 316 var uniquePlayerID = obj.id.replace("video_placeholder", ""); 317 var isTunneledNow = (obj.connection === "tunneled"); 318 if (!isTunneledNow && getAttrb(uniquePlayerID, "isTunneled") === true) { 319 updateAttrb(uniquePlayerID, "forceStopOnPlay", true); 320 } 321 updateAttrb(uniquePlayerID, "isTunneled", isTunneledNow); 322 } 323 } 324 325 this.onPlayerStateChange = function (obj) { 326 var uniquePlayerID = obj.id.replace("video_placeholder", ""); 327 if (uniquePlayerID == "" && obj.id == "video_placeholder") { 328 //pages except single.jsp. Because there can be only one player on the page. 329 uniquePlayerID = "unique"; 330 } 331 332 if (window.console && settings.debug) { 333 console.log("oldstate: " + obj.oldstate + ", newstate = " + obj.newstate + (getAttrb(uniquePlayerID, "isTunneled") ? ", isTunneled = " + getAttrb(uniquePlayerID, "isTunneled") : "")); 334 //console.log(obj); 335 } 336 try { 337 if ((obj.oldstate == "IDLE" && obj.newstate == "BUFFERING") || (obj.oldstate == "BUFFERING" && obj.newstate == "PLAYING")) { 338 if (!getAttrb(uniquePlayerID, "incremented") && getAttrb(uniquePlayerID, "incrementTimer") == "") { 339 updateAttrb(uniquePlayerID, "incrementTimer", setTimeout("window.videoInterface.incrementViewCount('" + uniquePlayerID + "')", 30000)); 340 if (window.console && settings.debug) { 341 console.log("playerID: " + obj.id + ", playing title: " + uniquePlayerID + ", will increment in 30 sec"); 342 } 343 } 344 } 345 346 if (obj.newstate == "COMPLETED") { 347 if (!getAttrb(uniquePlayerID, "incremented")) { 348 //Clear timer if any 349 clearTimeout(getAttrb(uniquePlayerID, "incrementTimer")); 350 window.videoInterface.incrementViewCount(uniquePlayerID); 351 } 352 } 353 354 if (obj.newstate == "PLAYING" && getAttrb(uniquePlayerID, "forceStopOnPlay") === true) { 355 updateAttrb(uniquePlayerID, "forceStopOnPlay", false); 356 jwplayer(obj.id).pause(true).stop(); 357 } 358 359 if (obj.oldstate == "PLAYING" && obj.newstate == "BUFFERING" && !getAttrb(uniquePlayerID, "isSeeking")) { 360 //There are bandwidth issues, switch to pseudo-streaming 361 362 //check if it already happend 363 if (getAttrb(uniquePlayerID, "count") > 1) { 364 //Ignore for five times if RTMP is not serving the smallest version, as problem can be the video itself 365 try { 366 if (jwplayer(obj.id).getPlaylist()[0]['file'].indexOf('xsmall.mp4') == -1 && getAttrb(uniquePlayerID, "count") < 4) { 367 if (window.console) 368 console.log("RTMP is not playing the smallest version, should we we swtich? [count=" + getAttrb(uniquePlayerID, "count") + "]"); 369 updateAttrb(uniquePlayerID, "isBuffering", true); 370 updateAttrb(uniquePlayerID, "lastBufferTime", new Date().getTime()); 371 updateAttrb(uniquePlayerID, "count", getAttrb(uniquePlayerID, "count") + 1); 372 return; 373 } 374 } catch (e) { 375 376 } 377 if (window.console) { 378 console.log("Falling back to Pseudo-streaming. Starting the play from " + getAttrb(uniquePlayerID, "position")); 379 } 380 fallBack(uniquePlayerID); 381 return; 382 } 383 384 var timeDiff = -1; 385 if (getAttrb(uniquePlayerID, "lastBufferTime") != -1) { 386 timeDiff = Math.round((new Date().getTime() - getAttrb(uniquePlayerID, "lastBufferTime")) / 1000); 387 } 388 updateAttrb(uniquePlayerID, "isBuffering", true); 389 updateAttrb(uniquePlayerID, "lastBufferTime", new Date().getTime()); 390 updateAttrb(uniquePlayerID, "count", getAttrb(uniquePlayerID, "count") + 1); 391 if (window.console) { 392 //console.log("Problemooooo!! BEFORE [isBuffering=" + getAttrb(uniquePlayerID, "isBuffering") + ", lastBufferTime=" + timeDiff + "]"); 393 } 394 } 395 396 if (obj.oldstate == "BUFFERING" && obj.newstate == "PLAYING" && getAttrb(uniquePlayerID, "isSeeking")) { 397 if (window.console) 398 console.log("STARTED PLAYING AFTER SEEKING. SETTING SEEKING TO FALSE"); 399 updateAttrb(uniquePlayerID, "isSeeking", false); 400 } 401 402 } catch (Excp) { 403 if (window.console && settings.debug) { 404 console.log(Excp); 405 } 406 } 407 } 408 409 this.onPlayerTimeChange = function (obj) { 410 try { 411 var uniquePlayerID = obj.id.replace("video_placeholder", ""); 412 if (uniquePlayerID == "" && obj.id == "video_placeholder") { 413 //pages except single.jsp. Because there can be only one player on the page. 414 uniquePlayerID = "unique"; 415 } 416 updateAttrb(uniquePlayerID, 'position', obj.position); 417 updateAttrb(uniquePlayerID, 'duration', obj.duration); 418 } catch (e) { 419 if (window.console) 420 console.log(e); 421 } 422 } 423 424 this.onPlayerPlaybackError = function (obj) { 425 if (window.console && settings.debug) 426 console.log("MODELEVENT.ERROR: " + obj.message); 427 } 428 429 this.incrementViewCount = function (uniquePlayerID) { 430 if (getAttrb(uniquePlayerID, "incrementTimer") != "") { 431 clearTimeout(getAttrb(uniquePlayerID, "incrementTimer")); 432 updateAttrb(uniquePlayerID, "incrementTimer", ""); 433 } 434 var titleREC_ID = getAttrb(uniquePlayerID, "settings").titleREC_ID; 435 if (titleREC_ID == "") { 436 if (window.console) { 437 console.log("Could not increment"); 438 console.log(uniquePlayerID); 439 } 440 return; 441 } 442 MMCheck.incrementCount(titleREC_ID); 443 updateAttrb(uniquePlayerID, "incremented", true); 444 playerTimerID = 0; 445 if (window.console && settings.debug) 446 console.log("TitleREC_ID: " + titleREC_ID + ", incremented"); 447 } 448 449 var init = function () { 450 if (settings.debug == true && window.console) { 451 inDebugMode = true; 452 } 453 settings.width = $videoContainer.width(); 454 settings.height = $videoContainer.height(); 455 if (supports_h264_baseline_video()) { 456 enJQ('#video_problems').hide(); 457 settings.urls = configureVideoLinks(settings.clip.bitrates); 458 settings.playHTML5 = true; 459 insertVideo(settings.initialVideo); 460 } else if (swfobject.hasFlashPlayerVersion("6.0.65")) { 461 insertVideo(settings.initialVideo); 462 } else { 463 $videoContainer.append('Sorry, videos require a browser that supports Flash or H.264 video playback.'); 464 } 465 } 466
467 init(); 468 return this; 469}; 470 471enJQ.fn.supports_h264_baseline_video = function () { 472 var supports_video = function () { 473 return !!document.createElement('video').canPlayType; 474 } 475 if (!supports_video()) { 476 return false; 477 } 478 var v = document.createElement("video"); 479 return v.canPlayType('video/mp4; codecs="avc1.42E01E, mp4a.40.2"'); 480}; 481 482function updateAttrb(uniquePlayerID, attrName, attrValue) { 483 try { 484 if (typeof document.playerAttrbs == "undefined") { 485 document.playerAttrbs = new Array(); 486 } 487 488 if (typeof document.playerAttrbs[uniquePlayerID] == "undefined") { 489 document.playerAttrbs[uniquePlayerID] = {'settings': {}, 'lastBufferTime': -1, 'isBuffering': false, 'count': 0, 'position': 0, 'duration': -1, 'fallbackStatus': 0, "isSeeking" : false, "incrementTimer": '', "incremented" : false, 'data': {}, 'isTunneled': false, 'forceStopOnPlay': false } 490 } 491 492 document.playerAttrbs[uniquePlayerID][attrName] = attrValue; 493 } catch (e) { 494 if (window.console) 495 console.log(e); 496 } 497} 498 499function resetAttrb(uniquePlayerID) { 500 updateAttrb(uniquePlayerID, "lastBufferTime", -1); 501 updateAttrb(uniquePlayerID, "isBuffering", false); 502 updateAttrb(uniquePlayerID, "count", 0); 503 updateAttrb(uniquePlayerID, "position", 0); 504 updateAttrb(uniquePlayerID, "duration", -1); 505 updateAttrb(uniquePlayerID, "fallbackStatus", 0); 506 updateAttrb(uniquePlayerID, "isSeeking", false); 507 updateAttrb(uniquePlayerID, "incrementTimer", ''); 508 updateAttrb(uniquePlayerID, "incremented", false); 509 updateAttrb(uniquePlayerID, "data", {}); 510 updateAttrb(uniquePlayerID, "settings", {}); 511 updateAttrb(uniquePlayerID, "isTunneled", false); 512 updateAttrb(uniquePlayerID, "forceStopOnPlay", false); 513} 514 515function getAttrb(uniquePlayerID, attrName) { 516 if (typeof document.playerAttrbs == "undefined" || typeof document.playerAttrbs[uniquePlayerID] == "undefined") { 517 return ""; 518 } 519 return document.playerAttrbs[uniquePlayerID][attrName]; 520} 521 522function fallBack(uniquePlayerID) { 523 if (getAttrb(uniquePlayerID, "fallbackStatus") == 2) { 524 return; 525 } 526 var newSettings = getAttrb(uniquePlayerID, "settings"); 527 newSettings.start = getAttrb(uniquePlayerID, "position"); 528 newSettings.file = newSettings.fallbackURL; 529 newSettings.autostart = true; 530 newSettings.provider = 'http'; 531 if (newSettings.file.substr(-3) != "mp4") { 532 if (window.console) { 533 console.log("FALLBACK ERROR: FILE FOUND " + newSettings.file); 534 console.log(newSettings); 535 } 536 return; 537 } 538 if (document.getElementById(newSettings.videoContainer)) { 539 try { 540 jwplayer(newSettings.videoContainer).remove(); 541 } catch (e) { 542 if (window.console) { 543 console.log("Could not be removed cleanly."); 544 console.log(e); 545 } 546 } 547 document.getElementById(newSettings.videoWrapper).innerHTML = "<div id='" + newSettings.videoContainer + "'></div>"; 548 setCookie("httpFallback", "1", 1); 549 } 550 jwplayer(newSettings.videoContainer).setup(newSettings); 551 updateAttrb(uniquePlayerID, "fallbackStatus", "2"); 552} 553 554function setCookie(sName, sValue, days) { 555 var expires = ""; 556 if (days) { 557 var date = new Date(); 558 date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000)); 559 expires = date.toGMTString(); 560 } 561 if (expires != null && expires != "") 562 document.cookie = sName + "=" + escape(sValue) + "; path=/; expires=" + expires; 563 else 564 document.cookie = sName + "=" + escape(sValue) + "; path=/;"; 565} 566 567function getCookie(sName) { 568 var aCookie = document.cookie.split("; "); 569 for (var i = 0; i < aCookie.length; i++) { 570 var aCrumb = aCookie[i].split("="); 571 if (sName == aCrumb[0]) 572 return unescape(aCrumb[1]); 573 } 574 575 return null; 576} 577 578function delCookie(sName) { 579 document.cookie = sName + "=x ; expires=Fri, 31 Dec 1999 23:59:59 GMT;"; 580} 581 582 583function VideoInitIsLoaded() { 584 return true; 585}
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.