def batch_encoder_test(enc_path, usage_type, bit_rate_list, common_fps, multi_layer_flag=False): current_path = os.getcwd() os.chdir(enc_path) for f in glob.glob(enc_path + os.sep + '*.log'): os.remove(f) for f in glob.glob(enc_path + os.sep + '*.264'): os.remove(f) fout = open('Results.csv', 'w') fout.write('bs_name, rc_mode, frame_skip, target_br, average_br, average_br_ratio, max_qp, psnr_y, ' 'max_burst_ratio, avg_burst_ratio, max_exceed_times, max_exceed_times_ratio, max_br_burst_ratio, period_exceed_ratio, skip_ratio, skip_successive\n') if usage_type == 0: seq_path = CAMERA_SEQ_PATH elif usage_type == 1: seq_path = SCREEN_SEQ_PATH for frame_skip_iter in frame_skip_list: for rc_mode_iter in RC_MODE_LIST: for f in glob.glob(seq_path + os.sep + '*.yuv'): width, height, framerate = CodecUtil.get_resolution_from_name(f) max_item = 0 cur_bit_rate_list = [] for item in bit_rate_list: if cur_bit_rate_list == [] or ( (width*height/256) >= item and item > max_item ): cur_bit_rate_list = bit_rate_list[item] max_item = item for bit_rate_item in cur_bit_rate_list: if multi_layer_flag is False: target_br = int(bit_rate_item*framerate/common_fps) max_br = int(target_br * float(MAX_BR_RATIO)) # process each file bs_name, log_name = CodecUtil.call_encoder(f, usage_type, width, height, framerate, target_br, max_br, rc_mode_iter, frame_skip_iter) #encoded current_log = cCurrentLog() current_log.read_logs(log_name) max_exceed_times, max_exceed_times_ratio, max_br_burst_ratio, max_burst_ratio, avg_burst_ratio, period_exceed_ratio = current_log.check_one_setting(target_br, max_br) skip_ratio, skip_successive = current_log.get_skip_status() skip_list = current_log.get_skip_list() if frame_skip_iter == 0 and skip_list!=[]: sys.stdout.write("Error! Frameskip(%d) not allowed but there is skipped: %s\n" %(frame_skip_iter, str(skip_list))) return elif skip_list != [] and skip_list[0] == 0: sys.stdout.write("Incorrect Skip Idx = 0!\n") return average_bit_rate = current_log.get_single_layer_average_bit_rate() if average_bit_rate <= 0: continue rec_yuv = generate_yuv(bs_name, width, height, skip_list) bitrate, psnr_y, psnr_u, psnr_v = calculate_psnr(width, height, f, rec_yuv, 'Results_PSNR', bs_name, framerate) fout.write('%s, %d, %d, %d, %d, %f, %d, %f, %f, %f, %d, %f, %d, %f, %f, %d\n' %(bs_name, rc_mode_iter, frame_skip_iter, target_br, average_bit_rate, average_bit_rate*100/(target_br*1000), current_log.get_max_qp(), psnr_y, max_burst_ratio, avg_burst_ratio, max_exceed_times, max_exceed_times_ratio, max_br_burst_ratio, period_exceed_ratio, skip_ratio, skip_successive)) os.remove(rec_yuv) else: target_br = [ int(item*framerate/common_fps) for item in bit_rate_item ] max_br = [ int(item * float(MAX_BR_RATIO)) for item in target_br ] bs_name, log_name = CodecUtil.call_multilayer_encoder(f, usage_type, width, height, framerate, target_br, max_br, rc_mode_iter, frame_skip_iter) #encoded current_log = cCurrentLog() current_log.read_logs(log_name) average_bit_rate = current_log.get_average_bit_rate() for did in range(4): if average_bit_rate[did] <= 0: continue max_exceed_times, max_exceed_times_ratio, max_br_burst_ratio, max_burst_ratio, average_burst_ratio, period_exceed_flag \ = current_log.check_one_setting_multi_layer(did, target_br[did], max_br[did]) skip_ratio, skip_successive = current_log.get_skip_status() fout.write('%s_layer%d, %s, %d, %d, %d, %f, %f, %f, %f, %d, %f, %f, %f, %d\n' %(bs_name, did, rc_mode_iter, frame_skip_iter, target_br[did], average_bit_rate[did], average_bit_rate[did]*100/(target_br[did]*1000), 0, max_burst_ratio, average_burst_ratio, max_exceed_times, max_exceed_times_ratio, period_exceed_flag, skip_ratio, skip_successive)) fout.close() os.chdir(current_path)