mp3 decoding but slow

This commit is contained in:
minjaesong
2023-01-14 16:45:33 +09:00
parent f23dedc245
commit 994db188c2
13 changed files with 672 additions and 211 deletions

View File

@@ -198,12 +198,14 @@ var Frame = {
*/
frame.decode = function () {
var nch = frame.header.numberOfChannels();
var out;
var out_ptr;
var out_ptr_len;
if (nch === 1) {
out = new Uint8Array(consts.BytesPerFrame / 2);
out_ptr_len = consts.BytesPerFrame / 2
} else {
out = new Uint8Array(consts.BytesPerFrame);
out_ptr_len = consts.BytesPerFrame
}
out_ptr = sys.malloc(out_ptr_len);
for (var gr = 0; gr < 2; gr++) {
for (var ch = 0; ch < nch; ch++) {
frame.requantize(gr, ch);
@@ -212,16 +214,21 @@ var Frame = {
frame.stereo(gr);
for (var ch = 0; ch < nch; ch++) {
frame.antialias(gr, ch);
frame.hybridSynthesis(gr, ch);
audio.mp3_hybridSynthesis(frame.sideInfo, frame.mainData.Is, frame.store[ch], gr, ch)
//frame.hybridSynthesis(gr, ch);
frame.frequencyInversion(gr, ch);
if (nch === 1) {
frame.subbandSynthesis(gr, ch, out.subarray(consts.SamplesPerGr * 4 * gr / 2));
audio.mp3_subbandSynthesis(nch, frame, gr, ch, out_ptr + (consts.SamplesPerGr * 4 * gr / 2))
//frame.subbandSynthesis(gr, ch, out_ptr + (consts.SamplesPerGr * 4 * gr / 2));
} else {
frame.subbandSynthesis(gr, ch, out.subarray(consts.SamplesPerGr * 4 * gr));
audio.mp3_subbandSynthesis(nch, frame, gr, ch, out_ptr + (consts.SamplesPerGr * 4 * gr))
//frame.subbandSynthesis(gr, ch, out_ptr + (consts.SamplesPerGr * 4 * gr));
}
}
}
return out;
return [out_ptr, out_ptr_len];
};
frame.antialias = function (gr, ch) {
@@ -433,7 +440,7 @@ var Frame = {
var win_len = consts.SfBandIndicesSet[sfreq].S[sfb + 1] -
consts.SfBandIndicesSet[sfreq].S[sfb];
for (var i = 36; i < int(f.sideInfo.Count1[gr][ch]);) /* i++ done below! */ {
for (var i = 36; i < int(frame.sideInfo.Count1[gr][ch]);) /* i++ done below! */ {
// Check if we're into the next scalefac band
if (i === next_sfb) {
sfb++;
@@ -573,7 +580,7 @@ var Frame = {
}
};
frame.subbandSynthesis = function (gr, ch, out) {
frame.subbandSynthesis = function (gr, ch, out_ptr) {
var u_vec = new Float32Array(512);
var s_vec = new Float32Array(32);
@@ -616,7 +623,7 @@ var Frame = {
} else if (samp < -32767) {
samp = -32767;
}
var s = samp;
var s = samp|0;
var idx;
if (nch === 1) {
idx = 2 * (32*ss + i);
@@ -624,15 +631,19 @@ var Frame = {
idx = 4 * (32*ss + i);
}
if (ch === 0) {
out[idx] = s;
out[idx + 1] = (s >>> 8) >>> 0;
// out[idx] = s;
// out[idx + 1] = (s >>> 8) >>> 0;
sys.poke(out_ptr + idx, s)
sys.poke(out_ptr + idx + 1, (s >>> 8) >>> 0)
} else {
out[idx + 2] = s;
out[idx + 3] = (s >>> 8) >>> 0;
// out[idx + 2] = s;
// out[idx + 3] = (s >>> 8) >>> 0;
sys.poke(out_ptr + idx + 2, s)
sys.poke(out_ptr + idx + 3, (s >>> 8) >>> 0)
}
}
}
return out;
return out_ptr;
};
frame.samplingFrequency = function () {

View File

@@ -216,6 +216,11 @@ var Frameheader = {
var pos = position;
var buf = source.readFull(4)
if (buf.err) {
return {
err: buf.err
}
}
if (buf.length < 4) {
return {
h: 0,

View File

@@ -61,13 +61,16 @@ var Mp3 = {
};
source.readFull = function (length) {
if (length < 0) throw Error("Source.pos less than 0: "+source.pos)
var l = Math.min(source.buf.byteLength - source.pos, length);
if (l < 0) {
serial.println("l < 0: "+l)
throw Error("l < 0: "+l)
if (length <= 0 || l <= 0 || length === undefined) {
return { err: ("Source.pos less than 0: "+source.pos) }
}
if (l <= 0) {
serial.println("l <= 0: "+l)
throw Error("l <= 0: "+l)
}
// serial.println(`readFull(${length} -> ${l}); pos: ${source.pos}`)
@@ -148,25 +151,35 @@ var Mp3 = {
err: result.err
}
}
decoder.frame = result.f;
var pcm_buf = decoder.frame.decode();
var [pcm_buf_ptr, pcm_buf_len] = decoder.frame.decode();
// decoder.buf = util.concatBuffers(decoder.buf, pcm_buf);
return { buf: pcm_buf };
// serial.println(`End of decoder.readFrame; ptr: ${pcm_buf_ptr} len: ${pcm_buf_len}`)
return {
ptr: pcm_buf_ptr,
len: pcm_buf_len,
pos: result.position
};
};
decoder.decode = function (callback) {
var result;
serial.println("Start decoding")
// serial.println("Start decoding")
while(true) {
result = decoder.readFrame();
if (typeof callback == "function") callback(result)
if (result.err) {
break;
}
if (typeof callback == "function") callback(result.ptr, result.len, result.pos)
sys.free(result.ptr)
}
// return decoder.buf;
};
@@ -230,6 +243,9 @@ var Mp3 = {
return null;
}
// serial.println("Reading first frame")
var result = decoder.readFrame();
@@ -240,13 +256,15 @@ var Mp3 = {
// serial.println("First frame finished reading")
decoder.headerSize = decoder.source.pos
decoder.sampleRate = decoder.frame.samplingFrequency();
decoder.frameSize = decoder.frame.header.frameSize()
serial.println("Sampling rate: "+decoder.sampleRate + " Hz")
// serial.println("Sampling rate: "+decoder.sampleRate + " Hz")
result = decoder.ensureFrameStartsAndLength();
serial.println("Decode end")
// serial.println("Decode end")
if (result.err) {
throw Error(`Error ensuring Frame starts and length: ${result.err}`)
return null;