public static function generate_extra_data(&$test_result, &$test_log_file = null)
 {
     $parse_xml_file = $test_result->test_profile->get_file_parser_spec();
     if ($parse_xml_file == false) {
         return;
     }
     $results_parser_xml = new pts_parse_results_nye_XmlReader($parse_xml_file);
     $extra_data_identifiers = $results_parser_xml->getXMLArrayValues('PhoronixTestSuite/ExtraData/Identifier');
     $extra_results = array();
     foreach (array_keys($extra_data_identifiers) as $i) {
         $id = $extra_data_identifiers[$i];
         $frame_all_times = array();
         switch ($id) {
             case 'libframetime-output':
                 // libframetime output
                 $line_values = explode(PHP_EOL, file_get_contents($test_log_file));
                 if (!empty($line_values) && isset($line_values[3])) {
                     foreach ($line_values as &$v) {
                         if (substr($v, -3) == ' us' && substr($v, 0, 10) == 'Frametime ') {
                             $frametime = substr($v, 10);
                             $frametime = substr($frametime, 0, -3);
                             if ($frametime > 2000) {
                                 $frametime = $frametime / 1000;
                                 array_push($frame_all_times, $frametime);
                             }
                         }
                     }
                     $frame_all_times = pts_math::remove_outliers($frame_all_times);
                 }
                 break;
             case 'csv-dump-frame-latencies':
                 // Civ Beyond Earth
                 $csv_values = explode(',', pts_file_io::file_get_contents($test_log_file));
                 if (!empty($csv_values) && isset($csv_values[3])) {
                     foreach ($csv_values as $i => &$v) {
                         if (!is_numeric($v)) {
                             unset($csv_values[$i]);
                             continue;
                         }
                         array_push($frame_all_times, $v);
                     }
                 }
                 break;
             case 'com-speeds-frame-latency-totals':
                 // id Tech Games
                 $log_file = pts_file_io::file_get_contents($test_log_file);
                 $frame_all_times = array();
                 while ($log_file = strstr($log_file, 'frame:')) {
                     if (($a = strpos($log_file, ' all: ')) !== false && $a < strpos($log_file, "\n")) {
                         $all = ltrim(substr($log_file, $a + 6));
                         $all = substr($all, 0, strpos($all, ' '));
                         if (is_numeric($all) && $all > 0) {
                             array_push($frame_all_times, $all);
                         }
                     }
                     $log_file = strstr($log_file, 'bk:');
                 }
                 break;
         }
         if (isset($frame_all_times[60])) {
             // Take off the first frame as it's likely to have taken much longer when game just starting off...
             array_shift($frame_all_times);
             $tp = clone $test_result->test_profile;
             $tp->set_result_scale('Milliseconds');
             $tp->set_result_proportion('LIB');
             $tp->set_display_format('LINE_GRAPH');
             $tp->set_identifier(null);
             $extra_result = new pts_test_result($tp);
             $extra_result->set_used_arguments_description('Total Frame Time');
             $extra_result->set_result(implode(',', $frame_all_times));
             array_push($extra_results, $extra_result);
             //$extra_result->set_used_arguments(phodevi::sensor_name($sensor) . ' ' . $test_result->get_arguments());
         }
     }
     if (!empty($extra_results)) {
         $test_result->secondary_linked_results = $extra_results;
     }
 }