pango: use ported GstVideoOverlayComposition functionality
[platform/upstream/gstreamer.git] / ext / pango / gstbasetextoverlay.h
1 #ifndef __GST_BASE_TEXT_OVERLAY_H__
2 #define __GST_BASE_TEXT_OVERLAY_H__
3
4 #include <gst/gst.h>
5 #include <gst/video/video.h>
6 #include <gst/video/video-overlay-composition.h>
7 #include <pango/pangocairo.h>
8
9 G_BEGIN_DECLS
10
11 #define GST_TYPE_BASE_TEXT_OVERLAY            (gst_base_text_overlay_get_type())
12 #define GST_BASE_TEXT_OVERLAY(obj)            (G_TYPE_CHECK_INSTANCE_CAST((obj),\
13                                          GST_TYPE_BASE_TEXT_OVERLAY, GstBaseTextOverlay))
14 #define GST_BASE_TEXT_OVERLAY_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST((klass),\
15                                          GST_TYPE_BASE_TEXT_OVERLAY,GstBaseTextOverlayClass))
16 #define GST_BASE_TEXT_OVERLAY_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj),\
17                                          GST_TYPE_BASE_TEXT_OVERLAY, GstBaseTextOverlayClass))
18 #define GST_IS_BASE_TEXT_OVERLAY(obj)         (G_TYPE_CHECK_INSTANCE_TYPE((obj),\
19                                          GST_TYPE_BASE_TEXT_OVERLAY))
20 #define GST_IS_BASE_TEXT_OVERLAY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),\
21                                          GST_TYPE_BASE_TEXT_OVERLAY))
22
23 typedef struct _GstBaseTextOverlay      GstBaseTextOverlay;
24 typedef struct _GstBaseTextOverlayClass GstBaseTextOverlayClass;
25
26 /**
27  * GstBaseTextOverlayVAlign:
28  * @GST_BASE_TEXT_OVERLAY_VALIGN_BASELINE: draw text on the baseline
29  * @GST_BASE_TEXT_OVERLAY_VALIGN_BOTTOM: draw text on the bottom
30  * @GST_BASE_TEXT_OVERLAY_VALIGN_TOP: draw text on top
31  * @GST_BASE_TEXT_OVERLAY_VALIGN_POS: draw text according to the #GstBaseTextOverlay:ypos property
32  * @GST_BASE_TEXT_OVERLAY_VALIGN_CENTER: draw text vertically centered
33  *
34  * Vertical alignment of the text.
35  */
36 typedef enum {
37     GST_BASE_TEXT_OVERLAY_VALIGN_BASELINE,
38     GST_BASE_TEXT_OVERLAY_VALIGN_BOTTOM,
39     GST_BASE_TEXT_OVERLAY_VALIGN_TOP,
40     GST_BASE_TEXT_OVERLAY_VALIGN_POS,
41     GST_BASE_TEXT_OVERLAY_VALIGN_CENTER
42 } GstBaseTextOverlayVAlign;
43
44 /**
45  * GstBaseTextOverlayHAlign:
46  * @GST_BASE_TEXT_OVERLAY_HALIGN_LEFT: align text left
47  * @GST_BASE_TEXT_OVERLAY_HALIGN_CENTER: align text center
48  * @GST_BASE_TEXT_OVERLAY_HALIGN_RIGHT: align text right
49  * @GST_BASE_TEXT_OVERLAY_HALIGN_POS: position text according to the #GstBaseTextOverlay:xpos property
50  *
51  * Horizontal alignment of the text.
52  */
53 /* FIXME 0.11: remove GST_BASE_TEXT_OVERLAY_HALIGN_UNUSED */
54 typedef enum {
55     GST_BASE_TEXT_OVERLAY_HALIGN_LEFT,
56     GST_BASE_TEXT_OVERLAY_HALIGN_CENTER,
57     GST_BASE_TEXT_OVERLAY_HALIGN_RIGHT,
58     GST_BASE_TEXT_OVERLAY_HALIGN_UNUSED,
59     GST_BASE_TEXT_OVERLAY_HALIGN_POS
60 } GstBaseTextOverlayHAlign;
61
62 /**
63  * GstBaseTextOverlayWrapMode:
64  * @GST_BASE_TEXT_OVERLAY_WRAP_MODE_NONE: no wrapping
65  * @GST_BASE_TEXT_OVERLAY_WRAP_MODE_WORD: do word wrapping
66  * @GST_BASE_TEXT_OVERLAY_WRAP_MODE_CHAR: do char wrapping
67  * @GST_BASE_TEXT_OVERLAY_WRAP_MODE_WORD_CHAR: do word and char wrapping
68  *
69  * Whether to wrap the text and if so how.
70  */
71 typedef enum {
72     GST_BASE_TEXT_OVERLAY_WRAP_MODE_NONE = -1,
73     GST_BASE_TEXT_OVERLAY_WRAP_MODE_WORD = PANGO_WRAP_WORD,
74     GST_BASE_TEXT_OVERLAY_WRAP_MODE_CHAR = PANGO_WRAP_CHAR,
75     GST_BASE_TEXT_OVERLAY_WRAP_MODE_WORD_CHAR = PANGO_WRAP_WORD_CHAR
76 } GstBaseTextOverlayWrapMode;
77
78 /**
79  * GstBaseTextOverlayLineAlign:
80  * @GST_BASE_TEXT_OVERLAY_LINE_ALIGN_LEFT: lines are left-aligned
81  * @GST_BASE_TEXT_OVERLAY_LINE_ALIGN_CENTER: lines are center-aligned
82  * @GST_BASE_TEXT_OVERLAY_LINE_ALIGN_RIGHT: lines are right-aligned
83  *
84  * Alignment of text lines relative to each other
85  */
86 typedef enum {
87     GST_BASE_TEXT_OVERLAY_LINE_ALIGN_LEFT = PANGO_ALIGN_LEFT,
88     GST_BASE_TEXT_OVERLAY_LINE_ALIGN_CENTER = PANGO_ALIGN_CENTER,
89     GST_BASE_TEXT_OVERLAY_LINE_ALIGN_RIGHT = PANGO_ALIGN_RIGHT
90 } GstBaseTextOverlayLineAlign;
91
92 /**
93  * GstBaseTextOverlay:
94  *
95  * Opaque textoverlay object structure
96  */
97 struct _GstBaseTextOverlay {
98     GstElement               element;
99
100     GstPad                  *video_sinkpad;
101     GstPad                  *text_sinkpad;
102     GstPad                  *srcpad;
103
104     GstSegment               segment;
105     GstSegment               text_segment;
106     GstBuffer               *text_buffer;
107     gboolean                text_linked;
108     gboolean                video_flushing;
109     gboolean                video_eos;
110     gboolean                text_flushing;
111     gboolean                text_eos;
112
113     GMutex                   lock;
114     GCond                    cond;  /* to signal removal of a queued text
115                                      * buffer, arrival of a text buffer,
116                                      * a text segment update, or a change
117                                      * in status (e.g. shutdown, flushing) */
118
119     GstVideoInfo             info;
120     GstVideoFormat           format;
121     gint                     width;
122     gint                     height;
123
124     GstBaseTextOverlayVAlign     valign;
125     GstBaseTextOverlayHAlign     halign;
126     GstBaseTextOverlayWrapMode   wrap_mode;
127     GstBaseTextOverlayLineAlign  line_align;
128
129     gint                     xpad;
130     gint                     ypad;
131     gint                     deltax;
132     gint                     deltay;
133     gdouble                  xpos;
134     gdouble                  ypos;
135     gchar                   *default_text;
136     gboolean                 want_shading;
137     gboolean                 silent;
138     gboolean                 wait_text;
139     guint                    color, outline_color;
140
141     PangoLayout             *layout;
142     gdouble                  shadow_offset;
143     gdouble                  outline_offset;
144     GstBuffer               *text_image;
145     gint                     image_width;
146     gint                     image_height;
147     gint                     baseline_y;
148
149     gboolean                 auto_adjust_size;
150     gboolean                 need_render;
151
152     gint                     shading_value;  /* for timeoverlay subclass */
153
154     gboolean                 have_pango_markup;
155     gboolean                 use_vertical_render;
156
157     gboolean                 attach_compo_to_buffer;
158
159     GstVideoOverlayComposition *composition;
160 };
161
162 struct _GstBaseTextOverlayClass {
163     GstElementClass parent_class;
164
165     PangoContext *pango_context;
166     GMutex       *pango_lock;
167
168     gchar *     (*get_text) (GstBaseTextOverlay *overlay, GstBuffer *video_frame);
169 };
170
171 GType gst_base_text_overlay_get_type(void) G_GNUC_CONST;
172
173 G_END_DECLS
174
175 #endif /* __GST_BASE_TEXT_OVERLAY_H */