## cairooverlay

cairooverlay

## Signals

void | caps-changed |
void | draw |

## Types and Values

struct | GstCairoOverlay

## Object Hierarchy

        GObject
        ╰── GInitiallyUnowned
            ╰── GstObject
                ╰── GstElement
                    ╰── GstBaseTransform
                        ╰── GstVideoFilter
                            ╰── GstCairoOverlay

## Description

cairooverlay renders an overlay using a application provided render function.

The full example can be found in tests/examples/cairo/cairo_overlay.c

### Example code

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54

    #include <gst/gst.h>
    #include <gst/video/video.h>

    ...

    typedef struct {
      gboolean valid;
      int width;
      int height;
    } CairoOverlayState;

    ...

    static void
    prepare_overlay (GstElement * overlay, GstCaps * caps, gpointer user_data)
    {
      CairoOverlayState *state = (CairoOverlayState *)user_data;

      gst_video_format_parse_caps (caps, NULL, &state->width, &state->height);
      state->valid = TRUE;
    }

    static void
    draw_overlay (GstElement * overlay, cairo_t * cr, guint64 timestamp,
      guint64 duration, gpointer user_data)
    {
      CairoOverlayState *s = (CairoOverlayState *)user_data;
      double scale;

      if (!s->valid)
        return;

      scale = 2*(((timestamp/(int)1e7) % 70)+30)/100.0;
      cairo_translate(cr, s->width/2, (s->height/2)-30);
      cairo_scale (cr, scale, scale);

      cairo_move_to (cr, 0, 0);
      cairo_curve_to (cr, 0,-30, -50,-30, -50,0);
      cairo_curve_to (cr, -50,30, 0,35, 0,60 );
      cairo_curve_to (cr, 0,35, 50,30, 50,0 ); *
      cairo_curve_to (cr, 50,-30, 0,-30, 0,0 );
      cairo_set_source_rgba (cr, 0.9, 0.0, 0.1, 0.7);
      cairo_fill (cr);
    }

    ...

    cairo_overlay = gst_element_factory_make ("cairooverlay", "overlay");

    g_signal_connect (cairo_overlay, "draw", G_CALLBACK (draw_overlay),
      overlay_state);
    g_signal_connect (cairo_overlay, "caps-changed",
      G_CALLBACK (prepare_overlay), overlay_state);
    ...

## Synopsis

### Element Information

plugin | cairo
author | Jon Nordby <jononor@gmail.com>
class | Filter/Editor/Video

### Element Pads

name | sink
direction | sink
presence | always
details | video/x-raw, format=(string){ BGRx, BGRA, RGB16 }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

name | src
direction | source
presence | always
details | video/x-raw, format=(string){ BGRx, BGRA, RGB16 }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

## Functions

## Types and Values

### struct GstCairoOverlay

    struct GstCairoOverlay;

## Signal Details

### The `“caps-changed”` signal

    void
    user_function (GstCairoOverlay *overlay,
                   GstCaps         *caps,
                   gpointer         user_data)

This signal is emitted when the caps of the element has changed.

#### Parameters

overlay | Overlay element emitting the signal. |
caps | The GstCaps of the element. |
user_data | user data set when the signal handler was connected. |

### The `“draw”` signal

    void
    user_function (GstCairoOverlay *overlay,
                   CairoContext    *cr,
                   guint64          timestamp,
                   guint64          duration,
                   gpointer         user_data)

This signal is emitted when the overlay should be drawn.

#### Parameters

overlay | Overlay element emitting the signal. |
cr | Cairo context to draw to. |
timestamp | Timestamp (see GstClockTime) of the current buffer. |
duration | Duration (see GstClockTime) of the current buffer. |
user_data | user data set when the signal handler was connected. |