Loading media/codec2/sfplugin/C2OMXNode.cpp +1 −37 Original line number Diff line number Diff line Loading @@ -33,14 +33,12 @@ #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 @@ -73,25 +71,6 @@ 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(dataspace) & HAL_DATASPACE_STANDARD_MASK) >> HAL_DATASPACE_STANDARD_SHIFT; int32_t transfer = (int32_t(dataspace) & HAL_DATASPACE_TRANSFER_MASK) >> HAL_DATASPACE_TRANSFER_SHIFT; int32_t range = (int32_t(dataspace) & HAL_DATASPACE_RANGE_MASK) >> HAL_DATASPACE_RANGE_SHIFT; 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 @@ -123,9 +102,6 @@ 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 @@ -143,7 +119,6 @@ protected: queued = true; } if (queued) { jobs->configUpdate.clear(); return true; } if (i == 0) { Loading Loading @@ -186,7 +161,6 @@ 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 @@ -198,9 +172,6 @@ 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 @@ -488,11 +459,8 @@ 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 @@ -525,8 +493,4 @@ 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 +0 −3 Original line number Diff line number Diff line Loading @@ -93,8 +93,6 @@ struct C2OMXNode : public BnOMXNode { */ void onInputBufferDone(c2_cntr64_t index); android_dataspace getDataspace(); private: std::weak_ptr<Codec2Client::Component> mComp; sp<IOMXBufferSource> mBufferSource; Loading @@ -103,7 +101,6 @@ private: uint32_t mWidth; uint32_t mHeight; uint64_t mUsage; Mutexed<android_dataspace> mDataspace; // WORKAROUND: timestamp adjustment Loading media/codec2/sfplugin/CCodec.cpp +7 −54 Original line number Diff line number Diff line Loading @@ -211,6 +211,8 @@ 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 @@ -409,10 +411,6 @@ public: mNode->onInputBufferDone(index); } android_dataspace getDataspace() override { return mNode->getDataspace(); } private: sp<HGraphicBufferSource> mSource; sp<C2OMXNode> mNode; Loading Loading @@ -1030,9 +1028,6 @@ void CCodec::configure(const sp<AMessage> &msg) { } } // get color aspects getColorAspectsFromFormat(msg, config->mClientColorAspects); /* * Handle dataspace */ Loading @@ -1042,12 +1037,12 @@ void CCodec::configure(const sp<AMessage> &msg) { int32_t width, height; if (msg->findInt32("width", &width) && msg->findInt32("height", &height)) { setDefaultCodecColorAspectsIfNeeded(config->mClientColorAspects, width, height); ColorAspects aspects; getColorAspectsFromFormat(msg, aspects); setDefaultCodecColorAspectsIfNeeded(aspects, width, height); // TODO: read dataspace / color aspect from the component setColorAspectsIntoFormat( config->mClientColorAspects, const_cast<sp<AMessage> &>(msg)); dataSpace = getDataSpaceForColorAspects( config->mClientColorAspects, true /* mayexpand */); setColorAspectsIntoFormat(aspects, const_cast<sp<AMessage> &>(msg)); dataSpace = getDataSpaceForColorAspects(aspects, true /* mayexpand */); } msg->setInt32("android._dataspace", (int32_t)dataSpace); ALOGD("setting dataspace to %x", dataSpace); Loading Loading @@ -1985,44 +1980,6 @@ void CCodec::onInputBufferDone(uint64_t frameIndex, size_t arrayIndex) { } } static void HandleDataspace( android_dataspace dataspace, ColorAspects *colorAspects, sp<AMessage> *format) { ColorUtils::convertDataSpaceToV0(dataspace); int32_t range, standard, transfer; range = (dataspace & HAL_DATASPACE_RANGE_MASK) >> HAL_DATASPACE_RANGE_SHIFT; if (range == 0) { range = ColorUtils::wrapColorAspectsIntoColorRange( colorAspects->mRange); } standard = (dataspace & HAL_DATASPACE_STANDARD_MASK) >> HAL_DATASPACE_STANDARD_SHIFT; if (standard == 0) { standard = ColorUtils::wrapColorAspectsIntoColorStandard( colorAspects->mPrimaries, colorAspects->mMatrixCoeffs); } transfer = (dataspace & HAL_DATASPACE_TRANSFER_MASK) >> HAL_DATASPACE_TRANSFER_SHIFT; if (transfer == 0) { transfer = ColorUtils::wrapColorAspectsIntoColorTransfer( colorAspects->mTransfer); } ColorAspects newColorAspects; ColorUtils::convertPlatformColorAspectsToCodecAspects( range, standard, transfer, newColorAspects); if (ColorUtils::checkIfAspectsChangedAndUnspecifyThem( newColorAspects, *colorAspects)) { *format = (*format)->dup(); (*format)->setInt32(KEY_COLOR_RANGE, range); (*format)->setInt32(KEY_COLOR_STANDARD, standard); (*format)->setInt32(KEY_COLOR_TRANSFER, transfer); // Record current color aspects into |colorAspects|. // NOTE: newColorAspects could have been modified by // checkIfAspectsChangedAndUnspecifyThem() above, // so *colorAspects = newColorAspects does not work as intended. ColorUtils::convertPlatformColorAspectsToCodecAspects( range, standard, transfer, *colorAspects); } } void CCodec::onMessageReceived(const sp<AMessage> &msg) { TimePoint now = std::chrono::steady_clock::now(); CCodecWatchdog::getInstance()->watch(this); Loading Loading @@ -2137,10 +2094,6 @@ void CCodec::onMessageReceived(const sp<AMessage> &msg) { sp<AMessage> outputFormat = config->mOutputFormat; config->updateConfiguration(updates, config->mOutputDomain); if (config->mInputSurface) { android_dataspace ds = config->mInputSurface->getDataspace(); HandleDataspace(ds, &config->mClientColorAspects, &config->mOutputFormat); } RevertOutputFormatIfNeeded(outputFormat, config->mOutputFormat); // copy standard infos to graphic buffers if not already present (otherwise, we Loading media/codec2/sfplugin/CCodecConfig.h +0 −2 Original line number Diff line number Diff line Loading @@ -27,7 +27,6 @@ #include <C2Debug.h> #include <codec2/hidl/client.h> #include <media/stagefright/foundation/ColorUtils.h> #include <utils/RefBase.h> #include "InputSurfaceWrapper.h" Loading Loading @@ -125,7 +124,6 @@ struct CCodecConfig { std::shared_ptr<InputSurfaceWrapper> mInputSurface; std::unique_ptr<InputSurfaceWrapper::Config> mISConfig; ColorAspects mClientColorAspects; /// the current configuration. Updated after configure() and based on configUpdate in /// onWorkDone Loading media/codec2/sfplugin/InputSurfaceWrapper.h +0 −2 Original line number Diff line number Diff line Loading @@ -106,8 +106,6 @@ public: */ virtual void onInputBufferDone(c2_cntr64_t /* index */) {} virtual android_dataspace getDataspace() { return mDataSpace; } protected: android_dataspace mDataSpace; }; Loading Loading
media/codec2/sfplugin/C2OMXNode.cpp +1 −37 Original line number Diff line number Diff line Loading @@ -33,14 +33,12 @@ #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 @@ -73,25 +71,6 @@ 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(dataspace) & HAL_DATASPACE_STANDARD_MASK) >> HAL_DATASPACE_STANDARD_SHIFT; int32_t transfer = (int32_t(dataspace) & HAL_DATASPACE_TRANSFER_MASK) >> HAL_DATASPACE_TRANSFER_SHIFT; int32_t range = (int32_t(dataspace) & HAL_DATASPACE_RANGE_MASK) >> HAL_DATASPACE_RANGE_SHIFT; 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 @@ -123,9 +102,6 @@ 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 @@ -143,7 +119,6 @@ protected: queued = true; } if (queued) { jobs->configUpdate.clear(); return true; } if (i == 0) { Loading Loading @@ -186,7 +161,6 @@ 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 @@ -198,9 +172,6 @@ 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 @@ -488,11 +459,8 @@ 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 @@ -525,8 +493,4 @@ 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 +0 −3 Original line number Diff line number Diff line Loading @@ -93,8 +93,6 @@ struct C2OMXNode : public BnOMXNode { */ void onInputBufferDone(c2_cntr64_t index); android_dataspace getDataspace(); private: std::weak_ptr<Codec2Client::Component> mComp; sp<IOMXBufferSource> mBufferSource; Loading @@ -103,7 +101,6 @@ private: uint32_t mWidth; uint32_t mHeight; uint64_t mUsage; Mutexed<android_dataspace> mDataspace; // WORKAROUND: timestamp adjustment Loading
media/codec2/sfplugin/CCodec.cpp +7 −54 Original line number Diff line number Diff line Loading @@ -211,6 +211,8 @@ 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 @@ -409,10 +411,6 @@ public: mNode->onInputBufferDone(index); } android_dataspace getDataspace() override { return mNode->getDataspace(); } private: sp<HGraphicBufferSource> mSource; sp<C2OMXNode> mNode; Loading Loading @@ -1030,9 +1028,6 @@ void CCodec::configure(const sp<AMessage> &msg) { } } // get color aspects getColorAspectsFromFormat(msg, config->mClientColorAspects); /* * Handle dataspace */ Loading @@ -1042,12 +1037,12 @@ void CCodec::configure(const sp<AMessage> &msg) { int32_t width, height; if (msg->findInt32("width", &width) && msg->findInt32("height", &height)) { setDefaultCodecColorAspectsIfNeeded(config->mClientColorAspects, width, height); ColorAspects aspects; getColorAspectsFromFormat(msg, aspects); setDefaultCodecColorAspectsIfNeeded(aspects, width, height); // TODO: read dataspace / color aspect from the component setColorAspectsIntoFormat( config->mClientColorAspects, const_cast<sp<AMessage> &>(msg)); dataSpace = getDataSpaceForColorAspects( config->mClientColorAspects, true /* mayexpand */); setColorAspectsIntoFormat(aspects, const_cast<sp<AMessage> &>(msg)); dataSpace = getDataSpaceForColorAspects(aspects, true /* mayexpand */); } msg->setInt32("android._dataspace", (int32_t)dataSpace); ALOGD("setting dataspace to %x", dataSpace); Loading Loading @@ -1985,44 +1980,6 @@ void CCodec::onInputBufferDone(uint64_t frameIndex, size_t arrayIndex) { } } static void HandleDataspace( android_dataspace dataspace, ColorAspects *colorAspects, sp<AMessage> *format) { ColorUtils::convertDataSpaceToV0(dataspace); int32_t range, standard, transfer; range = (dataspace & HAL_DATASPACE_RANGE_MASK) >> HAL_DATASPACE_RANGE_SHIFT; if (range == 0) { range = ColorUtils::wrapColorAspectsIntoColorRange( colorAspects->mRange); } standard = (dataspace & HAL_DATASPACE_STANDARD_MASK) >> HAL_DATASPACE_STANDARD_SHIFT; if (standard == 0) { standard = ColorUtils::wrapColorAspectsIntoColorStandard( colorAspects->mPrimaries, colorAspects->mMatrixCoeffs); } transfer = (dataspace & HAL_DATASPACE_TRANSFER_MASK) >> HAL_DATASPACE_TRANSFER_SHIFT; if (transfer == 0) { transfer = ColorUtils::wrapColorAspectsIntoColorTransfer( colorAspects->mTransfer); } ColorAspects newColorAspects; ColorUtils::convertPlatformColorAspectsToCodecAspects( range, standard, transfer, newColorAspects); if (ColorUtils::checkIfAspectsChangedAndUnspecifyThem( newColorAspects, *colorAspects)) { *format = (*format)->dup(); (*format)->setInt32(KEY_COLOR_RANGE, range); (*format)->setInt32(KEY_COLOR_STANDARD, standard); (*format)->setInt32(KEY_COLOR_TRANSFER, transfer); // Record current color aspects into |colorAspects|. // NOTE: newColorAspects could have been modified by // checkIfAspectsChangedAndUnspecifyThem() above, // so *colorAspects = newColorAspects does not work as intended. ColorUtils::convertPlatformColorAspectsToCodecAspects( range, standard, transfer, *colorAspects); } } void CCodec::onMessageReceived(const sp<AMessage> &msg) { TimePoint now = std::chrono::steady_clock::now(); CCodecWatchdog::getInstance()->watch(this); Loading Loading @@ -2137,10 +2094,6 @@ void CCodec::onMessageReceived(const sp<AMessage> &msg) { sp<AMessage> outputFormat = config->mOutputFormat; config->updateConfiguration(updates, config->mOutputDomain); if (config->mInputSurface) { android_dataspace ds = config->mInputSurface->getDataspace(); HandleDataspace(ds, &config->mClientColorAspects, &config->mOutputFormat); } RevertOutputFormatIfNeeded(outputFormat, config->mOutputFormat); // copy standard infos to graphic buffers if not already present (otherwise, we Loading
media/codec2/sfplugin/CCodecConfig.h +0 −2 Original line number Diff line number Diff line Loading @@ -27,7 +27,6 @@ #include <C2Debug.h> #include <codec2/hidl/client.h> #include <media/stagefright/foundation/ColorUtils.h> #include <utils/RefBase.h> #include "InputSurfaceWrapper.h" Loading Loading @@ -125,7 +124,6 @@ struct CCodecConfig { std::shared_ptr<InputSurfaceWrapper> mInputSurface; std::unique_ptr<InputSurfaceWrapper::Config> mISConfig; ColorAspects mClientColorAspects; /// the current configuration. Updated after configure() and based on configUpdate in /// onWorkDone Loading
media/codec2/sfplugin/InputSurfaceWrapper.h +0 −2 Original line number Diff line number Diff line Loading @@ -106,8 +106,6 @@ public: */ virtual void onInputBufferDone(c2_cntr64_t /* index */) {} virtual android_dataspace getDataspace() { return mDataSpace; } protected: android_dataspace mDataSpace; }; Loading