summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--mm-video-v4l2/vidc/vdec.mk1
-rw-r--r--mm-video-v4l2/vidc/vdec/inc/omx_vdec.h1
-rw-r--r--mm-video-v4l2/vidc/vdec/src/omx_vdec_msm8974.cpp44
-rw-r--r--mm-video-v4l2/vidc/venc/src/video_encoder_device_v4l2.cpp35
4 files changed, 74 insertions, 7 deletions
diff --git a/mm-video-v4l2/vidc/vdec.mk b/mm-video-v4l2/vidc/vdec.mk
index ffee562d..0ccefd6c 100644
--- a/mm-video-v4l2/vidc/vdec.mk
+++ b/mm-video-v4l2/vidc/vdec.mk
@@ -43,6 +43,7 @@ libOmxVdec-def += -DPROCESS_EXTRADATA_IN_OUTPUT_PORT
libOmxVdec-def += -D_MSM8974_
libOmxVdec-def += -D_HEVC_USE_ADSP_HEAP_
libOmxVdec-def += -DDISABLE_INPUT_BUFFER_CACHE
+libOmxVdec-def += -DDISABLE_EXTRADATA
endif
ifeq ($(TARGET_BOARD_PLATFORM),msm7627a)
libOmxVdec-def += -DMAX_RES_720P
diff --git a/mm-video-v4l2/vidc/vdec/inc/omx_vdec.h b/mm-video-v4l2/vidc/vdec/inc/omx_vdec.h
index 9b7095aa..120a11dd 100644
--- a/mm-video-v4l2/vidc/vdec/inc/omx_vdec.h
+++ b/mm-video-v4l2/vidc/vdec/inc/omx_vdec.h
@@ -202,6 +202,7 @@ class VideoHeap : public MemoryHeapBase
#define OMX_QP_EXTRADATA 0x00800000
#define OMX_BITSINFO_EXTRADATA 0x01000000
#define OMX_MPEG2SEQDISP_EXTRADATA 0x02000000
+#define OMX_VUI_DISPLAY_INFO_EXTRADATA 0x04000000
#define DRIVER_EXTRADATA_MASK 0x0000FFFF
#define OMX_INTERLACE_EXTRADATA_SIZE ((sizeof(OMX_OTHER_EXTRADATATYPE) +\
diff --git a/mm-video-v4l2/vidc/vdec/src/omx_vdec_msm8974.cpp b/mm-video-v4l2/vidc/vdec/src/omx_vdec_msm8974.cpp
index 22115b3d..7f20e629 100644
--- a/mm-video-v4l2/vidc/vdec/src/omx_vdec_msm8974.cpp
+++ b/mm-video-v4l2/vidc/vdec/src/omx_vdec_msm8974.cpp
@@ -128,7 +128,10 @@ extern "C" {
#define EXTRADATA_IDX(__num_planes) (__num_planes - 1)
#define ALIGN(x, to_align) ((((unsigned) x) + (to_align - 1)) & ~(to_align - 1))
-#define DEFAULT_EXTRADATA (OMX_INTERLACE_EXTRADATA)
+#ifndef DISABLE_EXTRADATA
+#define DEFAULT_EXTRADATA (OMX_INTERLACE_EXTRADATA | OMX_VUI_DISPLAY_INFO_EXTRADATA)
+#endif
+
#define DEFAULT_CONCEAL_COLOR "32784" //0x8010, black by default
@@ -9116,9 +9119,6 @@ void omx_vdec::handle_extradata(OMX_BUFFERHEADERTYPE *p_buf_hdr)
OMX_U32 recovery_sei_flags = 1;
int enable = 0;
- //TODO: disable extradata
- return;
-
int buf_index = p_buf_hdr - m_out_mem_ptr;
if (buf_index >= drv_ctx.extradata_info.count) {
DEBUG_PRINT_ERROR("handle_extradata: invalid index(%d) max(%d)",
@@ -9290,6 +9290,33 @@ void omx_vdec::handle_extradata(OMX_BUFFERHEADERTYPE *p_buf_hdr)
p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
}
break;
+ case MSM_VIDC_EXTRADATA_VUI_DISPLAY_INFO:
+ struct msm_vidc_vui_display_info_payload *display_info_payload;
+ display_info_payload = (struct msm_vidc_vui_display_info_payload*)(void *)data->data;
+
+ if (client_extradata & OMX_VUI_DISPLAY_INFO_EXTRADATA) {
+ /* This extradata usually isn't needed by clients. Leave it unimplemented for now */
+ DEBUG_PRINT_ERROR("VUI display info not propagated to client");
+ }
+
+ if (m_enable_android_native_buffers) {
+ ColorSpace_t color_space = ITU_R_601_FR;
+
+ switch (display_info_payload->color_primaries) {
+ case 1:
+ color_space = ITU_R_709;
+ break;
+ case 5:
+ color_space = display_info_payload->video_full_range_flag ?
+ ITU_R_601_FR : ITU_R_601;
+ break;
+ }
+
+ DEBUG_PRINT_LOW("colorspace from VUI = %d", color_space);
+ setMetaData((private_handle_t *)native_buffer[buf_index].privatehandle,
+ UPDATE_COLOR_SPACE, (void*)&color_space);
+ }
+ break;
default:
DEBUG_PRINT_LOW("Unrecognized extradata");
goto unrecognized_extradata;
@@ -9334,8 +9361,6 @@ OMX_ERRORTYPE omx_vdec::enable_extradata(OMX_U32 requested_extradata,
DEBUG_PRINT_ERROR("ERROR: enable extradata allowed in Loaded state only");
return OMX_ErrorIncorrectStateOperation;
}
- //TODO: disable extradata
- return ret;
DEBUG_PRINT_HIGH("NOTE: enable_extradata: actual[%u] requested[%u] enable[%d], is_internal: %d",
(unsigned int)client_extradata, (unsigned int)requested_extradata, enable, is_internal);
@@ -9435,6 +9460,13 @@ OMX_ERRORTYPE omx_vdec::enable_extradata(OMX_U32 requested_extradata,
DEBUG_PRINT_HIGH("Seq display extradata is supported for MPEG2 only");
}
}
+ if (requested_extradata & OMX_VUI_DISPLAY_INFO_EXTRADATA) {
+ control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
+ control.value = V4L2_MPEG_VIDC_EXTRADATA_VUI_DISPLAY;
+ if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
+ DEBUG_PRINT_HIGH("Failed to set display VUI extradata");
+ }
+ }
}
ret = get_buffer_req(&drv_ctx.op_buf);
return ret;
diff --git a/mm-video-v4l2/vidc/venc/src/video_encoder_device_v4l2.cpp b/mm-video-v4l2/vidc/venc/src/video_encoder_device_v4l2.cpp
index 8266ee0b..32d73b59 100644
--- a/mm-video-v4l2/vidc/venc/src/video_encoder_device_v4l2.cpp
+++ b/mm-video-v4l2/vidc/venc/src/video_encoder_device_v4l2.cpp
@@ -969,6 +969,7 @@ bool venc_dev::venc_open(OMX_U32 codec)
fmt.fmt.pix_mp.height = m_sVenc_cfg.input_height;
fmt.fmt.pix_mp.width = m_sVenc_cfg.input_width;
fmt.fmt.pix_mp.pixelformat = V4L2_PIX_FMT_NV12;
+ fmt.fmt.pix_mp.colorspace = V4L2_COLORSPACE_BT878;
ret = ioctl(m_nDriver_fd, VIDIOC_S_FMT, &fmt);
m_sInput_buff_property.datasize=fmt.fmt.pix_mp.plane_fmt[0].sizeimage;
@@ -1183,6 +1184,7 @@ bool venc_dev::venc_get_buf_req(OMX_U32 *min_buff_count,
fmt.fmt.pix_mp.height = m_sVenc_cfg.input_height;
fmt.fmt.pix_mp.width = m_sVenc_cfg.input_width;
fmt.fmt.pix_mp.pixelformat = V4L2_PIX_FMT_NV12;
+ fmt.fmt.pix_mp.colorspace = V4L2_COLORSPACE_BT878;
ret = ioctl(m_nDriver_fd, VIDIOC_G_FMT, &fmt);
m_sInput_buff_property.datasize=fmt.fmt.pix_mp.plane_fmt[0].sizeimage;
bufreq.memory = V4L2_MEMORY_USERPTR;
@@ -1315,6 +1317,7 @@ bool venc_dev::venc_set_param(void *paramData,OMX_INDEXTYPE index )
fmt.fmt.pix_mp.height = m_sVenc_cfg.input_height;
fmt.fmt.pix_mp.width = m_sVenc_cfg.input_width;
fmt.fmt.pix_mp.pixelformat = V4L2_PIX_FMT_NV12;
+ fmt.fmt.pix_mp.colorspace = V4L2_COLORSPACE_BT878;
if (ioctl(m_nDriver_fd, VIDIOC_S_FMT, &fmt)) {
DEBUG_PRINT_ERROR("VIDIOC_S_FMT OUTPUT_MPLANE Failed");
@@ -2656,10 +2659,15 @@ bool venc_dev::venc_empty_buf(void *buffer, void *pmem_data_buf, unsigned index,
return false;
}
} else if (!color_format) {
+ int color_space = 0;
+
if (meta_buf->buffer_type == kMetadataBufferTypeCameraSource) {
if (meta_buf->meta_handle->numFds + meta_buf->meta_handle->numInts > 3 &&
- meta_buf->meta_handle->data[3] & private_handle_t::PRIV_FLAGS_ITU_R_709)
+ meta_buf->meta_handle->data[3] & private_handle_t::PRIV_FLAGS_ITU_R_709) {
buf.flags = V4L2_MSM_BUF_FLAG_YUV_601_709_CLAMP;
+ color_space = V4L2_COLORSPACE_REC709;
+ }
+
if (meta_buf->meta_handle->numFds + meta_buf->meta_handle->numInts > 2) {
plane.data_offset = meta_buf->meta_handle->data[1];
plane.length = meta_buf->meta_handle->data[2];
@@ -2702,6 +2710,13 @@ bool venc_dev::venc_empty_buf(void *buffer, void *pmem_data_buf, unsigned index,
if (csc == ITU_R_709) {
buf.flags |= V4L2_MSM_BUF_FLAG_YUV_601_709_CLAMP;
DEBUG_PRINT_LOW("venc_empty_buf: force 601 -> 709 clamping");
+ color_space = V4L2_COLORSPACE_REC709;
+ } else if (csc == ITU_R_601_FR) {
+ DEBUG_PRINT_LOW("venc_empty_buf: 601 full-range");
+ color_space = V4L2_COLORSPACE_470_SYSTEM_BG;
+ } else if (csc == ITU_R_601) {
+ DEBUG_PRINT_LOW("venc_empty_buf: 601 clamped");
+ color_space = V4L2_COLORSPACE_BT878;
}
} else {
DEBUG_PRINT_LOW("venc_empty_buf: gralloc metadata is NULL");
@@ -2709,6 +2724,20 @@ bool venc_dev::venc_empty_buf(void *buffer, void *pmem_data_buf, unsigned index,
DEBUG_PRINT_LOW("venc_empty_buf: Opaque camera buf: fd = %d "
": filled %d of %d", fd, plane.bytesused, plane.length);
}
+
+
+ if (!streaming[OUTPUT_PORT]) {
+ struct v4l2_format fmt;
+ fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
+ fmt.fmt.pix_mp.pixelformat = m_sVenc_cfg.inputformat;
+ fmt.fmt.pix_mp.colorspace = static_cast<decltype(fmt.fmt.pix_mp.colorspace)>(color_space);
+ fmt.fmt.pix_mp.height = m_sVenc_cfg.input_height;
+ fmt.fmt.pix_mp.width = m_sVenc_cfg.input_width;
+ if (ioctl(m_nDriver_fd, VIDIOC_S_FMT, &fmt)) {
+ DEBUG_PRINT_ERROR("Failed setting color format in in etb %x", m_sVenc_cfg.inputformat);
+ return false;
+ }
+ }
} else {
plane.data_offset = bufhdr->nOffset;
plane.length = bufhdr->nAllocLen;
@@ -4052,13 +4081,16 @@ bool venc_dev::venc_set_encode_framerate(OMX_U32 encode_framerate, OMX_U32 confi
bool venc_dev::venc_set_color_format(OMX_COLOR_FORMATTYPE color_format)
{
struct v4l2_format fmt;
+ int color_space = 0;
DEBUG_PRINT_LOW("venc_set_color_format: color_format = %u ", color_format);
if ((int)color_format == (int)OMX_COLOR_FormatYUV420SemiPlanar ||
(int)color_format == (int)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m) {
m_sVenc_cfg.inputformat = V4L2_PIX_FMT_NV12;
+ color_space = V4L2_COLORSPACE_BT878;
} else if ((int)color_format == (int)QOMX_COLOR_FormatYVU420SemiPlanar) {
m_sVenc_cfg.inputformat = V4L2_PIX_FMT_NV21;
+ color_space = V4L2_COLORSPACE_BT878;
} else {
DEBUG_PRINT_HIGH("WARNING: Unsupported Color format [%d]", color_format);
m_sVenc_cfg.inputformat = V4L2_PIX_FMT_NV12;
@@ -4067,6 +4099,7 @@ bool venc_dev::venc_set_color_format(OMX_COLOR_FORMATTYPE color_format)
fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
fmt.fmt.pix_mp.pixelformat = m_sVenc_cfg.inputformat;
+ fmt.fmt.pix_mp.colorspace = static_cast<decltype(fmt.fmt.pix_mp.colorspace)>(color_space);
fmt.fmt.pix_mp.height = m_sVenc_cfg.input_height;
fmt.fmt.pix_mp.width = m_sVenc_cfg.input_width;