diff --git a/Aerofoil.sln b/Aerofoil.sln index df97c81..f405ac0 100644 --- a/Aerofoil.sln +++ b/Aerofoil.sln @@ -41,6 +41,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "bin2gp", "bin2gp\bin2gp.vcx EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MakeTimestamp", "MakeTimestamp\MakeTimestamp.vcxproj", "{9023DF2F-A33D-485A-B13D-0973348B2F9B}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "flattenmov", "flattenmov\flattenmov.vcxproj", "{89F8D13E-F216-4B67-8DE9-7F842D349E94}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|x64 = Debug|x64 @@ -123,6 +125,10 @@ Global {9023DF2F-A33D-485A-B13D-0973348B2F9B}.Debug|x64.Build.0 = Debug|x64 {9023DF2F-A33D-485A-B13D-0973348B2F9B}.Release|x64.ActiveCfg = Release|x64 {9023DF2F-A33D-485A-B13D-0973348B2F9B}.Release|x64.Build.0 = Release|x64 + {89F8D13E-F216-4B67-8DE9-7F842D349E94}.Debug|x64.ActiveCfg = Debug|x64 + {89F8D13E-F216-4B67-8DE9-7F842D349E94}.Debug|x64.Build.0 = Debug|x64 + {89F8D13E-F216-4B67-8DE9-7F842D349E94}.Release|x64.ActiveCfg = Release|x64 + {89F8D13E-F216-4B67-8DE9-7F842D349E94}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/flattenmov/flattenmov.cpp b/flattenmov/flattenmov.cpp new file mode 100644 index 0000000..42b87f0 --- /dev/null +++ b/flattenmov/flattenmov.cpp @@ -0,0 +1,68 @@ +#define _CRT_SECURE_NO_WARNINGS +#include "MacBinary2.h" +#include "MacFileMem.h" +#include "CFileStream.h" +#include "MemReaderStream.h" +#include "ResourceCompiledTypeList.h" +#include "ResourceFile.h" + +#include + +int main(int argc, const char **argv) +{ + if (argc != 3) + { + fprintf(stderr, "Usage: flattenmov "); + return -1; + } + + FILE *f = fopen(argv[1], "rb"); + PortabilityLayer::CFileStream inStream(f, true, false, true); + + PortabilityLayer::MacFileMem *memFile = PortabilityLayer::MacBinary2::ReadBin(&inStream); + inStream.Close(); + + const uint8_t *dataBytes = memFile->DataFork(); + if (dataBytes[0] == 0 && dataBytes[1] == 0 && dataBytes[2] == 0 && dataBytes[3] == 0) + { + uint32_t mdatSize = memFile->FileInfo().m_dataForkSize; + uint8_t mdatSizeEncoded[4]; + mdatSizeEncoded[0] = ((mdatSize >> 24) & 0xff); + mdatSizeEncoded[1] = ((mdatSize >> 16) & 0xff); + mdatSizeEncoded[2] = ((mdatSize >> 8) & 0xff); + mdatSizeEncoded[3] = ((mdatSize >> 0) & 0xff); + + PortabilityLayer::ResourceFile *rf = PortabilityLayer::ResourceFile::Create(); + + PortabilityLayer::MemReaderStream resStream(memFile->ResourceFork(), memFile->FileInfo().m_resourceForkSize); + rf->Load(&resStream); + + const PortabilityLayer::ResourceCompiledTypeList *typeList = rf->GetResourceTypeList(PortabilityLayer::ResTypeID('moov')); + const uint8_t *moovResBytes = nullptr; + uint32_t moovResSize = 0; + for (size_t refIndex = 0; refIndex < typeList->m_numRefs; refIndex++) + { + const PortabilityLayer::ResourceCompiledRef &ref = typeList->m_firstRef[refIndex]; + moovResSize = ref.GetSize(); + moovResBytes = ref.m_resData; + break; + } + + FILE *outF = fopen(argv[2], "wb"); + + fwrite(mdatSizeEncoded, 1, 4, outF); + fwrite(dataBytes + 4, 1, mdatSize - 4, outF); + fwrite(moovResBytes, 1, moovResSize, outF); + + fclose(outF); + rf->Destroy(); + } + else + { + FILE *outF = fopen(argv[2], "wb"); + fwrite(dataBytes, 1, memFile->FileInfo().m_dataForkSize, outF); + fclose(outF); + } + + return 0; +} diff --git a/flattenmov/flattenmov.vcxproj b/flattenmov/flattenmov.vcxproj new file mode 100644 index 0000000..a9f258e --- /dev/null +++ b/flattenmov/flattenmov.vcxproj @@ -0,0 +1,136 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 15.0 + {89F8D13E-F216-4B67-8DE9-7F842D349E94} + flattenmov + 10.0.17763.0 + + + + Application + true + v141 + MultiByte + + + Application + false + v141 + true + MultiByte + + + Application + true + v141 + MultiByte + + + Application + false + v141 + true + MultiByte + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Level3 + Disabled + true + true + + + + + Level3 + Disabled + true + true + + + + + Level3 + MaxSpeed + true + true + true + true + + + true + true + + + + + Level3 + MaxSpeed + true + true + true + true + + + true + true + + + + + + + + {6ec62b0f-9353-40a4-a510-3788f1368b33} + + + + + + \ No newline at end of file diff --git a/flattenmov/flattenmov.vcxproj.filters b/flattenmov/flattenmov.vcxproj.filters new file mode 100644 index 0000000..8e4152d --- /dev/null +++ b/flattenmov/flattenmov.vcxproj.filters @@ -0,0 +1,22 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;hm;inl;inc;ipp;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Source Files + + + \ No newline at end of file