Esempio n. 1
0
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 = __init__.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.openh264_encoder_rc(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)
                        frame_num, bitrate, psnr_y, psnr_u, psnr_v = CodecUtil.PSNRStaticd(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.openh264_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)