summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRicardo Cerqueira <ricardo@cyngn.com>2015-11-05 00:45:52 +0000
committerRicardo Cerqueira <ricardo@cyngn.com>2015-11-05 00:45:52 +0000
commit50f8d14095122998ee64d99e4c9c2fd381f9a14f (patch)
treea7b1d3018828d1e9c6f08195bfb4fa89f0e92269
parent0a05649748f12f2c7b05e40728d96cb155fffc5d (diff)
parent0a07b0c97ef2c52a6511ab89e3dbb7049a7b02a8 (diff)
downloadandroid_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.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.cpp51
-rw-r--r--mm-video-v4l2/vidc/venc/src/omx_video_base.cpp21
-rw-r--r--mm-video-v4l2/vidc/venc/src/video_encoder_device_v4l2.cpp48
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;