summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArun Menon <avmenon@codeaurora.org>2016-03-17 11:03:54 -0700
committerGerrit - the friendly Code Review server <code-review@localhost>2016-05-03 16:38:45 -0700
commit8943d964bf14048c698f0fb91888307b93d43575 (patch)
tree4230f5a10f7452fce3426f1970ceabcdf1afbb1c
parentfdfb471f8864911cf10635e9fd919c66b61aebcb (diff)
downloadandroid_hardware_qcom_media-8943d964bf14048c698f0fb91888307b93d43575.tar.gz
android_hardware_qcom_media-8943d964bf14048c698f0fb91888307b93d43575.tar.bz2
android_hardware_qcom_media-8943d964bf14048c698f0fb91888307b93d43575.zip
mm-video-v4l2: vidc: vdec: Add support for Output crop extra data
Firmware will update the crop dimensions for each fbd in the extra data buffer. OMX component should parse the extra data buffer and get the crop information. If the output crop extra data is not present, then OMX component should fall back and get the information from the fbd v4l2 reserved fields. Change-Id: I450278bbf22b0933f16318769c7c79999b9e1be4
-rw-r--r--mm-video-v4l2/vidc/vdec/inc/omx_vdec.h12
-rw-r--r--mm-video-v4l2/vidc/vdec/src/omx_vdec_v4l2.cpp78
2 files changed, 71 insertions, 19 deletions
diff --git a/mm-video-v4l2/vidc/vdec/inc/omx_vdec.h b/mm-video-v4l2/vidc/vdec/inc/omx_vdec.h
index 23b8d329..b79b9c08 100644
--- a/mm-video-v4l2/vidc/vdec/inc/omx_vdec.h
+++ b/mm-video-v4l2/vidc/vdec/inc/omx_vdec.h
@@ -194,6 +194,7 @@ class VideoHeap : public MemoryHeapBase
#define OMX_QP_EXTRADATA 0x00800000
#define OMX_BITSINFO_EXTRADATA 0x01000000
#define OMX_VQZIPSEI_EXTRADATA 0x02000000
+#define OMX_OUTPUTCROP_EXTRADATA 0x04000000
#define OMX_INTERLACE_EXTRADATA_SIZE ((sizeof(OMX_OTHER_EXTRADATATYPE) +\
sizeof(OMX_STREAMINTERLACEFORMAT) + 3)&(~3))
@@ -314,6 +315,13 @@ struct dynamic_buf_list {
long mapped_size;
};
+struct extradata_info {
+ OMX_BOOL output_crop_updated;
+ OMX_CONFIG_RECTTYPE output_crop_rect;
+ OMX_U32 output_width;
+ OMX_U32 output_height;
+};
+
// OMX video decoder class
class omx_vdec: public qc_omx_component
{
@@ -454,12 +462,15 @@ class omx_vdec: public qc_omx_component
bool is_component_secure();
void buf_ref_add(int nPortIndex);
void buf_ref_remove();
+ void handle_extradata(OMX_BUFFERHEADERTYPE *p_buf_hdr);
+ OMX_BUFFERHEADERTYPE* get_omx_output_buffer_header(int index);
OMX_ERRORTYPE set_dpb(bool is_split_mode, int dpb_color_format);
OMX_ERRORTYPE decide_dpb_buffer_mode(bool force_split_mode);
void request_perf_level(enum vidc_perf_level perf_level);
int dpb_bit_depth;
bool async_thread_force_stop;
volatile bool message_thread_stop;
+ struct extradata_info m_extradata_info;
private:
// Bit Positions
@@ -657,7 +668,6 @@ class omx_vdec: public qc_omx_component
void adjust_timestamp(OMX_S64 &act_timestamp);
void set_frame_rate(OMX_S64 act_timestamp);
void handle_extradata_secure(OMX_BUFFERHEADERTYPE *p_buf_hdr);
- void handle_extradata(OMX_BUFFERHEADERTYPE *p_buf_hdr);
void print_debug_extradata(OMX_OTHER_EXTRADATATYPE *extra);
#ifdef _MSM8974_
void append_interlace_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 d04b3740..eee6fc7b 100644
--- a/mm-video-v4l2/vidc/vdec/src/omx_vdec_v4l2.cpp
+++ b/mm-video-v4l2/vidc/vdec/src/omx_vdec_v4l2.cpp
@@ -123,7 +123,7 @@ extern "C" {
#define EXTRADATA_IDX(__num_planes) ((__num_planes) ? (__num_planes) - 1 : 0)
#define ALIGN(x, to_align) ((((unsigned) x) + (to_align - 1)) & ~(to_align - 1))
-#define DEFAULT_EXTRADATA (OMX_INTERLACE_EXTRADATA | OMX_FRAMEPACK_EXTRADATA)
+#define DEFAULT_EXTRADATA (OMX_INTERLACE_EXTRADATA | OMX_FRAMEPACK_EXTRADATA | OMX_OUTPUTCROP_EXTRADATA)
#define DEFAULT_CONCEAL_COLOR "32784" //0x8010, black by default
#ifndef ION_FLAG_CP_BITSTREAM
@@ -196,12 +196,32 @@ void* async_message_thread (void *input)
vdec_msg.msgdata.output_frame.time_stamp= ((uint64_t)v4l2_buf.timestamp.tv_sec * (uint64_t)1000000) +
(uint64_t)v4l2_buf.timestamp.tv_usec;
if (vdec_msg.msgdata.output_frame.len) {
- vdec_msg.msgdata.output_frame.framesize.left = plane[0].reserved[2];
- vdec_msg.msgdata.output_frame.framesize.top = plane[0].reserved[3];
- vdec_msg.msgdata.output_frame.framesize.right = plane[0].reserved[4];
- vdec_msg.msgdata.output_frame.framesize.bottom = plane[0].reserved[5];
- vdec_msg.msgdata.output_frame.picsize.frame_width = plane[0].reserved[6];
- vdec_msg.msgdata.output_frame.picsize.frame_height = plane[0].reserved[7];
+ OMX_BUFFERHEADERTYPE* omxhdr = NULL;
+ struct v4l2_buffer *v4l2_buf_ptr = NULL;
+
+ v4l2_buf_ptr = (v4l2_buffer*)vdec_msg.msgdata.output_frame.client_data;
+ omxhdr = omx->get_omx_output_buffer_header(v4l2_buf_ptr->index);
+
+ DEBUG_PRINT_LOW("Processing extradata");
+ omx->handle_extradata(omxhdr);
+
+ if (omx->m_extradata_info.output_crop_updated) {
+ DEBUG_PRINT_LOW("Read FBD crop from output extra data");
+ vdec_msg.msgdata.output_frame.framesize.left = omx->m_extradata_info.output_crop_rect.nLeft;
+ vdec_msg.msgdata.output_frame.framesize.top = omx->m_extradata_info.output_crop_rect.nTop;
+ vdec_msg.msgdata.output_frame.framesize.right = omx->m_extradata_info.output_crop_rect.nWidth;
+ 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;
+ } else {
+ DEBUG_PRINT_LOW("Read FBD crop from v4l2 reserved fields");
+ vdec_msg.msgdata.output_frame.framesize.left = plane[0].reserved[2];
+ vdec_msg.msgdata.output_frame.framesize.top = plane[0].reserved[3];
+ vdec_msg.msgdata.output_frame.framesize.right = plane[0].reserved[4];
+ vdec_msg.msgdata.output_frame.framesize.bottom = plane[0].reserved[5];
+ vdec_msg.msgdata.output_frame.picsize.frame_width = plane[0].reserved[6];
+ vdec_msg.msgdata.output_frame.picsize.frame_height = plane[0].reserved[7];
+ }
}
if (omx->async_message_process(input,&vdec_msg) < 0) {
DEBUG_PRINT_HIGH("async_message_thread Exited");
@@ -789,6 +809,7 @@ omx_vdec::omx_vdec(): m_error_propogated(false),
is_q6_platform = false;
m_perf_control.send_hint_to_mpctl(true);
m_input_pass_buffer_fd = false;
+ memset(&m_extradata_info, 0, sizeof(m_extradata_info));
}
static const int event_type[] = {
@@ -2479,12 +2500,7 @@ OMX_ERRORTYPE omx_vdec::component_init(OMX_STRING role)
#endif
m_state = OMX_StateLoaded;
#ifdef DEFAULT_EXTRADATA
- if ((strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8",
- OMX_MAX_STRINGNAME_SIZE) &&
- strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp9",
- OMX_MAX_STRINGNAME_SIZE)) &&
- (eRet == OMX_ErrorNone))
- enable_extradata(DEFAULT_EXTRADATA, true, true);
+ 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);
@@ -7941,11 +7957,6 @@ OMX_ERRORTYPE omx_vdec::fill_buffer_done(OMX_HANDLETYPE hComp,
}
}
- if (!output_flush_progress && (buffer->nFilledLen > 0)) {
- DEBUG_PRINT_LOW("Processing extradata");
- handle_extradata(buffer);
- }
-
#ifdef OUTPUT_EXTRADATA_LOG
if (outputExtradataFile) {
int buf_index = buffer - m_out_mem_ptr;
@@ -10029,6 +10040,11 @@ void omx_vdec::adjust_timestamp(OMX_S64 &act_timestamp)
}
}
+OMX_BUFFERHEADERTYPE* omx_vdec::get_omx_output_buffer_header(int index)
+{
+ return m_out_mem_ptr + index;
+}
+
void omx_vdec::handle_extradata(OMX_BUFFERHEADERTYPE *p_buf_hdr)
{
OMX_OTHER_EXTRADATATYPE *p_extra = NULL, *p_sei = NULL, *p_vui = NULL;
@@ -10040,6 +10056,12 @@ void omx_vdec::handle_extradata(OMX_BUFFERHEADERTYPE *p_buf_hdr)
OMX_U32 recovery_sei_flags = 1;
int enable = 0;
+
+ m_extradata_info.output_crop_updated = OMX_FALSE;
+
+ if (output_flush_progress)
+ 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)",
@@ -10180,6 +10202,18 @@ void omx_vdec::handle_extradata(OMX_BUFFERHEADERTYPE *p_buf_hdr)
((struct vdec_output_frameinfo *)
p_buf_hdr->pOutputPortPrivate)->aspect_ratio_info.par_height = aspect_ratio_payload->aspect_height;
}
+ } else if (etype && *etype == MSM_VIDC_EXTRADATA_OUTPUT_CROP) {
+ struct msm_vidc_output_crop_payload *output_crop_payload;
+ output_crop_payload = (struct msm_vidc_output_crop_payload *)(++etype);
+ if (output_crop_payload) {
+ m_extradata_info.output_crop_rect.nLeft = output_crop_payload->left;
+ m_extradata_info.output_crop_rect.nTop = output_crop_payload->top;
+ m_extradata_info.output_crop_rect.nWidth = output_crop_payload->display_width;
+ m_extradata_info.output_crop_rect.nHeight = output_crop_payload->display_height;
+ 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;
+ }
}
break;
case MSM_VIDC_EXTRADATA_RECOVERY_POINT_SEI:
@@ -10429,6 +10463,14 @@ OMX_ERRORTYPE omx_vdec::enable_extradata(OMX_U32 requested_extradata,
}
client_extradata |= OMX_QP_EXTRADATA;
}
+ if (requested_extradata & OMX_OUTPUTCROP_EXTRADATA) {
+ control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
+ control.value = V4L2_MPEG_VIDC_EXTRADATA_OUTPUT_CROP;
+ DEBUG_PRINT_LOW("Enable output crop extra data");
+ if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL, &control)) {
+ DEBUG_PRINT_HIGH("Failed to set output crop extradata");
+ }
+ }
}
ret = get_buffer_req(&drv_ctx.op_buf);
return ret;