gloverlay: Fix upside down and miss-aligned JPEG

LibJPEG uses macroblock of 8x8 sample. In this element we use RGB and
Y444, two 24bit formats that are stored in 32bit pixels. This mean we
have 32x32 bytes macroblocks. For this reason, we need to allocate
our buffer slightly larger. We also need to pass the line pointer in
the right order, otherwise the image endup upside-down.

https://bugzilla.gnome.org/show_bug.cgi?id=745109
This commit is contained in:
Nicolas Dufresne 2015-03-03 15:22:38 -05:00
parent d387cf67df
commit eff94f929d

View file

@ -610,6 +610,7 @@ gst_gl_overlay_load_jpeg (GstGLFilter * filter)
{ {
GstGLOverlay *overlay = GST_GL_OVERLAY (filter); GstGLOverlay *overlay = GST_GL_OVERLAY (filter);
GstVideoInfo v_info; GstVideoInfo v_info;
GstVideoAlignment v_align;
GstMapInfo map_info; GstMapInfo map_info;
FILE *fp = NULL; FILE *fp = NULL;
struct jpeg_decompress_struct cinfo; struct jpeg_decompress_struct cinfo;
@ -637,9 +638,13 @@ gst_gl_overlay_load_jpeg (GstGLFilter * filter)
gst_video_info_set_format (&v_info, GST_VIDEO_FORMAT_RGB, gst_video_info_set_format (&v_info, GST_VIDEO_FORMAT_RGB,
overlay->image_width, overlay->image_height); overlay->image_width, overlay->image_height);
gst_video_alignment_reset (&v_align);
v_align.stride_align[0] = 32 - 1;
gst_video_info_align (&v_info, &v_align);
overlay->image_memory = overlay->image_memory =
(GstGLMemory *) gst_gl_memory_alloc (filter->context, NULL, &v_info, 0, (GstGLMemory *) gst_gl_memory_alloc (filter->context, NULL, &v_info, 0,
NULL); &v_align);
if (!gst_memory_map ((GstMemory *) overlay->image_memory, &map_info, if (!gst_memory_map ((GstMemory *) overlay->image_memory, &map_info,
GST_MAP_WRITE)) { GST_MAP_WRITE)) {
@ -647,9 +652,7 @@ gst_gl_overlay_load_jpeg (GstGLFilter * filter)
} }
for (i = 0; i < overlay->image_height; ++i) { for (i = 0; i < overlay->image_height; ++i) {
j = (map_info.data + j = map_info.data + v_info.stride[0] * i;
(((int) overlay->image_height - (i +
1)) * (int) overlay->image_width * cinfo.num_components));
jpeg_read_scanlines (&cinfo, &j, 1); jpeg_read_scanlines (&cinfo, &j, 1);
} }
jpeg_finish_decompress (&cinfo); jpeg_finish_decompress (&cinfo);