{
RET_VAL_IF(info == NULL, false, "info is NULL");
- if (info->format == MM_PIXEL_FORMAT_I420) {
+ switch (info->format) {
+ case MM_PIXEL_FORMAT_I420:
+ case MM_PIXEL_FORMAT_YV12: {
int ret = TBM_SURFACE_ERROR_NONE;
tbm_surface_h ts;
tbm_surface_info_s ts_info;
unsigned int i;
- ts = tbm_surface_create(info->width, info->height, TBM_FORMAT_YUV420);
+ ts = tbm_surface_create(info->width, info->height, info->format == MM_PIXEL_FORMAT_I420 ? TBM_FORMAT_YUV420 : TBM_FORMAT_YVU420);
+ RET_VAL_IF(ts == NULL, false, "failed to tbm_surface_create()");
ret = tbm_surface_get_info(ts, &ts_info);
tbm_surface_destroy(ts);
- if (ret != TBM_SURFACE_ERROR_NONE)
- return false;
+ RET_VAL_IF(ret != TBM_SURFACE_ERROR_NONE, false, "failed to tbm_surface_get_info()");
for (i = 0; i < ts_info.num_planes; i++) {
info->stride[i] = ts_info.planes[i].stride;
info->elevation[i] = ts_info.planes[i].size / ts_info.planes[i].stride;
}
info->bo_size = ts_info.size;
-
- } else if (info->format == MM_PIXEL_FORMAT_RGBA) {
+ break;
+ }
+ case MM_PIXEL_FORMAT_RGBA:
info->stride[0] = info->width * 4;
info->elevation[0] = info->height;
info->bo_size = info->stride[0] * info->height;
-
- } else {
+ break;
+ default:
LOGE("not supported format(%d)", info->format);
return false;
}
goto ERROR;
}
- if (display->tbm->bo_list == NULL)
+ if (display->tbm->bo_list == NULL) {
+ LOG_DEBUG("MMPixelFormatType[%d]", info->format);
_create_tbm_bo_list(display->tbm, info->bo_size, 10); /* FIXME: use ini file to get list length */
+ }
info->bo[0] = _get_unused_tbm_bo(display->tbm, 10); /* FIXME: use ini file to get timeout sec */
if (info->bo[0] == NULL) {
goto ERROR;
}
- if (info->format == MM_PIXEL_FORMAT_I420) {
+ switch (info->format) {
+ case MM_PIXEL_FORMAT_I420:
+ case MM_PIXEL_FORMAT_YV12: {
+ int u_plane_idx = info->format == MM_PIXEL_FORMAT_I420 ? 1 : 2;
+ int v_plane_idx = info->format == MM_PIXEL_FORMAT_I420 ? 2 : 1;
+
src_stride[0] = GST_ROUND_UP_4(info->width);
src_stride[1] = src_stride[2] = GST_ROUND_UP_4(info->width >> 1);
- src_offset[1] = src_stride[0] * GST_ROUND_UP_2(info->height);
- src_offset[2] = src_offset[1] + (src_stride[1] * (GST_ROUND_UP_2(info->height) >> 1));
+ src_offset[u_plane_idx] = src_stride[0] * GST_ROUND_UP_2(info->height);
+ src_offset[v_plane_idx] = src_offset[u_plane_idx] + (src_stride[1] * (GST_ROUND_UP_2(info->height) >> 1));
dest_offset[0] = 0;
dest_offset[1] = info->stride[0] * info->elevation[0];
dest_offset[2] = dest_offset[1] + info->stride[1] * info->elevation[1];
- for (i = 0; i < 3; i++) {
+ for (i = 0; i < info->plane_num; i++) {
src = mapinfo.data + src_offset[i];
dest = thandle.ptr + dest_offset[i];
k = 1;
for (j = 0; j < info->height >> k; j++) {
- memcpy(dest, src, info->width>>k);
+ memcpy(dest, src, info->width >> k);
src += src_stride[i];
dest += info->stride[i];
}
}
-
- } else if (info->format == MM_PIXEL_FORMAT_RGBA) {
+ break;
+ }
+ case MM_PIXEL_FORMAT_RGBA:
memcpy(thandle.ptr, mapinfo.data, info->bo_size);
-
- } else {
+ break;
+ default:
LOG_ERROR("not support format %d", info->format);
goto ERROR;
}