diff options
author | Linux Build Service Account <lnxbuild@localhost> | 2015-12-02 01:11:27 -0800 |
---|---|---|
committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2015-12-02 01:11:27 -0800 |
commit | 10333844fe5623c047d51b55c8604f1765621685 (patch) | |
tree | 823f028a041fbdfdcd34b9da8811800002493da6 | |
parent | 97836e46273bbd6e019d572414c110449dd11d16 (diff) | |
parent | 622d48024cbf6a3a0749052d3903e3a5f63c5873 (diff) | |
download | android_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.cpp | 7 | ||||
-rw-r--r-- | mm-video-v4l2/vidc/venc/inc/omx_video_base.h | 2 | ||||
-rw-r--r-- | mm-video-v4l2/vidc/venc/inc/omx_video_common.h | 4 | ||||
-rw-r--r-- | mm-video-v4l2/vidc/venc/inc/omx_video_encoder.h | 2 | ||||
-rw-r--r-- | mm-video-v4l2/vidc/venc/inc/video_encoder_device_v4l2.h | 5 | ||||
-rw-r--r-- | mm-video-v4l2/vidc/venc/src/omx_video_base.cpp | 10 | ||||
-rw-r--r-- | mm-video-v4l2/vidc/venc/src/omx_video_encoder.cpp | 4 | ||||
-rw-r--r-- | mm-video-v4l2/vidc/venc/src/video_encoder_device_v4l2.cpp | 106 |
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); } } |