[vlc-commits] demux: adaptive: add format namespace parser
Francois Cartegnie
git at videolan.org
Mon Mar 30 16:15:40 CEST 2020
vlc/vlc-3.0 | branch: master | Francois Cartegnie <fcvlcdev at free.fr> | Tue May 14 12:36:56 2019 +0200| [5c9686b5e2d418a74a99d7aab8c5d99a7f72d6be] | committer: Francois Cartegnie
demux: adaptive: add format namespace parser
(cherry picked from commit 8225743917c826913411ad1c44638014a2330d5b)
> http://git.videolan.org/gitweb.cgi/vlc/vlc-3.0.git/?a=commit;h=5c9686b5e2d418a74a99d7aab8c5d99a7f72d6be
---
modules/demux/Makefile.am | 2 +
modules/demux/adaptive/tools/FormatNamespace.cpp | 193 +++++++++++++++++++++++
modules/demux/adaptive/tools/FormatNamespace.hpp | 45 ++++++
3 files changed, 240 insertions(+)
diff --git a/modules/demux/Makefile.am b/modules/demux/Makefile.am
index 20ccfc4949..b011e7dec2 100644
--- a/modules/demux/Makefile.am
+++ b/modules/demux/Makefile.am
@@ -381,6 +381,8 @@ libadaptive_plugin_la_SOURCES = \
demux/adaptive/tools/Conversions.hpp \
demux/adaptive/tools/Conversions.cpp \
demux/adaptive/tools/Debug.hpp \
+ demux/adaptive/tools/FormatNamespace.cpp \
+ demux/adaptive/tools/FormatNamespace.hpp \
demux/adaptive/tools/Helper.cpp \
demux/adaptive/tools/Helper.h \
demux/adaptive/tools/MovingAverage.hpp \
diff --git a/modules/demux/adaptive/tools/FormatNamespace.cpp b/modules/demux/adaptive/tools/FormatNamespace.cpp
new file mode 100644
index 0000000000..cec0107fe6
--- /dev/null
+++ b/modules/demux/adaptive/tools/FormatNamespace.cpp
@@ -0,0 +1,193 @@
+/*
+ * FormatNamespace.cpp
+ *****************************************************************************
+ * Copyright © 2019 VideoLabs, VideoLAN and VLC Authors
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation; either version 2.1 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
+ *****************************************************************************/
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include "FormatNamespace.hpp"
+#include "../../demux/mp4/mpeg4.h"
+#include "../../packetizer/mpeg4audio.h"
+#include "../tools/Helper.h"
+
+#include <list>
+#include <string>
+#include <ios>
+
+using namespace adaptive;
+
+#define MP4RA(fcc) VLC_FOURCC(fcc[0], fcc[1], fcc[2], fcc[3])
+#define MSFCC(fcc) MP4RA(fcc)
+
+FormatNamespace::FormatNamespace(const std::string &codec)
+{
+ es_format_Init(&fmt, UNKNOWN_ES, 0);
+ ParseString(codec);
+}
+
+FormatNamespace::~FormatNamespace()
+{
+ es_format_Clean(&fmt);
+}
+
+const es_format_t * FormatNamespace::getFmt() const
+{
+ return &fmt;
+}
+
+void FormatNamespace::ParseMPEG4Elements(const std::vector<std::string> &elements)
+{
+ /* As described in RFC 6381 3.3 */
+ if(elements.size() < 1)
+ return;
+
+ uint8_t objectType = std::stoi(elements.at(0).substr(0,1), nullptr, 16);
+ if(!MPEG4_Codec_By_ObjectType(objectType, NULL, 0,
+ &fmt.i_codec,
+ &fmt.i_profile))
+ return;
+
+ switch(objectType)
+ {
+ case 0x40:
+ if(elements.size() > 1)
+ fmt.i_profile = std::stoi(elements.at(1).substr(0,1), nullptr, 16);
+ break;
+ default:
+ break;
+ }
+}
+
+void FormatNamespace::ParseString(const std::string &codecstring)
+{
+ std::list<std::string> tokens = Helper::tokenize(codecstring, '.');
+ if(tokens.empty())
+ return;
+
+ std::string fourcc = tokens.front();
+ if(fourcc.size() != 4)
+ return;
+
+ tokens.pop_front();
+ std::vector<std::string> elements;
+ elements.assign(tokens.begin(), tokens.end());
+
+ Parse(MP4RA(fourcc), elements);
+}
+
+void FormatNamespace::Parse(vlc_fourcc_t fcc, const std::vector<std::string> &elements)
+{
+ switch(fcc)
+ {
+ /* VIDEO */
+ case MP4RA("mp4v"):
+ /* set default if no elements */
+ es_format_Change(&fmt, AUDIO_ES, VLC_CODEC_MP4V);
+ ParseMPEG4Elements(elements);
+ break;
+ case MP4RA("avc1"):
+ case MP4RA("avc2"):
+ case MP4RA("avc3"):
+ case MP4RA("avc4"):
+ case MP4RA("svc1"):
+ case MP4RA("mvc1"):
+ case MP4RA("mvc2"):
+ es_format_Change(&fmt, VIDEO_ES, VLC_CODEC_H264);
+ if(elements.size() > 0 && elements.at(0).size() == 6)
+ {
+ const std::string &sixbytes = elements.at(0);
+ fmt.i_profile = std::stoi(sixbytes.substr(0,2), nullptr, 16);
+ fmt.i_level = std::stoi(sixbytes.substr(2,2), nullptr, 16);
+ }
+ break;
+ case MP4RA("hev1"):
+ case MP4RA("hev2"):
+ case MP4RA("hevc"):
+ case MP4RA("hvc1"):
+ case MP4RA("hvc2"):
+ case MP4RA("hvt1"):
+ case MP4RA("lhv1"):
+ case MP4RA("lhe1"):
+ es_format_Change(&fmt, VIDEO_ES, VLC_CODEC_HEVC);
+ break;
+ case MP4RA("av01"):
+ es_format_Change(&fmt, VIDEO_ES, VLC_CODEC_AV1);
+ if(elements.size() > 1)
+ {
+ fmt.i_profile = std::stoi(elements.at(0), nullptr, 16);
+ fmt.i_level = std::stoi(elements.at(1), nullptr, 16);
+ }
+ break;
+ case MP4RA("vp09"):
+ case MP4RA("vp08"):
+ es_format_Change(&fmt, VIDEO_ES, vlc_fourcc_GetCodec(VIDEO_ES, fcc));
+ break;
+ case MSFCC("AVC1"):
+ case MSFCC("AVCB"):
+ case MSFCC("H264"):
+ es_format_Change(&fmt, VIDEO_ES, VLC_CODEC_H264);
+ fmt.i_original_fourcc = VLC_FOURCC( 'a', 'v', 'c', '1' );
+ break;
+ case MSFCC("WVC1"):
+ es_format_Change(&fmt, VIDEO_ES, VLC_CODEC_VC1);
+ break;
+ /* AUDIO */
+ case MP4RA("mp4a"):
+ /* set default if no elements */
+ es_format_Change(&fmt, AUDIO_ES, VLC_CODEC_MP4A);
+ ParseMPEG4Elements(elements);
+ break;
+ case MP4RA("dtsh"):
+ case MP4RA("ac-3"):
+ case MP4RA("ec-3"):
+ case MP4RA("opus"):
+ es_format_Change(&fmt, AUDIO_ES, vlc_fourcc_GetCodec(AUDIO_ES, fcc));
+ break;
+ case MSFCC("AACL"):
+ es_format_Change(&fmt, AUDIO_ES, VLC_CODEC_MP4A);
+ fmt.i_profile = AAC_PROFILE_LC;
+ break;
+ case MSFCC("WMAP"):
+ es_format_Change(&fmt, AUDIO_ES, VLC_CODEC_WMAP);
+ break;
+ /* SUBTITLES */
+ case MP4RA("stpp"):
+ case MSFCC("TTML"):
+ es_format_Change(&fmt, SPU_ES, VLC_CODEC_TTML);
+ break;
+ case MP4RA("wvtt"):
+ es_format_Change(&fmt, SPU_ES, VLC_CODEC_WEBVTT);
+ break;
+ default: /* dumb and probably broken lookup as fcc ~~ mp4ra */
+// {
+// const enum es_format_category_e cats[] = { VIDEO_ES, AUDIO_ES, SPU_ES };
+// for(size_t i=0; i < ARRAY_SIZE(cats); i++)
+// {
+// vlc_fourcc_t rfcc = vlc_fourcc_GetCodec(cats[i], fcc);
+// if(rfcc)
+// {
+// printf("%4.4s --> %4.4s %d\n", &rfcc, &fcc, cats[i]);
+// es_format_Change(&fmt, cats[i], rfcc);
+// break;
+// }
+// }
+// }
+ break;
+ }
+}
diff --git a/modules/demux/adaptive/tools/FormatNamespace.hpp b/modules/demux/adaptive/tools/FormatNamespace.hpp
new file mode 100644
index 0000000000..6c4783c924
--- /dev/null
+++ b/modules/demux/adaptive/tools/FormatNamespace.hpp
@@ -0,0 +1,45 @@
+/*
+ * FormatNameSpace.hpp
+ *****************************************************************************
+ * Copyright © 2019 VideoLabs, VideoLAN and VLC Authors
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation; either version 2.1 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
+ *****************************************************************************/
+#ifndef FORMATNAMESPACE_HPP_
+#define FORMATNAMESPACE_HPP_
+
+#include <vlc_common.h>
+#include <vlc_es.h>
+#include <vector>
+#include <string>
+
+namespace adaptive
+{
+ class FormatNamespace
+ {
+ public:
+ FormatNamespace(const std::string &);
+ ~FormatNamespace();
+ const es_format_t * getFmt() const;
+
+ private:
+ void ParseString(const std::string &);
+ void Parse(vlc_fourcc_t, const std::vector<std::string> &);
+ void ParseMPEG4Elements(const std::vector<std::string> &);
+ es_format_t fmt;
+ };
+}
+
+#endif
More information about the vlc-commits
mailing list