diff --git a/media/codec2/sfplugin/C2OMXNode.cpp b/media/codec2/sfplugin/C2OMXNode.cpp
index 466eedc..3a7af10 100644
--- a/media/codec2/sfplugin/C2OMXNode.cpp
+++ b/media/codec2/sfplugin/C2OMXNode.cpp
@@ -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 {
@@ -73,25 +71,6 @@
         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
@@ -123,9 +102,6 @@
                     uniqueFds.push_back(std::move(queue.workList.front().fd1));
                     queue.workList.pop_front();
                 }
-                for (const std::unique_ptr<C2Param> &param : jobs->configUpdate) {
-                    items.front()->input.configUpdate.emplace_back(C2Param::Copy(*param));
-                }
 
                 jobs.unlock();
                 for (int fenceFd : fenceFds) {
@@ -143,7 +119,6 @@
                 queued = true;
             }
             if (queued) {
-                jobs->configUpdate.clear();
                 return true;
             }
             if (i == 0) {
@@ -186,7 +161,6 @@
         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;
@@ -198,9 +172,6 @@
       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() {
@@ -490,11 +461,8 @@
     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;
 }
 
@@ -527,8 +495,4 @@
     (void)mBufferSource->onInputBufferEmptied(bufferId, -1);
 }
 
-android_dataspace C2OMXNode::getDataspace() {
-    return *mDataspace.lock();
-}
-
 }  // namespace android
diff --git a/media/codec2/sfplugin/C2OMXNode.h b/media/codec2/sfplugin/C2OMXNode.h
index 5d587bc..1717c96 100644
--- a/media/codec2/sfplugin/C2OMXNode.h
+++ b/media/codec2/sfplugin/C2OMXNode.h
@@ -93,8 +93,6 @@
      */
     void onInputBufferDone(c2_cntr64_t index);
 
-    android_dataspace getDataspace();
-
 private:
     std::weak_ptr<Codec2Client::Component> mComp;
     sp<IOMXBufferSource> mBufferSource;
@@ -103,7 +101,6 @@
     uint32_t mWidth;
     uint32_t mHeight;
     uint64_t mUsage;
-    Mutexed<android_dataspace> mDataspace;
 
     // WORKAROUND: timestamp adjustment
 
diff --git a/media/codec2/sfplugin/CCodec.cpp b/media/codec2/sfplugin/CCodec.cpp
index fe451f6..af11592 100644
--- a/media/codec2/sfplugin/CCodec.cpp
+++ b/media/codec2/sfplugin/CCodec.cpp
@@ -211,6 +211,8 @@
                 (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;
@@ -409,10 +411,6 @@
         mNode->onInputBufferDone(index);
     }
 
-    android_dataspace getDataspace() override {
-        return mNode->getDataspace();
-    }
-
 private:
     sp<HGraphicBufferSource> mSource;
     sp<C2OMXNode> mNode;
@@ -1031,9 +1029,6 @@
             }
         }
 
-        // get color aspects
-        getColorAspectsFromFormat(msg, config->mClientColorAspects);
-
         /*
          * Handle dataspace
          */
@@ -1043,12 +1038,12 @@
             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);
@@ -1987,44 +1982,6 @@
     }
 }
 
-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);
@@ -2139,10 +2096,6 @@
 
                 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
diff --git a/media/codec2/sfplugin/CCodecConfig.h b/media/codec2/sfplugin/CCodecConfig.h
index d9116f7..7e060f6 100644
--- a/media/codec2/sfplugin/CCodecConfig.h
+++ b/media/codec2/sfplugin/CCodecConfig.h
@@ -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"
@@ -125,7 +124,6 @@
 
     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
diff --git a/media/codec2/sfplugin/InputSurfaceWrapper.h b/media/codec2/sfplugin/InputSurfaceWrapper.h
index d29738c..479acb1 100644
--- a/media/codec2/sfplugin/InputSurfaceWrapper.h
+++ b/media/codec2/sfplugin/InputSurfaceWrapper.h
@@ -106,8 +106,6 @@
      */
     virtual void onInputBufferDone(c2_cntr64_t /* index */) {}
 
-    virtual android_dataspace getDataspace() { return mDataSpace; }
-
 protected:
     android_dataspace mDataSpace;
 };
