From 51c4d039aa603aec67a6435bb27f6583ad59f6dd Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Sun, 10 Feb 2019 16:03:10 +0000 Subject: [PATCH] Support already endian swapped images. --- DiscImageChef.VideoNow/Program.cs | 73 +++++++++++++++++++++++++++---- 1 file changed, 64 insertions(+), 9 deletions(-) diff --git a/DiscImageChef.VideoNow/Program.cs b/DiscImageChef.VideoNow/Program.cs index 7c16869..174c290 100644 --- a/DiscImageChef.VideoNow/Program.cs +++ b/DiscImageChef.VideoNow/Program.cs @@ -77,6 +77,33 @@ namespace DiscImageChef.VideoNow 0xFF, 0xFF, 0x00, 0xFF }; + static readonly byte[] SwappedFrameMarker = + { + 0x81, 0xE3, 0xE3, 0xC7, 0xC7, 0x81, 0x81, 0xE3, 0xC7, 0x00, 0x81, 0xE3, 0xE3, 0xC7, 0xC7, 0x81, 0x81, 0xE3, + 0xC7, 0x00, 0x81, 0xE3, 0xE3, 0xC7, 0xC7, 0x81, 0x81, 0xE3, 0xC7, 0x00, 0x81, 0xE3, 0xE3, 0xC7, 0xC7, 0x81, + 0x81, 0xE3, 0xC7, 0x00, 0x81, 0xE3, 0xE3, 0xC7, 0xC7, 0x81, 0x81, 0xE3, 0xC7, 0x00, 0x81, 0xE3, 0xE3, 0xC7, + 0xC7, 0x81, 0x81, 0xE3, 0xC7, 0x00, 0x81, 0xE3, 0xE3, 0xC7, 0xC7, 0x81, 0x81, 0xE3, 0xC7, 0x00, 0x81, 0xE3, + 0xE3, 0xC7, 0xC7, 0x81, 0x81, 0xE3, 0xC7, 0x00, 0x81, 0xE3, 0xE3, 0xC7, 0xC7, 0x81, 0x81, 0xE3, 0xC7, 0x00, + 0x81, 0xE3, 0xE3, 0xC7, 0xC7, 0x81, 0x81, 0xE3, 0xC7, 0x00, 0x81, 0xE3, 0xE3, 0xC7, 0xC7, 0x81, 0x81, 0xE3, + 0xC7, 0x00, 0x81, 0xE3, 0xE3, 0xC7, 0xC7, 0x81, 0x81, 0xE3, 0xC7, 0x00, 0x81, 0xE3, 0xE3, 0xC7, 0xC7, 0x81, + 0x81, 0xE3, 0xC7, 0x00, 0x81, 0xE3, 0xE3, 0xC7, 0xC7, 0x81, 0x81, 0xE3, 0xC7, 0x00, 0x81, 0xE3, 0xE3, 0xC7, + 0xC7, 0x81, 0x81, 0xE3, 0xC7, 0x00, 0x81, 0xE3, 0xE3, 0xC7, 0xC7, 0x81, 0x81, 0xE3, 0xC7, 0x00, 0x81, 0xE3, + 0xE3, 0xC7, 0xC7, 0x81, 0x81, 0xE3, 0xC7, 0x00, 0x81, 0xE3, 0xE3, 0xC7, 0xC7, 0x81, 0x81, 0xE3, 0xC7, 0x00, + 0x81, 0xE3, 0xE3, 0xC7, 0xC7, 0x81, 0x81, 0xE3, 0xC7, 0x00, 0x81, 0xE3, 0xE3, 0xC7, 0xC7, 0x81, 0x81, 0xE3, + 0xC7, 0x00, 0x81, 0xE3, 0xE3, 0xC7, 0xC7, 0x81, 0x81, 0xE3, 0xC7, 0x00, 0x81, 0xE3, 0xE3, 0xC7, 0xC7, 0x81, + 0x81, 0xE3, 0xC7, 0x00, 0x81, 0xE3, 0xE3, 0xC7, 0xC7, 0x81, 0x81, 0xE3, 0xC7, 0x00, 0x81, 0xE3, 0xE3, 0xC7, + 0xC7, 0x81, 0x81, 0xE3, 0xC7, 0x00, 0x00, 0x00, 0x02, 0x01, 0x04, 0x02, 0x06, 0x03, 0xFF, 0x00, 0x08, 0x04, + 0x0A, 0x05, 0x0C, 0x06, 0x0E, 0x07, 0xFF, 0x00, 0x11, 0x08, 0x13, 0x09, 0x15, 0x0A, 0x17, 0x0B, 0xFF, 0x00, + 0x19, 0x0C, 0x1B, 0x0D, 0x1D, 0x0E, 0x1F, 0x0F, 0xFF, 0x00, 0x00, 0x28, 0x02, 0x29, 0x04, 0x2A, 0x06, 0x2B, + 0xFF, 0x00, 0x08, 0x2C, 0x0A, 0x2D, 0x0C, 0x2E, 0x0E, 0x2F, 0xFF, 0x00, 0x11, 0x30, 0x13, 0x31, 0x15, 0x32, + 0x17, 0x33, 0xFF, 0x00, 0x19, 0x34, 0x1B, 0x35, 0x1D, 0x36, 0x1F, 0x37, 0xFF, 0x00, 0x00, 0x38, 0x02, 0x39, + 0x04, 0x3A, 0x06, 0x3B, 0xFF, 0x00, 0x08, 0x3C, 0x0A, 0x3D, 0x0C, 0x3E, 0x0E, 0x3F, 0xFF, 0x00, 0x11, 0x40, + 0x13, 0x41, 0x15, 0x42, 0x17, 0x43, 0xFF, 0x00, 0x19, 0x44, 0x1B, 0x45, 0x1D, 0x46, 0x1F, 0x47, 0xFF, 0x00, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0x00 + }; + public static void Main(string[] args) { object[] attributes = typeof(MainClass).Assembly.GetCustomAttributes(typeof(AssemblyTitleAttribute), false); @@ -130,6 +157,8 @@ namespace DiscImageChef.VideoNow long framePosition = 0; byte[] buffer = new byte[FrameMarker.Length]; + byte[] swappedBuffer = new byte[FrameMarker.Length]; + bool swapped = false; while(framePosition < 19600) { @@ -142,13 +171,30 @@ namespace DiscImageChef.VideoNow if(buffer.SequenceEqual(FrameMarker)) break; + fs.Position = framePosition; + fs.Read(swappedBuffer, 0, swappedBuffer.Length); + + for(int ab = 9; ab < swappedBuffer.Length; ab += 10) + swappedBuffer[ab] = 0; + + if(swappedBuffer.SequenceEqual(SwappedFrameMarker)) + { + swapped = true; + + break; + } + framePosition++; } for(int ab = 8; ab < buffer.Length; ab += 10) buffer[ab] = 0; - if(!buffer.SequenceEqual(FrameMarker)) + for(int ab = 9; ab < swappedBuffer.Length; ab += 10) + swappedBuffer[ab] = 0; + + if(!buffer.SequenceEqual(FrameMarker) && + !swappedBuffer.SequenceEqual(SwappedFrameMarker)) { Console.WriteLine("Could not find any frame!"); @@ -171,7 +217,12 @@ namespace DiscImageChef.VideoNow fs.Position = framePosition; byte[] frameBuffer = new byte[19600]; fs.Read(frameBuffer, 0, frameBuffer.Length); - frameBuffer = SwapBuffer(frameBuffer); + + int audioStart = swapped ? 9 : 8; + byte[] frameMarkerToUse = swapped ? SwappedFrameMarker : FrameMarker; + + if(!swapped) + frameBuffer = SwapBuffer(frameBuffer); var outFs = new MemoryStream(); @@ -207,7 +258,7 @@ namespace DiscImageChef.VideoNow int totalFrames = 1; framePosition += 19600; - buffer = new byte[FrameMarker.Length]; + buffer = new byte[frameMarkerToUse.Length]; while(framePosition + 19600 < fs.Length) { @@ -233,10 +284,10 @@ namespace DiscImageChef.VideoNow Console.Write("\rLooking for more frames {0}", progress); - for(int ab = 8; ab < buffer.Length; ab += 10) + for(int ab = audioStart; ab < buffer.Length; ab += 10) buffer[ab] = 0; - if(!buffer.SequenceEqual(FrameMarker)) + if(!buffer.SequenceEqual(frameMarkerToUse)) { Console.Write("\r \r"); Console.WriteLine("Frame {0} and the next one are not aligned...", totalFrames); @@ -247,17 +298,19 @@ namespace DiscImageChef.VideoNow fs.Position = framePosition; fs.Read(buffer, 0, buffer.Length); - for(int ab = 8; ab < buffer.Length; ab += 10) + for(int ab = audioStart; ab < buffer.Length; ab += 10) buffer[ab] = 0; - if(buffer.SequenceEqual(FrameMarker)) + if(buffer.SequenceEqual(frameMarkerToUse)) { Console.Write("\r \r"); fs.Position = framePosition; frameBuffer = new byte[19600]; fs.Read(frameBuffer, 0, frameBuffer.Length); - frameBuffer = SwapBuffer(frameBuffer); + + if(!swapped) + frameBuffer = SwapBuffer(frameBuffer); outFs = new MemoryStream(); @@ -321,7 +374,9 @@ namespace DiscImageChef.VideoNow fs.Position = framePosition; frameBuffer = new byte[19600]; fs.Read(frameBuffer, 0, frameBuffer.Length); - frameBuffer = SwapBuffer(frameBuffer); + + if(!swapped) + frameBuffer = SwapBuffer(frameBuffer); outFs = new MemoryStream();