应用在使用soundpool这个类去播放声音,设置资源文件点击home键后退出后,再进入应用,反复操作会导致系统crash:
android8.1出现此类Bug,需要修改系统:
[sdm660_8.1/frameworks/av/.git] / media / libstagefright / ACodec.cpp
diff --git a/media/libstagefright/ACodec.cpp b/media/libstagefright/ACodec.cpp
index 0630f85..519d662 100644 (file)
--- a/media/libstagefright/ACodec.cpp
+++ b/media/libstagefright/ACodec.cpp
@@ -64,7 +64,7 @@
#include <stagefright/AVExtensions.h>
#include <common/LogOverride.h>
-
+#include <utils/Mutex.h>
#define QTI_FLAC_DECODER
namespace android {
@@ -73,7 +73,7 @@ using binder::Status;
enum {
kMaxIndicesToCheck = 32, // used when enumerating supported formats and profiles
};
-
+Mutex gLock; //vos-add-modify libhidlbase.so crash-#6287-zhoujy-181224
// OMX errors are directly mapped into status_t range if
// there is no corresponding MediaError status code.
// Use the statusFromOMXError(int32_t omxError) function.
@@ -834,6 +834,7 @@ status_t ACodec::setPortMode(int32_t portIndex, IOMX::PortMode mode) {
}
status_t ACodec::allocateBuffersOnPort(OMX_U32 portIndex) {
+ Mutex::Autolock _l(gLock);//vos-add-modify libhidlbase.so crash-#6287-zhoujy-181224
if (portIndex == kPortIndexInputExtradata ||
portIndex == kPortIndexOutputExtradata) {
return OK;
@@ -7928,7 +7929,7 @@ bool ACodec::OutputPortSettingsChangedState::onOMXFrameRendered(
bool ACodec::OutputPortSettingsChangedState::onOMXEvent(
OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2) {
- switch (event) {
+switch (event) {
case OMX_EventCmdComplete:
{
if (data1 == (OMX_U32)OMX_CommandPortDisable) {
@@ -7936,7 +7937,6 @@ bool ACodec::OutputPortSettingsChangedState::onOMXEvent(
ALOGW("ignoring EventCmdComplete CommandPortDisable for port %u", data2);
return false;
}
-
ALOGV("[%s] Output port now disabled.", mCodec->mComponentName.c_str());
status_t err = OK;
@@ -7946,12 +7946,16 @@ bool ACodec::OutputPortSettingsChangedState::onOMXEvent(
err = FAILED_TRANSACTION;
} else {
if (mCodec->getTrebleFlag()) {
- mCodec->mAllocator[kPortIndexOutput].clear();
+ /**modify libhidelbase.so crash-zhoujy-181224 start*/
+ if (mCodec->allYourBuffersAreBelongToUs(kPortIndexOutput)) {
+ mCodec->freeBuffersOnPort(kPortIndexOutput);
+ }
+ // mCodec->mAllocator[kPortIndexOutput].clear();
+ /**modify libhidlbase.so crash-zhoujy-181224 end*/
} else {
mCodec->mDealer[kPortIndexOutput].clear();
}
}
-
if (err == OK) {
err = mCodec->mOMXNode->sendCommand(
OMX_CommandPortEnable, kPortIndexOutput);