{
gboolean ret = FALSE;
guint8 *cptr = NULL, *vptr = NULL;
+ GstMapFlags vmap_mode;
guint8 **src, **dest;
if (direction == COLOR_FORMAT_COPY_OUT) {
src = &cptr;
dest = &vptr;
+ vmap_mode = GST_MAP_WRITE;
} else {
src = &vptr;
+ vmap_mode = GST_MAP_READ;
dest = &cptr;
}
GstMapInfo minfo;
GST_DEBUG ("Buffer sizes equal, doing fast copy");
- gst_buffer_map (vbuffer, &minfo, GST_MAP_WRITE);
+ if (!gst_buffer_map (vbuffer, &minfo, vmap_mode))
+ goto fail_map;
cptr = cbuffer->data + cbuffer_info->offset;
vptr = minfo.data;
slice_height = cinfo->slice_height;
g_assert (stride > 0 && slice_height > 0);
- gst_video_frame_map (&vframe, vinfo, vbuffer, GST_MAP_WRITE);
+ if (!gst_video_frame_map (&vframe, vinfo, vbuffer, vmap_mode))
+ goto fail_map;
for (i = 0; i < 3; i++) {
if (i == 0) {
/* FIXME: This does not work for odd widths or heights
* but might as well be a bug in the codec */
- gst_video_frame_map (&vframe, vinfo, vbuffer, GST_MAP_WRITE);
+ if (!gst_video_frame_map (&vframe, vinfo, vbuffer, vmap_mode))
+ goto fail_map;
+
for (i = 0; i < 2; i++) {
if (i == 0) {
c_stride = cinfo->stride;
/* This should always be set */
g_assert (cinfo->stride > 0 && cinfo->slice_height > 0);
- gst_video_frame_map (&vframe, vinfo, vbuffer, GST_MAP_WRITE);
+ if (!gst_video_frame_map (&vframe, vinfo, vbuffer, vmap_mode))
+ goto fail_map;
for (i = 0; i < 2; i++) {
c_stride = cinfo->stride;
const size_t tile_h_chroma = (height / 2 - 1) / TILE_HEIGHT + 1;
size_t luma_size = tile_w_align * tile_h_luma * TILE_SIZE;
- gst_video_frame_map (&vframe, vinfo, vbuffer, GST_MAP_WRITE);
+ if (!gst_video_frame_map (&vframe, vinfo, vbuffer, vmap_mode))
+ goto fail_map;
+
v_luma = GST_VIDEO_FRAME_PLANE_DATA (&vframe, 0);
v_chroma = GST_VIDEO_FRAME_PLANE_DATA (&vframe, 1);
v_luma_stride = GST_VIDEO_FRAME_COMP_STRIDE (&vframe, 0);
done:
return ret;
+
+fail_map:
+ GST_ERROR ("Failed to map GStreamer buffer memory in mode %d", vmap_mode);
+ return FALSE;
}
static const struct