diff options
author | Luca Stefani <luca.stefani.ge1@gmail.com> | 2020-03-07 13:24:08 +0100 |
---|---|---|
committer | Luca Stefani <luca.stefani.ge1@gmail.com> | 2020-03-07 13:24:23 +0100 |
commit | e484f0ede93c09a9de49b991cc06aec03c496ee6 (patch) | |
tree | fc9818f16c9002157b8b6920c28375adee0fe353 | |
parent | 261987cd6d779fa7ca814ee5d3df2241206063c1 (diff) | |
parent | d8b6bd826c60ce8880b3b04f7e14b15e705b8ca5 (diff) | |
download | android_hardware_qcom_media-e484f0ede93c09a9de49b991cc06aec03c496ee6.tar.gz android_hardware_qcom_media-e484f0ede93c09a9de49b991cc06aec03c496ee6.tar.bz2 android_hardware_qcom_media-e484f0ede93c09a9de49b991cc06aec03c496ee6.zip |
Merge tag 'android-10.0.0_r31' into lineage-17.1-android-10.0.0_r31
Android 10.0.0 release 31
* tag 'android-10.0.0_r31':
mm-video-v4l2: venc: revert add support for handling EOS buffer
mm-video-v4l2: venc: Check private handle->flags changed in empty_this_buffer_opaque
mm-video-v4l2: venc: Set 601-Limited colorspace for color-converted buffers
Change-Id: I70b5378f9c46d53355c065f499da98b7b5a4d899
7 files changed, 46 insertions, 21 deletions
diff --git a/msm8996/libc2dcolorconvert/Android.mk b/msm8996/libc2dcolorconvert/Android.mk index ec302802..f549450d 100644 --- a/msm8996/libc2dcolorconvert/Android.mk +++ b/msm8996/libc2dcolorconvert/Android.mk @@ -15,7 +15,7 @@ LOCAL_C_INCLUDES += $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr/include endif LOCAL_SHARED_LIBRARIES := liblog libdl -LOCAL_HEADER_LIBRARIES := copybit_headers +LOCAL_HEADER_LIBRARIES := copybit_headers gralloc_headers LOCAL_MODULE_TAGS := optional diff --git a/msm8996/libc2dcolorconvert/C2DColorConverter.cpp b/msm8996/libc2dcolorconvert/C2DColorConverter.cpp index a9761719..5cafc10c 100644 --- a/msm8996/libc2dcolorconvert/C2DColorConverter.cpp +++ b/msm8996/libc2dcolorconvert/C2DColorConverter.cpp @@ -38,6 +38,7 @@ #include <errno.h> #include <unistd.h> #include <media/msm_media_info.h> +#include <gralloc_priv.h> #undef LOG_TAG #define LOG_TAG "C2DColorConvert" @@ -337,6 +338,8 @@ void* C2DColorConverter::getDummySurfaceDef(ColorConvertFormat format, size_t wi } else { C2D_RGB_SURFACE_DEF * surfaceDef = new C2D_RGB_SURFACE_DEF; surfaceDef->format = getC2DFormat(format); + if (mFlags & private_handle_t::PRIV_FLAGS_UBWC_ALIGNED) + surfaceDef->format |= C2D_FORMAT_UBWC_COMPRESSED; surfaceDef->width = width; surfaceDef->height = height; surfaceDef->buffer = (void *)0xaaaaaaaa; diff --git a/msm8996/mm-video-v4l2/vidc/venc/inc/omx_video_base.h b/msm8996/mm-video-v4l2/vidc/venc/inc/omx_video_base.h index 61aee806..faa14e8f 100644 --- a/msm8996/mm-video-v4l2/vidc/venc/inc/omx_video_base.h +++ b/msm8996/mm-video-v4l2/vidc/venc/inc/omx_video_base.h @@ -176,13 +176,14 @@ class omx_video: public qc_omx_component ~omx_c2d_conv(); bool init(); bool open(unsigned int height,unsigned int width, - ColorConvertFormat src, - ColorConvertFormat dest,unsigned int src_stride); + ColorConvertFormat src, ColorConvertFormat dest, + unsigned int src_stride, unsigned int flags); bool convert(int src_fd, void *src_base, void *src_viraddr, int dest_fd, void *dest_base, void *dest_viraddr); bool get_buffer_size(int port,unsigned int &buf_size); int get_src_format(); void close(); + bool isUBWCChanged(unsigned int flags); private: C2DColorConverterBase *c2dcc; pthread_mutex_t c_lock; @@ -190,6 +191,7 @@ class omx_video: public qc_omx_component ColorConvertFormat src_format; createC2DColorConverter_t *mConvertOpen; destroyC2DColorConverter_t *mConvertClose; + unsigned int mFlags = 0; }; omx_c2d_conv c2d_conv; #endif @@ -564,7 +566,7 @@ class omx_video: public qc_omx_component } void complete_pending_buffer_done_cbs(); - bool is_conv_needed(int, int); + bool is_conv_needed(int); void print_debug_color_aspects(ColorAspects *aspects, const char *prefix); OMX_ERRORTYPE get_vendor_extension_config( @@ -692,7 +694,6 @@ class omx_video: public qc_omx_component OMX_U8 m_cRole[OMX_MAX_STRINGNAME_SIZE]; extra_data_handler extra_data_handle; bool hw_overload; - OMX_U32 m_graphicBufferSize; }; #endif // __OMX_VIDEO_BASE_H__ diff --git a/msm8996/mm-video-v4l2/vidc/venc/src/omx_video_base.cpp b/msm8996/mm-video-v4l2/vidc/venc/src/omx_video_base.cpp index 62fd5d82..b9a90c45 100644 --- a/msm8996/mm-video-v4l2/vidc/venc/src/omx_video_base.cpp +++ b/msm8996/mm-video-v4l2/vidc/venc/src/omx_video_base.cpp @@ -302,8 +302,7 @@ omx_video::omx_video(): m_etb_count(0), m_fbd_count(0), m_event_port_settings_sent(false), - hw_overload(false), - m_graphicBufferSize(0) + hw_overload(false) { DEBUG_PRINT_HIGH("omx_video(): Inside Constructor()"); memset(&m_cmp,0,sizeof(m_cmp)); @@ -4908,16 +4907,18 @@ bool omx_video::omx_c2d_conv::convert(int src_fd, void *src_base, void *src_vira } bool omx_video::omx_c2d_conv::open(unsigned int height,unsigned int width, - ColorConvertFormat src, ColorConvertFormat dest,unsigned int src_stride) + ColorConvertFormat src, ColorConvertFormat dest,unsigned int src_stride, + unsigned int flags) { bool status = false; pthread_mutex_lock(&c_lock); if (!c2dcc) { c2dcc = mConvertOpen(width, height, width, height, - src,dest,0,src_stride); + src, dest, flags, src_stride); if (c2dcc) { src_format = src; status = true; + mFlags = flags; } else DEBUG_PRINT_ERROR("mConvertOpen failed"); } @@ -4980,11 +4981,16 @@ bool omx_video::omx_c2d_conv::get_buffer_size(int port,unsigned int &buf_size) } return ret; } +bool omx_video::omx_c2d_conv::isUBWCChanged(unsigned int flags) +{ + return (mFlags & private_handle_t::PRIV_FLAGS_UBWC_ALIGNED) != + (flags & private_handle_t::PRIV_FLAGS_UBWC_ALIGNED); +} -bool omx_video::is_conv_needed(int hal_fmt, int hal_flags) +bool omx_video::is_conv_needed(int hal_fmt) { - bool bRet = hal_fmt == HAL_PIXEL_FORMAT_RGBA_8888 && - !(hal_flags & private_handle_t::PRIV_FLAGS_UBWC_ALIGNED); + bool bRet = hal_fmt == HAL_PIXEL_FORMAT_RGBA_8888; + #ifdef _HW_RGBA bRet = false; #endif @@ -5036,20 +5042,21 @@ OMX_ERRORTYPE omx_video::empty_this_buffer_opaque(OMX_IN OMX_HANDLETYPE hComp, updated correctly*/ if (buffer->nFilledLen > 0 && handle) { - if (c2d_opened && handle->format != c2d_conv.get_src_format()) { + if (c2d_opened && (handle->format != c2d_conv.get_src_format() || + c2d_conv.isUBWCChanged(handle->flags))) { c2d_conv.close(); c2d_opened = false; } if (!c2d_opened) { - mUsesColorConversion = is_conv_needed(handle->format, handle->flags); + mUsesColorConversion = is_conv_needed(handle->format); if (mUsesColorConversion) { DEBUG_PRINT_INFO("open Color conv forW: %u, H: %u", (unsigned int)m_sInPortDef.format.video.nFrameWidth, (unsigned int)m_sInPortDef.format.video.nFrameHeight); if (!c2d_conv.open(m_sInPortDef.format.video.nFrameHeight, m_sInPortDef.format.video.nFrameWidth, - RGBA8888, NV12_128m, handle->width)) { + RGBA8888, NV12_128m, handle->width, handle->flags)) { m_pCallbacks.EmptyBufferDone(hComp,m_app_data,buffer); DEBUG_PRINT_ERROR("Color conv open failed"); return OMX_ErrorBadParameter; @@ -5254,8 +5261,7 @@ OMX_ERRORTYPE omx_video::push_input_buffer(OMX_HANDLETYPE hComp) Input_pmem_info.fd = handle->fd; Input_pmem_info.offset = 0; Input_pmem_info.size = handle->size; - m_graphicBufferSize = handle->size; - if (is_conv_needed(handle->format, handle->flags)) + if (is_conv_needed(handle->format)) ret = convert_queue_buffer(hComp,Input_pmem_info,index); else if (handle->format == HAL_PIXEL_FORMAT_NV12_ENCODEABLE || handle->format == QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m || @@ -5323,10 +5329,9 @@ OMX_ERRORTYPE omx_video::push_empty_eos_buffer(OMX_HANDLETYPE hComp, emptyEosBufHdr.nTimeStamp = buffer->nTimeStamp; emptyEosBufHdr.nFlags = buffer->nFlags; emptyEosBufHdr.pBuffer = NULL; - if (!mUsesColorConversion && !mUseProxyColorFormat) + if (!mUsesColorConversion) emptyEosBufHdr.nAllocLen = m_sInPortDef.nBufferSize; - else if (mUseProxyColorFormat) - emptyEosBufHdr.nAllocLen = m_graphicBufferSize > 0 ? m_graphicBufferSize : m_sInPortDef.nBufferSize; + if (dev_empty_buf(&emptyEosBufHdr, 0, index, m_pInput_pmem[index].fd) != true) { DEBUG_PRINT_ERROR("ERROR: in dev_empty_buf for empty eos buffer"); dev_free_buf(&Input_pmem_info, PORT_INDEX_IN); diff --git a/msm8996/mm-video-v4l2/vidc/venc/src/video_encoder_device_v4l2.cpp b/msm8996/mm-video-v4l2/vidc/venc/src/video_encoder_device_v4l2.cpp index 4250d8e2..ebce90a6 100644 --- a/msm8996/mm-video-v4l2/vidc/venc/src/video_encoder_device_v4l2.cpp +++ b/msm8996/mm-video-v4l2/vidc/venc/src/video_encoder_device_v4l2.cpp @@ -3651,6 +3651,13 @@ bool venc_dev::venc_empty_buf(void *buffer, void *pmem_data_buf, unsigned index, ": filled %d of %d format 0x%lx", fd, plane[0].bytesused, plane[0].length, m_sVenc_cfg.inputformat); } } else { + // color_format == 1 ==> RGBA to YUV Color-converted buffer + // Buffers color-converted via C2D have 601-Limited color + if (!streaming[OUTPUT_PORT]) { + DEBUG_PRINT_HIGH("Setting colorspace 601-L for Color-converted buffer"); + venc_set_colorspace(MSM_VIDC_BT601_6_625, 0 /*range-limited*/, + MSM_VIDC_TRANSFER_601_6_525, MSM_VIDC_MATRIX_601_6_525); + } plane[0].m.userptr = (unsigned long) bufhdr->pBuffer; plane[0].data_offset = bufhdr->nOffset; plane[0].length = bufhdr->nAllocLen; diff --git a/msm8998/mm-video-v4l2/vidc/venc/inc/omx_video_base.h b/msm8998/mm-video-v4l2/vidc/venc/inc/omx_video_base.h index 7ea8fd79..c15a1b1c 100644 --- a/msm8998/mm-video-v4l2/vidc/venc/inc/omx_video_base.h +++ b/msm8998/mm-video-v4l2/vidc/venc/inc/omx_video_base.h @@ -195,6 +195,7 @@ class omx_video: public qc_omx_component bool get_buffer_size(int port,unsigned int &buf_size); int get_src_format(); void close(); + bool isUBWCChanged(unsigned int flags); private: C2DColorConverterBase *c2dcc; pthread_mutex_t c_lock; @@ -202,6 +203,7 @@ class omx_video: public qc_omx_component ColorConvertFormat src_format; createC2DColorConverter_t *mConvertOpen; destroyC2DColorConverter_t *mConvertClose; + unsigned int mFlags = 0; }; omx_c2d_conv c2d_conv; #endif diff --git a/msm8998/mm-video-v4l2/vidc/venc/src/omx_video_base.cpp b/msm8998/mm-video-v4l2/vidc/venc/src/omx_video_base.cpp index d1c8d971..8756c097 100644 --- a/msm8998/mm-video-v4l2/vidc/venc/src/omx_video_base.cpp +++ b/msm8998/mm-video-v4l2/vidc/venc/src/omx_video_base.cpp @@ -5069,6 +5069,7 @@ bool omx_video::omx_c2d_conv::open(unsigned int height,unsigned int width, if (c2dcc) { src_format = src; status = true; + mFlags = flags; } else DEBUG_PRINT_ERROR("mConvertOpen failed"); } @@ -5131,6 +5132,11 @@ bool omx_video::omx_c2d_conv::get_buffer_size(int port,unsigned int &buf_size) } return ret; } +bool omx_video::omx_c2d_conv::isUBWCChanged(unsigned int flags) +{ + return (mFlags & private_handle_t::PRIV_FLAGS_UBWC_ALIGNED) != + (flags & private_handle_t::PRIV_FLAGS_UBWC_ALIGNED); +} bool omx_video::is_conv_needed(int hal_fmt, int hal_flags) { @@ -5212,7 +5218,8 @@ OMX_ERRORTYPE omx_video::empty_this_buffer_opaque(OMX_IN OMX_HANDLETYPE hComp, updated correctly*/ if (buffer->nFilledLen > 0 && handle) { - if (c2d_opened && handle->format != c2d_conv.get_src_format()) { + if (c2d_opened && (handle->format != c2d_conv.get_src_format() || + c2d_conv.isUBWCChanged(handle->flags))) { c2d_conv.close(); c2d_opened = false; } |