summaryrefslogtreecommitdiff
path: root/mm-video-v4l2
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@quicinc.com>2017-06-14 12:13:03 -0700
committerGerrit - the friendly Code Review server <code-review@localhost>2017-06-14 12:13:03 -0700
commita76f9dd1c99e29dcb4e55b2068ec0cc550ada8df (patch)
tree465c3bec8e92506ef8ae85bd1bfa8d25944184bd /mm-video-v4l2
parentbcddd81af66b40d64979071fc577fbffaafca9e9 (diff)
parentcb6623fb64f31753a2e0562383aa6048ba63508f (diff)
downloadmedia-a76f9dd1c99e29dcb4e55b2068ec0cc550ada8df.tar.gz
Merge "mm-video-v4l2: vdec: New client extradata OutputCrop" into video-userspace.lnx.3.0-dev
Diffstat (limited to 'mm-video-v4l2')
-rw-r--r--mm-video-v4l2/vidc/vdec/inc/omx_vdec.h13
-rw-r--r--mm-video-v4l2/vidc/vdec/src/omx_vdec_v4l2.cpp77
2 files changed, 87 insertions, 3 deletions
diff --git a/mm-video-v4l2/vidc/vdec/inc/omx_vdec.h b/mm-video-v4l2/vidc/vdec/inc/omx_vdec.h
index 03e65066..0db0e93a 100644
--- a/mm-video-v4l2/vidc/vdec/inc/omx_vdec.h
+++ b/mm-video-v4l2/vidc/vdec/inc/omx_vdec.h
@@ -207,6 +207,8 @@ extern "C" {
sizeof(OMX_QCOM_EXTRADATA_VQZIPSEI) + 3)&(~3))
#define OMX_USERDATA_EXTRADATA_SIZE ((sizeof(OMX_OTHER_EXTRADATATYPE) +\
+ 3)&(~3))
+#define OMX_OUTPUTCROP_EXTRADATA_SIZE ((sizeof(OMX_OTHER_EXTRADATATYPE) +\
+ sizeof(OMX_QCOM_OUTPUT_CROP) + 3)&(~3))
/* STATUS CODES */
/* Base value for status codes */
@@ -380,6 +382,13 @@ struct vdec_sep_metadatainfo {
uint32_t buffer_size;
};
+struct vdec_misrinfo {
+ uint32_t misr_dpb_luma;
+ uint32_t misr_dpb_chroma;
+ uint32_t misr_opb_luma;
+ uint32_t misr_opb_chroma;
+};
+
struct vdec_output_frameinfo {
void *bufferaddr;
size_t offset;
@@ -394,6 +403,7 @@ struct vdec_output_frameinfo {
enum vdec_interlaced_format interlaced_format;
struct vdec_aspectratioinfo aspect_ratio_info;
struct vdec_sep_metadatainfo metadata_info;
+ struct vdec_misrinfo misrinfo[2];
};
union vdec_msgdata {
@@ -497,6 +507,7 @@ struct extradata_info {
OMX_CONFIG_RECTTYPE output_crop_rect;
OMX_U32 output_width;
OMX_U32 output_height;
+ OMX_QCOM_MISR_INFO misr_info[2];
};
typedef std::unordered_map <int, int> ColorSubMapping;
@@ -904,6 +915,8 @@ class omx_vdec: public qc_omx_component
void append_user_extradata(OMX_OTHER_EXTRADATATYPE *extra, OMX_OTHER_EXTRADATATYPE *p_user);
void append_concealmb_extradata(OMX_OTHER_EXTRADATATYPE *extra,
OMX_OTHER_EXTRADATATYPE *p_concealmb, OMX_U8 *conceal_mb_data);
+ void append_outputcrop_extradata(OMX_OTHER_EXTRADATATYPE *extra,
+ struct msm_vidc_output_crop_payload *output_crop_payload);
void append_framepack_extradata(OMX_OTHER_EXTRADATATYPE *extra,
struct msm_vidc_s3d_frame_packing_payload *s3d_frame_packing_payload);
void append_qp_extradata(OMX_OTHER_EXTRADATATYPE *extra,
diff --git a/mm-video-v4l2/vidc/vdec/src/omx_vdec_v4l2.cpp b/mm-video-v4l2/vidc/vdec/src/omx_vdec_v4l2.cpp
index 5761a250..1e23924b 100644
--- a/mm-video-v4l2/vidc/vdec/src/omx_vdec_v4l2.cpp
+++ b/mm-video-v4l2/vidc/vdec/src/omx_vdec_v4l2.cpp
@@ -8488,6 +8488,8 @@ int omx_vdec::async_message_process (void *context, void* message)
vdec_msg->msgdata.output_frame.framesize.bottom = omx->m_extradata_info.output_crop_rect.nHeight;
vdec_msg->msgdata.output_frame.picsize.frame_width = omx->m_extradata_info.output_width;
vdec_msg->msgdata.output_frame.picsize.frame_height = omx->m_extradata_info.output_height;
+ memcpy(vdec_msg->msgdata.output_frame.misrinfo,
+ omx->m_extradata_info.misr_info, sizeof(vdec_misrinfo));
} else {
DEBUG_PRINT_LOW("Read FBD crop from v4l2 reserved fields");
vdec_msg->msgdata.output_frame.framesize.left = plane[0].reserved[2];
@@ -10018,6 +10020,27 @@ void omx_vdec::handle_extradata(OMX_BUFFERHEADERTYPE *p_buf_hdr)
m_extradata_info.output_width = output_crop_payload->width;
m_extradata_info.output_height = output_crop_payload->height;
m_extradata_info.output_crop_updated = OMX_TRUE;
+ DEBUG_PRINT_HIGH("MISR0: %x %x %x %x\n",
+ output_crop_payload->misr_info[0].misr_dpb_luma,
+ output_crop_payload->misr_info[0].misr_dpb_chroma,
+ output_crop_payload->misr_info[0].misr_opb_luma,
+ output_crop_payload->misr_info[0].misr_opb_chroma);
+ DEBUG_PRINT_HIGH("MISR1: %x %x %x %x\n",
+ output_crop_payload->misr_info[1].misr_dpb_luma,
+ output_crop_payload->misr_info[1].misr_dpb_chroma,
+ output_crop_payload->misr_info[1].misr_opb_luma,
+ output_crop_payload->misr_info[1].misr_opb_chroma);
+ memcpy(m_extradata_info.misr_info, output_crop_payload->misr_info, 2 * sizeof(msm_vidc_misr_info));
+ if (client_extradata & OMX_OUTPUTCROP_EXTRADATA) {
+ append_outputcrop_extradata(p_extra, output_crop_payload);
+ p_extra = (OMX_OTHER_EXTRADATATYPE *)(((OMX_U8 *)p_extra) + ALIGN(p_extra->nSize, 4));
+ if (p_client_extra) {
+ append_outputcrop_extradata(p_client_extra, output_crop_payload);
+ p_client_extra = (OMX_OTHER_EXTRADATATYPE *)(((OMX_U8 *)p_client_extra) + ALIGN(p_client_extra->nSize, 4));
+ }
+ } else {
+ DEBUG_PRINT_ERROR("p_extra %p p_client_extra %p client_extradata %x %x ", p_extra, p_client_extra, client_extradata, OMX_OUTPUTCROP_EXTRADATA);
+ }
}
}
break;
@@ -10319,14 +10342,11 @@ OMX_ERRORTYPE omx_vdec::enable_extradata(OMX_U64 requested_extradata,
if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
DEBUG_PRINT_HIGH("Failed to set VQZip SEI extradata");
}
- client_extradata |= OMX_VQZIPSEI_EXTRADATA;
-
control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
control.value = V4L2_MPEG_VIDC_EXTRADATA_FRAME_QP;
if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
DEBUG_PRINT_HIGH("Failed to set QP extradata");
}
- client_extradata |= OMX_QP_EXTRADATA;
}
if (requested_extradata & OMX_OUTPUTCROP_EXTRADATA) {
control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
@@ -10539,6 +10559,45 @@ void omx_vdec::print_debug_extradata(OMX_OTHER_EXTRADATATYPE *extra)
" Size: %u\n",
(unsigned int)vq->nSize);
DEBUG_PRINT_HIGH( "=========== End of VQZip ===========");
+ } else if (extra->eType == (OMX_EXTRADATATYPE)OMX_ExtraDataOutputCropInfo) {
+ OMX_QCOM_OUTPUT_CROP *outputcrop_info = (OMX_QCOM_OUTPUT_CROP*)(void *)extra->data;
+ DEBUG_PRINT_HIGH(
+ "------------------ output crop ----------\n"
+ " left: %u \n"
+ " top: %u \n"
+ " display_width: %u \n"
+ " display_height: %u \n"
+ " width: %u \n"
+ " height: %u \n"
+ " frame_num: %u \n"
+ " bit_depth_y: %u \n"
+ " bit_depth_c: %u \n"
+ " top field: misr_dpb_luma: %u \n"
+ " top field: misr_dpb_chroma: %u \n"
+ " top field: misr_opb_luma: %u \n"
+ " top field: misr_opb_chroma: %u \n"
+ " bottom field: misr_dpb_luma: %u \n"
+ "bottom field: misr_dpb_chroma: %u \n"
+ " bottom field: misr_opb_luma: %u \n"
+ "bottom field: misr_opb_chroma: %u \n"
+ "================== End of output crop ===========",
+ (unsigned int)outputcrop_info->left,
+ (unsigned int)outputcrop_info->top,
+ (unsigned int)outputcrop_info->display_width,
+ (unsigned int)outputcrop_info->display_height,
+ (unsigned int)outputcrop_info->width,
+ (unsigned int)outputcrop_info->height,
+ (unsigned int)outputcrop_info->frame_num,
+ (unsigned int)outputcrop_info->bit_depth_y,
+ (unsigned int)outputcrop_info->bit_depth_c,
+ (unsigned int)outputcrop_info->misr_info[0].misr_dpb_luma,
+ (unsigned int)outputcrop_info->misr_info[0].misr_dpb_chroma,
+ (unsigned int)outputcrop_info->misr_info[0].misr_opb_luma,
+ (unsigned int)outputcrop_info->misr_info[0].misr_opb_chroma,
+ (unsigned int)outputcrop_info->misr_info[1].misr_dpb_luma,
+ (unsigned int)outputcrop_info->misr_info[1].misr_dpb_chroma,
+ (unsigned int)outputcrop_info->misr_info[1].misr_opb_luma,
+ (unsigned int)outputcrop_info->misr_info[1].misr_opb_chroma);
} else if (extra->eType == OMX_ExtraDataNone) {
DEBUG_PRINT_HIGH("========== End of Terminator ===========");
} else {
@@ -10713,6 +10772,18 @@ void omx_vdec::append_portdef_extradata(OMX_OTHER_EXTRADATATYPE *extra)
(unsigned int)portDefn->format.video.nSliceHeight);
}
+void omx_vdec::append_outputcrop_extradata(OMX_OTHER_EXTRADATATYPE *extra,
+ struct msm_vidc_output_crop_payload *output_crop_payload) {
+ extra->nSize = OMX_OUTPUTCROP_EXTRADATA_SIZE;
+ extra->nVersion.nVersion = OMX_SPEC_VERSION;
+ extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
+ extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataOutputCropInfo;
+ extra->nDataSize = sizeof(OMX_QCOM_OUTPUT_CROP);
+ memcpy(extra->data, output_crop_payload, extra->nDataSize);
+
+ print_debug_extradata(extra);
+}
+
void omx_vdec::append_framepack_extradata(OMX_OTHER_EXTRADATATYPE *extra,
struct msm_vidc_s3d_frame_packing_payload *s3d_frame_packing_payload)
{