| <!DOCTYPE html> | 
 | <html lang="en"> | 
 | <head> | 
 | <meta charset="utf-8"> | 
 | <title>Video Codec Test Results</title> | 
 | <style type="text/css"> | 
 | <!-- Begin 960 reset --> | 
 | a,abbr,acronym,address,applet,article,aside,audio,b,big,blockquote,body,canvas,caption,center,cite,c | 
 | ode,dd,del,details,dfn,dialog,div,dl,dt,em,embed,fieldset,figcaption,figure,font,footer,form,h1,h2,h | 
 | 3,h4,h5,h6,header,hgroup,hr,html,i,iframe,img,ins,kbd,label,legend,li,mark,menu,meter,nav,object,ol, | 
 | output,p,pre,progress,q,rp,rt,ruby,s,samp,section,small,span,strike,strong,sub,summary,sup,table,tbo | 
 | dy,td,tfoot,th,thead,time,tr,tt,u,ul,var,video,xmp{border:0;margin:0;padding:0;font-size:100%}html,b | 
 | ody{height:100%}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{displa | 
 | y:block}b,strong{font-weight:bold}img{color:transparent;font-size:0;vertical-align:middle;-ms-interp | 
 | olation-mode:bicubic}ol,ul{list-style:none}li{display:list-item}table{border-collapse:collapse;borde | 
 | r-spacing:0}th,td,caption{font-weight:normal;vertical-align:top;text-align:left}q{quotes:none}q:befo | 
 | re,q:after{content:'';content:none}sub,sup,small{font-size:75%}sub,sup{line-height:0;position:relati | 
 | ve;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}svg{overflow:hidden} | 
 | <!-- End 960 reset --> | 
 | <!-- Begin 960 text --> | 
 | body{font:13px/1.5 'Helvetica Neue',Arial,'Liberation Sans',FreeSans,sans-serif}pre,code{font-family | 
 | :'DejaVu Sans Mono',Menlo,Consolas,monospace}hr{border:0 #ccc solid;border-top-width:1px;clear:both; | 
 | height:0}h1{font-size:25px}h2{font-size:23px}h3{font-size:21px}h4{font-size:19px}h5{font-size:17px}h | 
 | 6{font-size:15px}ol{list-style:decimal}ul{list-style:disc}li{margin-left:30px}p,dl,hr,h1,h2,h3,h4,h5 | 
 | ,h6,ol,ul,pre,table,address,fieldset,figure{margin-bottom:20px} | 
 | <!-- End 960 text --> | 
 | <!-- Begin 960 grid (fluid variant) | 
 |      12 columns, 1152px total width | 
 |      http://960.gs/ | http://grids.heroku.com/ --> | 
 | .container_12{width:92%;margin-left:4%;margin-right:4%}.grid_1,.grid_2,.grid_3,.grid_4,.grid_5,.grid | 
 | _6,.grid_7,.grid_8,.grid_9,.grid_10,.grid_11,.grid_12{display:inline;float:left;position:relative;ma | 
 | rgin-left:1%;margin-right:1%}.alpha{margin-left:0}.omega{margin-right:0}.container_12 .grid_1{width: | 
 | 6.333%}.container_12 .grid_2{width:14.667%}.container_12 .grid_3{width:23.0%}.container_12 .grid_4{w | 
 | idth:31.333%}.container_12 .grid_5{width:39.667%}.container_12 .grid_6{width:48.0%}.container_12 .gr | 
 | id_7{width:56.333%}.container_12 .grid_8{width:64.667%}.container_12 .grid_9{width:73.0%}.container_ | 
 | 12 .grid_10{width:81.333%}.container_12 .grid_11{width:89.667%}.container_12 .grid_12{width:98.0%}.c | 
 | ontainer_12 .prefix_1{padding-left:8.333%}.container_12 .prefix_2{padding-left:16.667%}.container_12 | 
 |  .prefix_3{padding-left:25.0%}.container_12 .prefix_4{padding-left:33.333%}.container_12 .prefix_5{p | 
 | adding-left:41.667%}.container_12 .prefix_6{padding-left:50.0%}.container_12 .prefix_7{padding-left: | 
 | 58.333%}.container_12 .prefix_8{padding-left:66.667%}.container_12 .prefix_9{padding-left:75.0%}.con | 
 | tainer_12 .prefix_10{padding-left:83.333%}.container_12 .prefix_11{padding-left:91.667%}.container_1 | 
 | 2 .suffix_1{padding-right:8.333%}.container_12 .suffix_2{padding-right:16.667%}.container_12 .suffix | 
 | _3{padding-right:25.0%}.container_12 .suffix_4{padding-right:33.333%}.container_12 .suffix_5{padding | 
 | -right:41.667%}.container_12 .suffix_6{padding-right:50.0%}.container_12 .suffix_7{padding-right:58. | 
 | 333%}.container_12 .suffix_8{padding-right:66.667%}.container_12 .suffix_9{padding-right:75.0%}.cont | 
 | ainer_12 .suffix_10{padding-right:83.333%}.container_12 .suffix_11{padding-right:91.667%}.container_ | 
 | 12 .push_1{left:8.333%}.container_12 .push_2{left:16.667%}.container_12 .push_3{left:25.0%}.containe | 
 | r_12 .push_4{left:33.333%}.container_12 .push_5{left:41.667%}.container_12 .push_6{left:50.0%}.conta | 
 | iner_12 .push_7{left:58.333%}.container_12 .push_8{left:66.667%}.container_12 .push_9{left:75.0%}.co | 
 | ntainer_12 .push_10{left:83.333%}.container_12 .push_11{left:91.667%}.container_12 .pull_1{left:-8.3 | 
 | 33%}.container_12 .pull_2{left:-16.667%}.container_12 .pull_3{left:-25.0%}.container_12 .pull_4{left | 
 | :-33.333%}.container_12 .pull_5{left:-41.667%}.container_12 .pull_6{left:-50.0%}.container_12 .pull_ | 
 | 7{left:-58.333%}.container_12 .pull_8{left:-66.667%}.container_12 .pull_9{left:-75.0%}.container_12 | 
 | .pull_10{left:-83.333%}.container_12 .pull_11{left:-91.667%}.clear{clear:both;display:block;overflow | 
 | :hidden;visibility:hidden;width:0;height:0}.clearfix:after{clear:both;content:' ';display:block;font | 
 | -size:0;line-height:0;visibility:hidden;width:0;height:0}.clearfix{display:inline-block}* html .clea | 
 | rfix{height:1%}.clearfix{display:block} | 
 | <!-- End 960 grid --> | 
 |  | 
 | div.metricgraph { | 
 |  | 
 | } | 
 |  | 
 | body { | 
 |  | 
 | } | 
 |  | 
 | div.header { | 
 |   font-family: Arial, sans-serif; | 
 | } | 
 |  | 
 | div.header h2 { | 
 |   margin: .5em auto; | 
 | } | 
 |  | 
 | div.radio { | 
 |   font-family: Arial, sans-serif; | 
 |   margin-bottom: 1em; | 
 | } | 
 |  | 
 | div.main { | 
 |  | 
 | } | 
 |  | 
 | div.cliplist { | 
 |   font-family: Arial, sans-serif; | 
 |   margin-top: 6px; | 
 | } | 
 |  | 
 | div.chartarea { | 
 |   font-family: Arial, sans-serif; | 
 | } | 
 |  | 
 | div.indicators { | 
 |   font-family: Arial, sans-serif; | 
 |   font-size: 13px; | 
 |   margin-top: 6px; | 
 |   min-height: 600px; | 
 |   background-color: #f7f7f7; | 
 | } | 
 |  | 
 | div.indicators div.content { | 
 |   margin: 1em; | 
 | } | 
 |  | 
 | div.indicators div.content h5 { | 
 |   font-size: 13px; | 
 |   text-align: center; | 
 |   margin: 0; | 
 | } | 
 |  | 
 | div.indicators div.content ul { | 
 |   margin-left: 0; | 
 |   padding-left: 0; | 
 |   margin-top: 0; | 
 | } | 
 |  | 
 | div.indicators div.content ul li { | 
 |   margin-left: 1.5em; | 
 | } | 
 |  | 
 | div.indicators div.content p:first-child { | 
 |   margin-bottom: .5em; | 
 | } | 
 |  | 
 | span.google-visualization-table-sortind { | 
 |   color: #000; | 
 | } | 
 | .header-style { | 
 |   font-weight: bold; | 
 |   border: 1px solid #fff; | 
 |   background-color: #ccc; | 
 | } | 
 |  | 
 | td.header-style+td { | 
 |  | 
 | } | 
 |  | 
 | .orange-background { | 
 |   background-color: orange; | 
 | } | 
 |  | 
 | .light-gray-background { | 
 |   background-color: #f0f0f0; | 
 | } | 
 | </style> | 
 | <script type="text/javascript" src="https://www.google.com/jsapi"></script> | 
 | <script type="text/javascript"> | 
 | var chart_left   = 40; | 
 | var chart_top    = 6; | 
 | var chart_height = document.documentElement.clientHeight-100; | 
 | var chart_width  = "100%"; | 
 | ftable='filestable_avg' | 
 | var snrs = []; | 
 | var filestable_dsnr = []; | 
 | var filestable_drate = []; | 
 | var filestable_avg = []; | 
 |  | 
 | // Python template code replaces the following 2 lines. | 
 | //%%metrics_js%%// | 
 | //%%filestable_dpsnr%%// | 
 | //%%filestable_avg%%// | 
 | //%%filestable_drate%%// | 
 | //%%snrs%%// | 
 |  | 
 | var selected = 0 | 
 | var imagestr = ''; | 
 | var bettertable=0; | 
 | var chart=0; | 
 | var better=0; | 
 | var metricdata=0; | 
 | var metricView=0; | 
 | var column=1; | 
 | var formatter=0; | 
 |  | 
 | function changeColumn(col) { | 
 |   column = col; | 
 |   console.log(col) | 
 |   draw_files(); | 
 | } | 
 |  | 
 | function changeMetric(m) { | 
 |   ftable=m | 
 |   draw_files() | 
 | } | 
 |  | 
 | function setup_vis() { | 
 |   chart = new google.visualization.ScatterChart( | 
 |       document.getElementById("metricgraph")); | 
 |  | 
 |   bettertable = new google.visualization.Table( | 
 |       document.getElementById("bettertable")); | 
 |  | 
 |   draw_files(); | 
 |   build_metrics_radio(); | 
 | } | 
 |  | 
 | function build_metrics_radio() { | 
 |   for (metric=1; metric < metrics.length; metric++) { | 
 |     var rb = document.createElement('input'); | 
 |     var l = document.createElement('label'); | 
 |     rb.setAttribute('type','radio'); | 
 |     rb.setAttribute('name','metric'); | 
 |     rb.setAttribute('onClick', "changeColumn('"+metric.toString()+"')"); | 
 |     l.innerHTML = metrics[metric]; | 
 |     document.getElementById('metrics').appendChild(rb); | 
 |     document.getElementById('metrics').appendChild(l); | 
 |   } | 
 | } | 
 |  | 
 | function draw_files() { | 
 |   var options = {'allowHtml': true, 'width': "100%", 'height': "50%"}; | 
 |   if (better != 0) delete better; | 
 |  | 
 |   col=eval(ftable+'[column]') | 
 |   better = new google.visualization.DataTable(col) | 
 |  | 
 |   // Python Template code replaces the following line with a list of | 
 |   // formatters. | 
 |   if (ftable == 'filestable_dsnr') | 
 |     formatter = new google.visualization.NumberFormat( | 
 |       {fractionDigits: 4, suffix:" db"}); | 
 |   else | 
 |     formatter = new google.visualization.NumberFormat( | 
 |        {fractionDigits: 4, suffix:"%"}); | 
 |  | 
 |   //%%formatters%%// | 
 |  | 
 |   bettertable.draw(better,options); | 
 |   google.visualization.events.addListener(bettertable, 'select', | 
 |                                           selectBetterHandler); | 
 |   query_file() | 
 | } | 
 |  | 
 | function query_file() { | 
 |   imagestr = better.getFormattedValue(selected, 0) | 
 |   var metricjson = eval('(' + snrs[column][selected] + ')'); | 
 |   metricdata = new google.visualization.DataTable(metricjson, 0.6); | 
 |   if( metricView != 0 ) delete metricView; | 
 |   metricView = new google.visualization.DataView(metricdata); | 
 |  | 
 |   chart.draw(metricView, {curveType:'function', | 
 |       explorer: {}, | 
 |       chartArea:{left:chart_left, top:chart_top, width:chart_width, | 
 |       height:chart_height-90}, | 
 |       hAxis:{title:"Datarate in kbps"}, | 
 |       vAxis:{title:"Quality in decibels", format: '##.0', textPosition: 'in'}, | 
 |       legend:{position:"in"}, title:imagestr, pointSize:2, lineWidth:1, | 
 |       width:chart_width, height:chart_height-50 }); | 
 |  | 
 |   google.visualization.events.addListener(chart, 'select', chartSelect); | 
 |   google.visualization.events.addListener(chart, 'onmouseover', chartMouseOver); | 
 |   google.visualization.events.addListener(chart, 'onmouseout', chartMouseOut); | 
 | } | 
 |  | 
 | function chartMouseOut(e) { | 
 |   statusbar = document.getElementById('status'); | 
 |   statusbar.style.display = 'none'; | 
 | } | 
 |  | 
 | function chartMouseOver(e) { | 
 |   pointDifference(e.row, e.column) | 
 | } | 
 |  | 
 | function pointDifference(row, col) { | 
 |   if(!row || !col) | 
 |     return; | 
 |  | 
 |   var cols = metricdata.getNumberOfColumns(); | 
 |   var rows = metricdata.getNumberOfRows(); | 
 |  | 
 |   var sel_bitrate = metricView.getValue(row, 0 ); | 
 |   var sel_metric = metricView.getValue(row, col); | 
 |  | 
 |   var message = '<ul>' + metricView.getColumnLabel(col) + | 
 |      ' (' + sel_bitrate.toFixed(0) + ' kbps, ' + sel_metric.toFixed(2) + ')' + ' is '; | 
 |  | 
 |  | 
 |   // col 0 is datarate | 
 |   for( var i=1;i<cols;++i) { | 
 |  | 
 |     var metric_greatest_thats_less = 0; | 
 |     var rate_greatest_thats_less = 0; | 
 |     var metric_smallest_thats_greater = 999; | 
 |     var rate_smallest_thats_greater = 0; | 
 |  | 
 |     if(i==col) | 
 |       continue; | 
 |  | 
 |     // Find the lowest metric for the column that's greater than sel_metric and | 
 |     // the highest metric for this column that's less than the metric. | 
 |     for(var line_count = 0; line_count < rows; ++line_count) { | 
 |       this_metric = metricdata.getValue(line_count, i) | 
 |       this_rate = metricdata.getValue(line_count, 0) | 
 |       if(!this_metric) | 
 |         continue; | 
 |  | 
 |       if(this_metric > metric_greatest_thats_less && | 
 |          this_metric <= sel_metric) { | 
 |         metric_greatest_thats_less = this_metric; | 
 |         rate_greatest_thats_less = this_rate; | 
 |       } | 
 |       if(this_metric < metric_smallest_thats_greater && | 
 |         this_metric > sel_metric) { | 
 |         metric_smallest_thats_greater = this_metric; | 
 |         rate_smallest_thats_greater = this_rate; | 
 |       } | 
 |     } | 
 |  | 
 |     if(rate_smallest_thats_greater == 0 || rate_greatest_thats_less == 0) { | 
 |       message = message + " <li> Couldn't find a point on both sides.</li>" | 
 |     } else { | 
 |       metric_slope = ( rate_smallest_thats_greater - rate_greatest_thats_less) / | 
 |           ( metric_smallest_thats_greater - metric_greatest_thats_less); | 
 |  | 
 |       projected_rate = ( sel_metric - metric_greatest_thats_less) * | 
 |           metric_slope + rate_greatest_thats_less; | 
 |  | 
 |       difference = 100 * (projected_rate / sel_bitrate - 1); | 
 |  | 
 |  | 
 |       if (difference > 0) | 
 |         message = message + "<li>  " + difference.toFixed(2) + | 
 |                   "% smaller than <em>" + | 
 |                   metricdata.getColumnLabel(i) + "</em></li> " | 
 |       else | 
 |         message = message + "<li>  " + -difference.toFixed(2) + | 
 |                   "% bigger than <em>" + | 
 |                   metricdata.getColumnLabel(i) + "</em></li> " | 
 |     } | 
 |  | 
 |   } | 
 |   message = message + "</ul>" | 
 |   statusbar = document.getElementById('status'); | 
 |   statusbar.innerHTML = "<p>" + message + "</p>"; | 
 |   statusbar.style.display = 'block'; | 
 | } | 
 |  | 
 | function chartSelect() { | 
 |   var selection = chart.getSelection(); | 
 |   var message = ''; | 
 |   var min = metricView.getFormattedValue(selection[0].row, 0); | 
 |   var max = metricView.getFormattedValue(selection[selection.length-1].row, 0); | 
 |   var val = metricView.getFormattedValue(selection[0].row,selection[0].column); | 
 |  | 
 |   pointDifference(selection[0].row, selection[0].column) | 
 |   min = min / 3 | 
 |   max = max * 3 | 
 |   metricView.setRows(metricdata.getFilteredRows( | 
 |       [{column: 0,minValue: min, maxValue:max}])); | 
 |  | 
 |   chart.draw(metricView, {curveType:'function', | 
 |       chartArea:{left:40, top:10, width:chart_width, height:chart_height - 110}, | 
 |       hAxis:{title:"datarate in kbps"}, vAxis:{title:"quality in decibels"}, | 
 |       legend:{position:"in"}, title:imagestr, pointSize:2, lineWidth:1, | 
 |       width:chart_width, height:chart_height - 50}); | 
 | } | 
 |  | 
 | function selectBetterHandler() { | 
 |   var selection = bettertable.getSelection(); | 
 |   for (var i = 0; i < selection.length; i++) { | 
 |     item = selection[i]; | 
 |   } | 
 |   selected = item.row | 
 |   query_file() | 
 | } | 
 |  | 
 |  | 
 | google.load('visualization', '1', {'packages' : ['corechart','table']}); | 
 | google.setOnLoadCallback(setup_vis); | 
 | </script> | 
 | </head> | 
 |  | 
 | <body> | 
 |  | 
 |   <div class="container_12"> | 
 |  | 
 |     <div class="grid_12 header"> | 
 |       <h2>Codec Comparison Results</h2> | 
 |     </div> | 
 |  | 
 |     <div class="grid_12 radio"> | 
 |  | 
 |       <form name="myform"> | 
 |         Method For Combining Points | 
 |         <input type="radio" checked name="column" value="1" | 
 |           onClick="changeMetric('filestable_avg')" />Average of bitrates difference | 
 |         <input type="radio" name="column" value="2" | 
 |           onClick="changeMetric('filestable_dsnr')" />BDSNR | 
 |         <input type="radio" name="column" value="3" | 
 |           onClick="changeMetric('filestable_drate')" />BDRATE | 
 |       </form> | 
 |  | 
 |       <form id="metrics" name="myform"> | 
 |       </form> | 
 |  | 
 |     </div> | 
 |  | 
 |     <div class="grid_12 main"> | 
 |  | 
 |       <div class="grid_5 alpha cliplist"> | 
 |         <div id="bettertable"></div> | 
 |       </div> | 
 |  | 
 |       <div class="grid_5 chartarea"> | 
 |         <div id="metricgraph"></div> | 
 |       </div> | 
 |  | 
 |       <div class="grid_2 omega indicators"> | 
 |         <div class="content"> | 
 |           <h5>Indicators</h5> | 
 |           <hr> | 
 |           <div id="status"></div> | 
 |         </div> | 
 |       </div> | 
 |  | 
 |     </div> | 
 |  | 
 |   </div> | 
 |  | 
 | </body> | 
 | </html> |