summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsrikarri <sridur@codeaurora.org>2014-03-14 12:59:40 +0530
committersrikarri <sridur@codeaurora.org>2014-04-01 19:43:44 +0530
commit812f79292c47779734738f8b740d5132870b746e (patch)
tree520a7dacafc7a2a9de9ca38fadf1175eb487b520
parent3c680572643ca2a0e661de1362b742438e7596c5 (diff)
downloadandroid_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.cpp45
-rw-r--r--libc2dcolorconvert/C2DColorConverter.h2
-rw-r--r--mm-video/vidc/common/inc/vidc_color_converter.h2
-rw-r--r--mm-video/vidc/common/src/vidc_color_converter.cpp4
-rw-r--r--mm-video/vidc/vdec/src/omx_vdec.cpp3
-rw-r--r--mm-video/vidc/venc/Android.mk3
-rw-r--r--mm-video/vidc/venc/inc/omx_video_base.h2
-rw-r--r--mm-video/vidc/venc/src/omx_video_base.cpp28
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;
+ }
}
}