overlaycomposition

overlaycomposition

Types and Values

Description

The overlaycomposition element renders an overlay using an application provided draw function.

A more interesting example can be found at https://cgit.freedesktop.org/gstreamer/gst-plugins-base/tree/tests/examples/overlaycomposition/overlaycomposition.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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#include <gst/gst.h>
#include <gst/video/video.h>

...

typedef struct {
  gboolean valid;
  GstVideoInfo info;
} OverlayState;

...

static void
prepare_overlay (GstElement * overlay, GstCaps * caps, gint window_width,
    gint window_height, gpointer user_data)
{
  OverlayState *s = (OverlayState *)user_data;

  if (gst_video_info_from_caps (&s->info, caps))
    s->valid = TRUE;
}

static GstVideoOverlayComposition *
draw_overlay (GstElement * overlay, GstSample * sample, gpointer user_data)
{
  OverlayState *s = (OverlayState *)user_data;
  GstBuffer *buffer;
  GstVideoOverlayRectangle *rect;
  GstVideoOverlayComposition *comp;
  GstVideoInfo info;
  GstVideoFrame frame;
  gint x, y;
  guint8 *data;

  if (!s->valid)
    return NULL;

  gst_video_info_set_format (&info, GST_VIDEO_FORMAT_BGRA, 16, 16);
  buffer = gst_buffer_new_and_alloc (info.size);
  gst_buffer_add_video_meta (buffer, GST_VIDEO_FRAME_FLAG_NONE,
      GST_VIDEO_INFO_FORMAT(&info),
      GST_VIDEO_INFO_WIDTH(&info),
      GST_VIDEO_INFO_HEIGHT(&info));

  gst_video_frame_map (&frame, &info, buffer, GST_MAP_WRITE);

  // Overlay a half-transparent blue 16x16 rectangle in the middle
  // of the frame
  data = GST_VIDEO_FRAME_PLANE_DATA(&frame, 0);
  for (y = 0; y < 16; y++) {
    guint8 *line = &data[y * GST_VIDEO_FRAME_PLANE_STRIDE (&frame, 0)];
    for (x = 0; x < 16; x++) {
      guint8 *pixel = &line[x * 4];

      pixel[0] = 255;
      pixel[1] = 0;
      pixel[2] = 0;
      pixel[3] = 127;
    }
  }

  gst_video_frame_unmap (&frame);
  rect = gst_video_overlay_rectangle_new_raw (buffer,
      s->info.width / 2 - 8,
      s->info.height / 2 - 8,
      16, 16,
      GST_VIDEO_OVERLAY_FORMAT_FLAG_NONE);
  comp = gst_video_overlay_composition_new (rect);
  gst_video_overlay_rectangle_unref (rect);
  gst_buffer_unref (buffer);

  return comp;
}

...

overlay = gst_element_factory_make ("overlaycomposition", "overlay");

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

Synopsis

Element Information

plugin

overlaycomposition

author

Sebastian Dröge <sebastian@centricular.com>

class

Filter/Editor/Video

Element Pads

name

sink

direction

sink

presence

always

details

video/x-raw, format=(string){ BGRx, RGBx, xRGB, xBGR, RGBA, BGRA, ARGB, ABGR, RGB, BGR, I420, YV12, AYUV, YUY2, UYVY, v308, Y41B, Y42B, Y444, NV12, NV21, A420, YUV9, YVU9, IYU1, GRAY8 }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw(ANY), format=(string){ I420, YV12, YUY2, UYVY, AYUV, RGBx, BGRx, xRGB, xBGR, RGBA, BGRA, ARGB, ABGR, RGB, BGR, Y41B, Y42B, YVYU, Y444, v210, v216, NV12, NV21, GRAY8, GRAY16_BE, GRAY16_LE, v308, RGB16, BGR16, RGB15, BGR15, UYVP, A420, RGB8P, YUV9, YVU9, IYU1, ARGB64, AYUV64, r210, I420_10BE, I420_10LE, I422_10BE, I422_10LE, Y444_10BE, Y444_10LE, GBR, GBR_10BE, GBR_10LE, NV16, NV24, NV12_64Z32, A420_10BE, A420_10LE, A422_10BE, A422_10LE, A444_10BE, A444_10LE, NV61, P010_10BE, P010_10LE, IYU2, VYUY, GBRA, GBRA_10BE, GBRA_10LE, GBR_12BE, GBR_12LE, GBRA_12BE, GBRA_12LE, I420_12BE, I420_12LE, I422_12BE, I422_12LE, Y444_12BE, Y444_12LE, GRAY10_LE32, NV12_10LE32, NV16_10LE32, NV12_10LE40 }, 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, RGBx, xRGB, xBGR, RGBA, BGRA, ARGB, ABGR, RGB, BGR, I420, YV12, AYUV, YUY2, UYVY, v308, Y41B, Y42B, Y444, NV12, NV21, A420, YUV9, YVU9, IYU1, GRAY8 }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

video/x-raw(ANY), format=(string){ I420, YV12, YUY2, UYVY, AYUV, RGBx, BGRx, xRGB, xBGR, RGBA, BGRA, ARGB, ABGR, RGB, BGR, Y41B, Y42B, YVYU, Y444, v210, v216, NV12, NV21, GRAY8, GRAY16_BE, GRAY16_LE, v308, RGB16, BGR16, RGB15, BGR15, UYVP, A420, RGB8P, YUV9, YVU9, IYU1, ARGB64, AYUV64, r210, I420_10BE, I420_10LE, I422_10BE, I422_10LE, Y444_10BE, Y444_10LE, GBR, GBR_10BE, GBR_10LE, NV16, NV24, NV12_64Z32, A420_10BE, A420_10LE, A422_10BE, A422_10LE, A444_10BE, A444_10LE, NV61, P010_10BE, P010_10LE, IYU2, VYUY, GBRA, GBRA_10BE, GBRA_10LE, GBR_12BE, GBR_12LE, GBRA_12BE, GBRA_12LE, I420_12BE, I420_12LE, I422_12BE, I422_12LE, Y444_12BE, Y444_12LE, GRAY10_LE32, NV12_10LE32, NV16_10LE32, NV12_10LE40 }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]

Functions

Types and Values

struct GstOverlayComposition

struct GstOverlayComposition {
  GstElement parent;

  GstPad *sinkpad, *srcpad;

  /* state */
  GstSample *sample;
  GstSegment segment;
  GstCaps *caps;
  GstVideoInfo info;
  guint window_width, window_height;
  gboolean attach_compo_to_buffer;
};