bug fix: output colorformat configuration fixed

The eColorFormat field in OMX_PARAM_PORTDEFINITIONTYPE structure
has no effect on the component. This has to be configured from
OMX_VIDEO_PARAM_PORTFORMATTYPE. This is corrected. This color format
information is passed to graphic buffer during its allocation

Bug: 63796949

Merged-In: I51b1e59631647d1291ecfac373781ac5e5a0ffd5
Change-Id: I51b1e59631647d1291ecfac373781ac5e5a0ffd5
(cherry picked from commit 1441864f4c)
This commit is contained in:
Ram Mohan M 2017-07-04 19:21:19 +05:30 committed by Keun Soo Yim
parent ccc3c36c88
commit 56906949cc
3 changed files with 179 additions and 45 deletions

0
media/omx/1.0/vts/functional/common/Android.bp Executable file → Normal file
View file

View file

View file

@ -27,6 +27,7 @@
#include <android/hidl/allocator/1.0/IAllocator.h>
#include <android/hidl/memory/1.0/IMapper.h>
#include <android/hidl/memory/1.0/IMemory.h>
#include <cutils/atomic.h>
using ::android::hardware::graphics::common::V1_0::BufferUsage;
using ::android::hardware::graphics::common::V1_0::PixelFormat;
@ -47,6 +48,7 @@ using ::android::sp;
#include <VtsHalHidlTargetTestBase.h>
#include <getopt.h>
#include <media/hardware/HardwareAPI.h>
#include <media_hidl_test_common.h>
#include <media_video_hidl_test_common.h>
#include <fstream>
@ -399,7 +401,7 @@ void GetURLForComponent(VideoDecHidlTest::standardComp comp, char* mURL,
void allocateGraphicBuffers(sp<IOmxNode> omxNode, OMX_U32 portIndex,
android::Vector<BufferInfo>* buffArray,
uint32_t nFrameWidth, uint32_t nFrameHeight,
int32_t* nStride, uint32_t count) {
int32_t* nStride, int format, uint32_t count) {
android::hardware::media::omx::V1_0::Status status;
sp<android::hardware::graphics::allocator::V2_0::IAllocator> allocator =
android::hardware::graphics::allocator::V2_0::IAllocator::getService();
@ -416,7 +418,7 @@ void allocateGraphicBuffers(sp<IOmxNode> omxNode, OMX_U32 portIndex,
descriptorInfo.width = nFrameWidth;
descriptorInfo.height = nFrameHeight;
descriptorInfo.layerCount = 1;
descriptorInfo.format = PixelFormat::RGBA_8888;
descriptorInfo.format = static_cast<PixelFormat>(format);
descriptorInfo.usage = static_cast<uint64_t>(BufferUsage::CPU_READ_OFTEN);
omxNode->getGraphicBufferUsage(
portIndex,
@ -441,6 +443,9 @@ void allocateGraphicBuffers(sp<IOmxNode> omxNode, OMX_U32 portIndex,
EXPECT_EQ(error, android::hardware::graphics::mapper::V2_0::Error::NONE);
EXPECT_EQ(buffArray->size(), count);
static volatile int32_t nextId = 0;
uint64_t id = static_cast<uint64_t>(getpid()) << 32;
allocator->allocate(
descriptor, count,
[&](android::hardware::graphics::mapper::V2_0::Error _s, uint32_t _n1,
@ -464,7 +469,7 @@ void allocateGraphicBuffers(sp<IOmxNode> omxNode, OMX_U32 portIndex,
buffArray->editItemAt(i).omxBuffer.attr.anwBuffer.layerCount =
descriptorInfo.layerCount;
buffArray->editItemAt(i).omxBuffer.attr.anwBuffer.id =
(*buffArray)[i].id;
id | static_cast<uint32_t>(android_atomic_inc(&nextId));
}
});
}
@ -510,12 +515,15 @@ void portReconfiguration(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
// set Port Params
uint32_t nFrameWidth, nFrameHeight, xFramerate;
OMX_COLOR_FORMATTYPE eColorFormat =
OMX_COLOR_FormatYUV420Planar;
getInputChannelInfo(omxNode, kPortIndexInput, &nFrameWidth,
&nFrameHeight, &xFramerate);
// get configured color format
OMX_PARAM_PORTDEFINITIONTYPE portDef;
status = getPortParam(omxNode, OMX_IndexParamPortDefinition,
kPortIndexOutput, &portDef);
setDefaultPortParam(omxNode, kPortIndexOutput,
OMX_VIDEO_CodingUnused, eColorFormat,
OMX_VIDEO_CodingUnused,
portDef.format.video.eColorFormat,
nFrameWidth, nFrameHeight, 0, xFramerate);
// If you can disable a port, then you should be able to
@ -547,6 +555,7 @@ void portReconfiguration(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
portDef.format.video.nFrameWidth,
portDef.format.video.nFrameHeight,
&portDef.format.video.nStride,
portDef.format.video.eColorFormat,
portDef.nBufferCountActual);
}
status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT,
@ -707,6 +716,116 @@ void decodeNFrames(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
}
}
// DescribeColorFormatParams Copy Constructor (Borrowed from OMXUtils.cpp)
android::DescribeColorFormatParams::DescribeColorFormatParams(
const android::DescribeColorFormat2Params& params) {
eColorFormat = params.eColorFormat;
nFrameWidth = params.nFrameWidth;
nFrameHeight = params.nFrameHeight;
nStride = params.nStride;
nSliceHeight = params.nSliceHeight;
bUsingNativeBuffers = params.bUsingNativeBuffers;
};
bool isColorFormatFlexibleYUV(sp<IOmxNode> omxNode,
OMX_COLOR_FORMATTYPE eColorFormat) {
android::hardware::media::omx::V1_0::Status status;
unsigned int index = OMX_IndexMax, index2 = OMX_IndexMax;
omxNode->getExtensionIndex(
"OMX.google.android.index.describeColorFormat",
[&index](android::hardware::media::omx::V1_0::Status _s,
unsigned int _nl) {
if (_s == ::android::hardware::media::omx::V1_0::Status::OK)
index = _nl;
});
omxNode->getExtensionIndex(
"OMX.google.android.index.describeColorFormat2",
[&index2](android::hardware::media::omx::V1_0::Status _s,
unsigned int _nl) {
if (_s == ::android::hardware::media::omx::V1_0::Status::OK)
index2 = _nl;
});
android::DescribeColorFormat2Params describeParams;
describeParams.eColorFormat = eColorFormat;
describeParams.nFrameWidth = 128;
describeParams.nFrameHeight = 128;
describeParams.nStride = 128;
describeParams.nSliceHeight = 128;
describeParams.bUsingNativeBuffers = OMX_FALSE;
if (index != OMX_IndexMax) {
android::DescribeColorFormatParams describeParamsV1(describeParams);
status = getParam(omxNode, static_cast<OMX_INDEXTYPE>(index),
&describeParamsV1);
if (status == ::android::hardware::media::omx::V1_0::Status::OK) {
android::MediaImage& img = describeParamsV1.sMediaImage;
if (img.mType == android::MediaImage::MEDIA_IMAGE_TYPE_YUV) {
if (img.mNumPlanes == 3 &&
img.mPlane[img.Y].mHorizSubsampling == 1 &&
img.mPlane[img.Y].mVertSubsampling == 1) {
if (img.mPlane[img.U].mHorizSubsampling == 2 &&
img.mPlane[img.U].mVertSubsampling == 2 &&
img.mPlane[img.V].mHorizSubsampling == 2 &&
img.mPlane[img.V].mVertSubsampling == 2) {
if (img.mBitDepth <= 8) {
return true;
}
}
}
}
}
} else if (index2 != OMX_IndexMax) {
status = getParam(omxNode, static_cast<OMX_INDEXTYPE>(index2),
&describeParams);
android::MediaImage2& img = describeParams.sMediaImage;
if (img.mType == android::MediaImage2::MEDIA_IMAGE_TYPE_YUV) {
if (img.mNumPlanes == 3 &&
img.mPlane[img.Y].mHorizSubsampling == 1 &&
img.mPlane[img.Y].mVertSubsampling == 1) {
if (img.mPlane[img.U].mHorizSubsampling == 2 &&
img.mPlane[img.U].mVertSubsampling == 2 &&
img.mPlane[img.V].mHorizSubsampling == 2 &&
img.mPlane[img.V].mVertSubsampling == 2) {
if (img.mBitDepth <= 8) {
return true;
}
}
}
}
}
return false;
}
// get default color format for output port
void getDefaultColorFormat(sp<IOmxNode> omxNode, OMX_U32 kPortIndexOutput,
PortMode oPortMode,
OMX_COLOR_FORMATTYPE* eColorFormat) {
android::hardware::media::omx::V1_0::Status status;
OMX_VIDEO_PARAM_PORTFORMATTYPE portFormat;
*eColorFormat = OMX_COLOR_FormatUnused;
portFormat.nIndex = 0;
while (1) {
status = getPortParam(omxNode, OMX_IndexParamVideoPortFormat,
kPortIndexOutput, &portFormat);
if (status != ::android::hardware::media::omx::V1_0::Status::OK) break;
EXPECT_EQ(portFormat.eCompressionFormat, OMX_VIDEO_CodingUnused);
if (oPortMode != PortMode::PRESET_BYTE_BUFFER) {
*eColorFormat = portFormat.eColorFormat;
break;
}
if (isColorFormatFlexibleYUV(omxNode, portFormat.eColorFormat)) {
*eColorFormat = portFormat.eColorFormat;
break;
}
if (OMX_COLOR_FormatYUV420SemiPlanar == portFormat.eColorFormat ||
OMX_COLOR_FormatYUV420Planar == portFormat.eColorFormat) {
*eColorFormat = portFormat.eColorFormat;
break;
}
portFormat.nIndex++;
}
}
// set component role
TEST_F(VideoDecHidlTest, SetRole) {
description("Test Set Component Role");
@ -802,9 +921,17 @@ TEST_F(VideoDecHidlTest, DecodeTest) {
// set Port Params
uint32_t nFrameWidth, nFrameHeight, xFramerate;
OMX_COLOR_FORMATTYPE eColorFormat = OMX_COLOR_FormatYUV420Planar;
getInputChannelInfo(omxNode, kPortIndexInput, &nFrameWidth, &nFrameHeight,
&xFramerate);
// get default color format
OMX_COLOR_FORMATTYPE eColorFormat = OMX_COLOR_FormatUnused;
getDefaultColorFormat(omxNode, kPortIndexOutput, portMode[1],
&eColorFormat);
ASSERT_NE(eColorFormat, OMX_COLOR_FormatUnused);
status =
setVideoPortFormat(omxNode, kPortIndexOutput, OMX_VIDEO_CodingUnused,
eColorFormat, xFramerate);
EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
setDefaultPortParam(omxNode, kPortIndexOutput, OMX_VIDEO_CodingUnused,
eColorFormat, nFrameWidth, nFrameHeight, 0, xFramerate);
@ -828,7 +955,8 @@ TEST_F(VideoDecHidlTest, DecodeTest) {
allocateGraphicBuffers(
omxNode, kPortIndexOutput, &oBuffer,
portDef.format.video.nFrameWidth, portDef.format.video.nFrameHeight,
&portDef.format.video.nStride, portDef.nBufferCountActual);
&portDef.format.video.nStride, portDef.format.video.eColorFormat,
portDef.nBufferCountActual);
}
// Port Reconfiguration
@ -866,22 +994,28 @@ TEST_F(VideoDecHidlTest, EOSTest_M) {
kPortIndexOutput = kPortIndexInput + 1;
}
// set Port Params
uint32_t nFrameWidth, nFrameHeight, xFramerate;
OMX_COLOR_FORMATTYPE eColorFormat = OMX_COLOR_FormatYUV420Planar;
getInputChannelInfo(omxNode, kPortIndexInput, &nFrameWidth, &nFrameHeight,
&xFramerate);
setDefaultPortParam(omxNode, kPortIndexOutput, OMX_VIDEO_CodingUnused,
eColorFormat, nFrameWidth, nFrameHeight, 0, xFramerate);
// set port mode
PortMode portMode[2];
portMode[0] = portMode[1] = PortMode::PRESET_BYTE_BUFFER;
status = omxNode->setPortMode(kPortIndexInput, portMode[0]);
ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
status = omxNode->setPortMode(kPortIndexOutput, portMode[1]);
ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
// set Port Params
uint32_t nFrameWidth, nFrameHeight, xFramerate;
getInputChannelInfo(omxNode, kPortIndexInput, &nFrameWidth, &nFrameHeight,
&xFramerate);
// get default color format
OMX_COLOR_FORMATTYPE eColorFormat = OMX_COLOR_FormatUnused;
getDefaultColorFormat(omxNode, kPortIndexOutput, portMode[1],
&eColorFormat);
ASSERT_NE(eColorFormat, OMX_COLOR_FormatUnused);
status =
setVideoPortFormat(omxNode, kPortIndexOutput, OMX_VIDEO_CodingUnused,
eColorFormat, xFramerate);
EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
setDefaultPortParam(omxNode, kPortIndexOutput, OMX_VIDEO_CodingUnused,
eColorFormat, nFrameWidth, nFrameHeight, 0, xFramerate);
android::Vector<BufferInfo> iBuffer, oBuffer;
// set state to idle
@ -956,20 +1090,20 @@ TEST_F(VideoDecHidlTest, ThumbnailTest) {
// set Port Params
uint32_t nFrameWidth, nFrameHeight, xFramerate;
OMX_COLOR_FORMATTYPE eColorFormat = OMX_COLOR_FormatYUV420Planar;
getInputChannelInfo(omxNode, kPortIndexInput, &nFrameWidth, &nFrameHeight,
&xFramerate);
// get default color format
OMX_COLOR_FORMATTYPE eColorFormat = OMX_COLOR_FormatUnused;
getDefaultColorFormat(omxNode, kPortIndexOutput, portMode[1],
&eColorFormat);
ASSERT_NE(eColorFormat, OMX_COLOR_FormatUnused);
status =
setVideoPortFormat(omxNode, kPortIndexOutput, OMX_VIDEO_CodingUnused,
eColorFormat, xFramerate);
EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
setDefaultPortParam(omxNode, kPortIndexOutput, OMX_VIDEO_CodingUnused,
eColorFormat, nFrameWidth, nFrameHeight, 0, xFramerate);
// set port mode
PortMode portMode[2];
portMode[0] = portMode[1] = PortMode::PRESET_BYTE_BUFFER;
status = omxNode->setPortMode(kPortIndexInput, portMode[0]);
ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
status = omxNode->setPortMode(kPortIndexOutput, portMode[1]);
ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
android::Vector<BufferInfo> iBuffer, oBuffer;
// set state to idle
@ -1069,20 +1203,20 @@ TEST_F(VideoDecHidlTest, SimpleEOSTest) {
// set Port Params
uint32_t nFrameWidth, nFrameHeight, xFramerate;
OMX_COLOR_FORMATTYPE eColorFormat = OMX_COLOR_FormatYUV420Planar;
getInputChannelInfo(omxNode, kPortIndexInput, &nFrameWidth, &nFrameHeight,
&xFramerate);
// get default color format
OMX_COLOR_FORMATTYPE eColorFormat = OMX_COLOR_FormatUnused;
getDefaultColorFormat(omxNode, kPortIndexOutput, portMode[1],
&eColorFormat);
ASSERT_NE(eColorFormat, OMX_COLOR_FormatUnused);
status =
setVideoPortFormat(omxNode, kPortIndexOutput, OMX_VIDEO_CodingUnused,
eColorFormat, xFramerate);
EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
setDefaultPortParam(omxNode, kPortIndexOutput, OMX_VIDEO_CodingUnused,
eColorFormat, nFrameWidth, nFrameHeight, 0, xFramerate);
// set port mode
PortMode portMode[2];
portMode[0] = portMode[1] = PortMode::PRESET_BYTE_BUFFER;
status = omxNode->setPortMode(kPortIndexInput, portMode[0]);
ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
status = omxNode->setPortMode(kPortIndexOutput, portMode[1]);
ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
android::Vector<BufferInfo> iBuffer, oBuffer;
// set state to idle
@ -1164,20 +1298,20 @@ TEST_F(VideoDecHidlTest, FlushTest) {
// set Port Params
uint32_t nFrameWidth, nFrameHeight, xFramerate;
OMX_COLOR_FORMATTYPE eColorFormat = OMX_COLOR_FormatYUV420Planar;
getInputChannelInfo(omxNode, kPortIndexInput, &nFrameWidth, &nFrameHeight,
&xFramerate);
// get default color format
OMX_COLOR_FORMATTYPE eColorFormat = OMX_COLOR_FormatUnused;
getDefaultColorFormat(omxNode, kPortIndexOutput, portMode[1],
&eColorFormat);
ASSERT_NE(eColorFormat, OMX_COLOR_FormatUnused);
status =
setVideoPortFormat(omxNode, kPortIndexOutput, OMX_VIDEO_CodingUnused,
eColorFormat, xFramerate);
EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
setDefaultPortParam(omxNode, kPortIndexOutput, OMX_VIDEO_CodingUnused,
eColorFormat, nFrameWidth, nFrameHeight, 0, xFramerate);
// set port mode
PortMode portMode[2];
portMode[0] = portMode[1] = PortMode::PRESET_BYTE_BUFFER;
status = omxNode->setPortMode(kPortIndexInput, portMode[0]);
ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
status = omxNode->setPortMode(kPortIndexOutput, portMode[1]);
ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
android::Vector<BufferInfo> iBuffer, oBuffer;
// set state to idle