Support already endian swapped images.

This commit is contained in:
2019-02-10 16:03:10 +00:00
parent 2873013e38
commit 51c4d039aa

View File

@@ -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();