Loading media/codec2/sfplugin/C2OMXNode.cpp +35 −1 Original line number Diff line number Diff line Loading @@ -33,12 +33,14 @@ #include <OMX_IndexExt.h> #include <android/fdsan.h> #include <media/stagefright/foundation/ColorUtils.h> #include <media/stagefright/omx/OMXUtils.h> #include <media/stagefright/MediaErrors.h> #include <ui/Fence.h> #include <ui/GraphicBuffer.h> #include <utils/Thread.h> #include "utils/Codec2Mapper.h" #include "C2OMXNode.h" namespace android { Loading Loading @@ -71,6 +73,23 @@ public: jobs->cond.broadcast(); } void setDataspace(android_dataspace dataspace) { Mutexed<Jobs>::Locked jobs(mJobs); ColorUtils::convertDataSpaceToV0(dataspace); jobs->configUpdate.emplace_back(new C2StreamDataSpaceInfo::input(0u, dataspace)); int32_t standard; int32_t transfer; int32_t range; ColorUtils::getColorConfigFromDataSpace(dataspace, &range, &standard, &transfer); std::unique_ptr<C2StreamColorAspectsInfo::input> colorAspects = std::make_unique<C2StreamColorAspectsInfo::input>(0u); if (C2Mapper::map(standard, &colorAspects->primaries, &colorAspects->matrix) && C2Mapper::map(transfer, &colorAspects->transfer) && C2Mapper::map(range, &colorAspects->range)) { jobs->configUpdate.push_back(std::move(colorAspects)); } } protected: bool threadLoop() override { constexpr nsecs_t kIntervalNs = nsecs_t(10) * 1000 * 1000; // 10ms Loading Loading @@ -102,6 +121,9 @@ protected: uniqueFds.push_back(std::move(queue.workList.front().fd1)); queue.workList.pop_front(); } for (const std::unique_ptr<C2Param> ¶m : jobs->configUpdate) { items.front()->input.configUpdate.emplace_back(C2Param::Copy(*param)); } jobs.unlock(); for (int fenceFd : fenceFds) { Loading @@ -119,6 +141,7 @@ protected: queued = true; } if (queued) { jobs->configUpdate.clear(); return true; } if (i == 0) { Loading Loading @@ -161,6 +184,7 @@ private: std::map<std::weak_ptr<Codec2Client::Component>, Queue, std::owner_less<std::weak_ptr<Codec2Client::Component>>> queues; std::vector<std::unique_ptr<C2Param>> configUpdate; Condition cond; }; Mutexed<Jobs> mJobs; Loading @@ -172,6 +196,9 @@ C2OMXNode::C2OMXNode(const std::shared_ptr<Codec2Client::Component> &comp) mQueueThread(new QueueThread) { android_fdsan_set_error_level(ANDROID_FDSAN_ERROR_LEVEL_WARN_ALWAYS); mQueueThread->run("C2OMXNode", PRIORITY_AUDIO); Mutexed<android_dataspace>::Locked ds(mDataspace); *ds = HAL_DATASPACE_UNKNOWN; } status_t C2OMXNode::freeNode() { Loading Loading @@ -459,8 +486,11 @@ status_t C2OMXNode::dispatchMessage(const omx_message& msg) { android_dataspace dataSpace = (android_dataspace)msg.u.event_data.data1; uint32_t pixelFormat = msg.u.event_data.data3; // TODO: set dataspace on component to see if it impacts color aspects ALOGD("dataspace changed to %#x pixel format: %#x", dataSpace, pixelFormat); mQueueThread->setDataspace(dataSpace); Mutexed<android_dataspace>::Locked ds(mDataspace); *ds = dataSpace; return OK; } Loading Loading @@ -493,4 +523,8 @@ void C2OMXNode::onInputBufferDone(c2_cntr64_t index) { (void)mBufferSource->onInputBufferEmptied(bufferId, -1); } android_dataspace C2OMXNode::getDataspace() { return *mDataspace.lock(); } } // namespace android media/codec2/sfplugin/C2OMXNode.h +6 −0 Original line number Diff line number Diff line Loading @@ -93,6 +93,11 @@ struct C2OMXNode : public BnOMXNode { */ void onInputBufferDone(c2_cntr64_t index); /** * Returns dataspace information from GraphicBufferSource. */ android_dataspace getDataspace(); private: std::weak_ptr<Codec2Client::Component> mComp; sp<IOMXBufferSource> mBufferSource; Loading @@ -101,6 +106,7 @@ private: uint32_t mWidth; uint32_t mHeight; uint64_t mUsage; Mutexed<android_dataspace> mDataspace; // WORKAROUND: timestamp adjustment Loading media/codec2/sfplugin/CCodec.cpp +7 −2 Original line number Diff line number Diff line Loading @@ -211,8 +211,6 @@ public: (OMX_INDEXTYPE)OMX_IndexParamConsumerUsageBits, &usage, sizeof(usage)); // NOTE: we do not use/pass through color aspects from GraphicBufferSource as we // communicate that directly to the component. mSource->configure( mOmxNode, static_cast<hardware::graphics::common::V1_0::Dataspace>(mDataSpace)); return OK; Loading Loading @@ -411,6 +409,10 @@ public: mNode->onInputBufferDone(index); } android_dataspace getDataspace() override { return mNode->getDataspace(); } private: sp<HGraphicBufferSource> mSource; sp<C2OMXNode> mNode; Loading Loading @@ -1571,6 +1573,7 @@ void CCodec::start() { outputFormat = config->mOutputFormat = config->mOutputFormat->dup(); if (config->mInputSurface) { err2 = config->mInputSurface->start(); config->mInputSurfaceDataspace = config->mInputSurface->getDataspace(); } buffersBoundToCodec = config->mBuffersBoundToCodec; } Loading Loading @@ -1658,6 +1661,7 @@ void CCodec::stop() { if (config->mInputSurface) { config->mInputSurface->disconnect(); config->mInputSurface = nullptr; config->mInputSurfaceDataspace = HAL_DATASPACE_UNKNOWN; } } { Loading Loading @@ -1707,6 +1711,7 @@ void CCodec::initiateRelease(bool sendCallback /* = true */) { if (config->mInputSurface) { config->mInputSurface->disconnect(); config->mInputSurface = nullptr; config->mInputSurfaceDataspace = HAL_DATASPACE_UNKNOWN; } } Loading media/codec2/sfplugin/CCodecConfig.cpp +23 −1 Original line number Diff line number Diff line Loading @@ -1128,6 +1128,12 @@ bool CCodecConfig::updateConfiguration( insertion.first->second = std::move(p); } } if (mInputSurface && (domain & mOutputDomain) && mInputSurfaceDataspace != mInputSurface->getDataspace()) { changed = true; mInputSurfaceDataspace = mInputSurface->getDataspace(); } ALOGV("updated configuration has %zu params (%s)", mCurrentConfig.size(), changed ? "CHANGED" : "no change"); Loading Loading @@ -1356,7 +1362,6 @@ sp<AMessage> CCodecConfig::getFormatForDomain( msg->removeEntryAt(msg->findEntryByName("color-matrix")); } // calculate dataspace for raw graphic buffers if not specified by component, or if // using surface with unspecified aspects (as those must be defaulted which may change // the dataspace) Loading Loading @@ -1394,6 +1399,23 @@ sp<AMessage> CCodecConfig::getFormatForDomain( } } if (mInputSurface) { android_dataspace dataspace = mInputSurface->getDataspace(); ColorUtils::convertDataSpaceToV0(dataspace); int32_t standard; ColorUtils::getColorConfigFromDataSpace(dataspace, &range, &standard, &transfer); if (range != 0) { msg->setInt32(KEY_COLOR_RANGE, range); } if (standard != 0) { msg->setInt32(KEY_COLOR_STANDARD, standard); } if (transfer != 0) { msg->setInt32(KEY_COLOR_TRANSFER, transfer); } msg->setInt32("android._dataspace", dataspace); } // HDR static info C2HdrStaticMetadataStruct hdr; Loading media/codec2/sfplugin/CCodecConfig.h +1 −0 Original line number Diff line number Diff line Loading @@ -124,6 +124,7 @@ struct CCodecConfig { std::shared_ptr<InputSurfaceWrapper> mInputSurface; std::unique_ptr<InputSurfaceWrapper::Config> mISConfig; android_dataspace mInputSurfaceDataspace; /// the current configuration. Updated after configure() and based on configUpdate in /// onWorkDone Loading Loading
media/codec2/sfplugin/C2OMXNode.cpp +35 −1 Original line number Diff line number Diff line Loading @@ -33,12 +33,14 @@ #include <OMX_IndexExt.h> #include <android/fdsan.h> #include <media/stagefright/foundation/ColorUtils.h> #include <media/stagefright/omx/OMXUtils.h> #include <media/stagefright/MediaErrors.h> #include <ui/Fence.h> #include <ui/GraphicBuffer.h> #include <utils/Thread.h> #include "utils/Codec2Mapper.h" #include "C2OMXNode.h" namespace android { Loading Loading @@ -71,6 +73,23 @@ public: jobs->cond.broadcast(); } void setDataspace(android_dataspace dataspace) { Mutexed<Jobs>::Locked jobs(mJobs); ColorUtils::convertDataSpaceToV0(dataspace); jobs->configUpdate.emplace_back(new C2StreamDataSpaceInfo::input(0u, dataspace)); int32_t standard; int32_t transfer; int32_t range; ColorUtils::getColorConfigFromDataSpace(dataspace, &range, &standard, &transfer); std::unique_ptr<C2StreamColorAspectsInfo::input> colorAspects = std::make_unique<C2StreamColorAspectsInfo::input>(0u); if (C2Mapper::map(standard, &colorAspects->primaries, &colorAspects->matrix) && C2Mapper::map(transfer, &colorAspects->transfer) && C2Mapper::map(range, &colorAspects->range)) { jobs->configUpdate.push_back(std::move(colorAspects)); } } protected: bool threadLoop() override { constexpr nsecs_t kIntervalNs = nsecs_t(10) * 1000 * 1000; // 10ms Loading Loading @@ -102,6 +121,9 @@ protected: uniqueFds.push_back(std::move(queue.workList.front().fd1)); queue.workList.pop_front(); } for (const std::unique_ptr<C2Param> ¶m : jobs->configUpdate) { items.front()->input.configUpdate.emplace_back(C2Param::Copy(*param)); } jobs.unlock(); for (int fenceFd : fenceFds) { Loading @@ -119,6 +141,7 @@ protected: queued = true; } if (queued) { jobs->configUpdate.clear(); return true; } if (i == 0) { Loading Loading @@ -161,6 +184,7 @@ private: std::map<std::weak_ptr<Codec2Client::Component>, Queue, std::owner_less<std::weak_ptr<Codec2Client::Component>>> queues; std::vector<std::unique_ptr<C2Param>> configUpdate; Condition cond; }; Mutexed<Jobs> mJobs; Loading @@ -172,6 +196,9 @@ C2OMXNode::C2OMXNode(const std::shared_ptr<Codec2Client::Component> &comp) mQueueThread(new QueueThread) { android_fdsan_set_error_level(ANDROID_FDSAN_ERROR_LEVEL_WARN_ALWAYS); mQueueThread->run("C2OMXNode", PRIORITY_AUDIO); Mutexed<android_dataspace>::Locked ds(mDataspace); *ds = HAL_DATASPACE_UNKNOWN; } status_t C2OMXNode::freeNode() { Loading Loading @@ -459,8 +486,11 @@ status_t C2OMXNode::dispatchMessage(const omx_message& msg) { android_dataspace dataSpace = (android_dataspace)msg.u.event_data.data1; uint32_t pixelFormat = msg.u.event_data.data3; // TODO: set dataspace on component to see if it impacts color aspects ALOGD("dataspace changed to %#x pixel format: %#x", dataSpace, pixelFormat); mQueueThread->setDataspace(dataSpace); Mutexed<android_dataspace>::Locked ds(mDataspace); *ds = dataSpace; return OK; } Loading Loading @@ -493,4 +523,8 @@ void C2OMXNode::onInputBufferDone(c2_cntr64_t index) { (void)mBufferSource->onInputBufferEmptied(bufferId, -1); } android_dataspace C2OMXNode::getDataspace() { return *mDataspace.lock(); } } // namespace android
media/codec2/sfplugin/C2OMXNode.h +6 −0 Original line number Diff line number Diff line Loading @@ -93,6 +93,11 @@ struct C2OMXNode : public BnOMXNode { */ void onInputBufferDone(c2_cntr64_t index); /** * Returns dataspace information from GraphicBufferSource. */ android_dataspace getDataspace(); private: std::weak_ptr<Codec2Client::Component> mComp; sp<IOMXBufferSource> mBufferSource; Loading @@ -101,6 +106,7 @@ private: uint32_t mWidth; uint32_t mHeight; uint64_t mUsage; Mutexed<android_dataspace> mDataspace; // WORKAROUND: timestamp adjustment Loading
media/codec2/sfplugin/CCodec.cpp +7 −2 Original line number Diff line number Diff line Loading @@ -211,8 +211,6 @@ public: (OMX_INDEXTYPE)OMX_IndexParamConsumerUsageBits, &usage, sizeof(usage)); // NOTE: we do not use/pass through color aspects from GraphicBufferSource as we // communicate that directly to the component. mSource->configure( mOmxNode, static_cast<hardware::graphics::common::V1_0::Dataspace>(mDataSpace)); return OK; Loading Loading @@ -411,6 +409,10 @@ public: mNode->onInputBufferDone(index); } android_dataspace getDataspace() override { return mNode->getDataspace(); } private: sp<HGraphicBufferSource> mSource; sp<C2OMXNode> mNode; Loading Loading @@ -1571,6 +1573,7 @@ void CCodec::start() { outputFormat = config->mOutputFormat = config->mOutputFormat->dup(); if (config->mInputSurface) { err2 = config->mInputSurface->start(); config->mInputSurfaceDataspace = config->mInputSurface->getDataspace(); } buffersBoundToCodec = config->mBuffersBoundToCodec; } Loading Loading @@ -1658,6 +1661,7 @@ void CCodec::stop() { if (config->mInputSurface) { config->mInputSurface->disconnect(); config->mInputSurface = nullptr; config->mInputSurfaceDataspace = HAL_DATASPACE_UNKNOWN; } } { Loading Loading @@ -1707,6 +1711,7 @@ void CCodec::initiateRelease(bool sendCallback /* = true */) { if (config->mInputSurface) { config->mInputSurface->disconnect(); config->mInputSurface = nullptr; config->mInputSurfaceDataspace = HAL_DATASPACE_UNKNOWN; } } Loading
media/codec2/sfplugin/CCodecConfig.cpp +23 −1 Original line number Diff line number Diff line Loading @@ -1128,6 +1128,12 @@ bool CCodecConfig::updateConfiguration( insertion.first->second = std::move(p); } } if (mInputSurface && (domain & mOutputDomain) && mInputSurfaceDataspace != mInputSurface->getDataspace()) { changed = true; mInputSurfaceDataspace = mInputSurface->getDataspace(); } ALOGV("updated configuration has %zu params (%s)", mCurrentConfig.size(), changed ? "CHANGED" : "no change"); Loading Loading @@ -1356,7 +1362,6 @@ sp<AMessage> CCodecConfig::getFormatForDomain( msg->removeEntryAt(msg->findEntryByName("color-matrix")); } // calculate dataspace for raw graphic buffers if not specified by component, or if // using surface with unspecified aspects (as those must be defaulted which may change // the dataspace) Loading Loading @@ -1394,6 +1399,23 @@ sp<AMessage> CCodecConfig::getFormatForDomain( } } if (mInputSurface) { android_dataspace dataspace = mInputSurface->getDataspace(); ColorUtils::convertDataSpaceToV0(dataspace); int32_t standard; ColorUtils::getColorConfigFromDataSpace(dataspace, &range, &standard, &transfer); if (range != 0) { msg->setInt32(KEY_COLOR_RANGE, range); } if (standard != 0) { msg->setInt32(KEY_COLOR_STANDARD, standard); } if (transfer != 0) { msg->setInt32(KEY_COLOR_TRANSFER, transfer); } msg->setInt32("android._dataspace", dataspace); } // HDR static info C2HdrStaticMetadataStruct hdr; Loading
media/codec2/sfplugin/CCodecConfig.h +1 −0 Original line number Diff line number Diff line Loading @@ -124,6 +124,7 @@ struct CCodecConfig { std::shared_ptr<InputSurfaceWrapper> mInputSurface; std::unique_ptr<InputSurfaceWrapper::Config> mISConfig; android_dataspace mInputSurfaceDataspace; /// the current configuration. Updated after configure() and based on configUpdate in /// onWorkDone Loading