diff options
-rw-r--r-- | mm-video-v4l2/vidc/vdec.mk | 1 | ||||
-rw-r--r-- | mm-video-v4l2/vidc/vdec/inc/omx_vdec.h | 1 | ||||
-rw-r--r-- | mm-video-v4l2/vidc/vdec/src/omx_vdec_msm8974.cpp | 44 | ||||
-rw-r--r-- | mm-video-v4l2/vidc/venc/src/video_encoder_device_v4l2.cpp | 35 |
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; |