diff options
author | srikarri <sridur@codeaurora.org> | 2014-03-14 12:59:40 +0530 |
---|---|---|
committer | srikarri <sridur@codeaurora.org> | 2014-04-01 19:43:44 +0530 |
commit | 812f79292c47779734738f8b740d5132870b746e (patch) | |
tree | 520a7dacafc7a2a9de9ca38fadf1175eb487b520 | |
parent | 3c680572643ca2a0e661de1362b742438e7596c5 (diff) | |
download | android_hardware_qcom_media-812f79292c47779734738f8b740d5132870b746e.tar.gz android_hardware_qcom_media-812f79292c47779734738f8b740d5132870b746e.tar.bz2 android_hardware_qcom_media-812f79292c47779734738f8b740d5132870b746e.zip |
mm-video: venc: use source stride for color-converting RGB input
-RGB input may be composed by GPU with an aligned stride
different from the frame-width.
-CTS test cases testEncodeDecodeVideoFromSurfaceToSurface720p
and testVideoEdit720p fails because gralloc-handle
stride value is not used
-Extract this stride from gralloc-handle to interpret the buffer
Change-Id: I63fd224e933424e1e8c49a19270545f000a2ebd5
-rw-r--r-- | libc2dcolorconvert/C2DColorConverter.cpp | 45 | ||||
-rw-r--r-- | libc2dcolorconvert/C2DColorConverter.h | 2 | ||||
-rw-r--r-- | mm-video/vidc/common/inc/vidc_color_converter.h | 2 | ||||
-rw-r--r-- | mm-video/vidc/common/src/vidc_color_converter.cpp | 4 | ||||
-rw-r--r-- | mm-video/vidc/vdec/src/omx_vdec.cpp | 3 | ||||
-rw-r--r-- | mm-video/vidc/venc/Android.mk | 3 | ||||
-rw-r--r-- | mm-video/vidc/venc/inc/omx_video_base.h | 2 | ||||
-rw-r--r-- | mm-video/vidc/venc/src/omx_video_base.cpp | 28 |
8 files changed, 33 insertions, 56 deletions
diff --git a/libc2dcolorconvert/C2DColorConverter.cpp b/libc2dcolorconvert/C2DColorConverter.cpp index 11715853..4e65235d 100644 --- a/libc2dcolorconvert/C2DColorConverter.cpp +++ b/libc2dcolorconvert/C2DColorConverter.cpp @@ -58,7 +58,7 @@ namespace android { class C2DColorConverter : public C2DColorConverterBase { public: - C2DColorConverter(size_t srcWidth, size_t srcHeight, size_t dstWidth, size_t dstHeight, ColorConvertFormat srcFormat, ColorConvertFormat dstFormat, int32_t flags); + C2DColorConverter(size_t srcWidth, size_t srcHeight, size_t dstWidth, size_t dstHeight, ColorConvertFormat srcFormat, ColorConvertFormat dstFormat, int32_t flags, size_t stride); int32_t getBuffReq(int32_t port, C2DBuffReq *req); int32_t dumpOutput(char * filename, char mode); protected: @@ -78,7 +78,6 @@ private: virtual bool unmapGPUAddr(uint32_t gAddr); virtual size_t calcLumaAlign(ColorConvertFormat format); virtual size_t calcSizeAlign(ColorConvertFormat format); - virtual bool isTarget8930(void); void *mC2DLibHandle; LINK_c2dCreateSurface mC2DCreateSurface; @@ -105,6 +104,7 @@ private: size_t mDstSize; size_t mSrcYSize; size_t mDstYSize; + size_t mStride; enum ColorConvertFormat mSrcFormat; enum ColorConvertFormat mDstFormat; int32_t mFlags; @@ -112,7 +112,7 @@ private: int mError; }; -C2DColorConverter::C2DColorConverter(size_t srcWidth, size_t srcHeight, size_t dstWidth, size_t dstHeight, ColorConvertFormat srcFormat, ColorConvertFormat dstFormat, int32_t flags) +C2DColorConverter::C2DColorConverter(size_t srcWidth, size_t srcHeight, size_t dstWidth, size_t dstHeight, ColorConvertFormat srcFormat, ColorConvertFormat dstFormat, int32_t flags, size_t stride) { mError = 0; mC2DLibHandle = dlopen("libC2D2.so", RTLD_NOW); @@ -150,7 +150,7 @@ C2DColorConverter::C2DColorConverter(size_t srcWidth, size_t srcHeight, size_t d mDstSize = calcSize(dstFormat, dstWidth, dstHeight); mSrcYSize = calcYSize(srcFormat, srcWidth, srcHeight); mDstYSize = calcYSize(dstFormat, dstWidth, dstHeight); - + mStride = stride; mFlags = flags; // can be used for rotation mSrcSurfaceDef = getDummySurfaceDef(srcFormat, srcWidth, srcHeight, true); @@ -394,11 +394,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 (isTarget8930() && mSrcWidth == WIDTH_720P && mSrcHeight == HEIGHT_720P) { - return ALIGN((width + PADDING_720P), ALIGN32) * 4; - } else { - return ALIGN(width, ALIGN32) * 4; - } + if (mStride) + width = mStride; + return ALIGN(width, ALIGN32) * 4; + case YCbCr420Tile: return ALIGN(width, ALIGN128); case YCbCr420SP: @@ -661,34 +660,10 @@ int32_t C2DColorConverter::dumpOutput(char * filename, char mode) { close(fd); return ret < 0 ? ret : 0; } -bool C2DColorConverter::isTarget8930(void) { - int fd; - if ((fd = open("/sys/devices/system/soc/soc0/id", O_RDONLY)) != -1) { - char raw_buf[5]; - int soc; - if (read(fd, raw_buf,4) == -1) { - close(fd); - return false; - } else { - raw_buf[4] = 0; - soc = atoi(raw_buf); - close(fd); - if (/* MSM_CPU_8930 */ - soc == 116 || soc == 117 || soc == 118 || soc == 119 || soc == 179 || - /* MSM_CPU_8930AA */ - soc == 142 || soc == 143 || soc == 144 || soc == 160 || soc == 180 || - /* MSM_CPU_8930AB */ - soc == 154 || soc == 155 || soc == 156 || soc == 157 || soc == 181) { - return true; - } - } - } - return false; -} -extern "C" C2DColorConverterBase* createC2DColorConverter(size_t srcWidth, size_t srcHeight, size_t dstWidth, size_t dstHeight, ColorConvertFormat srcFormat, ColorConvertFormat dstFormat, int32_t flags) +extern "C" C2DColorConverterBase* createC2DColorConverter(size_t srcWidth, size_t srcHeight, size_t dstWidth, size_t dstHeight, ColorConvertFormat srcFormat, ColorConvertFormat dstFormat, int32_t flags, size_t stride) { - return new C2DColorConverter(srcWidth, srcHeight, dstWidth, dstHeight, srcFormat, dstFormat, flags); + return new C2DColorConverter(srcWidth, srcHeight, dstWidth, dstHeight, srcFormat, dstFormat, flags, stride); } extern "C" void destroyC2DColorConverter(C2DColorConverterBase* C2DCC) diff --git a/libc2dcolorconvert/C2DColorConverter.h b/libc2dcolorconvert/C2DColorConverter.h index 8c29b4c1..9e851104 100644 --- a/libc2dcolorconvert/C2DColorConverter.h +++ b/libc2dcolorconvert/C2DColorConverter.h @@ -105,7 +105,7 @@ public: virtual int32_t dumpOutput(char * filename, char mode) = 0; }; -typedef C2DColorConverterBase* createC2DColorConverter_t(size_t srcWidth, size_t srcHeight, size_t dstWidth, size_t dstHeight, ColorConvertFormat srcFormat, ColorConvertFormat dstFormat, int32_t flags); +typedef C2DColorConverterBase* createC2DColorConverter_t(size_t srcWidth, size_t srcHeight, size_t dstWidth, size_t dstHeight, ColorConvertFormat srcFormat, ColorConvertFormat dstFormat, int32_t flags, size_t stride); typedef void destroyC2DColorConverter_t(C2DColorConverterBase*); } diff --git a/mm-video/vidc/common/inc/vidc_color_converter.h b/mm-video/vidc/common/inc/vidc_color_converter.h index d0638ac8..03cf78ac 100644 --- a/mm-video/vidc/common/inc/vidc_color_converter.h +++ b/mm-video/vidc/common/inc/vidc_color_converter.h @@ -37,7 +37,7 @@ public: void destroy();
bool open(unsigned int height,unsigned int width,
ColorConvertFormat src,
- ColorConvertFormat dest);
+ ColorConvertFormat dest, unsigned int stride); bool convert(int src_fd, void *src_viraddr,
int dest_fd,void *dest_viraddr);
bool get_buffer_size(int port,unsigned int &buf_size);
diff --git a/mm-video/vidc/common/src/vidc_color_converter.cpp b/mm-video/vidc/common/src/vidc_color_converter.cpp index 2bb9654b..ec1887fd 100644 --- a/mm-video/vidc/common/src/vidc_color_converter.cpp +++ b/mm-video/vidc/common/src/vidc_color_converter.cpp @@ -87,12 +87,12 @@ bool omx_c2d_conv::convert(int src_fd, void *src_viraddr, }
bool omx_c2d_conv::open(unsigned int height,unsigned int width,
- ColorConvertFormat src, ColorConvertFormat dest)
+ ColorConvertFormat src, ColorConvertFormat dest, unsigned int stride) {
bool status = false;
if(!c2dcc) {
c2dcc = mConvertOpen(width, height, width, height,
- src,dest,0);
+ src,dest,0, stride); if(c2dcc) {
src_format = src;
status = true;
diff --git a/mm-video/vidc/vdec/src/omx_vdec.cpp b/mm-video/vidc/vdec/src/omx_vdec.cpp index 68af4f39..5bb28a8c 100644 --- a/mm-video/vidc/vdec/src/omx_vdec.cpp +++ b/mm-video/vidc/vdec/src/omx_vdec.cpp @@ -10154,9 +10154,10 @@ bool omx_vdec::allocate_color_convert_buf::update_buffer_req() return false; } c2d.close(); + status = c2d.open(omx->drv_ctx.video_resolution.frame_height, omx->drv_ctx.video_resolution.frame_width, - YCbCr420Tile,YCbCr420P); + YCbCr420Tile,YCbCr420P, 0); if (status) { status = c2d.get_buffer_size(C2D_INPUT,src_size); if (status) diff --git a/mm-video/vidc/venc/Android.mk b/mm-video/vidc/venc/Android.mk index b0aa3c72..0ee3ec99 100644 --- a/mm-video/vidc/venc/Android.mk +++ b/mm-video/vidc/venc/Android.mk @@ -49,6 +49,7 @@ libmm-venc-inc += $(OMX_VIDEO_PATH)/vidc/common/inc libmm-venc-inc += hardware/qcom/media/mm-core/inc libmm-venc-inc += hardware/qcom/media/libstagefrighthw libmm-venc-inc += hardware/qcom/display/libgralloc +libmm-venc-inc += hardware/libhardware/include/hardware/ libmm-venc-inc += frameworks/native/include/media/hardware libmm-venc-inc += frameworks/native/include/media/openmax libmm-venc-inc += hardware/qcom/media/libc2dcolorconvert @@ -65,7 +66,7 @@ LOCAL_C_INCLUDES := $(libmm-venc-inc) LOCAL_ADDITIONAL_DEPENDENCIES := $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr LOCAL_PRELINK_MODULE := false LOCAL_SHARED_LIBRARIES := liblog libutils libbinder libcutils \ - libc2dcolorconvert libdl + libc2dcolorconvert libdl libhardware LOCAL_SRC_FILES := src/omx_video_base.cpp LOCAL_SRC_FILES += src/omx_video_encoder.cpp diff --git a/mm-video/vidc/venc/inc/omx_video_base.h b/mm-video/vidc/venc/inc/omx_video_base.h index 921c0fba..3e6345ae 100644 --- a/mm-video/vidc/venc/inc/omx_video_base.h +++ b/mm-video/vidc/venc/inc/omx_video_base.h @@ -150,7 +150,7 @@ protected: bool init(); bool open(unsigned int height,unsigned int width, ColorConvertFormat src, - ColorConvertFormat dest); + ColorConvertFormat dest, unsigned int stride); bool convert(int src_fd, void *src_viraddr, int dest_fd,void *dest_viraddr); bool get_buffer_size(int port,unsigned int &buf_size); diff --git a/mm-video/vidc/venc/src/omx_video_base.cpp b/mm-video/vidc/venc/src/omx_video_base.cpp index b1e54ee6..48c41b90 100644 --- a/mm-video/vidc/venc/src/omx_video_base.cpp +++ b/mm-video/vidc/venc/src/omx_video_base.cpp @@ -4638,12 +4638,12 @@ bool omx_video::omx_c2d_conv::convert(int src_fd, void *src_viraddr, } bool omx_video::omx_c2d_conv::open(unsigned int height,unsigned int width, - ColorConvertFormat src, ColorConvertFormat dest) + ColorConvertFormat src, ColorConvertFormat dest, unsigned int stride) { bool status = false; if(!c2dcc) { c2dcc = mConvertOpen(width, height, width, height, - src,dest,0); + src,dest,0,stride); if(c2dcc) { src_format = src; status = true; @@ -4725,21 +4725,21 @@ OMX_ERRORTYPE omx_video::empty_this_buffer_opaque(OMX_IN OMX_HANDLETYPE hComp, c2d_conv.close(); c2d_opened = false; } - if (!c2d_opened) { - if (handle->format == HAL_PIXEL_FORMAT_RGBA_8888) { - DEBUG_PRINT_ERROR("\n open Color conv for RGBA888"); - if(!c2d_conv.open(m_sInPortDef.format.video.nFrameHeight, - m_sInPortDef.format.video.nFrameWidth,RGBA8888,NV12_2K)){ - m_pCallbacks.EmptyBufferDone(hComp,m_app_data,buffer); - DEBUG_PRINT_ERROR("\n Color conv open failed"); - return OMX_ErrorBadParameter; - } - c2d_opened = true; - } else if(handle->format != HAL_PIXEL_FORMAT_NV12_ENCODEABLE) { - DEBUG_PRINT_ERROR("\n Incorrect color format"); + if(!c2d_opened) { + if(handle->format == HAL_PIXEL_FORMAT_RGBA_8888) { + DEBUG_PRINT_ERROR("\n open Color conv for RGBA888"); + if(!c2d_conv.open(m_sInPortDef.format.video.nFrameHeight, + m_sInPortDef.format.video.nFrameWidth,RGBA8888,NV12_2K,(unsigned int)handle->width)){ m_pCallbacks.EmptyBufferDone(hComp,m_app_data,buffer); + DEBUG_PRINT_ERROR("\n Color conv open failed"); return OMX_ErrorBadParameter; } + c2d_opened = true; + } else if(handle->format != HAL_PIXEL_FORMAT_NV12_ENCODEABLE) { + DEBUG_PRINT_ERROR("\n Incorrect color format"); + m_pCallbacks.EmptyBufferDone(hComp,m_app_data,buffer); + return OMX_ErrorBadParameter; + } } } |