Lines Matching full:overlay
262 static void gst_base_text_overlay_init (GstBaseTextOverlay * overlay,
269 GstBaseTextOverlay * overlay, GstCaps * filter);
271 GstBaseTextOverlay * overlay, GstCaps * filter);
272 static gboolean gst_base_text_overlay_setcaps (GstBaseTextOverlay * overlay,
274 static gboolean gst_base_text_overlay_setcaps_txt (GstBaseTextOverlay * overlay,
296 static void gst_base_text_overlay_pop_text (GstBaseTextOverlay * overlay);
305 gst_base_text_overlay_adjust_values_with_fontdesc (GstBaseTextOverlay * overlay,
310 gst_base_text_overlay_update_render_size (GstBaseTextOverlay * overlay);
339 gst_base_text_overlay_get_text (GstBaseTextOverlay * overlay, in gst_base_text_overlay_get_text() argument
342 return g_strdup (overlay->default_text); in gst_base_text_overlay_get_text()
352 "Base Text Overlay"); in gst_base_text_overlay_class_init()
651 GstBaseTextOverlay *overlay = GST_BASE_TEXT_OVERLAY (object); in gst_base_text_overlay_finalize() local
653 g_free (overlay->default_text); in gst_base_text_overlay_finalize()
655 if (overlay->composition) { in gst_base_text_overlay_finalize()
656 gst_video_overlay_composition_unref (overlay->composition); in gst_base_text_overlay_finalize()
657 overlay->composition = NULL; in gst_base_text_overlay_finalize()
660 if (overlay->text_image) { in gst_base_text_overlay_finalize()
661 gst_buffer_unref (overlay->text_image); in gst_base_text_overlay_finalize()
662 overlay->text_image = NULL; in gst_base_text_overlay_finalize()
665 if (overlay->layout) { in gst_base_text_overlay_finalize()
666 g_object_unref (overlay->layout); in gst_base_text_overlay_finalize()
667 overlay->layout = NULL; in gst_base_text_overlay_finalize()
670 if (overlay->text_buffer) { in gst_base_text_overlay_finalize()
671 gst_buffer_unref (overlay->text_buffer); in gst_base_text_overlay_finalize()
672 overlay->text_buffer = NULL; in gst_base_text_overlay_finalize()
675 if (overlay->pango_context) { in gst_base_text_overlay_finalize()
676 g_object_unref (overlay->pango_context); in gst_base_text_overlay_finalize()
677 overlay->pango_context = NULL; in gst_base_text_overlay_finalize()
680 g_mutex_clear (&overlay->lock); in gst_base_text_overlay_finalize()
681 g_cond_clear (&overlay->cond); in gst_base_text_overlay_finalize()
687 gst_base_text_overlay_init (GstBaseTextOverlay * overlay, in gst_base_text_overlay_init() argument
695 overlay->pango_context = in gst_base_text_overlay_init()
698 pango_context_set_base_gravity (overlay->pango_context, PANGO_GRAVITY_SOUTH); in gst_base_text_overlay_init()
702 overlay->video_sinkpad = gst_pad_new_from_template (template, "video_sink"); in gst_base_text_overlay_init()
704 gst_pad_set_event_function (overlay->video_sinkpad, in gst_base_text_overlay_init()
706 gst_pad_set_chain_function (overlay->video_sinkpad, in gst_base_text_overlay_init()
708 gst_pad_set_query_function (overlay->video_sinkpad, in gst_base_text_overlay_init()
710 GST_PAD_SET_PROXY_ALLOCATION (overlay->video_sinkpad); in gst_base_text_overlay_init()
711 gst_element_add_pad (GST_ELEMENT (overlay), overlay->video_sinkpad); in gst_base_text_overlay_init()
718 overlay->text_sinkpad = gst_pad_new_from_template (template, "text_sink"); in gst_base_text_overlay_init()
720 gst_pad_set_event_function (overlay->text_sinkpad, in gst_base_text_overlay_init()
722 gst_pad_set_chain_function (overlay->text_sinkpad, in gst_base_text_overlay_init()
724 gst_pad_set_link_function (overlay->text_sinkpad, in gst_base_text_overlay_init()
726 gst_pad_set_unlink_function (overlay->text_sinkpad, in gst_base_text_overlay_init()
728 gst_element_add_pad (GST_ELEMENT (overlay), overlay->text_sinkpad); in gst_base_text_overlay_init()
733 overlay->srcpad = gst_pad_new_from_template (template, "src"); in gst_base_text_overlay_init()
735 gst_pad_set_event_function (overlay->srcpad, in gst_base_text_overlay_init()
737 gst_pad_set_query_function (overlay->srcpad, in gst_base_text_overlay_init()
739 gst_element_add_pad (GST_ELEMENT (overlay), overlay->srcpad); in gst_base_text_overlay_init()
741 overlay->layout = pango_layout_new (overlay->pango_context); in gst_base_text_overlay_init()
742 desc = pango_context_get_font_description (overlay->pango_context); in gst_base_text_overlay_init()
743 gst_base_text_overlay_adjust_values_with_fontdesc (overlay, desc); in gst_base_text_overlay_init()
745 overlay->color = DEFAULT_PROP_COLOR; in gst_base_text_overlay_init()
746 overlay->outline_color = DEFAULT_PROP_OUTLINE_COLOR; in gst_base_text_overlay_init()
747 overlay->halign = DEFAULT_PROP_HALIGNMENT; in gst_base_text_overlay_init()
748 overlay->valign = DEFAULT_PROP_VALIGNMENT; in gst_base_text_overlay_init()
749 overlay->xpad = DEFAULT_PROP_XPAD; in gst_base_text_overlay_init()
750 overlay->ypad = DEFAULT_PROP_YPAD; in gst_base_text_overlay_init()
751 overlay->deltax = DEFAULT_PROP_DELTAX; in gst_base_text_overlay_init()
752 overlay->deltay = DEFAULT_PROP_DELTAY; in gst_base_text_overlay_init()
753 overlay->xpos = DEFAULT_PROP_XPOS; in gst_base_text_overlay_init()
754 overlay->ypos = DEFAULT_PROP_YPOS; in gst_base_text_overlay_init()
756 overlay->wrap_mode = DEFAULT_PROP_WRAP_MODE; in gst_base_text_overlay_init()
758 overlay->want_shading = DEFAULT_PROP_SHADING; in gst_base_text_overlay_init()
759 overlay->shading_value = DEFAULT_PROP_SHADING_VALUE; in gst_base_text_overlay_init()
760 overlay->silent = DEFAULT_PROP_SILENT; in gst_base_text_overlay_init()
761 overlay->draw_shadow = DEFAULT_PROP_DRAW_SHADOW; in gst_base_text_overlay_init()
762 overlay->draw_outline = DEFAULT_PROP_DRAW_OUTLINE; in gst_base_text_overlay_init()
763 overlay->wait_text = DEFAULT_PROP_WAIT_TEXT; in gst_base_text_overlay_init()
764 overlay->auto_adjust_size = DEFAULT_PROP_AUTO_ADJUST_SIZE; in gst_base_text_overlay_init()
766 overlay->default_text = g_strdup (DEFAULT_PROP_TEXT); in gst_base_text_overlay_init()
767 overlay->need_render = TRUE; in gst_base_text_overlay_init()
768 overlay->text_image = NULL; in gst_base_text_overlay_init()
769 overlay->use_vertical_render = DEFAULT_PROP_VERTICAL_RENDER; in gst_base_text_overlay_init()
770 overlay->scale_mode = DEFAULT_PROP_SCALE_MODE; in gst_base_text_overlay_init()
771 overlay->scale_par_n = DEFAULT_PROP_SCALE_PAR_N; in gst_base_text_overlay_init()
772 overlay->scale_par_d = DEFAULT_PROP_SCALE_PAR_D; in gst_base_text_overlay_init()
774 overlay->line_align = DEFAULT_PROP_LINE_ALIGNMENT; in gst_base_text_overlay_init()
775 pango_layout_set_alignment (overlay->layout, in gst_base_text_overlay_init()
776 (PangoAlignment) overlay->line_align); in gst_base_text_overlay_init()
778 overlay->text_buffer = NULL; in gst_base_text_overlay_init()
779 overlay->text_linked = FALSE; in gst_base_text_overlay_init()
781 overlay->composition = NULL; in gst_base_text_overlay_init()
782 overlay->upstream_composition = NULL; in gst_base_text_overlay_init()
784 overlay->width = 1; in gst_base_text_overlay_init()
785 overlay->height = 1; in gst_base_text_overlay_init()
787 overlay->window_width = 1; in gst_base_text_overlay_init()
788 overlay->window_height = 1; in gst_base_text_overlay_init()
790 overlay->text_width = DEFAULT_PROP_TEXT_WIDTH; in gst_base_text_overlay_init()
791 overlay->text_height = DEFAULT_PROP_TEXT_HEIGHT; in gst_base_text_overlay_init()
793 overlay->text_x = DEFAULT_PROP_TEXT_X; in gst_base_text_overlay_init()
794 overlay->text_y = DEFAULT_PROP_TEXT_Y; in gst_base_text_overlay_init()
796 overlay->render_width = 1; in gst_base_text_overlay_init()
797 overlay->render_height = 1; in gst_base_text_overlay_init()
798 overlay->render_scale = 1.0l; in gst_base_text_overlay_init()
800 g_mutex_init (&overlay->lock); in gst_base_text_overlay_init()
801 g_cond_init (&overlay->cond); in gst_base_text_overlay_init()
802 gst_segment_init (&overlay->segment, GST_FORMAT_TIME); in gst_base_text_overlay_init()
806 gst_base_text_overlay_set_wrap_mode (GstBaseTextOverlay * overlay, gint width) in gst_base_text_overlay_set_wrap_mode() argument
808 if (overlay->wrap_mode == GST_BASE_TEXT_OVERLAY_WRAP_MODE_NONE) { in gst_base_text_overlay_set_wrap_mode()
809 GST_DEBUG_OBJECT (overlay, "Set wrap mode NONE"); in gst_base_text_overlay_set_wrap_mode()
810 pango_layout_set_width (overlay->layout, -1); in gst_base_text_overlay_set_wrap_mode()
814 GST_DEBUG_OBJECT (overlay, "Set layout width %d", width); in gst_base_text_overlay_set_wrap_mode()
815 GST_DEBUG_OBJECT (overlay, "Set wrap mode %d", overlay->wrap_mode); in gst_base_text_overlay_set_wrap_mode()
816 pango_layout_set_width (overlay->layout, width); in gst_base_text_overlay_set_wrap_mode()
819 pango_layout_set_wrap (overlay->layout, (PangoWrapMode) overlay->wrap_mode); in gst_base_text_overlay_set_wrap_mode()
823 gst_base_text_overlay_setcaps_txt (GstBaseTextOverlay * overlay, GstCaps * caps) in gst_base_text_overlay_setcaps_txt() argument
830 overlay->have_pango_markup = (strcmp (format, "pango-markup") == 0); in gst_base_text_overlay_setcaps_txt()
835 /* only negotiate/query video overlay composition support for now */
837 gst_base_text_overlay_negotiate (GstBaseTextOverlay * overlay, GstCaps * caps) in gst_base_text_overlay_negotiate() argument
850 GST_DEBUG_OBJECT (overlay, "performing negotiation"); in gst_base_text_overlay_negotiate()
853 gst_pad_check_reconfigure (overlay->srcpad); in gst_base_text_overlay_negotiate()
856 caps = gst_pad_get_current_caps (overlay->video_sinkpad); in gst_base_text_overlay_negotiate()
870 width = overlay->width; in gst_base_text_overlay_negotiate()
871 height = overlay->height; in gst_base_text_overlay_negotiate()
884 /* Then check if downstream accept overlay composition in caps */ in gst_base_text_overlay_negotiate()
886 * overlay meta, and only enforce usage of it if we can't handle in gst_base_text_overlay_negotiate()
890 peercaps = gst_pad_peer_query_caps (overlay->srcpad, overlay_caps); in gst_base_text_overlay_negotiate()
894 GST_DEBUG_OBJECT (overlay, "caps have overlay meta %d", caps_has_meta); in gst_base_text_overlay_negotiate()
900 ret = gst_pad_set_caps (overlay->srcpad, overlay_caps); in gst_base_text_overlay_negotiate()
905 if (!gst_pad_peer_query (overlay->srcpad, query)) { in gst_base_text_overlay_negotiate()
907 GST_DEBUG_OBJECT (overlay, "ALLOCATION query failed"); in gst_base_text_overlay_negotiate()
911 if (overlay->video_flushing) in gst_base_text_overlay_negotiate()
918 GST_DEBUG_OBJECT (overlay, "sink alloc has overlay meta %d", in gst_base_text_overlay_negotiate()
928 GST_DEBUG_OBJECT (overlay, "received window size: %dx%d", width, in gst_base_text_overlay_negotiate()
939 overlay->window_width = width; in gst_base_text_overlay_negotiate()
940 overlay->window_height = height; in gst_base_text_overlay_negotiate()
941 gst_base_text_overlay_update_render_size (overlay); in gst_base_text_overlay_negotiate()
961 /* If we attach, then pick the overlay caps */ in gst_base_text_overlay_negotiate()
963 GST_DEBUG_OBJECT (overlay, "Using caps %" GST_PTR_FORMAT, overlay_caps); in gst_base_text_overlay_negotiate()
966 GST_DEBUG_OBJECT (overlay, "Using caps %" GST_PTR_FORMAT, caps); in gst_base_text_overlay_negotiate()
967 ret = gst_pad_set_caps (overlay->srcpad, caps); in gst_base_text_overlay_negotiate()
970 overlay->attach_compo_to_buffer = attach; in gst_base_text_overlay_negotiate()
973 GST_DEBUG_OBJECT (overlay, "negotiation failed, schedule reconfigure"); in gst_base_text_overlay_negotiate()
974 gst_pad_mark_reconfigure (overlay->srcpad); in gst_base_text_overlay_negotiate()
986 gst_pad_mark_reconfigure (overlay->srcpad); in gst_base_text_overlay_negotiate()
1005 gst_base_text_overlay_setcaps (GstBaseTextOverlay * overlay, GstCaps * caps) in gst_base_text_overlay_setcaps() argument
1014 if (GST_VIDEO_INFO_WIDTH (&info) != GST_VIDEO_INFO_WIDTH (&overlay->info) || in gst_base_text_overlay_setcaps()
1015 GST_VIDEO_INFO_HEIGHT (&info) != GST_VIDEO_INFO_HEIGHT (&overlay->info)) in gst_base_text_overlay_setcaps()
1016 overlay->need_render = TRUE; in gst_base_text_overlay_setcaps()
1018 overlay->info = info; in gst_base_text_overlay_setcaps()
1019 overlay->format = GST_VIDEO_INFO_FORMAT (&info); in gst_base_text_overlay_setcaps()
1020 overlay->width = GST_VIDEO_INFO_WIDTH (&info); in gst_base_text_overlay_setcaps()
1021 overlay->height = GST_VIDEO_INFO_HEIGHT (&info); in gst_base_text_overlay_setcaps()
1023 ret = gst_base_text_overlay_negotiate (overlay, caps); in gst_base_text_overlay_setcaps()
1025 GST_BASE_TEXT_OVERLAY_LOCK (overlay); in gst_base_text_overlay_setcaps()
1027 if (!overlay->attach_compo_to_buffer && in gst_base_text_overlay_setcaps()
1029 GST_DEBUG_OBJECT (overlay, "unsupported caps %" GST_PTR_FORMAT, caps); in gst_base_text_overlay_setcaps()
1032 GST_BASE_TEXT_OVERLAY_UNLOCK (overlay); in gst_base_text_overlay_setcaps()
1039 GST_DEBUG_OBJECT (overlay, "could not parse caps"); in gst_base_text_overlay_setcaps()
1048 GstBaseTextOverlay *overlay = GST_BASE_TEXT_OVERLAY (object); in gst_base_text_overlay_set_property() local
1050 GST_BASE_TEXT_OVERLAY_LOCK (overlay); in gst_base_text_overlay_set_property()
1053 g_free (overlay->default_text); in gst_base_text_overlay_set_property()
1054 overlay->default_text = g_value_dup_string (value); in gst_base_text_overlay_set_property()
1057 overlay->want_shading = g_value_get_boolean (value); in gst_base_text_overlay_set_property()
1060 overlay->xpad = g_value_get_int (value); in gst_base_text_overlay_set_property()
1063 overlay->ypad = g_value_get_int (value); in gst_base_text_overlay_set_property()
1066 overlay->deltax = g_value_get_int (value); in gst_base_text_overlay_set_property()
1069 overlay->deltay = g_value_get_int (value); in gst_base_text_overlay_set_property()
1072 overlay->xpos = g_value_get_double (value); in gst_base_text_overlay_set_property()
1075 overlay->ypos = g_value_get_double (value); in gst_base_text_overlay_set_property()
1078 overlay->xpos = g_value_get_double (value); in gst_base_text_overlay_set_property()
1081 overlay->ypos = g_value_get_double (value); in gst_base_text_overlay_set_property()
1084 overlay->valign = g_value_get_enum (value); in gst_base_text_overlay_set_property()
1087 overlay->halign = g_value_get_enum (value); in gst_base_text_overlay_set_property()
1090 overlay->wrap_mode = g_value_get_enum (value); in gst_base_text_overlay_set_property()
1100 GST_LOG_OBJECT (overlay, "font description set: %s", fontdesc_str); in gst_base_text_overlay_set_property()
1101 pango_layout_set_font_description (overlay->layout, desc); in gst_base_text_overlay_set_property()
1102 gst_base_text_overlay_adjust_values_with_fontdesc (overlay, desc); in gst_base_text_overlay_set_property()
1105 GST_WARNING_OBJECT (overlay, "font description parse failed: %s", in gst_base_text_overlay_set_property()
1111 overlay->color = g_value_get_uint (value); in gst_base_text_overlay_set_property()
1114 overlay->outline_color = g_value_get_uint (value); in gst_base_text_overlay_set_property()
1117 overlay->silent = g_value_get_boolean (value); in gst_base_text_overlay_set_property()
1120 overlay->draw_shadow = g_value_get_boolean (value); in gst_base_text_overlay_set_property()
1123 overlay->draw_outline = g_value_get_boolean (value); in gst_base_text_overlay_set_property()
1126 overlay->line_align = g_value_get_enum (value); in gst_base_text_overlay_set_property()
1127 pango_layout_set_alignment (overlay->layout, in gst_base_text_overlay_set_property()
1128 (PangoAlignment) overlay->line_align); in gst_base_text_overlay_set_property()
1131 overlay->wait_text = g_value_get_boolean (value); in gst_base_text_overlay_set_property()
1134 overlay->auto_adjust_size = g_value_get_boolean (value); in gst_base_text_overlay_set_property()
1137 overlay->use_vertical_render = g_value_get_boolean (value); in gst_base_text_overlay_set_property()
1138 if (overlay->use_vertical_render) { in gst_base_text_overlay_set_property()
1139 overlay->valign = GST_BASE_TEXT_OVERLAY_VALIGN_TOP; in gst_base_text_overlay_set_property()
1140 overlay->halign = GST_BASE_TEXT_OVERLAY_HALIGN_RIGHT; in gst_base_text_overlay_set_property()
1141 overlay->line_align = GST_BASE_TEXT_OVERLAY_LINE_ALIGN_LEFT; in gst_base_text_overlay_set_property()
1142 pango_layout_set_alignment (overlay->layout, in gst_base_text_overlay_set_property()
1143 (PangoAlignment) overlay->line_align); in gst_base_text_overlay_set_property()
1147 overlay->scale_mode = g_value_get_enum (value); in gst_base_text_overlay_set_property()
1150 overlay->scale_par_n = gst_value_get_fraction_numerator (value); in gst_base_text_overlay_set_property()
1151 overlay->scale_par_d = gst_value_get_fraction_denominator (value); in gst_base_text_overlay_set_property()
1154 overlay->shading_value = g_value_get_uint (value); in gst_base_text_overlay_set_property()
1161 overlay->need_render = TRUE; in gst_base_text_overlay_set_property()
1162 GST_BASE_TEXT_OVERLAY_UNLOCK (overlay); in gst_base_text_overlay_set_property()
1169 GstBaseTextOverlay *overlay = GST_BASE_TEXT_OVERLAY (object); in gst_base_text_overlay_get_property() local
1171 GST_BASE_TEXT_OVERLAY_LOCK (overlay); in gst_base_text_overlay_get_property()
1174 g_value_set_string (value, overlay->default_text); in gst_base_text_overlay_get_property()
1177 g_value_set_boolean (value, overlay->want_shading); in gst_base_text_overlay_get_property()
1180 g_value_set_int (value, overlay->xpad); in gst_base_text_overlay_get_property()
1183 g_value_set_int (value, overlay->ypad); in gst_base_text_overlay_get_property()
1186 g_value_set_int (value, overlay->deltax); in gst_base_text_overlay_get_property()
1189 g_value_set_int (value, overlay->deltay); in gst_base_text_overlay_get_property()
1192 g_value_set_double (value, overlay->xpos); in gst_base_text_overlay_get_property()
1195 g_value_set_double (value, overlay->ypos); in gst_base_text_overlay_get_property()
1198 g_value_set_double (value, overlay->xpos); in gst_base_text_overlay_get_property()
1201 g_value_set_double (value, overlay->ypos); in gst_base_text_overlay_get_property()
1204 g_value_set_enum (value, overlay->valign); in gst_base_text_overlay_get_property()
1207 g_value_set_enum (value, overlay->halign); in gst_base_text_overlay_get_property()
1210 g_value_set_enum (value, overlay->wrap_mode); in gst_base_text_overlay_get_property()
1213 g_value_set_boolean (value, overlay->silent); in gst_base_text_overlay_get_property()
1216 g_value_set_boolean (value, overlay->draw_shadow); in gst_base_text_overlay_get_property()
1219 g_value_set_boolean (value, overlay->draw_outline); in gst_base_text_overlay_get_property()
1222 g_value_set_enum (value, overlay->line_align); in gst_base_text_overlay_get_property()
1225 g_value_set_boolean (value, overlay->wait_text); in gst_base_text_overlay_get_property()
1228 g_value_set_boolean (value, overlay->auto_adjust_size); in gst_base_text_overlay_get_property()
1231 g_value_set_boolean (value, overlay->use_vertical_render); in gst_base_text_overlay_get_property()
1234 g_value_set_enum (value, overlay->scale_mode); in gst_base_text_overlay_get_property()
1237 gst_value_set_fraction (value, overlay->scale_par_n, in gst_base_text_overlay_get_property()
1238 overlay->scale_par_d); in gst_base_text_overlay_get_property()
1241 g_value_set_uint (value, overlay->color); in gst_base_text_overlay_get_property()
1244 g_value_set_uint (value, overlay->outline_color); in gst_base_text_overlay_get_property()
1247 g_value_set_uint (value, overlay->shading_value); in gst_base_text_overlay_get_property()
1253 desc = pango_layout_get_font_description (overlay->layout); in gst_base_text_overlay_get_property()
1262 g_value_set_int (value, overlay->text_x); in gst_base_text_overlay_get_property()
1265 g_value_set_int (value, overlay->text_y); in gst_base_text_overlay_get_property()
1268 g_value_set_uint (value, overlay->text_width); in gst_base_text_overlay_get_property()
1271 g_value_set_uint (value, overlay->text_height); in gst_base_text_overlay_get_property()
1278 overlay->need_render = TRUE; in gst_base_text_overlay_get_property()
1279 GST_BASE_TEXT_OVERLAY_UNLOCK (overlay); in gst_base_text_overlay_get_property()
1287 GstBaseTextOverlay *overlay; in gst_base_text_overlay_src_query() local
1289 overlay = GST_BASE_TEXT_OVERLAY (parent); in gst_base_text_overlay_src_query()
1297 caps = gst_base_text_overlay_get_src_caps (pad, overlay, filter); in gst_base_text_overlay_src_query()
1312 gst_base_text_overlay_update_render_size (GstBaseTextOverlay * overlay) in gst_base_text_overlay_update_render_size() argument
1314 gdouble video_aspect = (gdouble) overlay->width / (gdouble) overlay->height; in gst_base_text_overlay_update_render_size()
1315 gdouble window_aspect = (gdouble) overlay->window_width / in gst_base_text_overlay_update_render_size()
1316 (gdouble) overlay->window_height; in gst_base_text_overlay_update_render_size()
1322 text_buffer_width = overlay->window_width; in gst_base_text_overlay_update_render_size()
1323 text_buffer_height = window_aspect * overlay->window_height / video_aspect; in gst_base_text_overlay_update_render_size()
1325 text_buffer_width = video_aspect * overlay->window_width / window_aspect; in gst_base_text_overlay_update_render_size()
1326 text_buffer_height = overlay->window_height; in gst_base_text_overlay_update_render_size()
1329 if ((overlay->render_width == text_buffer_width) && in gst_base_text_overlay_update_render_size()
1330 (overlay->render_height == text_buffer_height)) in gst_base_text_overlay_update_render_size()
1333 overlay->need_render = TRUE; in gst_base_text_overlay_update_render_size()
1334 overlay->render_width = text_buffer_width; in gst_base_text_overlay_update_render_size()
1335 overlay->render_height = text_buffer_height; in gst_base_text_overlay_update_render_size()
1336 overlay->render_scale = (gdouble) overlay->render_width / in gst_base_text_overlay_update_render_size()
1337 (gdouble) overlay->width; in gst_base_text_overlay_update_render_size()
1340 "and render scale %f", overlay->render_width, overlay->render_height, in gst_base_text_overlay_update_render_size()
1341 overlay->width, overlay->height, overlay->window_width, in gst_base_text_overlay_update_render_size()
1342 overlay->window_height, overlay->render_scale); in gst_base_text_overlay_update_render_size()
1349 GstBaseTextOverlay *overlay; in gst_base_text_overlay_src_event() local
1352 overlay = GST_BASE_TEXT_OVERLAY (parent); in gst_base_text_overlay_src_event()
1354 if (overlay->text_linked) { in gst_base_text_overlay_src_event()
1356 ret = gst_pad_push_event (overlay->video_sinkpad, event); in gst_base_text_overlay_src_event()
1357 gst_pad_push_event (overlay->text_sinkpad, event); in gst_base_text_overlay_src_event()
1359 ret = gst_pad_push_event (overlay->video_sinkpad, event); in gst_base_text_overlay_src_event()
1446 GstBaseTextOverlay * overlay, GstCaps * filter) in gst_base_text_overlay_get_videosink_caps() argument
1448 GstPad *srcpad = overlay->srcpad; in gst_base_text_overlay_get_videosink_caps()
1459 GST_DEBUG_OBJECT (overlay, "overlay filter %" GST_PTR_FORMAT, in gst_base_text_overlay_get_videosink_caps()
1499 GST_DEBUG_OBJECT (overlay, "returning %" GST_PTR_FORMAT, caps); in gst_base_text_overlay_get_videosink_caps()
1505 gst_base_text_overlay_get_src_caps (GstPad * pad, GstBaseTextOverlay * overlay, in gst_base_text_overlay_get_src_caps() argument
1508 GstPad *sinkpad = overlay->video_sinkpad; in gst_base_text_overlay_get_src_caps()
1561 GST_DEBUG_OBJECT (overlay, "returning %" GST_PTR_FORMAT, caps); in gst_base_text_overlay_get_src_caps()
1567 gst_base_text_overlay_adjust_values_with_fontdesc (GstBaseTextOverlay * overlay, in gst_base_text_overlay_adjust_values_with_fontdesc() argument
1571 overlay->shadow_offset = (double) (font_size) / 13.0; in gst_base_text_overlay_adjust_values_with_fontdesc()
1572 overlay->outline_offset = (double) (font_size) / 15.0; in gst_base_text_overlay_adjust_values_with_fontdesc()
1573 if (overlay->outline_offset < MINIMUM_OUTLINE_OFFSET) in gst_base_text_overlay_adjust_values_with_fontdesc()
1574 overlay->outline_offset = MINIMUM_OUTLINE_OFFSET; in gst_base_text_overlay_adjust_values_with_fontdesc()
1578 gst_base_text_overlay_get_pos (GstBaseTextOverlay * overlay, in gst_base_text_overlay_get_pos() argument
1583 width = overlay->logical_rect.width; in gst_base_text_overlay_get_pos()
1584 height = overlay->logical_rect.height; in gst_base_text_overlay_get_pos()
1586 *xpos = overlay->ink_rect.x - overlay->logical_rect.x; in gst_base_text_overlay_get_pos()
1587 switch (overlay->halign) { in gst_base_text_overlay_get_pos()
1589 *xpos += overlay->xpad; in gst_base_text_overlay_get_pos()
1593 *xpos += (overlay->width - width) / 2; in gst_base_text_overlay_get_pos()
1596 *xpos += overlay->width - width - overlay->xpad; in gst_base_text_overlay_get_pos()
1597 *xpos = MIN (overlay->width - overlay->ink_rect.width, *xpos); in gst_base_text_overlay_get_pos()
1600 *xpos += (gint) (overlay->width * overlay->xpos) - width / 2; in gst_base_text_overlay_get_pos()
1601 *xpos = CLAMP (*xpos, 0, overlay->width - overlay->ink_rect.width); in gst_base_text_overlay_get_pos()
1606 *xpos = (overlay->width - overlay->text_width) * overlay->xpos; in gst_base_text_overlay_get_pos()
1611 *xpos += overlay->deltax; in gst_base_text_overlay_get_pos()
1613 *ypos = overlay->ink_rect.y - overlay->logical_rect.y; in gst_base_text_overlay_get_pos()
1614 switch (overlay->valign) { in gst_base_text_overlay_get_pos()
1618 *ypos += overlay->height - height - overlay->ypad; in gst_base_text_overlay_get_pos()
1619 *ypos = MIN (overlay->height - overlay->ink_rect.height, *ypos); in gst_base_text_overlay_get_pos()
1622 *ypos += overlay->height - height - overlay->ypad; in gst_base_text_overlay_get_pos()
1626 *ypos += overlay->ypad; in gst_base_text_overlay_get_pos()
1630 *ypos = (gint) (overlay->height * overlay->ypos) - height / 2; in gst_base_text_overlay_get_pos()
1631 *ypos = CLAMP (*ypos, 0, overlay->height - overlay->ink_rect.height); in gst_base_text_overlay_get_pos()
1634 *ypos = (overlay->height - overlay->text_height) * overlay->ypos; in gst_base_text_overlay_get_pos()
1637 *ypos = (overlay->height - height) / 2; in gst_base_text_overlay_get_pos()
1640 *ypos = overlay->ypad; in gst_base_text_overlay_get_pos()
1643 *ypos += overlay->deltay; in gst_base_text_overlay_get_pos()
1645 overlay->text_x = *xpos; in gst_base_text_overlay_get_pos()
1646 overlay->text_y = *ypos; in gst_base_text_overlay_get_pos()
1648 GST_DEBUG_OBJECT (overlay, "Placing overlay at (%d, %d)", *xpos, *ypos); in gst_base_text_overlay_get_pos()
1652 gst_base_text_overlay_set_composition (GstBaseTextOverlay * overlay) in gst_base_text_overlay_set_composition() argument
1657 if (overlay->text_image && overlay->text_width != 1) { in gst_base_text_overlay_set_composition()
1660 gst_base_text_overlay_get_pos (overlay, &xpos, &ypos); in gst_base_text_overlay_set_composition()
1662 render_width = overlay->ink_rect.width; in gst_base_text_overlay_set_composition()
1663 render_height = overlay->ink_rect.height; in gst_base_text_overlay_set_composition()
1667 overlay->default_text, overlay->window_width, overlay->window_height, in gst_base_text_overlay_set_composition()
1668 overlay->text_width, overlay->text_height, render_width, in gst_base_text_overlay_set_composition()
1671 gst_buffer_add_video_meta (overlay->text_image, GST_VIDEO_FRAME_FLAG_NONE, in gst_base_text_overlay_set_composition()
1673 overlay->text_width, overlay->text_height); in gst_base_text_overlay_set_composition()
1675 rectangle = gst_video_overlay_rectangle_new_raw (overlay->text_image, in gst_base_text_overlay_set_composition()
1679 if (overlay->composition) in gst_base_text_overlay_set_composition()
1680 gst_video_overlay_composition_unref (overlay->composition); in gst_base_text_overlay_set_composition()
1682 if (overlay->upstream_composition) { in gst_base_text_overlay_set_composition()
1683 overlay->composition = in gst_base_text_overlay_set_composition()
1684 gst_video_overlay_composition_copy (overlay->upstream_composition); in gst_base_text_overlay_set_composition()
1685 gst_video_overlay_composition_add_rectangle (overlay->composition, in gst_base_text_overlay_set_composition()
1688 overlay->composition = gst_video_overlay_composition_new (rectangle); in gst_base_text_overlay_set_composition()
1693 } else if (overlay->composition) { in gst_base_text_overlay_set_composition()
1694 gst_video_overlay_composition_unref (overlay->composition); in gst_base_text_overlay_set_composition()
1695 overlay->composition = NULL; in gst_base_text_overlay_set_composition()
1710 gst_base_text_overlay_render_pangocairo (GstBaseTextOverlay * overlay, in gst_base_text_overlay_render_pangocairo() argument
1728 if (overlay->auto_adjust_size) { in gst_base_text_overlay_render_pangocairo()
1730 scalef_x = scalef_y = (double) (overlay->width) / DEFAULT_SCALE_BASIS; in gst_base_text_overlay_render_pangocairo()
1733 if (overlay->scale_mode != GST_BASE_TEXT_OVERLAY_SCALE_MODE_NONE) { in gst_base_text_overlay_render_pangocairo()
1736 switch (overlay->scale_mode) { in gst_base_text_overlay_render_pangocairo()
1738 par_n = overlay->info.par_n; in gst_base_text_overlay_render_pangocairo()
1739 par_d = overlay->info.par_d; in gst_base_text_overlay_render_pangocairo()
1743 if (!gst_util_fraction_multiply (overlay->window_width, in gst_base_text_overlay_render_pangocairo()
1744 overlay->window_height, overlay->height, overlay->width, in gst_base_text_overlay_render_pangocairo()
1746 GST_WARNING_OBJECT (overlay, in gst_base_text_overlay_render_pangocairo()
1752 par_n = overlay->scale_par_n; in gst_base_text_overlay_render_pangocairo()
1753 par_d = overlay->scale_par_d; in gst_base_text_overlay_render_pangocairo()
1764 if (overlay->use_vertical_render) { in gst_base_text_overlay_render_pangocairo()
1769 GST_DEBUG_OBJECT (overlay, in gst_base_text_overlay_render_pangocairo()
1771 overlay->scale_mode, par_n, par_d, scalef_x, scalef_y); in gst_base_text_overlay_render_pangocairo()
1774 if (overlay->draw_shadow) in gst_base_text_overlay_render_pangocairo()
1775 shadow_offset = ceil (overlay->shadow_offset); in gst_base_text_overlay_render_pangocairo()
1779 if (overlay->draw_outline) in gst_base_text_overlay_render_pangocairo()
1780 outline_offset = ceil (overlay->outline_offset); in gst_base_text_overlay_render_pangocairo()
1782 if (overlay->halign == GST_BASE_TEXT_OVERLAY_HALIGN_LEFT || in gst_base_text_overlay_render_pangocairo()
1783 overlay->halign == GST_BASE_TEXT_OVERLAY_HALIGN_RIGHT) in gst_base_text_overlay_render_pangocairo()
1784 xpad = overlay->xpad; in gst_base_text_overlay_render_pangocairo()
1786 if (overlay->valign == GST_BASE_TEXT_OVERLAY_VALIGN_TOP || in gst_base_text_overlay_render_pangocairo()
1787 overlay->valign == GST_BASE_TEXT_OVERLAY_VALIGN_BOTTOM) in gst_base_text_overlay_render_pangocairo()
1788 ypad = overlay->ypad; in gst_base_text_overlay_render_pangocairo()
1790 pango_layout_set_width (overlay->layout, -1); in gst_base_text_overlay_render_pangocairo()
1792 pango_layout_set_markup (overlay->layout, string, textlen); in gst_base_text_overlay_render_pangocairo()
1795 pango_layout_get_pixel_extents (overlay->layout, &ink_rect, &logical_rect); in gst_base_text_overlay_render_pangocairo()
1801 * subtitle image width can be larger then overlay width in gst_base_text_overlay_render_pangocairo()
1802 * so rearrange overlay wrap mode. in gst_base_text_overlay_render_pangocairo()
1804 if (overlay->use_vertical_render) { in gst_base_text_overlay_render_pangocairo()
1805 if (width + ypad > overlay->height) { in gst_base_text_overlay_render_pangocairo()
1806 width = overlay->height - ypad; in gst_base_text_overlay_render_pangocairo()
1809 } else if (width + xpad > overlay->width) { in gst_base_text_overlay_render_pangocairo()
1810 width = overlay->width - xpad; in gst_base_text_overlay_render_pangocairo()
1816 gst_base_text_overlay_set_wrap_mode (overlay, in gst_base_text_overlay_render_pangocairo()
1818 pango_layout_get_pixel_extents (overlay->layout, &ink_rect, &logical_rect); in gst_base_text_overlay_render_pangocairo()
1827 if (overlay->use_vertical_render) { in gst_base_text_overlay_render_pangocairo()
1828 if (height + xpad > overlay->width) { in gst_base_text_overlay_render_pangocairo()
1829 height = overlay->width - xpad; in gst_base_text_overlay_render_pangocairo()
1832 } else if (height + ypad > overlay->height) { in gst_base_text_overlay_render_pangocairo()
1833 height = overlay->height - ypad; in gst_base_text_overlay_render_pangocairo()
1837 GST_DEBUG_OBJECT (overlay, "Rendering with ink rect (%d, %d) %dx%d and " in gst_base_text_overlay_render_pangocairo()
1841 GST_DEBUG_OBJECT (overlay, "Rendering with width %d and height %d " in gst_base_text_overlay_render_pangocairo()
1847 overlay->ink_rect.x = in gst_base_text_overlay_render_pangocairo()
1849 overlay->ink_rect.y = in gst_base_text_overlay_render_pangocairo()
1851 overlay->ink_rect.width = width; in gst_base_text_overlay_render_pangocairo()
1852 overlay->ink_rect.height = height; in gst_base_text_overlay_render_pangocairo()
1854 overlay->logical_rect.x = in gst_base_text_overlay_render_pangocairo()
1856 overlay->logical_rect.y = in gst_base_text_overlay_render_pangocairo()
1858 overlay->logical_rect.width = in gst_base_text_overlay_render_pangocairo()
1860 overlay->logical_rect.height = in gst_base_text_overlay_render_pangocairo()
1864 if (overlay->use_vertical_render) { in gst_base_text_overlay_render_pangocairo()
1865 PangoRectangle tmp = overlay->ink_rect; in gst_base_text_overlay_render_pangocairo()
1867 overlay->ink_rect.x = tmp.y; in gst_base_text_overlay_render_pangocairo()
1868 overlay->ink_rect.y = tmp.x; in gst_base_text_overlay_render_pangocairo()
1869 overlay->ink_rect.width = tmp.height; in gst_base_text_overlay_render_pangocairo()
1870 overlay->ink_rect.height = tmp.width; in gst_base_text_overlay_render_pangocairo()
1872 overlay->ink_rect.x += overlay->ink_rect.width; in gst_base_text_overlay_render_pangocairo()
1874 tmp = overlay->logical_rect; in gst_base_text_overlay_render_pangocairo()
1875 overlay->logical_rect.x = tmp.y; in gst_base_text_overlay_render_pangocairo()
1876 overlay->logical_rect.y = tmp.x; in gst_base_text_overlay_render_pangocairo()
1877 overlay->logical_rect.width = tmp.height; in gst_base_text_overlay_render_pangocairo()
1878 overlay->logical_rect.height = tmp.width; in gst_base_text_overlay_render_pangocairo()
1879 overlay->logical_rect.x += overlay->logical_rect.width; in gst_base_text_overlay_render_pangocairo()
1883 width = ceil (width * overlay->render_scale); in gst_base_text_overlay_render_pangocairo()
1884 height = ceil (height * overlay->render_scale); in gst_base_text_overlay_render_pangocairo()
1885 scalef_x *= overlay->render_scale; in gst_base_text_overlay_render_pangocairo()
1886 scalef_y *= overlay->render_scale; in gst_base_text_overlay_render_pangocairo()
1889 GST_DEBUG_OBJECT (overlay, in gst_base_text_overlay_render_pangocairo()
1890 "Overlay is outside video frame. Skipping text rendering"); in gst_base_text_overlay_render_pangocairo()
1895 GST_DEBUG_OBJECT (overlay, in gst_base_text_overlay_render_pangocairo()
1896 "Overlay is outside video frame. Skipping text rendering"); in gst_base_text_overlay_render_pangocairo()
1905 if (overlay->use_vertical_render) { in gst_base_text_overlay_render_pangocairo()
1914 if (overlay->use_vertical_render) { in gst_base_text_overlay_render_pangocairo()
1936 /* reallocate overlay buffer */ in gst_base_text_overlay_render_pangocairo()
1938 gst_buffer_replace (&overlay->text_image, buffer); in gst_base_text_overlay_render_pangocairo()
1968 if (overlay->draw_shadow) { in gst_base_text_overlay_render_pangocairo()
1973 pango_attr_list_ref (pango_layout_get_attributes (overlay->layout)); in gst_base_text_overlay_render_pangocairo()
1983 cairo_translate (cr, overlay->shadow_offset, overlay->shadow_offset); in gst_base_text_overlay_render_pangocairo()
1985 pango_layout_set_attributes (overlay->layout, filtered_attr); in gst_base_text_overlay_render_pangocairo()
1986 pango_cairo_show_layout (cr, overlay->layout); in gst_base_text_overlay_render_pangocairo()
1987 pango_layout_set_attributes (overlay->layout, origin_attr); in gst_base_text_overlay_render_pangocairo()
1994 if (overlay->draw_outline) { in gst_base_text_overlay_render_pangocairo()
1995 a = (overlay->outline_color >> 24) & 0xff; in gst_base_text_overlay_render_pangocairo()
1996 r = (overlay->outline_color >> 16) & 0xff; in gst_base_text_overlay_render_pangocairo()
1997 g = (overlay->outline_color >> 8) & 0xff; in gst_base_text_overlay_render_pangocairo()
1998 b = (overlay->outline_color >> 0) & 0xff; in gst_base_text_overlay_render_pangocairo()
2002 cairo_set_line_width (cr, overlay->outline_offset); in gst_base_text_overlay_render_pangocairo()
2003 pango_cairo_layout_path (cr, overlay->layout); in gst_base_text_overlay_render_pangocairo()
2008 a = (overlay->color >> 24) & 0xff; in gst_base_text_overlay_render_pangocairo()
2009 r = (overlay->color >> 16) & 0xff; in gst_base_text_overlay_render_pangocairo()
2010 g = (overlay->color >> 8) & 0xff; in gst_base_text_overlay_render_pangocairo()
2011 b = (overlay->color >> 0) & 0xff; in gst_base_text_overlay_render_pangocairo()
2016 pango_cairo_show_layout (cr, overlay->layout); in gst_base_text_overlay_render_pangocairo()
2023 overlay->text_width = width; in gst_base_text_overlay_render_pangocairo()
2025 overlay->text_height = height; in gst_base_text_overlay_render_pangocairo()
2027 gst_base_text_overlay_set_composition (overlay); in gst_base_text_overlay_render_pangocairo()
2031 gst_base_text_overlay_shade_planar_Y (GstBaseTextOverlay * overlay, in gst_base_text_overlay_shade_planar_Y() argument
2042 gint y = dest_ptr[(i * dest_stride) + j] - overlay->shading_value; in gst_base_text_overlay_shade_planar_Y()
2050 gst_base_text_overlay_shade_packed_Y (GstBaseTextOverlay * overlay, in gst_base_text_overlay_shade_packed_Y() argument
2077 y = dest_ptr[y_pos] - overlay->shading_value; in gst_base_text_overlay_shade_packed_Y()
2088 gst_base_text_overlay_shade_xRGB (GstBaseTextOverlay * overlay, in gst_base_text_overlay_shade_xRGB() argument
2100 y_pos = (i * 4 * overlay->width) + j * 4; in gst_base_text_overlay_shade_xRGB()
2102 y = dest_ptr[y_pos + k] - overlay->shading_value; in gst_base_text_overlay_shade_xRGB()
2111 gst_base_text_overlay_shade_rgb24 (GstBaseTextOverlay * overlay, in gst_base_text_overlay_shade_rgb24() argument
2118 shading_val = -overlay->shading_value; in gst_base_text_overlay_shade_rgb24()
2136 gst_base_text_overlay_shade_IYU1 (GstBaseTextOverlay * overlay, in gst_base_text_overlay_shade_IYU1() argument
2142 shading_val = -overlay->shading_value; in gst_base_text_overlay_shade_IYU1()
2165 gst_base_text_overlay_shade_##name (GstBaseTextOverlay * overlay, GstVideoFrame * dest, \
2176 y_pos = (i * 4 * overlay->width) + j * 4;\
2178 y = dest_ptr[y_pos + k] - overlay->shading_value;\
2190 gst_base_text_overlay_render_text (GstBaseTextOverlay * overlay, in gst_base_text_overlay_render_text() argument
2195 if (!overlay->need_render) { in gst_base_text_overlay_render_text()
2216 gst_base_text_overlay_render_pangocairo (overlay, string, textlen); in gst_base_text_overlay_render_text()
2220 overlay->need_render = FALSE; in gst_base_text_overlay_render_text()
2228 gst_base_text_overlay_shade_background (GstBaseTextOverlay * overlay, in gst_base_text_overlay_shade_background() argument
2231 x0 = CLAMP (x0 - BOX_XPAD, 0, overlay->width); in gst_base_text_overlay_shade_background()
2232 x1 = CLAMP (x1 + BOX_XPAD, 0, overlay->width); in gst_base_text_overlay_shade_background()
2234 y0 = CLAMP (y0 - BOX_YPAD, 0, overlay->height); in gst_base_text_overlay_shade_background()
2235 y1 = CLAMP (y1 + BOX_YPAD, 0, overlay->height); in gst_base_text_overlay_shade_background()
2237 switch (overlay->format) { in gst_base_text_overlay_shade_background()
2249 gst_base_text_overlay_shade_planar_Y (overlay, frame, x0, x1, y0, y1); in gst_base_text_overlay_shade_background()
2257 gst_base_text_overlay_shade_packed_Y (overlay, frame, x0, x1, y0, y1); in gst_base_text_overlay_shade_background()
2260 gst_base_text_overlay_shade_xRGB (overlay, frame, x0, x1, y0, y1); in gst_base_text_overlay_shade_background()
2263 gst_base_text_overlay_shade_xBGR (overlay, frame, x0, x1, y0, y1); in gst_base_text_overlay_shade_background()
2266 gst_base_text_overlay_shade_BGRx (overlay, frame, x0, x1, y0, y1); in gst_base_text_overlay_shade_background()
2269 gst_base_text_overlay_shade_RGBx (overlay, frame, x0, x1, y0, y1); in gst_base_text_overlay_shade_background()
2272 gst_base_text_overlay_shade_ARGB (overlay, frame, x0, x1, y0, y1); in gst_base_text_overlay_shade_background()
2275 gst_base_text_overlay_shade_ABGR (overlay, frame, x0, x1, y0, y1); in gst_base_text_overlay_shade_background()
2278 gst_base_text_overlay_shade_RGBA (overlay, frame, x0, x1, y0, y1); in gst_base_text_overlay_shade_background()
2281 gst_base_text_overlay_shade_BGRA (overlay, frame, x0, x1, y0, y1); in gst_base_text_overlay_shade_background()
2285 gst_base_text_overlay_shade_rgb24 (overlay, frame, x0, x1, y0, y1); in gst_base_text_overlay_shade_background()
2288 gst_base_text_overlay_shade_IYU1 (overlay, frame, x0, x1, y0, y1); in gst_base_text_overlay_shade_background()
2291 GST_FIXME_OBJECT (overlay, "implement background shading for format %s", in gst_base_text_overlay_shade_background()
2298 gst_base_text_overlay_push_frame (GstBaseTextOverlay * overlay, in gst_base_text_overlay_push_frame() argument
2303 if (overlay->composition == NULL) in gst_base_text_overlay_push_frame()
2306 if (gst_pad_check_reconfigure (overlay->srcpad)) { in gst_base_text_overlay_push_frame()
2307 if (!gst_base_text_overlay_negotiate (overlay, NULL)) { in gst_base_text_overlay_push_frame()
2308 gst_pad_mark_reconfigure (overlay->srcpad); in gst_base_text_overlay_push_frame()
2310 if (GST_PAD_IS_FLUSHING (overlay->srcpad)) in gst_base_text_overlay_push_frame()
2319 if (overlay->attach_compo_to_buffer) { in gst_base_text_overlay_push_frame()
2320 GST_DEBUG_OBJECT (overlay, "Attaching text overlay image to video buffer"); in gst_base_text_overlay_push_frame()
2322 overlay->composition); in gst_base_text_overlay_push_frame()
2327 if (!gst_video_frame_map (&frame, &overlay->info, video_frame, in gst_base_text_overlay_push_frame()
2332 if (overlay->want_shading) { in gst_base_text_overlay_push_frame()
2335 gst_base_text_overlay_get_pos (overlay, &xpos, &ypos); in gst_base_text_overlay_push_frame()
2337 gst_base_text_overlay_shade_background (overlay, &frame, in gst_base_text_overlay_push_frame()
2338 xpos, xpos + overlay->text_width, ypos, ypos + overlay->text_height); in gst_base_text_overlay_push_frame()
2341 gst_video_overlay_composition_blend (overlay->composition, &frame); in gst_base_text_overlay_push_frame()
2347 return gst_pad_push (overlay->srcpad, video_frame); in gst_base_text_overlay_push_frame()
2353 GST_DEBUG_OBJECT (overlay, "received invalid buffer"); in gst_base_text_overlay_push_frame()
2362 GstBaseTextOverlay *overlay; in gst_base_text_overlay_text_pad_link() local
2364 overlay = GST_BASE_TEXT_OVERLAY (parent); in gst_base_text_overlay_text_pad_link()
2365 if (G_UNLIKELY (!overlay)) in gst_base_text_overlay_text_pad_link()
2368 GST_DEBUG_OBJECT (overlay, "Text pad linked"); in gst_base_text_overlay_text_pad_link()
2370 overlay->text_linked = TRUE; in gst_base_text_overlay_text_pad_link()
2378 GstBaseTextOverlay *overlay; in gst_base_text_overlay_text_pad_unlink() local
2381 overlay = GST_BASE_TEXT_OVERLAY (parent); in gst_base_text_overlay_text_pad_unlink()
2383 GST_DEBUG_OBJECT (overlay, "Text pad unlinked"); in gst_base_text_overlay_text_pad_unlink()
2385 overlay->text_linked = FALSE; in gst_base_text_overlay_text_pad_unlink()
2387 gst_segment_init (&overlay->text_segment, GST_FORMAT_UNDEFINED); in gst_base_text_overlay_text_pad_unlink()
2395 GstBaseTextOverlay *overlay = NULL; in gst_base_text_overlay_text_event() local
2397 overlay = GST_BASE_TEXT_OVERLAY (parent); in gst_base_text_overlay_text_event()
2407 ret = gst_base_text_overlay_setcaps_txt (overlay, caps); in gst_base_text_overlay_text_event()
2415 overlay->text_eos = FALSE; in gst_base_text_overlay_text_event()
2420 GST_BASE_TEXT_OVERLAY_LOCK (overlay); in gst_base_text_overlay_text_event()
2421 gst_segment_copy_into (segment, &overlay->text_segment); in gst_base_text_overlay_text_event()
2422 GST_DEBUG_OBJECT (overlay, "TEXT SEGMENT now: %" GST_SEGMENT_FORMAT, in gst_base_text_overlay_text_event()
2423 &overlay->text_segment); in gst_base_text_overlay_text_event()
2424 GST_BASE_TEXT_OVERLAY_UNLOCK (overlay); in gst_base_text_overlay_text_event()
2426 GST_ELEMENT_WARNING (overlay, STREAM, MUX, (NULL), in gst_base_text_overlay_text_event()
2435 GST_BASE_TEXT_OVERLAY_LOCK (overlay); in gst_base_text_overlay_text_event()
2436 GST_BASE_TEXT_OVERLAY_BROADCAST (overlay); in gst_base_text_overlay_text_event()
2437 GST_BASE_TEXT_OVERLAY_UNLOCK (overlay); in gst_base_text_overlay_text_event()
2449 overlay->text_segment.position = start; in gst_base_text_overlay_text_event()
2453 GST_BASE_TEXT_OVERLAY_LOCK (overlay); in gst_base_text_overlay_text_event()
2454 GST_BASE_TEXT_OVERLAY_BROADCAST (overlay); in gst_base_text_overlay_text_event()
2455 GST_BASE_TEXT_OVERLAY_UNLOCK (overlay); in gst_base_text_overlay_text_event()
2462 GST_BASE_TEXT_OVERLAY_LOCK (overlay); in gst_base_text_overlay_text_event()
2463 GST_INFO_OBJECT (overlay, "text flush stop"); in gst_base_text_overlay_text_event()
2464 overlay->text_flushing = FALSE; in gst_base_text_overlay_text_event()
2465 overlay->text_eos = FALSE; in gst_base_text_overlay_text_event()
2466 gst_base_text_overlay_pop_text (overlay); in gst_base_text_overlay_text_event()
2467 gst_segment_init (&overlay->text_segment, GST_FORMAT_TIME); in gst_base_text_overlay_text_event()
2468 GST_BASE_TEXT_OVERLAY_UNLOCK (overlay); in gst_base_text_overlay_text_event()
2473 GST_BASE_TEXT_OVERLAY_LOCK (overlay); in gst_base_text_overlay_text_event()
2474 GST_INFO_OBJECT (overlay, "text flush start"); in gst_base_text_overlay_text_event()
2475 overlay->text_flushing = TRUE; in gst_base_text_overlay_text_event()
2476 GST_BASE_TEXT_OVERLAY_BROADCAST (overlay); in gst_base_text_overlay_text_event()
2477 GST_BASE_TEXT_OVERLAY_UNLOCK (overlay); in gst_base_text_overlay_text_event()
2482 GST_BASE_TEXT_OVERLAY_LOCK (overlay); in gst_base_text_overlay_text_event()
2483 overlay->text_eos = TRUE; in gst_base_text_overlay_text_event()
2484 GST_INFO_OBJECT (overlay, "text EOS"); in gst_base_text_overlay_text_event()
2487 GST_BASE_TEXT_OVERLAY_BROADCAST (overlay); in gst_base_text_overlay_text_event()
2488 GST_BASE_TEXT_OVERLAY_UNLOCK (overlay); in gst_base_text_overlay_text_event()
2505 GstBaseTextOverlay *overlay = NULL; in gst_base_text_overlay_video_event() local
2507 overlay = GST_BASE_TEXT_OVERLAY (parent); in gst_base_text_overlay_video_event()
2517 ret = gst_base_text_overlay_setcaps (overlay, caps); in gst_base_text_overlay_video_event()
2525 GST_DEBUG_OBJECT (overlay, "received new segment"); in gst_base_text_overlay_video_event()
2530 gst_segment_copy_into (segment, &overlay->segment); in gst_base_text_overlay_video_event()
2531 GST_DEBUG_OBJECT (overlay, "VIDEO SEGMENT now: %" GST_SEGMENT_FORMAT, in gst_base_text_overlay_video_event()
2532 &overlay->segment); in gst_base_text_overlay_video_event()
2534 GST_ELEMENT_WARNING (overlay, STREAM, MUX, (NULL), in gst_base_text_overlay_video_event()
2542 GST_BASE_TEXT_OVERLAY_LOCK (overlay); in gst_base_text_overlay_video_event()
2543 GST_INFO_OBJECT (overlay, "video EOS"); in gst_base_text_overlay_video_event()
2544 overlay->video_eos = TRUE; in gst_base_text_overlay_video_event()
2545 GST_BASE_TEXT_OVERLAY_UNLOCK (overlay); in gst_base_text_overlay_video_event()
2549 GST_BASE_TEXT_OVERLAY_LOCK (overlay); in gst_base_text_overlay_video_event()
2550 GST_INFO_OBJECT (overlay, "video flush start"); in gst_base_text_overlay_video_event()
2551 overlay->video_flushing = TRUE; in gst_base_text_overlay_video_event()
2552 GST_BASE_TEXT_OVERLAY_BROADCAST (overlay); in gst_base_text_overlay_video_event()
2553 GST_BASE_TEXT_OVERLAY_UNLOCK (overlay); in gst_base_text_overlay_video_event()
2557 GST_BASE_TEXT_OVERLAY_LOCK (overlay); in gst_base_text_overlay_video_event()
2558 GST_INFO_OBJECT (overlay, "video flush stop"); in gst_base_text_overlay_video_event()
2559 overlay->video_flushing = FALSE; in gst_base_text_overlay_video_event()
2560 overlay->video_eos = FALSE; in gst_base_text_overlay_video_event()
2561 gst_segment_init (&overlay->segment, GST_FORMAT_TIME); in gst_base_text_overlay_video_event()
2562 GST_BASE_TEXT_OVERLAY_UNLOCK (overlay); in gst_base_text_overlay_video_event()
2578 GstBaseTextOverlay *overlay; in gst_base_text_overlay_video_query() local
2580 overlay = GST_BASE_TEXT_OVERLAY (parent); in gst_base_text_overlay_video_query()
2588 caps = gst_base_text_overlay_get_videosink_caps (pad, overlay, filter); in gst_base_text_overlay_video_query()
2604 gst_base_text_overlay_pop_text (GstBaseTextOverlay * overlay) in gst_base_text_overlay_pop_text() argument
2606 g_return_if_fail (GST_IS_BASE_TEXT_OVERLAY (overlay)); in gst_base_text_overlay_pop_text()
2608 if (overlay->text_buffer) { in gst_base_text_overlay_pop_text()
2609 GST_DEBUG_OBJECT (overlay, "releasing text buffer %p", in gst_base_text_overlay_pop_text()
2610 overlay->text_buffer); in gst_base_text_overlay_pop_text()
2611 gst_buffer_unref (overlay->text_buffer); in gst_base_text_overlay_pop_text()
2612 overlay->text_buffer = NULL; in gst_base_text_overlay_pop_text()
2616 GST_BASE_TEXT_OVERLAY_BROADCAST (overlay); in gst_base_text_overlay_pop_text()
2627 GstBaseTextOverlay *overlay = NULL; in gst_base_text_overlay_text_chain() local
2631 overlay = GST_BASE_TEXT_OVERLAY (parent); in gst_base_text_overlay_text_chain()
2633 GST_BASE_TEXT_OVERLAY_LOCK (overlay); in gst_base_text_overlay_text_chain()
2635 if (overlay->text_flushing) { in gst_base_text_overlay_text_chain()
2636 GST_BASE_TEXT_OVERLAY_UNLOCK (overlay); in gst_base_text_overlay_text_chain()
2638 GST_LOG_OBJECT (overlay, "text flushing"); in gst_base_text_overlay_text_chain()
2642 if (overlay->text_eos) { in gst_base_text_overlay_text_chain()
2643 GST_BASE_TEXT_OVERLAY_UNLOCK (overlay); in gst_base_text_overlay_text_chain()
2645 GST_LOG_OBJECT (overlay, "text EOS"); in gst_base_text_overlay_text_chain()
2649 GST_LOG_OBJECT (overlay, "%" GST_SEGMENT_FORMAT " BUFFER: ts=%" in gst_base_text_overlay_text_chain()
2650 GST_TIME_FORMAT ", end=%" GST_TIME_FORMAT, &overlay->segment, in gst_base_text_overlay_text_chain()
2663 in_seg = gst_segment_clip (&overlay->text_segment, GST_FORMAT_TIME, in gst_base_text_overlay_text_chain()
2678 while (overlay->text_buffer != NULL) { in gst_base_text_overlay_text_chain()
2681 GST_BASE_TEXT_OVERLAY_WAIT (overlay); in gst_base_text_overlay_text_chain()
2683 if (overlay->text_flushing) { in gst_base_text_overlay_text_chain()
2684 GST_BASE_TEXT_OVERLAY_UNLOCK (overlay); in gst_base_text_overlay_text_chain()
2691 overlay->text_segment.position = clip_start; in gst_base_text_overlay_text_chain()
2693 overlay->text_buffer = buffer; /* pass ownership of @buffer */ in gst_base_text_overlay_text_chain()
2697 overlay->need_render = TRUE; in gst_base_text_overlay_text_chain()
2700 GST_BASE_TEXT_OVERLAY_BROADCAST (overlay); in gst_base_text_overlay_text_chain()
2703 GST_BASE_TEXT_OVERLAY_UNLOCK (overlay); in gst_base_text_overlay_text_chain()
2717 GstBaseTextOverlay *overlay; in gst_base_text_overlay_video_chain() local
2724 overlay = GST_BASE_TEXT_OVERLAY (parent); in gst_base_text_overlay_video_chain()
2728 if (overlay->upstream_composition != composition_meta->overlay) { in gst_base_text_overlay_video_chain()
2730 overlay->upstream_composition = composition_meta->overlay; in gst_base_text_overlay_video_chain()
2731 overlay->need_render = TRUE; in gst_base_text_overlay_video_chain()
2733 } else if (overlay->upstream_composition != NULL) { in gst_base_text_overlay_video_chain()
2734 overlay->upstream_composition = NULL; in gst_base_text_overlay_video_chain()
2735 overlay->need_render = TRUE; in gst_base_text_overlay_video_chain()
2738 klass = GST_BASE_TEXT_OVERLAY_GET_CLASS (overlay); in gst_base_text_overlay_video_chain()
2752 GST_LOG_OBJECT (overlay, "%" GST_SEGMENT_FORMAT " BUFFER: ts=%" in gst_base_text_overlay_video_chain()
2753 GST_TIME_FORMAT ", end=%" GST_TIME_FORMAT, &overlay->segment, in gst_base_text_overlay_video_chain()
2758 if (stop == GST_CLOCK_TIME_NONE && start < overlay->segment.start) in gst_base_text_overlay_video_chain()
2761 in_seg = gst_segment_clip (&overlay->segment, GST_FORMAT_TIME, start, stop, in gst_base_text_overlay_video_chain()
2769 GST_DEBUG_OBJECT (overlay, "clipping buffer timestamp/duration to segment"); in gst_base_text_overlay_video_chain()
2780 if (overlay->info.fps_n && overlay->info.fps_d) { in gst_base_text_overlay_video_chain()
2781 GST_DEBUG_OBJECT (overlay, "estimating duration based on framerate"); in gst_base_text_overlay_video_chain()
2783 overlay->info.fps_d, overlay->info.fps_n); in gst_base_text_overlay_video_chain()
2785 GST_LOG_OBJECT (overlay, "no duration, assuming minimal duration"); in gst_base_text_overlay_video_chain()
2790 gst_object_sync_values (GST_OBJECT (overlay), GST_BUFFER_TIMESTAMP (buffer)); in gst_base_text_overlay_video_chain()
2794 GST_BASE_TEXT_OVERLAY_LOCK (overlay); in gst_base_text_overlay_video_chain()
2796 if (overlay->video_flushing) in gst_base_text_overlay_video_chain()
2799 if (overlay->video_eos) in gst_base_text_overlay_video_chain()
2802 if (overlay->silent) { in gst_base_text_overlay_video_chain()
2803 GST_BASE_TEXT_OVERLAY_UNLOCK (overlay); in gst_base_text_overlay_video_chain()
2804 ret = gst_pad_push (overlay->srcpad, buffer); in gst_base_text_overlay_video_chain()
2807 overlay->segment.position = clip_start; in gst_base_text_overlay_video_chain()
2813 if (!overlay->text_linked) { in gst_base_text_overlay_video_chain()
2815 text = klass->get_text (overlay, buffer); in gst_base_text_overlay_video_chain()
2817 text = g_strdup (overlay->default_text); in gst_base_text_overlay_video_chain()
2820 GST_LOG_OBJECT (overlay, "Text pad not linked, rendering default " in gst_base_text_overlay_video_chain()
2823 GST_BASE_TEXT_OVERLAY_UNLOCK (overlay); in gst_base_text_overlay_video_chain()
2827 gst_base_text_overlay_render_text (overlay, text, -1); in gst_base_text_overlay_video_chain()
2828 ret = gst_base_text_overlay_push_frame (overlay, buffer); in gst_base_text_overlay_video_chain()
2831 ret = gst_pad_push (overlay->srcpad, buffer); in gst_base_text_overlay_video_chain()
2835 if (overlay->text_buffer) { in gst_base_text_overlay_video_chain()
2845 if (!GST_BUFFER_TIMESTAMP_IS_VALID (overlay->text_buffer) || in gst_base_text_overlay_video_chain()
2846 !GST_BUFFER_DURATION_IS_VALID (overlay->text_buffer)) { in gst_base_text_overlay_video_chain()
2847 GST_WARNING_OBJECT (overlay, in gst_base_text_overlay_video_chain()
2852 text_start = GST_BUFFER_TIMESTAMP (overlay->text_buffer); in gst_base_text_overlay_video_chain()
2853 text_end = text_start + GST_BUFFER_DURATION (overlay->text_buffer); in gst_base_text_overlay_video_chain()
2857 gst_segment_to_running_time (&overlay->segment, GST_FORMAT_TIME, in gst_base_text_overlay_video_chain()
2860 gst_segment_to_running_time (&overlay->segment, GST_FORMAT_TIME, in gst_base_text_overlay_video_chain()
2866 gst_segment_to_running_time (&overlay->text_segment, in gst_base_text_overlay_video_chain()
2869 gst_segment_to_running_time (&overlay->text_segment, in gst_base_text_overlay_video_chain()
2873 GST_LOG_OBJECT (overlay, "T: %" GST_TIME_FORMAT " - %" GST_TIME_FORMAT, in gst_base_text_overlay_video_chain()
2876 GST_LOG_OBJECT (overlay, "V: %" GST_TIME_FORMAT " - %" GST_TIME_FORMAT, in gst_base_text_overlay_video_chain()
2883 GST_LOG_OBJECT (overlay, "text buffer too old, popping"); in gst_base_text_overlay_video_chain()
2885 gst_base_text_overlay_pop_text (overlay); in gst_base_text_overlay_video_chain()
2886 GST_BASE_TEXT_OVERLAY_UNLOCK (overlay); in gst_base_text_overlay_video_chain()
2889 GST_LOG_OBJECT (overlay, "text in future, pushing video buf"); in gst_base_text_overlay_video_chain()
2890 GST_BASE_TEXT_OVERLAY_UNLOCK (overlay); in gst_base_text_overlay_video_chain()
2892 ret = gst_pad_push (overlay->srcpad, buffer); in gst_base_text_overlay_video_chain()
2898 gst_buffer_map (overlay->text_buffer, &map, GST_MAP_READ); in gst_base_text_overlay_video_chain()
2909 GST_WARNING_OBJECT (overlay, "received invalid UTF-8"); in gst_base_text_overlay_video_chain()
2916 if (overlay->have_pango_markup) { in gst_base_text_overlay_video_chain()
2929 GST_DEBUG_OBJECT (overlay, "Rendering text '%*s'", text_len, text); in gst_base_text_overlay_video_chain()
2930 gst_base_text_overlay_render_text (overlay, text, text_len); in gst_base_text_overlay_video_chain()
2932 GST_DEBUG_OBJECT (overlay, "No text to render (empty buffer)"); in gst_base_text_overlay_video_chain()
2933 gst_base_text_overlay_render_text (overlay, " ", 1); in gst_base_text_overlay_video_chain()
2938 GST_DEBUG_OBJECT (overlay, "No text to render (empty buffer)"); in gst_base_text_overlay_video_chain()
2939 gst_base_text_overlay_render_text (overlay, " ", 1); in gst_base_text_overlay_video_chain()
2942 gst_buffer_unmap (overlay->text_buffer, &map); in gst_base_text_overlay_video_chain()
2944 GST_BASE_TEXT_OVERLAY_UNLOCK (overlay); in gst_base_text_overlay_video_chain()
2945 ret = gst_base_text_overlay_push_frame (overlay, buffer); in gst_base_text_overlay_video_chain()
2948 GST_LOG_OBJECT (overlay, "text buffer not needed any longer"); in gst_base_text_overlay_video_chain()
2953 GST_BASE_TEXT_OVERLAY_LOCK (overlay); in gst_base_text_overlay_video_chain()
2954 gst_base_text_overlay_pop_text (overlay); in gst_base_text_overlay_video_chain()
2955 GST_BASE_TEXT_OVERLAY_UNLOCK (overlay); in gst_base_text_overlay_video_chain()
2960 if (overlay->text_eos) in gst_base_text_overlay_video_chain()
2963 if (!overlay->wait_text) in gst_base_text_overlay_video_chain()
2967 if (overlay->text_segment.format == GST_FORMAT_TIME) { in gst_base_text_overlay_video_chain()
2972 gst_segment_to_running_time (&overlay->segment, GST_FORMAT_TIME, in gst_base_text_overlay_video_chain()
2975 gst_segment_to_running_time (&overlay->text_segment, in gst_base_text_overlay_video_chain()
2976 GST_FORMAT_TIME, overlay->text_segment.start); in gst_base_text_overlay_video_chain()
2978 gst_segment_to_running_time (&overlay->text_segment, in gst_base_text_overlay_video_chain()
2979 GST_FORMAT_TIME, overlay->text_segment.position); in gst_base_text_overlay_video_chain()
2990 GST_DEBUG_OBJECT (overlay, "no text buffer, need to wait for one"); in gst_base_text_overlay_video_chain()
2991 GST_BASE_TEXT_OVERLAY_WAIT (overlay); in gst_base_text_overlay_video_chain()
2992 GST_DEBUG_OBJECT (overlay, "resuming"); in gst_base_text_overlay_video_chain()
2993 GST_BASE_TEXT_OVERLAY_UNLOCK (overlay); in gst_base_text_overlay_video_chain()
2996 GST_BASE_TEXT_OVERLAY_UNLOCK (overlay); in gst_base_text_overlay_video_chain()
2997 GST_LOG_OBJECT (overlay, "no need to wait for a text buffer"); in gst_base_text_overlay_video_chain()
2998 ret = gst_pad_push (overlay->srcpad, buffer); in gst_base_text_overlay_video_chain()
3006 overlay->segment.position = clip_start; in gst_base_text_overlay_video_chain()
3012 GST_WARNING_OBJECT (overlay, "buffer without timestamp, discarding"); in gst_base_text_overlay_video_chain()
3019 GST_BASE_TEXT_OVERLAY_UNLOCK (overlay); in gst_base_text_overlay_video_chain()
3020 GST_DEBUG_OBJECT (overlay, "flushing, discarding buffer"); in gst_base_text_overlay_video_chain()
3026 GST_BASE_TEXT_OVERLAY_UNLOCK (overlay); in gst_base_text_overlay_video_chain()
3027 GST_DEBUG_OBJECT (overlay, "eos, discarding buffer"); in gst_base_text_overlay_video_chain()
3033 GST_DEBUG_OBJECT (overlay, "buffer out of segment, discarding"); in gst_base_text_overlay_video_chain()
3044 GstBaseTextOverlay *overlay = GST_BASE_TEXT_OVERLAY (element); in gst_base_text_overlay_change_state() local
3048 GST_BASE_TEXT_OVERLAY_LOCK (overlay); in gst_base_text_overlay_change_state()
3049 overlay->text_flushing = TRUE; in gst_base_text_overlay_change_state()
3050 overlay->video_flushing = TRUE; in gst_base_text_overlay_change_state()
3053 gst_base_text_overlay_pop_text (overlay); in gst_base_text_overlay_change_state()
3054 GST_BASE_TEXT_OVERLAY_UNLOCK (overlay); in gst_base_text_overlay_change_state()
3066 GST_BASE_TEXT_OVERLAY_LOCK (overlay); in gst_base_text_overlay_change_state()
3067 overlay->text_flushing = FALSE; in gst_base_text_overlay_change_state()
3068 overlay->video_flushing = FALSE; in gst_base_text_overlay_change_state()
3069 overlay->video_eos = FALSE; in gst_base_text_overlay_change_state()
3070 overlay->text_eos = FALSE; in gst_base_text_overlay_change_state()
3071 gst_segment_init (&overlay->segment, GST_FORMAT_TIME); in gst_base_text_overlay_change_state()
3072 gst_segment_init (&overlay->text_segment, GST_FORMAT_TIME); in gst_base_text_overlay_change_state()
3073 GST_BASE_TEXT_OVERLAY_UNLOCK (overlay); in gst_base_text_overlay_change_state()