diff options
Diffstat (limited to 'hdmicap.html')
-rw-r--r-- | hdmicap.html | 327 |
1 files changed, 327 insertions, 0 deletions
diff --git a/hdmicap.html b/hdmicap.html new file mode 100644 index 0000000..11c60b8 --- /dev/null +++ b/hdmicap.html @@ -0,0 +1,327 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset=utf-8 http-equiv="Content-Language" content="en"/> + <title>hdmicap</title> +<style type="text/css"> + td { font-size:8pt; font: Arial; font-weight:normal; text-align:center; color:#404040; text-align:center; background:#efefff; padding:1px; -webkit-border-radius:1px; -moz-border-radius:1px; border-radius:1px;white-space:nowrap;} + td.dump { font-size:8pt; font: Arial; font-weight:normal; text-align:center; color:#404040; vertical-align:top; background:#efefff; padding:1px; -webkit-border-radius:1px; -moz-border-radius:1px; border-radius:1px;} + + div.title { font-size:12pt; font: Arial; font-weight:normal; text-align:center; color:#000000; background:#d8d8e8; } + + div.capdata { font-size:10pt; font: Arial; font-weight:normal; text-align:center; color:#000000; vertical-align:middle; text-align:center; background:#e0e0f0; padding:1px; -webkit-border-radius:1px; -moz-border-radius:1px; border-radius:1px;} + div.capdata_cea { font-size:10pt; font: Arial; font-weight:normal; text-align:center; color:#000000; vertical-align:middle; text-align:center; background:#e0ffe0; padding:1px; -webkit-border-radius:1px; -moz-border-radius:1px; border-radius:1px;} + .browser { font-size:18pt; font: Arial; font-weight:normal; text-align:center; color:#ffff00; vertical-align:middle; text-align:center; background:#d0b070; padding:12px; -webkit-border-radius:10px; -moz-border-radius:10px; border-radius:10px;} + .tr-enabled { font-size:10pt; font: Arial; font-weight:normal; text-align:center; color:#000000; vertical-align:middle; text-align:center; background:#d0d0ff; padding:12px; -webkit-border-radius:10px; -moz-border-radius:10px; border-radius:10px;} + .tr-disabled { font-size:10pt; font: Arial; font-weight:normal; text-align:center; color:#808080; vertical-align:middle; text-align:center; background:#c0c0c0; padding:12px; -webkit-border-radius:10px; -moz-border-radius:10px; border-radius:10px;} + + .group2 { width:600px; vertical-align:middle; text-align:center; background:#f0f0e0; padding:12px; -webkit-border-radius:10px; -moz-border-radius:10px; border-radius:10px; } + .explain { vertical-align:middle; text-align:center; background:#f0f0c0; padding:12px; -webkit-border-radius:10px; -moz-border-radius:10px; border-radius:10px; color:#404000; } + .content { vertical-align:top; text-align:center; background:#fffff0; padding:12px; -webkit-border-radius:10px; -moz-border-radius:10px; border-radius:10px; } + .canvas { vertical-align:top; text-align:center; background:#efefd0; padding:12px; -webkit-border-radius:10px; -moz-border-radius:10px; border-radius:10px; } +</style> +</head> +<body> +<header></header> +<article> +<table><tr style="vertical-align:top"><td style="vertical-align:top"> + <table width="100%" style="vertical-align:top"><tr style="vertical-align:top"><td style="vertical-align:top"> + <table style="vertical-align:top"><tr style="vertical-align:top"><td style="vertical-align:top"><a href="http://libwebsockets.org"> + <img src="/hdmicap.png"></a><td></td> + <tr><td class="td.dump"> + <table> + <tr><td colspan="4" align="center"><div class="title">HDMI clock<div></td></tr> + <tr><td width="99%">PLL lock</td> + <td colspan="2" tip="Whether PLL could lock to perform pixel clock recovery"><div id="pll_locked" class="capdata"></div></td><td></td></tr> + <tr id="cea-info" class="tr-enabled" tip="VIC code reported in AVI infoframe"><td>AVI VIC</td> + <td></td><td><div id="vic_cea" class="capdata_cea"></div></td><td></td></tr> + <tr id="clock-info" class="tr-enabled" tip="HDMI pixel clock rate"><td>Clock rate</td> + <td><div id="clk_rate" class="capdata"></div></td><td><div id="clk_rate_cea" class="capdata_cea"></div></td><td></td></tr> + <tr id="dlq"><td colspan="4" align="center"><div class="title">Data lane quality<div></td></tr> + <tr id="lane-info" class="tr-enabled" tip="ctrl symbol detection probability, numbers depend on mode blanking content, ch0 may have slightly smaller results."><td>Ctrl symbols</td><td colspan="2" align="center"> + <table> + <tr><td>ch0</td><td>ch1</td><td>ch2</td></tr> + <tr><td><div id="ctrl_ch0_pc" class="capdata"></div></td> + <td><div id="ctrl_ch1_pc" class="capdata"></div></td> + <td><div id="ctrl_ch2_pc" class="capdata"></div></td></tr> + </table> + </td><td></td></tr> + + <tr id="vt"><td colspan="4" align="center"><div class="title">Video Timing<div></td></tr> + <tr id="vsl"tip="HSYNC and VSYNC are detected and polarity confirmed"><td>Video Sync</td> + <td id="sync-info"><div id="video_syncs" class="capdata"></div></td><td id="sync-info_cea"><div id="video_syncs_cea" class="capdata_cea"></div></td><td></td></tr> + <tr id="ar" tip="HACT x VACT, active video region"><td>Active region</td><td><div id="active_details" class="capdata"></div></td><td><div id="active_details_cea" class="capdata_cea"></div></td><td></td></tr> + <tr id="hsr"><td>HSYNC rate</td><td><div id="hsync_rate" class="capdata"></div></td><td><div id="hsync_rate_cea" class="capdata_cea"></div></td><td></td></tr> + <tr id="ot" tip="Frame refresh rate"><td>VSYNC rate</td><td><div id="vsync_rate" class="capdata"></div></td><td><div id="vsync_rate_cea" class="capdata_cea"></div></td><td></td></tr> + <tr id="tfs" tip="HTOT x VTOT, Active and blanking area combined"><td>Total frame</td><td><div id="total_details" class="capdata"></div></td><td><div id="total_details_cea" class="capdata_cea"></div></td><td></td></tr> + <tr id="apv" tip="Measured number of pixel-times in a frame"><td style="padding-left:10px;">Px between VSYNCs</td><td style="padding-left:10px;"><div id="total_px_details" class="capdata"></div></td><td style="padding-left:10px;"><div id="total_px_details_cea" class="capdata_cea"></div></td><td></td></tr> + <tr id="hif" tip="The number of HTOT periods should exactly match VTOT"><td style="padding-left:20px;">Frame HTOT</td><td style="padding-left:10px;"><div id="total_px1_details" class="capdata"></div></td><td style="padding-left:10px;"><div id="total_px1_details_cea" class="capdata_cea"></div></td><td></td></tr> + <tr id="vhp" tip="VSYNC should come on the last line at 0 offset from HSYNC (ie, at HTOT + 1 on the last line)"><td style="padding-left:20px;">VSYNC HPOS</td><td style="padding-left:10px;"><div id="vsync_hpos" class="capdata"></div></td><td style="padding-left:10px;"><div id="vsync_hpos_cea" class="capdata_cea"></div></td><td></td></tr> + + <tr id="thb" tip="HBLANK = HFP + HSA + HBP, pixels on a line without active data"><td>HBLANK</td><td><div id="hblank" class="capdata"></div></td><td><div id="hblank_cea" class="capdata_cea"></div></td><td></td></tr> + <tr id="thfp" tip="HFP, Horizontal Front Porch (aka Right Margin) timing"><td style="padding-left:10px;">HFP</td><td style="padding-left:10px;"><div id="hfp" class="capdata"></div></td><td style="padding-left:10px;"><div id="hfp_cea" class="capdata_cea"></div></td><td></td></tr> + <tr id="thsa" tip="HSA, HSYNC Active timing"><td style="padding-left:10px;">HSA</td><td style="padding-left:10px;"><div id="hsa" class="capdata"></div></td><td style="padding-left:10px;"><div id="hsa_cea" class="capdata_cea"></div></td><td></td></tr> + <tr id="thbp" tip="HBP, Horizontal Back Porch (aka Left Margin) timing"><td style="padding-left:10px;">HBP</td><td style="padding-left:10px;"><div id="hbp" class="capdata"></div></td><td style="padding-left:10px;"><div id="hbp_cea" class="capdata_cea"></div></td><td></td></tr> + <tr id="tvb" tip="VBLANK = VFP + VSA + VBP, lines in a frame without active data"><td>Total V blanking</td><td><div id="vblank" class="capdata"></div></td><td><div id="vblank_cea" class="capdata_cea"></div></td><td></td></tr> + <tr id="tvfp" tip="VFP, Vertical Front Porch (aka Bottom Margin) lines"><td style="padding-left:10px;">VFP</td><td style="padding-left:10px;"><div id="vfp" class="capdata"></div></td><td style="padding-left:10px;"><div id="vfp_cea" class="capdata_cea"></div></td><td></td></tr> + <tr id="tvsa" tip="VSA, VSYNC Active lines"><td style="padding-left:10px;">VSA</td><td style="padding-left:10px;"><div id="vsa" class="capdata"></div></td><td style="padding-left:10px;"><div id="vsa_cea" class="capdata_cea"></div></td><td></td></tr> + <tr id="tvbp" tip="VBP, Vertical Back Porch (aka Top Margin) lines"><td style="padding-left:10px;">VBP</td><td style="padding-left:10px;"><div id="vbp" class="capdata"></div></td><td style="padding-left:10px;"><div id="vbp_cea" class="capdata_cea"></div></td><td></td></tr> + <tr id="md"><td colspan="4" align="center"><div class="title">Frame Metadata<div></td></tr> + <tr id="dif" tip="Blanking px used for data in active region"><td>Data in active</td> + <td id="dia-info"><div id="data_active" class="capdata"></div></td><td></td><td></td></tr> + <tr id="div" tip="VBLANK px used for data"><td>Data in VBLANK</td> + <td id="div-info"><div id="data_vblank" class="capdata"></div></td><td></td><td></td></tr> + + <tr id="di0" tip="Data island types per frame"><td>NULL data pkts</td> + <td id="tdd0"><div id="ddi0" class="capdata"></div></td><td></td><td></td></tr> + <tr id="di1" tip="Data island types per frame"><td>ACR pkts</td> + <td id="tdd1"><div id="ddi1" class="capdata"></div></td><td></td><td></td></tr> + <tr id="di2" tip="Data island types per frame"><td>Audio pkts</td> + <td id="tdd2"><div id="ddi2" class="capdata"></div></td><td></td><td></td></tr> + <tr id="di3" tip="Data island types per frame"><td>General Control pkts</td> + <td id="tdd3"><div id="ddi3" class="capdata"></div></td><td></td><td></td></tr> + <tr id="di4" tip="Data island types per frame"><td>ACP</td> + <td id="tdd4"><div id="ddi4" class="capdata"></div></td><td></td><td></td></tr> + <tr id="di5" tip="Data island types per frame"><td>ISRC1</td> + <td id="tdd5"><div id="ddi5" class="capdata"></div></td><td></td><td></td></tr> + <tr id="di6" tip="Data island types per frame"><td>ISRC2</td> + <td id="tdd6"><div id="ddi6" class="capdata"></div></td><td></td><td></td></tr> + <tr id="di7" tip="Data island types per frame"><td>1-bit Audio</td> + <td id="tdd7"><div id="ddi7" class="capdata"></div></td><td></td><td></td></tr> + <tr id="di8" tip="Data island types per frame"><td>DST Audio</td> + <td id="tdd8"><div id="ddi8" class="capdata"></div></td><td></td><td></td></tr> + <tr id="di9" tip="Data island types per frame"><td>HBR Audio</td> + <td id="tdd9"><div id="ddi9" class="capdata"></div></td><td></td><td></td></tr> + <tr id="di10" tip="Data island types per frame"><td>Gamut</td> + <td id="tdd10"><div id="ddi10" class="capdata"></div></td><td></td><td></td></tr> + <tr id="di11" tip="Data island types per frame"><td>Vendor IF</td> + <td id="tdd11"><div id="ddi11" class="capdata"></div></td><td></td><td></td></tr> + <tr id="di12" tip="Data island types per frame"><td>AVI IF</td> + <td id="tdd12"><div id="ddi12" class="capdata"></div></td><td></td><td></td></tr> + <tr id="di13" tip="Data island types per frame"><td>SPD IF</td> + <td id="tdd13"><div id="ddi13" class="capdata"></div></td><td></td><td></td></tr> + <tr id="di14" tip="Data island types per frame"><td>Audio IF</td> + <td id="tdd14"><div id="ddi14" class="capdata"></div></td><td></td><td></td></tr> + <tr id="di15" tip="Data island types per frame"><td>MPEG SRC IF</td> + <td id="tdd15"><div id="ddi15" class="capdata"></div></td><td></td><td></td></tr> + </table> + </td></tr> + </table> + </td></tr> + </table> + </td><td id="show" class="td.dump" width="99%" style="display:none"><div id="dump"></div><div id="capture"><img id="imgtag" style="object-fit:none;max-device-width=864;" src="/dump.png"></div></td></tr> +</table> +</article> + +<script> + + + var tds_pll = [ "cea-info", "clock-info", "dlq", "lane-info" ]; + var tds_syncs = [ "vt", "vsl" ]; + var tds_sane = [ "ar", "hsr", "ot", "tfs", "apv", "hif", "vhp", "thb", "thfp", "thsa", "thbp", + "tvb", "tvfp", "tvsa", "tvbp", "md", "dif", "div", "show", + "di0", "di1", "di2", "di3", "di4", "di5", "di6", "di7", "di8", "di9", "di10", "di11", "di12", + "di13", "di14", "di15"]; + + var tds_cea = [ "vic_cea", "clk_rate_cea", "video_syncs_cea", + "active_details_cea", "hsync_rate_cea", + "vsync_rate_cea", "total_details_cea", + "total_px_details_cea", "total_px1_details_cea", + "vsync_hpos_cea", "hblank_cea", "hbp_cea", "hsa_cea", + "hfp_cea", "vblank_cea", "vbp_cea", "vsa_cea", + "vfp_cea" ]; + + var tds_compare = [ "clk_rate", "video_syncs", "active_details", + "hsync_rate", "vsync_rate", "total_details", + "total_px_details", "total_px1_details", + "vsync_hpos", "hblank", "hbp", "hsa", "hfp", + "vblank", "vbp", "vsa", "vfp" ]; + +var pos = 0; + +function get_appropriate_ws_url() +{ + var pcol; + var u = document.URL; + + if (u.substring(0, 5) == "https") { + pcol = "wss://"; + u = u.substr(8); + } else { + pcol = "ws://"; + if (u.substring(0, 4) == "http") + u = u.substr(7); + } + + u = u.split('/'); + + /* + "/xxx" bit is for IE10 workaround */ + return pcol + u[0] + "/xxx"; +} + +var connection = 0; +var obj; +var png_frame; + +function conn_retry() +{ + var r1, r2, r3, x, y, chan, z, block, channel_data = 0, tpt, tot; + + if (connection) + return; + + socket = new WebSocket(get_appropriate_ws_url(), "linaro.hdmicap"); + + try { + socket.onopen = function() { + connection = 1; + } + + socket.onmessage = function got_packet(msg) { + //document.getElementById("dump").textContent = msg.data; + obj = JSON.parse(msg.data); + if (obj.metadata.pll_locked == 0){ + document.getElementById("pll_locked").textContent = "No"; + for (n = 0; n < tds_pll.length; n++) + document.getElementById(tds_pll[n]).style.display = "none"; + for (n = 0; n < tds_syncs.length; n++) + document.getElementById(tds_syncs[n]).style.display = "none"; + for (n = 0; n < tds_sane.length; n++) + document.getElementById(tds_sane[n]).style.display = "none"; + return; + } + document.getElementById("pll_locked").textContent = "Yes"; + document.getElementById("clk_rate").textContent = obj.metadata.pxclk_MHz + "MHz"; + tot = Number(obj.metadata.ctrl_ch0_pc) + Number(obj.metadata.ctrl_ch1_pc) + Number(obj.metadata.ctrl_ch2_pc); + document.getElementById("ctrl_ch0_pc").textContent = ((Number(obj.metadata.ctrl_ch0_pc) * 100) / tot).toPrecision(2) + "%"; + document.getElementById("ctrl_ch1_pc").textContent = ((Number(obj.metadata.ctrl_ch1_pc) * 100) / tot).toPrecision(2) + "%"; + document.getElementById("ctrl_ch2_pc").textContent = ((Number(obj.metadata.ctrl_ch2_pc) * 100) / tot).toPrecision(2) + "%"; + + for (n = 0; n < tds_pll.length; n++) + document.getElementById(tds_pll[n]).style.display = "table-row"; + if (obj.metadata.sync_detected == 0){ + document.getElementById("video_syncs").textContent = "No"; + for (n = 0; n < tds_syncs.length; n++) + document.getElementById(tds_syncs[n]).style.display = "none"; + for (n = 0; n < tds_sane.length; n++) + document.getElementById(tds_sane[n]).style.display = "none"; + document.getElementById("imgtag").style.display = "none"; + return; + } + + document.getElementById("video_syncs").textContent = + "H"+obj.metadata.hpol+", V"+obj.metadata.vpol; + for (n = 0; n < tds_syncs.length; n++) + document.getElementById(tds_syncs[n]).style.display = "table-row"; + + if (obj.metadata.sanity == 0) { + for (n = 0; n < tds_sane.length; n++) + document.getElementById(tds_sane[n]).style.display = "none"; + document.getElementById("imgtag").style.display = "none"; + return; + } + for (n = 0; n < tds_sane.length; n++) + document.getElementById(tds_sane[n]).style.display = "table-row"; + + document.getElementById("active_details").innerHTML = "<b>"+obj.metadata.hact + "x" + + obj.metadata.vact + "</b>"; + document.getElementById("hsync_rate").textContent = obj.metadata.hrate_kHz + "kHz"; + document.getElementById("vsync_rate").textContent = obj.metadata.vrate_Hz + "Hz"; + document.getElementById("total_details").textContent = obj.metadata.htot + "x" + + obj.metadata.vtot; + document.getElementById("total_px_details").textContent = obj.metadata.px_in_frame; + document.getElementById("total_px1_details").textContent = obj.metadata.htot_in_frame; + document.getElementById("vsync_hpos").textContent = "+" + obj.metadata.vsync_onset_hpx + " px"; + document.getElementById("hblank").textContent = obj.metadata.hbl; + document.getElementById("hbp").textContent = obj.metadata.hbp; + document.getElementById("hsa").textContent = obj.metadata.hsa; + document.getElementById("hfp").textContent = obj.metadata.hfp; + + document.getElementById("vblank").textContent = obj.metadata.vbl; + document.getElementById("vbp").textContent = obj.metadata.vbp; + document.getElementById("vsa").textContent = obj.metadata.vsa; + document.getElementById("vfp").textContent = obj.metadata.vfp; + + document.getElementById("data_active").textContent = obj.metadata.data_px_active; + document.getElementById("data_vblank").textContent = obj.metadata.data_vb; + + //document.getElementById("blanking_px").textContent =; + //document.getElementById("").textContent = obj.metadata.data_px_active; + document.getElementById("dump").textContent = obj.png_frame; + if (obj.png_frame != png_frame) { + png_frame = obj.png_frame; + document.getElementById("imgtag").src = "/dump.png?x=" + png_frame; + document.getElementById("imgtag").style.display = "table-row"; + } + + document.getElementById("ddi0").textContent = obj.data_islands.stats.Null; + document.getElementById("ddi1").textContent = obj.data_islands.stats.ACR; + document.getElementById("ddi2").textContent = obj.data_islands.stats.Audio; + document.getElementById("ddi3").textContent = obj.data_islands.stats.Gencon; + document.getElementById("ddi4").textContent = obj.data_islands.stats.ACP; + document.getElementById("ddi5").textContent = obj.data_islands.stats.ISRC1; + document.getElementById("ddi6").textContent = obj.data_islands.stats.ISRC2; + document.getElementById("ddi7").textContent = obj.data_islands.stats.onebit; + document.getElementById("ddi8").textContent = obj.data_islands.stats.DST; + document.getElementById("ddi9").textContent = obj.data_islands.stats.HBR; + document.getElementById("ddi10").textContent = obj.data_islands.stats.Gamut; + document.getElementById("ddi11").textContent = obj.data_islands.stats.VendorIF; + document.getElementById("ddi12").textContent = obj.data_islands.stats.AVIIF; + document.getElementById("ddi13").textContent = obj.data_islands.stats.SPDIF + " (" + obj.data_islands.spd.spd_name + ")"; + document.getElementById("ddi14").textContent = obj.data_islands.stats.AudioIF; + document.getElementById("ddi15").textContent = obj.data_islands.stats.MPEGIF; + + if (obj.data_islands.avi.cea != 0) { + document.getElementById("vic_cea").textContent = obj.data_islands.avi.cea; + document.getElementById("clk_rate_cea").textContent = obj.data_islands.avi.pxclk_MHz + "MHz"; + document.getElementById("video_syncs_cea").textContent = "H"+obj.data_islands.avi.hpol + ", V"+obj.data_islands.avi.vpol; + + document.getElementById("active_details_cea").innerHTML = "<b>"+obj.data_islands.avi.hact + "x" + + obj.data_islands.avi.vact + "</b>"; + document.getElementById("hsync_rate_cea").textContent = obj.data_islands.avi.hrate_kHz + "kHz"; + document.getElementById("vsync_rate_cea").textContent = obj.data_islands.avi.vrate_Hz + "Hz"; + document.getElementById("total_details_cea").textContent = obj.data_islands.avi.htot + "x" + + obj.data_islands.avi.vtot; + document.getElementById("total_px_details_cea").textContent = obj.data_islands.avi.px_in_frame; + document.getElementById("total_px1_details_cea").textContent = obj.data_islands.avi.vtot+".000"; + document.getElementById("vsync_hpos_cea").textContent = "+0 px"; + document.getElementById("hblank_cea").textContent = obj.data_islands.avi.hbl; + document.getElementById("hbp_cea").textContent = obj.data_islands.avi.hbp; + document.getElementById("hsa_cea").textContent = obj.data_islands.avi.hsa; + document.getElementById("hfp_cea").textContent = obj.data_islands.avi.hfp; + + document.getElementById("vblank_cea").textContent = obj.data_islands.avi.vbl; + document.getElementById("vbp_cea").textContent = obj.data_islands.avi.vbp; + document.getElementById("vsa_cea").textContent = obj.data_islands.avi.vsa; + document.getElementById("vfp_cea").textContent = obj.data_islands.avi.vfp; + } else { + for (n = 0; n < tds_cea.length; n++) + document.getElementById(tds_cea[n]).textContent = ""; + + document.getElementById("vic_cea").textContent = "none"; + } + + for (n = 0; n < tds_compare.length; n++) { + if (document.getElementById(tds_compare[n]).textContent == + document.getElementById(tds_cea[n + 1]).textContent) + document.getElementById(tds_compare[n]).style.backgroundColor = "#e0ffe0"; + else + document.getElementById(tds_compare[n]).style.backgroundColor = "#e0e0f0"; + } + } + + socket.onclose = function(){ + connection = 0; + // grayOut(true,{'zindex':'499'}); + setTimeout("conn_retry();", 1000); + } + } catch(exception) { + setTimeout("conn_retry", 1000); + } +} + +conn_retry(); + +</script> +</body> +</html> |