def read_logs(self, files): self.name = files current_file = open(files, "rU") lines = current_file.readlines() for line in lines: r = CodecLogUtil.SETTING_TYPE_RE.search(line) if r is not None: cur_dt = CodecLogUtil.extract_timestamp(line) self.usage_type = int(r.groups()[0]) continue r = CodecLogUtil.LAYER_SETTING_RE.search(line) if r is not None: cur_dt = CodecLogUtil.extract_timestamp(line) self.get_settings(cur_dt, r) continue r = CodecLogUtil.SETOPTION_BR_RE.search(line) if r is not None: cur_dt = CodecLogUtil.extract_timestamp(line) CodecLogUtil.option_br_update(self.settings, cur_dt, int(r.group(1))) continue r = CodecLogUtil.SETOPTION_MAXBR_RE.search(line) if r is not None: cur_dt = CodecLogUtil.extract_timestamp(line) CodecLogUtil.option_max_br_update(self.settings, cur_dt, int(r.group(1))) continue r = CodecLogUtil.ENCODER_STAT_LOG_RE.search(line) if r is not None: cur_dt = CodecLogUtil.extract_timestamp(line) ts = self.check_ts(r.group(14)) encoded_bytes = int(r.group(13)) self.stats.append((cur_dt, ts, encoded_bytes)) self.idr.append(int(r.group(12))) self.frame_skipped.append(int(r.group(9))) continue r = CodecLogUtil.VIDEO_LAYER_LOG_RE.search(line) if r is not None: cur_dt = CodecLogUtil.extract_timestamp(line) did = __init__.get_did_from_resolution(int(r.group(1)), int(r.group(2))) br = int(r.group(4)) if br > 0: self.layer_stats.append((cur_dt, did, br)) continue current_file.close()
def get_settings(self, time, r): cur_settings = {} CodecLogUtil.settings_log(time, r, cur_settings) if self.usage_type == 0: cur_settings["timewindow"] = 5000 # ms cur_settings["fluctuation_range"] = 0.1 elif self.usage_type == 1: cur_settings["timewindow"] = 10000 # ms cur_settings["fluctuation_range"] = 0.3 cur_settings["target_bit_rate_upper"] = int( cur_settings["target_bit_rate"] * (1 + cur_settings["fluctuation_range"]) + 0.5 ) self.settings.append(cur_settings)
def plot_overall_graph(self): max_d_layer = max([item["did"] for item in self.settings]) axes_count = 2 if max_d_layer == 0 else (1 + self.MAX_D_LAYER) axes_count += 1 if max(self.idr) > 0 else 0 axes_count += 1 if max(self.frame_skipped) > 0 else 0 print("draw %d charts\n" % axes_count) fig, axes = plt.subplots(axes_count, 1, sharex=True) plt.xlabel("time") axes[0].plot(self.dt_list, self.br_list, label="actual_bit_rate") axes[0].legend() if max_d_layer > 0: for layer_idx in range(self.MAX_D_LAYER): cur_list = [ item for item in self.settings if layer_idx == __init__.get_did_from_resolution(item["width"], item["height"]) ] if cur_list == []: axes[layer_idx + 1].plot(self.dt_list, self.br_list, label="actual_bit_rate") else: for info in ("max_bit_rate", "target_bit_rate_upper"): axes[layer_idx + 1].plot( [item["ts"] for item in cur_list], [item[info] for item in cur_list], label=info + "_%d" % layer_idx, ) cur_list = [item for item in self.layer_stats if item[1] == layer_idx] if cur_list == []: axes[layer_idx + 1].plot(self.dt_list, self.br_list, label="actual_bit_rate") axes[layer_idx + 1].legend() else: axes[layer_idx + 1].plot( [item[0] for item in cur_list], [item[2] for item in cur_list], label="layer_%d" % layer_idx ) axes[layer_idx + 1].legend() else: cur_list = [item for item in self.settings] for info in ("max_bit_rate", "target_bit_rate_upper", "target_bit_rate"): axes[0].plot([item["ts"] for item in cur_list], [item[info] for item in cur_list], label=info) axes[1].plot( [item["ts"] for item in self.settings], [item["width"] + item["height"] for item in self.settings], label="resolution", ) axes[1].legend() axes_idx = 2 if max_d_layer == 0 else (1 + self.MAX_D_LAYER) if max(self.idr) > 0: axes[axes_idx].plot( [item[0] for item in self.stats[1:]], CodecLogUtil.get_derive(self.idr), "-o", label="idr_count" ) axes[axes_idx].legend() axes_idx += 1 if max(self.frame_skipped) > 0: axes[axes_idx].plot( [item[0] for item in self.stats[1:]], CodecLogUtil.get_derive(self.frame_skipped), "-o", label="frame_skipped_count", ) axes[axes_idx].legend() x = [item[0] for item in self.stats[1:]] y = CodecLogUtil.get_derive(self.frame_skipped) for p1, p2 in zip(x, y): print("%s,%d\n" % (p1, p2)) plt.savefig("RatesinLog.png") plt.show()
break else: build_target_file.write("\nAPI_TEST_CPP_SRCS += $(API_TEST_SRCDIR)/encode_decode_api_test_generated.cpp\n") def generate_encoder_cmd(): pass if __name__ == '__main__': #set you search path in config.py argParser = argparse.ArgumentParser() argParser.add_argument("-log", nargs='?', help="log file") argParser.add_argument("-test", nargs='?', help="test_file_path") # #argParser.add_argument("-encoder", nargs='?', help="encoder_path") #argParser.add_argument("-source", nargs='?', help="source_yuv") args = argParser.parse_args() if not os.path.isfile(args.log): exit() setting_list, stat_list, idr_list = CodecLogUtil.read_production_log(args.log) if not CodecLogUtil.check_setting_valid([item[1] for item in setting_list]): print("warning! incomplete setting!\n") if CodecLogUtil.check_same_setting_in_log([item[1] for item in setting_list]): cmd_line = generate_encoder_cmd() print("same setting in whole call!\n") print(cmd_line) if os.path.isdir(args.test): generate_ut(args.test, setting_list, stat_list, idr_list)