Loading media/codec2/components/mpeg4_h263/C2SoftMpeg4Enc.cpp +14 −0 Original line number Diff line number Diff line Loading @@ -448,6 +448,20 @@ void C2SoftMpeg4Enc::process( work->worklets.front()->output.configUpdate.push_back(std::move(csd)); } // handle dynamic bitrate change { IntfImpl::Lock lock = mIntf->lock(); std::shared_ptr<C2StreamBitrateInfo::output> bitrate = mIntf->getBitrate_l(); lock.unlock(); if (bitrate != mBitrate) { mBitrate = bitrate; int layerBitrate[2] = {static_cast<int>(mBitrate->value), 0}; ALOGV("Calling PVUpdateBitRate %d", layerBitrate[0]); PVUpdateBitRate(mHandle, layerBitrate); } } std::shared_ptr<const C2GraphicView> rView; std::shared_ptr<C2Buffer> inputBuffer; bool eos = ((work->input.flags & C2FrameData::FLAG_END_OF_STREAM) != 0); Loading media/codec2/hidl/1.0/utils/InputSurfaceConnection.cpp +2 −0 Original line number Diff line number Diff line Loading @@ -201,6 +201,8 @@ struct InputSurfaceConnection::Impl : public ComponentWrapper { c2_status_t err = mAllocator->priorGraphicAllocation(handle, &alloc); mAllocatorMutex.unlock(); if (err != OK) { native_handle_close(handle); native_handle_delete(handle); return UNKNOWN_ERROR; } std::shared_ptr<C2GraphicBlock> block = Loading media/codec2/sfplugin/C2OMXNode.cpp +3 −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 @@ -421,6 +392,8 @@ status_t C2OMXNode::emptyBuffer( if (err != OK) { (void)fd0.release(); (void)fd1.release(); native_handle_close(handle); native_handle_delete(handle); return UNKNOWN_ERROR; } block = _C2BlockFactory::CreateGraphicBlock(alloc); Loading Loading @@ -488,11 +461,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 +495,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 @@ -1031,9 +1029,6 @@ void CCodec::configure(const sp<AMessage> &msg) { } } // get color aspects getColorAspectsFromFormat(msg, config->mClientColorAspects); /* * Handle dataspace */ Loading @@ -1043,12 +1038,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 @@ -1987,44 +1982,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 @@ -2139,10 +2096,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 Loading
media/codec2/components/mpeg4_h263/C2SoftMpeg4Enc.cpp +14 −0 Original line number Diff line number Diff line Loading @@ -448,6 +448,20 @@ void C2SoftMpeg4Enc::process( work->worklets.front()->output.configUpdate.push_back(std::move(csd)); } // handle dynamic bitrate change { IntfImpl::Lock lock = mIntf->lock(); std::shared_ptr<C2StreamBitrateInfo::output> bitrate = mIntf->getBitrate_l(); lock.unlock(); if (bitrate != mBitrate) { mBitrate = bitrate; int layerBitrate[2] = {static_cast<int>(mBitrate->value), 0}; ALOGV("Calling PVUpdateBitRate %d", layerBitrate[0]); PVUpdateBitRate(mHandle, layerBitrate); } } std::shared_ptr<const C2GraphicView> rView; std::shared_ptr<C2Buffer> inputBuffer; bool eos = ((work->input.flags & C2FrameData::FLAG_END_OF_STREAM) != 0); Loading
media/codec2/hidl/1.0/utils/InputSurfaceConnection.cpp +2 −0 Original line number Diff line number Diff line Loading @@ -201,6 +201,8 @@ struct InputSurfaceConnection::Impl : public ComponentWrapper { c2_status_t err = mAllocator->priorGraphicAllocation(handle, &alloc); mAllocatorMutex.unlock(); if (err != OK) { native_handle_close(handle); native_handle_delete(handle); return UNKNOWN_ERROR; } std::shared_ptr<C2GraphicBlock> block = Loading
media/codec2/sfplugin/C2OMXNode.cpp +3 −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 @@ -421,6 +392,8 @@ status_t C2OMXNode::emptyBuffer( if (err != OK) { (void)fd0.release(); (void)fd1.release(); native_handle_close(handle); native_handle_delete(handle); return UNKNOWN_ERROR; } block = _C2BlockFactory::CreateGraphicBlock(alloc); Loading Loading @@ -488,11 +461,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 +495,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 @@ -1031,9 +1029,6 @@ void CCodec::configure(const sp<AMessage> &msg) { } } // get color aspects getColorAspectsFromFormat(msg, config->mClientColorAspects); /* * Handle dataspace */ Loading @@ -1043,12 +1038,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 @@ -1987,44 +1982,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 @@ -2139,10 +2096,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