Detect Opus and FLAC in MP4

This commit is contained in:
Martchus 2019-09-25 21:52:44 +02:00
parent fe67abcfeb
commit eb9ab514eb
5 changed files with 15 additions and 2 deletions

View File

@ -9,8 +9,8 @@ set(META_APP_AUTHOR "Martchus")
set(META_APP_URL "https://github.com/${META_APP_AUTHOR}/${META_PROJECT_NAME}") set(META_APP_URL "https://github.com/${META_APP_AUTHOR}/${META_PROJECT_NAME}")
set(META_APP_DESCRIPTION "C++ library for reading and writing MP4 (iTunes), ID3, Vorbis, Opus, FLAC and Matroska tags") set(META_APP_DESCRIPTION "C++ library for reading and writing MP4 (iTunes), ID3, Vorbis, Opus, FLAC and Matroska tags")
set(META_VERSION_MAJOR 9) set(META_VERSION_MAJOR 9)
set(META_VERSION_MINOR 0) set(META_VERSION_MINOR 1)
set(META_VERSION_PATCH 1) set(META_VERSION_PATCH 0)
set(META_REQUIRED_CPP_UNIT_VERSION 1.14.0) set(META_REQUIRED_CPP_UNIT_VERSION 1.14.0)
set(META_ADD_DEFAULT_CPP_UNIT_TEST_APPLICATION ON) set(META_ADD_DEFAULT_CPP_UNIT_TEST_APPLICATION ON)

View File

@ -183,6 +183,10 @@ MediaFormat fourccToMediaFormat(std::uint32_t fourccId)
case WindowsMediaVideoV2: case WindowsMediaVideoV2:
case WindowsMediaVideoV8: case WindowsMediaVideoV8:
return MediaFormat(GeneralMediaFormat::WindowsMediaVideo, 2); return MediaFormat(GeneralMediaFormat::WindowsMediaVideo, 2);
case Flac:
return GeneralMediaFormat::Flac;
case Opus:
return GeneralMediaFormat::Opus;
// TODO: map more FOURCCs // TODO: map more FOURCCs
default: default:
return GeneralMediaFormat::Unknown; return GeneralMediaFormat::Unknown;

View File

