aboutsummaryrefslogtreecommitdiff
path: root/Src/Plugins/Encoder/enc_fhgaac/MP4Writer.cpp
diff options
context:
space:
mode:
authorJef <jef@targetspot.com>2024-09-24 08:54:57 -0400
committerJef <jef@targetspot.com>2024-09-24 08:54:57 -0400
commit20d28e80a5c861a9d5f449ea911ab75b4f37ad0d (patch)
tree12f17f78986871dd2cfb0a56e5e93b545c1ae0d0 /Src/Plugins/Encoder/enc_fhgaac/MP4Writer.cpp
parent537bcbc86291b32fc04ae4133ce4d7cac8ebe9a7 (diff)
downloadwinamp-20d28e80a5c861a9d5f449ea911ab75b4f37ad0d.tar.gz
Initial community commit
Diffstat (limited to 'Src/Plugins/Encoder/enc_fhgaac/MP4Writer.cpp')
-rw-r--r--Src/Plugins/Encoder/enc_fhgaac/MP4Writer.cpp64
1 files changed, 64 insertions, 0 deletions
diff --git a/Src/Plugins/Encoder/enc_fhgaac/MP4Writer.cpp b/Src/Plugins/Encoder/enc_fhgaac/MP4Writer.cpp
new file mode 100644
index 00000000..00f6d811
--- /dev/null
+++ b/Src/Plugins/Encoder/enc_fhgaac/MP4Writer.cpp
@@ -0,0 +1,64 @@
+#include "MP4Writer.h"
+
+#include <strsafe.h>
+
+MP4Writer::MP4Writer()
+{
+ wchar_t tmppath[MAX_PATH-14] = {0};
+ GetTempPathW(MAX_PATH-14,tmppath);
+ GetTempFileNameW(tmppath, L"mp4", 0, tempfile);
+ mp4File = MP4Create(tempfile);
+ if(!mp4File)
+ {
+ return;
+ }
+}
+
+MP4Writer::~MP4Writer()
+{
+ /* in case it's lingering open */
+ if (mp4File)
+ MP4Close(mp4File);
+}
+
+void MP4Writer::CloseTo(const wchar_t *filename)
+{
+ MP4Close(mp4File);
+ mp4File=0;
+ MP4MakeIsmaCompliant(tempfile, 0, true);
+ DeleteFileW(filename);
+ if (MoveFileW(tempfile,filename) == 0) // if the function fails
+ {
+ CopyFileW(tempfile,filename, FALSE);
+ DeleteFileW(tempfile);
+ }
+}
+
+void MP4Writer::WriteGaps(uint32_t pregap, uint32_t postgap, uint64_t totalSamples)
+{
+ char data[128] = {0};
+ StringCchPrintfA(data, 128, " %08X %08X %08X %016X %08X %08X %08X %08X %08X %08X %08X %08X", 0, pregap, postgap, totalSamples, 0, 0,0, 0,0, 0,0, 0);
+ MP4SetMetadataFreeForm(mp4File, "iTunSMPB", (u_int8_t *)data, lstrlenA(data));
+}
+
+void MP4Writer::Write(const void *buf, size_t size, MP4Duration duration)
+{
+ MP4WriteSample(mp4File, mp4Track, (const uint8_t *)buf, size, duration);
+}
+
+void MP4Writer::AddAudioTrack(const HANDLE_MPEG4ENC_ENCODER encoder, const MPEG4ENC_SETUP *setup)
+{
+ MPEG4ENC_INFO info;
+ MPEG4ENC_GetInfo(encoder, &info);
+
+ MP4SetTimeScale(mp4File, info.nSamplingRate[0]);
+
+ mp4Track = MP4AddAudioTrack(mp4File, info.nSamplingRate[0], info.nSamplesFrame[0], MP4_MPEG4_AUDIO_TYPE);
+ MP4SetAudioProfileLevel(mp4File, info.nProfLev);
+ MP4SetTrackESConfiguration(mp4File, mp4Track, info.ascBuf[0].ascBuffer, (info.ascBuf[0].nAscSizeBits+7)/8);
+}
+
+void MP4Writer::WriteTool(const char *tool)
+{
+ MP4SetMetadataTool(mp4File, tool);
+} \ No newline at end of file