summaryrefslogtreecommitdiffstats
path: root/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/inputstream
diff options
context:
space:
mode:
Diffstat (limited to 'xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/inputstream')
-rw-r--r--xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/inputstream/CMakeLists.txt9
-rw-r--r--xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/inputstream/demux_packet.h117
-rw-r--r--xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/inputstream/stream_codec.h131
-rw-r--r--xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/inputstream/stream_constants.h49
-rw-r--r--xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/inputstream/stream_crypto.h129
-rw-r--r--xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/inputstream/timing_constants.h42
6 files changed, 477 insertions, 0 deletions
diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/inputstream/CMakeLists.txt b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/inputstream/CMakeLists.txt
new file mode 100644
index 0000000..9a22c44
--- /dev/null
+++ b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/inputstream/CMakeLists.txt
@@ -0,0 +1,9 @@
1set(HEADERS demux_packet.h
2 stream_codec.h
3 stream_constants.h
4 stream_crypto.h
5 timing_constants.h)
6
7if(NOT ENABLE_STATIC_LIBS)
8 core_add_library(addons_kodi-dev-kit_include_kodi_c-api_addon-instance_inputstream)
9endif()
diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/inputstream/demux_packet.h b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/inputstream/demux_packet.h
new file mode 100644
index 0000000..79686ab
--- /dev/null
+++ b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/inputstream/demux_packet.h
@@ -0,0 +1,117 @@
1/*
2 * Copyright (C) 2005-2020 Team Kodi
3 * This file is part of Kodi - https://kodi.tv
4 *
5 * SPDX-License-Identifier: GPL-2.0-or-later
6 * See LICENSES/README.md for more information.
7 */
8
9#ifndef C_API_ADDONINSTANCE_INPUTSTREAM_DEMUXPACKET_H
10#define C_API_ADDONINSTANCE_INPUTSTREAM_DEMUXPACKET_H
11
12#include "timing_constants.h"
13
14#include <stdbool.h>
15#include <stdint.h>
16
17#define DEMUX_SPECIALID_STREAMINFO -10
18#define DEMUX_SPECIALID_STREAMCHANGE -11
19
20#ifdef __cplusplus
21extern "C"
22{
23#endif /* __cplusplus */
24
25 struct DEMUX_CRYPTO_INFO;
26
27 //============================================================================
28 /// @defgroup cpp_kodi_addon_inputstream_Defs_Interface_DEMUX_PACKET struct DEMUX_PACKET
29 /// @ingroup cpp_kodi_addon_inputstream_Defs_Interface
30 /// @brief **Demux packet**\n
31 /// To processed codec and demux inputstream stream.
32 ///
33 /// This part is in the "C" style in order to have better performance and
34 /// possibly to be used in "C" libraries.
35 ///
36 /// The structure should be created with @ref kodi::addon::CInstanceInputStream::AllocateDemuxPacket()
37 /// or @ref kodi::addon::CInstanceInputStream::AllocateEncryptedDemuxPacket()
38 /// and if not added to Kodi with @ref kodi::addon::CInstanceInputStream::FreeDemuxPacket()
39 /// be deleted again.
40 ///
41 /// Packages that have been given to Kodi and processed will then be deleted
42 /// by him.
43 ///
44 ///@{
45 struct DEMUX_PACKET
46 {
47 /// @brief Stream package which is given for decoding.
48 ///
49 /// @note Associated storage from here is created using
50 /// @ref kodi::addon::CInstanceInputStream::AllocateDemuxPacket()
51 /// or @ref kodi::addon::CInstanceInputStream::AllocateEncryptedDemuxPacket().
52 uint8_t* pData;
53
54 /// @brief Size of the package given at @ref pData.
55 int iSize;
56
57 /// @brief Identification of the stream.
58 int iStreamId;
59
60 /// @brief Identification of the associated demuxer, this can be identical
61 /// on several streams.
62 int64_t demuxerId;
63
64 /// @brief The group this data belongs to, used to group data from different
65 /// streams together.
66 int iGroupId;
67
68 //------------------------------------------
69
70 /// @brief Additional packet data that can be provided by the container.
71 ///
72 /// Packet can contain several types of side information.
73 ///
74 /// This is usually based on that of ffmpeg, see
75 /// [AVPacketSideData](https://ffmpeg.org/doxygen/trunk/structAVPacketSideData.html).
76 void* pSideData;
77
78 /// @brief Data elements stored at @ref pSideData.
79 int iSideDataElems;
80
81 //------------------------------------------
82
83 /// @brief Presentation time stamp (PTS).
84 double pts;
85
86 /// @brief Decoding time stamp (DTS).
87 double dts;
88
89 /// @brief Duration in @ref STREAM_TIME_BASE if available
90 double duration;
91
92 /// @brief Display time from input stream
93 int dispTime;
94
95 /// @brief To show that this package allows recreating the presentation by
96 /// mistake.
97 bool recoveryPoint;
98
99 //------------------------------------------
100
101 /// @brief Optional data to allow decryption at processing site if
102 /// necessary.
103 ///
104 /// This can be created using @ref kodi::addon::CInstanceInputStream::AllocateEncryptedDemuxPacket(),
105 /// otherwise this is declared as <b>`nullptr`</b>.
106 ///
107 /// See @ref DEMUX_CRYPTO_INFO for their style.
108 struct DEMUX_CRYPTO_INFO* cryptoInfo;
109 };
110 ///@}
111 //----------------------------------------------------------------------------
112
113#ifdef __cplusplus
114} /* extern "C" */
115#endif /* __cplusplus */
116
117#endif /* !C_API_ADDONINSTANCE_INPUTSTREAM_DEMUXPACKET_H */
diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/inputstream/stream_codec.h b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/inputstream/stream_codec.h
new file mode 100644
index 0000000..b489cb9
--- /dev/null
+++ b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/inputstream/stream_codec.h
@@ -0,0 +1,131 @@
1/*
2 * Copyright (C) 2017-2018 Team Kodi
3 * This file is part of Kodi - https://kodi.tv
4 *
5 * SPDX-License-Identifier: GPL-2.0-or-later
6 * See LICENSES/README.md for more information.
7 */
8
9#ifndef C_API_ADDONINSTANCE_INPUTSTREAM_STREAMCODEC_H
10#define C_API_ADDONINSTANCE_INPUTSTREAM_STREAMCODEC_H
11
12#ifdef __cplusplus
13extern "C"
14{
15#endif /* __cplusplus */
16
17 //==============================================================================
18 /// @defgroup cpp_kodi_addon_inputstream_Defs_StreamEncryption_STREAMCODEC_PROFILE enum STREAMCODEC_PROFILE
19 /// @ingroup cpp_kodi_addon_inputstream_Defs_StreamCodec
20 /// @brief **The standard defines several sets of capabilities.**\n
21 /// Which are referred to as profiles, targeting specific classes of applications.
22 ///
23 ///@{
24 enum STREAMCODEC_PROFILE
25 {
26 /// @brief Unknown codec profile
27 CodecProfileUnknown = 0,
28
29 /// @brief If a codec profile is not required
30 CodecProfileNotNeeded,
31
32 /// @brief **H264** Baseline Profile (BP, 66)\n
33 /// \n
34 /// Primarily for low-cost applications that require additional data loss
35 /// robustness, this profile is used in some videoconferencing and mobile
36 /// applications. This profile includes all features that are supported
37 /// in the Constrained Baseline Profile, plus three additional features
38 /// that can be used for loss robustness (or for other purposes such as
39 /// low-delay multi-point video stream compositing). The importance of
40 /// this profile has faded somewhat since the definition of the Constrained
41 /// Baseline Profile in 2009. All Constrained Baseline Profile bitstreams
42 /// are also considered to be Baseline Profile bitstreams, as these two
43 /// profiles share the same profile identifier code value.
44 H264CodecProfileBaseline,
45
46 /// @brief **H264** Main Profile (MP, 77)\n
47 /// \n
48 /// This profile is used for standard-definition digital TV broadcasts that
49 /// use the MPEG-4 format as defined in the
50 /// [DVB standard](http://www.etsi.org/deliver/etsi_ts/101100_101199/101154/01.09.01_60/ts_101154v010901p.pdf).
51 /// It is not, however, used for high-definition television broadcasts, as the
52 /// importance of this profile faded when the High Profile was developed
53 /// in 2004 for that application.
54 H264CodecProfileMain,
55
56 /// @brief **H264** Extended Profile (XP, 88)\n
57 /// \n
58 /// Intended as the streaming video profile, this profile has relatively high
59 /// compression capability and some extra tricks for robustness to data losses
60 /// and server stream switching.
61 H264CodecProfileExtended,
62
63 /// @brief **H264** High Profile (HiP, 100)\n
64 /// \n
65 /// The primary profile for broadcast and disc storage applications,
66 /// particularly for high-definition television applications (for example,
67 /// this is the profile adopted by the [Blu-ray Disc](https://en.wikipedia.org/wiki/Blu-ray_Disc)
68 /// storage format and the [DVB](https://en.wikipedia.org/wiki/Digital_Video_Broadcasting)
69 /// HDTV broadcast service).
70 H264CodecProfileHigh,
71
72 /// @brief **H264** High 10 Profile (Hi10P, 110)\n
73 /// \n
74 /// Going beyond typical mainstream consumer product capabilities, this
75 /// profile builds on top of the High Profile, adding support for up to 10
76 /// bits per sample of decoded picture precision.
77 H264CodecProfileHigh10,
78
79 /// @brief **H264** High 4:2:2 Profile (Hi422P, 122)\n
80 /// \n
81 /// Primarily targeting professional applications that use interlaced video,
82 /// this profile builds on top of the High 10 Profile, adding support for the
83 /// 4:2:2 chroma sampling format while using up to 10 bits per sample of
84 /// decoded picture precision.
85 H264CodecProfileHigh422,
86
87 /// @brief **H264** High 4:4:4 Predictive Profile (Hi444PP, 244)\n
88 /// \n
89 /// This profile builds on top of the High 4:2:2 Profile, supporting up to
90 /// 4:4:4 chroma sampling, up to 14 bits per sample, and additionally
91 /// supporting efficient lossless region coding and the coding of each
92 /// picture as three separate color planes.
93 H264CodecProfileHigh444Predictive,
94
95 /// @brief **VP9** profile 0\n
96 /// \n
97 /// There are several variants of the VP9 format (known as "coding profiles"),
98 /// which successively allow more features; profile 0 is the basic variant,
99 /// requiring the least from a hardware implementation.
100 ///
101 /// [Color depth](https://en.wikipedia.org/wiki/Color_depth): 8 bit/sample,
102 /// [chroma subsampling](https://en.wikipedia.org/wiki/Chroma_subsampling): 4:2:0
103 VP9CodecProfile0 = 20,
104
105 /// @brief **VP9** profile 1\n
106 /// \n
107 /// [Color depth](https://en.wikipedia.org/wiki/Color_depth): 8 bit,
108 /// [chroma subsampling](https://en.wikipedia.org/wiki/Chroma_subsampling): 4:2:0, 4:2:2, 4:4:4
109 VP9CodecProfile1,
110
111 /// @brief **VP9** profile 2\n
112 /// \n
113 /// [Color depth](https://en.wikipedia.org/wiki/Color_depth): 10–12 bit,
114 /// [chroma subsampling](https://en.wikipedia.org/wiki/Chroma_subsampling): 4:2:0
115 VP9CodecProfile2,
116
117 /// @brief **VP9** profile 3\n
118 /// \n
119 /// [Color depth](https://en.wikipedia.org/wiki/Color_depth): 10–12 bit,
120 /// [chroma subsampling](https://en.wikipedia.org/wiki/Chroma_subsampling): 4:2:0, 4:2:2, 4:4:4,
121 /// see [VP9 Bitstream & Decoding Process Specification](https://storage.googleapis.com/downloads.webmproject.org/docs/vp9/vp9-bitstream-specification-v0.6-20160331-draft.pdf)
122 VP9CodecProfile3,
123 };
124 ///@}
125 //------------------------------------------------------------------------------
126
127#ifdef __cplusplus
128} /* extern "C" */
129#endif /* __cplusplus */
130
131#endif /* !C_API_ADDONINSTANCE_INPUTSTREAM_STREAMCODEC_H */
diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/inputstream/stream_constants.h b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/inputstream/stream_constants.h
new file mode 100644
index 0000000..f442d64
--- /dev/null
+++ b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/inputstream/stream_constants.h
@@ -0,0 +1,49 @@
1/*
2 * Copyright (C) 2017-2020 Team Kodi
3 * This file is part of Kodi - https://kodi.tv
4 *
5 * SPDX-License-Identifier: GPL-2.0-or-later
6 * See LICENSES/README.md for more information.
7 */
8
9#ifndef C_API_ADDONINSTANCE_INPUTSTREAM_STREAMCONSTANTS_H
10#define C_API_ADDONINSTANCE_INPUTSTREAM_STREAMCONSTANTS_H
11
12/// @ingroup cpp_kodi_addon_inputstream_Defs_StreamConstants
13/// @brief The name of the inputstream add-on that should be used by Kodi to
14/// play the stream.
15///
16/// Leave blank to use Kodi's built-in playing capabilities or to allow
17/// ffmpeg to handle directly set to @ref STREAM_PROPERTY_VALUE_INPUTSTREAMFFMPEG.
18#define STREAM_PROPERTY_INPUTSTREAM "inputstream"
19
20/// @ingroup cpp_kodi_addon_inputstream_Defs_StreamConstants
21/// @brief Identification string for an input stream.
22///
23/// This value can be used in addition to @ref STREAM_PROPERTY_INPUTSTREAM. It is
24/// used to provide the respective inpustream addon with additional
25/// identification.
26///
27/// The difference between this and other stream properties is that it is also
28/// passed in the associated @ref kodi::addon::CAddonBase::CreateInstance call.
29///
30/// This makes it possible to select different processing classes within the
31/// associated add-on.
32#define STREAM_PROPERTY_INPUTSTREAM_INSTANCE_ID "inputstream-instance-id"
33
34/// @ingroup cpp_kodi_addon_inputstream_Defs_StreamConstants
35/// @brief "true" to denote that the stream that should be played is a
36/// realtime stream. Any other value indicates that this is not a realtime
37/// stream.
38#define STREAM_PROPERTY_ISREALTIMESTREAM "isrealtimestream"
39
40/// @ingroup cpp_kodi_addon_inputstream_Defs_StreamConstants
41/// @brief Special value for @ref STREAM_PROPERTY_INPUTSTREAM to use
42/// ffmpeg to directly play a stream URL.
43#define STREAM_PROPERTY_VALUE_INPUTSTREAMFFMPEG "inputstream.ffmpeg"
44
45/// @ingroup cpp_kodi_addon_inputstream_Defs_StreamConstants
46/// @brief Max number of properties that can be sent to an Inputstream addon
47#define STREAM_MAX_PROPERTY_COUNT 30
48
49#endif /* !C_API_ADDONINSTANCE_INPUTSTREAM_STREAMCONSTANTS_H */
diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/inputstream/stream_crypto.h b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/inputstream/stream_crypto.h
new file mode 100644
index 0000000..4b60306
--- /dev/null
+++ b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/inputstream/stream_crypto.h
@@ -0,0 +1,129 @@
1/*
2 * Copyright (C) 2017-2018 Team Kodi
3 * This file is part of Kodi - https://kodi.tv
4 *
5 * SPDX-License-Identifier: GPL-2.0-or-later
6 * See LICENSES/README.md for more information.
7 */
8
9#ifndef C_API_ADDONINSTANCE_INPUTSTREAM_STREAMCRYPTO_H
10#define C_API_ADDONINSTANCE_INPUTSTREAM_STREAMCRYPTO_H
11
12#include <stdint.h>
13#include <string.h>
14
15#define STREAMCRYPTO_VERSION_LEVEL 2
16
17#ifdef __cplusplus
18extern "C"
19{
20#endif /* __cplusplus */
21
22 //============================================================================
23 /// @defgroup cpp_kodi_addon_inputstream_Defs_StreamEncryption_STREAM_CRYPTO_KEY_SYSTEM enum STREAM_CRYPTO_KEY_SYSTEM
24 /// @ingroup cpp_kodi_addon_inputstream_Defs_StreamEncryption
25 /// @brief **Available ways to process stream cryptography**\n
26 /// For @ref cpp_kodi_addon_inputstream_Defs_StreamEncryption_StreamCryptoSession,
27 /// this defines the used and required auxiliary modules which are required to
28 /// process the encryption stream.
29 ///
30 /// Used to set wanted [digital rights management](https://en.wikipedia.org/wiki/Digital_rights_management)
31 /// (DRM) technology provider for stream.
32 ///@{
33 enum STREAM_CRYPTO_KEY_SYSTEM
34 {
35 /// @brief **0** - If no path is to be used, this is the default
36 STREAM_CRYPTO_KEY_SYSTEM_NONE = 0,
37
38 /// @brief **1** - To use [Widevine](https://en.wikipedia.org/wiki/Widevine) for processing
39 STREAM_CRYPTO_KEY_SYSTEM_WIDEVINE,
40
41 /// @brief **2** - To use [Playready](https://en.wikipedia.org/wiki/PlayReady) for processing
42 STREAM_CRYPTO_KEY_SYSTEM_PLAYREADY,
43
44 /// @brief **3** - To use Wiseplay for processing
45 STREAM_CRYPTO_KEY_SYSTEM_WISEPLAY,
46
47 /// @brief **4** - The maximum value to use in a list.
48 STREAM_CRYPTO_KEY_SYSTEM_COUNT
49 };
50 ///@}
51 //----------------------------------------------------------------------------
52
53 //============================================================================
54 /// @defgroup cpp_kodi_addon_inputstream_Defs_StreamEncryption_STREAM_CRYPTO_FLAGS enum STREAM_CRYPTO_FLAGS
55 /// @ingroup cpp_kodi_addon_inputstream_Defs_StreamEncryption
56 /// @brief **Cryptography flags to use special conditions**\n
57 /// To identify special extra conditions.
58 ///
59 /// @note These variables are bit flags which are created using "|" can be used
60 /// together.
61 ///
62 ///@{
63 enum STREAM_CRYPTO_FLAGS
64 {
65 /// @brief **0000 0000** - Empty to set if nothing is used.
66 STREAM_CRYPTO_FLAG_NONE = 0,
67
68 /// @brief **0000 0001** - Is set in flags if decoding has to be done in
69 /// [trusted execution environment (TEE)](https://en.wikipedia.org/wiki/Trusted_execution_environment).
70 STREAM_CRYPTO_FLAG_SECURE_DECODER = (1 << 0)
71 };
72 ///@}
73 //----------------------------------------------------------------------------
74
75 //============================================================================
76 /// @defgroup cpp_kodi_addon_inputstream_Defs_StreamEncryption_DEMUX_CRYPTO_INFO struct DEMUX_CRYPTO_INFO
77 /// @ingroup cpp_kodi_addon_inputstream_Defs_StreamEncryption
78 /// @brief **C data structure for processing encrypted streams.**\n
79 /// If required, this structure is used for every DEMUX_PACKET to be processed.
80 ///
81 ///@{
82 struct DEMUX_CRYPTO_INFO
83 {
84 /// @brief Number of subsamples.
85 uint16_t numSubSamples;
86
87 /// @brief Flags for later use.
88 uint16_t flags;
89
90 /// @brief @ref numSubSamples uint16_t's wich define the size of clear size
91 /// of a subsample.
92 uint16_t* clearBytes;
93
94 /// @brief @ref numSubSamples uint32_t's wich define the size of cipher size
95 /// of a subsample.
96 uint32_t* cipherBytes;
97
98 /// @brief Initialization vector
99 uint8_t iv[16];
100
101 /// @brief Key id
102 uint8_t kid[16];
103 };
104 ///@}
105 //----------------------------------------------------------------------------
106
107 // Data to manage stream cryptography
108 struct STREAM_CRYPTO_SESSION
109 {
110 // keysystem for encrypted media, STREAM_CRYPTO_KEY_SYSTEM_NONE for unencrypted
111 // media.
112 //
113 // See STREAM_CRYPTO_KEY_SYSTEM for available options.
114 enum STREAM_CRYPTO_KEY_SYSTEM keySystem;
115
116 // Flags to use special conditions, see STREAM_CRYPTO_FLAGS for available flags.
117 uint8_t flags;
118
119 // The crypto session key id.
120 char sessionId[256];
121 };
122 ///@}
123 //----------------------------------------------------------------------------
124
125#ifdef __cplusplus
126} /* extern "C" */
127#endif /* __cplusplus */
128
129#endif /* !C_API_ADDONINSTANCE_INPUTSTREAM_STREAMCRYPTO_H */
diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/inputstream/timing_constants.h b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/inputstream/timing_constants.h
new file mode 100644
index 0000000..a226a0d
--- /dev/null
+++ b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/inputstream/timing_constants.h
@@ -0,0 +1,42 @@
1/*
2 * Copyright (C) 2015-2020 Team Kodi
3 * This file is part of Kodi - https://kodi.tv
4 *
5 * SPDX-License-Identifier: GPL-2.0-or-later
6 * See LICENSES/README.md for more information.
7 */
8
9#ifndef C_API_ADDONINSTANCE_INPUTSTREAM_TIMINGCONSTANTS_H
10#define C_API_ADDONINSTANCE_INPUTSTREAM_TIMINGCONSTANTS_H
11
12/// @ingroup cpp_kodi_addon_inputstream_Defs_TimingConstants
13/// @brief Speed value to pause stream in playback.
14///
15#define STREAM_PLAYSPEED_PAUSE 0 // frame stepping
16
17/// @ingroup cpp_kodi_addon_inputstream_Defs_TimingConstants
18/// @brief Speed value to perform stream playback at normal speed.
19///
20/// See @ref STREAM_PLAYSPEED_PAUSE for pause of stream.
21///
22#define STREAM_PLAYSPEED_NORMAL 1000
23
24/// @ingroup cpp_kodi_addon_inputstream_Defs_TimingConstants
25/// @brief Time base represented as integer.
26///
27#define STREAM_TIME_BASE 1000000
28
29/// @ingroup cpp_kodi_addon_inputstream_Defs_TimingConstants
30/// @brief Undefined timestamp value.
31///
32/// Usually reported by demuxer that work on containers that do not provide
33/// either pts or dts.
34///
35#define STREAM_NOPTS_VALUE 0xFFF0000000000000
36
37// "C" defines to translate stream times
38#define STREAM_TIME_TO_MSEC(x) ((int)((double)(x)*1000 / STREAM_TIME_BASE))
39#define STREAM_SEC_TO_TIME(x) ((double)(x)*STREAM_TIME_BASE)
40#define STREAM_MSEC_TO_TIME(x) ((double)(x)*STREAM_TIME_BASE / 1000)
41
42#endif /* !C_API_ADDONINSTANCE_INPUTSTREAM_TIMINGCONSTANTS_H */