diff options
-rw-r--r-- | libc2dcolorconvert/C2DColorConverter.cpp | 9 | ||||
-rw-r--r-- | mm-video-v4l2/vidc/vdec/inc/omx_vdec.h | 5 | ||||
-rw-r--r-- | mm-video-v4l2/vidc/vdec/src/omx_vdec_v4l2.cpp | 60 |
3 files changed, 46 insertions, 28 deletions
diff --git a/libc2dcolorconvert/C2DColorConverter.cpp b/libc2dcolorconvert/C2DColorConverter.cpp index 3e3dfaf0..33579318 100644 --- a/libc2dcolorconvert/C2DColorConverter.cpp +++ b/libc2dcolorconvert/C2DColorConverter.cpp @@ -433,10 +433,10 @@ size_t C2DColorConverter::calcStride(ColorConvertFormat format, size_t width) case RGB565: return ALIGN(width, ALIGN32) * 2; // RGB565 has width as twice case RGBA8888: - if (mSrcStride) - return mSrcStride * 4; - else - return ALIGN(width, ALIGN32) * 4; + if (mSrcStride) + return mSrcStride * 4; + else + return ALIGN(width, ALIGN32) * 4; case YCbCr420Tile: return ALIGN(width, ALIGN128); case YCbCr420SP: @@ -544,6 +544,7 @@ size_t C2DColorConverter::calcSize(ColorConvertFormat format, size_t width, size break; case NV12_UBWC: size = VENUS_BUFFER_SIZE(COLOR_FMT_NV12_UBWC, width, height); + break; default: break; } diff --git a/mm-video-v4l2/vidc/vdec/inc/omx_vdec.h b/mm-video-v4l2/vidc/vdec/inc/omx_vdec.h index a381bfe8..8d9a6860 100644 --- a/mm-video-v4l2/vidc/vdec/inc/omx_vdec.h +++ b/mm-video-v4l2/vidc/vdec/inc/omx_vdec.h @@ -52,6 +52,7 @@ IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include <color_metadata.h> #include "VideoAPI.h" #include "HardwareAPI.h" +#include <unordered_map> static ptrdiff_t x; @@ -490,6 +491,8 @@ struct extradata_info { OMX_U32 output_height; }; +typedef std::unordered_map <int, int> ColorSubMapping; + // OMX video decoder class class omx_vdec: public qc_omx_component { @@ -1213,6 +1216,7 @@ class omx_vdec: public qc_omx_component void init_members(); bool color_convert_mode; ColorConvertFormat dest_format; + ColorConvertFormat src_format; class omx_c2d_conv c2d; unsigned int allocated_count; unsigned int buffer_size_req; @@ -1223,6 +1227,7 @@ class omx_vdec: public qc_omx_component OMX_QCOM_PLATFORM_PRIVATE_ENTRY m_platform_entry_client[MAX_COUNT]; OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO m_pmem_info_client[MAX_COUNT]; OMX_BUFFERHEADERTYPE m_out_mem_ptr_client[MAX_COUNT]; + ColorSubMapping mMapOutput2Convert; #ifdef USE_ION struct vdec_ion op_buf_ion_info[MAX_COUNT]; #endif 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 b541a148..513125b7 100644 --- a/mm-video-v4l2/vidc/vdec/src/omx_vdec_v4l2.cpp +++ b/mm-video-v4l2/vidc/vdec/src/omx_vdec_v4l2.cpp @@ -4160,23 +4160,17 @@ OMX_ERRORTYPE omx_vdec::set_parameter(OMX_IN OMX_HANDLETYPE hComp, } enum vdec_output_fromat op_format; if (portFmt->eColorFormat == (OMX_COLOR_FORMATTYPE) - QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m || - portFmt->eColorFormat == (OMX_COLOR_FORMATTYPE) - QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mMultiView || - portFmt->eColorFormat == OMX_COLOR_FormatYUV420Planar || - portFmt->eColorFormat == OMX_COLOR_FormatYUV420SemiPlanar) { + QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m || + portFmt->eColorFormat == OMX_COLOR_FormatYUV420SemiPlanar) { op_format = (enum vdec_output_fromat)VDEC_YUV_FORMAT_NV12; + fmt.fmt.pix_mp.pixelformat = capture_capability = V4L2_PIX_FMT_NV12; } else if (portFmt->eColorFormat == (OMX_COLOR_FORMATTYPE) - QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mCompressed) { + QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mCompressed || + portFmt->eColorFormat == OMX_COLOR_FormatYUV420Planar) { op_format = (enum vdec_output_fromat)VDEC_YUV_FORMAT_NV12_UBWC; - } else - eRet = OMX_ErrorBadParameter; - - if (portFmt->eColorFormat == (OMX_COLOR_FORMATTYPE) - QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mCompressed) { fmt.fmt.pix_mp.pixelformat = capture_capability = V4L2_PIX_FMT_NV12_UBWC; } else { - fmt.fmt.pix_mp.pixelformat = capture_capability = V4L2_PIX_FMT_NV12; + eRet = OMX_ErrorBadParameter; } if (eRet == OMX_ErrorNone) { @@ -10790,6 +10784,12 @@ omx_vdec::allocate_color_convert_buf::allocate_color_convert_buf() dest_format = YCbCr420P; m_c2d_width = 0; m_c2d_height = 0; + + mMapOutput2Convert.insert( { + {VDEC_YUV_FORMAT_NV12, NV12_128m}, + {VDEC_YUV_FORMAT_NV12_UBWC, NV12_UBWC}, + //TODO: TP10 {VDEC_YUV_FORMAT_NV12_TP10_UBWC, NV12_TP10}, + }); } void omx_vdec::allocate_color_convert_buf::set_vdec_client(void *client) @@ -10837,6 +10837,17 @@ bool omx_vdec::allocate_color_convert_buf::update_buffer_req() } pthread_mutex_lock(&omx->c_lock); + ColorSubMapping::const_iterator + found = mMapOutput2Convert.find(omx->drv_ctx.output_format); + if (found == mMapOutput2Convert.end()) { + DEBUG_PRINT_HIGH("%s: Could not find the color conversion " + "mapping for %#X. Setting to default NV12", + __func__, omx->drv_ctx.output_format); + src_format = NV12_128m; + } else { + src_format = (ColorConvertFormat) found->second;; + } + memset(&fmt, 0x0, sizeof(struct v4l2_format)); fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; fmt.fmt.pix_mp.pixelformat = omx->capture_capability; @@ -10846,6 +10857,7 @@ bool omx_vdec::allocate_color_convert_buf::update_buffer_req() bool resolution_upgrade = (height > m_c2d_height || width > m_c2d_width); + bool is_interlaced = omx->drv_ctx.interlace != VDEC_InterlaceFrameProgressive; if (resolution_upgrade) { // resolution upgraded ? ensure we are yet to allocate; // failing which, c2d buffers will never be reallocated and bad things will happen @@ -10864,9 +10876,11 @@ bool omx_vdec::allocate_color_convert_buf::update_buffer_req() goto fail_update_buf_req; } c2d.close(); - status = c2d.open(height, - width, - NV12_128m,dest_format); + + DEBUG_PRINT_INFO("%s: Open C2D interface for %#X -> %#X, interlaced (%d)", + __func__, src_format, dest_format, is_interlaced); + status = c2d.open(height, width, src_format, dest_format); + if (status) { status = c2d.get_buffer_size(C2D_INPUT,src_size); if (status) @@ -10927,8 +10941,6 @@ bool omx_vdec::allocate_color_convert_buf::set_color_format( (drv_color_format != (OMX_COLOR_FORMATTYPE) QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mMultiView) && (drv_color_format != (OMX_COLOR_FORMATTYPE) - QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mCompressed) && - (drv_color_format != (OMX_COLOR_FORMATTYPE) QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m10bitCompressed); dest_color_format_c2d_enable = (dest_color_format != (OMX_COLOR_FORMATTYPE) @@ -10938,14 +10950,10 @@ bool omx_vdec::allocate_color_convert_buf::set_color_format( if (status && drv_colorformat_c2d_enable && dest_color_format_c2d_enable) { DEBUG_PRINT_LOW("Enabling C2D"); - if ((dest_color_format != OMX_COLOR_FormatYUV420Planar) && - (dest_color_format != OMX_COLOR_FormatYUV420SemiPlanar)) { - DEBUG_PRINT_ERROR("Unsupported color format for c2d"); - status = false; - } else { + if (dest_color_format == OMX_COLOR_FormatYUV420Planar || + dest_color_format == OMX_COLOR_FormatYUV420SemiPlanar ) { ColorFormat = dest_color_format; - dest_format = (dest_color_format == OMX_COLOR_FormatYUV420Planar) ? - YCbCr420P : YCbCr420SP; + dest_format = dest_color_format == OMX_COLOR_FormatYUV420Planar? YCbCr420P: YCbCr420SP; if (enabled) c2d.destroy(); enabled = false; @@ -10954,6 +10962,10 @@ bool omx_vdec::allocate_color_convert_buf::set_color_format( status = false; } else enabled = true; + } else { + DEBUG_PRINT_ERROR("Unsupported output color format for c2d (%d)", + dest_color_format); + status = false; } } else { if (enabled) |