summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@localhost>2015-12-02 01:11:27 -0800
committerGerrit - the friendly Code Review server <code-review@localhost>2015-12-02 01:11:27 -0800
commit10333844fe5623c047d51b55c8604f1765621685 (patch)
tree823f028a041fbdfdcd34b9da8811800002493da6
parent97836e46273bbd6e019d572414c110449dd11d16 (diff)
parent622d48024cbf6a3a0749052d3903e3a5f63c5873 (diff)
downloadandroid_hardware_qcom_media-10333844fe5623c047d51b55c8604f1765621685.tar.gz
android_hardware_qcom_media-10333844fe5623c047d51b55c8604f1765621685.tar.bz2
android_hardware_qcom_media-10333844fe5623c047d51b55c8604f1765621685.zip
Merge "mm-video-v4l2: vidc: Enhance VQZIP checks"
-rw-r--r--mm-video-v4l2/vidc/vdec/src/omx_vdec_v4l2.cpp7
-rw-r--r--mm-video-v4l2/vidc/venc/inc/omx_video_base.h2
-rw-r--r--mm-video-v4l2/vidc/venc/inc/omx_video_common.h4
-rw-r--r--mm-video-v4l2/vidc/venc/inc/omx_video_encoder.h2
-rw-r--r--mm-video-v4l2/vidc/venc/inc/video_encoder_device_v4l2.h5
-rw-r--r--mm-video-v4l2/vidc/venc/src/omx_video_base.cpp10
-rw-r--r--mm-video-v4l2/vidc/venc/src/omx_video_encoder.cpp4
-rw-r--r--mm-video-v4l2/vidc/venc/src/video_encoder_device_v4l2.cpp106
8 files changed, 115 insertions, 25 deletions
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 28156668..0ad47b64 100644
--- a/mm-video-v4l2/vidc/vdec/src/omx_vdec_v4l2.cpp
+++ b/mm-video-v4l2/vidc/vdec/src/omx_vdec_v4l2.cpp
@@ -4841,6 +4841,12 @@ OMX_ERRORTYPE omx_vdec::get_config(OMX_IN OMX_HANDLETYPE hComp,
QOMX_VIDEO_H264ENTROPYCODINGTYPE *coding = (QOMX_VIDEO_H264ENTROPYCODINGTYPE *)configData;
struct v4l2_control control;
+ if (drv_ctx.decoder_format != VDEC_CODECTYPE_H264) {
+ DEBUG_PRINT_ERROR("get_config of OMX_QcomIndexConfigH264EntropyCodingCabac only available for H264");
+ eRet = OMX_ErrorNotImplemented;
+ break;
+ }
+
control.id = V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE;
if (!ioctl(drv_ctx.video_driver_fd, VIDIOC_G_CTRL, &control)) {
coding->bCabac = (OMX_BOOL)
@@ -10079,6 +10085,7 @@ void omx_vdec::handle_extradata(OMX_BUFFERHEADERTYPE *p_buf_hdr)
struct msm_vidc_vqzip_sei_payload *vqzip_payload;
vqzip_payload = (struct msm_vidc_vqzip_sei_payload*)(void *)data->data;
if (client_extradata & OMX_VQZIPSEI_EXTRADATA) {
+ p_buf_hdr->nFlags |= OMX_BUFFERFLAG_EXTRADATA;
append_vqzip_extradata(p_extra, vqzip_payload);
p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
}
diff --git a/mm-video-v4l2/vidc/venc/inc/omx_video_base.h b/mm-video-v4l2/vidc/venc/inc/omx_video_base.h
index feb42efa..40ff5916 100644
--- a/mm-video-v4l2/vidc/venc/inc/omx_video_base.h
+++ b/mm-video-v4l2/vidc/venc/inc/omx_video_base.h
@@ -234,7 +234,7 @@ class omx_video: public qc_omx_component
virtual bool dev_loaded_stop_done(void) = 0;
virtual bool is_secure_session(void) = 0;
virtual int dev_handle_output_extradata(void*) = 0;
- virtual int dev_handle_input_extradata(void*) = 0;
+ virtual int dev_handle_input_extradata(void*, int) = 0;
virtual void dev_set_extradata_cookie(void*) = 0;
virtual int dev_set_format(int) = 0;
virtual bool dev_is_video_session_supported(OMX_U32 width, OMX_U32 height) = 0;
diff --git a/mm-video-v4l2/vidc/venc/inc/omx_video_common.h b/mm-video-v4l2/vidc/venc/inc/omx_video_common.h
index 50e85e2c..58f14fa0 100644
--- a/mm-video-v4l2/vidc/venc/inc/omx_video_common.h
+++ b/mm-video-v4l2/vidc/venc/inc/omx_video_common.h
@@ -64,6 +64,10 @@ ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#define OMX_CORE_720P_HEIGHT 720
#define OMX_CORE_1080P_WIDTH 1920
#define OMX_CORE_1080P_HEIGHT 1080
+#define OMX_CORE_4KUHD_WIDTH 3840
+#define OMX_CORE_4KUHD_HEIGHT 2160
+#define OMX_CORE_4KDCI_WIDTH 4096
+#define OMX_CORE_4KDCI_HEIGHT 2160
enum PortIndexType {
PORT_INDEX_IN = 0,
diff --git a/mm-video-v4l2/vidc/venc/inc/omx_video_encoder.h b/mm-video-v4l2/vidc/venc/inc/omx_video_encoder.h
index a6b58a8b..8ccd6785 100644
--- a/mm-video-v4l2/vidc/venc/inc/omx_video_encoder.h
+++ b/mm-video-v4l2/vidc/venc/inc/omx_video_encoder.h
@@ -60,7 +60,7 @@ class omx_venc: public omx_video
OMX_U32 m_nVenc_format;
class venc_dev *handle;
int dev_handle_output_extradata(void *);
- int dev_handle_input_extradata(void *);
+ int dev_handle_input_extradata(void *, int);
void dev_set_extradata_cookie(void *);
int dev_set_format(int);
private:
diff --git a/mm-video-v4l2/vidc/venc/inc/video_encoder_device_v4l2.h b/mm-video-v4l2/vidc/venc/inc/video_encoder_device_v4l2.h
index 65384bc4..ec3a0d3a 100644
--- a/mm-video-v4l2/vidc/venc/inc/video_encoder_device_v4l2.h
+++ b/mm-video-v4l2/vidc/venc/inc/video_encoder_device_v4l2.h
@@ -282,6 +282,7 @@ public:
void setCookieForConfig(void *cookie);
ssize_t getBufferSize();
unsigned int getBufferCount();
+ bool vqzip_sei_found;
};
struct statistics {
@@ -403,7 +404,7 @@ class venc_dev
class omx_venc *venc_handle;
int append_mbi_extradata(void *, struct msm_vidc_extradata_header*);
bool handle_output_extradata(void *);
- bool handle_input_extradata(void *);
+ bool handle_input_extradata(void *, int);
int venc_set_format(int);
bool deinterlace_enabled;
bool hw_overload;
@@ -491,7 +492,7 @@ class venc_dev
bool venc_set_hybrid_hierp(QOMX_EXTNINDEX_VIDEO_HYBRID_HP_MODE* hhp);
bool venc_set_batch_size(OMX_U32 size);
bool venc_calibrate_gop();
- void venc_set_vqzip_defaults();
+ bool venc_set_vqzip_defaults();
bool venc_validate_hybridhp_params(OMX_U32 layers, OMX_U32 bFrames, OMX_U32 count, int mode);
bool venc_set_max_hierp(OMX_U32 hierp_layers);
bool venc_set_baselayerid(OMX_U32 baseid);
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 444f6ae4..dd496b31 100644
--- a/mm-video-v4l2/vidc/venc/src/omx_video_base.cpp
+++ b/mm-video-v4l2/vidc/venc/src/omx_video_base.cpp
@@ -3709,8 +3709,16 @@ OMX_ERRORTYPE omx_video::empty_this_buffer_proxy(OMX_IN OMX_HANDLETYPE hComp,
return OMX_ErrorUndefined;
}
}
- if (m_sExtraData && !dev_handle_input_extradata((void *)buffer))
+ if (m_sExtraData && !dev_handle_input_extradata((void *)buffer, fd)) {
DEBUG_PRINT_ERROR("Failed to parse input extradata\n");
+#ifdef _ANDROID_ICS_
+ omx_release_meta_buffer(buffer);
+#endif
+ post_event ((unsigned long)buffer,0,OMX_COMPONENT_GENERATE_EBD);
+ /*Generate an async error and move to invalid state*/
+ pending_input_buffers--;
+ return OMX_ErrorBadParameter;
+ }
#ifdef _MSM8974_
if (dev_empty_buf(buffer, pmem_data_buf,nBufIndex,fd) != true)
#else
diff --git a/mm-video-v4l2/vidc/venc/src/omx_video_encoder.cpp b/mm-video-v4l2/vidc/venc/src/omx_video_encoder.cpp
index 677c5804..ba6c40bb 100644
--- a/mm-video-v4l2/vidc/venc/src/omx_video_encoder.cpp
+++ b/mm-video-v4l2/vidc/venc/src/omx_video_encoder.cpp
@@ -2226,9 +2226,9 @@ int omx_venc::dev_handle_output_extradata(void *buffer)
return handle->handle_output_extradata(buffer);
}
-int omx_venc::dev_handle_input_extradata(void *buffer)
+int omx_venc::dev_handle_input_extradata(void *buffer, int fd)
{
- return handle->handle_input_extradata(buffer);
+ return handle->handle_input_extradata(buffer, fd);
}
void omx_venc::dev_set_extradata_cookie(void *cookie)
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 2de447de..9f10ed8f 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
@@ -595,7 +595,7 @@ int venc_dev::append_mbi_extradata(void *dst, struct msm_vidc_extradata_header*
return mbi->nDataSize + sizeof(*mbi);
}
-bool venc_dev::handle_input_extradata(void *buffer)
+bool venc_dev::handle_input_extradata(void *buffer, int fd)
{
OMX_BUFFERHEADERTYPE *p_bufhdr = (OMX_BUFFERHEADERTYPE *) buffer;
OMX_OTHER_EXTRADATATYPE *p_extra = NULL;
@@ -606,6 +606,21 @@ bool venc_dev::handle_input_extradata(void *buffer)
int extra_fd;
unsigned offset;
ssize_t extra_size;
+ struct v4l2_control control;
+
+ memset(&control, 0, sizeof(control));
+ control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
+ if (ioctl(m_nDriver_fd, VIDIOC_G_CTRL, &control) < 0) {
+ return false;
+ }
+
+ if (!(control.value & V4L2_MPEG_VIDC_EXTRADATA_YUV_STATS ||
+ control.value & V4L2_MPEG_VIDC_EXTRADATA_VQZIP_SEI ||
+ control.value & V4L2_MPEG_VIDC_EXTRADATA_FRAME_QP ||
+ control.value & V4L2_MPEG_VIDC_EXTRADATA_INPUT_CROP)) {
+ DEBUG_PRINT_LOW("Input extradata not enabled");
+ return true;
+ }
/*
* At this point encoder component doesn't know where the extradata is
@@ -624,7 +639,7 @@ bool venc_dev::handle_input_extradata(void *buffer)
}
unsigned char *pVirt;
int size = VENUS_BUFFER_SIZE(COLOR_FMT_NV12, width, height);
- pVirt= (unsigned char *)mmap(NULL, size, PROT_READ|PROT_WRITE,MAP_SHARED, extra_fd, 0);
+ pVirt= (unsigned char *)mmap(NULL, size, PROT_READ|PROT_WRITE,MAP_SHARED, fd, 0);
p_extra = (OMX_OTHER_EXTRADATATYPE *) ((unsigned long)(pVirt + ((width * height * 3) / 2) + 3)&(~3));
char *p_extradata = userptr;
@@ -668,10 +683,14 @@ bool venc_dev::handle_input_extradata(void *buffer)
qp_payload = (OMX_QCOM_EXTRADATA_QP *)p_extra->data;
payload = (struct msm_vidc_frame_qp_payload *)(data->data);
payload->frame_qp = qp_payload->nQP;
- DEBUG_PRINT_LOW("FRame QP = %d", payload->frame_qp);
+ DEBUG_PRINT_LOW("Frame QP = %d", payload->frame_qp);
data = (OMX_OTHER_EXTRADATATYPE *)((char *)data + data->nSize);
break;
}
+ case OMX_ExtraDataVQZipSEI:
+ DEBUG_PRINT_LOW("VQZIP SEI Found ");
+ mInputExtradata.vqzip_sei_found = true;
+ break;
default:
break;
}
@@ -679,14 +698,22 @@ bool venc_dev::handle_input_extradata(void *buffer)
p_extra = (OMX_OTHER_EXTRADATATYPE *)((char *)p_extra + p_extra->nSize);
}
- data->nSize = (sizeof(OMX_OTHER_EXTRADATATYPE) + sizeof(struct VQZipStats) + 3)&(~3);
- data->nVersion.nVersion = OMX_SPEC_VERSION;
- data->nPortIndex = 0;
- data->eType = (OMX_EXTRADATATYPE)MSM_VIDC_EXTRADATA_YUVSTATS_INFO;
- data->nDataSize = sizeof(struct VQZipStats);
- vqzip.fill_stats_data((void*)pVirt, (void*) data->data);
-
- data = (OMX_OTHER_EXTRADATATYPE *)((char *)data + data->nSize);
+ if (control.value & V4L2_MPEG_VIDC_EXTRADATA_YUV_STATS ||
+ control.value & V4L2_MPEG_VIDC_EXTRADATA_VQZIP_SEI) {
+ if (!mInputExtradata.vqzip_sei_found) {
+ DEBUG_PRINT_ERROR("VQZIP is enabled, But no VQZIP SEI found. Rejecting the session");
+ munmap(pVirt, size);
+ mInputExtradata.put(userptr);
+ return false;
+ }
+ data->nSize = (sizeof(OMX_OTHER_EXTRADATATYPE) + sizeof(struct VQZipStats) + 3)&(~3);
+ data->nVersion.nVersion = OMX_SPEC_VERSION;
+ data->nPortIndex = 0;
+ data->eType = (OMX_EXTRADATATYPE)MSM_VIDC_EXTRADATA_YUVSTATS_INFO;
+ data->nDataSize = sizeof(struct VQZipStats);
+ vqzip.fill_stats_data((void*)pVirt, (void*) data->data);
+ data = (OMX_OTHER_EXTRADATATYPE *)((char *)data + data->nSize);
+ }
data->nSize = sizeof(OMX_OTHER_EXTRADATATYPE);
data->nVersion.nVersion = OMX_SPEC_VERSION;
@@ -696,6 +723,7 @@ bool venc_dev::handle_input_extradata(void *buffer)
}
munmap(pVirt, size);
+ mInputExtradata.put(userptr);
return true;
}
@@ -2628,10 +2656,24 @@ unsigned venc_dev::venc_set_message_thread_id(pthread_t tid)
return 0;
}
-void venc_dev::venc_set_vqzip_defaults()
+bool venc_dev::venc_set_vqzip_defaults()
{
struct v4l2_control control;
- int rc = 0;
+ int rc = 0, num_mbs_per_frame;
+
+ num_mbs_per_frame = m_sVenc_cfg.input_height * m_sVenc_cfg.input_width;
+
+ switch (num_mbs_per_frame) {
+ case OMX_CORE_720P_WIDTH * OMX_CORE_720P_HEIGHT:
+ case OMX_CORE_1080P_WIDTH * OMX_CORE_1080P_HEIGHT:
+ case OMX_CORE_4KUHD_WIDTH * OMX_CORE_4KUHD_HEIGHT:
+ case OMX_CORE_4KDCI_WIDTH * OMX_CORE_4KDCI_HEIGHT:
+ break;
+ default:
+ DEBUG_PRINT_ERROR("VQZIP is not supported for this resoultion : %d X %d",
+ m_sVenc_cfg.input_width, m_sVenc_cfg.input_height);
+ return false;
+ }
control.id = V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL;
control.value = V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_OFF;
@@ -2652,6 +2694,21 @@ void venc_dev::venc_set_vqzip_defaults()
if (rc)
DEBUG_PRINT_ERROR("Failed to set B frame period for VQZIP");
+ control.id = V4L2_CID_MPEG_VIDC_VIDEO_PERF_MODE;
+ control.value = V4L2_MPEG_VIDC_VIDEO_PERF_MAX_QUALITY;
+
+ rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
+ if (rc)
+ DEBUG_PRINT_ERROR("Failed to set Max quality for VQZIP");
+
+ control.id = V4L2_CID_MPEG_VIDC_VIDEO_IDR_PERIOD;
+ control.value = 1;
+
+ rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
+ if (rc)
+ DEBUG_PRINT_ERROR("Failed to set IDR period for VQZIP");
+
+ return true;
}
@@ -2675,8 +2732,8 @@ unsigned venc_dev::venc_start(void)
__func__, codec_profile.profile, profile_level.level);
}
- if (vqzip_sei_info.enabled)
- venc_set_vqzip_defaults();
+ if (vqzip_sei_info.enabled && !venc_set_vqzip_defaults())
+ return 1;
venc_config_print();
@@ -5388,6 +5445,17 @@ bool venc_dev::venc_set_ratectrl_cfg(OMX_VIDEO_CONTROLRATETYPE eControlRate)
rate_ctrl.rcmode = control.value;
}
+ if (eControlRate == OMX_Video_ControlRateVariable && (supported_rc_modes & RC_VBR_CFR)) {
+ /* Enable VQZIP SEI by default for camcorder RC modes */
+
+ control.id = V4L2_CID_MPEG_VIDC_VIDEO_VQZIP_SEI;
+ control.value = V4L2_CID_MPEG_VIDC_VIDEO_VQZIP_SEI_ENABLE;
+ DEBUG_PRINT_HIGH("Set VQZIP SEI:");
+ if (ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control) < 0) {
+ DEBUG_PRINT_HIGH("Non-Fatal: Request to set VQZIP failed");
+ }
+ }
+
return status;
}
@@ -6487,6 +6555,7 @@ encExtradata::encExtradata(class omx_venc *venc_handle)
mDbgEtbCount = 0;
memset(mIndex, 0, sizeof(mIndex));
pthread_mutex_init(&lock, NULL);
+ vqzip_sei_found = false;
}
encExtradata::~encExtradata()
@@ -6495,6 +6564,7 @@ encExtradata::~encExtradata()
mCount = 0;
mSize = 0;
mVencHandle = NULL;
+ pthread_mutex_destroy(&lock);
}
OMX_ERRORTYPE encExtradata::__allocate()
@@ -6544,7 +6614,7 @@ int encExtradata::__get(char **userptr, int *fd, unsigned *offset, ssize_t *size
}
}
if (i >= mCount) {
- DEBUG_PRINT_ERROR("No Free extradata available");
+ DEBUG_PRINT_HIGH("No Free extradata available");
return -1;
}
*userptr = mUaddr + i * mSize;
@@ -6715,10 +6785,10 @@ void encExtradata::update(unsigned int count, ssize_t size)
void encExtradata::__debug()
{
- DEBUG_PRINT_ERROR("encExtradata: this: %p, mCount: %d, mSize: %d, mUaddr: %p, mVencHandle: %p",
+ DEBUG_PRINT_HIGH("encExtradata: this: %p, mCount: %d, mSize: %d, mUaddr: %p, mVencHandle: %p",
this, mCount, mSize, mUaddr, mVencHandle);
for (unsigned i = 0; i < mCount; i++) {
- DEBUG_PRINT_ERROR("index: %d, status: %d, cookie: %#x\n", i, mIndex[i].status, mIndex[i].cookie);
+ DEBUG_PRINT_HIGH("index: %d, status: %d, cookie: %#x\n", i, mIndex[i].status, mIndex[i].cookie);
}
}