@ -269,6 +269,7 @@ enum KnownValue : std::uint32_t {
Explode = 0x78706C6F, Explode = 0x78706C6F,
FilmNoise = 0x666D6E73, FilmNoise = 0x666D6E73,
Fire = 0x66697265, Fire = 0x66697265,
Flac = 0x664C6143,
FlashPixImage = 0x66706978, FlashPixImage = 0x66706978,
FlashScreenVideoDecoder = 0x46535631, FlashScreenVideoDecoder = 0x46535631,
FloatingPoint32Bit = 0x666C3332, FloatingPoint32Bit = 0x666C3332,
@ -342,6 +343,7 @@ enum KnownValue : std::uint32_t {
MsMpeg4V3Decoder2 = 0x6D703433, MsMpeg4V3Decoder2 = 0x6D703433,
NtscDv25Video = 0x64766320, /**< NTSC DV-25 video */ NtscDv25Video = 0x64766320, /**< NTSC DV-25 video */
Oggs = 0x4F676753, Oggs = 0x4F676753,
Opus = 0x4F707573,
PalDv25Video = 0x64766370, /**< PAL DV-25 video */ PalDv25Video = 0x64766370, /**< PAL DV-25 video */
PdfImage = 0x70646620, PdfImage = 0x70646620,
Png = 0x706E6720, /**< Portable Network Graphics */ Png = 0x706E6720, /**< Portable Network Graphics */

View File

@ -1642,9 +1642,11 @@ void Mp4Track::internalParseHeader(Diagnostics &diag)
for (Mp4Atom *codecConfigContainerAtom = m_stsdAtom->firstChild(); codecConfigContainerAtom; for (Mp4Atom *codecConfigContainerAtom = m_stsdAtom->firstChild(); codecConfigContainerAtom;
codecConfigContainerAtom = codecConfigContainerAtom->nextSibling()) { codecConfigContainerAtom = codecConfigContainerAtom->nextSibling()) {
codecConfigContainerAtom->parse(diag); codecConfigContainerAtom->parse(diag);
// parse FOURCC // parse FOURCC
m_formatId = interpretIntegerAsString<std::uint32_t>(codecConfigContainerAtom->id()); m_formatId = interpretIntegerAsString<std::uint32_t>(codecConfigContainerAtom->id());
m_format = FourccIds::fourccToMediaFormat(codecConfigContainerAtom->id()); m_format = FourccIds::fourccToMediaFormat(codecConfigContainerAtom->id());
// parse codecConfigContainerAtom // parse codecConfigContainerAtom
m_istream->seekg(static_cast<streamoff>(codecConfigContainerAtom->dataOffset())); m_istream->seekg(static_cast<streamoff>(codecConfigContainerAtom->dataOffset()));
switch (codecConfigContainerAtom->id()) { switch (codecConfigContainerAtom->id()) {
@ -1660,6 +1662,8 @@ void Mp4Track::internalParseHeader(Diagnostics &diag)
case FourccIds::Dts: case FourccIds::Dts:
case FourccIds::DtsH: case FourccIds::DtsH:
case FourccIds::DtsE: case FourccIds::DtsE:
case FourccIds::Flac:
case FourccIds::Opus:
m_istream->seekg(6 + 2, ios_base::cur); // skip reserved bytes, data reference index m_istream->seekg(6 + 2, ios_base::cur); // skip reserved bytes, data reference index
tmp = reader.readUInt16BE(); // read sound version tmp = reader.readUInt16BE(); // read sound version
m_istream->seekg(6, ios_base::cur); m_istream->seekg(6, ios_base::cur);

View File

@ -117,6 +117,9 @@ convert flac/test.flac ffmpeg -i mtx-test-data/alac/othertest-itunes.m4a -c:a fl
convert flac/test.ogg ffmpeg -i flac/test.flac -vn -c:a copy flac/test.ogg convert flac/test.ogg ffmpeg -i flac/test.flac -vn -c:a copy flac/test.ogg
convert mkv/av1_test.mkv ffmpeg -i matroska_wave1/test1.mkv -t 1 -c:v libaom-av1 -crf 30 -cpu-used 5 -an -strict experimental mkv/av1_test.mkv convert mkv/av1_test.mkv ffmpeg -i matroska_wave1/test1.mkv -t 1 -c:v libaom-av1 -crf 30 -cpu-used 5 -an -strict experimental mkv/av1_test.mkv
convert mp4/av1_test.mp4 ffmpeg -i mkv/av1_test.mkv -c copy mp4/av1_test.mp4 convert mp4/av1_test.mp4 ffmpeg -i mkv/av1_test.mkv -c copy mp4/av1_test.mp4
convert mp4/test1-flac.m4a ffmpeg -i mp4/test1.m4a -c:a flac -f mp4 -strict -2 mp4/test1-flac.m4a
convert mp4/test1-opus.m4a ffmpeg -i mp4/test1.m4a -c:a libopus -f mp4 -strict -2 mp4/test1-opus.m4a
convert mp4/test1-vorbis.m4a ffmpeg -i mp4/test1.m4a -c:a libvorbis -f mp4 -strict -2 mp4/test1-vorbis.m4a
convert misc/av1.ivf ffmpeg -i mkv/av1_test.mkv -c copy misc/av1.ivf convert misc/av1.ivf ffmpeg -i mkv/av1_test.mkv -c copy misc/av1.ivf
convert mkv/nested-tags.mkv \ convert mkv/nested-tags.mkv \
mkvmerge --ui-language en_US \ mkvmerge --ui-language en_US \