Blame ext/pango/gstbasetextoverlay.h

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