summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJanne Grunau <janne.grunau@collabora.co.uk>2010-12-11 17:25:29 +0100
committerSebastian Dröge <sebastian.droege@collabora.co.uk>2010-12-15 20:47:25 +0100
commit4d8220b03335f1dd432d811de6cd3299357f1391 (patch)
treeff18bf9843bb6b50602f872f24c5fdb5a8aa5b38
parent83a84ba230763184bd30c036ae2af9598fe1edb4 (diff)
dvbsuboverlay: scale subtitles according to the display size
Display size is either transmitted in the display definition segment or implicitly defined to 720x576. The subtitle window information also present in the display definition segment is not yet used.
-rw-r--r--gst/dvbsuboverlay/gstdvbsuboverlay.c37
1 files changed, 15 insertions, 22 deletions
diff --git a/gst/dvbsuboverlay/gstdvbsuboverlay.c b/gst/dvbsuboverlay/gstdvbsuboverlay.c
index f18dd0178..9980e677f 100644
--- a/gst/dvbsuboverlay/gstdvbsuboverlay.c
+++ b/gst/dvbsuboverlay/gstdvbsuboverlay.c
@@ -480,7 +480,7 @@ blit_i420 (GstDVBSubOverlay * overlay, DVBSubtitles * subs, GstBuffer * buffer)
guint32 color;
const guint8 *src;
guint8 *dst_y, *dst_y2, *dst_u, *dst_v;
- gint x, y, w, h;
+ gint x, y;
gint w2, h2;
gint width = overlay->width;
gint height = overlay->height;
@@ -518,7 +518,7 @@ blit_i420 (GstDVBSubOverlay * overlay, DVBSubtitles * subs, GstBuffer * buffer)
v_stride = gst_video_format_get_row_stride (GST_VIDEO_FORMAT_I420, 2, width);
for (counter = 0; counter < subs->num_rects; counter++) {
- gint dw, dh;
+ gint dw, dh, dx, dy;
gint32 sx = 0, sy; /* 16.16 fixed point */
gint32 xstep, ystep; /* 16.16 fixed point */
@@ -527,18 +527,16 @@ blit_i420 (GstDVBSubOverlay * overlay, DVBSubtitles * subs, GstBuffer * buffer)
continue;
/* blend subtitles onto the video frame */
- w = MIN (sub_region->w, width - sub_region->x);
- h = MIN (sub_region->h, height - sub_region->y);
+ dx = sub_region->x * width / subs->display_def.display_width;
+ dy = sub_region->y * height / subs->display_def.display_height;
- /* TODO
- dw = MIN (sub_region->dw, width - sub_region->x);
- dh = MIN (sub_region->dh, height - sub_region->y);
- */
- dw = w;
- dh = h;
+ dw = MIN (sub_region->w * width / subs->display_def.display_width,
+ width - dx);
+ dh = MIN (sub_region->h * height / subs->display_def.display_height,
+ height - dy);
- xstep = (w << 16) / dw;
- ystep = (h << 16) / dh;
+ xstep = (sub_region->w << 16) / dw;
+ ystep = (sub_region->h << 16) / dh;
w2 = (dw + 1) / 2;
h2 = (dh + 1) / 2;
@@ -546,21 +544,16 @@ blit_i420 (GstDVBSubOverlay * overlay, DVBSubtitles * subs, GstBuffer * buffer)
src_stride = sub_region->pict.rowstride;
src = sub_region->pict.data;
- dst_y = buffer->data + y_offset + sub_region->y * y_stride + sub_region->x;
- dst_y2 =
- buffer->data + y_offset + (sub_region->y + 1) * y_stride +
- sub_region->x;
- dst_u =
- buffer->data + u_offset + ((sub_region->y + 1) / 2) * u_stride +
- (sub_region->x + 1) / 2;
- dst_v =
- buffer->data + v_offset + ((sub_region->y + 1) / 2) * v_stride +
- (sub_region->x + 1) / 2;
+ dst_y = buffer->data + y_offset + dy * y_stride + dx;
+ dst_y2 = buffer->data + y_offset + (dy + 1) * y_stride + dx;
+ dst_u = buffer->data + u_offset + ((dy + 1) / 2) * u_stride + (dx + 1) / 2;
+ dst_v = buffer->data + v_offset + ((dy + 1) / 2) * v_stride + (dx + 1) / 2;
sy = 0;
for (y = 0; y < dh - 1; y += 2) {
sx = 0;
for (x = 0; x < dw - 1; x += 2) {
+
color =
sub_region->pict.palette[src[(sy >> 16) * src_stride + (sx >> 16)]];
a1 = (color >> 24) & 0xff;