summaryrefslogtreecommitdiff
path: root/libavfilter
diff options
context:
space:
mode:
authorAnton Khirnov <anton@khirnov.net>2012-05-19 10:37:56 +0200
committerAnton Khirnov <anton@khirnov.net>2012-05-22 21:36:23 +0200
commitc04c533f62b80e9d6bbcb89946bab6206a8873c5 (patch)
tree46f7a477b17e2f9e56406ae844e963fd5657cbf5 /libavfilter
parent43c7a01e9879640859d32b062ac01700e1333c7a (diff)
lavfi: remove avfilter_null_* from public API on next bump.
Those functions are only useful inside filters. It is better to not support user filters until the API is more stable.
Diffstat (limited to 'libavfilter')
-rw-r--r--libavfilter/avfilter.h6
-rw-r--r--libavfilter/split.c3
-rw-r--r--libavfilter/vf_aspect.c9
-rw-r--r--libavfilter/vf_blackframe.c5
-rw-r--r--libavfilter/vf_copy.c7
-rw-r--r--libavfilter/vf_crop.c3
-rw-r--r--libavfilter/vf_cropdetect.c5
-rw-r--r--libavfilter/vf_delogo.c3
-rw-r--r--libavfilter/vf_drawbox.c7
-rw-r--r--libavfilter/vf_drawtext.c3
-rw-r--r--libavfilter/vf_fade.c5
-rw-r--r--libavfilter/vf_fifo.c3
-rw-r--r--libavfilter/vf_format.c17
-rw-r--r--libavfilter/vf_null.c7
-rw-r--r--libavfilter/vf_select.c3
-rw-r--r--libavfilter/vf_setpts.c3
-rw-r--r--libavfilter/vf_settb.c5
-rw-r--r--libavfilter/vf_showinfo.c5
-rw-r--r--libavfilter/vf_slicify.c5
-rw-r--r--libavfilter/video.c24
-rw-r--r--libavfilter/video.h6
21 files changed, 90 insertions, 44 deletions
diff --git a/libavfilter/avfilter.h b/libavfilter/avfilter.h
index 0d40b7664c..54adc5cf3a 100644
--- a/libavfilter/avfilter.h
+++ b/libavfilter/avfilter.h
@@ -487,18 +487,24 @@ int avfilter_default_query_formats(AVFilterContext *ctx);
*/
void avfilter_set_common_formats(AVFilterContext *ctx, AVFilterFormats *formats);
+#if FF_API_FILTERS_PUBLIC
/** start_frame() handler for filters which simply pass video along */
+attribute_deprecated
void avfilter_null_start_frame(AVFilterLink *link, AVFilterBufferRef *picref);
/** draw_slice() handler for filters which simply pass video along */
+attribute_deprecated
void avfilter_null_draw_slice(AVFilterLink *link, int y, int h, int slice_dir);
/** end_frame() handler for filters which simply pass video along */
+attribute_deprecated
void avfilter_null_end_frame(AVFilterLink *link);
/** get_video_buffer() handler for filters which simply pass video along */
+attribute_deprecated
AVFilterBufferRef *avfilter_null_get_video_buffer(AVFilterLink *link,
int perms, int w, int h);
+#endif
/**
* Filter definition. This defines the pads a filter contains, and all the
diff --git a/libavfilter/split.c b/libavfilter/split.c
index 83ad765081..da33b7d183 100644
--- a/libavfilter/split.c
+++ b/libavfilter/split.c
@@ -25,6 +25,7 @@
#include "avfilter.h"
#include "audio.h"
+#include "video.h"
static int split_init(AVFilterContext *ctx, const char *args, void *opaque)
{
@@ -100,7 +101,7 @@ AVFilter avfilter_vf_split = {
.inputs = (AVFilterPad[]) {{ .name = "default",
.type = AVMEDIA_TYPE_VIDEO,
- .get_video_buffer= avfilter_null_get_video_buffer,
+ .get_video_buffer= ff_null_get_video_buffer,
.start_frame = start_frame,
.draw_slice = draw_slice,
.end_frame = end_frame, },
diff --git a/libavfilter/vf_aspect.c b/libavfilter/vf_aspect.c
index 9db29c70f5..4e1fdac90e 100644
--- a/libavfilter/vf_aspect.c
+++ b/libavfilter/vf_aspect.c
@@ -25,6 +25,7 @@
#include "libavutil/mathematics.h"
#include "avfilter.h"
+#include "video.h"
typedef struct {
AVRational aspect;
@@ -100,9 +101,9 @@ AVFilter avfilter_vf_setdar = {
.inputs = (AVFilterPad[]) {{ .name = "default",
.type = AVMEDIA_TYPE_VIDEO,
.config_props = setdar_config_props,
- .get_video_buffer = avfilter_null_get_video_buffer,
+ .get_video_buffer = ff_null_get_video_buffer,
.start_frame = start_frame,
- .end_frame = avfilter_null_end_frame },
+ .end_frame = ff_null_end_frame },
{ .name = NULL}},
.outputs = (AVFilterPad[]) {{ .name = "default",
@@ -133,9 +134,9 @@ AVFilter avfilter_vf_setsar = {
.inputs = (AVFilterPad[]) {{ .name = "default",
.type = AVMEDIA_TYPE_VIDEO,
.config_props = setsar_config_props,
- .get_video_buffer = avfilter_null_get_video_buffer,
+ .get_video_buffer = ff_null_get_video_buffer,
.start_frame = start_frame,
- .end_frame = avfilter_null_end_frame },
+ .end_frame = ff_null_end_frame },
{ .name = NULL}},
.outputs = (AVFilterPad[]) {{ .name = "default",
diff --git a/libavfilter/vf_blackframe.c b/libavfilter/vf_blackframe.c
index 770eec94e0..7e69ccb1f6 100644
--- a/libavfilter/vf_blackframe.c
+++ b/libavfilter/vf_blackframe.c
@@ -28,6 +28,7 @@
*/
#include "avfilter.h"
+#include "video.h"
typedef struct {
unsigned int bamount; ///< black amount
@@ -118,8 +119,8 @@ AVFilter avfilter_vf_blackframe = {
.inputs = (AVFilterPad[]) {{ .name = "default",
.type = AVMEDIA_TYPE_VIDEO,
.draw_slice = draw_slice,
- .get_video_buffer = avfilter_null_get_video_buffer,
- .start_frame = avfilter_null_start_frame,
+ .get_video_buffer = ff_null_get_video_buffer,
+ .start_frame = ff_null_start_frame,
.end_frame = end_frame, },
{ .name = NULL}},
diff --git a/libavfilter/vf_copy.c b/libavfilter/vf_copy.c
index 705ad1e2e6..271a729211 100644
--- a/libavfilter/vf_copy.c
+++ b/libavfilter/vf_copy.c
@@ -22,6 +22,7 @@
*/
#include "avfilter.h"
+#include "video.h"
AVFilter avfilter_vf_copy = {
.name = "copy",
@@ -29,9 +30,9 @@ AVFilter avfilter_vf_copy = {
.inputs = (AVFilterPad[]) {{ .name = "default",
.type = AVMEDIA_TYPE_VIDEO,
- .get_video_buffer = avfilter_null_get_video_buffer,
- .start_frame = avfilter_null_start_frame,
- .end_frame = avfilter_null_end_frame,
+ .get_video_buffer = ff_null_get_video_buffer,
+ .start_frame = ff_null_start_frame,
+ .end_frame = ff_null_end_frame,
.rej_perms = ~0 },
{ .name = NULL}},
.outputs = (AVFilterPad[]) {{ .name = "default",
diff --git a/libavfilter/vf_crop.c b/libavfilter/vf_crop.c
index d3b5a09060..5452601068 100644
--- a/libavfilter/vf_crop.c
+++ b/libavfilter/vf_crop.c
@@ -26,6 +26,7 @@
/* #define DEBUG */
#include "avfilter.h"
+#include "video.h"
#include "libavutil/eval.h"
#include "libavutil/avstring.h"
#include "libavutil/libm.h"
@@ -333,7 +334,7 @@ AVFilter avfilter_vf_crop = {
.start_frame = start_frame,
.draw_slice = draw_slice,
.end_frame = end_frame,
- .get_video_buffer = avfilter_null_get_video_buffer,
+ .get_video_buffer = ff_null_get_video_buffer,
.config_props = config_input, },
{ .name = NULL}},
.outputs = (AVFilterPad[]) {{ .name = "default",
diff --git a/libavfilter/vf_cropdetect.c b/libavfilter/vf_cropdetect.c
index 34b5dc9a2a..d321afdd40 100644
--- a/libavfilter/vf_cropdetect.c
+++ b/libavfilter/vf_cropdetect.c
@@ -25,6 +25,7 @@
#include "libavutil/imgutils.h"
#include "avfilter.h"
+#include "video.h"
typedef struct {
int x1, y1, x2, y2;
@@ -203,8 +204,8 @@ AVFilter avfilter_vf_cropdetect = {
.inputs = (AVFilterPad[]) {{ .name = "default",
.type = AVMEDIA_TYPE_VIDEO,
.config_props = config_input,
- .get_video_buffer = avfilter_null_get_video_buffer,
- .start_frame = avfilter_null_start_frame,
+ .get_video_buffer = ff_null_get_video_buffer,
+ .start_frame = ff_null_start_frame,
.end_frame = end_frame, },
{ .name = NULL}},
diff --git a/libavfilter/vf_delogo.c b/libavfilter/vf_delogo.c
index ca3156814b..a54abe1a79 100644
--- a/libavfilter/vf_delogo.c
+++ b/libavfilter/vf_delogo.c
@@ -29,6 +29,7 @@
#include "libavutil/opt.h"
#include "libavutil/pixdesc.h"
#include "avfilter.h"
+#include "video.h"
/**
* Apply a simple delogo algorithm to the image in dst and put the
@@ -271,7 +272,7 @@ AVFilter avfilter_vf_delogo = {
.inputs = (AVFilterPad[]) {{ .name = "default",
.type = AVMEDIA_TYPE_VIDEO,
- .get_video_buffer = avfilter_null_get_video_buffer,
+ .get_video_buffer = ff_null_get_video_buffer,
.start_frame = start_frame,
.draw_slice = null_draw_slice,
.end_frame = end_frame,
diff --git a/libavfilter/vf_drawbox.c b/libavfilter/vf_drawbox.c
index ab5cb03415..fc80402f60 100644
--- a/libavfilter/vf_drawbox.c
+++ b/libavfilter/vf_drawbox.c
@@ -28,6 +28,7 @@
#include "libavutil/pixdesc.h"
#include "libavutil/parseutils.h"
#include "avfilter.h"
+#include "video.h"
enum { Y, U, V, A };
@@ -130,10 +131,10 @@ AVFilter avfilter_vf_drawbox = {
.inputs = (AVFilterPad[]) {{ .name = "default",
.type = AVMEDIA_TYPE_VIDEO,
.config_props = config_input,
- .get_video_buffer = avfilter_null_get_video_buffer,
- .start_frame = avfilter_null_start_frame,
+ .get_video_buffer = ff_null_get_video_buffer,
+ .start_frame = ff_null_start_frame,
.draw_slice = draw_slice,
- .end_frame = avfilter_null_end_frame,
+ .end_frame = ff_null_end_frame,
.min_perms = AV_PERM_WRITE | AV_PERM_READ,
.rej_perms = AV_PERM_PRESERVE },
{ .name = NULL}},
diff --git a/libavfilter/vf_drawtext.c b/libavfilter/vf_drawtext.c
index 4846716fe0..5ef0d8c1ca 100644
--- a/libavfilter/vf_drawtext.c
+++ b/libavfilter/vf_drawtext.c
@@ -41,6 +41,7 @@
#include "libavutil/lfg.h"
#include "avfilter.h"
#include "drawutils.h"
+#include "video.h"
#undef time
@@ -875,7 +876,7 @@ AVFilter avfilter_vf_drawtext = {
.inputs = (AVFilterPad[]) {{ .name = "default",
.type = AVMEDIA_TYPE_VIDEO,
- .get_video_buffer = avfilter_null_get_video_buffer,
+ .get_video_buffer = ff_null_get_video_buffer,
.start_frame = start_frame,
.draw_slice = null_draw_slice,
.end_frame = end_frame,
diff --git a/libavfilter/vf_fade.c b/libavfilter/vf_fade.c
index 9f748b8882..a0f37d2ad5 100644
--- a/libavfilter/vf_fade.c
+++ b/libavfilter/vf_fade.c
@@ -27,6 +27,7 @@
#include "libavutil/pixdesc.h"
#include "avfilter.h"
+#include "video.h"
typedef struct {
int factor, fade_per_frame;
@@ -157,8 +158,8 @@ AVFilter avfilter_vf_fade = {
.inputs = (AVFilterPad[]) {{ .name = "default",
.type = AVMEDIA_TYPE_VIDEO,
.config_props = config_props,
- .get_video_buffer = avfilter_null_get_video_buffer,
- .start_frame = avfilter_null_start_frame,
+ .get_video_buffer = ff_null_get_video_buffer,
+ .start_frame = ff_null_start_frame,
.draw_slice = draw_slice,
.end_frame = end_frame,
.min_perms = AV_PERM_READ | AV_PERM_WRITE,
diff --git a/libavfilter/vf_fifo.c b/libavfilter/vf_fifo.c
index 836cce28b5..b99cec38dc 100644
--- a/libavfilter/vf_fifo.c
+++ b/libavfilter/vf_fifo.c
@@ -24,6 +24,7 @@
*/
#include "avfilter.h"
+#include "video.h"
typedef struct BufPic {
AVFilterBufferRef *picref;
@@ -106,7 +107,7 @@ AVFilter avfilter_vf_fifo = {
.inputs = (AVFilterPad[]) {{ .name = "default",
.type = AVMEDIA_TYPE_VIDEO,
- .get_video_buffer= avfilter_null_get_video_buffer,
+ .get_video_buffer= ff_null_get_video_buffer,
.start_frame = start_frame,
.draw_slice = draw_slice,
.end_frame = end_frame,
diff --git a/libavfilter/vf_format.c b/libavfilter/vf_format.c
index 9c1e0d4266..aaaca277df 100644
--- a/libavfilter/vf_format.c
+++ b/libavfilter/vf_format.c
@@ -25,6 +25,7 @@
#include "libavutil/pixdesc.h"
#include "avfilter.h"
+#include "video.h"
typedef struct {
/**
@@ -104,10 +105,10 @@ AVFilter avfilter_vf_format = {
.inputs = (AVFilterPad[]) {{ .name = "default",
.type = AVMEDIA_TYPE_VIDEO,
- .get_video_buffer= avfilter_null_get_video_buffer,
- .start_frame = avfilter_null_start_frame,
- .draw_slice = avfilter_null_draw_slice,
- .end_frame = avfilter_null_end_frame, },
+ .get_video_buffer= ff_null_get_video_buffer,
+ .start_frame = ff_null_start_frame,
+ .draw_slice = ff_null_draw_slice,
+ .end_frame = ff_null_end_frame, },
{ .name = NULL}},
.outputs = (AVFilterPad[]) {{ .name = "default",
.type = AVMEDIA_TYPE_VIDEO },
@@ -134,10 +135,10 @@ AVFilter avfilter_vf_noformat = {
.inputs = (AVFilterPad[]) {{ .name = "default",
.type = AVMEDIA_TYPE_VIDEO,
- .get_video_buffer= avfilter_null_get_video_buffer,
- .start_frame = avfilter_null_start_frame,
- .draw_slice = avfilter_null_draw_slice,
- .end_frame = avfilter_null_end_frame, },
+ .get_video_buffer= ff_null_get_video_buffer,
+ .start_frame = ff_null_start_frame,
+ .draw_slice = ff_null_draw_slice,
+ .end_frame = ff_null_end_frame, },
{ .name = NULL}},
.outputs = (AVFilterPad[]) {{ .name = "default",
.type = AVMEDIA_TYPE_VIDEO },
diff --git a/libavfilter/vf_null.c b/libavfilter/vf_null.c
index 8414c5f4fa..470c3d28a5 100644
--- a/libavfilter/vf_null.c
+++ b/libavfilter/vf_null.c
@@ -22,6 +22,7 @@
*/
#include "avfilter.h"
+#include "video.h"
AVFilter avfilter_vf_null = {
.name = "null",
@@ -31,9 +32,9 @@ AVFilter avfilter_vf_null = {
.inputs = (AVFilterPad[]) {{ .name = "default",
.type = AVMEDIA_TYPE_VIDEO,
- .get_video_buffer = avfilter_null_get_video_buffer,
- .start_frame = avfilter_null_start_frame,
- .end_frame = avfilter_null_end_frame },
+ .get_video_buffer = ff_null_get_video_buffer,
+ .start_frame = ff_null_start_frame,
+ .end_frame = ff_null_end_frame },
{ .name = NULL}},
.outputs = (AVFilterPad[]) {{ .name = "default",
diff --git a/libavfilter/vf_select.c b/libavfilter/vf_select.c
index 13ec0407d5..2b6b49c153 100644
--- a/libavfilter/vf_select.c
+++ b/libavfilter/vf_select.c
@@ -27,6 +27,7 @@
#include "libavutil/fifo.h"
#include "libavutil/mathematics.h"
#include "avfilter.h"
+#include "video.h"
static const char *const var_names[] = {
"E", ///< Euler number
@@ -339,7 +340,7 @@ AVFilter avfilter_vf_select = {
.inputs = (AVFilterPad[]) {{ .name = "default",
.type = AVMEDIA_TYPE_VIDEO,
- .get_video_buffer = avfilter_null_get_video_buffer,
+ .get_video_buffer = ff_null_get_video_buffer,
.config_props = config_input,
.start_frame = start_frame,
.draw_slice = draw_slice,
diff --git a/libavfilter/vf_setpts.c b/libavfilter/vf_setpts.c
index b49ca5eb57..103f265782 100644
--- a/libavfilter/vf_setpts.c
+++ b/libavfilter/vf_setpts.c
@@ -29,6 +29,7 @@
#include "libavutil/eval.h"
#include "libavutil/mathematics.h"
#include "avfilter.h"
+#include "video.h"
static const char *const var_names[] = {
"E", ///< Euler number
@@ -148,7 +149,7 @@ AVFilter avfilter_vf_setpts = {
.inputs = (AVFilterPad[]) {{ .name = "default",
.type = AVMEDIA_TYPE_VIDEO,
- .get_video_buffer = avfilter_null_get_video_buffer,
+ .get_video_buffer = ff_null_get_video_buffer,
.config_props = config_input,
.start_frame = start_frame, },
{ .name = NULL }},
diff --git a/libavfilter/vf_settb.c b/libavfilter/vf_settb.c
index 49f7a57d72..b40ede87cb 100644
--- a/libavfilter/vf_settb.c
+++ b/libavfilter/vf_settb.c
@@ -29,6 +29,7 @@
#include "libavutil/rational.h"
#include "avfilter.h"
#include "internal.h"
+#include "video.h"
static const char *const var_names[] = {
"E",
@@ -130,9 +131,9 @@ AVFilter avfilter_vf_settb = {
.inputs = (AVFilterPad[]) {{ .name = "default",
.type = AVMEDIA_TYPE_VIDEO,
- .get_video_buffer = avfilter_null_get_video_buffer,
+ .get_video_buffer = ff_null_get_video_buffer,
.start_frame = start_frame,
- .end_frame = avfilter_null_end_frame },
+ .end_frame = ff_null_end_frame },
{ .name = NULL }},
.outputs = (AVFilterPad[]) {{ .name = "default",
diff --git a/libavfilter/vf_showinfo.c b/libavfilter/vf_showinfo.c
index aa2a7f16f9..0475f9bf90 100644
--- a/libavfilter/vf_showinfo.c
+++ b/libavfilter/vf_showinfo.c
@@ -26,6 +26,7 @@
#include "libavutil/imgutils.h"
#include "libavutil/pixdesc.h"
#include "avfilter.h"
+#include "video.h"
typedef struct {
unsigned int frame;
@@ -86,8 +87,8 @@ AVFilter avfilter_vf_showinfo = {
.inputs = (AVFilterPad[]) {{ .name = "default",
.type = AVMEDIA_TYPE_VIDEO,
- .get_video_buffer = avfilter_null_get_video_buffer,
- .start_frame = avfilter_null_start_frame,
+ .get_video_buffer = ff_null_get_video_buffer,
+ .start_frame = ff_null_start_frame,
.end_frame = end_frame,
.min_perms = AV_PERM_READ, },
{ .name = NULL}},
diff --git a/libavfilter/vf_slicify.c b/libavfilter/vf_slicify.c
index cc56fe857c..31d74979af 100644
--- a/libavfilter/vf_slicify.c
+++ b/libavfilter/vf_slicify.c
@@ -24,6 +24,7 @@
*/
#include "avfilter.h"
+#include "video.h"
#include "libavutil/pixdesc.h"
typedef struct {
@@ -105,11 +106,11 @@ AVFilter avfilter_vf_slicify = {
.inputs = (AVFilterPad[]) {{ .name = "default",
.type = AVMEDIA_TYPE_VIDEO,
- .get_video_buffer = avfilter_null_get_video_buffer,
+ .get_video_buffer = ff_null_get_video_buffer,
.start_frame = start_frame,
.draw_slice = draw_slice,
.config_props = config_props,
- .end_frame = avfilter_null_end_frame, },
+ .end_frame = ff_null_end_frame, },
{ .name = NULL}},
.outputs = (AVFilterPad[]) {{ .name = "default",
.type = AVMEDIA_TYPE_VIDEO, },
diff --git a/libavfilter/video.c b/libavfilter/video.c
index 74b08379bf..6a19388f6e 100644
--- a/libavfilter/video.c
+++ b/libavfilter/video.c
@@ -65,7 +65,7 @@ static void ff_dlog_ref(void *ctx, AVFilterBufferRef *ref, int end)
av_dlog(ctx, "]%s", end ? "\n" : "");
}
-AVFilterBufferRef *avfilter_null_get_video_buffer(AVFilterLink *link, int perms, int w, int h)
+AVFilterBufferRef *ff_null_get_video_buffer(AVFilterLink *link, int perms, int w, int h)
{
return avfilter_get_video_buffer(link->dst->outputs[0], perms, w, h);
}
@@ -160,7 +160,7 @@ AVFilterBufferRef *avfilter_get_video_buffer(AVFilterLink *link, int perms, int
return ret;
}
-void avfilter_null_start_frame(AVFilterLink *link, AVFilterBufferRef *picref)
+void ff_null_start_frame(AVFilterLink *link, AVFilterBufferRef *picref)
{
avfilter_start_frame(link->dst->outputs[0], picref);
}
@@ -211,7 +211,7 @@ void avfilter_start_frame(AVFilterLink *link, AVFilterBufferRef *picref)
start_frame(link, link->cur_buf);
}
-void avfilter_null_end_frame(AVFilterLink *link)
+void ff_null_end_frame(AVFilterLink *link)
{
avfilter_end_frame(link->dst->outputs[0]);
}
@@ -252,7 +252,7 @@ void avfilter_end_frame(AVFilterLink *link)
}
}
-void avfilter_null_draw_slice(AVFilterLink *link, int y, int h, int slice_dir)
+void ff_null_draw_slice(AVFilterLink *link, int y, int h, int slice_dir)
{
avfilter_draw_slice(link->dst->outputs[0], y, h, slice_dir);
}
@@ -326,4 +326,20 @@ void avfilter_default_draw_slice(AVFilterLink *inlink, int y, int h, int slice_d
{
default_draw_slice(inlink, y, h, slice_dir);
}
+AVFilterBufferRef *avfilter_null_get_video_buffer(AVFilterLink *link, int perms, int w, int h)
+{
+ return ff_null_get_video_buffer(link, perms, w, h);
+}
+void avfilter_null_start_frame(AVFilterLink *link, AVFilterBufferRef *picref)
+{
+ ff_null_start_frame(link, picref);
+}
+void avfilter_null_end_frame(AVFilterLink *link)
+{
+ ff_null_end_frame(link);
+}
+void avfilter_null_draw_slice(AVFilterLink *link, int y, int h, int slice_dir)
+{
+ ff_null_draw_slice(link, y, h, slice_dir);
+}
#endif
diff --git a/libavfilter/video.h b/libavfilter/video.h
index 99f84ecde8..f20f30b27c 100644
--- a/libavfilter/video.h
+++ b/libavfilter/video.h
@@ -21,4 +21,10 @@
AVFilterBufferRef *ff_default_get_video_buffer(AVFilterLink *link,
int perms, int w, int h);
+AVFilterBufferRef *ff_null_get_video_buffer(AVFilterLink *link, int perms, int w, int h);
+
+void ff_null_start_frame(AVFilterLink *link, AVFilterBufferRef *picref);
+void ff_null_draw_slice(AVFilterLink *link, int y, int h, int slice_dir);
+void ff_null_end_frame(AVFilterLink *link);
+
#endif /* AVFILTER_VIDEO_H */