diff options
author | Stéphane Cerveau <scerveau@collabora.com> | 2020-12-23 11:03:34 +0100 |
---|---|---|
committer | GStreamer Marge Bot <gitlab-merge-bot@gstreamer-foundation.org> | 2021-09-20 15:11:02 +0000 |
commit | 619cbca642f8bd4e3a1d6a5267f6afd6d8a28707 (patch) | |
tree | 5c742d3b2e96cb87648df95e92fccadca4958421 /ext | |
parent | 86be138973c5ed441b9a9ec87833de430d2a71dc (diff) | |
download | gstreamer-plugins-bad-619cbca642f8bd4e3a1d6a5267f6afd6d8a28707.tar.gz |
openjpegdec: Fix crash with AYUV64 in subframe mode
Remove useless generic fill_frame methods to use
the packed one for AYUV and AYUV64.
Fix gst-launch-1.0 -v videotestsrc !
video/x-raw,width=640,height=480,format=AYUV64 ! openjpegenc
num-stripes=8 ! openjpegdec max-threads=8 ! videoconvert !
autovideosink sync=false
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/979>
Diffstat (limited to 'ext')
-rw-r--r-- | ext/openjpeg/gstopenjpegdec.c | 82 |
1 files changed, 2 insertions, 80 deletions
diff --git a/ext/openjpeg/gstopenjpegdec.c b/ext/openjpeg/gstopenjpegdec.c index 5ceb1ef5e..ef67b21e6 100644 --- a/ext/openjpeg/gstopenjpegdec.c +++ b/ext/openjpeg/gstopenjpegdec.c @@ -835,44 +835,6 @@ fill_frame_planar8_3_generic (GstOpenJPEGDec * self, GstVideoFrame * frame, } static void -fill_frame_planar8_4_generic (GstOpenJPEGDec * self, GstVideoFrame * frame, - opj_image_t * image) -{ - gint x, y, y0, y1, w, c; - guint8 *data_out, *tmp; - const gint *data_in[4]; - gint dstride; - gint dx[4], dy[4], off[4]; - - w = GST_VIDEO_FRAME_WIDTH (frame); - data_out = GST_VIDEO_FRAME_PLANE_DATA (frame, 0); - dstride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0); - - for (c = 0; c < 4; c++) { - data_in[c] = image->comps[c].data; - dx[c] = image->comps[c].dx; - dy[c] = image->comps[c].dy; - off[c] = 0x80 * image->comps[c].sgnd; - } - - /* copy only the stripe content (image) to the full size frame */ - y0 = image->y0; - y1 = image->y1; - data_out += y0 * dstride; - for (y = y0; y < y1; y++) { - tmp = data_out; - for (x = 0; x < w; x++) { - tmp[0] = off[3] + data_in[3][((y / dy[3]) * w + x) / dx[3]]; - tmp[1] = off[0] + data_in[0][((y / dy[0]) * w + x) / dx[0]]; - tmp[2] = off[1] + data_in[1][((y / dy[1]) * w + x) / dx[1]]; - tmp[3] = off[2] + data_in[2][((y / dy[2]) * w + x) / dx[2]]; - tmp += 4; - } - data_out += dstride; - } -} - -static void fill_frame_planar16_3_generic (GstOpenJPEGDec * self, GstVideoFrame * frame, opj_image_t * image) { @@ -912,46 +874,6 @@ fill_frame_planar16_3_generic (GstOpenJPEGDec * self, GstVideoFrame * frame, } } -static void -fill_frame_planar16_4_generic (GstOpenJPEGDec * self, GstVideoFrame * frame, - opj_image_t * image) -{ - gint x, y, y0, y1, w, c; - guint16 *data_out, *tmp; - const gint *data_in[4]; - gint dstride; - gint dx[4], dy[4], shift[4], off[4]; - - w = GST_VIDEO_FRAME_WIDTH (frame); - data_out = (guint16 *) GST_VIDEO_FRAME_PLANE_DATA (frame, 0); - dstride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0) / 2; - - for (c = 0; c < 4; c++) { - dx[c] = image->comps[c].dx; - dy[c] = image->comps[c].dy; - data_in[c] = image->comps[c].data; - off[c] = (1 << (image->comps[c].prec - 1)) * image->comps[c].sgnd; - shift[c] = - MAX (MIN (GST_VIDEO_FRAME_COMP_DEPTH (frame, c) - image->comps[c].prec, - 8), 0); - } - - y0 = image->y0; - y1 = image->y1; - data_out += y0 * dstride; - for (y = y0; y < y1; y++) { - tmp = data_out; - for (x = 0; x < w; x++) { - tmp[0] = off[3] + (data_in[3][((y / dy[3]) * w + x) / dx[3]] << shift[3]); - tmp[1] = off[0] + (data_in[0][((y / dy[0]) * w + x) / dx[0]] << shift[0]); - tmp[2] = off[1] + (data_in[1][((y / dy[1]) * w + x) / dx[1]] << shift[1]); - tmp[3] = off[2] + (data_in[2][((y / dy[2]) * w + x) / dx[2]] << shift[2]); - tmp += 4; - } - data_out += dstride; - } -} - static gint get_highest_prec (opj_image_t * image) { @@ -1098,10 +1020,10 @@ gst_openjpeg_dec_negotiate (GstOpenJPEGDec * self, opj_image_t * image) } if (get_highest_prec (image) == 8) { - self->fill_frame = fill_frame_planar8_4_generic; + self->fill_frame = fill_frame_packed8_4; format = GST_VIDEO_FORMAT_AYUV; } else if (image->comps[3].prec <= 16) { - self->fill_frame = fill_frame_planar16_4_generic; + self->fill_frame = fill_frame_packed16_4; format = GST_VIDEO_FORMAT_AYUV64; } else { GST_ERROR_OBJECT (self, "Unsupported depth %d", image->comps[0].prec); |