transcoding: Make Mpeg4writer thread run with background priority
in transcoding usage.
Bug: 183751395
Test: build_and_run_all_unit_tests.sh
Change-Id: Ib1d34a839364825f71cee3c103681b72b4843330
diff --git a/media/libstagefright/MPEG4Writer.cpp b/media/libstagefright/MPEG4Writer.cpp
index 5c39239..7c7fcac 100644
--- a/media/libstagefright/MPEG4Writer.cpp
+++ b/media/libstagefright/MPEG4Writer.cpp
@@ -522,6 +522,7 @@
// Reset following variables for all the sessions and they will be
// initialized in start(MetaData *param).
mIsRealTimeRecording = true;
+ mIsBackgroundMode = false;
mUse4ByteNalLength = true;
mOffset = 0;
mMaxOffsetAppend = 0;
@@ -662,6 +663,14 @@
sp<MetaData> meta = source->getFormat();
meta->findCString(kKeyMIMEType, &mime);
+
+ // Background mode for media transcoding. If either audio or video track signal this is in
+ // background mode, we will set all the threads to run in background priority.
+ int32_t isBackgroundMode;
+ if (meta && meta->findInt32(kKeyBackgroundMode, &isBackgroundMode)) {
+ mIsBackgroundMode |= isBackgroundMode;
+ }
+
if (Track::getFourCCForMime(mime) == NULL) {
ALOGE("Unsupported mime '%s'", mime);
return ERROR_UNSUPPORTED;
@@ -2309,7 +2318,11 @@
if (mLooper == nullptr) {
mLooper = new ALooper;
mLooper->setName("MP4WtrCtrlHlpLooper");
- err = mLooper->start();
+ if (mIsBackgroundMode) {
+ err = mLooper->start(false, false, ANDROID_PRIORITY_BACKGROUND);
+ } else {
+ err = mLooper->start();
+ }
mReflector = new AHandlerReflector<MPEG4Writer>(this);
mLooper->registerHandler(mReflector);
}
@@ -2778,6 +2791,11 @@
prctl(PR_SET_NAME, (unsigned long)"MPEG4Writer", 0, 0, 0);
+ if (mIsBackgroundMode) {
+ // Background priority for media transcoding.
+ androidSetThreadPriority(0 /* tid (0 = current) */, ANDROID_PRIORITY_BACKGROUND);
+ }
+
Mutex::Autolock autoLock(mLock);
while (!mDone) {
Chunk chunk;
@@ -3379,6 +3397,9 @@
if (mOwner->isRealTimeRecording()) {
androidSetThreadPriority(0, ANDROID_PRIORITY_AUDIO);
+ } else if (mOwner->isBackgroundMode()) {
+ // Background priority for media transcoding.
+ androidSetThreadPriority(0 /* tid (0 = current) */, ANDROID_PRIORITY_BACKGROUND);
}
sp<MetaData> meta_data;
@@ -4076,6 +4097,10 @@
return mIsRealTimeRecording;
}
+bool MPEG4Writer::isBackgroundMode() const {
+ return mIsBackgroundMode;
+}
+
bool MPEG4Writer::useNalLengthFour() {
return mUse4ByteNalLength;
}
@@ -5393,4 +5418,4 @@
endBox();
}
-} // namespace android
\ No newline at end of file
+} // namespace android
diff --git a/media/libstagefright/Utils.cpp b/media/libstagefright/Utils.cpp
index 04a9b17..a369aef 100644
--- a/media/libstagefright/Utils.cpp
+++ b/media/libstagefright/Utils.cpp
@@ -1707,6 +1707,12 @@
meta->setInt32(kKeyIsSyncFrame, 1);
}
+ // Mode for media transcoding.
+ int32_t isBackgroundMode;
+ if (msg->findInt32("android._background-mode", &isBackgroundMode) && isBackgroundMode != 0) {
+ meta->setInt32(isBackgroundMode, 1);
+ }
+
int32_t avgBitrate = 0;
int32_t maxBitrate;
if (msg->findInt32("bitrate", &avgBitrate) && avgBitrate > 0) {
diff --git a/media/libstagefright/include/media/stagefright/MPEG4Writer.h b/media/libstagefright/include/media/stagefright/MPEG4Writer.h
index 7f2728e..7c3eca6 100644
--- a/media/libstagefright/include/media/stagefright/MPEG4Writer.h
+++ b/media/libstagefright/include/media/stagefright/MPEG4Writer.h
@@ -97,6 +97,7 @@
sp<MetaData> mStartMeta;
status_t mInitCheck;
bool mIsRealTimeRecording;
+ bool mIsBackgroundMode;
bool mUse4ByteNalLength;
bool mIsFileSizeLimitExplicitlyRequested;
bool mPaused;
@@ -275,6 +276,10 @@
// By default, real time recording is on.
bool isRealTimeRecording() const;
+ // Return whether the writer is used in background mode for media
+ // transcoding.
+ bool isBackgroundMode() const;
+
void lock();
void unlock();
diff --git a/media/libstagefright/include/media/stagefright/MetaDataBase.h b/media/libstagefright/include/media/stagefright/MetaDataBase.h
index 408872f..08925b5 100644
--- a/media/libstagefright/include/media/stagefright/MetaDataBase.h
+++ b/media/libstagefright/include/media/stagefright/MetaDataBase.h
@@ -127,6 +127,8 @@
kKeyTrackTimeStatus = 'tktm', // int64_t
kKeyRealTimeRecording = 'rtrc', // bool (int32_t)
+ kKeyBackgroundMode = 'bkmd', // bool (int32_t)
+
kKeyNumBuffers = 'nbbf', // int32_t
// Ogg files can be tagged to be automatically looping...