diff options
author | Ricardo Cerqueira <ricardo@cyngn.com> | 2015-11-05 00:45:52 +0000 |
---|---|---|
committer | Ricardo Cerqueira <ricardo@cyngn.com> | 2015-11-05 00:45:52 +0000 |
commit | 50f8d14095122998ee64d99e4c9c2fd381f9a14f (patch) | |
tree | a7b1d3018828d1e9c6f08195bfb4fa89f0e92269 | |
parent | 0a05649748f12f2c7b05e40728d96cb155fffc5d (diff) | |
parent | 0a07b0c97ef2c52a6511ab89e3dbb7049a7b02a8 (diff) | |
download | android_hardware_qcom_media-50f8d14095122998ee64d99e4c9c2fd381f9a14f.tar.gz android_hardware_qcom_media-50f8d14095122998ee64d99e4c9c2fd381f9a14f.tar.bz2 android_hardware_qcom_media-50f8d14095122998ee64d99e4c9c2fd381f9a14f.zip |
Merge tag 'android-6.0.0_r26' into cm-13.0
Android 6.0.0 release 26
-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 | 51 | ||||
-rw-r--r-- | mm-video-v4l2/vidc/venc/src/omx_video_base.cpp | 21 | ||||
-rw-r--r-- | mm-video-v4l2/vidc/venc/src/video_encoder_device_v4l2.cpp | 48 |
5 files changed, 101 insertions, 21 deletions
diff --git a/mm-video-v4l2/vidc/vdec.mk b/mm-video-v4l2/vidc/vdec.mk index 4e005e30..a27f7fd4 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..9c6646a4 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 @@ -1988,10 +1991,11 @@ OMX_ERRORTYPE omx_vdec::component_init(OMX_STRING role) m_state = OMX_StateLoaded; #ifdef DEFAULT_EXTRADATA - if (strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8", - OMX_MAX_STRINGNAME_SIZE) - && (eRet == OMX_ErrorNone)) + if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.avc", OMX_MAX_STRINGNAME_SIZE) && + (eRet == OMX_ErrorNone)) { + DEBUG_PRINT_INFO("Enabling default extradata for %s", drv_ctx.kind); enable_extradata(DEFAULT_EXTRADATA, true, true); + } #endif eRet=get_buffer_req(&drv_ctx.ip_buf); DEBUG_PRINT_HIGH("Input Buffer Size =%u",(unsigned int)drv_ctx.ip_buf.buffer_size); @@ -9116,9 +9120,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 +9291,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 +9362,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 +9461,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/omx_video_base.cpp b/mm-video-v4l2/vidc/venc/src/omx_video_base.cpp index 643e2d99..7f0482fe 100644 --- a/mm-video-v4l2/vidc/venc/src/omx_video_base.cpp +++ b/mm-video-v4l2/vidc/venc/src/omx_video_base.cpp @@ -2653,7 +2653,7 @@ OMX_ERRORTYPE omx_video::allocate_input_meta_buffer( OMX_U32 bytes) { unsigned index = 0; - if (!bufferHdr || bytes != sizeof(encoder_media_buffer_type)) { + if (!bufferHdr || bytes < sizeof(encoder_media_buffer_type)) { DEBUG_PRINT_ERROR("wrong params allocate_input_meta_buffer Hdr %p len %u", bufferHdr, (unsigned int)bytes); return OMX_ErrorBadParameter; @@ -4571,11 +4571,14 @@ OMX_ERRORTYPE omx_video::empty_this_buffer_opaque(OMX_IN OMX_HANDLETYPE hComp, handle = (private_handle_t *)media_buffer->meta_handle; } - /*Enable following code once private handle color format is - updated correctly*/ - mUsesColorConversion = true; - if (buffer->nFilledLen > 0 && handle) { + /*Enable following code once private handle color format is + updated correctly*/ + if (handle->format == HAL_PIXEL_FORMAT_RGBA_8888) + mUsesColorConversion = true; + else + mUsesColorConversion = false; + if (c2d_opened && handle->format != c2d_conv.get_src_format()) { c2d_conv.close(); c2d_opened = false; @@ -4597,12 +4600,10 @@ OMX_ERRORTYPE omx_video::empty_this_buffer_opaque(OMX_IN OMX_HANDLETYPE hComp, if (!dev_set_format(handle->format)) DEBUG_PRINT_ERROR("cannot set color format for RGBA8888"); #endif - } else if (handle->format == HAL_PIXEL_FORMAT_NV12_ENCODEABLE && - handle->format != QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m) { - mUsesColorConversion = false; - } else { + } else if (handle->format != HAL_PIXEL_FORMAT_NV12_ENCODEABLE && + handle->format != QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m && + handle->format != QOMX_COLOR_FormatYVU420SemiPlanar) { DEBUG_PRINT_ERROR("Incorrect color format"); - mUsesColorConversion = false; m_pCallbacks.EmptyBufferDone(hComp,m_app_data,buffer); return OMX_ErrorBadParameter; } 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 6a633b26..6e07ab71 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; @@ -1195,10 +1197,16 @@ bool venc_dev::venc_get_buf_req(OMX_U32 *min_buff_count, // Increase buffer-header count for metadata-mode on input port // to improve buffering and reduce bottlenecks in clients if (metadatamode && (bufreq.count < 9)) { - DEBUG_PRINT_LOW("FW returned buffer count = %d , overwriting with 16", + DEBUG_PRINT_LOW("FW returned buffer count = %d , overwriting with 9", bufreq.count); bufreq.count = 9; } + if (m_sVenc_cfg.input_height * m_sVenc_cfg.input_width >= 3840*2160) { + DEBUG_PRINT_LOW("Increasing buffer count = %d to 11", bufreq.count); + bufreq.count = 11; + } else { + bufreq.count = 12; + } bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; ret = ioctl(m_nDriver_fd,VIDIOC_REQBUFS, &bufreq); @@ -1309,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"); @@ -1335,6 +1344,11 @@ bool venc_dev::venc_set_param(void *paramData,OMX_INDEXTYPE index ) DEBUG_PRINT_LOW("input: actual: %u, min: %u, count_req: %u", (unsigned int)portDefn->nBufferCountActual, (unsigned int)m_sInput_buff_property.mincount, bufreq.count); + if (m_sVenc_cfg.input_width * m_sVenc_cfg.input_height >= 3840 * 2160) { + if (venc_set_perf_mode(V4L2_MPEG_VIDC_VIDEO_PERF_POWER_SAVE) == false) { + DEBUG_PRINT_ERROR("ERROR: Failed to set Power save mode"); + } + } } else if (portDefn->nPortIndex == PORT_INDEX_OUT) { m_sVenc_cfg.dvs_height = portDefn->format.video.nFrameHeight; m_sVenc_cfg.dvs_width = portDefn->format.video.nFrameWidth; @@ -2645,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]; @@ -2691,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"); @@ -2698,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; @@ -4041,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; @@ -4056,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; |