Snap for 12404440 from 8e7761045a53e187e31d5c2d7ef7b929d6523b36 to 24Q4-release
Change-Id: I3146818884913fb95ce885fb1e26343dd587f4c1
diff --git a/media/libaudioclient/ToneGenerator.cpp b/media/libaudioclient/ToneGenerator.cpp
index e723926..d325d0a 100644
--- a/media/libaudioclient/ToneGenerator.cpp
+++ b/media/libaudioclient/ToneGenerator.cpp
@@ -1033,17 +1033,11 @@
mState = TONE_IDLE;
- if (AudioSystem::getOutputSamplingRate(&mSamplingRate, streamType) != NO_ERROR) {
- ALOGE("Unable to marshal AudioFlinger");
- return;
- }
mThreadCanCallJava = threadCanCallJava;
mStreamType = streamType;
mVolume = volume;
mpToneDesc = NULL;
mpNewToneDesc = NULL;
- // Generate tone by chunks of 20 ms to keep cadencing precision
- mProcessSize = (mSamplingRate * 20) / 1000;
char value[PROPERTY_VALUE_MAX];
if (property_get("gsm.operator.iso-country", value, "") == 0) {
@@ -1321,6 +1315,7 @@
mpAudioTrack = new AudioTrack(attributionSource);
ALOGV("AudioTrack(%p) created", mpAudioTrack.get());
+
audio_attributes_t attr;
audio_stream_type_t streamType = mStreamType;
if (mStreamType == AUDIO_STREAM_VOICE_CALL || mStreamType == AUDIO_STREAM_BLUETOOTH_SCO) {
@@ -1329,13 +1324,12 @@
attr = AudioSystem::streamTypeToAttributes(streamType);
attr.flags = static_cast<audio_flags_mask_t>(attr.flags | AUDIO_FLAG_LOW_LATENCY);
- const size_t frameCount = mProcessSize;
status_t status = mpAudioTrack->set(
AUDIO_STREAM_DEFAULT,
0, // sampleRate
AUDIO_FORMAT_PCM_16_BIT,
AUDIO_CHANNEL_OUT_MONO,
- frameCount,
+ 0, // frameCount
AUDIO_OUTPUT_FLAG_NONE,
wp<AudioTrack::IAudioTrackCallback>::fromExisting(this),
0, // notificationFrames
@@ -1355,6 +1349,10 @@
return false;
}
+ mSamplingRate = mpAudioTrack->getSampleRate();
+ // Generate tone by chunks of 20 ms to keep cadencing precision
+ mProcessSize = (mSamplingRate * 20) / 1000;
+
mpAudioTrack->setVolume(mVolume);
mState = TONE_INIT;
return true;
diff --git a/media/libmediaplayerservice/Android.bp b/media/libmediaplayerservice/Android.bp
index 718f782..a10c509 100644
--- a/media/libmediaplayerservice/Android.bp
+++ b/media/libmediaplayerservice/Android.bp
@@ -45,6 +45,7 @@
"android.hardware.media.omx@1.0",
"av-types-aidl-cpp",
"framework-permission-aidl-cpp",
+ "libaconfig_storage_read_api_cc",
"libaudioclient_aidl_conversion",
"libbase",
"libbinder_ndk",
@@ -76,6 +77,7 @@
"libstagefright_httplive",
"libutils",
"packagemanager_aidl-cpp",
+ "server_configurable_flags",
],
header_libs: [
@@ -86,6 +88,7 @@
],
static_libs: [
+ "com.android.media.flags.editing-aconfig-cc",
"libplayerservice_datasource",
"libstagefright_nuplayer",
"libstagefright_rtsp",
diff --git a/media/libmediaplayerservice/StagefrightRecorder.cpp b/media/libmediaplayerservice/StagefrightRecorder.cpp
index dce6ba8..086baa3 100644
--- a/media/libmediaplayerservice/StagefrightRecorder.cpp
+++ b/media/libmediaplayerservice/StagefrightRecorder.cpp
@@ -68,6 +68,7 @@
#include <system/audio.h>
#include <media/stagefright/rtsp/ARTPWriter.h>
+#include <com_android_media_editing_flags.h>
namespace android {
@@ -2121,7 +2122,8 @@
uint32_t bLayers = std::min(2u, tsLayers - 1); // use up-to 2 B-layers
// TODO(b/341121900): Remove this once B frames are handled correctly in screen recorder
// use case in case of mic only
- if (mAudioSource == AUDIO_SOURCE_MIC && mVideoSource == VIDEO_SOURCE_SURFACE) {
+ if (!com::android::media::editing::flags::stagefrightrecorder_enable_b_frames()
+ && mAudioSource == AUDIO_SOURCE_MIC && mVideoSource == VIDEO_SOURCE_SURFACE) {
bLayers = 0;
}
uint32_t pLayers = tsLayers - bLayers;
diff --git a/media/libstagefright/Android.bp b/media/libstagefright/Android.bp
index ac178aa..d084f10 100644
--- a/media/libstagefright/Android.bp
+++ b/media/libstagefright/Android.bp
@@ -321,6 +321,7 @@
static_libs: [
"android.media.codec-aconfig-cc",
+ "com.android.media.flags.editing-aconfig-cc",
"libstagefright_esds",
"libstagefright_color_conversion",
"libyuv",
diff --git a/media/libstagefright/MPEG4Writer.cpp b/media/libstagefright/MPEG4Writer.cpp
index 76b6aa6..3aa0107 100644
--- a/media/libstagefright/MPEG4Writer.cpp
+++ b/media/libstagefright/MPEG4Writer.cpp
@@ -53,6 +53,8 @@
#include <media/esds/ESDS.h>
#include "include/HevcUtils.h"
+#include <com_android_media_editing_flags.h>
+
#ifndef __predict_false
#define __predict_false(exp) __builtin_expect((exp) != 0, 0)
#endif
@@ -4944,6 +4946,8 @@
// Track with start offset.
ALOGV("Tracks starting > 0");
int32_t editDurationTicks = 0;
+ int32_t trackStartOffsetBFramesUs = getMinCttsOffsetTimeUs() - kMaxCttsOffsetTimeUs;
+ ALOGV("trackStartOffsetBFramesUs:%" PRId32, trackStartOffsetBFramesUs);
if (mMinCttsOffsetTicks == mMaxCttsOffsetTicks) {
// Video with no B frame or non-video track.
editDurationTicks =
@@ -4952,8 +4956,6 @@
ALOGV("editDuration:%" PRId64 "us", (trackStartOffsetUs + movieStartOffsetBFramesUs));
} else {
// Track with B frame.
- int32_t trackStartOffsetBFramesUs = getMinCttsOffsetTimeUs() - kMaxCttsOffsetTimeUs;
- ALOGV("trackStartOffsetBFramesUs:%" PRId32, trackStartOffsetBFramesUs);
editDurationTicks =
((trackStartOffsetUs + movieStartOffsetBFramesUs +
trackStartOffsetBFramesUs) * mvhdTimeScale + 5E5) / 1E6;
@@ -4967,7 +4969,15 @@
} else if (editDurationTicks < 0) {
// Only video tracks with B Frames would hit this case.
ALOGV("Edit list entry to negate start offset by B frames in other tracks");
- addOneElstTableEntry(tkhdDurationTicks, std::abs(editDurationTicks), 1, 0);
+ if (com::android::media::editing::flags::
+ stagefrightrecorder_enable_b_frames()) {
+ int32_t mediaTimeTicks =
+ ((trackStartOffsetUs + movieStartOffsetBFramesUs +
+ trackStartOffsetBFramesUs) * mTimeScale - 5E5) / 1E6;
+ addOneElstTableEntry(tkhdDurationTicks, std::abs(mediaTimeTicks), 1, 0);
+ } else {
+ addOneElstTableEntry(tkhdDurationTicks, std::abs(editDurationTicks), 1, 0);
+ }
} else {
ALOGV("No edit list entry needed for this track");
}
diff --git a/media/libstagefright/writer_fuzzers/Android.bp b/media/libstagefright/writer_fuzzers/Android.bp
index 58aa7cd..840c6b3c 100644
--- a/media/libstagefright/writer_fuzzers/Android.bp
+++ b/media/libstagefright/writer_fuzzers/Android.bp
@@ -24,6 +24,7 @@
// to get the below license kinds:
// SPDX-license-identifier-Apache-2.0
default_applicable_licenses: ["frameworks_av_media_libstagefright_license"],
+ default_team: "trendy_team_android_media_solutions_editing",
}
cc_defaults {
@@ -35,14 +36,17 @@
"include",
],
static_libs: [
+ "com.android.media.flags.editing-aconfig-cc",
"liblog",
- "libstagefright_foundation",
"libstagefright",
+ "libstagefright_foundation",
],
shared_libs: [
+ "libaconfig_storage_read_api_cc",
"libbinder",
"libcutils",
"libutils",
+ "server_configurable_flags",
],
}
@@ -96,9 +100,9 @@
}
cc_fuzz {
- name : "mpeg4_writer_fuzzer",
- defaults : ["writer-fuzzer-defaults"],
- srcs : [
+ name: "mpeg4_writer_fuzzer",
+ defaults: ["writer-fuzzer-defaults"],
+ srcs: [
"mpeg4_writer_fuzzer.cpp",
],
static_libs: [
@@ -107,9 +111,9 @@
}
cc_fuzz {
- name : "ogg_writer_fuzzer",
- defaults : ["writer-fuzzer-defaults"],
- srcs : [
+ name: "ogg_writer_fuzzer",
+ defaults: ["writer-fuzzer-defaults"],
+ srcs: [
"ogg_writer_fuzzer.cpp",
],
static_libs: [
@@ -118,9 +122,9 @@
}
cc_fuzz {
- name : "webm_writer_fuzzer",
- defaults : ["writer-fuzzer-defaults"],
- srcs : [
+ name: "webm_writer_fuzzer",
+ defaults: ["writer-fuzzer-defaults"],
+ srcs: [
"webm_writer_fuzzer.cpp",
],
static_libs: [
diff --git a/services/audiopolicy/managerdefault/AudioPolicyManager.cpp b/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
index 574307a..d2fa42b 100644
--- a/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
+++ b/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
@@ -2378,11 +2378,15 @@
// If it is first bit-perfect client, reroute all clients that will be routed to
// the bit-perfect sink so that it is guaranteed only bit-perfect stream is active.
PortHandleVector clientsToInvalidate;
+ std::vector<sp<SwAudioOutputDescriptor>> outputsToResetDevice;
for (size_t i = 0; i < mOutputs.size(); i++) {
if (mOutputs[i] == outputDesc || (!mOutputs[i]->devices().isEmpty() &&
mOutputs[i]->devices().filter(outputDesc->devices()).isEmpty())) {
continue;
}
+ if (mOutputs[i]->getPatchHandle() != AUDIO_PATCH_HANDLE_NONE) {
+ outputsToResetDevice.push_back(mOutputs[i]);
+ }
for (const auto& c : mOutputs[i]->getClientIterable()) {
clientsToInvalidate.push_back(c->portId());
}
@@ -2392,6 +2396,9 @@
__func__);
mpClientInterface->invalidateTracks(clientsToInvalidate);
}
+ for (const auto& output : outputsToResetDevice) {
+ resetOutputDevice(output, 0 /*delayMs*/, nullptr /*patchHandle*/);
+ }
}
}
}
@@ -4379,8 +4386,9 @@
// 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.
- bool forceRouting = !newDevices.isEmpty();
- if (outputDesc->mPreferredAttrInfo != nullptr && newDevices != outputDesc->devices()) {
+ bool newDevicesNotEmpty = !newDevices.isEmpty();
+ if (outputDesc->mPreferredAttrInfo != nullptr && newDevices != outputDesc->devices()
+ && newDevicesNotEmpty) {
// If the device is using preferred mixer attributes, the output need to reopen
// with default configuration when the new selected devices are different from
// current routing devices.
@@ -4388,9 +4396,10 @@
continue;
}
- waitMs = setOutputDevices(__func__, outputDesc, newDevices, forceRouting, delayMs,
- nullptr, !skipDelays /*requiresMuteCheck*/,
- !forceRouting /*requiresVolumeCheck*/, skipDelays);
+ waitMs = setOutputDevices(__func__, outputDesc, newDevices,
+ newDevicesNotEmpty /*force*/, delayMs,
+ nullptr /*patchHandle*/, !skipDelays /*requiresMuteCheck*/,
+ !newDevicesNotEmpty /*requiresVolumeCheck*/, skipDelays);
// Only apply special touch sound delay once
delayMs = 0;
}
diff --git a/services/camera/libcameraservice/api1/client2/ZslProcessor.cpp b/services/camera/libcameraservice/api1/client2/ZslProcessor.cpp
index d4953c1..0f1d0ff 100644
--- a/services/camera/libcameraservice/api1/client2/ZslProcessor.cpp
+++ b/services/camera/libcameraservice/api1/client2/ZslProcessor.cpp
@@ -142,8 +142,12 @@
mHasFocuser(false),
mInputBuffer(nullptr),
mProducer(nullptr),
+#if WB_CAMERA3_AND_PROCESSORS_WITH_DEPENDENCIES
+ mInputSurface(nullptr),
+#else
mInputProducer(nullptr),
mInputProducerSlot(-1),
+#endif
mBuffersToDetach(0) {
// Initialize buffer queue and frame list based on pipeline max depth.
size_t pipelineMaxDepth = kDefaultMaxPipelineDepth;
@@ -331,10 +335,17 @@
mInputStreamId = NO_STREAM;
}
+#if WB_CAMERA3_AND_PROCESSORS_WITH_DEPENDENCIES
+ if (nullptr != mInputSurface.get()) {
+ // The surface destructor calls disconnect
+ mInputSurface.clear();
+ }
+#else
if (nullptr != mInputProducer.get()) {
mInputProducer->disconnect(NATIVE_WINDOW_API_CPU);
mInputProducer.clear();
}
+#endif
return OK;
}
@@ -393,11 +404,19 @@
void ZslProcessor::doNotifyInputReleasedLocked() {
assert(nullptr != mInputBuffer.get());
+#if WB_CAMERA3_AND_PROCESSORS_WITH_DEPENDENCIES
+ assert(nullptr != mInputSurface.get());
+#else
assert(nullptr != mInputProducer.get());
+#endif
sp<GraphicBuffer> gb;
sp<Fence> fence;
+#if WB_CAMERA3_AND_PROCESSORS_WITH_DEPENDENCIES
+ auto rc = mInputSurface->detachNextBuffer(&gb, &fence);
+#else
auto rc = mInputProducer->detachNextBuffer(&gb, &fence);
+#endif
if (NO_ERROR != rc) {
ALOGE("%s: Failed to detach buffer from input producer: %d",
__FUNCTION__, rc);
@@ -456,9 +475,15 @@
__FUNCTION__, (unsigned int) metadataIdx);
}
+#if WB_CAMERA3_AND_PROCESSORS_WITH_DEPENDENCIES
+ if (nullptr == mInputSurface.get()) {
+ res = client->getCameraDevice()->getInputSurface(
+ &mInputSurface);
+#else
if (nullptr == mInputProducer.get()) {
res = client->getCameraDevice()->getInputBufferProducer(
&mInputProducer);
+#endif
if (res != OK) {
ALOGE("%s: Camera %d: Unable to retrieve input producer: "
"%s (%d)", __FUNCTION__, client->getCameraId(),
@@ -466,9 +491,14 @@
return res;
}
+#if WB_CAMERA3_AND_PROCESSORS_WITH_DEPENDENCIES
+ res = mInputSurface->connect(NATIVE_WINDOW_API_CPU, new InputProducerListener(this),
+ false);
+#else
IGraphicBufferProducer::QueueBufferOutput output;
res = mInputProducer->connect(new InputProducerListener(this),
NATIVE_WINDOW_API_CPU, false, &output);
+#endif
if (res != OK) {
ALOGE("%s: Camera %d: Unable to connect to input producer: "
"%s (%d)", __FUNCTION__, client->getCameraId(),
@@ -629,19 +659,32 @@
}
BufferItem &item = mInputBuffer->getBufferItem();
+#if WB_CAMERA3_AND_PROCESSORS_WITH_DEPENDENCIES
+ auto rc = mInputSurface->attachBuffer(item.mGraphicBuffer->getNativeBuffer());
+#else
auto rc = mInputProducer->attachBuffer(&mInputProducerSlot,
item.mGraphicBuffer);
+#endif
if (OK != rc) {
ALOGE("%s: Failed to attach input ZSL buffer to producer: %d",
__FUNCTION__, rc);
return rc;
}
+#if WB_CAMERA3_AND_PROCESSORS_WITH_DEPENDENCIES
+ mInputSurface->setBuffersTimestamp(item.mTimestamp);
+ mInputSurface->setBuffersDataSpace(static_cast<ui::Dataspace>(item.mDataSpace));
+ mInputSurface->setCrop(&item.mCrop);
+ mInputSurface->setScalingMode(item.mScalingMode);
+ mInputSurface->setBuffersTransform(item.mTransform);
+ rc = mInputSurface->queueBuffer(item.mGraphicBuffer, item.mFence);
+#else
IGraphicBufferProducer::QueueBufferOutput output;
IGraphicBufferProducer::QueueBufferInput input(item.mTimestamp,
item.mIsAutoTimestamp, item.mDataSpace, item.mCrop,
item.mScalingMode, item.mTransform, item.mFence);
rc = mInputProducer->queueBuffer(mInputProducerSlot, input, &output);
+#endif
if (OK != rc) {
ALOGE("%s: Failed to queue ZSL buffer to producer: %d",
__FUNCTION__, rc);
diff --git a/services/camera/libcameraservice/api1/client2/ZslProcessor.h b/services/camera/libcameraservice/api1/client2/ZslProcessor.h
index 3186233..a98160a 100644
--- a/services/camera/libcameraservice/api1/client2/ZslProcessor.h
+++ b/services/camera/libcameraservice/api1/client2/ZslProcessor.h
@@ -24,8 +24,9 @@
#include <utils/Condition.h>
#include <gui/BufferItem.h>
#include <gui/BufferItemConsumer.h>
-#include <gui/RingBufferConsumer.h>
+#include <gui/Flags.h>
#include <gui/IProducerListener.h>
+#include <gui/RingBufferConsumer.h>
#include <camera/CameraMetadata.h>
#include "api1/client2/FrameProcessor.h"
@@ -83,6 +84,20 @@
private:
+#if WB_CAMERA3_AND_PROCESSORS_WITH_DEPENDENCIES
+ class InputProducerListener : public SurfaceListener {
+ public:
+ InputProducerListener(wp<ZslProcessor> parent) : mParent(parent) {}
+ virtual void onBufferReleased() override;
+ virtual void onBuffersDiscarded(const std::vector<sp<GraphicBuffer>>& /* buffers */)
+ override {}
+ virtual void onBufferDetached(int /* slot */) override {}
+ virtual bool needsReleaseNotify() override { return true; }
+
+ private:
+ wp<ZslProcessor> mParent;
+ };
+#else
class InputProducerListener : public BnProducerListener {
public:
InputProducerListener(wp<ZslProcessor> parent) : mParent(parent) {}
@@ -92,6 +107,7 @@
private:
wp<ZslProcessor> mParent;
};
+#endif
static const nsecs_t kWaitDuration = 10000000; // 10 ms
nsecs_t mLatestClearedBufferTimestamp;
@@ -139,8 +155,13 @@
// Input buffer queued into HAL
sp<RingBufferConsumer::PinnedBufferItem> mInputBuffer;
sp<RingBufferConsumer> mProducer;
+
+#if WB_CAMERA3_AND_PROCESSORS_WITH_DEPENDENCIES
+ sp<Surface> mInputSurface;
+#else
sp<IGraphicBufferProducer> mInputProducer;
int mInputProducerSlot;
+#endif
Condition mBuffersToDetachSignal;
int mBuffersToDetach;
diff --git a/services/camera/libcameraservice/api2/CameraDeviceClient.cpp b/services/camera/libcameraservice/api2/CameraDeviceClient.cpp
index 8c44e35..f469aad 100644
--- a/services/camera/libcameraservice/api2/CameraDeviceClient.cpp
+++ b/services/camera/libcameraservice/api2/CameraDeviceClient.cpp
@@ -1240,6 +1240,18 @@
if (!mDevice.get()) {
return STATUS_ERROR(CameraService::ERROR_DISCONNECTED, "Camera device no longer alive");
}
+#if WB_CAMERA3_AND_PROCESSORS_WITH_DEPENDENCIES
+ sp<Surface> surface;
+ status_t err = mDevice->getInputSurface(&surface);
+ if (err != OK) {
+ res = STATUS_ERROR_FMT(CameraService::ERROR_INVALID_OPERATION,
+ "Camera %s: Error getting input Surface: %s (%d)",
+ mCameraIdStr.c_str(), strerror(-err), err);
+ } else {
+ inputSurface->name = toString16("CameraInput");
+ inputSurface->graphicBufferProducer = surface->getIGraphicBufferProducer();
+ }
+#else
sp<IGraphicBufferProducer> producer;
status_t err = mDevice->getInputBufferProducer(&producer);
if (err != OK) {
@@ -1250,6 +1262,7 @@
inputSurface->name = toString16("CameraInput");
inputSurface->graphicBufferProducer = producer;
}
+#endif
return res;
}
diff --git a/services/camera/libcameraservice/common/CameraDeviceBase.h b/services/camera/libcameraservice/common/CameraDeviceBase.h
index aceb5c0..9c8f5ad 100644
--- a/services/camera/libcameraservice/common/CameraDeviceBase.h
+++ b/services/camera/libcameraservice/common/CameraDeviceBase.h
@@ -25,6 +25,7 @@
#include <utils/KeyedVector.h>
#include <utils/Timers.h>
#include <utils/List.h>
+#include <gui/Flags.h>
#include "hardware/camera2.h"
#include "camera/CameraMetadata.h"
@@ -305,9 +306,14 @@
*/
virtual void getOfflineStreamIds(std::vector<int> *offlineStreamIds) = 0;
+#if WB_CAMERA3_AND_PROCESSORS_WITH_DEPENDENCIES
+ // get the surface of the input stream
+ virtual status_t getInputSurface(sp<Surface> *surface) = 0;
+#else
// get the buffer producer of the input stream
virtual status_t getInputBufferProducer(
sp<IGraphicBufferProducer> *producer) = 0;
+#endif
/**
* Create a metadata buffer with fields that the HAL device believes are
diff --git a/services/camera/libcameraservice/device3/Camera3Device.cpp b/services/camera/libcameraservice/device3/Camera3Device.cpp
index 0cb9b1d..bb54f25 100644
--- a/services/camera/libcameraservice/device3/Camera3Device.cpp
+++ b/services/camera/libcameraservice/device3/Camera3Device.cpp
@@ -1441,6 +1441,21 @@
return configureStreamsLocked(operatingMode, filteredParams);
}
+#if WB_CAMERA3_AND_PROCESSORS_WITH_DEPENDENCIES
+status_t Camera3Device::getInputSurface(sp<Surface> *surface) {
+ ATRACE_CALL();
+ Mutex::Autolock il(mInterfaceLock);
+ Mutex::Autolock l(mLock);
+
+ if (surface == NULL) {
+ return BAD_VALUE;
+ } else if (mInputStream == NULL) {
+ return INVALID_OPERATION;
+ }
+
+ return mInputStream->getInputSurface(surface);
+}
+#else
status_t Camera3Device::getInputBufferProducer(
sp<IGraphicBufferProducer> *producer) {
ATRACE_CALL();
@@ -1455,6 +1470,7 @@
return mInputStream->getInputBufferProducer(producer);
}
+#endif
status_t Camera3Device::createDefaultRequest(camera_request_template_t templateId,
CameraMetadata *request) {
diff --git a/services/camera/libcameraservice/device3/Camera3Device.h b/services/camera/libcameraservice/device3/Camera3Device.h
index 3cfe3c9..3c45c1a 100644
--- a/services/camera/libcameraservice/device3/Camera3Device.h
+++ b/services/camera/libcameraservice/device3/Camera3Device.h
@@ -31,6 +31,7 @@
#include <utils/Timers.h>
#include <camera/CaptureResult.h>
+#include <gui/Flags.h>
#include "CameraServiceWatchdog.h"
#include <aidl/android/hardware/camera/device/CameraBlob.h>
@@ -197,8 +198,12 @@
status_t configureStreams(const CameraMetadata& sessionParams,
int operatingMode =
camera_stream_configuration_mode_t::CAMERA_STREAM_CONFIGURATION_NORMAL_MODE) override;
+#if WB_CAMERA3_AND_PROCESSORS_WITH_DEPENDENCIES
+ status_t getInputSurface(sp<Surface> *surface) override;
+#else
status_t getInputBufferProducer(
sp<IGraphicBufferProducer> *producer) override;
+#endif
void getOfflineStreamIds(std::vector<int> *offlineStreamIds) override;
diff --git a/services/camera/libcameraservice/device3/Camera3InputStream.cpp b/services/camera/libcameraservice/device3/Camera3InputStream.cpp
index f9b6037..999f563 100644
--- a/services/camera/libcameraservice/device3/Camera3InputStream.cpp
+++ b/services/camera/libcameraservice/device3/Camera3InputStream.cpp
@@ -182,6 +182,21 @@
/*output*/false, /*transform*/ -1);
}
+#if WB_CAMERA3_AND_PROCESSORS_WITH_DEPENDENCIES
+status_t Camera3InputStream::getInputSurfaceLocked(sp<Surface> *surface) {
+ ATRACE_CALL();
+
+ if (surface == NULL) {
+ return BAD_VALUE;
+ } else if (mSurface == NULL) {
+ ALOGE("%s: No input stream is configured", __FUNCTION__);
+ return INVALID_OPERATION;
+ }
+
+ *surface = mSurface;
+ return OK;
+}
+#else
status_t Camera3InputStream::getInputBufferProducerLocked(
sp<IGraphicBufferProducer> *producer) {
ATRACE_CALL();
@@ -196,6 +211,7 @@
*producer = mProducer;
return OK;
}
+#endif
status_t Camera3InputStream::disconnectLocked() {
@@ -284,7 +300,12 @@
mConsumer->setName(String8::format("Camera3-InputStream-%d", mId));
mConsumer->setMaxAcquiredBufferCount(mTotalBufferCount);
+#if WB_CAMERA3_AND_PROCESSORS_WITH_DEPENDENCIES
+ mSurface = mConsumer->getSurface();
+#else
mProducer = mConsumer->getSurface()->getIGraphicBufferProducer();
+#endif // WB_CAMERA3_AND_PROCESSORS_WITH_DEPENDENCIES
+
#else
mConsumer = new BufferItemConsumer(consumer, mUsage,
mTotalBufferCount);
diff --git a/services/camera/libcameraservice/device3/Camera3InputStream.h b/services/camera/libcameraservice/device3/Camera3InputStream.h
index a99c364..b1603e5 100644
--- a/services/camera/libcameraservice/device3/Camera3InputStream.h
+++ b/services/camera/libcameraservice/device3/Camera3InputStream.h
@@ -18,6 +18,7 @@
#define ANDROID_SERVERS_CAMERA3_INPUT_STREAM_H
#include <utils/RefBase.h>
+#include <gui/Flags.h>
#include <gui/Surface.h>
#include <gui/BufferItemConsumer.h>
@@ -50,7 +51,11 @@
private:
sp<BufferItemConsumer> mConsumer;
+#if WB_CAMERA3_AND_PROCESSORS_WITH_DEPENDENCIES
+ sp<Surface> mSurface;
+#else
sp<IGraphicBufferProducer> mProducer;
+#endif
Vector<BufferItem> mBuffersInFlight;
static const std::string FAKE_ID;
@@ -75,8 +80,12 @@
virtual status_t getInputBufferLocked(camera_stream_buffer *buffer, Size *size);
virtual status_t returnInputBufferLocked(
const camera_stream_buffer &buffer);
+#if WB_CAMERA3_AND_PROCESSORS_WITH_DEPENDENCIES
+ virtual status_t getInputSurfaceLocked(sp<Surface> *surface);
+#else
virtual status_t getInputBufferProducerLocked(
sp<IGraphicBufferProducer> *producer);
+#endif
virtual status_t disconnectLocked();
virtual status_t configureQueueLocked();
diff --git a/services/camera/libcameraservice/device3/Camera3Stream.cpp b/services/camera/libcameraservice/device3/Camera3Stream.cpp
index ceb3d30..ae76e60 100644
--- a/services/camera/libcameraservice/device3/Camera3Stream.cpp
+++ b/services/camera/libcameraservice/device3/Camera3Stream.cpp
@@ -871,12 +871,21 @@
return res;
}
+#if WB_CAMERA3_AND_PROCESSORS_WITH_DEPENDENCIES
+status_t Camera3Stream::getInputSurface(sp<Surface> *surface) {
+ ATRACE_CALL();
+ Mutex::Autolock l(mLock);
+
+ return getInputSurfaceLocked(surface);
+}
+#else
status_t Camera3Stream::getInputBufferProducer(sp<IGraphicBufferProducer> *producer) {
ATRACE_CALL();
Mutex::Autolock l(mLock);
return getInputBufferProducerLocked(producer);
}
+#endif
void Camera3Stream::fireBufferRequestForFrameNumber(uint64_t frameNumber,
const CameraMetadata& settings) {
@@ -990,10 +999,17 @@
ALOGE("%s: This type of stream does not support input", __FUNCTION__);
return INVALID_OPERATION;
}
+#if WB_CAMERA3_AND_PROCESSORS_WITH_DEPENDENCIES
+status_t Camera3Stream::getInputSurfaceLocked(sp<Surface>*) {
+ ALOGE("%s: This type of stream does not support input", __FUNCTION__);
+ return INVALID_OPERATION;
+}
+#else
status_t Camera3Stream::getInputBufferProducerLocked(sp<IGraphicBufferProducer>*) {
ALOGE("%s: This type of stream does not support input", __FUNCTION__);
return INVALID_OPERATION;
}
+#endif
void Camera3Stream::addBufferListener(
wp<Camera3StreamBufferListener> listener) {
diff --git a/services/camera/libcameraservice/device3/Camera3Stream.h b/services/camera/libcameraservice/device3/Camera3Stream.h
index ccd1044..1519ada 100644
--- a/services/camera/libcameraservice/device3/Camera3Stream.h
+++ b/services/camera/libcameraservice/device3/Camera3Stream.h
@@ -17,6 +17,7 @@
#ifndef ANDROID_SERVERS_CAMERA3_STREAM_H
#define ANDROID_SERVERS_CAMERA3_STREAM_H
+#include <gui/Flags.h>
#include <gui/Surface.h>
#include <utils/RefBase.h>
#include <utils/String16.h>
@@ -382,9 +383,13 @@
*/
status_t returnInputBuffer(const camera_stream_buffer &buffer);
+#if WB_CAMERA3_AND_PROCESSORS_WITH_DEPENDENCIES
+ status_t getInputSurface(sp<Surface> *producer);
+#else
// get the buffer producer of the input buffer queue.
// only apply to input streams.
status_t getInputBufferProducer(sp<IGraphicBufferProducer> *producer);
+#endif
/**
* Whether any of the stream's buffers are currently in use by the HAL,
@@ -534,8 +539,12 @@
virtual status_t returnInputBufferLocked(
const camera_stream_buffer &buffer);
virtual bool hasOutstandingBuffersLocked() const = 0;
+#if WB_CAMERA3_AND_PROCESSORS_WITH_DEPENDENCIES
+ virtual status_t getInputSurfaceLocked(sp<Surface> *surface);
+#else
// Get the buffer producer of the input buffer queue. Only apply to input streams.
virtual status_t getInputBufferProducerLocked(sp<IGraphicBufferProducer> *producer);
+#endif
// Can return -ENOTCONN when we are already disconnected (not an error)
virtual status_t disconnectLocked() = 0;
diff --git a/services/camera/libcameraservice/device3/Camera3StreamInterface.h b/services/camera/libcameraservice/device3/Camera3StreamInterface.h
index 4df8193..0786622 100644
--- a/services/camera/libcameraservice/device3/Camera3StreamInterface.h
+++ b/services/camera/libcameraservice/device3/Camera3StreamInterface.h
@@ -17,6 +17,7 @@
#ifndef ANDROID_SERVERS_CAMERA3_STREAM_INTERFACE_H
#define ANDROID_SERVERS_CAMERA3_STREAM_INTERFACE_H
+#include <gui/Flags.h>
#include <utils/RefBase.h>
#include <camera/camera2/OutputConfiguration.h>
@@ -435,12 +436,14 @@
*/
virtual status_t returnInputBuffer(const camera_stream_buffer &buffer) = 0;
+#if !WB_CAMERA3_AND_PROCESSORS_WITH_DEPENDENCIES
/**
* Get the buffer producer of the input buffer queue.
*
* This method only applies to input streams.
*/
virtual status_t getInputBufferProducer(sp<IGraphicBufferProducer> *producer) = 0;
+#endif
/**
* Whether any of the stream's buffers are currently in use by the HAL,
diff --git a/services/mediametrics/fuzzer/mediametrics_aidl_fuzzer.cpp b/services/mediametrics/fuzzer/mediametrics_aidl_fuzzer.cpp
index c7468c7..572e969 100644
--- a/services/mediametrics/fuzzer/mediametrics_aidl_fuzzer.cpp
+++ b/services/mediametrics/fuzzer/mediametrics_aidl_fuzzer.cpp
@@ -22,6 +22,7 @@
using ::android::MediaMetricsService;
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
+ signal(SIGPIPE, SIG_IGN);
auto service = sp<MediaMetricsService>::make();
fuzzService(service, FuzzedDataProvider(data, size));
return 0;