2016-08-29 15:43:05 +02:00
|
|
|
#include "./mp4ids.h"
|
|
|
|
|
|
|
|
#include "../mediaformat.h"
|
|
|
|
|
2018-03-06 23:09:15 +01:00
|
|
|
namespace TagParser {
|
2016-08-29 15:43:05 +02:00
|
|
|
|
|
|
|
/*!
|
|
|
|
* \brief Encapsulates the most common MP4 atom IDs.
|
|
|
|
*/
|
|
|
|
namespace Mp4AtomIds {
|
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
|
|
|
* \brief Encapsulates IDs of MP4 atoms holding tag information.
|
2020-04-22 18:43:41 +02:00
|
|
|
* \sa See http://atomicparsley.sourceforge.net/mpeg-4files.html for a table of known iTunes metadata atom IDs.
|
2016-08-29 15:43:05 +02:00
|
|
|
*/
|
|
|
|
namespace Mp4TagAtomIds {
|
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
|
|
|
* \brief Encapsulates "mean values" used in iTunes style MP4 tags.
|
|
|
|
*/
|
|
|
|
namespace Mp4TagExtendedMeanIds {
|
2021-01-30 21:53:06 +01:00
|
|
|
std::string_view iTunes = "com.apple.iTunes";
|
2016-08-29 15:43:05 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
|
|
|
* \brief Encapsulates "name values" used in iTunes style MP4 tags.
|
|
|
|
*/
|
|
|
|
namespace Mp4TagExtendedNameIds {
|
2021-01-30 21:53:06 +01:00
|
|
|
std::string_view cdec = "cdec";
|
|
|
|
std::string_view label = "LABEL";
|
2018-03-07 01:17:50 +01:00
|
|
|
} // namespace Mp4TagExtendedNameIds
|
2016-08-29 15:43:05 +02:00
|
|
|
|
|
|
|
/*!
|
|
|
|
* \brief Encapsulates all supported MP4 media type IDs.
|
|
|
|
*/
|
|
|
|
namespace Mp4MediaTypeIds {
|
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
|
|
|
* \brief Encapsulates all supported MP4 media format IDs (aka "FOURCCs").
|
|
|
|
* \sa http://wiki.multimedia.cx/?title=QuickTime_container
|
|
|
|
*/
|
|
|
|
namespace FourccIds {
|
|
|
|
|
2019-03-13 19:06:42 +01:00
|
|
|
MediaFormat fourccToMediaFormat(std::uint32_t fourccId)
|
2016-08-29 15:43:05 +02:00
|
|
|
{
|
2018-03-07 01:17:50 +01:00
|
|
|
switch (fourccId) {
|
2016-08-29 15:43:05 +02:00
|
|
|
case Mpeg:
|
|
|
|
return GeneralMediaFormat::Mpeg1Video;
|
2018-03-07 01:17:50 +01:00
|
|
|
case Mpeg2Imx30:
|
|
|
|
case Mpeg2Imx50:
|
2016-08-29 15:43:05 +02:00
|
|
|
return GeneralMediaFormat::Mpeg2Video;
|
|
|
|
case Mpeg4Video:
|
|
|
|
return GeneralMediaFormat::Mpeg4Video;
|
|
|
|
case Mpeg4TimedText:
|
|
|
|
return GeneralMediaFormat::Mpeg4TimedText;
|
2018-03-07 01:17:50 +01:00
|
|
|
case Hevc1:
|
|
|
|
case Hevc2:
|
2018-07-28 14:56:00 +02:00
|
|
|
return GeneralMediaFormat::Hevc;
|
2018-03-07 01:17:50 +01:00
|
|
|
case Avc1:
|
|
|
|
case Avc2:
|
|
|
|
case Avc3:
|
|
|
|
case Avc4:
|
|
|
|
case H264Decoder1:
|
|
|
|
case H264Decoder2:
|
|
|
|
case H264Decoder3:
|
|
|
|
case H264Decoder4:
|
|
|
|
case H264Decoder5:
|
|
|
|
case H264Decoder6:
|
2018-07-28 14:56:00 +02:00
|
|
|
return GeneralMediaFormat::Avc;
|
2018-08-23 23:18:57 +02:00
|
|
|
case Av1_IVF:
|
|
|
|
case Av1_ISOBMFF:
|
2018-07-28 14:56:00 +02:00
|
|
|
return GeneralMediaFormat::Av1;
|
2018-03-07 01:17:50 +01:00
|
|
|
case Divx4Decoder1:
|
|
|
|
case Divx4Decoder2:
|
|
|
|
case H263Quicktime:
|
|
|
|
case H2633GPP:
|
|
|
|
case XvidDecoder1:
|
|
|
|
case XvidDecoder2:
|
|
|
|
case XvidDecoder3:
|
|
|
|
case XvidDecoder4:
|
|
|
|
case XvidDecoder5:
|
|
|
|
case Divx5Decoder:
|
2016-08-29 15:43:05 +02:00
|
|
|
return MediaFormat(GeneralMediaFormat::Mpeg4Video, SubFormats::Mpeg4AdvancedSimpleProfile0);
|
2018-03-07 01:17:50 +01:00
|
|
|
case Divx3Decoder1:
|
|
|
|
case Divx3Decoder2:
|
|
|
|
case Divx3Decoder3:
|
|
|
|
case Divx3Decoder4:
|
|
|
|
case Divx3Decoder5:
|
|
|
|
case Divx3Decoder6:
|
|
|
|
case Divx3Decoder7:
|
|
|
|
case Divx3Decoder8:
|
|
|
|
case Divx3Decoder9:
|
|
|
|
case Divx3Decoder10:
|
|
|
|
case Divx3Decoder11:
|
|
|
|
case Divx3Decoder12:
|
|
|
|
case Divx3Decoder13:
|
|
|
|
case Divx3Decoder14:
|
|
|
|
case Divx3Decoder15:
|
2016-08-29 15:43:05 +02:00
|
|
|
return MediaFormat(GeneralMediaFormat::Mpeg4Video, SubFormats::Mpeg4SimpleProfile0);
|
|
|
|
case Tiff:
|
|
|
|
return GeneralMediaFormat::Tiff;
|
|
|
|
case AppleTextAtsuiCodec:
|
|
|
|
return GeneralMediaFormat::TimedText;
|
|
|
|
case Raw:
|
|
|
|
return GeneralMediaFormat::UncompressedVideoFrames;
|
|
|
|
case Jpeg:
|
|
|
|
return GeneralMediaFormat::Jpeg;
|
|
|
|
case Gif:
|
|
|
|
return GeneralMediaFormat::Gif;
|
|
|
|
case Png:
|
|
|
|
return GeneralMediaFormat::Png;
|
|
|
|
case AdpcmAcm:
|
|
|
|
return GeneralMediaFormat::AdpcmAcm;
|
|
|
|
case ImaadpcmAcm:
|
|
|
|
return GeneralMediaFormat::ImaadpcmAcm;
|
2018-03-07 01:17:50 +01:00
|
|
|
case Mp3CbrOnly:
|
|
|
|
case Mp3:
|
2016-08-29 15:43:05 +02:00
|
|
|
return MediaFormat(GeneralMediaFormat::Mpeg1Audio, SubFormats::Mpeg1Layer3);
|
|
|
|
case Mpeg4Audio:
|
|
|
|
return GeneralMediaFormat::Aac;
|
|
|
|
case Alac:
|
|
|
|
return GeneralMediaFormat::Alac;
|
|
|
|
case Ac3:
|
|
|
|
return GeneralMediaFormat::Ac3;
|
|
|
|
case EAc3:
|
|
|
|
return GeneralMediaFormat::EAc3;
|
|
|
|
case DolbyMpl:
|
|
|
|
return GeneralMediaFormat::DolbyMlp;
|
|
|
|
case Ac4:
|
|
|
|
return GeneralMediaFormat::Ac4;
|
2018-03-07 01:17:50 +01:00
|
|
|
case Rv20:
|
|
|
|
case Rv30:
|
|
|
|
case Rv40:
|
2016-08-29 15:43:05 +02:00
|
|
|
return GeneralMediaFormat::RealVideo;
|
2018-03-07 01:17:50 +01:00
|
|
|
case Int24:
|
|
|
|
case Int32:
|
2016-08-29 15:43:05 +02:00
|
|
|
return MediaFormat(GeneralMediaFormat::Pcm);
|
|
|
|
case Int16Be:
|
|
|
|
return MediaFormat(GeneralMediaFormat::Pcm, SubFormats::PcmIntBe);
|
|
|
|
case Int16Le:
|
|
|
|
return MediaFormat(GeneralMediaFormat::Pcm, SubFormats::PcmIntLe);
|
2018-03-07 01:17:50 +01:00
|
|
|
case FloatingPoint32Bit:
|
|
|
|
case FloatingPoint64Bit:
|
2016-08-29 15:43:05 +02:00
|
|
|
return MediaFormat(GeneralMediaFormat::Pcm, SubFormats::PcmFloatIeee);
|
2018-03-07 01:17:50 +01:00
|
|
|
case Amr:
|
|
|
|
case AmrNarrowband:
|
2016-08-29 15:43:05 +02:00
|
|
|
return MediaFormat(GeneralMediaFormat::Amr);
|
2018-03-07 01:17:50 +01:00
|
|
|
case Dts:
|
|
|
|
case DtsH:
|
2016-08-29 15:43:05 +02:00
|
|
|
return MediaFormat(GeneralMediaFormat::Dts);
|
|
|
|
case DtsE:
|
|
|
|
return MediaFormat(GeneralMediaFormat::Dts, SubFormats::DtsExpress);
|
2018-03-07 01:17:50 +01:00
|
|
|
case WindowsMediaAudio:
|
|
|
|
case WindowsMediaAudio7:
|
|
|
|
case WindowsMediaAudio9Professional:
|
|
|
|
case WindowsMediaAudio9Standard:
|
2016-08-29 15:43:05 +02:00
|
|
|
return MediaFormat(GeneralMediaFormat::WindowsMediaAudio);
|
2018-03-07 01:17:50 +01:00
|
|
|
case MsMpeg4V1Decoder1:
|
|
|
|
case MsMpeg4V1Decoder2:
|
|
|
|
case MsMpeg4V1Decoder3:
|
|
|
|
case MsMpeg4V1Decoder4:
|
|
|
|
case MsMpeg4V1Decoder5:
|
|
|
|
case MsMpeg4V1Decoder6:
|
2016-08-29 15:43:05 +02:00
|
|
|
return MediaFormat(GeneralMediaFormat::MicrosoftMpeg4, 1);
|
2018-03-07 01:17:50 +01:00
|
|
|
case MsMpeg4V2Decoder1:
|
|
|
|
case MsMpeg4V2Decoder2:
|
|
|
|
case MsMpeg4V2Decoder3:
|
2016-08-29 15:43:05 +02:00
|
|
|
case MsMpeg4V2Decoder4:
|
|
|
|
return MediaFormat(GeneralMediaFormat::MicrosoftMpeg4, 2);
|
2018-03-07 01:17:50 +01:00
|
|
|
case MsMpeg4V3Decoder1:
|
|
|
|
case MsMpeg4V3Decoder2:
|
2016-08-29 15:43:05 +02:00
|
|
|
return MediaFormat(GeneralMediaFormat::MicrosoftMpeg4, 3);
|
2018-07-28 14:56:00 +02:00
|
|
|
case Vp8:
|
|
|
|
return GeneralMediaFormat::Vp8;
|
|
|
|
case Vp9:
|
2019-09-25 22:05:25 +02:00
|
|
|
case Vp9_2:
|
2018-07-28 14:56:00 +02:00
|
|
|
return GeneralMediaFormat::Vp9;
|
2017-10-29 17:44:01 +01:00
|
|
|
case WavPack:
|
|
|
|
return MediaFormat(GeneralMediaFormat::WavPack);
|
2016-08-29 15:43:05 +02:00
|
|
|
case WindowsMediaVideoV17:
|
|
|
|
return MediaFormat(GeneralMediaFormat::WindowsMediaVideo, 1);
|
2018-03-07 01:17:50 +01:00
|
|
|
case WindowsMediaVideoV2:
|
|
|
|
case WindowsMediaVideoV8:
|
2016-08-29 15:43:05 +02:00
|
|
|
return MediaFormat(GeneralMediaFormat::WindowsMediaVideo, 2);
|
2019-09-25 21:52:44 +02:00
|
|
|
case Flac:
|
|
|
|
return GeneralMediaFormat::Flac;
|
|
|
|
case Opus:
|
|
|
|
return GeneralMediaFormat::Opus;
|
2016-08-29 15:43:05 +02:00
|
|
|
// TODO: map more FOURCCs
|
|
|
|
default:
|
|
|
|
return GeneralMediaFormat::Unknown;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-03-07 01:17:50 +01:00
|
|
|
} // namespace FourccIds
|
2016-08-29 15:43:05 +02:00
|
|
|
|
|
|
|
/*!
|
|
|
|
* \brief Encapsulates all supported MP4 media format description extensions.
|
|
|
|
* \sa https://developer.apple.com/library/mac/documentation/QuickTime/QTFF/QTFFChap3/qtff3.html
|
|
|
|
*/
|
|
|
|
namespace Mp4FormatExtensionIds {
|
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
|
|
|
* \brief Encapsulates all supported MPEG-4 elementary stream object IDs.
|
|
|
|
*/
|
|
|
|
namespace Mpeg4ElementaryStreamObjectIds {
|
|
|
|
|
|
|
|
/*!
|
2018-06-03 20:38:32 +02:00
|
|
|
* \brief Returns the TagParser::MediaFormat denoted by the specified MPEG-4 stream ID.
|
2016-08-29 15:43:05 +02:00
|
|
|
*/
|
2019-03-13 19:06:42 +01:00
|
|
|
MediaFormat streamObjectTypeFormat(std::uint8_t streamObjectTypeId)
|
2016-08-29 15:43:05 +02:00
|
|
|
{
|
2018-03-07 01:17:50 +01:00
|
|
|
switch (streamObjectTypeId) {
|
|
|
|
case SystemsIso144961:
|
|
|
|
return GeneralMediaFormat::Systems;
|
|
|
|
case SystemsIso144961v2:
|
|
|
|
return MediaFormat(GeneralMediaFormat::Systems, 2);
|
|
|
|
case InteractionStream:
|
|
|
|
return GeneralMediaFormat::InteractionStream;
|
|
|
|
case AfxStream:
|
|
|
|
return GeneralMediaFormat::AfxStream;
|
|
|
|
case FontDataStream:
|
|
|
|
return GeneralMediaFormat::FontDataStream;
|
|
|
|
case SynthesizedTextureStream:
|
|
|
|
return GeneralMediaFormat::SynthesizedTextureStream;
|
|
|
|
case StreamingTextStream:
|
|
|
|
return GeneralMediaFormat::StreamingTextStream;
|
|
|
|
case Mpeg4Visual:
|
|
|
|
return GeneralMediaFormat::Mpeg4Video;
|
|
|
|
case Avc:
|
|
|
|
return GeneralMediaFormat::Avc;
|
|
|
|
case ParameterSetsForAvc:
|
|
|
|
return GeneralMediaFormat::Avc;
|
|
|
|
case Als:
|
|
|
|
return GeneralMediaFormat::Als;
|
|
|
|
case Sa0c:
|
|
|
|
return GeneralMediaFormat::Sa0c;
|
|
|
|
case Aac:
|
|
|
|
return MediaFormat(GeneralMediaFormat::Aac, SubFormats::AacMpeg4LowComplexityProfile);
|
|
|
|
case Mpeg2VideoSimpleProfile:
|
|
|
|
return MediaFormat(GeneralMediaFormat::Mpeg4Video, SubFormats::Mpeg2SimpleProfile);
|
|
|
|
case Mpeg2VideoMainProfile:
|
|
|
|
return MediaFormat(GeneralMediaFormat::Mpeg4Video, SubFormats::Mpeg2SnrProfile);
|
|
|
|
case Mpeg2VideoSnrProfile:
|
|
|
|
return MediaFormat(GeneralMediaFormat::Mpeg4Video, SubFormats::Mpeg2SpatialProfile);
|
|
|
|
case Mpeg2VideoSpatialProfile:
|
|
|
|
return MediaFormat(GeneralMediaFormat::Mpeg4Video, SubFormats::Mpeg2HighProfile);
|
|
|
|
case Mpeg2VideoHighProfile:
|
|
|
|
return MediaFormat(GeneralMediaFormat::Mpeg4Video, SubFormats::Mpeg2HighProfile);
|
|
|
|
case Mpeg2Video422Profile:
|
|
|
|
return MediaFormat(GeneralMediaFormat::Mpeg4Video, SubFormats::Mpeg2SimpleProfile);
|
|
|
|
case Mpeg2AacMainProfile:
|
|
|
|
return MediaFormat(GeneralMediaFormat::Aac, SubFormats::AacMpeg2MainProfile);
|
|
|
|
case Mpeg2AacLowComplexityProfile:
|
|
|
|
return MediaFormat(GeneralMediaFormat::Aac, SubFormats::AacMpeg2LowComplexityProfile);
|
|
|
|
case Mpeg2AacScaleableSamplingRateProfile:
|
|
|
|
return MediaFormat(GeneralMediaFormat::Aac, SubFormats::AacMpeg2ScalableSamplingRateProfile);
|
|
|
|
case Mpeg2Audio:
|
|
|
|
return GeneralMediaFormat::Mpeg2Audio;
|
|
|
|
case Mpeg1Video:
|
|
|
|
return GeneralMediaFormat::Mpeg1Video;
|
|
|
|
case Mpeg1Audio:
|
|
|
|
return GeneralMediaFormat::Mpeg1Audio;
|
|
|
|
case Jpeg:
|
|
|
|
return GeneralMediaFormat::Jpeg;
|
|
|
|
case Png:
|
|
|
|
return GeneralMediaFormat::Png;
|
|
|
|
case Evrc:
|
|
|
|
case PrivateEvrc:
|
|
|
|
return GeneralMediaFormat::Evrc;
|
|
|
|
case Smv:
|
|
|
|
return GeneralMediaFormat::Smv;
|
|
|
|
case Gpp2Cmf:
|
|
|
|
return GeneralMediaFormat::Gpp2Cmf;
|
|
|
|
case Vc1:
|
|
|
|
return GeneralMediaFormat::Vc1;
|
|
|
|
case Dirac:
|
|
|
|
return GeneralMediaFormat::Dirac;
|
|
|
|
case Ac3:
|
|
|
|
case PrivateAc3:
|
|
|
|
return GeneralMediaFormat::Ac3;
|
|
|
|
case EAc3:
|
|
|
|
return GeneralMediaFormat::EAc3;
|
|
|
|
case Dts:
|
|
|
|
case PrivateDts:
|
|
|
|
return GeneralMediaFormat::Dts;
|
|
|
|
case DtsHdHighResolution:
|
|
|
|
return MediaFormat(GeneralMediaFormat::DtsHd, SubFormats::DtsHdHighResolution);
|
|
|
|
case DtsHdMasterAudio:
|
|
|
|
return MediaFormat(GeneralMediaFormat::DtsHd, SubFormats::DtsHdMasterAudio);
|
|
|
|
case DtsHdExpress:
|
|
|
|
return MediaFormat(GeneralMediaFormat::DtsHd, SubFormats::DtsExpress);
|
|
|
|
case PrivateOgg:
|
|
|
|
case PrivateOgg2:
|
|
|
|
return GeneralMediaFormat::Vorbis;
|
2019-03-10 16:40:51 +01:00
|
|
|
case PrivateVobSub:
|
|
|
|
return GeneralMediaFormat::VobSub;
|
2018-03-07 01:17:50 +01:00
|
|
|
case PrivateQcelp:
|
|
|
|
return GeneralMediaFormat::Qcelp;
|
|
|
|
default:
|
|
|
|
return MediaFormat();
|
2016-08-29 15:43:05 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-03-07 01:17:50 +01:00
|
|
|
} // namespace Mpeg4ElementaryStreamObjectIds
|
2016-08-29 15:43:05 +02:00
|
|
|
|
|
|
|
/*!
|
|
|
|
* \brief Encapsulates all known MPEG-4 descriptor IDs.
|
|
|
|
*/
|
|
|
|
namespace Mpeg4DescriptorIds {
|
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
|
|
|
* \brief Returns the name of the stream type denoted by the specified MPEG-4 stream type ID.
|
|
|
|
*/
|
|
|
|
namespace Mpeg4ElementaryStreamTypeIds {
|
|
|
|
|
|
|
|
/*!
|
|
|
|
* \brief Returns the name of the stream type denoted by the specified MPEG-4 stream type ID.
|
|
|
|
*/
|
2021-01-30 21:53:06 +01:00
|
|
|
std::string_view streamTypeName(std::uint8_t streamTypeId)
|
2016-08-29 15:43:05 +02:00
|
|
|
{
|
2018-03-07 01:17:50 +01:00
|
|
|
switch (streamTypeId) {
|
|
|
|
case ObjectDescriptor:
|
|
|
|
return "object descriptor";
|
|
|
|
case ClockReference:
|
|
|
|
return "clock reference";
|
|
|
|
case SceneDescriptor:
|
|
|
|
return "scene descriptor";
|
|
|
|
case Visual:
|
|
|
|
return "visual";
|
|
|
|
case Audio:
|
|
|
|
return "audio";
|
|
|
|
case Mpeg7:
|
|
|
|
return "MPEG-7";
|
|
|
|
case Ipmps:
|
|
|
|
return "IMPS";
|
|
|
|
case ObjectContentInfo:
|
|
|
|
return "object content info";
|
|
|
|
case MpegJava:
|
|
|
|
return "MPEG Java";
|
|
|
|
case Interaction:
|
|
|
|
return "interaction";
|
|
|
|
case Ipmp:
|
|
|
|
return "IPMP";
|
|
|
|
case FontData:
|
|
|
|
return "font data";
|
|
|
|
case StreamingText:
|
|
|
|
return "streaming text";
|
|
|
|
default:
|
|
|
|
return "";
|
2016-08-29 15:43:05 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-03-07 01:17:50 +01:00
|
|
|
} // namespace Mpeg4ElementaryStreamTypeIds
|
2016-08-29 15:43:05 +02:00
|
|
|
|
|
|
|
/*!
|
|
|
|
* \brief Encapsulates all supported MPEG-4 audio object type IDs.
|
|
|
|
* \sa http://wiki.multimedia.cx/index.php?title=MPEG-4_Audio
|
|
|
|
*/
|
|
|
|
namespace Mpeg4AudioObjectIds {
|
|
|
|
|
2019-03-13 19:06:42 +01:00
|
|
|
TAG_PARSER_EXPORT MediaFormat idToMediaFormat(std::uint8_t mpeg4AudioObjectId, bool sbrPresent, bool psPresent)
|
2016-08-29 15:43:05 +02:00
|
|
|
{
|
|
|
|
MediaFormat fmt;
|
2018-03-07 01:17:50 +01:00
|
|
|
switch (mpeg4AudioObjectId) {
|
2016-08-29 15:43:05 +02:00
|
|
|
case AacMain:
|
|
|
|
fmt = MediaFormat(GeneralMediaFormat::Aac, SubFormats::AacMpeg4MainProfile);
|
|
|
|
break;
|
|
|
|
case AacLc:
|
|
|
|
fmt = MediaFormat(GeneralMediaFormat::Aac, SubFormats::AacMpeg4LowComplexityProfile);
|
|
|
|
break;
|
|
|
|
case AacSsr:
|
|
|
|
fmt = MediaFormat(GeneralMediaFormat::Aac, SubFormats::AacMpeg4ScalableSamplingRateProfile);
|
|
|
|
break;
|
|
|
|
case AacLtp:
|
|
|
|
fmt = MediaFormat(GeneralMediaFormat::Aac, SubFormats::AacMpeg4LongTermPrediction);
|
|
|
|
break;
|
|
|
|
case Sbr:
|
|
|
|
fmt = MediaFormat(GeneralMediaFormat::Aac, SubFormats::AacMpeg4LowComplexityProfile, ExtensionFormats::SpectralBandReplication);
|
|
|
|
break;
|
|
|
|
case AacScalable:
|
|
|
|
fmt = MediaFormat(GeneralMediaFormat::Aac, SubFormats::AacMpeg4ScalableSamplingRateProfile);
|
|
|
|
break;
|
|
|
|
case ErAacLc:
|
|
|
|
fmt = MediaFormat(GeneralMediaFormat::Aac, SubFormats::AacMpeg4ERLowComplecityProfile);
|
|
|
|
break;
|
|
|
|
case ErAacLtp:
|
|
|
|
fmt = MediaFormat(GeneralMediaFormat::Aac, SubFormats::AacMpeg4ERLongTermPrediction);
|
|
|
|
break;
|
|
|
|
case ErAacLd:
|
|
|
|
fmt = MediaFormat(GeneralMediaFormat::Aac, SubFormats::AacMpeg4ERLowDelay);
|
|
|
|
break;
|
|
|
|
case Ps:
|
|
|
|
fmt = MediaFormat(GeneralMediaFormat::Aac, SubFormats::AacMpeg4LowComplexityProfile, ExtensionFormats::ParametricStereo);
|
|
|
|
break;
|
|
|
|
case Layer1:
|
|
|
|
fmt = MediaFormat(GeneralMediaFormat::Mpeg1Audio, SubFormats::Mpeg1Layer1);
|
|
|
|
break;
|
|
|
|
case Layer2:
|
|
|
|
fmt = MediaFormat(GeneralMediaFormat::Mpeg1Audio, SubFormats::Mpeg1Layer2);
|
|
|
|
break;
|
|
|
|
case Layer3:
|
|
|
|
fmt = MediaFormat(GeneralMediaFormat::Mpeg1Audio, SubFormats::Mpeg1Layer3);
|
|
|
|
break;
|
2018-03-07 01:17:50 +01:00
|
|
|
default:;
|
2016-08-29 15:43:05 +02:00
|
|
|
}
|
2018-03-07 01:17:50 +01:00
|
|
|
if (sbrPresent) {
|
2016-08-29 15:43:05 +02:00
|
|
|
fmt.extension |= ExtensionFormats::SpectralBandReplication;
|
|
|
|
}
|
2018-03-07 01:17:50 +01:00
|
|
|
if (psPresent) {
|
2016-08-29 15:43:05 +02:00
|
|
|
fmt.extension |= ExtensionFormats::ParametricStereo;
|
|
|
|
}
|
|
|
|
return fmt;
|
|
|
|
}
|
|
|
|
|
2018-03-07 01:17:50 +01:00
|
|
|
} // namespace Mpeg4AudioObjectIds
|
2016-08-29 15:43:05 +02:00
|
|
|
|
2019-03-13 19:06:42 +01:00
|
|
|
std::uint32_t mpeg4SamplingFrequencyTable[] = { 96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050, 16000, 12000, 11025, 8000, 7350 };
|
2016-08-29 15:43:05 +02:00
|
|
|
|
|
|
|
/*!
|
|
|
|
* \brief Encapsulates all supported MPEG-4 channel configurations.
|
|
|
|
*/
|
|
|
|
namespace Mpeg4ChannelConfigs {
|
|
|
|
|
|
|
|
/*!
|
|
|
|
* \brief Returns the string representation for the specified MPEG-4 channel config.
|
|
|
|
*/
|
2021-01-30 21:53:06 +01:00
|
|
|
std::string_view channelConfigString(std::uint8_t config)
|
2016-08-29 15:43:05 +02:00
|
|
|
{
|
2018-03-07 01:17:50 +01:00
|
|
|
switch (config) {
|
2016-08-29 15:43:05 +02:00
|
|
|
case AotSpecificConfig:
|
|
|
|
return "defined in AOT Specific Config";
|
|
|
|
case FrontCenter:
|
|
|
|
return "1 channel: front-center";
|
|
|
|
case FrontLeftFrontRight:
|
|
|
|
return "2 channels: front-left, front-right";
|
|
|
|
case FrontCenterFrontLeftFrontRight:
|
|
|
|
return "3 channels: front-center, front-left, front-right";
|
|
|
|
case FrontCenterFrontLeftFrontRightBackCenter:
|
|
|
|
return "4 channels: front-center, front-left, front-right, back-center";
|
|
|
|
case FrontCenterFrontLeftFrontRightBackLeftBackRight:
|
|
|
|
return "5 channels: front-center, front-left, front-right, back-left, back-right";
|
|
|
|
case FrontCenterFrontLeftFrontRightBackLeftBackRightLFEChannel:
|
|
|
|
return "6 channels: front-center, front-left, front-right, back-left, back-right, LFE-channel";
|
|
|
|
case FrontCenterFrontLeftFrontRightSideLeftSideRightBackLeftBackRightLFEChannel:
|
|
|
|
return "8 channels: front-center, front-left, front-right, side-left, side-right, back-left, back-right, LFE-channel";
|
|
|
|
default:
|
2021-02-01 17:10:01 +01:00
|
|
|
return std::string_view();
|
2016-08-29 15:43:05 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
|
|
|
* \brief Returns the channel count for the specified MPEG-4 channel config.
|
|
|
|
*/
|
2019-03-13 19:06:42 +01:00
|
|
|
std::uint8_t channelCount(std::uint8_t config)
|
2016-08-29 15:43:05 +02:00
|
|
|
{
|
2018-03-07 01:17:50 +01:00
|
|
|
switch (config) {
|
2016-08-29 15:43:05 +02:00
|
|
|
case FrontCenter:
|
|
|
|
return 1;
|
|
|
|
case FrontLeftFrontRight:
|
|
|
|
return 2;
|
|
|
|
case FrontCenterFrontLeftFrontRight:
|
|
|
|
return 3;
|
|
|
|
case FrontCenterFrontLeftFrontRightBackCenter:
|
|
|
|
return 4;
|
|
|
|
case FrontCenterFrontLeftFrontRightBackLeftBackRight:
|
|
|
|
return 5;
|
|
|
|
case FrontCenterFrontLeftFrontRightBackLeftBackRightLFEChannel:
|
|
|
|
return 6;
|
|
|
|
case FrontCenterFrontLeftFrontRightSideLeftSideRightBackLeftBackRightLFEChannel:
|
|
|
|
return 8;
|
|
|
|
default:
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-03-07 01:17:50 +01:00
|
|
|
} // namespace Mpeg4ChannelConfigs
|
2016-08-29 15:43:05 +02:00
|
|
|
|
|
|
|
/*!
|
|
|
|
* \brief Encapsulates MPEG-4 video (14496-2) codes.
|
|
|
|
*/
|
|
|
|
namespace Mpeg4VideoCodes {
|
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
|
|
|
* \brief Encapsulates MPEG-2 video codes.
|
|
|
|
*/
|
|
|
|
namespace Mpeg2VideoCodes {
|
|
|
|
}
|
|
|
|
|
2018-03-07 01:17:50 +01:00
|
|
|
} // namespace TagParser
|