From a940ea1c6f2c8e998698bbe7a34947af06e7c680 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Mon, 26 Dec 2022 23:00:29 +0100 Subject: [PATCH] Replacing SoundStreamHeads with MP3 --- lib/jlayer-1.0.2.jar | Bin 145364 -> 147901 bytes .../tags/base/SoundStreamHeadTypeTag.java | 20 +++- .../flash/types/sound/MP3FRAME.java | 23 +++- .../flash/types/sound/MP3SOUNDDATA.java | 24 +++- .../flash/types/sound/MarkingInputStream.java | 45 ++++++++ .../java/javazoom/jl/decoder/Bitstream.java | 17 +++ .../decoder/MarkingBufferedInputStream.java | 99 +++++++++++++++++ .../decoder/MarkingPushbackInputStream.java | 104 ++++++++++++++++++ .../jpexs/decompiler/flash/gui/MainPanel.java | 18 ++- 9 files changed, 333 insertions(+), 17 deletions(-) create mode 100644 libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/types/sound/MarkingInputStream.java create mode 100644 libsrc/jlayer-1.0.2/src/main/java/javazoom/jl/decoder/MarkingBufferedInputStream.java create mode 100644 libsrc/jlayer-1.0.2/src/main/java/javazoom/jl/decoder/MarkingPushbackInputStream.java diff --git a/lib/jlayer-1.0.2.jar b/lib/jlayer-1.0.2.jar index 7435792714a3860aa868fdc960d90c98f3feda6d..21d4188fc1b103bd8ec939a45bbf7f53810bb063 100644 GIT binary patch delta 10744 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 GkpB-yD)3VP delta 8076 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 blockMp3Frames = new ArrayList<>(); int blockSamples = 0; - while(lastNumSamplesLong < numSamplesAfterFrame) { + while(lastNumSamplesLong < numSamplesAfterFrame && mp3FrameNum < mp3Frames.size()) { MP3FRAME mp3Frame = mp3Frames.get(mp3FrameNum); lastNumSamplesLong += mp3Frame.getSampleCount(); blockSamples += mp3Frame.getSampleCount(); blockMp3Frames.add(mp3Frame); + mp3FrameNum++; } ByteArrayOutputStream baos = new ByteArrayOutputStream(); SWFOutputStream sos = new SWFOutputStream(baos, SWF.DEFAULT_VERSION, null); try { sos.writeUI16(blockSamples); sos.writeSI16(seekSamples); + for (MP3FRAME mp3Frame:blockMp3Frames) { + sos.write(mp3Frame.getBytes()); + } } catch (IOException ex) { Logger.getLogger(SoundStreamHeadTypeTag.class.getName()).log(Level.SEVERE, null, ex); } - } */ + block.streamSoundData = new ByteArrayRange(baos.toByteArray()); + blocks.add(block); + frame++; + } } ReadOnlyTagList tags = timelined.getTags(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/types/sound/MP3FRAME.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/types/sound/MP3FRAME.java index b0bfadbf9..1af6eb4cd 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/types/sound/MP3FRAME.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/types/sound/MP3FRAME.java @@ -35,11 +35,22 @@ public class MP3FRAME { private Header h; private SampleBuffer samples; + + private byte[] fullData; private MP3FRAME() { } + public void setFullData(byte[] fullData) { + this.fullData = fullData; + } + + public byte[] getBytes() { + return fullData; + } + + public static MP3FRAME readFrame(Bitstream bitstream, Decoder decoder) throws IOException { MP3FRAME ret = new MP3FRAME(); try { @@ -60,24 +71,24 @@ public class MP3FRAME { } public int getSampleCount() { - if (h.version() == 3) { + if (h.version() == Header.MPEG1) { switch(h.layer()) { case 1: - return 1152; + return 384; case 2: return 1152; case 3: - return 384; + return 1152; } } - if (h.version() == 2 || h.version() == 0) { + if (h.version() == Header.MPEG2_LSF || h.version() == Header.MPEG25_LSF) { switch(h.layer()) { case 1: - return 576; + return 384; case 2: return 1152; case 3: - return 384; + return 576; } } return 0; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/types/sound/MP3SOUNDDATA.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/types/sound/MP3SOUNDDATA.java index d5e6e9678..bf1cf46ee 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/types/sound/MP3SOUNDDATA.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/types/sound/MP3SOUNDDATA.java @@ -20,9 +20,12 @@ import com.jpexs.decompiler.flash.SWFInputStream; import java.io.ByteArrayInputStream; import java.io.IOException; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import javazoom.jl.decoder.Bitstream; import javazoom.jl.decoder.Decoder; +import javazoom.jl.decoder.MarkingBufferedInputStream; +import javazoom.jl.decoder.MarkingPushbackInputStream; /** * @@ -41,10 +44,23 @@ public class MP3SOUNDDATA { frames = new ArrayList<>(); MP3FRAME f; Decoder decoder = new Decoder(); - Bitstream bitstream = new Bitstream(new ByteArrayInputStream(sis.readBytesEx(sis.available(), "soundStream"))); - while ((f = MP3FRAME.readFrame(bitstream, decoder)) != null) { - frames.add(f); - } + + byte data[] = sis.readBytesEx(sis.available(), "soundStream"); + MarkingBufferedInputStream mis = new MarkingBufferedInputStream(new ByteArrayInputStream(data)); + Bitstream bitstream = new Bitstream(mis); //new ByteArrayInputStream(data) + long initLen = mis.getPosition(); + MarkingPushbackInputStream mpis = bitstream.getSource(); + while (true) { + //System.err.println("initLen = "+initLen); + long posBefore = initLen+mpis.getPosition(); + MP3FRAME frame = MP3FRAME.readFrame(bitstream, decoder); + if (frame == null) { + break; + } + long posAfter = initLen+mpis.getPosition(); + frame.setFullData(Arrays.copyOfRange(data, (int)posBefore, (int)posAfter)); + frames.add(frame); + } } public int sampleCount() { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/types/sound/MarkingInputStream.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/types/sound/MarkingInputStream.java new file mode 100644 index 000000000..08f32a4e3 --- /dev/null +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/types/sound/MarkingInputStream.java @@ -0,0 +1,45 @@ +/* + * Copyright (C) 2010-2022 JPEXS, All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3.0 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. + */ +package com.jpexs.decompiler.flash.types.sound; + +import java.io.IOException; +import java.io.InputStream; + +/** + * + * @author JPEXS + */ +public class MarkingInputStream extends InputStream { + + private InputStream is; + + private long pos = 0; + + public MarkingInputStream(InputStream is) { + this.is = is; + } + + @Override + public int read() throws IOException { + pos++; + return is.read(); + } + + public long getPos() { + return pos; + } +} diff --git a/libsrc/jlayer-1.0.2/src/main/java/javazoom/jl/decoder/Bitstream.java b/libsrc/jlayer-1.0.2/src/main/java/javazoom/jl/decoder/Bitstream.java index 9f884c59b..abd535f3c 100644 --- a/libsrc/jlayer-1.0.2/src/main/java/javazoom/jl/decoder/Bitstream.java +++ b/libsrc/jlayer-1.0.2/src/main/java/javazoom/jl/decoder/Bitstream.java @@ -146,7 +146,24 @@ public final class Bitstream implements BitstreamErrors { closeFrame(); } + + //JPEXS + public Bitstream(MarkingBufferedInputStream in) { + if (in == null) + throw new NullPointerException("in"); + loadID3v2(in); + in.setFixed(true); + firstframe = true; + source = new MarkingPushbackInputStream(in, BUFFER_INT_SIZE * 4); + + closeFrame(); + } + //JPEXS + public MarkingPushbackInputStream getSource() { + return (MarkingPushbackInputStream) source; + } + /** * Return position of the first audio header. * diff --git a/libsrc/jlayer-1.0.2/src/main/java/javazoom/jl/decoder/MarkingBufferedInputStream.java b/libsrc/jlayer-1.0.2/src/main/java/javazoom/jl/decoder/MarkingBufferedInputStream.java new file mode 100644 index 000000000..340756337 --- /dev/null +++ b/libsrc/jlayer-1.0.2/src/main/java/javazoom/jl/decoder/MarkingBufferedInputStream.java @@ -0,0 +1,99 @@ +package javazoom.jl.decoder; + +import java.io.BufferedInputStream; +import java.io.IOException; +import java.io.InputStream; + +/** + * + * @author JPEXS + */ +public class MarkingBufferedInputStream extends BufferedInputStream { + + private BufferedInputStream is; + + private long pos = 0; + + private long markedPos = -1; + + private boolean fixed = false; + + public long getPosition() { + return pos; + } + + public void setFixed(boolean fixed) { + this.fixed = fixed; + } + + + + public MarkingBufferedInputStream(InputStream in) { + super(in); + this.is = new BufferedInputStream(in); + } + + @Override + public synchronized int read() throws IOException { + if (!fixed) pos++; + return is.read(); + } + + @Override + public int read(byte[] b) throws IOException { + int ret = is.read(b); + if (!fixed) pos += ret; + return ret; + } + + @Override + public synchronized int read(byte[] b, int off, int len) throws IOException { + int ret = is.read(b, off, len); + if (!fixed) pos += ret; + return ret; + } + + @Override + public synchronized void reset() throws IOException { + if (markedPos > -1) { + if (!fixed) pos = markedPos; + markedPos = -1; + } + is.reset(); + } + + @Override + public synchronized void mark(int readlimit) { + markedPos = pos; + is.mark(readlimit); + } + + @Override + public synchronized int available() throws IOException { + return is.available(); + } + + @Override + public synchronized long skip(long n) throws IOException { + long ret = is.skip(n); + if (!fixed) pos+=ret; + return ret; + } + + @Override + public void skipNBytes(long n) throws IOException { + if (!fixed) pos+=n; + is.skipNBytes(n); + } + + @Override + public void close() throws IOException { + is.close(); + } + + @Override + public boolean markSupported() { + return is.markSupported(); + } + +} diff --git a/libsrc/jlayer-1.0.2/src/main/java/javazoom/jl/decoder/MarkingPushbackInputStream.java b/libsrc/jlayer-1.0.2/src/main/java/javazoom/jl/decoder/MarkingPushbackInputStream.java new file mode 100644 index 000000000..2e2f57e69 --- /dev/null +++ b/libsrc/jlayer-1.0.2/src/main/java/javazoom/jl/decoder/MarkingPushbackInputStream.java @@ -0,0 +1,104 @@ +package javazoom.jl.decoder; + +import java.io.IOException; +import java.io.InputStream; +import java.io.PushbackInputStream; + +/** + * + * @author JPEXS + */ +public class MarkingPushbackInputStream extends PushbackInputStream { + + private PushbackInputStream is; + + private long pos = 0; + + public long getPosition() { + return pos; + } + + + + public MarkingPushbackInputStream(InputStream in, int size) { + super(in, size); + is = new PushbackInputStream(in, size); + } + + @Override + public int available() throws IOException { + return is.available(); + } + + @Override + public synchronized void close() throws IOException { + is.close(); + } + + @Override + public synchronized void mark(int readlimit) { + is.mark(readlimit); + } + + @Override + public boolean markSupported() { + return is.markSupported(); + } + + @Override + public int read() throws IOException { + pos++; + return is.read(); + } + + @Override + public int read(byte[] b, int off, int len) throws IOException { + + int ret = is.read(b, off, len); + pos += ret; + return ret; + } + + @Override + public int read(byte[] b) throws IOException { + int ret = is.read(b); + pos += ret; + return ret; + } + + @Override + public synchronized void reset() throws IOException { + is.reset(); + } + + @Override + public void unread(byte[] b) throws IOException { + pos -= b.length; + is.unread(b); + } + + @Override + public void unread(int b) throws IOException { + pos--; + is.unread(b); + } + + @Override + public void unread(byte[] b, int off, int len) throws IOException { + pos -= len; + is.unread(b, off, len); + } + + @Override + public long skip(long n) throws IOException { + long ret = is.skip(n); + pos += ret; + return ret; + } + + @Override + public void skipNBytes(long n) throws IOException { + pos += n; + is.skipNBytes(n); + } +} diff --git a/src/com/jpexs/decompiler/flash/gui/MainPanel.java b/src/com/jpexs/decompiler/flash/gui/MainPanel.java index 473e90d9a..a77494b38 100644 --- a/src/com/jpexs/decompiler/flash/gui/MainPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/MainPanel.java @@ -24,6 +24,7 @@ import com.jpexs.decompiler.flash.EventListener; import com.jpexs.decompiler.flash.OpenableSourceInfo; import com.jpexs.decompiler.flash.ReadOnlyTagList; import com.jpexs.decompiler.flash.SWF; +import com.jpexs.decompiler.flash.SWFInputStream; import com.jpexs.decompiler.flash.abc.ABC; import com.jpexs.decompiler.flash.abc.RenameType; import com.jpexs.decompiler.flash.abc.ScriptPack; @@ -156,6 +157,7 @@ import com.jpexs.decompiler.flash.tags.PlaceObjectTag; import com.jpexs.decompiler.flash.tags.ProductInfoTag; import com.jpexs.decompiler.flash.tags.SetBackgroundColorTag; import com.jpexs.decompiler.flash.tags.ShowFrameTag; +import com.jpexs.decompiler.flash.tags.SoundStreamBlockTag; import com.jpexs.decompiler.flash.tags.Tag; import com.jpexs.decompiler.flash.tags.TagInfo; import com.jpexs.decompiler.flash.tags.UnknownTag; @@ -4752,7 +4754,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se previewPanel.closeTag(); } - public static void showPreview(TreeItem treeItem, PreviewPanel previewPanel, int frame, Timelined timelinedContainer) { + public static void showPreview(TreeItem treeItem, PreviewPanel previewPanel, int frame, Timelined timelinedContainer) { previewPanel.clear(); if (treeItem == null) { previewPanel.showEmpty(); @@ -5034,6 +5036,20 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se showDetail(DETAILCARDEMPTYPANEL); } + if (treeItem instanceof SoundStreamBlockTag) { + SoundStreamBlockTag block = (SoundStreamBlockTag)treeItem; + byte[] data = block.streamSoundData.getRangeData(); + try{ + SWFInputStream sis = new SWFInputStream(block.getSwf(), data); + int sampleCount = sis.readUI16("sampleCount"); + int seekSamples = sis.readSI16("seekSamples"); + System.out.println("sampleCount = "+sampleCount); + System.out.println("seekSamples = "+seekSamples); + System.out.println("============"); + }catch(Exception ex){ + + } + } if (treeItem instanceof HeaderItem) { headerPanel.load((SWF) ((HeaderItem) treeItem).getOpenable()); showCard(CARDHEADER);