15f21c38aSMilanka Ringwald#!/usr/bin/env python 25f21c38aSMilanka Ringwaldimport numpy as np 35f21c38aSMilanka Ringwaldimport wave 45f21c38aSMilanka Ringwaldimport struct 55f21c38aSMilanka Ringwaldimport sys 65f21c38aSMilanka Ringwaldfrom sbc import * 75f21c38aSMilanka Ringwaldfrom sbc_encoder import * 85f21c38aSMilanka Ringwaldfrom sbc_decoder import * 95f21c38aSMilanka Ringwald 105f21c38aSMilanka Ringwalderror = 0.99 115f21c38aSMilanka Ringwaldmax_error = -1 125f21c38aSMilanka Ringwald 135f21c38aSMilanka Ringwalddef sbc_compare_audio_frames(frame_count, actual_frame, expected_frame): 145f21c38aSMilanka Ringwald global error, max_error 155f21c38aSMilanka Ringwald 165f21c38aSMilanka Ringwald M = mse(actual_frame.audio_sample, expected_frame.audio_sample) 175f21c38aSMilanka Ringwald if M > max_error: 185f21c38aSMilanka Ringwald max_error = M 195f21c38aSMilanka Ringwald 205f21c38aSMilanka Ringwald if M > error: 215f21c38aSMilanka Ringwald print "audio_sample error (%d, %d ) " % (frame_count, M) 225f21c38aSMilanka Ringwald return -1 235f21c38aSMilanka Ringwald return 0 245f21c38aSMilanka Ringwald 255f21c38aSMilanka Ringwald 265f21c38aSMilanka Ringwalddef sbc_compare_headers(frame_count, actual_frame, expected_frame): 275f21c38aSMilanka Ringwald if actual_frame.syncword != expected_frame.syncword: 285f21c38aSMilanka Ringwald print "syncword wrong ", actual_frame.syncword 295f21c38aSMilanka Ringwald return -1 305f21c38aSMilanka Ringwald 315f21c38aSMilanka Ringwald if actual_frame.sampling_frequency != expected_frame.sampling_frequency: 325f21c38aSMilanka Ringwald print "sampling_frequency wrong ", actual_frame.sampling_frequency 335f21c38aSMilanka Ringwald return -1 345f21c38aSMilanka Ringwald 355f21c38aSMilanka Ringwald if actual_frame.nr_blocks != expected_frame.nr_blocks: 365f21c38aSMilanka Ringwald print "nr_blocks wrong ", actual_frame.nr_blocks 375f21c38aSMilanka Ringwald return -1 385f21c38aSMilanka Ringwald 395f21c38aSMilanka Ringwald if actual_frame.channel_mode != expected_frame.channel_mode: 405f21c38aSMilanka Ringwald print "channel_mode wrong ", actual_frame.channel_mode 415f21c38aSMilanka Ringwald return -1 425f21c38aSMilanka Ringwald 435f21c38aSMilanka Ringwald if actual_frame.nr_channels != expected_frame.nr_channels: 445f21c38aSMilanka Ringwald print "nr_channels wrong ", actual_frame.nr_channels 455f21c38aSMilanka Ringwald return -1 465f21c38aSMilanka Ringwald 475f21c38aSMilanka Ringwald if actual_frame.allocation_method != expected_frame.allocation_method: 485f21c38aSMilanka Ringwald print "allocation_method wrong ", actual_frame.allocation_method 495f21c38aSMilanka Ringwald return -1 505f21c38aSMilanka Ringwald 515f21c38aSMilanka Ringwald if actual_frame.nr_subbands != expected_frame.nr_subbands: 525f21c38aSMilanka Ringwald print "nr_subbands wrong ", actual_frame.nr_subbands 535f21c38aSMilanka Ringwald return -1 545f21c38aSMilanka Ringwald 555f21c38aSMilanka Ringwald if actual_frame.bitpool != expected_frame.bitpool: 565f21c38aSMilanka Ringwald print "bitpool wrong (E: %d, D: %d)" % (actual_frame.bitpool, expected_frame.bitpool) 575f21c38aSMilanka Ringwald return -1 585f21c38aSMilanka Ringwald 595f21c38aSMilanka Ringwald if mse(actual_frame.join, expected_frame.join) > 0: 605f21c38aSMilanka Ringwald print "join error \nE:\n %s \nD:\n %s" % (actual_frame.join, expected_frame.join) 615f21c38aSMilanka Ringwald return -1 625f21c38aSMilanka Ringwald 635f21c38aSMilanka Ringwald if mse(actual_frame.scale_factor, expected_frame.scale_factor) > 0: 645f21c38aSMilanka Ringwald print "scale_factor error \nE:\n %s \nD:\n %s" % (actual_frame.scale_factor, expected_frame.scale_factor) 655f21c38aSMilanka Ringwald return -1 665f21c38aSMilanka Ringwald 675f21c38aSMilanka Ringwald if mse(actual_frame.scalefactor, expected_frame.scalefactor) > 0: 685f21c38aSMilanka Ringwald print "scalefactor error \nE:\n %s \nD:\n %s" % (actual_frame.scalefactor, expected_frame.scalefactor) 695f21c38aSMilanka Ringwald return -1 705f21c38aSMilanka Ringwald 715f21c38aSMilanka Ringwald if mse(actual_frame.bits, expected_frame.bits) > 0: 725f21c38aSMilanka Ringwald print "bits error \nE:\n %s \nD:\n %s" % (actual_frame.bits, expected_frame.bits) 735f21c38aSMilanka Ringwald return -1 745f21c38aSMilanka Ringwald 755f21c38aSMilanka Ringwald if actual_frame.crc_check != expected_frame.crc_check: 765f21c38aSMilanka Ringwald print "crc_check wrong (E: %d, D: %d)" % (actual_frame.crc_check, expected_frame.crc_check) 775f21c38aSMilanka Ringwald return -1 785f21c38aSMilanka Ringwald 795f21c38aSMilanka Ringwald return 0 805f21c38aSMilanka Ringwald 815f21c38aSMilanka Ringwald 82*5665ea35SMilanka Ringwalddef get_actual_frame(fin, nr_blocks, nr_subbands, nr_channels, sampling_frequency, bitpool, allocation_method): 83*5665ea35SMilanka Ringwald actual_frame = SBCFrame(nr_blocks, nr_subbands, nr_channels, sampling_frequency, bitpool, allocation_method) 845f21c38aSMilanka Ringwald fetch_samples_for_next_sbc_frame(fin, actual_frame) 855f21c38aSMilanka Ringwald sbc_encode(actual_frame) 865f21c38aSMilanka Ringwald return actual_frame 875f21c38aSMilanka Ringwald 88*5665ea35SMilanka Ringwaldfile_size = 0 895f21c38aSMilanka Ringwalddef get_expected_frame(fin_expected): 90*5665ea35SMilanka Ringwald global file_size 915f21c38aSMilanka Ringwald expected_frame = SBCFrame() 92*5665ea35SMilanka Ringwald 93*5665ea35SMilanka Ringwald sbc_unpack_frame(fin_expected, file_size - fin_expected.tell(), expected_frame) 945f21c38aSMilanka Ringwald return expected_frame 955f21c38aSMilanka Ringwald 965f21c38aSMilanka Ringwaldusage = ''' 97*5665ea35SMilanka RingwaldUsage: ./sbc_encoder_test.py encoder_input.wav blocks subbands bitpool allocation_method encoder_expected_output.sbc 98*5665ea35SMilanka RingwaldExample: ./sbc_encoder_test.py fanfare.wav 16 4 31 0 fanfare-4sb.sbc 995f21c38aSMilanka Ringwald''' 1005f21c38aSMilanka Ringwald 101*5665ea35SMilanka Ringwaldif (len(sys.argv) < 7): 1025f21c38aSMilanka Ringwald print(usage) 1035f21c38aSMilanka Ringwald sys.exit(1) 1045f21c38aSMilanka Ringwaldtry: 1055f21c38aSMilanka Ringwald encoder_input_wav = sys.argv[1] 1065f21c38aSMilanka Ringwald nr_blocks = int(sys.argv[2]) 1075f21c38aSMilanka Ringwald nr_subbands = int(sys.argv[3]) 1085f21c38aSMilanka Ringwald bitpool = int(sys.argv[4]) 109*5665ea35SMilanka Ringwald allocation_method = int(sys.argv[5]) 110*5665ea35SMilanka Ringwald encoder_expected_sbc = sys.argv[6] 1115f21c38aSMilanka Ringwald sampling_frequency = 44100 1125f21c38aSMilanka Ringwald 1135f21c38aSMilanka Ringwald if not encoder_input_wav.endswith('.wav'): 1145f21c38aSMilanka Ringwald print(usage) 1155f21c38aSMilanka Ringwald sys.exit(1) 1165f21c38aSMilanka Ringwald 1175f21c38aSMilanka Ringwald if not encoder_expected_sbc.endswith('.sbc'): 1185f21c38aSMilanka Ringwald print(usage) 1195f21c38aSMilanka Ringwald sys.exit(1) 1205f21c38aSMilanka Ringwald 1215f21c38aSMilanka Ringwald fin = wave.open(encoder_input_wav, 'rb') 1225f21c38aSMilanka Ringwald nr_channels = fin.getnchannels() 1235f21c38aSMilanka Ringwald sampling_frequency = fin.getframerate() 1245f21c38aSMilanka Ringwald nr_audio_frames = fin.getnframes() 1255f21c38aSMilanka Ringwald 1265f21c38aSMilanka Ringwald fin_expected = open(encoder_expected_sbc, 'rb') 127*5665ea35SMilanka Ringwald fin_expected.seek(0,2) 128*5665ea35SMilanka Ringwald file_size = fin_expected.tell() 129*5665ea35SMilanka Ringwald fin_expected.seek(0,0) 130*5665ea35SMilanka Ringwald 1315f21c38aSMilanka Ringwald subband_frame_count = 0 1325f21c38aSMilanka Ringwald audio_frame_count = 0 1335f21c38aSMilanka Ringwald nr_samples = nr_blocks * nr_subbands 1345f21c38aSMilanka Ringwald 1355f21c38aSMilanka Ringwald while audio_frame_count < nr_audio_frames: 1365f21c38aSMilanka Ringwald if subband_frame_count % 200 == 0: 1375f21c38aSMilanka Ringwald print("== Frame %d ==" % (subband_frame_count)) 1385f21c38aSMilanka Ringwald 139*5665ea35SMilanka Ringwald actual_frame = get_actual_frame(fin, nr_blocks, nr_subbands, nr_channels, bitpool, sampling_frequency, allocation_method) 1405f21c38aSMilanka Ringwald expected_frame = get_expected_frame(fin_expected) 1415f21c38aSMilanka Ringwald 1425f21c38aSMilanka Ringwald err = sbc_compare_headers(subband_frame_count, actual_frame, expected_frame) 1435f21c38aSMilanka Ringwald if err < 0: 1445f21c38aSMilanka Ringwald exit(1) 1455f21c38aSMilanka Ringwald 1465f21c38aSMilanka Ringwald err = sbc_compare_audio_frames(subband_frame_count, actual_frame, expected_frame) 1475f21c38aSMilanka Ringwald if err < 0: 1485f21c38aSMilanka Ringwald exit(1) 149*5665ea35SMilanka Ringwald 150*5665ea35SMilanka Ringwald if subband_frame_count == 0: 151*5665ea35SMilanka Ringwald print actual_frame 152*5665ea35SMilanka Ringwald 1535f21c38aSMilanka Ringwald audio_frame_count += nr_samples 1545f21c38aSMilanka Ringwald subband_frame_count += 1 1555f21c38aSMilanka Ringwald 1565f21c38aSMilanka Ringwald print "DONE, max MSE audio sample error %d", max_error 1575f21c38aSMilanka Ringwald fin.close() 1585f21c38aSMilanka Ringwald fin_expected.close() 1595f21c38aSMilanka Ringwald 160*5665ea35SMilanka Ringwaldexcept TypeError: 161*5665ea35SMilanka Ringwald print "DONE, max MSE audio sample error %d", max_error 162*5665ea35SMilanka Ringwald fin.close() 163*5665ea35SMilanka Ringwald fin_expected.close() 164*5665ea35SMilanka Ringwald 1655f21c38aSMilanka Ringwaldexcept IOError: 1665f21c38aSMilanka Ringwald print(usage) 1675f21c38aSMilanka Ringwald sys.exit(1) 1685f21c38aSMilanka Ringwald 1695f21c38aSMilanka Ringwald 1705f21c38aSMilanka Ringwald 1715f21c38aSMilanka Ringwald 1725f21c38aSMilanka Ringwald 173