diff options
author | Jef <jef@targetspot.com> | 2024-09-24 08:54:57 -0400 |
---|---|---|
committer | Jef <jef@targetspot.com> | 2024-09-24 08:54:57 -0400 |
commit | 20d28e80a5c861a9d5f449ea911ab75b4f37ad0d (patch) | |
tree | 12f17f78986871dd2cfb0a56e5e93b545c1ae0d0 /Src/Plugins/Encoder/enc_fhgaac/MP4Writer.cpp | |
parent | 537bcbc86291b32fc04ae4133ce4d7cac8ebe9a7 (diff) | |
download | winamp-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.cpp | 64 |
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 |