We truncated the diff of some files because they were too big.
If you want to see the full diff for every file, click here.
Changes of Revision 165
_service:obs_scm:vlc-beta-20220120.44414977b8.obscpio/contrib/src/ebml/missing-limits-include.patch
Added
x
1
2
+From f0bfd53647961e799a43d918c46cf3b6bff89806 Mon Sep 17 00:00:00 2001
3
+From: Moritz Bunkus <mo@bunkus.online>
4
+Date: Sat, 27 Feb 2021 20:36:52 +0100
5
+Subject: [PATCH] include appropriate header files for std::numeric_limits
6
+
7
+Fixes #80.
8
+---
9
+ ChangeLog | 4 ++++
10
+ src/EbmlString.cpp | 1 +
11
+ src/EbmlUnicodeString.cpp | 1 +
12
+ 3 files changed, 6 insertions(+)
13
+
14
+diff --git a/src/EbmlString.cpp b/src/EbmlString.cpp
15
+index 27e55fd..4c05fcf 100644
16
+--- a/src/EbmlString.cpp
17
++++ b/src/EbmlString.cpp
18
+@@ -34,6 +34,7 @@
19
+ \author Steve Lhomme <robux4 @ users.sf.net>
20
+ */
21
+ #include <cassert>
22
++#include <limits>
23
+
24
+ #include "ebml/EbmlString.h"
25
+
26
+diff --git a/src/EbmlUnicodeString.cpp b/src/EbmlUnicodeString.cpp
27
+index 496a16a..99fc073 100644
28
+--- a/src/EbmlUnicodeString.cpp
29
++++ b/src/EbmlUnicodeString.cpp
30
+@@ -36,6 +36,7 @@
31
+ */
32
+
33
+ #include <cassert>
34
++#include <limits>
35
+
36
+ #include "ebml/EbmlUnicodeString.h"
37
+
38
_service:obs_scm:vlc-beta-20220119.f850dd9155.obscpio/contrib/src/ebml/rules.mak -> _service:obs_scm:vlc-beta-20220120.44414977b8.obscpio/contrib/src/ebml/rules.mak
Changed
9
1
2
3
ebml: libebml-$(EBML_VERSION).tar.xz .sum-ebml
4
$(UNPACK)
5
+ $(APPLY) $(SRC)/ebml/missing-limits-include.patch
6
$(MOVE)
7
8
.ebml: ebml toolchain.cmake
9
_service:obs_scm:vlc-beta-20220119.f850dd9155.obscpio/contrib/src/main.mak -> _service:obs_scm:vlc-beta-20220120.44414977b8.obscpio/contrib/src/main.mak
Changed
10
1
2
ifdef HAVE_DARWIN_OS
3
AUTORECONF = AUTOPOINT=true autoreconf
4
else
5
-AUTORECONF = autoreconf
6
+AUTORECONF = GTKDOCIZE=true autoreconf
7
endif
8
RECONF = mkdir -p -- $(PREFIX)/share/aclocal && \
9
cd $< && $(AUTORECONF) -fiv $(ACLOCAL_AMFLAGS)
10
_service:obs_scm:vlc-beta-20220120.44414977b8.obscpio/contrib/src/qt/qt-fix-gcc11-build.patch
Added
32
1
2
+--- qt/src/corelib/global/qfloat16.h.old 2022-01-18 17:46:03.821787862 +0100
3
++++ qt/src/corelib/global/qfloat16.h 2022-01-18 17:46:52.824906487 +0100
4
+@@ -44,6 +44,7 @@
5
+ #include <QtCore/qglobal.h>
6
+ #include <QtCore/qmetatype.h>
7
+ #include <string.h>
8
++#include <limits>
9
+
10
+ #if defined(QT_COMPILER_SUPPORTS_F16C) && defined(__AVX2__) && !defined(__F16C__)
11
+ // All processors that support AVX2 do support F16C too. That doesn't mean
12
+--- qt/src/corelib/text/qbytearraymatcher.h.old 2022-01-18 17:47:49.667887059 +0100
13
++++ qt/src/corelib/text/qbytearraymatcher.h 2022-01-18 17:48:09.055540031 +0100
14
+@@ -41,6 +41,7 @@
15
+ #define QBYTEARRAYMATCHER_H
16
+
17
+ #include <QtCore/qbytearray.h>
18
++#include <limits>
19
+
20
+ QT_BEGIN_NAMESPACE
21
+
22
+--- qt/src/3rdparty/angle/src/libANGLE/HandleAllocator.cpp.old 2022-01-18 17:55:16.527952044 +0100
23
++++ qt/src/3rdparty/angle/src/libANGLE/HandleAllocator.cpp 2022-01-18 17:55:28.315744081 +0100
24
+@@ -10,6 +10,7 @@
25
+ #include "libANGLE/HandleAllocator.h"
26
+
27
+ #include <algorithm>
28
++#include <limits>
29
+
30
+ #include "common/debug.h"
31
+
32
_service:obs_scm:vlc-beta-20220119.f850dd9155.obscpio/contrib/src/qt/rules.mak -> _service:obs_scm:vlc-beta-20220120.44414977b8.obscpio/contrib/src/qt/rules.mak
Changed
9
1
2
cd $(UNPACK_DIR); for i in QtFontDatabaseSupport QtWindowsUIAutomationSupport QtEventDispatcherSupport QtCore; do \
3
sed -i -e 's,"../../../../../src,"../src,g' include/$$i/$(QT_VERSION)/$$i/private/*.h; done
4
endif
5
+ $(APPLY) $(SRC)/qt/qt-fix-gcc11-build.patch
6
7
endif
8
$(MOVE)
9
_service:obs_scm:vlc-beta-20220120.44414977b8.obscpio/contrib/src/qtdeclarative/fix-gcc11-build.patch
Added
13
1
2
+--- qtdeclarative/src/3rdparty/masm/yarr/Yarr.h.old 2022-01-18 18:04:29.778230868 +0100
3
++++ qtdeclarative/src/3rdparty/masm/yarr/Yarr.h 2022-01-18 18:04:57.625743037 +0100
4
+@@ -27,7 +27,7 @@
5
+
6
+ #pragma once
7
+
8
+-#include <limits.h>
9
++#include <limits>
10
+ #include "YarrErrorCode.h"
11
+
12
+ namespace JSC { namespace Yarr {
13
_service:obs_scm:vlc-beta-20220119.f850dd9155.obscpio/contrib/src/qtdeclarative/rules.mak -> _service:obs_scm:vlc-beta-20220120.44414977b8.obscpio/contrib/src/qtdeclarative/rules.mak
Changed
9
1
2
3
qtdeclarative: qtdeclarative-everywhere-src-$(QTDECLARATIVE_VERSION).tar.xz .sum-qtdeclarative
4
$(UNPACK)
5
+ $(APPLY) $(SRC)/qtdeclarative/fix-gcc11-build.patch
6
$(MOVE)
7
8
QT_DECLARATIVE_CONFIG := \
9
_service:obs_scm:vlc-beta-20220120.44414977b8.obscpio/contrib/src/srt/fix-gcc11-build.patch
Added
24
1
2
+From f1b35cbf5b9b42b031e9b119e4c802b5f744468c Mon Sep 17 00:00:00 2001
3
+From: Christophe Giboudeaux <krop@users.noreply.github.com>
4
+Date: Wed, 10 Feb 2021 12:42:45 +0000
5
+Subject: [PATCH] [core] Fix build with GCC 11. (#1806)
6
+
7
+The 'limits' header must be included explicitly.
8
+---
9
+ srtcore/sync.h | 1 +
10
+ 1 file changed, 1 insertion(+)
11
+
12
+diff --git a/srtcore/sync.h b/srtcore/sync.h
13
+index 59c125a75..9f01ca91e 100644
14
+--- a/srtcore/sync.h
15
++++ b/srtcore/sync.h
16
+@@ -15,6 +15,7 @@
17
+ //#define ENABLE_CXX17
18
+
19
+ #include <cstdlib>
20
++#include <limits>
21
+ #ifdef ENABLE_STDCXX_SYNC
22
+ #include <chrono>
23
+ #include <thread>
24
_service:obs_scm:vlc-beta-20220119.f850dd9155.obscpio/contrib/src/srt/rules.mak -> _service:obs_scm:vlc-beta-20220120.44414977b8.obscpio/contrib/src/srt/rules.mak
Changed
9
1
2
srt: srt-$(SRT_VERSION).tar.gz .sum-srt
3
$(UNPACK)
4
$(APPLY) $(SRC)/srt/0001-core-ifdef-MSG_TRUNC-nixes-fix.patch
5
+ $(APPLY) $(SRC)/srt/fix-gcc11-build.patch
6
$(call pkg_static,"scripts/srt.pc.in")
7
mv srt-$(SRT_VERSION) $@ && touch $@
8
9
_service:obs_scm:vlc-beta-20220119.f850dd9155.obscpio/include/vlc_config_cat.h -> _service:obs_scm:vlc-beta-20220120.44414977b8.obscpio/include/vlc_config_cat.h
Changed
108
1
2
3
struct config_category_t
4
{
5
- int id;
6
- int general_subcat;
7
+ enum vlc_config_cat id;
8
+ enum vlc_config_subcat general_subcat;
9
const char *help;
10
};
11
12
struct config_subcategory_t
13
{
14
- int id;
15
- int cat;
16
+ enum vlc_config_subcat id;
17
+ enum vlc_config_cat cat;
18
const char *name;
19
const char *help;
20
};
21
22
23
/** Get the table index for the given category entry. */
24
VLC_USED
25
-static inline int vlc_config_cat_IndexOf( int cat )
26
+static inline int vlc_config_cat_IndexOf( enum vlc_config_cat cat )
27
{
28
int index = -1;
29
for( unsigned i = 0; i < ARRAY_SIZE(categories_array); i++ )
30
31
32
/** Get the table index for the given subcategory entry. */
33
VLC_USED
34
-static inline int vlc_config_subcat_IndexOf( int subcat )
35
+static inline int vlc_config_subcat_IndexOf( enum vlc_config_subcat subcat )
36
{
37
int index = -1;
38
for( unsigned i = 0; i < ARRAY_SIZE(subcategories_array); i++ )
39
40
* a child node of a subcategory node.
41
*/
42
VLC_USED
43
-static inline int vlc_config_cat_GetGeneralSubcat( int cat )
44
+static inline enum vlc_config_subcat vlc_config_cat_GetGeneralSubcat( enum vlc_config_cat cat )
45
{
46
int i = vlc_config_cat_IndexOf( cat );
47
return (i != -1) ? categories_array[i].general_subcat : SUBCAT_UNKNOWN;
48
49
50
/** Get the name for a subcategory. */
51
VLC_USED
52
-static inline const char *vlc_config_subcat_GetName( int subcat )
53
+static inline const char *vlc_config_subcat_GetName( enum vlc_config_subcat subcat )
54
{
55
int i = vlc_config_subcat_IndexOf( subcat );
56
return (i != -1) ? vlc_gettext(subcategories_array[i].name) : NULL;
57
58
59
/** Get the help text for a subcategory. */
60
VLC_USED
61
-static inline const char *vlc_config_subcat_GetHelp( int subcat )
62
+static inline const char *vlc_config_subcat_GetHelp( enum vlc_config_subcat subcat )
63
{
64
int i = vlc_config_subcat_IndexOf( subcat );
65
return (i != -1) ? vlc_gettext(subcategories_array[i].help) : NULL;
66
67
68
/** Get the name for a category. */
69
VLC_USED
70
-static inline const char *vlc_config_cat_GetName( int cat )
71
+static inline const char *vlc_config_cat_GetName( enum vlc_config_cat cat )
72
{
73
- int subcat = vlc_config_cat_GetGeneralSubcat( cat );
74
+ enum vlc_config_subcat subcat = vlc_config_cat_GetGeneralSubcat( cat );
75
return vlc_config_subcat_GetName( subcat );
76
}
77
78
/** Get the help text for a category. */
79
VLC_USED
80
-static inline const char *vlc_config_cat_GetHelp( int cat )
81
+static inline const char *vlc_config_cat_GetHelp( enum vlc_config_cat cat )
82
{
83
int i = vlc_config_cat_IndexOf( cat );
84
return (i != -1) ? vlc_gettext(categories_array[i].help) : NULL;
85
86
87
/** Get the parent category for the given subcategory. */
88
VLC_USED
89
-static inline int vlc_config_cat_FromSubcat( int subcat )
90
+static inline enum vlc_config_cat vlc_config_cat_FromSubcat( enum vlc_config_subcat subcat )
91
{
92
int i = vlc_config_subcat_IndexOf( subcat );
93
return (i != -1) ? subcategories_array[i].cat : CAT_UNKNOWN;
94
95
96
/** Check if the given subcategory is a "general" one. */
97
VLC_USED
98
-static inline bool vlc_config_subcat_IsGeneral( int subcat )
99
+static inline bool vlc_config_subcat_IsGeneral( enum vlc_config_subcat subcat )
100
{
101
if( subcat == SUBCAT_UNKNOWN )
102
return false;
103
- int cat = vlc_config_cat_FromSubcat( subcat );
104
+ enum vlc_config_cat cat = vlc_config_cat_FromSubcat( subcat );
105
return (subcat == vlc_config_cat_GetGeneralSubcat( cat ));
106
}
107
108
_service:obs_scm:vlc-beta-20220119.f850dd9155.obscpio/include/vlc_plugin.h -> _service:obs_scm:vlc-beta-20220120.44414977b8.obscpio/include/vlc_plugin.h
Changed
134
1
2
#define IsConfigFloatType(type) \
3
((type) == CONFIG_ITEM_FLOAT)
4
5
-/* Hidden categories and subcategories */
6
-/* Any options under this will be hidden in the GUI preferences, but will be
7
- listed in cmdline help output. */
8
-#define CAT_HIDDEN -1
9
-#define SUBCAT_HIDDEN -1
10
-
11
-/* Unknown/unset/invalid */
12
-#define CAT_UNKNOWN 0
13
-#define SUBCAT_UNKNOWN 0
14
-
15
-/* Categories and subcategories */
16
-#define CAT_INTERFACE 1
17
-#define SUBCAT_INTERFACE_GENERAL 101
18
-#define SUBCAT_INTERFACE_MAIN 102
19
-#define SUBCAT_INTERFACE_CONTROL 103
20
-#define SUBCAT_INTERFACE_HOTKEYS 104
21
-
22
-#define CAT_AUDIO 2
23
-#define SUBCAT_AUDIO_GENERAL 201
24
-#define SUBCAT_AUDIO_AOUT 202
25
-#define SUBCAT_AUDIO_AFILTER 203
26
-#define SUBCAT_AUDIO_VISUAL 204
27
-#define SUBCAT_AUDIO_RESAMPLER 206
28
-
29
-#define CAT_VIDEO 3
30
-#define SUBCAT_VIDEO_GENERAL 301
31
-#define SUBCAT_VIDEO_VOUT 302
32
-#define SUBCAT_VIDEO_VFILTER 303
33
-#define SUBCAT_VIDEO_SUBPIC 305
34
-#define SUBCAT_VIDEO_SPLITTER 306
35
-
36
-#define CAT_INPUT 4
37
-#define SUBCAT_INPUT_GENERAL 401
38
-#define SUBCAT_INPUT_ACCESS 402
39
-#define SUBCAT_INPUT_DEMUX 403
40
-#define SUBCAT_INPUT_VCODEC 404
41
-#define SUBCAT_INPUT_ACODEC 405
42
-#define SUBCAT_INPUT_SCODEC 406
43
-#define SUBCAT_INPUT_STREAM_FILTER 407
44
-
45
-#define CAT_SOUT 5
46
-#define SUBCAT_SOUT_GENERAL 501
47
-#define SUBCAT_SOUT_STREAM 502
48
-#define SUBCAT_SOUT_MUX 503
49
-#define SUBCAT_SOUT_ACO 504
50
-#define SUBCAT_SOUT_PACKETIZER 505
51
-#define SUBCAT_SOUT_VOD 507
52
-#define SUBCAT_SOUT_RENDERER 508
53
-
54
-#define CAT_ADVANCED 6
55
-#define SUBCAT_ADVANCED_MISC 602
56
-#define SUBCAT_ADVANCED_NETWORK 603
57
-
58
-#define CAT_PLAYLIST 7
59
-#define SUBCAT_PLAYLIST_GENERAL 701
60
-#define SUBCAT_PLAYLIST_SD 702
61
-#define SUBCAT_PLAYLIST_EXPORT 703
62
+/* Config category */
63
+enum vlc_config_cat
64
+{
65
+ /* Hidden category.
66
+ Any options under this will be hidden in the GUI preferences, but will
67
+ be listed in cmdline help output. */
68
+ CAT_HIDDEN = -1,
69
+
70
+ CAT_UNKNOWN = 0,
71
+
72
+ CAT_INTERFACE = 1,
73
+ CAT_AUDIO = 2,
74
+ CAT_VIDEO = 3,
75
+ CAT_INPUT = 4,
76
+ CAT_SOUT = 5,
77
+ CAT_ADVANCED = 6,
78
+ CAT_PLAYLIST = 7,
79
+};
80
81
+/* Config subcategory */
82
+enum vlc_config_subcat
83
+{
84
+ /* Hidden subcategory.
85
+ Any options under this will be hidden in the GUI preferences, but will
86
+ be listed in cmdline help output. */
87
+ SUBCAT_HIDDEN = -1,
88
+
89
+ SUBCAT_UNKNOWN = 0,
90
+
91
+ SUBCAT_INTERFACE_GENERAL = 101,
92
+ SUBCAT_INTERFACE_MAIN = 102,
93
+ SUBCAT_INTERFACE_CONTROL = 103,
94
+ SUBCAT_INTERFACE_HOTKEYS = 104,
95
+
96
+ SUBCAT_AUDIO_GENERAL = 201,
97
+ SUBCAT_AUDIO_AOUT = 202,
98
+ SUBCAT_AUDIO_AFILTER = 203,
99
+ SUBCAT_AUDIO_VISUAL = 204,
100
+ SUBCAT_AUDIO_RESAMPLER = 206,
101
+
102
+ SUBCAT_VIDEO_GENERAL = 301,
103
+ SUBCAT_VIDEO_VOUT = 302,
104
+ SUBCAT_VIDEO_VFILTER = 303,
105
+ SUBCAT_VIDEO_SUBPIC = 305,
106
+ SUBCAT_VIDEO_SPLITTER = 306,
107
+
108
+ SUBCAT_INPUT_GENERAL = 401,
109
+ SUBCAT_INPUT_ACCESS = 402,
110
+ SUBCAT_INPUT_DEMUX = 403,
111
+ SUBCAT_INPUT_VCODEC = 404,
112
+ SUBCAT_INPUT_ACODEC = 405,
113
+ SUBCAT_INPUT_SCODEC = 406,
114
+ SUBCAT_INPUT_STREAM_FILTER = 407,
115
+
116
+ SUBCAT_SOUT_GENERAL = 501,
117
+ SUBCAT_SOUT_STREAM = 502,
118
+ SUBCAT_SOUT_MUX = 503,
119
+ SUBCAT_SOUT_ACO = 504,
120
+ SUBCAT_SOUT_PACKETIZER = 505,
121
+ SUBCAT_SOUT_VOD = 507,
122
+ SUBCAT_SOUT_RENDERER = 508,
123
+
124
+ SUBCAT_ADVANCED_MISC = 602,
125
+ SUBCAT_ADVANCED_NETWORK = 603,
126
+
127
+ SUBCAT_PLAYLIST_GENERAL = 701,
128
+ SUBCAT_PLAYLIST_SD = 702,
129
+ SUBCAT_PLAYLIST_EXPORT = 703,
130
+};
131
132
/**
133
* Current plugin ABI version
134
_service:obs_scm:vlc-beta-20220119.f850dd9155.obscpio/modules/codec/avcodec/video.c -> _service:obs_scm:vlc-beta-20220120.44414977b8.obscpio/modules/codec/avcodec/video.c
Changed
11
1
2
i_thread_count = __MIN( i_thread_count, p_codec->id == AV_CODEC_ID_HEVC ? 32 : 16 );
3
msg_Dbg( p_dec, "allowing %d thread(s) for decoding", i_thread_count );
4
p_context->thread_count = i_thread_count;
5
+#if LIBAVCODEC_VERSION_MAJOR < 60
6
p_context->thread_safe_callbacks = true;
7
+#endif
8
9
switch( p_codec->id )
10
{
11
_service:obs_scm:vlc-beta-20220119.f850dd9155.obscpio/modules/demux/Makefile.am -> _service:obs_scm:vlc-beta-20220120.44414977b8.obscpio/modules/demux/Makefile.am
Changed
11
1
2
libnsv_plugin_la_SOURCES = demux/nsv.c
3
demux_LTLIBRARIES += libnsv_plugin.la
4
5
+libhx_plugin_la_SOURCES = demux/hx.c
6
+demux_LTLIBRARIES += libhx_plugin.la
7
+
8
libps_plugin_la_SOURCES = demux/mpeg/ps.c demux/mpeg/ps.h demux/mpeg/pes.h
9
demux_LTLIBRARIES += libps_plugin.la
10
11
_service:obs_scm:vlc-beta-20220120.44414977b8.obscpio/modules/demux/hx.c
Added
201
1
2
+/*****************************************************************************
3
+ * hx.c : raw video / audio IP cam demuxer
4
+ *****************************************************************************
5
+ * Copyright (C) 2022 - VideoLabs, VLC authors and VideoLAN
6
+ *
7
+ * This program is free software; you can redistribute it and/or modify it
8
+ * under the terms of the GNU Lesser General Public License as published by
9
+ * the Free Software Foundation; either version 2.1 of the License, or
10
+ * (at your option) any later version.
11
+ *
12
+ * This program is distributed in the hope that it will be useful,
13
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ * GNU Lesser General Public License for more details.
16
+ *
17
+ * You should have received a copy of the GNU Lesser General Public License
18
+ * along with this program; if not, write to the Free Software Foundation,
19
+ * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
20
+ *****************************************************************************/
21
+#ifdef HAVE_CONFIG_H
22
+# include "config.h"
23
+#endif
24
+
25
+#include <vlc_common.h>
26
+#include <vlc_plugin.h>
27
+#include <vlc_demux.h>
28
+
29
+/* All Marker formats:
30
+ * [tag.4][size.4][tag dependant.8] */
31
+static const char HXVS[4] = { 'H', 'X', 'V', 'S' }; /* H264 file tag */
32
+static const char HXVT[4] = { 'H', 'X', 'V', 'T' }; /* HEVC */
33
+static const char HXVF[4] = { 'H', 'X', 'V', 'F' }; /* Video samples */
34
+static const char HXAF[4] = { 'H', 'X', 'A', 'F' }; /* Audio samples */
35
+static const char HXFI[4] = { 'H', 'X', 'F', 'I' }; /* RAP Index */
36
+
37
+#define HX_HEADER_SIZE 16
38
+#define HX_INDEX_SIZE 200000
39
+
40
+struct hxfi_index
41
+{
42
+ uint32_t offset;
43
+ uint32_t time;
44
+};
45
+
46
+typedef struct
47
+{
48
+ es_out_id_t *p_es_video;
49
+ es_out_id_t *p_es_audio;
50
+ vlc_tick_t video_pts;
51
+ vlc_tick_t audio_pts;
52
+ vlc_tick_t pcr;
53
+ uint32_t video_pts_offset;
54
+ uint32_t audio_pts_offset;
55
+ uint32_t duration;
56
+ DECL_ARRAY(struct hxfi_index) index;
57
+} hx_sys_t;
58
+
59
+static int LoadIndex(demux_t *p_demux)
60
+{
61
+ hx_sys_t *p_sys = p_demux->p_sys;
62
+
63
+ /* From what I understand:
64
+ * Header HXFI[size.4][duration.4][?.4]
65
+ * Size is always 200K, predictable file offset
66
+ * All indexes entries are 4/4 bytes
67
+ * zero filled empty entries
68
+ */
69
+
70
+ uint64_t size;
71
+ if(vlc_stream_GetSize(p_demux->s, &size) != VLC_SUCCESS ||
72
+ size < HX_INDEX_SIZE + HX_HEADER_SIZE)
73
+ return VLC_EGENERIC;
74
+
75
+ if(vlc_stream_Seek(p_demux->s, size - HX_INDEX_SIZE - HX_HEADER_SIZE) != VLC_SUCCESS)
76
+ return VLC_EGENERIC;
77
+
78
+ uint8_t temp[HX_HEADER_SIZE];
79
+ if(vlc_stream_Read(p_demux->s, temp, HX_HEADER_SIZE) != HX_HEADER_SIZE ||
80
+ memcmp(temp, HXFI, 4))
81
+ {
82
+ msg_Warn(p_demux, "Could not find index at expected location");
83
+ return VLC_EGENERIC;
84
+ }
85
+
86
+ p_sys->duration = GetDWLE(temp + 8);
87
+ msg_Dbg(p_demux, "Reading Index Length @%" PRIu32 "ms", p_sys->duration);
88
+
89
+ uint32_t prevtime = UINT32_MAX;
90
+ for(;;)
91
+ {
92
+ if(vlc_stream_Read(p_demux->s, temp, 8) != 8)
93
+ break;
94
+ struct hxfi_index entry;
95
+ entry.offset = GetDWLE(temp);
96
+ entry.time = GetDWLE(temp + 4);
97
+ if(entry.offset == 0)
98
+ break;
99
+ if(entry.time != prevtime)
100
+ {
101
+ prevtime = entry.time;
102
+ ARRAY_APPEND(p_sys->index, entry);
103
+ }
104
+ }
105
+ msg_Dbg(p_demux, "Using %d entries from HXFI index", p_sys->index.i_size);
106
+ return VLC_SUCCESS;
107
+}
108
+
109
+static struct hxfi_index LookupIndex(hx_sys_t *p_sys, uint32_t time)
110
+{
111
+ struct hxfi_index entry = { 0, 0 };
112
+ if(p_sys->index.i_size)
113
+ {
114
+ unsigned l = 0, h = p_sys->index.i_size - 1;
115
+ while(l <= h)
116
+ {
117
+ unsigned m = (l + h) >> 1;
118
+ if(p_sys->index.p_elems[m].time > time)
119
+ {
120
+ if(m == 0)
121
+ break;
122
+ h = m -1;
123
+ }
124
+ else
125
+ {
126
+ /* store lowest as temp result */
127
+ entry = p_sys->index.p_elems[m];
128
+ if(entry.time == time)
129
+ break;
130
+ l = m + 1;
131
+ }
132
+ };
133
+ }
134
+ return entry;
135
+}
136
+
137
+static int Demux(demux_t *p_demux)
138
+{
139
+ hx_sys_t *p_sys = p_demux->p_sys;
140
+
141
+ uint8_t header[HX_HEADER_SIZE];
142
+ if(vlc_stream_Read(p_demux->s, header, HX_HEADER_SIZE) != HX_HEADER_SIZE)
143
+ return VLC_DEMUXER_EOF;
144
+
145
+ es_out_id_t *es = NULL;
146
+ vlc_tick_t *ppts;
147
+ uint32_t *ppts_offset;
148
+
149
+ if(!memcmp(header, HXVF, 4))
150
+ {
151
+ es = p_sys->p_es_video;
152
+ ppts = &p_sys->video_pts;
153
+ ppts_offset = &p_sys->video_pts_offset;
154
+ }
155
+ else if(!memcmp(header, HXAF, 4))
156
+ {
157
+ es = p_sys->p_es_audio;
158
+ ppts = &p_sys->audio_pts;
159
+ ppts_offset = &p_sys->audio_pts_offset;
160
+ }
161
+ else if(!memcmp(header, HXVS, 4) || !memcmp(header, HXVT, 4))
162
+ {
163
+ return VLC_DEMUXER_SUCCESS;
164
+ }
165
+ else
166
+ {
167
+ msg_Dbg(p_demux, "EOF on %4.4s", (const char *) header);
168
+ return VLC_DEMUXER_EOF;
169
+ }
170
+
171
+ uint32_t sz = GetDWLE(header + 4);
172
+ int i_ret = VLC_DEMUXER_SUCCESS;
173
+
174
+ if(es)
175
+ {
176
+ /* [HXAF.4][size.4][pts.4][?.4] */
177
+ /* [HXVF.4][size.4][pts.4][?.4] */
178
+ *ppts = VLC_TICK_0;
179
+ if(*ppts_offset != UINT32_MAX)
180
+ *ppts += VLC_TICK_FROM_MS(GetDWLE(&header[8]) - *ppts_offset);
181
+ else
182
+ *ppts_offset = GetDWLE(&header[8]);
183
+
184
+ block_t *p_block = vlc_stream_Block(p_demux->s, sz);
185
+ if(p_block == NULL)
186
+ return VLC_DEMUXER_EOF;
187
+
188
+ if(p_block->i_buffer < sz)
189
+ i_ret = VLC_DEMUXER_EOF;
190
+
191
+ if(p_sys->p_es_audio == es)
192
+ {
193
+ /* HXAF sample format prefix [?.1/channels.1/rate.1/?.1] */
194
+ const uint8_t audioprefix[4] = {0x00, 0x01, 0x50, 0x00};
195
+ if(p_block->i_buffer >= 4 &&
196
+ !memcmp(p_block->p_buffer, audioprefix, 4))
197
+ {
198
+ p_block->i_buffer -= 4;
199
+ p_block->p_buffer += 4;
200
+ }
201
_service:obs_scm:vlc-beta-20220119.f850dd9155.obscpio/modules/gui/macosx/preferences/prefs.m -> _service:obs_scm:vlc-beta-20220120.44414977b8.obscpio/modules/gui/macosx/preferences/prefs.m
Changed
136
1
2
@interface VLCTreeBranchItem : VLCTreeItem
3
{
4
enum VLCTreeBranchType _branchType;
5
- int _category;
6
- int _subcategory;
7
+ enum vlc_config_cat _category;
8
+ enum vlc_config_subcat _subcategory;
9
/* for plugin type */
10
module_config_t * _configItems;
11
unsigned int _configSize;
12
}
13
-+ (VLCTreeBranchItem *)newCategoryTreeBranch:(int)category;
14
-+ (VLCTreeBranchItem *)newSubcategoryTreeBranch:(int)subcategory;
15
++ (VLCTreeBranchItem *)newCategoryTreeBranch:(enum vlc_config_cat)category;
16
++ (VLCTreeBranchItem *)newSubcategoryTreeBranch:(enum vlc_config_subcat)subcategory;
17
+ (VLCTreeBranchItem *)newPluginTreeBranch:(module_t *)plugin;
18
19
-- (id)initWithCategory:(int)category;
20
-- (id)initWithSubcategory:(int)subcategory;
21
+- (id)initWithCategory:(enum vlc_config_cat)category;
22
+- (id)initWithSubcategory:(enum vlc_config_subcat)subcategory;
23
- (id)initWithPlugin:(module_t *)plugin;
24
25
-- (VLCTreeBranchItem *)childRepresentingSubcategory:(int)category;
26
+- (VLCTreeBranchItem *)childRepresentingSubcategory:(enum vlc_config_cat)category;
27
28
- (enum VLCTreeBranchType)branchType;
29
-- (int)category;
30
-- (int)subcategory;
31
+- (enum vlc_config_cat)category;
32
+- (enum vlc_config_subcat)subcategory;
33
- (module_config_t *)configItems;
34
- (unsigned int)configSize;
35
@end
36
37
{
38
module_config_t * _configItems;
39
}
40
-- (VLCTreeBranchItem *)childRepresentingCategory:(int)category;
41
+- (VLCTreeBranchItem *)childRepresentingCategory:(enum vlc_config_cat)category;
42
@end
43
44
#pragma mark -
45
46
#pragma mark -
47
@implementation VLCTreeMainItem
48
49
-- (VLCTreeBranchItem *)childRepresentingCategory:(int)category
50
+- (VLCTreeBranchItem *)childRepresentingCategory:(enum vlc_config_cat)category
51
{
52
NSUInteger childrenCount = [[self children] count];
53
for (int i = 0; i < childrenCount; i++) {
54
55
VLCTreeBranchItem * subcategoryItem = nil;
56
VLCTreeBranchItem * pluginItem = nil;
57
module_config_t *p_configs = NULL;
58
- int cat = CAT_UNKNOWN;
59
- int subcat = SUBCAT_UNKNOWN;
60
+ enum vlc_config_cat cat = CAT_UNKNOWN;
61
+ enum vlc_config_subcat subcat = SUBCAT_UNKNOWN;
62
bool subcat_is_general = false;
63
bool plugin_node_added = false;
64
bool pending_tree_node_creation = false;
65
66
int configType = p_configs[j].i_type;
67
68
if (configType == CONFIG_SUBCATEGORY) {
69
- subcat = (int) p_configs[j].value.i;
70
+ subcat = (enum vlc_config_subcat) p_configs[j].value.i;
71
cat = vlc_config_cat_FromSubcat(subcat);
72
subcat_is_general = vlc_config_subcat_IsGeneral(subcat);
73
pending_tree_node_creation = true;
74
75
76
#pragma mark -
77
@implementation VLCTreeBranchItem
78
-+ (VLCTreeBranchItem *)newCategoryTreeBranch:(int)category
79
++ (VLCTreeBranchItem *)newCategoryTreeBranch:(enum vlc_config_cat)category
80
{
81
if (!vlc_config_cat_GetName(category)) {
82
- msg_Err(getIntf(), "failed to get name for category %i", category);
83
+ msg_Err(getIntf(), "failed to get name for category %i", (int)category);
84
return nil;
85
}
86
return [[[self class] alloc] initWithCategory:category];
87
}
88
89
-+ (VLCTreeBranchItem *)newSubcategoryTreeBranch:(int)subcategory
90
++ (VLCTreeBranchItem *)newSubcategoryTreeBranch:(enum vlc_config_subcat)subcategory
91
{
92
if (!vlc_config_subcat_GetName(subcategory))
93
return nil;
94
95
return [[[self class] alloc] initWithPlugin:plugin];
96
}
97
98
-- (id)initWithCategory:(int)category
99
+- (id)initWithCategory:(enum vlc_config_cat)category
100
{
101
NSString * name = _NS(vlc_config_cat_GetName(category));
102
if (self = [super initWithName:name]) {
103
104
return self;
105
}
106
107
-- (id)initWithSubcategory:(int)subcategory
108
+- (id)initWithSubcategory:(enum vlc_config_subcat)subcategory
109
{
110
NSString * name = _NS(vlc_config_subcat_GetName(subcategory));
111
if (self = [super initWithName:name]) {
112
113
module_config_free(_configItems);
114
}
115
116
-- (VLCTreeBranchItem *)childRepresentingSubcategory:(int)subcategory
117
+- (VLCTreeBranchItem *)childRepresentingSubcategory:(enum vlc_config_subcat)subcategory
118
{
119
assert([self isKindOfClass:[VLCTreeBranchItem class]]);
120
NSUInteger childrenCount = [[self children] count];
121
122
return _branchType;
123
}
124
125
-- (int)category
126
+- (enum vlc_config_cat)category
127
{
128
return _category;
129
}
130
131
-- (int)subcategory
132
+- (enum vlc_config_subcat)subcategory
133
{
134
return _subcategory;
135
}
136
_service:obs_scm:vlc-beta-20220119.f850dd9155.obscpio/modules/gui/qt/dialogs/preferences/complete_preferences.cpp -> _service:obs_scm:vlc-beta-20220120.44414977b8.obscpio/modules/gui/qt/dialogs/preferences/complete_preferences.cpp
Changed
96
1
2
main_module = module_get_main();
3
assert( main_module );
4
5
- int cat = CAT_UNKNOWN;
6
- int subcat = SUBCAT_UNKNOWN;
7
+ enum vlc_config_cat cat = CAT_UNKNOWN;
8
+ enum vlc_config_subcat subcat = SUBCAT_UNKNOWN;
9
QTreeWidgetItem *cat_item = nullptr;
10
11
/* Create base cat/subcat tree from core config set */
12
13
if( p_item->i_type != CONFIG_SUBCATEGORY )
14
continue;
15
16
- subcat = p_item->value.i;
17
+ subcat = (enum vlc_config_subcat) p_item->value.i;
18
cat = vlc_config_cat_FromSubcat(subcat);
19
20
if( cat == CAT_UNKNOWN || cat == CAT_HIDDEN )
21
22
23
if( p_item->i_type == CONFIG_SUBCATEGORY )
24
{
25
- subcat = p_item->value.i;
26
+ subcat = (enum vlc_config_subcat) p_item->value.i;
27
cat = vlc_config_cat_FromSubcat( subcat );
28
continue;
29
}
30
31
resizeColumnToContents( 0 );
32
}
33
34
-QTreeWidgetItem *PrefsTree::createCatNode( int cat )
35
+QTreeWidgetItem *PrefsTree::createCatNode( enum vlc_config_cat cat )
36
{
37
- int general_subcat = vlc_config_cat_GetGeneralSubcat( cat );
38
+ enum vlc_config_subcat general_subcat = vlc_config_cat_GetGeneralSubcat( cat );
39
assert(general_subcat != SUBCAT_UNKNOWN && general_subcat != SUBCAT_HIDDEN);
40
41
PrefsTreeItem *item = new PrefsTreeItem( PrefsTreeItem::CATEGORY_NODE );
42
43
item->setIcon( 0, icon );
44
//current_item->setSizeHint( 0, QSize( -1, ITEM_HEIGHT ) );
45
46
- int cat_index = vlc_config_cat_IndexOf( cat );
47
- int general_subcat_index = vlc_config_subcat_IndexOf( general_subcat );
48
+ int cat_index = (int) vlc_config_cat_IndexOf( cat );
49
+ int general_subcat_index = (int) vlc_config_subcat_IndexOf( general_subcat );
50
this->catMap[cat_index] = item;
51
this->subcatMap[general_subcat_index] = item;
52
53
54
return item;
55
}
56
57
-QTreeWidgetItem *PrefsTree::createSubcatNode( QTreeWidgetItem * cat, int subcat )
58
+QTreeWidgetItem *PrefsTree::createSubcatNode( QTreeWidgetItem * cat, enum vlc_config_subcat subcat )
59
{
60
assert( cat );
61
62
63
item->setText( 0, item->name );
64
//item->setSizeHint( 0, QSize( -1, ITEM_HEIGHT ) );
65
66
- int subcat_index = vlc_config_subcat_IndexOf( subcat );
67
+ int subcat_index = (int) vlc_config_subcat_IndexOf( subcat );
68
this->subcatMap[subcat_index] = item;
69
70
cat->addChild( item );
71
72
parent->addChild( item );
73
}
74
75
-QTreeWidgetItem *PrefsTree::findCatItem( int cat )
76
+QTreeWidgetItem *PrefsTree::findCatItem( enum vlc_config_cat cat )
77
{
78
int cat_index = vlc_config_cat_IndexOf( cat );
79
return this->catMap[cat_index];
80
}
81
82
-QTreeWidgetItem *PrefsTree::findSubcatItem( int subcat )
83
+QTreeWidgetItem *PrefsTree::findSubcatItem( enum vlc_config_subcat subcat )
84
{
85
int subcat_index = vlc_config_subcat_IndexOf( subcat );
86
return this->subcatMap[subcat_index];
87
88
bool PrefsTreeItem::contains( const QString &text, Qt::CaseSensitivity cs )
89
{
90
bool is_core = this->node_type != PrefsTreeItem::PLUGIN_NODE;
91
- int id = this->subcat_id;
92
+ enum vlc_config_subcat id = this->subcat_id;
93
94
/* find our module */
95
module_t *p_module;
96
_service:obs_scm:vlc-beta-20220119.f850dd9155.obscpio/modules/gui/qt/dialogs/preferences/complete_preferences.hpp -> _service:obs_scm:vlc-beta-20220120.44414977b8.obscpio/modules/gui/qt/dialogs/preferences/complete_preferences.hpp
Changed
28
1
2
AdvPrefsPanel *panel;
3
QString name;
4
QString help;
5
- int cat_id;
6
- int subcat_id;
7
+ enum vlc_config_cat cat_id;
8
+ enum vlc_config_subcat subcat_id;
9
module_t *p_module;
10
char *module_name;
11
bool module_is_loaded;
12
13
}
14
15
private:
16
- QTreeWidgetItem *createCatNode( int cat );
17
- QTreeWidgetItem *createSubcatNode( QTreeWidgetItem * cat, int subcat );
18
+ QTreeWidgetItem *createCatNode( enum vlc_config_cat cat );
19
+ QTreeWidgetItem *createSubcatNode( QTreeWidgetItem * cat, enum vlc_config_subcat subcat );
20
void createPluginNode( QTreeWidgetItem * parent, module_t *mod );
21
- QTreeWidgetItem *findCatItem( int cat );
22
- QTreeWidgetItem *findSubcatItem( int subcat );
23
+ QTreeWidgetItem *findCatItem( enum vlc_config_cat cat );
24
+ QTreeWidgetItem *findSubcatItem( enum vlc_config_subcat subcat );
25
bool filterItems( PrefsTreeItem *item, const QString &text, Qt::CaseSensitivity cs );
26
bool collapseUnselectedItems( PrefsTreeItem *item );
27
void updateLoadedStatus( PrefsTreeItem *item , QSet<QString> *loaded );
28
_service:obs_scm:vlc-beta-20220119.f850dd9155.obscpio/modules/gui/qt/maininterface/compositor_win7.cpp -> _service:obs_scm:vlc-beta-20220120.44414977b8.obscpio/modules/gui/qt/maininterface/compositor_win7.cpp
Changed
11
1
2
3
void CompositorWin7::unloadGUI()
4
{
5
- commonGUIDestroy();
6
m_qmlView.reset();
7
+ commonGUIDestroy();
8
}
9
10
bool CompositorWin7::setupVoutWindow(vout_window_t *p_wnd, VoutDestroyCb destroyCb)
11
_service:obs_scm:vlc-beta-20220119.f850dd9155.obscpio/modules/gui/qt/maininterface/compositor_x11.cpp -> _service:obs_scm:vlc-beta-20220120.44414977b8.obscpio/modules/gui/qt/maininterface/compositor_x11.cpp
Changed
11
1
2
void CompositorX11::unloadGUI()
3
{
4
m_renderWindow->stopRendering();
5
- commonGUIDestroy();
6
m_qmlView.reset();
7
+ commonGUIDestroy();
8
}
9
10
void CompositorX11::onSurfacePositionChanged(const QPointF& position)
11
_service:obs_scm:vlc-beta-20220119.f850dd9155.obscpio/modules/gui/qt/maininterface/mainui.cpp -> _service:obs_scm:vlc-beta-20220120.44414977b8.obscpio/modules/gui/qt/maininterface/mainui.cpp
Changed
111
1
2
template<class T>
3
class SingletonRegisterHelper
4
{
5
- static QPointer<QObject> m_instance;
6
- static QQmlEngine::ObjectOwnership m_ownership;
7
+ static QPointer<T> m_instance;
8
9
public:
10
static QObject* callback(QQmlEngine *engine, QJSEngine *)
11
{
12
assert(m_instance);
13
- engine->setObjectOwnership(m_instance, m_ownership);
14
+ engine->setObjectOwnership(m_instance, QQmlEngine::ObjectOwnership::CppOwnership);
15
return m_instance;
16
}
17
18
- template<class T2 = T, typename... Args>
19
- static auto getCallback(Args&&... args)
20
- {
21
- if (!m_instance)
22
- {
23
- m_ownership = QQmlEngine::ObjectOwnership::JavaScriptOwnership;
24
- m_instance = new T2(std::forward<Args>(args)...);
25
- assert(!m_instance->parent());
26
- }
27
- else
28
- assert(sizeof...(args) == 0);
29
-
30
- return callback;
31
- }
32
-
33
- template<class T2 = T>
34
- static void setInstance(T2& instance)
35
+ static void setInstance(T* instance)
36
{
37
assert(!m_instance);
38
- m_ownership = QQmlEngine::ObjectOwnership::CppOwnership;
39
- m_instance = &instance;
40
+ m_instance = instance;
41
}
42
43
- static auto getInstance()
44
+ static T* getInstance()
45
{
46
- return static_cast<T*>(m_instance);
47
+ return m_instance;
48
}
49
};
50
template<class T>
51
-QQmlEngine::ObjectOwnership SingletonRegisterHelper<T>::m_ownership = QQmlEngine::ObjectOwnership::JavaScriptOwnership;
52
-template<class T>
53
-QPointer<QObject> SingletonRegisterHelper<T>::m_instance = nullptr;
54
+QPointer<T> SingletonRegisterHelper<T>::m_instance = nullptr;
55
56
template<class T>
57
void registerAnonymousType( const char *uri, int versionMajor )
58
59
assert(m_mainCtx);
60
assert(m_interfaceWindow);
61
62
- SingletonRegisterHelper<MainCtx>::setInstance(*mainCtx);
63
+ SingletonRegisterHelper<MainCtx>::setInstance(mainCtx);
64
65
assert(m_intf->p_mainPlayerController);
66
- SingletonRegisterHelper<PlayerController>::setInstance(*m_intf->p_mainPlayerController);
67
+ SingletonRegisterHelper<PlayerController>::setInstance(m_intf->p_mainPlayerController);
68
69
assert(DialogsProvider::getInstance());
70
- SingletonRegisterHelper<DialogsProvider>::setInstance(*DialogsProvider::getInstance());
71
+ SingletonRegisterHelper<DialogsProvider>::setInstance(DialogsProvider::getInstance());
72
+
73
+ SingletonRegisterHelper<NavigationHistory>::setInstance( new NavigationHistory(this) );
74
+ SingletonRegisterHelper<I18n>::setInstance( new I18n(this) );
75
+ SingletonRegisterHelper<SystemPalette>::setInstance( new SystemPalette(this) );
76
+ SingletonRegisterHelper<DialogModel>::setInstance( new DialogModel(m_intf, this));
77
+ SingletonRegisterHelper<QmlKeyHelper>::setInstance( new QmlKeyHelper(this) );
78
79
if (m_mainCtx->hasMediaLibrary())
80
{
81
assert(m_mainCtx->getMediaLibrary());
82
- SingletonRegisterHelper<MediaLib>::setInstance(*m_mainCtx->getMediaLibrary());
83
+ SingletonRegisterHelper<MediaLib>::setInstance(m_mainCtx->getMediaLibrary());
84
}
85
86
registerQMLTypes();
87
88
const int versionMinor = 1;
89
90
qmlRegisterSingletonType<MainCtx>(uri, versionMajor, versionMinor, "MainCtx", SingletonRegisterHelper<MainCtx>::callback);
91
- qmlRegisterSingletonType<NavigationHistory>(uri, versionMajor, versionMinor, "History", SingletonRegisterHelper<NavigationHistory>::getCallback());
92
+ qmlRegisterSingletonType<NavigationHistory>(uri, versionMajor, versionMinor, "History", SingletonRegisterHelper<NavigationHistory>::callback);
93
qmlRegisterSingletonType<PlayerController>(uri, versionMajor, versionMinor, "Player", SingletonRegisterHelper<PlayerController>::callback);
94
- qmlRegisterSingletonType<I18n>(uri, versionMajor, versionMinor, "I18n", SingletonRegisterHelper<I18n>::getCallback());
95
+ qmlRegisterSingletonType<I18n>(uri, versionMajor, versionMinor, "I18n", SingletonRegisterHelper<I18n>::callback);
96
qmlRegisterSingletonType<DialogsProvider>(uri, versionMajor, versionMinor, "DialogsProvider", SingletonRegisterHelper<DialogsProvider>::callback);
97
- qmlRegisterSingletonType<SystemPalette>(uri, versionMajor, versionMinor, "SystemPalette", SingletonRegisterHelper<SystemPalette>::getCallback());
98
- qmlRegisterSingletonType<DialogModel>(uri, versionMajor, versionMinor, "DialogModel", SingletonRegisterHelper<DialogModel>::getCallback(m_intf));
99
- qmlRegisterSingletonType<QmlKeyHelper>(uri, versionMajor, versionMinor, "KeyHelper", SingletonRegisterHelper<QmlKeyHelper>::getCallback());
100
+ qmlRegisterSingletonType<SystemPalette>(uri, versionMajor, versionMinor, "SystemPalette", SingletonRegisterHelper<SystemPalette>::callback);
101
+ qmlRegisterSingletonType<DialogModel>(uri, versionMajor, versionMinor, "DialogModel", SingletonRegisterHelper<DialogModel>::callback);
102
+ qmlRegisterSingletonType<QmlKeyHelper>(uri, versionMajor, versionMinor, "KeyHelper", SingletonRegisterHelper<QmlKeyHelper>::callback);
103
104
qmlRegisterUncreatableType<QAbstractItemModel>(uri, versionMajor, versionMinor, "QtAbstractItemModel", "");
105
qmlRegisterUncreatableType<QWindow>(uri, versionMajor, versionMinor, "QtWindow", "");
106
107
msg_Warn( m_intf, "qml error %s:%i %s", qtu(error.url().toString()), error.line(), qtu(error.description()) );
108
}
109
}
110
-
111
_service:obs_scm:vlc-beta.obsinfo
Changed
10
1
2
name: vlc-beta
3
-version: 20220119.f850dd9155
4
-mtime: 1642600189
5
-commit: f850dd91554acc829dd0160e69382dfaa701f991
6
+version: 20220120.44414977b8
7
+mtime: 1642685637
8
+commit: 44414977b87af755837bc6ef6c66b5d19ed11c57
9
10