/* GStreamer * Copyright (C) <1999> Erik Walthinsen * Copyright (C) <2003> David Schleef * Copyright (C) <2006> Julien Moutte * Copyright (C) <2006> Zeeshan Ali * Copyright (C) <2006-2008> Tim-Philipp Müller * Copyright (C) <2009> Young-Ho Cha * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef __GST_BASE_TEXT_OVERLAY_H__ #define __GST_BASE_TEXT_OVERLAY_H__ #include #include #include #include G_BEGIN_DECLS #define GST_TYPE_BASE_TEXT_OVERLAY (gst_base_text_overlay_get_type()) #define GST_BASE_TEXT_OVERLAY(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),\ GST_TYPE_BASE_TEXT_OVERLAY, GstBaseTextOverlay)) #define GST_BASE_TEXT_OVERLAY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),\ GST_TYPE_BASE_TEXT_OVERLAY,GstBaseTextOverlayClass)) #define GST_BASE_TEXT_OVERLAY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj),\ GST_TYPE_BASE_TEXT_OVERLAY, GstBaseTextOverlayClass)) #define GST_IS_BASE_TEXT_OVERLAY(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),\ GST_TYPE_BASE_TEXT_OVERLAY)) #define GST_IS_BASE_TEXT_OVERLAY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),\ GST_TYPE_BASE_TEXT_OVERLAY)) typedef struct _GstBaseTextOverlay GstBaseTextOverlay; typedef struct _GstBaseTextOverlayClass GstBaseTextOverlayClass; /** * GstBaseTextOverlayVAlign: * @GST_BASE_TEXT_OVERLAY_VALIGN_BASELINE: draw text on the baseline * @GST_BASE_TEXT_OVERLAY_VALIGN_BOTTOM: draw text on the bottom * @GST_BASE_TEXT_OVERLAY_VALIGN_TOP: draw text on top * @GST_BASE_TEXT_OVERLAY_VALIGN_POS: draw text according to the #GstBaseTextOverlay:ypos property * @GST_BASE_TEXT_OVERLAY_VALIGN_CENTER: draw text vertically centered * * Vertical alignment of the text. */ typedef enum { GST_BASE_TEXT_OVERLAY_VALIGN_BASELINE, GST_BASE_TEXT_OVERLAY_VALIGN_BOTTOM, GST_BASE_TEXT_OVERLAY_VALIGN_TOP, GST_BASE_TEXT_OVERLAY_VALIGN_POS, GST_BASE_TEXT_OVERLAY_VALIGN_CENTER, GST_BASE_TEXT_OVERLAY_VALIGN_ABSOLUTE } GstBaseTextOverlayVAlign; /** * GstBaseTextOverlayHAlign: * @GST_BASE_TEXT_OVERLAY_HALIGN_LEFT: align text left * @GST_BASE_TEXT_OVERLAY_HALIGN_CENTER: align text center * @GST_BASE_TEXT_OVERLAY_HALIGN_RIGHT: align text right * @GST_BASE_TEXT_OVERLAY_HALIGN_POS: position text according to the #GstBaseTextOverlay:xpos property * * Horizontal alignment of the text. */ /* FIXME 0.11: remove GST_BASE_TEXT_OVERLAY_HALIGN_UNUSED */ typedef enum { GST_BASE_TEXT_OVERLAY_HALIGN_LEFT, GST_BASE_TEXT_OVERLAY_HALIGN_CENTER, GST_BASE_TEXT_OVERLAY_HALIGN_RIGHT, GST_BASE_TEXT_OVERLAY_HALIGN_UNUSED, GST_BASE_TEXT_OVERLAY_HALIGN_POS, GST_BASE_TEXT_OVERLAY_HALIGN_ABSOLUTE } GstBaseTextOverlayHAlign; /** * GstBaseTextOverlayWrapMode: * @GST_BASE_TEXT_OVERLAY_WRAP_MODE_NONE: no wrapping * @GST_BASE_TEXT_OVERLAY_WRAP_MODE_WORD: do word wrapping * @GST_BASE_TEXT_OVERLAY_WRAP_MODE_CHAR: do char wrapping * @GST_BASE_TEXT_OVERLAY_WRAP_MODE_WORD_CHAR: do word and char wrapping * * Whether to wrap the text and if so how. */ typedef enum { GST_BASE_TEXT_OVERLAY_WRAP_MODE_NONE = -1, GST_BASE_TEXT_OVERLAY_WRAP_MODE_WORD = PANGO_WRAP_WORD, GST_BASE_TEXT_OVERLAY_WRAP_MODE_CHAR = PANGO_WRAP_CHAR, GST_BASE_TEXT_OVERLAY_WRAP_MODE_WORD_CHAR = PANGO_WRAP_WORD_CHAR } GstBaseTextOverlayWrapMode; /** * GstBaseTextOverlayLineAlign: * @GST_BASE_TEXT_OVERLAY_LINE_ALIGN_LEFT: lines are left-aligned * @GST_BASE_TEXT_OVERLAY_LINE_ALIGN_CENTER: lines are center-aligned * @GST_BASE_TEXT_OVERLAY_LINE_ALIGN_RIGHT: lines are right-aligned * * Alignment of text lines relative to each other */ typedef enum { GST_BASE_TEXT_OVERLAY_LINE_ALIGN_LEFT = PANGO_ALIGN_LEFT, GST_BASE_TEXT_OVERLAY_LINE_ALIGN_CENTER = PANGO_ALIGN_CENTER, GST_BASE_TEXT_OVERLAY_LINE_ALIGN_RIGHT = PANGO_ALIGN_RIGHT } GstBaseTextOverlayLineAlign; /** * GstBaseTextOverlayScaleMode: * @GST_BASE_TEXT_OVERLAY_SCALE_MODE_NONE: no compensation * @GST_BASE_TEXT_OVERLAY_SCALE_MODE_PAR: compensate pixel-aspect-ratio scaling * @GST_BASE_TEXT_OVERLAY_SCALE_MODE_DISPLAY: compensate for scaling to display (as determined by overlay allocation meta) * @GST_BASE_TEXT_OVERLAY_SCALE_MODE_USER: compensate scaling set by #GstBaseTextOverlay:scale-pixel-aspect-ratio property * * Scale text to compensate for and avoid aspect distortion by subsequent * scaling of video */ typedef enum { GST_BASE_TEXT_OVERLAY_SCALE_MODE_NONE, GST_BASE_TEXT_OVERLAY_SCALE_MODE_PAR, GST_BASE_TEXT_OVERLAY_SCALE_MODE_DISPLAY, GST_BASE_TEXT_OVERLAY_SCALE_MODE_USER } GstBaseTextOverlayScaleMode; /** * GstBaseTextOverlay: * * Opaque textoverlay object structure */ struct _GstBaseTextOverlay { GstElement element; GstPad *video_sinkpad; GstPad *text_sinkpad; GstPad *srcpad; GstSegment segment; GstSegment text_segment; GstBuffer *text_buffer; gboolean text_linked; gboolean video_flushing; gboolean video_eos; gboolean text_flushing; gboolean text_eos; GMutex lock; GCond cond; /* to signal removal of a queued text * buffer, arrival of a text buffer, * a text segment update, or a change * in status (e.g. shutdown, flushing) */ /* stream metrics */ GstVideoInfo info; GstVideoFormat format; gint width; gint height; /* properties */ gint xpad; gint ypad; gint deltax; gint deltay; gdouble xpos; gdouble ypos; gchar *default_text; gboolean want_shading; gboolean silent; gboolean wait_text; guint color, outline_color; PangoLayout *layout; gboolean auto_adjust_size; gboolean draw_shadow; gboolean draw_outline; gint shading_value; /* for timeoverlay subclass */ gboolean use_vertical_render; GstBaseTextOverlayVAlign valign; GstBaseTextOverlayHAlign halign; GstBaseTextOverlayWrapMode wrap_mode; GstBaseTextOverlayLineAlign line_align; GstBaseTextOverlayScaleMode scale_mode; gint scale_par_n; gint scale_par_d; /* text pad format */ gboolean have_pango_markup; /* rendering state */ gboolean need_render; GstBuffer *text_image; /* dimension relative to witch the render is done, this is the stream size * or a portion of the window_size (adapted to aspect ratio) */ gint render_width; gint render_height; /* This is (render_width / width) uses to convert to stream scale */ gdouble render_scale; /* dimension of text_image, the physical dimension */ guint text_width; guint text_height; /* position of rendering in image coordinates */ gint text_x; gint text_y; /* window dimension, reported in the composition meta params. This is set * to stream width, height if missing */ gint window_width; gint window_height; gdouble shadow_offset; gdouble outline_offset; PangoRectangle ink_rect; PangoRectangle logical_rect; gboolean attach_compo_to_buffer; GstVideoOverlayComposition *composition; GstVideoOverlayComposition *upstream_composition; }; struct _GstBaseTextOverlayClass { GstElementClass parent_class; PangoContext *pango_context; GMutex *pango_lock; gchar * (*get_text) (GstBaseTextOverlay *overlay, GstBuffer *video_frame); }; GType gst_base_text_overlay_get_type(void) G_GNUC_CONST; G_END_DECLS #endif /* __GST_BASE_TEXT_OVERLAY_H */