mirror of
https://github.com/bluekitchen/btstack.git
synced 2025-04-10 06:44:32 +00:00
add msbc support to python sbc decoder
This commit is contained in:
parent
b00330a893
commit
05c5673442
BIN
test/sbc/data/testfile.msbc
Normal file
BIN
test/sbc/data/testfile.msbc
Normal file
Binary file not shown.
@ -9,6 +9,7 @@ from sbc_synthesis_v1 import *
|
|||||||
V = np.zeros(shape = (2, 10*2*8))
|
V = np.zeros(shape = (2, 10*2*8))
|
||||||
N = np.zeros(shape = (16,8))
|
N = np.zeros(shape = (16,8))
|
||||||
total_time_ms = 0
|
total_time_ms = 0
|
||||||
|
mSBC_enabled = 1
|
||||||
|
|
||||||
def sbc_unpack_frame(fin, available_bytes, frame):
|
def sbc_unpack_frame(fin, available_bytes, frame):
|
||||||
if available_bytes == 0:
|
if available_bytes == 0:
|
||||||
@ -16,12 +17,17 @@ def sbc_unpack_frame(fin, available_bytes, frame):
|
|||||||
raise TypeError
|
raise TypeError
|
||||||
|
|
||||||
frame.syncword = get_bits(fin,8)
|
frame.syncword = get_bits(fin,8)
|
||||||
if frame.syncword != 156:
|
if mSBC_enabled:
|
||||||
print ("out of sync %02x" % frame.syncword)
|
if frame.syncword != 173:
|
||||||
return -1
|
print ("out of sync %02x" % frame.syncword)
|
||||||
|
return -1
|
||||||
|
else:
|
||||||
|
if frame.syncword != 156:
|
||||||
|
print ("out of sync %02x" % frame.syncword)
|
||||||
|
return -1
|
||||||
|
|
||||||
frame.sampling_frequency = get_bits(fin,2)
|
frame.sampling_frequency = get_bits(fin,2)
|
||||||
frame.nr_blocks = nr_blocks[get_bits(fin,2)]
|
frame.nr_blocks = nr_blocks[get_bits(fin,2)]
|
||||||
|
|
||||||
frame.channel_mode = get_bits(fin,2)
|
frame.channel_mode = get_bits(fin,2)
|
||||||
|
|
||||||
if frame.channel_mode == MONO:
|
if frame.channel_mode == MONO:
|
||||||
@ -31,12 +37,10 @@ def sbc_unpack_frame(fin, available_bytes, frame):
|
|||||||
|
|
||||||
frame.allocation_method = get_bits(fin,1)
|
frame.allocation_method = get_bits(fin,1)
|
||||||
frame.nr_subbands = nr_subbands[get_bits(fin,1)]
|
frame.nr_subbands = nr_subbands[get_bits(fin,1)]
|
||||||
frame.init(frame.nr_blocks, frame.nr_subbands, frame.nr_channels)
|
|
||||||
|
|
||||||
frame.bitpool = get_bits(fin,8)
|
frame.bitpool = get_bits(fin,8)
|
||||||
frame.crc_check = get_bits(fin,8)
|
frame.crc_check = get_bits(fin,8)
|
||||||
|
|
||||||
# frame.join = np.zeros(frame.nr_subbands, dtype = np.uint8)
|
frame.init(frame.nr_blocks, frame.nr_subbands, frame.nr_channels)
|
||||||
|
|
||||||
if frame.channel_mode == JOINT_STEREO:
|
if frame.channel_mode == JOINT_STEREO:
|
||||||
for sb in range(frame.nr_subbands-1):
|
for sb in range(frame.nr_subbands-1):
|
||||||
@ -49,12 +53,40 @@ def sbc_unpack_frame(fin, available_bytes, frame):
|
|||||||
for ch in range(frame.nr_channels):
|
for ch in range(frame.nr_channels):
|
||||||
for sb in range(frame.nr_subbands):
|
for sb in range(frame.nr_subbands):
|
||||||
frame.scale_factor[ch][sb] = get_bits(fin, 4)
|
frame.scale_factor[ch][sb] = get_bits(fin, 4)
|
||||||
|
if mSBC_enabled:
|
||||||
|
#frame.nr_blocks = 16
|
||||||
|
#frame.bitpool = 26
|
||||||
|
#frame.nr_subbands = 1
|
||||||
|
print "frequency: ", frame.sampling_frequency
|
||||||
|
print "subbands: ", frame.nr_blocks/4-1
|
||||||
|
print "bitpool: ", frame.bitpool
|
||||||
|
print "blocks : ", frame.nr_blocks/4-1
|
||||||
|
print "alloc : ", frame.allocation_method
|
||||||
|
print "mode : ", frame.channel_mode
|
||||||
|
print "scale factor: ", frame.scale_factor
|
||||||
|
|
||||||
crc = calculate_crc(frame)
|
crc = calculate_crc(frame)
|
||||||
if crc != frame.crc_check:
|
if crc != frame.crc_check:
|
||||||
print frame
|
print "CRC mismatch: calculated %d, expected %d" % (crc, frame.crc_check)
|
||||||
print "error, crc not equal: ", crc, frame.crc_check
|
exit(10)
|
||||||
exit(1)
|
|
||||||
|
if mSBC_enabled:
|
||||||
|
frame.nr_subbands = 8
|
||||||
|
frame.bitpool = 26
|
||||||
|
frame.nr_blocks = 15
|
||||||
|
#frame.sampling_frequency = 0
|
||||||
|
|
||||||
|
frame.init(frame.nr_blocks, frame.nr_subbands, frame.nr_channels)
|
||||||
|
|
||||||
|
if frame.channel_mode == JOINT_STEREO:
|
||||||
|
for sb in range(frame.nr_subbands-1):
|
||||||
|
frame.join[sb] = get_bits(fin,1)
|
||||||
|
get_bits(fin,1) # RFA
|
||||||
|
|
||||||
|
for ch in range(frame.nr_channels):
|
||||||
|
for sb in range(frame.nr_subbands):
|
||||||
|
frame.scale_factor[ch][sb] = get_bits(fin, 4)
|
||||||
|
|
||||||
|
|
||||||
frame.scalefactor = np.zeros(shape=(frame.nr_channels, frame.nr_subbands), dtype = np.int32)
|
frame.scalefactor = np.zeros(shape=(frame.nr_channels, frame.nr_subbands), dtype = np.int32)
|
||||||
for ch in range(frame.nr_channels):
|
for ch in range(frame.nr_channels):
|
||||||
@ -266,10 +298,14 @@ if __name__ == "__main__":
|
|||||||
print(usage)
|
print(usage)
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
try:
|
try:
|
||||||
|
mSBC_enabled = 0
|
||||||
infile = sys.argv[1]
|
infile = sys.argv[1]
|
||||||
if not infile.endswith('.sbc'):
|
if not infile.endswith('.sbc'):
|
||||||
print(usage)
|
if infile.endswith('.msbc'):
|
||||||
sys.exit(1)
|
mSBC_enabled = 1
|
||||||
|
else:
|
||||||
|
print(usage)
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
wavfile = infile.replace('.sbc', '-decoded.wav')
|
wavfile = infile.replace('.sbc', '-decoded.wav')
|
||||||
fout = False
|
fout = False
|
||||||
@ -296,15 +332,13 @@ if __name__ == "__main__":
|
|||||||
print "== Frame %d == %d" % (frame_count, fin.tell())
|
print "== Frame %d == %d" % (frame_count, fin.tell())
|
||||||
|
|
||||||
err = sbc_unpack_frame(fin, file_size - fin.tell(), frame)
|
err = sbc_unpack_frame(fin, file_size - fin.tell(), frame)
|
||||||
if frame_count == 0:
|
|
||||||
sbc_init_sythesis(frame.nr_subbands, implementation)
|
|
||||||
print frame
|
|
||||||
|
|
||||||
|
|
||||||
if err:
|
if err:
|
||||||
print "error, frame_count: ", frame_count
|
print "error, frame_count: ", frame_count
|
||||||
break
|
continue
|
||||||
|
|
||||||
|
if frame_count == 0:
|
||||||
|
sbc_init_sythesis(frame.nr_subbands, implementation)
|
||||||
|
print frame
|
||||||
|
|
||||||
sbc_decode(frame, implementation)
|
sbc_decode(frame, implementation)
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user