Merge "Fix strides while extracting graphic buffer" into oc-dev
diff --git a/drm/mediadrm/plugins/clearkey/InitDataParser.cpp b/drm/mediadrm/plugins/clearkey/InitDataParser.cpp
index 0216b8d..6a4f8d5 100644
--- a/drm/mediadrm/plugins/clearkey/InitDataParser.cpp
+++ b/drm/mediadrm/plugins/clearkey/InitDataParser.cpp
@@ -114,7 +114,7 @@
memcpy(&keyIdCount, &initData[readPosition], sizeof(keyIdCount));
keyIdCount = ntohl(keyIdCount);
readPosition += sizeof(keyIdCount);
- if (readPosition + (keyIdCount * kKeyIdSize) !=
+ if (readPosition + ((uint64_t)keyIdCount * kKeyIdSize) !=
initData.size() - sizeof(uint32_t)) {
return android::ERROR_DRM_CANNOT_HANDLE;
}
diff --git a/include/ndk/NdkImage.h b/include/ndk/NdkImage.h
index 66005cb..d7443be 100644
--- a/include/ndk/NdkImage.h
+++ b/include/ndk/NdkImage.h
@@ -15,7 +15,7 @@
*/
/**
- * @addtogroup Media Camera
+ * @addtogroup Media
* @{
*/
diff --git a/include/ndk/NdkImageReader.h b/include/ndk/NdkImageReader.h
index e3600c2..59ae507 100644
--- a/include/ndk/NdkImageReader.h
+++ b/include/ndk/NdkImageReader.h
@@ -15,7 +15,7 @@
*/
/**
- * @addtogroup Media Camera
+ * @addtogroup Media
* @{
*/
diff --git a/media/libaaudio/examples/input_monitor/static/Android.mk b/media/libaaudio/examples/input_monitor/static/Android.mk
index 00a4cda..61fc3b8 100644
--- a/media/libaaudio/examples/input_monitor/static/Android.mk
+++ b/media/libaaudio/examples/input_monitor/static/Android.mk
@@ -12,7 +12,7 @@
LOCAL_SHARED_LIBRARIES := libaudioutils libmedia \
libbinder libcutils libutils \
- libaudioclient liblog libtinyalsa
+ libaudioclient liblog libtinyalsa libaudiomanager
LOCAL_STATIC_LIBRARIES := libaaudio
LOCAL_MODULE := input_monitor
@@ -30,7 +30,7 @@
LOCAL_SHARED_LIBRARIES := libaudioutils libmedia \
libbinder libcutils libutils \
- libaudioclient liblog
+ libaudioclient liblog libaudiomanager
LOCAL_STATIC_LIBRARIES := libaaudio
LOCAL_MODULE := input_monitor_callback
diff --git a/media/libaaudio/examples/write_sine/static/Android.mk b/media/libaaudio/examples/write_sine/static/Android.mk
index 6911efb..40dca34 100644
--- a/media/libaaudio/examples/write_sine/static/Android.mk
+++ b/media/libaaudio/examples/write_sine/static/Android.mk
@@ -13,7 +13,7 @@
LOCAL_SHARED_LIBRARIES := libaudioutils libmedia \
libbinder libcutils libutils \
- libaudioclient liblog libtinyalsa
+ libaudioclient liblog libtinyalsa libaudiomanager
LOCAL_STATIC_LIBRARIES := libaaudio
LOCAL_MODULE := write_sine
@@ -31,7 +31,7 @@
LOCAL_SHARED_LIBRARIES := libaudioutils libmedia \
libbinder libcutils libutils \
- libaudioclient liblog
+ libaudioclient liblog libaudiomanager
LOCAL_STATIC_LIBRARIES := libaaudio
LOCAL_MODULE := write_sine_callback
diff --git a/media/libaaudio/include/aaudio/AAudio.h b/media/libaaudio/include/aaudio/AAudio.h
index f11f1fa..e1886ac 100644
--- a/media/libaaudio/include/aaudio/AAudio.h
+++ b/media/libaaudio/include/aaudio/AAudio.h
@@ -62,14 +62,14 @@
AAUDIO_ERROR_BASE = -900, // TODO review
AAUDIO_ERROR_DISCONNECTED,
AAUDIO_ERROR_ILLEGAL_ARGUMENT,
- AAUDIO_ERROR_INCOMPATIBLE,
- AAUDIO_ERROR_INTERNAL, // an underlying API returned an error code
+ // reserved
+ AAUDIO_ERROR_INTERNAL = AAUDIO_ERROR_ILLEGAL_ARGUMENT + 2,
AAUDIO_ERROR_INVALID_STATE,
- AAUDIO_ERROR_UNEXPECTED_STATE,
- AAUDIO_ERROR_UNEXPECTED_VALUE,
- AAUDIO_ERROR_INVALID_HANDLE,
- AAUDIO_ERROR_INVALID_QUERY,
- AAUDIO_ERROR_UNIMPLEMENTED,
+ // reserved
+ // reserved
+ AAUDIO_ERROR_INVALID_HANDLE = AAUDIO_ERROR_INVALID_STATE + 3,
+ // reserved
+ AAUDIO_ERROR_UNIMPLEMENTED = AAUDIO_ERROR_INVALID_HANDLE + 2,
AAUDIO_ERROR_UNAVAILABLE,
AAUDIO_ERROR_NO_FREE_HANDLES,
AAUDIO_ERROR_NO_MEMORY,
diff --git a/media/libaaudio/src/Android.mk b/media/libaaudio/src/Android.mk
index a452c1d..28c4d7f 100644
--- a/media/libaaudio/src/Android.mk
+++ b/media/libaaudio/src/Android.mk
@@ -18,6 +18,7 @@
frameworks/native/media/libaaudio/include/include \
frameworks/av/media/libaaudio/include \
frameworks/native/include \
+ frameworks/av/media/libaudioclient/include \
$(LOCAL_PATH) \
$(LOCAL_PATH)/binding \
$(LOCAL_PATH)/client \
@@ -120,6 +121,6 @@
# AAUDIO_API is used to explicitly export a function or a variable as a visible symbol.
LOCAL_CFLAGS += -DAAUDIO_API='__attribute__((visibility("default")))'
-LOCAL_SHARED_LIBRARIES := libaudioclient liblog libcutils libutils libbinder
+LOCAL_SHARED_LIBRARIES := libaudioclient liblog libcutils libutils libbinder libaudiomanager
include $(BUILD_SHARED_LIBRARY)
diff --git a/media/libaaudio/src/client/AudioStreamInternal.cpp b/media/libaaudio/src/client/AudioStreamInternal.cpp
index f71404d..3a827f0 100644
--- a/media/libaaudio/src/client/AudioStreamInternal.cpp
+++ b/media/libaaudio/src/client/AudioStreamInternal.cpp
@@ -480,7 +480,7 @@
default:
ALOGE("WARNING - AudioStreamInternal::processCommands() Unrecognized what = %d",
(int) message.what);
- result = AAUDIO_ERROR_UNEXPECTED_VALUE;
+ result = AAUDIO_ERROR_INTERNAL;
break;
}
}
diff --git a/media/libaaudio/src/core/AAudioAudio.cpp b/media/libaaudio/src/core/AAudioAudio.cpp
index 04bf2de..76f98fa 100644
--- a/media/libaaudio/src/core/AAudioAudio.cpp
+++ b/media/libaaudio/src/core/AAudioAudio.cpp
@@ -51,13 +51,13 @@
AAUDIO_CASE_ENUM(AAUDIO_OK);
AAUDIO_CASE_ENUM(AAUDIO_ERROR_DISCONNECTED);
AAUDIO_CASE_ENUM(AAUDIO_ERROR_ILLEGAL_ARGUMENT);
- AAUDIO_CASE_ENUM(AAUDIO_ERROR_INCOMPATIBLE);
+ // reserved
AAUDIO_CASE_ENUM(AAUDIO_ERROR_INTERNAL);
AAUDIO_CASE_ENUM(AAUDIO_ERROR_INVALID_STATE);
- AAUDIO_CASE_ENUM(AAUDIO_ERROR_UNEXPECTED_STATE);
- AAUDIO_CASE_ENUM(AAUDIO_ERROR_UNEXPECTED_VALUE);
+ // reserved
+ // reserved
AAUDIO_CASE_ENUM(AAUDIO_ERROR_INVALID_HANDLE);
- AAUDIO_CASE_ENUM(AAUDIO_ERROR_INVALID_QUERY);
+ // reserved
AAUDIO_CASE_ENUM(AAUDIO_ERROR_UNIMPLEMENTED);
AAUDIO_CASE_ENUM(AAUDIO_ERROR_UNAVAILABLE);
AAUDIO_CASE_ENUM(AAUDIO_ERROR_NO_FREE_HANDLES);
@@ -114,7 +114,7 @@
AAUDIO_API aaudio_result_t AAudio_createStreamBuilder(AAudioStreamBuilder** builder)
{
- AudioStreamBuilder *audioStreamBuilder = new AudioStreamBuilder();
+ AudioStreamBuilder *audioStreamBuilder = new(std::nothrow) AudioStreamBuilder();
if (audioStreamBuilder == nullptr) {
return AAUDIO_ERROR_NO_MEMORY;
}
@@ -235,7 +235,7 @@
delete streamBuilder;
return AAUDIO_OK;
}
- return AAUDIO_ERROR_INVALID_HANDLE;
+ return AAUDIO_ERROR_NULL;
}
AAUDIO_API aaudio_result_t AAudioStream_close(AAudioStream* stream)
@@ -247,7 +247,7 @@
delete audioStream;
return AAUDIO_OK;
}
- return AAUDIO_ERROR_INVALID_HANDLE;
+ return AAUDIO_ERROR_NULL;
}
AAUDIO_API aaudio_result_t AAudioStream_requestStart(AAudioStream* stream)
diff --git a/media/libaaudio/src/core/AudioStream.cpp b/media/libaaudio/src/core/AudioStream.cpp
index 03f1a5c..e1e3c55 100644
--- a/media/libaaudio/src/core/AudioStream.cpp
+++ b/media/libaaudio/src/core/AudioStream.cpp
@@ -92,7 +92,7 @@
break;
default:
ALOGE("AudioStream::open(): illegal performanceMode %d", mPerformanceMode);
- return AAUDIO_ERROR_UNEXPECTED_VALUE;
+ return AAUDIO_ERROR_ILLEGAL_ARGUMENT;
}
return AAUDIO_OK;
diff --git a/media/libaaudio/src/legacy/AudioStreamLegacy.cpp b/media/libaaudio/src/legacy/AudioStreamLegacy.cpp
index dfac4fb..dd5e3c0 100644
--- a/media/libaaudio/src/legacy/AudioStreamLegacy.cpp
+++ b/media/libaaudio/src/legacy/AudioStreamLegacy.cpp
@@ -133,7 +133,7 @@
break;
default:
ALOGE("getTimestamp() - Unrecognized clock type %d", (int) clockId);
- return AAUDIO_ERROR_UNEXPECTED_VALUE;
+ return AAUDIO_ERROR_ILLEGAL_ARGUMENT;
break;
}
status_t status = extendedTimestamp->getBestTimestamp(framePosition, timeNanoseconds, timebase);
diff --git a/media/libaaudio/src/legacy/AudioStreamTrack.cpp b/media/libaaudio/src/legacy/AudioStreamTrack.cpp
index a0c1d45..7e39908 100644
--- a/media/libaaudio/src/legacy/AudioStreamTrack.cpp
+++ b/media/libaaudio/src/legacy/AudioStreamTrack.cpp
@@ -143,6 +143,9 @@
return AAudioConvert_androidToAAudioResult(status);
}
+ //TrackPlayerBase init
+ init(mAudioTrack.get(), PLAYER_TYPE_AAUDIO, AUDIO_USAGE_MEDIA);
+
// Get the actual values from the AudioTrack.
setSamplesPerFrame(mAudioTrack->channelCount());
aaudio_format_t aaudioFormat =
@@ -194,7 +197,7 @@
aaudio_result_t AudioStreamTrack::close()
{
if (getState() != AAUDIO_STREAM_STATE_CLOSED) {
- mAudioTrack.clear();
+ destroy();
setState(AAUDIO_STREAM_STATE_CLOSED);
}
mFixedBlockReader.close();
@@ -232,7 +235,7 @@
return AAudioConvert_androidToAAudioResult(err);
}
- err = mAudioTrack->start();
+ err = startWithStatus();
if (err != OK) {
return AAudioConvert_androidToAAudioResult(err);
} else {
@@ -256,7 +259,7 @@
}
onStop();
setState(AAUDIO_STREAM_STATE_PAUSING);
- mAudioTrack->pause();
+ pause();
status_t err = mAudioTrack->getPosition(&mPositionWhenPausing);
if (err != OK) {
return AAudioConvert_androidToAAudioResult(err);
@@ -288,7 +291,7 @@
onStop();
setState(AAUDIO_STREAM_STATE_STOPPING);
incrementFramesRead(getFramesWritten() - getFramesRead()); // TODO review
- mAudioTrack->stop();
+ stop();
mFramesWritten.reset32();
return AAUDIO_OK;
}
diff --git a/media/libaaudio/src/legacy/AudioStreamTrack.h b/media/libaaudio/src/legacy/AudioStreamTrack.h
index 990f005..ff429ea 100644
--- a/media/libaaudio/src/legacy/AudioStreamTrack.h
+++ b/media/libaaudio/src/legacy/AudioStreamTrack.h
@@ -18,7 +18,7 @@
#define LEGACY_AUDIO_STREAM_TRACK_H
#include <math.h>
-#include <media/AudioTrack.h>
+#include <media/TrackPlayerBase.h>
#include <aaudio/AAudio.h>
#include "AudioStreamBuilder.h"
@@ -32,7 +32,7 @@
/**
* Internal stream that uses the legacy AudioTrack path.
*/
-class AudioStreamTrack : public AudioStreamLegacy {
+class AudioStreamTrack : public AudioStreamLegacy, public android::TrackPlayerBase {
public:
AudioStreamTrack();
@@ -78,7 +78,6 @@
private:
- android::sp<android::AudioTrack> mAudioTrack;
// adapts between variable sized blocks and fixed size blocks
FixedBlockReader mFixedBlockReader;
diff --git a/media/libaaudio/src/utility/AAudioUtilities.cpp b/media/libaaudio/src/utility/AAudioUtilities.cpp
index 2c7634e..164784d 100644
--- a/media/libaaudio/src/utility/AAudioUtilities.cpp
+++ b/media/libaaudio/src/utility/AAudioUtilities.cpp
@@ -212,10 +212,8 @@
status = DEAD_OBJECT;
break;
case AAUDIO_ERROR_INVALID_STATE:
- case AAUDIO_ERROR_UNEXPECTED_STATE:
status = INVALID_OPERATION;
break;
- case AAUDIO_ERROR_UNEXPECTED_VALUE:
case AAUDIO_ERROR_INVALID_RATE:
case AAUDIO_ERROR_INVALID_FORMAT:
case AAUDIO_ERROR_ILLEGAL_ARGUMENT:
@@ -229,9 +227,7 @@
status = UNEXPECTED_NULL;
break;
// TODO translate these result codes
- case AAUDIO_ERROR_INCOMPATIBLE:
case AAUDIO_ERROR_INTERNAL:
- case AAUDIO_ERROR_INVALID_QUERY:
case AAUDIO_ERROR_UNIMPLEMENTED:
case AAUDIO_ERROR_UNAVAILABLE:
case AAUDIO_ERROR_NO_FREE_HANDLES:
@@ -265,7 +261,7 @@
result = AAUDIO_ERROR_NULL;
break;
case BAD_VALUE:
- result = AAUDIO_ERROR_UNEXPECTED_VALUE;
+ result = AAUDIO_ERROR_ILLEGAL_ARGUMENT;
break;
case WOULD_BLOCK:
result = AAUDIO_ERROR_WOULD_BLOCK;
diff --git a/media/libaaudio/tests/Android.mk b/media/libaaudio/tests/Android.mk
index fba81f2..afcdebf 100644
--- a/media/libaaudio/tests/Android.mk
+++ b/media/libaaudio/tests/Android.mk
@@ -7,7 +7,7 @@
frameworks/av/media/libaaudio/src
LOCAL_SRC_FILES:= test_handle_tracker.cpp
LOCAL_SHARED_LIBRARIES := libaudioclient libaudioutils libbinder \
- libcutils liblog libmedia libutils
+ libcutils liblog libmedia libutils libaudiomanager
LOCAL_STATIC_LIBRARIES := libaaudio
LOCAL_MODULE := test_handle_tracker
include $(BUILD_NATIVE_TEST)
@@ -19,7 +19,7 @@
frameworks/av/media/libaaudio/src
LOCAL_SRC_FILES:= test_marshalling.cpp
LOCAL_SHARED_LIBRARIES := libaudioclient libaudioutils libbinder \
- libcutils liblog libmedia libutils
+ libcutils liblog libmedia libutils libaudiomanager
LOCAL_STATIC_LIBRARIES := libaaudio
LOCAL_MODULE := test_aaudio_marshalling
include $(BUILD_NATIVE_TEST)
@@ -31,7 +31,7 @@
frameworks/av/media/libaaudio/src
LOCAL_SRC_FILES:= test_block_adapter.cpp
LOCAL_SHARED_LIBRARIES := libaudioclient libaudioutils libbinder \
- libcutils liblog libmedia libutils
+ libcutils liblog libmedia libutils libaudiomanager
LOCAL_STATIC_LIBRARIES := libaaudio
LOCAL_MODULE := test_block_adapter
include $(BUILD_NATIVE_TEST)
@@ -43,7 +43,7 @@
frameworks/av/media/libaaudio/src
LOCAL_SRC_FILES:= test_linear_ramp.cpp
LOCAL_SHARED_LIBRARIES := libaudioclient libaudioutils libbinder \
- libcutils liblog libmedia libutils
+ libcutils liblog libmedia libutils libaudiomanager
LOCAL_STATIC_LIBRARIES := libaaudio
LOCAL_MODULE := test_linear_ramp
include $(BUILD_NATIVE_TEST)
@@ -55,7 +55,7 @@
frameworks/av/media/libaaudio/src
LOCAL_SRC_FILES:= test_open_params.cpp
LOCAL_SHARED_LIBRARIES := libaudioclient libaudioutils libbinder \
- libcutils liblog libmedia libutils
+ libcutils liblog libmedia libutils libaudiomanager
LOCAL_STATIC_LIBRARIES := libaaudio
LOCAL_MODULE := test_open_params
include $(BUILD_NATIVE_TEST)
diff --git a/media/libaudioclient/Android.bp b/media/libaudioclient/Android.bp
index 166534f..d853946 100644
--- a/media/libaudioclient/Android.bp
+++ b/media/libaudioclient/Android.bp
@@ -22,6 +22,8 @@
"IEffect.cpp",
"IEffectClient.cpp",
"ToneGenerator.cpp",
+ "PlayerBase.cpp",
+ "TrackPlayerBase.cpp",
],
shared_libs: [
"liblog",
@@ -30,6 +32,7 @@
"libbinder",
"libdl",
"libaudioutils",
+ "libaudiomanager",
],
export_shared_lib_headers: ["libbinder"],
diff --git a/media/libaudioclient/PlayerBase.cpp b/media/libaudioclient/PlayerBase.cpp
new file mode 100644
index 0000000..cbef1b3
--- /dev/null
+++ b/media/libaudioclient/PlayerBase.cpp
@@ -0,0 +1,171 @@
+/*
+ * Copyright (C) 2017 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.
+ */
+
+#include <binder/IServiceManager.h>
+#include <media/PlayerBase.h>
+
+#define max(a, b) ((a) > (b) ? (a) : (b))
+#define min(a, b) ((a) < (b) ? (a) : (b))
+
+namespace android {
+
+//--------------------------------------------------------------------------------------------------
+PlayerBase::PlayerBase() : BnPlayer(),
+ mPanMultiplierL(1.0f), mPanMultiplierR(1.0f),
+ mVolumeMultiplierL(1.0f), mVolumeMultiplierR(1.0f),
+ mPIId(PLAYER_PIID_INVALID), mLastReportedEvent(PLAYER_STATE_UNKNOWN)
+{
+ ALOGD("PlayerBase::PlayerBase()");
+ // use checkService() to avoid blocking if audio service is not up yet
+ sp<IBinder> binder = defaultServiceManager()->checkService(String16("audio"));
+ if (binder == 0) {
+ ALOGE("PlayerBase(): binding to audio service failed, service up?");
+ } else {
+ mAudioManager = interface_cast<IAudioManager>(binder);
+ }
+}
+
+
+PlayerBase::~PlayerBase() {
+ ALOGD("PlayerBase::~PlayerBase()");
+ baseDestroy();
+}
+
+void PlayerBase::init(player_type_t playerType, audio_usage_t usage) {
+ if (mAudioManager == 0) {
+ ALOGE("AudioPlayer realize: no audio service, player will not be registered");
+ } else {
+ mPIId = mAudioManager->trackPlayer(playerType, usage, AUDIO_CONTENT_TYPE_UNKNOWN, this);
+ }
+}
+
+void PlayerBase::baseDestroy() {
+ serviceReleasePlayer();
+ if (mAudioManager != 0) {
+ mAudioManager.clear();
+ }
+}
+
+//------------------------------------------------------------------------------
+void PlayerBase::servicePlayerEvent(player_state_t event) {
+ if (mAudioManager != 0) {
+ // only report state change
+ Mutex::Autolock _l(mPlayerStateLock);
+ if (event != mLastReportedEvent
+ && mPIId != PLAYER_PIID_INVALID) {
+ mLastReportedEvent = event;
+ mAudioManager->playerEvent(mPIId, event);
+ }
+ }
+}
+
+void PlayerBase::serviceReleasePlayer() {
+ if (mAudioManager != 0
+ && mPIId != PLAYER_PIID_INVALID) {
+ mAudioManager->releasePlayer(mPIId);
+ }
+}
+
+//FIXME temporary method while some AudioTrack state is outside of this class
+void PlayerBase::reportEvent(player_state_t event) {
+ servicePlayerEvent(event);
+}
+
+status_t PlayerBase::startWithStatus() {
+ status_t status = playerStart();
+ if (status == NO_ERROR) {
+ ALOGD("PlayerBase::start() from IPlayer");
+ servicePlayerEvent(PLAYER_STATE_STARTED);
+ } else {
+ ALOGD("PlayerBase::start() no AudioTrack to start from IPlayer");
+ }
+ return status;
+}
+
+//------------------------------------------------------------------------------
+// Implementation of IPlayer
+void PlayerBase::start() {
+ (void)startWithStatus();
+}
+
+void PlayerBase::pause() {
+ if (playerPause() == NO_ERROR) {
+ ALOGD("PlayerBase::pause() from IPlayer");
+ servicePlayerEvent(PLAYER_STATE_PAUSED);
+ } else {
+ ALOGD("PlayerBase::pause() no AudioTrack to pause from IPlayer");
+ }
+}
+
+
+void PlayerBase::stop() {
+ if (playerStop() == NO_ERROR) {
+ ALOGD("PlayerBase::stop() from IPlayer");
+ servicePlayerEvent(PLAYER_STATE_STOPPED);
+ } else {
+ ALOGD("PlayerBase::stop() no AudioTrack to stop from IPlayer");
+ }
+}
+
+void PlayerBase::setVolume(float vol) {
+ {
+ Mutex::Autolock _l(mSettingsLock);
+ mVolumeMultiplierL = vol;
+ mVolumeMultiplierR = vol;
+ }
+ if (playerSetVolume() == NO_ERROR) {
+ ALOGD("PlayerBase::setVolume() from IPlayer");
+ } else {
+ ALOGD("PlayerBase::setVolume() no AudioTrack for volume control from IPlayer");
+ }
+}
+
+void PlayerBase::setPan(float pan) {
+ {
+ Mutex::Autolock _l(mSettingsLock);
+ pan = min(max(-1.0f, pan), 1.0f);
+ if (pan >= 0.0f) {
+ mPanMultiplierL = 1.0f - pan;
+ mPanMultiplierR = 1.0f;
+ } else {
+ mPanMultiplierL = 1.0f;
+ mPanMultiplierR = 1.0f + pan;
+ }
+ }
+ if (playerSetVolume() == NO_ERROR) {
+ ALOGD("PlayerBase::setPan() from IPlayer");
+ } else {
+ ALOGD("PlayerBase::setPan() no AudioTrack for volume control from IPlayer");
+ }
+}
+
+void PlayerBase::setStartDelayMs(int32_t delayMs __unused) {
+ ALOGW("setStartDelay() is not supported");
+}
+
+void PlayerBase::applyVolumeShaper(
+ const sp<VolumeShaper::Configuration>& configuration __unused,
+ const sp<VolumeShaper::Operation>& operation __unused) {
+ ALOGW("applyVolumeShaper() is not supported");
+}
+
+status_t PlayerBase::onTransact(
+ uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
+{
+ return BnPlayer::onTransact(code, data, reply, flags);
+}
+
+} // namespace android
diff --git a/media/libaudioclient/TrackPlayerBase.cpp b/media/libaudioclient/TrackPlayerBase.cpp
new file mode 100644
index 0000000..48cd803
--- /dev/null
+++ b/media/libaudioclient/TrackPlayerBase.cpp
@@ -0,0 +1,121 @@
+/*
+ * Copyright (C) 2017 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.
+ */
+
+#include <media/TrackPlayerBase.h>
+
+namespace android {
+
+//--------------------------------------------------------------------------------------------------
+TrackPlayerBase::TrackPlayerBase() : PlayerBase(),
+ mPlayerVolumeL(1.0f), mPlayerVolumeR(1.0f)
+{
+ ALOGD("TrackPlayerBase::TrackPlayerBase()");
+}
+
+
+TrackPlayerBase::~TrackPlayerBase() {
+ ALOGD("TrackPlayerBase::~TrackPlayerBase()");
+ doDestroy();
+}
+
+void TrackPlayerBase::init(AudioTrack* pat, player_type_t playerType, audio_usage_t usage) {
+ PlayerBase::init(playerType, usage);
+ mAudioTrack = pat;
+}
+
+void TrackPlayerBase::destroy() {
+ doDestroy();
+ baseDestroy();
+}
+
+void TrackPlayerBase::doDestroy() {
+ if (mAudioTrack != 0) {
+ mAudioTrack->stop();
+ // Note that there may still be another reference in post-unlock phase of SetPlayState
+ mAudioTrack.clear();
+ }
+}
+
+void TrackPlayerBase::setPlayerVolume(float vl, float vr) {
+ {
+ Mutex::Autolock _l(mSettingsLock);
+ mPlayerVolumeL = vl;
+ mPlayerVolumeR = vr;
+ }
+ doSetVolume();
+}
+
+//------------------------------------------------------------------------------
+// Implementation of IPlayer
+status_t TrackPlayerBase::playerStart() {
+ status_t status = NO_INIT;
+ if (mAudioTrack != 0) {
+ status = mAudioTrack->start();
+ }
+ return status;
+}
+
+status_t TrackPlayerBase::playerPause() {
+ status_t status = NO_INIT;
+ if (mAudioTrack != 0) {
+ mAudioTrack->pause();
+ status = NO_ERROR;
+ }
+ return status;
+}
+
+
+status_t TrackPlayerBase::playerStop() {
+ status_t status = NO_INIT;
+ if (mAudioTrack != 0) {
+ mAudioTrack->stop();
+ status = NO_ERROR;
+ }
+ return status;
+}
+
+status_t TrackPlayerBase::playerSetVolume() {
+ return doSetVolume();
+}
+
+status_t TrackPlayerBase::doSetVolume() {
+ status_t status = NO_INIT;
+ if (mAudioTrack != 0) {
+ float tl = mPlayerVolumeL * mPanMultiplierL * mVolumeMultiplierL;
+ float tr = mPlayerVolumeR * mPanMultiplierR * mVolumeMultiplierR;
+ mAudioTrack->setVolume(tl, tr);
+ status = NO_ERROR;
+ }
+ return status;
+}
+
+
+void TrackPlayerBase::applyVolumeShaper(
+ const sp<VolumeShaper::Configuration>& configuration,
+ const sp<VolumeShaper::Operation>& operation) {
+ if (mAudioTrack != 0) {
+ ALOGD("TrackPlayerBase::applyVolumeShaper() from IPlayer");
+ VolumeShaper::Status status = mAudioTrack->applyVolumeShaper(configuration, operation);
+ if (status < 0) { // a non-negative value is the volume shaper id.
+ ALOGE("TrackPlayerBase::applyVolumeShaper() failed with status %d", status);
+ }
+ } else {
+ ALOGD("TrackPlayerBase::applyVolumeShaper()"
+ " no AudioTrack for volume control from IPlayer");
+ }
+}
+
+} // namespace android
diff --git a/media/libaudioclient/include/media/PlayerBase.h b/media/libaudioclient/include/media/PlayerBase.h
new file mode 100644
index 0000000..fe1db7b
--- /dev/null
+++ b/media/libaudioclient/include/media/PlayerBase.h
@@ -0,0 +1,91 @@
+/*
+ * Copyright (C) 2017 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_PLAYER_BASE_H__
+#define __ANDROID_PLAYER_BASE_H__
+
+#include <audiomanager/IPlayer.h>
+#include <audiomanager/AudioManager.h>
+#include <audiomanager/IAudioManager.h>
+
+
+namespace android {
+
+class PlayerBase : public BnPlayer
+{
+public:
+ explicit PlayerBase();
+ virtual ~PlayerBase();
+
+ virtual void destroy() = 0;
+
+ //IPlayer implementation
+ virtual void start();
+ virtual void pause();
+ virtual void stop();
+ virtual void setVolume(float vol);
+ virtual void setPan(float pan);
+ virtual void setStartDelayMs(int32_t delayMs);
+ virtual void applyVolumeShaper(
+ const sp<VolumeShaper::Configuration>& configuration,
+ const sp<VolumeShaper::Operation>& operation) override;
+
+ virtual status_t onTransact(
+ uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags);
+
+
+ status_t startWithStatus();
+
+ //FIXME temporary method while some player state is outside of this class
+ void reportEvent(player_state_t event);
+
+protected:
+
+ void init(player_type_t playerType, audio_usage_t usage);
+ void baseDestroy();
+
+ //IPlayer methods handlers for derived classes
+ virtual status_t playerStart() { return NO_ERROR; }
+ virtual status_t playerPause() { return NO_ERROR; }
+ virtual status_t playerStop() { return NO_ERROR; }
+ virtual status_t playerSetVolume() { return NO_ERROR; }
+
+ // mutex for IPlayer volume and pan, and player-specific volume
+ Mutex mSettingsLock;
+
+ // volume multipliers coming from the IPlayer volume and pan controls
+ float mPanMultiplierL, mPanMultiplierR;
+ float mVolumeMultiplierL, mVolumeMultiplierR;
+
+private:
+ // report events to AudioService
+ void servicePlayerEvent(player_state_t event);
+ void serviceReleasePlayer();
+
+ // native interface to AudioService
+ android::sp<android::IAudioManager> mAudioManager;
+
+ // player interface ID, uniquely identifies the player in the system
+ audio_unique_id_t mPIId;
+
+ // Mutex for state reporting
+ Mutex mPlayerStateLock;
+ player_state_t mLastReportedEvent;
+};
+
+} // namespace android
+
+#endif /* __ANDROID_PLAYER_BASE_H__ */
diff --git a/media/libaudioclient/include/media/TrackPlayerBase.h b/media/libaudioclient/include/media/TrackPlayerBase.h
new file mode 100644
index 0000000..2d113c0
--- /dev/null
+++ b/media/libaudioclient/include/media/TrackPlayerBase.h
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2017 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_TRACK_PLAYER_BASE_H__
+#define __ANDROID_TRACK_PLAYER_BASE_H__
+
+#include <media/AudioTrack.h>
+#include <media/PlayerBase.h>
+
+namespace android {
+
+class TrackPlayerBase : public PlayerBase
+{
+public:
+ explicit TrackPlayerBase();
+ virtual ~TrackPlayerBase();
+
+ void init(AudioTrack* pat, player_type_t playerType, audio_usage_t usage);
+ virtual void destroy();
+
+ //IPlayer implementation
+ virtual void applyVolumeShaper(
+ const sp<VolumeShaper::Configuration>& configuration,
+ const sp<VolumeShaper::Operation>& operation);
+
+ //FIXME move to protected field, so far made public to minimize changes to AudioTrack logic
+ sp<AudioTrack> mAudioTrack;
+
+ void setPlayerVolume(float vl, float vr);
+
+protected:
+
+ //PlayerBase virtuals
+ virtual status_t playerStart();
+ virtual status_t playerPause();
+ virtual status_t playerStop();
+ virtual status_t playerSetVolume();
+
+private:
+ void doDestroy();
+ status_t doSetVolume();
+
+ // volume coming from the player volume API
+ float mPlayerVolumeL, mPlayerVolumeR;
+};
+
+} // namespace android
+
+#endif /* __ANDROID_TRACK_PLAYER_BASE_H__ */
diff --git a/media/libeffects/lvm/wrapper/Bundle/EffectBundle.cpp b/media/libeffects/lvm/wrapper/Bundle/EffectBundle.cpp
index 8028969..df6501b 100644
--- a/media/libeffects/lvm/wrapper/Bundle/EffectBundle.cpp
+++ b/media/libeffects/lvm/wrapper/Bundle/EffectBundle.cpp
@@ -148,7 +148,10 @@
void *pParam,
uint32_t *pValueSize,
void *pValue);
-int Equalizer_setParameter (EffectContext *pContext, void *pParam, void *pValue);
+int Equalizer_setParameter (EffectContext *pContext,
+ void *pParam,
+ uint32_t valueSize,
+ void *pValue);
int Equalizer_getParameter (EffectContext *pContext,
void *pParam,
uint32_t *pValueSize,
@@ -2431,6 +2434,13 @@
}
break;
}
+
+ if (*pValueSize < 1) {
+ status = -EINVAL;
+ android_errorWriteLog(0x534e4554, "37536407");
+ break;
+ }
+
name = (char *)pValue;
strncpy(name, EqualizerGetPresetName(param2), *pValueSize - 1);
name[*pValueSize - 1] = 0;
@@ -2468,12 +2478,17 @@
// Inputs:
// pEqualizer - handle to instance data
// pParam - pointer to parameter
+// valueSize - value size
// pValue - pointer to value
+
//
// Outputs:
//
//----------------------------------------------------------------------------
-int Equalizer_setParameter (EffectContext *pContext, void *pParam, void *pValue){
+int Equalizer_setParameter (EffectContext *pContext,
+ void *pParam,
+ uint32_t valueSize,
+ void *pValue) {
int status = 0;
int32_t preset;
int32_t band;
@@ -2485,6 +2500,10 @@
//ALOGV("\tEqualizer_setParameter start");
switch (param) {
case EQ_PARAM_CUR_PRESET:
+ if (valueSize < sizeof(int16_t)) {
+ status = -EINVAL;
+ break;
+ }
preset = (int32_t)(*(uint16_t *)pValue);
//ALOGV("\tEqualizer_setParameter() EQ_PARAM_CUR_PRESET %d", preset);
@@ -2495,6 +2514,10 @@
EqualizerSetPreset(pContext, preset);
break;
case EQ_PARAM_BAND_LEVEL:
+ if (valueSize < sizeof(int16_t)) {
+ status = -EINVAL;
+ break;
+ }
band = *pParamTemp;
level = (int32_t)(*(int16_t *)pValue);
//ALOGV("\tEqualizer_setParameter() EQ_PARAM_BAND_LEVEL band %d, level %d", band, level);
@@ -2510,6 +2533,10 @@
break;
case EQ_PARAM_PROPERTIES: {
//ALOGV("\tEqualizer_setParameter() EQ_PARAM_PROPERTIES");
+ if (valueSize < sizeof(int16_t)) {
+ status = -EINVAL;
+ break;
+ }
int16_t *p = (int16_t *)pValue;
if ((int)p[0] >= EqualizerGetNumPresets()) {
status = -EINVAL;
@@ -2518,6 +2545,13 @@
if (p[0] >= 0) {
EqualizerSetPreset(pContext, (int)p[0]);
} else {
+ if (valueSize < (2 + FIVEBAND_NUMBANDS) * sizeof(int16_t)) {
+ android_errorWriteLog(0x534e4554, "37563371");
+ ALOGE("\tERROR Equalizer_setParameter() EQ_PARAM_PROPERTIES valueSize %d < %d",
+ (int)valueSize, (int)((2 + FIVEBAND_NUMBANDS) * sizeof(int16_t)));
+ status = -EINVAL;
+ break;
+ }
if ((int)p[1] != FIVEBAND_NUMBANDS) {
status = -EINVAL;
break;
@@ -3290,7 +3324,8 @@
*(int *)pReplyData = android::Equalizer_setParameter(pContext,
(void *)p->data,
- p->data + p->psize);
+ p->vsize,
+ p->data + p->psize);
}
if(pContext->EffectType == LVM_VOLUME){
//ALOGV("\tVolume_command cmdCode Case: EFFECT_CMD_SET_PARAM start");
diff --git a/media/libmedia/mediaplayer.cpp b/media/libmedia/mediaplayer.cpp
index 685065a..b976721 100644
--- a/media/libmedia/mediaplayer.cpp
+++ b/media/libmedia/mediaplayer.cpp
@@ -1023,9 +1023,12 @@
return NO_INIT;
}
- // Only allowing it in player's prepared state
- if (!(mCurrentState & MEDIA_PLAYER_PREPARED)) {
- ALOGE("prepareDrm must only be called in the prepared state.");
+ // Only allowed it in player's preparing/prepared state.
+ // We get here only if MEDIA_DRM_INFO has already arrived (e.g., prepare is half-way through or
+ // completed) so the state change to "prepared" might not have happened yet (e.g., buffering).
+ // Still, we can allow prepareDrm for the use case of being called in OnDrmInfoListener.
+ if (!(mCurrentState & (MEDIA_PLAYER_PREPARING | MEDIA_PLAYER_PREPARED))) {
+ ALOGE("prepareDrm is called in the wrong state (%d).", mCurrentState);
return INVALID_OPERATION;
}
diff --git a/media/libmediaplayerservice/nuplayer/GenericSource.cpp b/media/libmediaplayerservice/nuplayer/GenericSource.cpp
index 00a1f9c..d83c406 100644
--- a/media/libmediaplayerservice/nuplayer/GenericSource.cpp
+++ b/media/libmediaplayerservice/nuplayer/GenericSource.cpp
@@ -1979,7 +1979,8 @@
// The legacy mDecryptHandle!=NULL check (for FLAG_PROTECTED) is equivalent to mIsDrmProtected.
notifyFlagsChanged(
(mIsSecure ? FLAG_SECURE : 0) |
- (mIsDrmProtected ? FLAG_PROTECTED : 0) |
+ // Setting "protected screen" only for L1: b/38390836
+ (mIsSecure ? FLAG_PROTECTED : 0) |
FLAG_CAN_PAUSE |
FLAG_CAN_SEEK_BACKWARD |
FLAG_CAN_SEEK_FORWARD |
diff --git a/media/libmediaplayerservice/nuplayer/GenericSource.h b/media/libmediaplayerservice/nuplayer/GenericSource.h
index b0c6695..4064133 100644
--- a/media/libmediaplayerservice/nuplayer/GenericSource.h
+++ b/media/libmediaplayerservice/nuplayer/GenericSource.h
@@ -222,6 +222,7 @@
int32_t mFetchTimedTextDataGeneration;
int64_t mDurationUs;
bool mAudioIsVorbis;
+ // Secure codec is required.
bool mIsSecure;
bool mIsStreaming;
bool mUIDValid;
@@ -310,7 +311,9 @@
bool seeking, bool formatChange, media_track_type trackType, Track *track);
// Modular DRM
+ // The source is DRM protected and is prepared for DRM.
bool mIsDrmProtected;
+ // releaseDrm has been processed.
bool mIsDrmReleased;
Vector<String8> mMimes;
diff --git a/media/libmediaplayerservice/nuplayer/NuPlayerSource.h b/media/libmediaplayerservice/nuplayer/NuPlayerSource.h
index e7cca27..8ba9c0d 100644
--- a/media/libmediaplayerservice/nuplayer/NuPlayerSource.h
+++ b/media/libmediaplayerservice/nuplayer/NuPlayerSource.h
@@ -38,8 +38,8 @@
FLAG_CAN_SEEK_FORWARD = 4, // the "10 sec forward button"
FLAG_CAN_SEEK = 8, // the "seek bar"
FLAG_DYNAMIC_DURATION = 16,
- FLAG_SECURE = 32,
- FLAG_PROTECTED = 64,
+ FLAG_SECURE = 32, // Secure codec is required.
+ FLAG_PROTECTED = 64, // The screen needs to be protected (screenshot is disabled).
};
enum {
diff --git a/media/libstagefright/codecs/aacenc/SoftAACEncoder.cpp b/media/libstagefright/codecs/aacenc/SoftAACEncoder.cpp
index 96bbb85..67c31af 100644
--- a/media/libstagefright/codecs/aacenc/SoftAACEncoder.cpp
+++ b/media/libstagefright/codecs/aacenc/SoftAACEncoder.cpp
@@ -266,10 +266,6 @@
return OMX_ErrorUndefined;
}
- if (formatParams->nIndex > 0) {
- return OMX_ErrorNoMore;
- }
-
if ((formatParams->nPortIndex == 0
&& formatParams->eEncoding != OMX_AUDIO_CodingPCM)
|| (formatParams->nPortIndex == 1
diff --git a/media/libstagefright/codecs/aacenc/SoftAACEncoder2.cpp b/media/libstagefright/codecs/aacenc/SoftAACEncoder2.cpp
index 44415e2..96e668e 100644
--- a/media/libstagefright/codecs/aacenc/SoftAACEncoder2.cpp
+++ b/media/libstagefright/codecs/aacenc/SoftAACEncoder2.cpp
@@ -305,10 +305,6 @@
return OMX_ErrorUndefined;
}
- if (formatParams->nIndex > 0) {
- return OMX_ErrorNoMore;
- }
-
if ((formatParams->nPortIndex == 0
&& formatParams->eEncoding != OMX_AUDIO_CodingPCM)
|| (formatParams->nPortIndex == 1
diff --git a/media/libstagefright/codecs/amrnb/enc/SoftAMRNBEncoder.cpp b/media/libstagefright/codecs/amrnb/enc/SoftAMRNBEncoder.cpp
index aaa6731..f97c44f 100644
--- a/media/libstagefright/codecs/amrnb/enc/SoftAMRNBEncoder.cpp
+++ b/media/libstagefright/codecs/amrnb/enc/SoftAMRNBEncoder.cpp
@@ -226,10 +226,6 @@
return OMX_ErrorUndefined;
}
- if (formatParams->nIndex > 0) {
- return OMX_ErrorNoMore;
- }
-
if ((formatParams->nPortIndex == 0
&& formatParams->eEncoding != OMX_AUDIO_CodingPCM)
|| (formatParams->nPortIndex == 1
diff --git a/media/libstagefright/codecs/amrwbenc/SoftAMRWBEncoder.cpp b/media/libstagefright/codecs/amrwbenc/SoftAMRWBEncoder.cpp
index 9d50c4e..f05f552 100644
--- a/media/libstagefright/codecs/amrwbenc/SoftAMRWBEncoder.cpp
+++ b/media/libstagefright/codecs/amrwbenc/SoftAMRWBEncoder.cpp
@@ -264,10 +264,6 @@
return OMX_ErrorUndefined;
}
- if (formatParams->nIndex > 0) {
- return OMX_ErrorNoMore;
- }
-
if ((formatParams->nPortIndex == 0
&& formatParams->eEncoding != OMX_AUDIO_CodingPCM)
|| (formatParams->nPortIndex == 1
diff --git a/media/libstagefright/codecs/m4v_h263/dec/SoftMPEG4.cpp b/media/libstagefright/codecs/m4v_h263/dec/SoftMPEG4.cpp
index 1dd631a..411a251 100644
--- a/media/libstagefright/codecs/m4v_h263/dec/SoftMPEG4.cpp
+++ b/media/libstagefright/codecs/m4v_h263/dec/SoftMPEG4.cpp
@@ -255,13 +255,28 @@
mSignalledError = true;
return;
}
+
+ // Need to check if header contains new info, e.g., width/height, etc.
+ VopHeaderInfo header_info;
+ uint8_t *bitstreamTmp = bitstream;
+ if (PVDecodeVopHeader(
+ mHandle, &bitstreamTmp, ×tamp, &tmp,
+ &header_info, &useExtTimestamp,
+ outHeader->pBuffer) != PV_TRUE) {
+ ALOGE("failed to decode vop header.");
+
+ notify(OMX_EventError, OMX_ErrorUndefined, 0, NULL);
+ mSignalledError = true;
+ return;
+ }
+ if (handlePortSettingsChange()) {
+ return;
+ }
+
// The PV decoder is lying to us, sometimes it'll claim to only have
// consumed a subset of the buffer when it clearly consumed all of it.
// ignore whatever it says...
- if (PVDecodeVideoFrame(
- mHandle, &bitstream, ×tamp, &tmp,
- &useExtTimestamp,
- outHeader->pBuffer) != PV_TRUE) {
+ if (PVDecodeVopBody(mHandle, &tmp) != PV_TRUE) {
ALOGE("failed to decode video frame.");
notify(OMX_EventError, OMX_ErrorUndefined, 0, NULL);
diff --git a/media/libstagefright/codecs/m4v_h263/dec/src/vop.cpp b/media/libstagefright/codecs/m4v_h263/dec/src/vop.cpp
index 60c79a6..f18f789 100644
--- a/media/libstagefright/codecs/m4v_h263/dec/src/vop.cpp
+++ b/media/libstagefright/codecs/m4v_h263/dec/src/vop.cpp
@@ -15,6 +15,8 @@
* and limitations under the License.
* -------------------------------------------------------------------
*/
+#include "log/log.h"
+
#include "mp4dec_lib.h"
#include "bitstream.h"
#include "vlc_decode.h"
@@ -1336,8 +1338,7 @@
}
tmpvar = BitstreamReadBits16(stream, 9);
- video->displayWidth = (tmpvar + 1) << 2;
- video->width = (video->displayWidth + 15) & -16;
+ int tmpDisplayWidth = (tmpvar + 1) << 2;
/* marker bit */
if (!BitstreamRead1Bits(stream))
{
@@ -1350,14 +1351,21 @@
status = PV_FAIL;
goto return_point;
}
- video->displayHeight = tmpvar << 2;
- video->height = (video->displayHeight + 15) & -16;
+ int tmpDisplayHeight = tmpvar << 2;
+ int tmpHeight = (tmpDisplayHeight + 15) & -16;
+ int tmpWidth = (tmpDisplayWidth + 15) & -16;
- if (video->height * video->width > video->size)
+ if (tmpHeight * tmpWidth > video->size)
{
+ // This is just possibly "b/37079296".
+ ALOGE("b/37079296");
status = PV_FAIL;
goto return_point;
}
+ video->displayWidth = tmpDisplayWidth;
+ video->width = tmpWidth;
+ video->displayHeight = tmpDisplayHeight;
+ video->height = tmpHeight;
video->nTotalMB = video->width / MB_SIZE * video->height / MB_SIZE;
diff --git a/media/libstagefright/codecs/m4v_h263/enc/src/mp4enc_api.cpp b/media/libstagefright/codecs/m4v_h263/enc/src/mp4enc_api.cpp
index c2b7c8d..7ab8f45 100644
--- a/media/libstagefright/codecs/m4v_h263/enc/src/mp4enc_api.cpp
+++ b/media/libstagefright/codecs/m4v_h263/enc/src/mp4enc_api.cpp
@@ -773,7 +773,7 @@
|| (size_t)(size + (size >> 1)) > SIZE_MAX / sizeof(PIXEL)) {
goto CLEAN_UP;
}
- video->currVop->yChan = (PIXEL *)M4VENC_MALLOC(sizeof(PIXEL) * (size + (size >> 1))); /* Memory for currVop Y */
+ video->currVop->allChan = video->currVop->yChan = (PIXEL *)M4VENC_MALLOC(sizeof(PIXEL) * (size + (size >> 1))); /* Memory for currVop Y */
if (video->currVop->yChan == NULL) goto CLEAN_UP;
video->currVop->uChan = video->currVop->yChan + size;/* Memory for currVop U */
video->currVop->vChan = video->currVop->uChan + (size >> 2);/* Memory for currVop V */
@@ -791,7 +791,7 @@
video->prevBaseVop = (Vop *) M4VENC_MALLOC(sizeof(Vop)); /* Memory for Previous Base Vop */
if (video->prevBaseVop == NULL) goto CLEAN_UP;
- video->prevBaseVop->yChan = (PIXEL *) M4VENC_MALLOC(sizeof(PIXEL) * (size + (size >> 1))); /* Memory for prevBaseVop Y */
+ video->prevBaseVop->allChan = video->prevBaseVop->yChan = (PIXEL *) M4VENC_MALLOC(sizeof(PIXEL) * (size + (size >> 1))); /* Memory for prevBaseVop Y */
if (video->prevBaseVop->yChan == NULL) goto CLEAN_UP;
video->prevBaseVop->uChan = video->prevBaseVop->yChan + size; /* Memory for prevBaseVop U */
video->prevBaseVop->vChan = video->prevBaseVop->uChan + (size >> 2); /* Memory for prevBaseVop V */
@@ -808,7 +808,7 @@
{
video->nextBaseVop = (Vop *) M4VENC_MALLOC(sizeof(Vop)); /* Memory for Next Base Vop */
if (video->nextBaseVop == NULL) goto CLEAN_UP;
- video->nextBaseVop->yChan = (PIXEL *) M4VENC_MALLOC(sizeof(PIXEL) * (size + (size >> 1))); /* Memory for nextBaseVop Y */
+ video->nextBaseVop->allChan = video->nextBaseVop->yChan = (PIXEL *) M4VENC_MALLOC(sizeof(PIXEL) * (size + (size >> 1))); /* Memory for nextBaseVop Y */
if (video->nextBaseVop->yChan == NULL) goto CLEAN_UP;
video->nextBaseVop->uChan = video->nextBaseVop->yChan + size; /* Memory for nextBaseVop U */
video->nextBaseVop->vChan = video->nextBaseVop->uChan + (size >> 2); /* Memory for nextBaseVop V */
@@ -825,7 +825,7 @@
{
video->prevEnhanceVop = (Vop *) M4VENC_MALLOC(sizeof(Vop)); /* Memory for Previous Enhancement Vop */
if (video->prevEnhanceVop == NULL) goto CLEAN_UP;
- video->prevEnhanceVop->yChan = (PIXEL *) M4VENC_MALLOC(sizeof(PIXEL) * (size + (size >> 1))); /* Memory for Previous Ehancement Y */
+ video->prevEnhanceVop->allChan = video->prevEnhanceVop->yChan = (PIXEL *) M4VENC_MALLOC(sizeof(PIXEL) * (size + (size >> 1))); /* Memory for Previous Ehancement Y */
if (video->prevEnhanceVop->yChan == NULL) goto CLEAN_UP;
video->prevEnhanceVop->uChan = video->prevEnhanceVop->yChan + size; /* Memory for Previous Enhancement U */
video->prevEnhanceVop->vChan = video->prevEnhanceVop->uChan + (size >> 2); /* Memory for Previous Enhancement V */
@@ -1196,39 +1196,35 @@
if (video->currVop)
{
- if (video->currVop->yChan)
+ if (video->currVop->allChan)
{
- video->currVop->yChan -= offset;
- M4VENC_FREE(video->currVop->yChan);
+ M4VENC_FREE(video->currVop->allChan);
}
M4VENC_FREE(video->currVop);
}
if (video->nextBaseVop)
{
- if (video->nextBaseVop->yChan)
+ if (video->nextBaseVop->allChan)
{
- video->nextBaseVop->yChan -= offset;
- M4VENC_FREE(video->nextBaseVop->yChan);
+ M4VENC_FREE(video->nextBaseVop->allChan);
}
M4VENC_FREE(video->nextBaseVop);
}
if (video->prevBaseVop)
{
- if (video->prevBaseVop->yChan)
+ if (video->prevBaseVop->allChan)
{
- video->prevBaseVop->yChan -= offset;
- M4VENC_FREE(video->prevBaseVop->yChan);
+ M4VENC_FREE(video->prevBaseVop->allChan);
}
M4VENC_FREE(video->prevBaseVop);
}
if (video->prevEnhanceVop)
{
- if (video->prevEnhanceVop->yChan)
+ if (video->prevEnhanceVop->allChan)
{
- video->prevEnhanceVop->yChan -= offset;
- M4VENC_FREE(video->prevEnhanceVop->yChan);
+ M4VENC_FREE(video->prevEnhanceVop->allChan);
}
M4VENC_FREE(video->prevEnhanceVop);
}
diff --git a/media/libstagefright/codecs/m4v_h263/enc/src/mp4lib_int.h b/media/libstagefright/codecs/m4v_h263/enc/src/mp4lib_int.h
index 3bc9421..b05099c 100644
--- a/media/libstagefright/codecs/m4v_h263/enc/src/mp4lib_int.h
+++ b/media/libstagefright/codecs/m4v_h263/enc/src/mp4lib_int.h
@@ -39,6 +39,7 @@
typedef struct tagVOP
{
+ PIXEL *allChan; /* [yuv]Chan point into this buffer */
PIXEL *yChan; /* The Y component */
PIXEL *uChan; /* The U component */
PIXEL *vChan; /* The V component */
diff --git a/media/libstagefright/include/RemoteDataSource.h b/media/libstagefright/include/RemoteDataSource.h
index 255b7ae..c91ddfc 100644
--- a/media/libstagefright/include/RemoteDataSource.h
+++ b/media/libstagefright/include/RemoteDataSource.h
@@ -54,6 +54,9 @@
return mSource->getSize(size);
}
virtual void close() {
+ // Protect strong pointer assignments. This also can be called from the binder
+ // clean-up procedure which is running on a separate thread.
+ Mutex::Autolock lock(mCloseLock);
mSource = nullptr;
mMemory = nullptr;
}
@@ -75,6 +78,7 @@
sp<IMemory> mMemory;
sp<DataSource> mSource;
String8 mName;
+ Mutex mCloseLock;
explicit RemoteDataSource(const sp<DataSource> &source) {
mSource = source;
diff --git a/media/libstagefright/omx/SoftVideoDecoderOMXComponent.cpp b/media/libstagefright/omx/SoftVideoDecoderOMXComponent.cpp
index 409cef7..98a9f54 100644
--- a/media/libstagefright/omx/SoftVideoDecoderOMXComponent.cpp
+++ b/media/libstagefright/omx/SoftVideoDecoderOMXComponent.cpp
@@ -430,10 +430,6 @@
return OMX_ErrorBadPortIndex;
}
- if (formatParams->nIndex != 0) {
- return OMX_ErrorNoMore;
- }
-
if (formatParams->nPortIndex == kInputPortIndex) {
if (formatParams->eCompressionFormat != mCodingType
|| formatParams->eColorFormat != OMX_COLOR_FormatUnused) {
diff --git a/services/mediaextractor/main_extractorservice.cpp b/services/mediaextractor/main_extractorservice.cpp
index 9bc69c4..6a5320d 100644
--- a/services/mediaextractor/main_extractorservice.cpp
+++ b/services/mediaextractor/main_extractorservice.cpp
@@ -25,6 +25,7 @@
#include <string>
#include <android-base/logging.h>
+#include <utils/misc.h>
// from LOCAL_C_INCLUDES
#include "IcuUtils.h"
@@ -47,6 +48,13 @@
20 /* upper limit as percentage of physical RAM */);
signal(SIGPIPE, SIG_IGN);
+
+ //b/62255959: this forces libutis.so to dlopen vendor version of libutils.so
+ //before minijail is on. This is dirty but required since some syscalls such
+ //as pread64 are used by linker but aren't allowed in the minijail. By
+ //calling the function before entering minijail, we can force dlopen.
+ android::report_sysprop_change();
+
SetUpMinijail(kSystemSeccompPolicyPath, kVendorSeccompPolicyPath);
InitializeIcuOrDie();
diff --git a/services/radio/RadioService.cpp b/services/radio/RadioService.cpp
index f7a73c3..beb7c09 100644
--- a/services/radio/RadioService.cpp
+++ b/services/radio/RadioService.cpp
@@ -34,6 +34,7 @@
#include <binder/IServiceManager.h>
#include <binder/MemoryBase.h>
#include <binder/MemoryHeapBase.h>
+#include <binder/PermissionCache.h>
#include <hardware/radio.h>
#include <media/AudioSystem.h>
#include "RadioService.h"
@@ -43,6 +44,8 @@
static const char kRadioTunerAudioDeviceName[] = "Radio tuner source";
+static const String16 RADIO_PERMISSION("android.permission.ACCESS_FM_RADIO");
+
RadioService::RadioService()
: BnRadioService(), mNextUniqueId(1)
{
@@ -84,6 +87,9 @@
status_t RadioService::listModules(struct radio_properties *properties,
uint32_t *numModules)
{
+ if (!PermissionCache::checkCallingPermission(RADIO_PERMISSION)) {
+ return PERMISSION_DENIED;
+ }
ALOGV("listModules");
AutoMutex lock(mServiceLock);
@@ -104,6 +110,9 @@
bool withAudio,
sp<IRadio>& radio)
{
+ if (!PermissionCache::checkCallingPermission(RADIO_PERMISSION)) {
+ return PERMISSION_DENIED;
+ }
ALOGV("%s %d config %p withAudio %d", __FUNCTION__, handle, config, withAudio);
AutoMutex lock(mServiceLock);
@@ -717,6 +726,9 @@
status_t RadioService::ModuleClient::setConfiguration(const struct radio_band_config *config)
{
+ if (!PermissionCache::checkCallingPermission(RADIO_PERMISSION)) {
+ return PERMISSION_DENIED;
+ }
AutoMutex lock(mLock);
status_t status = NO_ERROR;
ALOGV("%s locked", __FUNCTION__);
@@ -738,6 +750,9 @@
status_t RadioService::ModuleClient::getConfiguration(struct radio_band_config *config)
{
+ if (!PermissionCache::checkCallingPermission(RADIO_PERMISSION)) {
+ return PERMISSION_DENIED;
+ }
AutoMutex lock(mLock);
status_t status = NO_ERROR;
ALOGV("%s locked", __FUNCTION__);
@@ -756,6 +771,9 @@
status_t RadioService::ModuleClient::setMute(bool mute)
{
+ if (!PermissionCache::checkCallingPermission(RADIO_PERMISSION)) {
+ return PERMISSION_DENIED;
+ }
sp<Module> module;
{
Mutex::Autolock _l(mLock);
@@ -774,6 +792,9 @@
status_t RadioService::ModuleClient::getMute(bool *mute)
{
+ if (!PermissionCache::checkCallingPermission(RADIO_PERMISSION)) {
+ return PERMISSION_DENIED;
+ }
sp<Module> module;
{
Mutex::Autolock _l(mLock);
@@ -788,6 +809,9 @@
status_t RadioService::ModuleClient::scan(radio_direction_t direction, bool skipSubChannel)
{
+ if (!PermissionCache::checkCallingPermission(RADIO_PERMISSION)) {
+ return PERMISSION_DENIED;
+ }
AutoMutex lock(mLock);
ALOGV("%s locked", __FUNCTION__);
status_t status;
@@ -801,6 +825,9 @@
status_t RadioService::ModuleClient::step(radio_direction_t direction, bool skipSubChannel)
{
+ if (!PermissionCache::checkCallingPermission(RADIO_PERMISSION)) {
+ return PERMISSION_DENIED;
+ }
AutoMutex lock(mLock);
ALOGV("%s locked", __FUNCTION__);
status_t status;
@@ -814,6 +841,9 @@
status_t RadioService::ModuleClient::tune(uint32_t channel, uint32_t subChannel)
{
+ if (!PermissionCache::checkCallingPermission(RADIO_PERMISSION)) {
+ return PERMISSION_DENIED;
+ }
AutoMutex lock(mLock);
ALOGV("%s locked", __FUNCTION__);
status_t status;
@@ -827,6 +857,9 @@
status_t RadioService::ModuleClient::cancel()
{
+ if (!PermissionCache::checkCallingPermission(RADIO_PERMISSION)) {
+ return PERMISSION_DENIED;
+ }
AutoMutex lock(mLock);
ALOGV("%s locked", __FUNCTION__);
status_t status;
@@ -840,6 +873,9 @@
status_t RadioService::ModuleClient::getProgramInformation(struct radio_program_info *info)
{
+ if (!PermissionCache::checkCallingPermission(RADIO_PERMISSION)) {
+ return PERMISSION_DENIED;
+ }
AutoMutex lock(mLock);
ALOGV("%s locked", __FUNCTION__);
status_t status;
@@ -854,6 +890,9 @@
status_t RadioService::ModuleClient::hasControl(bool *hasControl)
{
+ if (!PermissionCache::checkCallingPermission(RADIO_PERMISSION)) {
+ return PERMISSION_DENIED;
+ }
Mutex::Autolock lock(mLock);
ALOGV("%s locked", __FUNCTION__);
*hasControl = mTuner != 0;