summaryrefslogtreecommitdiffstats
path: root/services
diff options
context:
space:
mode:
authorEino-Ville Talvala <etalvala@google.com>2015-09-25 16:52:55 -0700
committerEino-Ville Talvala <etalvala@google.com>2015-09-26 11:22:20 -0700
commitf99498ee4de7123e2fd71778c6877be44fbd1506 (patch)
tree76fc5f13ab660c053101f09a701187259952e90a /services
parent8595eaab5884bb74d884d366ad6e371a296bf576 (diff)
downloadframeworks_av-f99498ee4de7123e2fd71778c6877be44fbd1506.zip
frameworks_av-f99498ee4de7123e2fd71778c6877be44fbd1506.tar.gz
frameworks_av-f99498ee4de7123e2fd71778c6877be44fbd1506.tar.bz2
CameraService: Use SCHED_FIFO for request queue thread in HFR
- Move SchedulingPolicyService from audioservice to mediautils - When starting up a high speed stream config, set request queue thread to SCHED_FIFO using SchedulingPolicyService Bug: 24227252 Change-Id: I224b59142bd111caf563779f55cddd62385b9bac
Diffstat (limited to 'services')
-rw-r--r--services/audioflinger/Android.mk15
-rw-r--r--services/audioflinger/ISchedulingPolicyService.cpp80
-rw-r--r--services/audioflinger/ISchedulingPolicyService.h45
-rw-r--r--services/audioflinger/SchedulingPolicyService.cpp62
-rw-r--r--services/audioflinger/SchedulingPolicyService.h31
-rw-r--r--services/audioflinger/Threads.cpp2
-rw-r--r--services/camera/libcameraservice/Android.mk2
-rw-r--r--services/camera/libcameraservice/device3/Camera3Device.cpp16
-rw-r--r--services/camera/libcameraservice/device3/Camera3Device.h2
9 files changed, 22 insertions, 233 deletions
diff --git a/services/audioflinger/Android.mk b/services/audioflinger/Android.mk
index debcdf9..9b4ba79 100644
--- a/services/audioflinger/Android.mk
+++ b/services/audioflinger/Android.mk
@@ -3,17 +3,6 @@ LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := \
- ISchedulingPolicyService.cpp \
- SchedulingPolicyService.cpp
-
-# FIXME Move this library to frameworks/native
-LOCAL_MODULE := libscheduling_policy
-
-include $(BUILD_STATIC_LIBRARY)
-
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := \
ServiceUtilities.cpp
# FIXME Move this library to frameworks/native
@@ -64,10 +53,10 @@ LOCAL_SHARED_LIBRARIES := \
libeffects \
libpowermanager \
libserviceutility \
- libsonic
+ libsonic \
+ libmediautils
LOCAL_STATIC_LIBRARIES := \
- libscheduling_policy \
libcpustats \
libmedia_helper
diff --git a/services/audioflinger/ISchedulingPolicyService.cpp b/services/audioflinger/ISchedulingPolicyService.cpp
deleted file mode 100644
index f55bc02..0000000
--- a/services/audioflinger/ISchedulingPolicyService.cpp
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#define LOG_TAG "ISchedulingPolicyService"
-//#define LOG_NDEBUG 0
-
-#include <binder/Parcel.h>
-#include "ISchedulingPolicyService.h"
-
-namespace android {
-
-// Keep in sync with frameworks/base/core/java/android/os/ISchedulingPolicyService.aidl
-enum {
- REQUEST_PRIORITY_TRANSACTION = IBinder::FIRST_CALL_TRANSACTION,
-};
-
-// ----------------------------------------------------------------------
-
-class BpSchedulingPolicyService : public BpInterface<ISchedulingPolicyService>
-{
-public:
- BpSchedulingPolicyService(const sp<IBinder>& impl)
- : BpInterface<ISchedulingPolicyService>(impl)
- {
- }
-
- virtual int requestPriority(int32_t pid, int32_t tid, int32_t prio, bool asynchronous)
- {
- Parcel data, reply;
- data.writeInterfaceToken(ISchedulingPolicyService::getInterfaceDescriptor());
- data.writeInt32(pid);
- data.writeInt32(tid);
- data.writeInt32(prio);
- uint32_t flags = asynchronous ? IBinder::FLAG_ONEWAY : 0;
- status_t status = remote()->transact(REQUEST_PRIORITY_TRANSACTION, data, &reply, flags);
- if (status != NO_ERROR) {
- return status;
- }
- if (asynchronous) {
- return NO_ERROR;
- }
- // fail on exception: force binder reconnection
- if (reply.readExceptionCode() != 0) {
- return DEAD_OBJECT;
- }
- return reply.readInt32();
- }
-};
-
-IMPLEMENT_META_INTERFACE(SchedulingPolicyService, "android.os.ISchedulingPolicyService");
-
-// ----------------------------------------------------------------------
-
-status_t BnSchedulingPolicyService::onTransact(
- uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
-{
- switch (code) {
- case REQUEST_PRIORITY_TRANSACTION:
- // Not reached
- return NO_ERROR;
- break;
- default:
- return BBinder::onTransact(code, data, reply, flags);
- }
-}
-
-} // namespace android
diff --git a/services/audioflinger/ISchedulingPolicyService.h b/services/audioflinger/ISchedulingPolicyService.h
deleted file mode 100644
index b94b191..0000000
--- a/services/audioflinger/ISchedulingPolicyService.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef ANDROID_ISCHEDULING_POLICY_SERVICE_H
-#define ANDROID_ISCHEDULING_POLICY_SERVICE_H
-
-#include <binder/IInterface.h>
-
-namespace android {
-
-class ISchedulingPolicyService : public IInterface
-{
-public:
- DECLARE_META_INTERFACE(SchedulingPolicyService);
-
- virtual int requestPriority(/*pid_t*/int32_t pid, /*pid_t*/int32_t tid,
- int32_t prio, bool asynchronous) = 0;
-
-};
-
-class BnSchedulingPolicyService : public BnInterface<ISchedulingPolicyService>
-{
-public:
- virtual status_t onTransact( uint32_t code,
- const Parcel& data,
- Parcel* reply,
- uint32_t flags = 0);
-};
-
-} // namespace android
-
-#endif // ANDROID_ISCHEDULING_POLICY_SERVICE_H
diff --git a/services/audioflinger/SchedulingPolicyService.cpp b/services/audioflinger/SchedulingPolicyService.cpp
deleted file mode 100644
index 70a3f1a..0000000
--- a/services/audioflinger/SchedulingPolicyService.cpp
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#define LOG_TAG "SchedulingPolicyService"
-//#define LOG_NDEBUG 0
-
-#include <binder/IServiceManager.h>
-#include <utils/Mutex.h>
-#include "ISchedulingPolicyService.h"
-#include "SchedulingPolicyService.h"
-
-namespace android {
-
-static sp<ISchedulingPolicyService> sSchedulingPolicyService;
-static const String16 _scheduling_policy("scheduling_policy");
-static Mutex sMutex;
-
-int requestPriority(pid_t pid, pid_t tid, int32_t prio, bool asynchronous)
-{
- // FIXME merge duplicated code related to service lookup, caching, and error recovery
- int ret;
- for (;;) {
- sMutex.lock();
- sp<ISchedulingPolicyService> sps = sSchedulingPolicyService;
- sMutex.unlock();
- if (sps == 0) {
- sp<IBinder> binder = defaultServiceManager()->checkService(_scheduling_policy);
- if (binder == 0) {
- sleep(1);
- continue;
- }
- sps = interface_cast<ISchedulingPolicyService>(binder);
- sMutex.lock();
- sSchedulingPolicyService = sps;
- sMutex.unlock();
- }
- ret = sps->requestPriority(pid, tid, prio, asynchronous);
- if (ret != DEAD_OBJECT) {
- break;
- }
- ALOGW("SchedulingPolicyService died");
- sMutex.lock();
- sSchedulingPolicyService.clear();
- sMutex.unlock();
- }
- return ret;
-}
-
-} // namespace android
diff --git a/services/audioflinger/SchedulingPolicyService.h b/services/audioflinger/SchedulingPolicyService.h
deleted file mode 100644
index a9870d4..0000000
--- a/services/audioflinger/SchedulingPolicyService.h
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _ANDROID_SCHEDULING_POLICY_SERVICE_H
-#define _ANDROID_SCHEDULING_POLICY_SERVICE_H
-
-namespace android {
-
-// Request elevated priority for thread tid, whose thread group leader must be pid.
-// The priority parameter is currently restricted to either 1 or 2.
-// The asynchronous parameter should be 'true' to return immediately,
-// after the request is enqueued but not necessarily executed.
-// The default value 'false' means to return after request has been enqueued and executed.
-int requestPriority(pid_t pid, pid_t tid, int32_t prio, bool asynchronous = false);
-
-} // namespace android
-
-#endif // _ANDROID_SCHEDULING_POLICY_SERVICE_H
diff --git a/services/audioflinger/Threads.cpp b/services/audioflinger/Threads.cpp
index 5bd9149..f586291 100644
--- a/services/audioflinger/Threads.cpp
+++ b/services/audioflinger/Threads.cpp
@@ -60,7 +60,7 @@
#include "FastMixer.h"
#include "FastCapture.h"
#include "ServiceUtilities.h"
-#include "SchedulingPolicyService.h"
+#include "mediautils/SchedulingPolicyService.h"
#ifdef ADD_BATTERY_DATA
#include <media/IMediaPlayerService.h>
diff --git a/services/camera/libcameraservice/Android.mk b/services/camera/libcameraservice/Android.mk
index e8ef24e..45900c4 100644
--- a/services/camera/libcameraservice/Android.mk
+++ b/services/camera/libcameraservice/Android.mk
@@ -53,7 +53,7 @@ LOCAL_SRC_FILES:= \
device3/StatusTracker.cpp \
gui/RingBufferConsumer.cpp \
utils/CameraTraces.cpp \
- utils/AutoConditionLock.cpp \
+ utils/AutoConditionLock.cpp
LOCAL_SHARED_LIBRARIES:= \
libui \
diff --git a/services/camera/libcameraservice/device3/Camera3Device.cpp b/services/camera/libcameraservice/device3/Camera3Device.cpp
index 433a745..1a3a770 100644
--- a/services/camera/libcameraservice/device3/Camera3Device.cpp
+++ b/services/camera/libcameraservice/device3/Camera3Device.cpp
@@ -44,6 +44,7 @@
#include <utils/Timers.h>
#include "utils/CameraTraces.h"
+#include "mediautils/SchedulingPolicyService.h"
#include "device3/Camera3Device.h"
#include "device3/Camera3OutputStream.h"
#include "device3/Camera3InputStream.h"
@@ -1766,6 +1767,21 @@ status_t Camera3Device::configureStreamsLocked() {
// across configure_streams() calls
mRequestThread->configurationComplete();
+ // Boost priority of request thread for high speed recording to SCHED_FIFO
+ if (mIsConstrainedHighSpeedConfiguration) {
+ pid_t requestThreadTid = mRequestThread->getTid();
+ res = requestPriority(getpid(), requestThreadTid,
+ kConstrainedHighSpeedThreadPriority, true);
+ if (res != OK) {
+ ALOGW("Can't set realtime priority for request processing thread: %s (%d)",
+ strerror(-res), res);
+ } else {
+ ALOGD("Set real time priority for request queue thread (tid %d)", requestThreadTid);
+ }
+ } else {
+ // TODO: Set/restore normal priority for normal use cases
+ }
+
// Update device state
mNeedConfig = false;
diff --git a/services/camera/libcameraservice/device3/Camera3Device.h b/services/camera/libcameraservice/device3/Camera3Device.h
index 9d3c533..402cb1d 100644
--- a/services/camera/libcameraservice/device3/Camera3Device.h
+++ b/services/camera/libcameraservice/device3/Camera3Device.h
@@ -161,6 +161,8 @@ class Camera3Device :
static const nsecs_t kActiveTimeout = 500000000; // 500 ms
static const size_t kInFlightWarnLimit = 20;
static const size_t kInFlightWarnLimitHighSpeed = 256; // batch size 32 * pipe depth 8
+ // SCHED_FIFO priority for request submission thread in HFR mode
+ static const int kConstrainedHighSpeedThreadPriority = 3;
struct RequestTrigger;
// minimal jpeg buffer size: 256KB + blob header