Merge "Handle gralloc handle leaks"
diff --git a/apex/Android.bp b/apex/Android.bp
index 422880a..39997d2 100644
--- a/apex/Android.bp
+++ b/apex/Android.bp
@@ -36,7 +36,6 @@
apex {
name: "com.android.media.swcodec",
- compile_multilib: "32",
manifest: "manifest_codec.json",
native_shared_libs: [
"libmedia_codecserviceregistrant",
diff --git a/media/ndk/NdkMediaExtractor.cpp b/media/ndk/NdkMediaExtractor.cpp
index 8296598..28e4f12 100644
--- a/media/ndk/NdkMediaExtractor.cpp
+++ b/media/ndk/NdkMediaExtractor.cpp
@@ -46,6 +46,18 @@
sp<ABuffer> mPsshBuf;
};
+sp<ABuffer> U32ArrayToSizeBuf(size_t numSubSamples, uint32_t *data) {
+ if (numSubSamples > SIZE_MAX / sizeof(size_t)) {
+ return NULL;
+ }
+ sp<ABuffer> sizebuf = new ABuffer(numSubSamples * sizeof(size_t));
+ size_t *sizes = (size_t *)sizebuf->data();
+ for (size_t i = 0; sizes != NULL && i < numSubSamples; i++) {
+ sizes[i] = data[i];
+ }
+ return sizebuf;
+}
+
extern "C" {
EXPORT
@@ -339,7 +351,7 @@
if (!meta->findData(kKeyEncryptedSizes, &type, &crypteddata, &cryptedsize)) {
return NULL;
}
- size_t numSubSamples = cryptedsize / sizeof(size_t);
+ size_t numSubSamples = cryptedsize / sizeof(uint32_t);
const void *cleardata;
size_t clearsize;
@@ -373,6 +385,16 @@
mode = CryptoPlugin::kMode_AES_CTR;
}
+ if (sizeof(uint32_t) != sizeof(size_t)) {
+ sp<ABuffer> clearbuf = U32ArrayToSizeBuf(numSubSamples, (uint32_t *)cleardata);
+ sp<ABuffer> cryptedbuf = U32ArrayToSizeBuf(numSubSamples, (uint32_t *)crypteddata);
+ cleardata = clearbuf == NULL ? NULL : clearbuf->data();
+ crypteddata = crypteddata == NULL ? NULL : cryptedbuf->data();
+ if(crypteddata == NULL || cleardata == NULL) {
+ return NULL;
+ }
+ }
+
return AMediaCodecCryptoInfo_new(
numSubSamples,
(uint8_t*) key,
diff --git a/services/audiopolicy/common/managerdefinitions/include/AudioPolicyMix.h b/services/audiopolicy/common/managerdefinitions/include/AudioPolicyMix.h
index e6a62d9..2932296 100644
--- a/services/audiopolicy/common/managerdefinitions/include/AudioPolicyMix.h
+++ b/services/audiopolicy/common/managerdefinitions/include/AudioPolicyMix.h
@@ -23,9 +23,10 @@
#include <system/audio.h>
#include <utils/String8.h>
-namespace android {
+#include <DeviceDescriptor.h>
+#include <AudioOutputDescriptor.h>
-class SwAudioOutputDescriptor;
+namespace android {
/**
* custom mix entry in mPolicyMixes
@@ -79,6 +80,18 @@
const DeviceVector &availableDeviceTypes,
AudioMix **policyMix);
+ /**
+ * @brief try to find a matching mix for a given output descriptor and returns the associated
+ * output device.
+ * @param output to be considered
+ * @param availableOutputDevices list of output devices currently reachable
+ * @param policyMix to be returned if any mix matching ouput descriptor
+ * @return device selected from the mix attached to the output, null pointer otherwise
+ */
+ sp<DeviceDescriptor> getDeviceAndMixForOutput(const sp<SwAudioOutputDescriptor> &output,
+ const DeviceVector &availableOutputDevices,
+ AudioMix **policyMix = nullptr);
+
status_t getInputMixForAttr(audio_attributes_t attr, AudioMix **policyMix);
status_t setUidDeviceAffinities(uid_t uid, const Vector<AudioDeviceTypeAddr>& devices);
diff --git a/services/audiopolicy/common/managerdefinitions/src/AudioPolicyMix.cpp b/services/audiopolicy/common/managerdefinitions/src/AudioPolicyMix.cpp
index 799950c..3b9411a 100644
--- a/services/audiopolicy/common/managerdefinitions/src/AudioPolicyMix.cpp
+++ b/services/audiopolicy/common/managerdefinitions/src/AudioPolicyMix.cpp
@@ -280,6 +280,27 @@
return BAD_VALUE;
}
+sp<DeviceDescriptor> AudioPolicyMixCollection::getDeviceAndMixForOutput(
+ const sp<SwAudioOutputDescriptor> &output,
+ const DeviceVector &availableOutputDevices,
+ AudioMix **policyMix)
+{
+ for (size_t i = 0; i < size(); i++) {
+ if (valueAt(i)->getOutput() == output) {
+ AudioMix *mix = valueAt(i)->getMix();
+ if (policyMix != nullptr)
+ *policyMix = mix;
+ // This Desc is involved in a Mix, which has the highest prio
+ audio_devices_t deviceType = mix->mDeviceType;
+ String8 address = mix->mDeviceAddress;
+ ALOGV("%s: device (0x%x, addr=%s) forced by mix",
+ __FUNCTION__, deviceType, address.c_str());
+ return availableOutputDevices.getDevice(deviceType, address, AUDIO_FORMAT_DEFAULT);
+ }
+ }
+ return nullptr;
+}
+
sp<DeviceDescriptor> AudioPolicyMixCollection::getDeviceAndMixForInputSource(
audio_source_t inputSource, const DeviceVector &availDevices, AudioMix **policyMix)
{
diff --git a/services/audiopolicy/engineconfigurable/parameter-framework/examples/Settings/device_for_strategy_accessibility.pfw b/services/audiopolicy/engineconfigurable/parameter-framework/examples/Settings/device_for_strategy_accessibility.pfw
index eb11980..7c87c80 100644
--- a/services/audiopolicy/engineconfigurable/parameter-framework/examples/Settings/device_for_strategy_accessibility.pfw
+++ b/services/audiopolicy/engineconfigurable/parameter-framework/examples/Settings/device_for_strategy_accessibility.pfw
@@ -28,6 +28,7 @@
TelephonyMode IsNot InCall
TelephonyMode IsNot InCommunication
AvailableOutputDevices Includes RemoteSubmix
+ AvailableOutputDevicesAddresses Includes 0
component: /Policy/policy/strategies/accessibility/selected_output_devices/mask
remote_submix = 1
diff --git a/services/audiopolicy/engineconfigurable/parameter-framework/examples/Settings/device_for_strategy_dtmf.pfw b/services/audiopolicy/engineconfigurable/parameter-framework/examples/Settings/device_for_strategy_dtmf.pfw
index 883c741..c830c42 100644
--- a/services/audiopolicy/engineconfigurable/parameter-framework/examples/Settings/device_for_strategy_dtmf.pfw
+++ b/services/audiopolicy/engineconfigurable/parameter-framework/examples/Settings/device_for_strategy_dtmf.pfw
@@ -20,6 +20,7 @@
TelephonyMode IsNot InCall
TelephonyMode IsNot InCommunication
AvailableOutputDevices Includes RemoteSubmix
+ AvailableOutputDevicesAddresses Includes 0
component: /Policy/policy/strategies/dtmf/selected_output_devices/mask
remote_submix = 1
diff --git a/services/audiopolicy/engineconfigurable/parameter-framework/examples/Settings/device_for_strategy_enforced_audible.pfw b/services/audiopolicy/engineconfigurable/parameter-framework/examples/Settings/device_for_strategy_enforced_audible.pfw
index f504631..c641138 100644
--- a/services/audiopolicy/engineconfigurable/parameter-framework/examples/Settings/device_for_strategy_enforced_audible.pfw
+++ b/services/audiopolicy/engineconfigurable/parameter-framework/examples/Settings/device_for_strategy_enforced_audible.pfw
@@ -61,6 +61,7 @@
domain: Device2
conf: RemoteSubmix
AvailableOutputDevices Includes RemoteSubmix
+ AvailableOutputDevicesAddresses Includes 0
component: /Policy/policy/strategies/enforced_audible/selected_output_devices/mask
remote_submix = 1
diff --git a/services/audiopolicy/engineconfigurable/parameter-framework/examples/Settings/device_for_strategy_media.pfw b/services/audiopolicy/engineconfigurable/parameter-framework/examples/Settings/device_for_strategy_media.pfw
index bdb6ae0..f8bab3d 100644
--- a/services/audiopolicy/engineconfigurable/parameter-framework/examples/Settings/device_for_strategy_media.pfw
+++ b/services/audiopolicy/engineconfigurable/parameter-framework/examples/Settings/device_for_strategy_media.pfw
@@ -19,6 +19,7 @@
domain: Device2
conf: RemoteSubmix
AvailableOutputDevices Includes RemoteSubmix
+ AvailableOutputDevicesAddresses Includes 0
component: /Policy/policy/strategies/media/selected_output_devices/mask
speaker = 0
diff --git a/services/audiopolicy/engineconfigurable/parameter-framework/examples/Settings/device_for_strategy_rerouting.pfw b/services/audiopolicy/engineconfigurable/parameter-framework/examples/Settings/device_for_strategy_rerouting.pfw
index 04e62f7..28a3629 100644
--- a/services/audiopolicy/engineconfigurable/parameter-framework/examples/Settings/device_for_strategy_rerouting.pfw
+++ b/services/audiopolicy/engineconfigurable/parameter-framework/examples/Settings/device_for_strategy_rerouting.pfw
@@ -24,6 +24,7 @@
domain: Device2
conf: RemoteSubmix
AvailableOutputDevices Includes RemoteSubmix
+ AvailableOutputDevicesAddresses Includes 0
component: /Policy/policy/strategies/rerouting/selected_output_devices/mask
remote_submix = 1
diff --git a/services/audiopolicy/engineconfigurable/wrapper/config/policy_criterion_types.xml.in b/services/audiopolicy/engineconfigurable/wrapper/config/policy_criterion_types.xml.in
index 6cb799f..fe17369 100644
--- a/services/audiopolicy/engineconfigurable/wrapper/config/policy_criterion_types.xml.in
+++ b/services/audiopolicy/engineconfigurable/wrapper/config/policy_criterion_types.xml.in
@@ -16,7 +16,12 @@
<criterion_types>
<criterion_type name="OutputDevicesMaskType" type="inclusive"/>
<criterion_type name="InputDevicesMaskType" type="inclusive"/>
- <criterion_type name="OutputDevicesAddressesType" type="inclusive"/>
+ <criterion_type name="OutputDevicesAddressesType" type="inclusive">
+ <values>
+ <!-- legacy remote submix -->
+ <value literal="0" numerical="1"/>
+ </values>
+ </criterion_type>
<criterion_type name="InputDevicesAddressesType" type="inclusive"/>
<criterion_type name="AndroidModeType" type="exclusive"/>
<criterion_type name="BooleanType" type="exclusive">
diff --git a/services/audiopolicy/managerdefault/AudioPolicyManager.cpp b/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
index 0ea3d72..798b45f 100644
--- a/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
+++ b/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
@@ -486,6 +486,7 @@
uint32_t AudioPolicyManager::updateCallRouting(const DeviceVector &rxDevices, uint32_t delayMs)
{
bool createTxPatch = false;
+ bool createRxPatch = false;
uint32_t muteWaitMs = 0;
if(!hasPrimaryOutput() || mPrimaryOutput->devices().types() == AUDIO_DEVICE_OUT_STUB) {
@@ -494,9 +495,10 @@
ALOG_ASSERT(!rxDevices.isEmpty(), "updateCallRouting() no selected output device");
audio_attributes_t attr = { .source = AUDIO_SOURCE_VOICE_COMMUNICATION };
- auto txDevice = getDeviceAndMixForAttributes(attr);
+ auto txSourceDevice = getDeviceAndMixForAttributes(attr);
+ ALOG_ASSERT(txSourceDevice != 0, "updateCallRouting() input selected device not available");
ALOGV("updateCallRouting device rxDevice %s txDevice %s",
- rxDevices.toString().c_str(), txDevice->toString().c_str());
+ rxDevices.itemAt(0)->toString().c_str(), txSourceDevice->toString().c_str());
// release existing RX patch if any
if (mCallRxPatch != 0) {
@@ -509,22 +511,54 @@
mCallTxPatch.clear();
}
- // If the RX device is on the primary HW module, then use legacy routing method for voice calls
- // via setOutputDevice() on primary output.
- // Otherwise, create two audio patches for TX and RX path.
- if (availablePrimaryOutputDevices().contains(rxDevices.itemAt(0))) {
- muteWaitMs = setOutputDevices(mPrimaryOutput, rxDevices, true, delayMs);
+ auto telephonyRxModule =
+ mHwModules.getModuleForDeviceTypes(AUDIO_DEVICE_IN_TELEPHONY_RX, AUDIO_FORMAT_DEFAULT);
+ auto telephonyTxModule =
+ mHwModules.getModuleForDeviceTypes(AUDIO_DEVICE_OUT_TELEPHONY_TX, AUDIO_FORMAT_DEFAULT);
+ // retrieve Rx Source and Tx Sink device descriptors
+ sp<DeviceDescriptor> rxSourceDevice =
+ mAvailableInputDevices.getDevice(AUDIO_DEVICE_IN_TELEPHONY_RX,
+ String8(),
+ AUDIO_FORMAT_DEFAULT);
+ sp<DeviceDescriptor> txSinkDevice =
+ mAvailableOutputDevices.getDevice(AUDIO_DEVICE_OUT_TELEPHONY_TX,
+ String8(),
+ AUDIO_FORMAT_DEFAULT);
+
+ // RX and TX Telephony device are declared by Primary Audio HAL
+ if (isPrimaryModule(telephonyRxModule) && isPrimaryModule(telephonyTxModule) &&
+ (telephonyRxModule->getHalVersionMajor() >= 3)) {
+ if (rxSourceDevice == 0 || txSinkDevice == 0) {
+ // RX / TX Telephony device(s) is(are) not currently available
+ ALOGE("updateCallRouting() no telephony Tx and/or RX device");
+ return muteWaitMs;
+ }
+ // do not create a patch (aka Sw Bridging) if Primary HW module has declared supporting a
+ // route between telephony RX to Sink device and Source device to telephony TX
+ const auto &primaryModule = telephonyRxModule;
+ createRxPatch = !primaryModule->supportsPatch(rxSourceDevice, rxDevices.itemAt(0));
+ createTxPatch = !primaryModule->supportsPatch(txSourceDevice, txSinkDevice);
+ } else {
+ // If the RX device is on the primary HW module, then use legacy routing method for
+ // voice calls via setOutputDevice() on primary output.
+ // Otherwise, create two audio patches for TX and RX path.
+ createRxPatch = !(availablePrimaryOutputDevices().contains(rxDevices.itemAt(0))) &&
+ (rxSourceDevice != 0);
// If the TX device is also on the primary HW module, setOutputDevice() will take care
// of it due to legacy implementation. If not, create a patch.
- if (!availablePrimaryModuleInputDevices().contains(txDevice)) {
- createTxPatch = true;
- }
+ createTxPatch = !(availablePrimaryModuleInputDevices().contains(txSourceDevice)) &&
+ (txSinkDevice != 0);
+ }
+ // Use legacy routing method for voice calls via setOutputDevice() on primary output.
+ // Otherwise, create two audio patches for TX and RX path.
+ if (!createRxPatch) {
+ muteWaitMs = setOutputDevices(mPrimaryOutput, rxDevices, true, delayMs);
} else { // create RX path audio patch
mCallRxPatch = createTelephonyPatch(true /*isRx*/, rxDevices.itemAt(0), delayMs);
- createTxPatch = true;
+ ALOG_ASSERT(createTxPatch, "No Tx Patch will be created, nor legacy routing done");
}
if (createTxPatch) { // create TX path audio patch
- mCallTxPatch = createTelephonyPatch(false /*isRx*/, txDevice, delayMs);
+ mCallTxPatch = createTelephonyPatch(false /*isRx*/, txSourceDevice, delayMs);
}
return muteWaitMs;
@@ -756,6 +790,9 @@
sp<SwAudioOutputDescriptor> outputDesc = mOutputs.valueAt(i);
DeviceVector newDevices = getNewOutputDevices(outputDesc, true /*fromCache*/);
if ((mEngine->getPhoneState() != AUDIO_MODE_IN_CALL) || (outputDesc != mPrimaryOutput)) {
+ // As done in setDeviceConnectionState, we could also fix default device issue by
+ // preventing the force re-routing in case of default dev that distinguishes on address.
+ // Let's give back to engine full device choice decision however.
waitMs = setOutputDevices(outputDesc, newDevices, !newDevices.isEmpty(), delayMs);
}
if (forceVolumeReeval && !newDevices.isEmpty()) {
@@ -2310,10 +2347,11 @@
audio_devices_t device)
{
- // VOICE_CALL stream has minVolumeIndex > 0 but can be muted directly by an
- // app that has MODIFY_PHONE_STATE permission.
+ // VOICE_CALL and BLUETOOTH_SCO stream have minVolumeIndex > 0 but
+ // can be muted directly by an app that has MODIFY_PHONE_STATE permission.
if (((index < mVolumeCurves->getVolumeIndexMin(stream)) &&
- !(stream == AUDIO_STREAM_VOICE_CALL && index == 0)) ||
+ !((stream == AUDIO_STREAM_VOICE_CALL || stream == AUDIO_STREAM_BLUETOOTH_SCO) &&
+ index == 0)) ||
(index > mVolumeCurves->getVolumeIndexMax(stream))) {
return BAD_VALUE;
}
@@ -4939,6 +4977,13 @@
return DeviceVector(device);
}
+ // Legacy Engine cannot take care of bus devices and mix, so we need to handle the conflict
+ // of setForceUse / Default Bus device here
+ device = mPolicyMixes.getDeviceAndMixForOutput(outputDesc, mAvailableOutputDevices);
+ if (device != nullptr) {
+ return DeviceVector(device);
+ }
+
// check the following by order of priority to request a routing change if necessary:
// 1: the strategy enforced audible is active and enforced on the output:
// use device for strategy enforced audible
diff --git a/services/audiopolicy/managerdefault/AudioPolicyManager.h b/services/audiopolicy/managerdefault/AudioPolicyManager.h
index fb1f7cb..de6d489 100644
--- a/services/audiopolicy/managerdefault/AudioPolicyManager.h
+++ b/services/audiopolicy/managerdefault/AudioPolicyManager.h
@@ -517,6 +517,13 @@
return mAudioPatches.removeAudioPatch(handle);
}
+ bool isPrimaryModule(const sp<HwModule> &module) const
+ {
+ if (module == 0 || !hasPrimaryOutput()) {
+ return false;
+ }
+ return module->getHandle() == mPrimaryOutput->getModuleHandle();
+ }
DeviceVector availablePrimaryOutputDevices() const
{
if (!hasPrimaryOutput()) {
diff --git a/services/mediacodec/Android.mk b/services/mediacodec/Android.mk
index a104ee5..6a71d7d 100644
--- a/services/mediacodec/Android.mk
+++ b/services/mediacodec/Android.mk
@@ -70,8 +70,11 @@
# seccomp is not required for coverage build.
ifneq ($(NATIVE_COVERAGE),true)
LOCAL_REQUIRED_MODULES_arm := crash_dump.policy mediaswcodec.policy
+LOCAL_REQUIRED_MODULES_arm64 := crash_dump.policy mediaswcodec.policy
LOCAL_REQUIRED_MODULES_x86 := crash_dump.policy mediaswcodec.policy
+LOCAL_REQUIRED_MODULES_x86_64 := crash_dump.policy mediaswcodec.policy
endif
+
LOCAL_SRC_FILES := \
main_swcodecservice.cpp \
MediaCodecUpdateService.cpp \
@@ -107,8 +110,12 @@
LOCAL_MODULE := mediaswcodec
LOCAL_INIT_RC := mediaswcodec.rc
-LOCAL_32_BIT_ONLY := true
LOCAL_SANITIZE := scudo
+ifeq ($(TARGET_ARCH), $(filter $(TARGET_ARCH), x86_64 arm64))
+ LOCAL_MULTILIB := both
+ LOCAL_MODULE_STEM_32 := $(LOCAL_MODULE)32
+ LOCAL_MODULE_STEM_64 := $(LOCAL_MODULE)
+endif
sanitizer_runtime_libraries :=
llndk_libraries :=
@@ -145,17 +152,7 @@
LOCAL_MODULE := mediaswcodec.policy
LOCAL_MODULE_CLASS := ETC
LOCAL_MODULE_PATH := $(TARGET_OUT)/etc/seccomp_policy
-# mediaswcodec runs in 32-bit combatibility mode. For 64 bit architectures,
-# use the 32 bit policy
-ifdef TARGET_2ND_ARCH
- ifneq ($(TARGET_TRANSLATE_2ND_ARCH),true)
- LOCAL_SRC_FILES := seccomp_policy/mediaswcodec-$(TARGET_2ND_ARCH).policy
- else
- LOCAL_SRC_FILES := seccomp_policy/mediaswcodec-$(TARGET_ARCH).policy
- endif
-else
- LOCAL_SRC_FILES := seccomp_policy/mediaswcodec-$(TARGET_ARCH).policy
-endif
+LOCAL_SRC_FILES := seccomp_policy/mediaswcodec-$(TARGET_ARCH).policy
include $(BUILD_PREBUILT)
endif
diff --git a/services/mediacodec/main_swcodecservice.cpp b/services/mediacodec/main_swcodecservice.cpp
index 12397fb..05b5695 100644
--- a/services/mediacodec/main_swcodecservice.cpp
+++ b/services/mediacodec/main_swcodecservice.cpp
@@ -45,8 +45,11 @@
::android::hardware::configureRpcThreadpool(64, false);
- // codec libs are currently 32-bit only
+#ifdef __LP64__
+ loadFromApex("/apex/com.android.media.swcodec/lib64");
+#else
loadFromApex("/apex/com.android.media.swcodec/lib");
+#endif
::android::hardware::joinRpcThreadpool();
}
diff --git a/services/mediacodec/registrant/Android.bp b/services/mediacodec/registrant/Android.bp
index 8c40ad1..8ae3376 100644
--- a/services/mediacodec/registrant/Android.bp
+++ b/services/mediacodec/registrant/Android.bp
@@ -49,7 +49,5 @@
"libcodec2_soft_gsmdec",
"libcodec2_soft_xaacdec",
],
-
- compile_multilib: "32",
}
diff --git a/services/mediacodec/seccomp_policy/mediaswcodec-arm64.policy b/services/mediacodec/seccomp_policy/mediaswcodec-arm64.policy
new file mode 100644
index 0000000..1bee1b5
--- /dev/null
+++ b/services/mediacodec/seccomp_policy/mediaswcodec-arm64.policy
@@ -0,0 +1,61 @@
+# Copyright (C) 2019 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.
+
+futex: 1
+# ioctl calls are filtered via the selinux policy.
+ioctl: 1
+sched_yield: 1
+close: 1
+dup: 1
+ppoll: 1
+mprotect: arg2 in ~PROT_EXEC || arg2 in ~PROT_WRITE
+mmap: arg2 in ~PROT_EXEC || arg2 in ~PROT_WRITE
+getuid: 1
+getrlimit: 1
+fstat: 1
+newfstatat: 1
+fstatfs: 1
+
+# mremap: Ensure |flags| are (MREMAP_MAYMOVE | MREMAP_FIXED) TODO: Once minijail
+# parser support for '<' is in this needs to be modified to also prevent
+# |old_address| and |new_address| from touching the exception vector page, which
+# on ARM is statically loaded at 0xffff 0000. See
+# http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0211h/Babfeega.html
+# for more details.
+mremap: arg3 == 3
+munmap: 1
+prctl: 1
+writev: 1
+sigaltstack: 1
+clone: 1
+exit: 1
+lseek: 1
+rt_sigprocmask: 1
+openat: 1
+write: 1
+nanosleep: 1
+setpriority: 1
+set_tid_address: 1
+getdents64: 1
+readlinkat: 1
+read: 1
+pread64: 1
+gettimeofday: 1
+faccessat: 1
+exit_group: 1
+restart_syscall: 1
+rt_sigreturn: 1
+getrandom: 1
+madvise: 1
+
diff --git a/services/mediacodec/seccomp_policy/mediaswcodec-x86_64.policy b/services/mediacodec/seccomp_policy/mediaswcodec-x86_64.policy
new file mode 120000
index 0000000..ab2592a
--- /dev/null
+++ b/services/mediacodec/seccomp_policy/mediaswcodec-x86_64.policy
@@ -0,0 +1 @@
+mediacodec-x86.policy
\ No newline at end of file