def openh264_multilayer_encoder(input_name, usagetype, width, height, frame_rate, target_br_list, max_br_list, rc_mode, frame_skip=1): layer_num = __init__.get_did_from_resolution(width, height) + 1 total_target_br = sum(target_br_list[0:layer_num]) total_max_br = sum(max_br_list[0:layer_num]) bs_name = input_name.split(os.sep)[-1] + '_br' + str(total_target_br) + '.264' log_name = input_name.split(os.sep)[-1] + '_br' + str(total_target_br) + '.log' if '.yuv' not in input_name: input_name += '.yuv' cmdline = '%s -org %s -utype %d -bf %s -sw %d -sh %d -frin %f -numtl 2 -rc %s -fs %d -trace 255 ' \ % ("./h264enc", input_name, usagetype, bs_name, width, height, frame_rate, rc_mode, frame_skip) cmdline += ' -numl %d -tarb %d -maxbrTotal %d ' %(layer_num, total_target_br, total_max_br) for i in range(layer_num): cmdline += ' -dw %d %d -dh %d %d -frout %d %f -ltarb %d %d -lmaxb %d %d '\ %(i, width/(2**(layer_num-1-i)), i, height/(2**(layer_num-1-i)), i, frame_rate, i, target_br_list[i], i, max_br_list[i]) cmdline += '1> %s 2> %s' \ % (log_name, log_name) if DEBUG: sys.stdout.write(cmdline+'\n') p = subprocess.Popen(cmdline, stderr=subprocess.PIPE, shell=True) sys.stdout.write(p.communicate()[1]) return bs_name, log_name
def read_logs(self, files): self.name = files current_file = open(files, 'rU') lines = current_file.readlines() for line in lines: r = RateControlUtil.SETTING_TYPE_RE.search(line) if r is not None: cur_dt = RateControlUtil.extract_timestamp(line) self.usage_type = int(r.groups()[0]) continue r = RateControlUtil.LAYER_SETTING_RE.search(line) if r is not None: cur_dt = RateControlUtil.extract_timestamp(line) self.get_settings(cur_dt, r) continue r = RateControlUtil.SETOPTION_BR_RE.search(line) if r is not None: cur_dt = RateControlUtil.extract_timestamp(line) RateControlUtil.option_br_update(self.settings, cur_dt, int(r.group(1))) continue r = RateControlUtil.SETOPTION_MAXBR_RE.search(line) if r is not None: cur_dt = RateControlUtil.extract_timestamp(line) RateControlUtil.option_max_br_update(self.settings, cur_dt, int(r.group(1))) continue r = RateControlUtil.ENCODER_STAT_LOG_RE.search(line) if r is not None: cur_dt = RateControlUtil.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 = RateControlUtil.VIDEO_LAYER_LOG_RE.search(line) if r is not None: cur_dt = RateControlUtil.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 read_logs(self, files): self.name = files current_file = open(files, 'rU') lines = current_file.readlines() for line in lines: r = RateControlUtil.SETTING_TYPE_RE.search(line) if r is not None: cur_dt = RateControlUtil.extract_timestamp(line) self.usage_type = int(r.groups()[0]) continue r = RateControlUtil.LAYER_SETTING_RE.search(line) if r is not None: cur_dt = RateControlUtil.extract_timestamp(line) self.get_settings(cur_dt, r) continue r = RateControlUtil.SETOPTION_BR_RE.search(line) if r is not None: cur_dt = RateControlUtil.extract_timestamp(line) RateControlUtil.option_br_update(self.settings, cur_dt, int(r.group(1))) continue r = RateControlUtil.SETOPTION_MAXBR_RE.search(line) if r is not None: cur_dt = RateControlUtil.extract_timestamp(line) RateControlUtil.option_max_br_update(self.settings, cur_dt, int(r.group(1))) continue r = RateControlUtil.ENCODER_STAT_LOG_RE.search(line) if r is not None: cur_dt = RateControlUtil.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 = RateControlUtil.VIDEO_LAYER_LOG_RE.search(line) if r is not None: cur_dt = RateControlUtil.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 call_multilayer_encoder(input_name, usagetype, width, height, frame_rate, target_br_list, max_br_list, rc_mode, frame_skip=1): layer_num = __init__.get_did_from_resolution(width, height) + 1 total_target_br = sum(target_br_list[0:layer_num]) total_max_br = sum(max_br_list[0:layer_num]) bs_name = input_name.split( os.sep)[-1] + '_br' + str(total_target_br) + '.264' log_name = input_name.split( os.sep)[-1] + '_br' + str(total_target_br) + '.log' if '.yuv' not in input_name: input_name += '.yuv' cmdline = '%s -org %s -utype %d -bf %s -sw %d -sh %d -frin %f -numtl 2 -rc %s -fs %d -trace 255 ' \ % ("./h264enc", input_name, usagetype, bs_name, width, height, frame_rate, rc_mode, frame_skip) cmdline += ' -numl %d -tarb %d -maxbrTotal %d ' % ( layer_num, total_target_br, total_max_br) for i in range(layer_num): cmdline += ' -dw %d %d -dh %d %d -frout %d %f -ltarb %d %d -lmaxb %d %d '\ %(i, width/(2**(layer_num-1-i)), i, height/(2**(layer_num-1-i)), i, frame_rate, i, target_br_list[i], i, max_br_list[i]) cmdline += '1> %s 2> %s' \ % (log_name, log_name) if DEBUG: sys.stdout.write(cmdline + '\n') p = subprocess.Popen(cmdline, stderr=subprocess.PIPE, shell=True) sys.stdout.write(p.communicate()[1]) return bs_name, log_name
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:]], RateControlUtil.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:]], RateControlUtil.get_derive(self.frame_skipped), '-o', label='frame_skipped_count') axes[axes_idx].legend() x = [item[0] for item in self.stats[1:]] y = RateControlUtil.get_derive(self.frame_skipped) for p1, p2 in zip(x, y): print("%s,%d\n" % (p1, p2)) plt.savefig('RatesinLog.png') plt.show()
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:]], RateControlUtil.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:]], RateControlUtil.get_derive(self.frame_skipped), '-o', label='frame_skipped_count') axes[axes_idx].legend() x=[item[0] for item in self.stats[1:]] y=RateControlUtil.get_derive(self.frame_skipped) for p1,p2 in zip(x,y): print("%s,%d\n" %(p1,p2)) plt.savefig('RatesinLog.png') plt.show()
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()