MediaCodec: add background mode
Bug: 183751395
Test: manual
Change-Id: If60634c62d44bb828ba309ce376daeddd5d6332f
diff --git a/media/codec2/sfplugin/C2OMXNode.cpp b/media/codec2/sfplugin/C2OMXNode.cpp
index f66dc11..c049187 100644
--- a/media/codec2/sfplugin/C2OMXNode.cpp
+++ b/media/codec2/sfplugin/C2OMXNode.cpp
@@ -90,6 +90,10 @@
}
}
+ void setPriority(int priority) {
+ androidSetThreadPriority(getTid(), priority);
+ }
+
protected:
bool threadLoop() override {
constexpr nsecs_t kIntervalNs = nsecs_t(10) * 1000 * 1000; // 10ms
@@ -529,4 +533,8 @@
return *mDataspace.lock();
}
+void C2OMXNode::setPriority(int priority) {
+ mQueueThread->setPriority(priority);
+}
+
} // namespace android
diff --git a/media/codec2/sfplugin/C2OMXNode.h b/media/codec2/sfplugin/C2OMXNode.h
index 9c04969..6669318 100644
--- a/media/codec2/sfplugin/C2OMXNode.h
+++ b/media/codec2/sfplugin/C2OMXNode.h
@@ -98,6 +98,11 @@
*/
android_dataspace getDataspace();
+ /**
+ * Sets priority of the queue thread.
+ */
+ void setPriority(int priority);
+
private:
std::weak_ptr<Codec2Client::Component> mComp;
sp<IOMXBufferSource> mBufferSource;
diff --git a/media/codec2/sfplugin/CCodec.cpp b/media/codec2/sfplugin/CCodec.cpp
index 15d2989..0a895b0 100644
--- a/media/codec2/sfplugin/CCodec.cpp
+++ b/media/codec2/sfplugin/CCodec.cpp
@@ -397,6 +397,14 @@
// consumer usage is queried earlier.
+ // priority
+ if (mConfig.mPriority != config.mPriority) {
+ if (config.mPriority != INT_MAX) {
+ mNode->setPriority(config.mPriority);
+ }
+ mConfig.mPriority = config.mPriority;
+ }
+
if (status.str().empty()) {
ALOGD("ISConfig not changed");
} else {
@@ -944,6 +952,7 @@
}
}
config->mISConfig->mUsage = 0;
+ config->mISConfig->mPriority = INT_MAX;
}
/*
@@ -1135,6 +1144,16 @@
configUpdate.push_back(std::move(qp));
}
+ int32_t background = 0;
+ if ((config->mDomain & Config::IS_VIDEO)
+ && msg->findInt32("android._background-mode", &background)
+ && background) {
+ androidSetThreadPriority(gettid(), ANDROID_PRIORITY_BACKGROUND);
+ if (config->mISConfig) {
+ config->mISConfig->mPriority = ANDROID_PRIORITY_BACKGROUND;
+ }
+ }
+
err = config->setParameters(comp, configUpdate, C2_DONT_BLOCK);
if (err != OK) {
ALOGW("failed to configure c2 params");
diff --git a/media/codec2/sfplugin/InputSurfaceWrapper.h b/media/codec2/sfplugin/InputSurfaceWrapper.h
index 50d600c..44ba78a 100644
--- a/media/codec2/sfplugin/InputSurfaceWrapper.h
+++ b/media/codec2/sfplugin/InputSurfaceWrapper.h
@@ -79,6 +79,7 @@
float mFixedAdjustedFps = 0.0; // fixed fps via PTS manipulation
float mMinAdjustedFps = 0.0; // minimum fps via PTS manipulation
uint64_t mUsage = 0; // consumer usage
+ int mPriority = INT_MAX; // priority of queue thread (if any); INT_MAX for no-op
};
/**
diff --git a/media/libstagefright/MediaCodec.cpp b/media/libstagefright/MediaCodec.cpp
index 50ebeef..944e007 100644
--- a/media/libstagefright/MediaCodec.cpp
+++ b/media/libstagefright/MediaCodec.cpp
@@ -3518,6 +3518,11 @@
mTunneled = false;
}
+ int32_t background = 0;
+ if (format->findInt32("android._background-mode", &background) && background) {
+ androidSetThreadPriority(gettid(), ANDROID_PRIORITY_BACKGROUND);
+ }
+
mCodec->initiateConfigureComponent(format);
break;
}