From 538b7753f14c6820b85c82e7809738ae381794cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=F8=EDk?= Date: Sat, 31 Aug 2013 20:59:52 +0200 Subject: [PATCH] Issue #357 Play sounds (FlashPlayer) Play movies (FlashPlayer) --- trunk/lib/FlashPlayer.exe | Bin 490496 -> 491008 bytes trunk/libsrc/FlashPlayer/uMain.dcu | Bin 9067 -> 9555 bytes trunk/libsrc/FlashPlayer/uMain.dfm | 41 +++---- trunk/libsrc/FlashPlayer/uMain.pas | 55 ++++++--- .../jpexs/decompiler/flash/gui/MainFrame.java | 107 ++++++++++++++++-- .../flash/gui/player/FlashPlayerPanel.java | 17 +++ .../flash/tags/DefineVideoStreamTag.java | 11 +- .../flash/tags/ExportAssetsTag.java | 7 ++ .../flash/tags/FileAttributesTag.java | 4 + 9 files changed, 198 insertions(+), 44 deletions(-) diff --git a/trunk/lib/FlashPlayer.exe b/trunk/lib/FlashPlayer.exe index 4e0288edab8891fea2050708ef2fffeb78094004..0f5dc1e0ad3b22799c30dcfab2290ac63f038453 100644 GIT binary patch delta 3856 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 diff --git a/trunk/libsrc/FlashPlayer/uMain.dcu b/trunk/libsrc/FlashPlayer/uMain.dcu index 0fb017b3c1c32d236cd306cc45de727e87e48aa8..e74554a12d40ea71af6e67605946b56833f1725d 100644 GIT binary patch delta 3148 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 diff --git a/trunk/libsrc/FlashPlayer/uMain.dfm b/trunk/libsrc/FlashPlayer/uMain.dfm index 850b957df..7a4b131e6 100644 --- a/trunk/libsrc/FlashPlayer/uMain.dfm +++ b/trunk/libsrc/FlashPlayer/uMain.dfm @@ -1,11 +1,10 @@ object frmMain: TfrmMain - Left = 567 - Top = 217 - Width = 604 - Height = 537 - HorzScrollBar.Position = 8 + Left = 506 + Top = 161 + Width = 1381 + Height = 811 Caption = 'FFDec Flash Player' - Color = clBtnFace + Color = clWhite Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -14 @@ -650,22 +649,24 @@ object frmMain: TfrmMain PixelsPerInch = 120 TextHeight = 16 object flaPreview: TShockwaveFlash - Left = 2 - Top = 10 - Width = 752 - Height = 432 + Left = 98 + Top = 34 + Width = 151 + Height = 135 TabOrder = 0 + OnReadyStateChange = flaPreviewReadyStateChange ControlData = { - 67556655000B00002D3E0000B823000008000200000000000800000000000800 - 0000000008000E000000570069006E0064006F00770000000800060000002D00 - 310000000800060000002D003100000008000A00000048006900670068000000 - 08000200000000000800060000002D0031000000080000000000080002000000 - 0000080010000000530068006F00770041006C006C0000000800040000003000 - 0000080004000000300000000800020000000000080000000000080002000000 - 00000D0000000000000000000000000000000000080004000000310000000800 - 0400000030000000080000000000080004000000300000000800080000006100 - 6C006C00000008000C000000660061006C0073006500000008000C0000006600 - 61006C007300650000000800060000002D0031000000} + 67556655000B00007C0C00002A0B000008000200000000000800040000002D00 + 00000800040000002D00000008000E000000570069006E0064006F0077000000 + 0800060000002D00310000000800060000002D003100000008000A0000004800 + 690067006800000008000200000000000800060000002D003100000008000000 + 000008000E00000061006C007700610079007300000008001000000053006800 + 6F00770041006C006C0000000800040000003000000008000400000030000000 + 080002000000000008000000000008000200000000000D000000000000000000 + 0000000000000000080004000000310000000800040000003000000008000000 + 00000800040000003000000008000800000061006C006C00000008000C000000 + 660061006C0073006500000008000C000000660061006C007300650000000800 + 060000002D0031000000} end object tmrWatchDog: TTimer OnTimer = tmrWatchDogTimer diff --git a/trunk/libsrc/FlashPlayer/uMain.pas b/trunk/libsrc/FlashPlayer/uMain.pas index e3c0a7014..78be0bec2 100644 --- a/trunk/libsrc/FlashPlayer/uMain.pas +++ b/trunk/libsrc/FlashPlayer/uMain.pas @@ -15,6 +15,8 @@ type procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure tmrWatchDogTimer(Sender: TObject); + procedure flaPreviewReadyStateChange(ASender: TObject; + newState: Integer); private { Private declarations } public @@ -63,19 +65,20 @@ end; procedure TPipeThread.displaySWF(); begin windows.SetParent(frmMain.Handle,target); - frmMain.flaPreview.Free; - frmMain.flaPreview:=nil; - frmMain.flaPreview:=TShockwaveFlash.Create(frmMain); + frmMain.flaPreview.Stop; + frmMain.flaPreview.Movie := ''; frmMain.flaPreview.Left:=0; frmMain.flaPreview.Top:=0; frmMain.flaPreview.Width:=self.w; frmMain.flaPreview.Height:=self.h; - frmMain.flaPreview.Parent:=frmMain; - frmMain.flaPreview.Movie:=flashFile; - - frmMain.flaPreview.Play; + frmMain.flaPreview.AllowScriptAccess:='always'; frmMain.Caption:='set movie:'+flashFile; - //showmessage('flashmovie:'+flashFile); + frmMain.Repaint(); + + frmMain.flaPreview.Playing := true; + frmMain.flaPreview.Movie:=flashFile; + frmMain.flaPreview.Play; + end; @@ -83,18 +86,22 @@ end; procedure TPipeThread.setPos(); var movie:WideString; begin + movie:=frmMain.flaPreview.Movie; SetWindowPos(frmMain.Handle,0,0,0,self.w,self.h,SWP_SHOWWINDOW); + frmMain.flaPreview.Movie:=''; + frmMain.flaPreview.Playing := false; frmMain.flaPreview.Parent:=nil; frmMain.flaPreview.Left:=0; frmMain.flaPreview.Top:=0; frmMain.flaPreview.Width:=self.w; frmMain.flaPreview.Height:=self.h; frmMain.flaPreview.Parent:=frmMain; + frmMain.flaPreview.AllowScriptAccess:='always'; frmMain.flaPreview.Movie:=movie; - + frmMain.flaPreview.Play; frmMain.Caption:=''+inttostr(self.w)+'x'+inttostr(self.h); - frmMain.Repaint; + end; procedure TPipeThread.Execute(); @@ -105,6 +112,7 @@ pipename:PAnsiChar; len:integer; cmd:integer; begin + pipename:=PAnsiChar('\\.\\pipe\ffdec_flashplayer_'+ParamStr(1)); while (not self.Terminated) do begin @@ -152,6 +160,12 @@ procedure TfrmMain.FormActivate(Sender: TObject); begin if(ParamCount>=2) then begin + + ShowWindow(Application.Handle, SW_HIDE) ; + SetWindowLong(Application.Handle, GWL_EXSTYLE, getWindowLong(Application.Handle, GWL_EXSTYLE) or WS_EX_TOOLWINDOW) ; + ShowWindow(Application.Handle, SW_SHOW); + + SetForegroundWindow(HWND(strtoint(ParamStr(2)))); frmMain.Caption:='FlashPlayerWindow_'+ParamStr(2); Application.Title:='FlashPlayerWindow_'+ParamStr(2); @@ -161,18 +175,17 @@ begin frmMain.Left:=0; frmMain.Top:=0; windows.SetParent(frmMain.Handle,target); - end; + + t:=TPipeThread.Create(true); + t.Resume; + end; end; procedure TfrmMain.FormCreate(Sender: TObject); begin if(ParamCount>=2) then begin - ShowWindow(Application.Handle, SW_HIDE) ; - SetWindowLong(Application.Handle, GWL_EXSTYLE, getWindowLong(Application.Handle, GWL_EXSTYLE) or WS_EX_TOOLWINDOW) ; - ShowWindow(Application.Handle, SW_SHOW); - t:=TPipeThread.Create(true); - t.Resume; + end; end; @@ -192,4 +205,14 @@ begin end; end; +procedure TfrmMain.flaPreviewReadyStateChange(ASender: TObject; + newState: Integer); +begin +if newState = 4 then + begin + frmMain.flaPreview.Playing := True; + frmMain.flaPreview.Play; + end; +end; + end. diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/MainFrame.java b/trunk/src/com/jpexs/decompiler/flash/gui/MainFrame.java index c38dd286b..f2ec35a90 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/MainFrame.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/MainFrame.java @@ -28,6 +28,8 @@ import com.jpexs.decompiler.flash.abc.RenameType; import com.jpexs.decompiler.flash.abc.ScriptPack; import com.jpexs.decompiler.flash.abc.types.traits.Trait; import com.jpexs.decompiler.flash.abc.types.traits.TraitClass; +import com.jpexs.decompiler.flash.action.Action; +import com.jpexs.decompiler.flash.action.parser.pcode.ASMParser; import com.jpexs.decompiler.flash.gui.abc.ABCPanel; import com.jpexs.decompiler.flash.gui.abc.ClassesListTreeModel; import com.jpexs.decompiler.flash.gui.abc.DeobfuscationDialog; @@ -61,8 +63,10 @@ import com.jpexs.decompiler.flash.tags.DefineSpriteTag; import com.jpexs.decompiler.flash.tags.DefineText2Tag; import com.jpexs.decompiler.flash.tags.DefineTextTag; import com.jpexs.decompiler.flash.tags.DefineVideoStreamTag; +import com.jpexs.decompiler.flash.tags.DoActionTag; import com.jpexs.decompiler.flash.tags.EndTag; import com.jpexs.decompiler.flash.tags.ExportAssetsTag; +import com.jpexs.decompiler.flash.tags.FileAttributesTag; import com.jpexs.decompiler.flash.tags.JPEGTablesTag; import com.jpexs.decompiler.flash.tags.PlaceObject2Tag; import com.jpexs.decompiler.flash.tags.SetBackgroundColorTag; @@ -72,6 +76,7 @@ import com.jpexs.decompiler.flash.tags.SoundStreamHead2Tag; import com.jpexs.decompiler.flash.tags.SoundStreamHeadTag; import com.jpexs.decompiler.flash.tags.SymbolClassTag; import com.jpexs.decompiler.flash.tags.Tag; +import com.jpexs.decompiler.flash.tags.VideoFrameTag; import com.jpexs.decompiler.flash.tags.base.ASMSource; import com.jpexs.decompiler.flash.tags.base.AloneTag; import com.jpexs.decompiler.flash.tags.base.BoundedTag; @@ -140,6 +145,9 @@ import java.io.FileOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -2868,6 +2876,14 @@ public class MainFrame extends AppRibbonFrame implements ActionListener, TreeSel setEditText(false); reload(false); } + + private void stopFlashPlayer(){ + if (flashPanel != null) { + if(!flashPanel.isStopped()){ + flashPanel.stopSWF(); + } + } + } public void reload(boolean forceReload) { Object tagObj = tagTree.getLastSelectedPathComponent(); @@ -2924,26 +2940,32 @@ public class MainFrame extends AppRibbonFrame implements ActionListener, TreeSel } swfPreviewPanel.stop(); if ((tagObj instanceof SWFRoot) && miInternalViewer.isSelected()) { + stopFlashPlayer(); showCard(CARDSWFPREVIEWPANEL); swfPreviewPanel.load(swf); swfPreviewPanel.play(); - } else if (tagObj instanceof DefineVideoStreamTag) { + } /*else if (tagObj instanceof DefineVideoStreamTag) { showCard(CARDEMPTYPANEL); } else if ((tagObj instanceof DefineSoundTag) || (tagObj instanceof SoundStreamHeadTag) || (tagObj instanceof SoundStreamHead2Tag)) { showCard(CARDEMPTYPANEL); - } else if (tagObj instanceof DefineBinaryDataTag) { - showCard(CARDEMPTYPANEL); + } */else if (tagObj instanceof DefineBinaryDataTag) { + stopFlashPlayer(); + showCard(CARDEMPTYPANEL); } else if (tagObj instanceof ASMSource) { + stopFlashPlayer(); showCard(CARDACTIONSCRIPTPANEL); actionPanel.setSource((ASMSource) tagObj, !forceReload); } else if (tagObj instanceof ImageTag) { + stopFlashPlayer(); imageButtonsPanel.setVisible(((ImageTag) tagObj).importSupported()); showCard(CARDIMAGEPANEL); imagePanel.setImage(((ImageTag) tagObj).getImage(swf.tags)); } else if ((tagObj instanceof DrawableTag) && (!(tagObj instanceof TextTag)) && (miInternalViewer.isSelected())) { + stopFlashPlayer(); showCard(CARDDRAWPREVIEWPANEL); previewImagePanel.setDrawable((DrawableTag) tagObj, swf, characters); } else if (tagObj instanceof FrameNode && ((FrameNode) tagObj).isDisplayed() && (miInternalViewer.isSelected())) { + stopFlashPlayer(); showCard(CARDDRAWPREVIEWPANEL); FrameNode fn = (FrameNode) tagObj; List controlTags = swf.tags; @@ -2968,8 +2990,18 @@ public class MainFrame extends AppRibbonFrame implements ActionListener, TreeSel try (FileOutputStream fos = new FileOutputStream(tempFile)) { SWFOutputStream sos = new SWFOutputStream(fos, 10); sos.write("FWS".getBytes()); - sos.write(13); + sos.write(swf.version); + int frameCount = 100; + HashMap videoFrames=new HashMap<>(); + DefineVideoStreamTag vs=null; + if (tagObj instanceof DefineVideoStreamTag){ + vs = (DefineVideoStreamTag)tagObj; + swf.populateVideoFrames(vs.getCharacterId(), new ArrayList(swf.tags), videoFrames); + frameCount = videoFrames.size(); + } + + ByteArrayOutputStream baos = new ByteArrayOutputStream(); SWFOutputStream sos2 = new SWFOutputStream(baos, 10); int width = swf.displayRect.Xmax - swf.displayRect.Xmin; @@ -2977,7 +3009,10 @@ public class MainFrame extends AppRibbonFrame implements ActionListener, TreeSel sos2.writeRECT(swf.displayRect); sos2.writeUI8(0); sos2.writeUI8(swf.frameRate); - sos2.writeUI16(100); //framecnt + sos2.writeUI16(frameCount); //framecnt + + FileAttributesTag fa = new FileAttributesTag(); + sos2.writeTag(fa); Color backgroundColor = View.swfBackgroundColor; if (tagObj instanceof FontTag) { //Fonts are always black on white @@ -2985,7 +3020,7 @@ public class MainFrame extends AppRibbonFrame implements ActionListener, TreeSel } sos2.writeTag(new SetBackgroundColorTag(null, new RGB(backgroundColor))); - + if (tagObj instanceof FrameNode) { FrameNode fn = (FrameNode) tagObj; Object parent = fn.getParent(); @@ -3121,10 +3156,67 @@ public class MainFrame extends AppRibbonFrame implements ActionListener, TreeSel sos2.writeTag(new PlaceObject2Tag(null, false, false, false, true, false, true, false, true, 1, chtId, mat, null, ratio, null, 0, null)); sos2.writeTag(new ShowFrameTag(null)); } + } else if (tagObj instanceof SoundStreamHeadTypeTag){ + List sbs=new ArrayList<>(); + SWF.populateSoundStreamBlocks(new ArrayList(swf.tags), (Tag)tagObj,sbs); + for(SoundStreamBlockTag blk:sbs){ + sos2.writeTag(blk); + sos2.writeTag(new ShowFrameTag(null)); + } + } else if (tagObj instanceof DefineSoundTag){ + ExportAssetsTag ea=new ExportAssetsTag(); + ea.tags.add(1); + ea.names.add("my_define_sound"); + sos2.writeTag(ea); + DoActionTag doa=new DoActionTag(null, new byte[]{}, SWF.DEFAULT_VERSION, 0); + List actions=ASMParser.parse(0, 0, false, + "ConstantPool \"my_sound\" \"Sound\" \"my_define_sound\" \"attachSound\" \"start\"\n" + + "Push \"my_sound\" 0.0 \"Sound\"\n"+ + "NewObject\n"+ + "DefineLocal\n"+ + "Push \"my_define_sound\" 1 \"my_sound\"\n"+ + "GetVariable\n"+ + "Push \"attachSound\"\n"+ + "CallMethod\n"+ + "Pop\n"+ + "Push 9999 0.0 2 \"my_sound\"\n"+ + "GetVariable\n"+ + "Push \"start\"\n"+ + "CallMethod\n"+ + "Pop\n"+ + "Stop", SWF.DEFAULT_VERSION); + doa.setActions(actions, SWF.DEFAULT_VERSION); + sos2.writeTag(doa); + sos2.writeTag(new ShowFrameTag(null)); + sos2.writeTag(new ShowFrameTag(null)); + } else if (tagObj instanceof DefineVideoStreamTag){ + + sos2.writeTag(new PlaceObject2Tag(null, false, false, false, false, false, true, true, false, 1, chtId, mat, null, 0, null, 0, null)); + List frs=new ArrayList<>(videoFrames.values()); + Collections.sort(frs,new Comparator() { + + @Override + public int compare(VideoFrameTag o1, VideoFrameTag o2) { + return o1.frameNum-o2.frameNum; + } + }); + boolean first=true; + int ratio=0; + for(VideoFrameTag f:frs){ + if(!first){ + ratio++; + sos2.writeTag(new PlaceObject2Tag(null, false, false, false, true, false, false, false, true, 1, 0 , null, null, ratio, null, 0, null)); + } + sos2.writeTag(f); + sos2.writeTag(new ShowFrameTag(null)); + first = false; + } } else { sos2.writeTag(new PlaceObject2Tag(null, false, false, false, true, false, true, true, false, 1, chtId, mat, null, 0, null, 0, null)); sos2.writeTag(new ShowFrameTag(null)); } + + }//not showframe sos2.writeTag(new EndTag(null)); @@ -3132,7 +3224,8 @@ public class MainFrame extends AppRibbonFrame implements ActionListener, TreeSel sos.writeUI32(sos.getPos() + data.length + 4); sos.write(data); - } + fos.flush(); + } showCard(CARDFLASHPANEL); if (flashPanel != null) { if (flashPanel instanceof FlashPlayerPanel) { diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/player/FlashPlayerPanel.java b/trunk/src/com/jpexs/decompiler/flash/gui/player/FlashPlayerPanel.java index c8f07b9b9..f6f6ef791 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/player/FlashPlayerPanel.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/player/FlashPlayerPanel.java @@ -37,6 +37,7 @@ public class FlashPlayerPanel extends Panel { private static List processes = new ArrayList<>(); private static List pipes = new ArrayList<>(); private JFrame frame; + private boolean stopped=false; private synchronized void resize() { if (pipe != null) { @@ -109,11 +110,26 @@ public class FlashPlayerPanel extends Panel { executed = true; } + public synchronized void stopSWF(){ + displaySWF("-"); + stopped = true; + } + + public synchronized boolean isStopped() { + return stopped; + } + + public synchronized void displaySWF(String flash) { this.flash = flash; repaint(); if (!executed) { execute(); + try { + Thread.sleep(1000); + } catch (InterruptedException ex) { + Logger.getLogger(FlashPlayerPanel.class.getName()).log(Level.SEVERE, null, ex); + } } if (pipe != null) { IntByReference ibr = new IntByReference(); @@ -122,6 +138,7 @@ public class FlashPlayerPanel extends Panel { Kernel32.INSTANCE.WriteFile(pipe, flash.getBytes(), flash.getBytes().length, ibr, null); } resize(); + stopped = false; } public static void unload() { diff --git a/trunk/src/com/jpexs/decompiler/flash/tags/DefineVideoStreamTag.java b/trunk/src/com/jpexs/decompiler/flash/tags/DefineVideoStreamTag.java index 33015de07..1af4ba70d 100644 --- a/trunk/src/com/jpexs/decompiler/flash/tags/DefineVideoStreamTag.java +++ b/trunk/src/com/jpexs/decompiler/flash/tags/DefineVideoStreamTag.java @@ -19,18 +19,22 @@ package com.jpexs.decompiler.flash.tags; import com.jpexs.decompiler.flash.SWF; import com.jpexs.decompiler.flash.SWFInputStream; import com.jpexs.decompiler.flash.SWFOutputStream; +import com.jpexs.decompiler.flash.tags.base.BoundedTag; import com.jpexs.decompiler.flash.tags.base.CharacterTag; +import com.jpexs.decompiler.flash.types.RECT; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStream; +import java.util.HashMap; +import java.util.Stack; /** * * * @author JPEXS */ -public class DefineVideoStreamTag extends CharacterTag { +public class DefineVideoStreamTag extends CharacterTag implements BoundedTag { public int characterID; public int numFrames; @@ -94,4 +98,9 @@ public class DefineVideoStreamTag extends CharacterTag { videoFlagsSmoothing = sis.readUB(1) == 1; codecID = sis.readUI8(); } + + @Override + public RECT getRect(HashMap characters, Stack visited) { + return new RECT(0, 20*width, 0, 20*height); + } } diff --git a/trunk/src/com/jpexs/decompiler/flash/tags/ExportAssetsTag.java b/trunk/src/com/jpexs/decompiler/flash/tags/ExportAssetsTag.java index 81e6edc43..e356bb55f 100644 --- a/trunk/src/com/jpexs/decompiler/flash/tags/ExportAssetsTag.java +++ b/trunk/src/com/jpexs/decompiler/flash/tags/ExportAssetsTag.java @@ -40,6 +40,13 @@ public class ExportAssetsTag extends Tag { public List names; public static final int ID = 56; + + public ExportAssetsTag(){ + super(null, ID, "ExportAssets", new byte[]{}, 0); + tags = new ArrayList<>(); + names = new ArrayList<>(); + } + /** * Constructor * diff --git a/trunk/src/com/jpexs/decompiler/flash/tags/FileAttributesTag.java b/trunk/src/com/jpexs/decompiler/flash/tags/FileAttributesTag.java index b6f752ae0..a07945b90 100644 --- a/trunk/src/com/jpexs/decompiler/flash/tags/FileAttributesTag.java +++ b/trunk/src/com/jpexs/decompiler/flash/tags/FileAttributesTag.java @@ -37,6 +37,10 @@ public class FileAttributesTag extends Tag { private int reserved3; public static final int ID = 69; + public FileAttributesTag(){ + super(null, ID, "FileAttributes", new byte[]{}, 0); + } + public FileAttributesTag(SWF swf, byte data[], int version, long pos) throws IOException { super(swf, ID, "FileAttributes", data, pos); SWFInputStream sis = new SWFInputStream(new ByteArrayInputStream(data), version);