/* set gst buffer */
stream.internal_buffer = buffer;
} else { /* sw codec */
- tbm_bo_handle thandle;
- int stride = GST_ROUND_UP_4(stream.width);
- int elevation = stream.height;
+ int i = 0;
+ int j = 0;
+ int k = 0;
+ int ret = TBM_SURFACE_ERROR_NONE;
+ int src_stride[MM_PLAYER_IMGB_MPLANE_MAX] = { 0, };
+ int src_offset[MM_PLAYER_IMGB_MPLANE_MAX] = { 0, };
int size = 0;
-
+ unsigned char *src = NULL;
+ unsigned char *dest = NULL;
+ tbm_bo_handle thandle;
+ tbm_surface_h surface;
+ tbm_surface_info_s info;
gboolean gst_ret;
+
gst_ret = gst_memory_map(dataBlock, &mapinfo, GST_MAP_READWRITE);
if (!gst_ret) {
LOGE("fail to gst_memory_map");
return;
}
- stream.stride[0] = stride;
- stream.elevation[0] = elevation;
+
if (stream.format == MM_PIXEL_FORMAT_I420) {
- stream.stride[1] = stream.stride[2] = GST_ROUND_UP_4(GST_ROUND_UP_2(stream.width) / 2);
- stream.elevation[1] = stream.elevation[2] = stream.height / 2;
- size = stream.stride[0] * stream.elevation[0] + stream.stride[1] * stream.elevation[1] + stream.stride[2] * stream.elevation[2];
+ surface = tbm_surface_create(stream.width, stream.height, TBM_FORMAT_YUV420);
+ ret = tbm_surface_get_info(surface, &info);
+
+ if (ret != TBM_SURFACE_ERROR_NONE) {
+ tbm_surface_destroy(surface);
+ return;
+ }
+ src_stride[0] = GST_ROUND_UP_4(stream.width);
+ src_stride[1] = src_stride[2] = GST_ROUND_UP_4(stream.width>>1);
+ src_offset[1] = src_stride[0] * GST_ROUND_UP_2(stream.height);
+ src_offset[2] = src_offset[1] + (src_stride[1] * (GST_ROUND_UP_2(stream.height)>>1));
+ stream.stride[0] = info.planes[0].stride;
+ stream.elevation[0] = info.planes[0].size / info.planes[0].stride;
+ stream.stride[1] = info.planes[1].stride;
+ stream.elevation[1] = info.planes[1].size / info.planes[1].stride;
+ stream.stride[2] = info.planes[2].stride;
+ stream.elevation[2] = info.planes[2].size / info.planes[2].stride;
+ size = info.planes[0].size + info.planes[1].size + info.planes[2].size;
+ tbm_surface_destroy(surface);
} else if (stream.format == MM_PIXEL_FORMAT_RGBA) {
stream.stride[0] = stream.width * 4;
+ stream.elevation[0] = stream.height;
size = stream.stride[0] * stream.height;
} else {
LOGE("Not support format %d", stream.format);
return;
}
thandle = tbm_bo_map(stream.bo[0], TBM_DEVICE_CPU, TBM_OPTION_WRITE);
- if (thandle.ptr && mapinfo.data)
- memcpy(thandle.ptr, mapinfo.data, size);
- else
+ if (thandle.ptr && mapinfo.data) {
+ if (stream.format == MM_PIXEL_FORMAT_I420) {
+ for (i = 0; i < 3; i++) {
+ src = mapinfo.data + src_offset[i];
+ dest = thandle.ptr + info.planes[i].offset;
+
+ if (i > 0) k = 1;
+ for (j = 0; j < stream.height>>k; j++) {
+ memcpy(dest, src, stream.width>>k);
+ src += src_stride[i];
+ dest += stream.stride[i];
+ }
+ }
+ } else if (stream.format == MM_PIXEL_FORMAT_RGBA) {
+ memcpy(thandle.ptr, mapinfo.data, size);
+ } else {
+ LOGE("Not support format %d", stream.format);
+ }
+ } else
LOGE("data pointer is wrong. dest : %p, src : %p",
thandle.ptr, mapinfo.data);
tbm_bo_unmap(stream.bo[0]);