diff options
author | android-build-team Robot <android-build-team-robot@google.com> | 2018-01-05 18:59:19 +0000 |
---|---|---|
committer | android-build-team Robot <android-build-team-robot@google.com> | 2018-01-05 18:59:19 +0000 |
commit | 127ccbbafb118a5ce9b2176943b3c9735fcb1a6e (patch) | |
tree | a16bea08a7adbe2cb0c2542258fdbcb27e523047 | |
parent | d28943f41981d246494cbfbfdc724391bfc9b7f2 (diff) | |
parent | 41c800b90de31114108a985e5d11ba94a45fcd78 (diff) | |
download | av-127ccbbafb118a5ce9b2176943b3c9735fcb1a6e.tar.gz |
Snap for 4527419 from 41c800b90de31114108a985e5d11ba94a45fcd78 to oc-m2-release
Change-Id: Id75f7f95aa8dcd8870d3a4923ebae4bff874822d
20 files changed, 132 insertions, 12 deletions
diff --git a/media/libaudioclient/IAudioPolicyService.cpp b/media/libaudioclient/IAudioPolicyService.cpp index ceba211466..d838975fba 100644 --- a/media/libaudioclient/IAudioPolicyService.cpp +++ b/media/libaudioclient/IAudioPolicyService.cpp @@ -960,6 +960,7 @@ status_t BnAudioPolicyService::onTransact( bool hasAttributes = data.readInt32() != 0; if (hasAttributes) { data.read(&attr, sizeof(audio_attributes_t)); + sanetizeAudioAttributes(&attr); } audio_session_t session = (audio_session_t)data.readInt32(); audio_stream_type_t stream = AUDIO_STREAM_DEFAULT; @@ -1025,6 +1026,7 @@ status_t BnAudioPolicyService::onTransact( CHECK_INTERFACE(IAudioPolicyService, data, reply); audio_attributes_t attr; data.read(&attr, sizeof(audio_attributes_t)); + sanetizeAudioAttributes(&attr); audio_io_handle_t input = (audio_io_handle_t)data.readInt32(); audio_session_t session = (audio_session_t)data.readInt32(); pid_t pid = (pid_t)data.readInt32(); @@ -1400,6 +1402,7 @@ status_t BnAudioPolicyService::onTransact( data.read(&source, sizeof(struct audio_port_config)); audio_attributes_t attributes; data.read(&attributes, sizeof(audio_attributes_t)); + sanetizeAudioAttributes(&attributes); audio_patch_handle_t handle = AUDIO_PATCH_HANDLE_NONE; status_t status = startAudioSource(&source, &attributes, &handle); reply->writeInt32(status); @@ -1450,6 +1453,15 @@ status_t BnAudioPolicyService::onTransact( } } +void BnAudioPolicyService::sanetizeAudioAttributes(audio_attributes_t* attr) +{ + const size_t tagsMaxSize = AUDIO_ATTRIBUTES_TAGS_MAX_SIZE; + if (strnlen(attr->tags, tagsMaxSize) >= tagsMaxSize) { + android_errorWriteLog(0x534e4554, "68953950"); // SafetyNet logging + } + attr->tags[tagsMaxSize - 1] = '\0'; +} + // ---------------------------------------------------------------------------- } // namespace android diff --git a/media/libaudioclient/include/media/IAudioPolicyService.h b/media/libaudioclient/include/media/IAudioPolicyService.h index 9b3e35ea57..60ba4ba28b 100644 --- a/media/libaudioclient/include/media/IAudioPolicyService.h +++ b/media/libaudioclient/include/media/IAudioPolicyService.h @@ -183,6 +183,8 @@ public: const Parcel& data, Parcel* reply, uint32_t flags = 0); +private: + void sanetizeAudioAttributes(audio_attributes_t* attr); }; // ---------------------------------------------------------------------------- diff --git a/media/libstagefright/codecs/avcenc/SoftAVCEnc.cpp b/media/libstagefright/codecs/avcenc/SoftAVCEnc.cpp index 358c743862..32fdbd39e5 100644 --- a/media/libstagefright/codecs/avcenc/SoftAVCEnc.cpp +++ b/media/libstagefright/codecs/avcenc/SoftAVCEnc.cpp @@ -1170,6 +1170,12 @@ OMX_ERRORTYPE SoftAVC::setEncodeArgs( ps_inp_raw_buf->e_color_fmt = mIvVideoColorFormat; source = NULL; if ((inputBufferHeader != NULL) && inputBufferHeader->nFilledLen) { + OMX_ERRORTYPE error = validateInputBuffer(inputBufferHeader); + if (error != OMX_ErrorNone) { + ALOGE("b/69065651"); + android_errorWriteLog(0x534e4554, "69065651"); + return error; + } source = inputBufferHeader->pBuffer + inputBufferHeader->nOffset; if (mInputDataIsMeta) { diff --git a/media/libstagefright/codecs/m4v_h263/enc/SoftMPEG4Encoder.cpp b/media/libstagefright/codecs/m4v_h263/enc/SoftMPEG4Encoder.cpp index 7b90a011d8..f6a7b0e0e1 100644 --- a/media/libstagefright/codecs/m4v_h263/enc/SoftMPEG4Encoder.cpp +++ b/media/libstagefright/codecs/m4v_h263/enc/SoftMPEG4Encoder.cpp @@ -434,6 +434,14 @@ void SoftMPEG4Encoder::onQueueFilled(OMX_U32 /* portIndex */) { } if (inHeader->nFilledLen > 0) { + OMX_ERRORTYPE error = validateInputBuffer(inHeader); + if (error != OMX_ErrorNone) { + ALOGE("b/69065651"); + android_errorWriteLog(0x534e4554, "69065651"); + mSignalledError = true; + notify(OMX_EventError, error, 0, 0); + return; + } const uint8_t *inputData = NULL; if (mInputDataIsMeta) { inputData = diff --git a/media/libstagefright/codecs/on2/enc/SoftVPXEncoder.cpp b/media/libstagefright/codecs/on2/enc/SoftVPXEncoder.cpp index a5666da66c..f6257b1556 100644 --- a/media/libstagefright/codecs/on2/enc/SoftVPXEncoder.cpp +++ b/media/libstagefright/codecs/on2/enc/SoftVPXEncoder.cpp @@ -653,6 +653,13 @@ void SoftVPXEncoder::onQueueFilled(OMX_U32 /* portIndex */) { return; } + OMX_ERRORTYPE error = validateInputBuffer(inputBufferHeader); + if (error != OMX_ErrorNone) { + ALOGE("b/27569635"); + android_errorWriteLog(0x534e4554, "27569635"); + notify(OMX_EventError, error, 0, 0); + return; + } const uint8_t *source = inputBufferHeader->pBuffer + inputBufferHeader->nOffset; @@ -668,14 +675,6 @@ void SoftVPXEncoder::onQueueFilled(OMX_U32 /* portIndex */) { return; } } else { - if (inputBufferHeader->nFilledLen < frameSize) { - android_errorWriteLog(0x534e4554, "27569635"); - notify(OMX_EventError, OMX_ErrorUndefined, 0, 0); - return; - } else if (inputBufferHeader->nFilledLen > frameSize) { - ALOGW("Input buffer contains too many pixels"); - } - if (mColorFormat == OMX_COLOR_FormatYUV420SemiPlanar) { ConvertYUV420SemiPlanarToYUV420Planar( source, mConversionBuffer, mWidth, mHeight); diff --git a/media/libstagefright/httplive/M3UParser.cpp b/media/libstagefright/httplive/M3UParser.cpp index 71feb9a605..8a6482b0f6 100644 --- a/media/libstagefright/httplive/M3UParser.cpp +++ b/media/libstagefright/httplive/M3UParser.cpp @@ -897,6 +897,9 @@ status_t M3UParser::parseStreamInf( } } + if (meta->get() == NULL) { + return ERROR_MALFORMED; + } return OK; } diff --git a/media/libstagefright/omx/SoftVideoEncoderOMXComponent.cpp b/media/libstagefright/omx/SoftVideoEncoderOMXComponent.cpp index f33bdc0e24..6e563b70d0 100644 --- a/media/libstagefright/omx/SoftVideoEncoderOMXComponent.cpp +++ b/media/libstagefright/omx/SoftVideoEncoderOMXComponent.cpp @@ -664,4 +664,17 @@ OMX_ERRORTYPE SoftVideoEncoderOMXComponent::getExtensionIndex( return SimpleSoftOMXComponent::getExtensionIndex(name, index); } +OMX_ERRORTYPE SoftVideoEncoderOMXComponent::validateInputBuffer( + const OMX_BUFFERHEADERTYPE *inputBufferHeader) { + size_t frameSize = mInputDataIsMeta ? + max(sizeof(VideoNativeMetadata), sizeof(VideoGrallocMetadata)) + : mWidth * mHeight * 3 / 2; + if (inputBufferHeader->nFilledLen < frameSize) { + return OMX_ErrorUndefined; + } else if (inputBufferHeader->nFilledLen > frameSize) { + ALOGW("Input buffer contains more data than expected."); + } + return OMX_ErrorNone; +} + } // namespace android diff --git a/media/libstagefright/omx/include/media/stagefright/omx/SoftVideoEncoderOMXComponent.h b/media/libstagefright/omx/include/media/stagefright/omx/SoftVideoEncoderOMXComponent.h index db5496a331..2d6f31b84f 100644 --- a/media/libstagefright/omx/include/media/stagefright/omx/SoftVideoEncoderOMXComponent.h +++ b/media/libstagefright/omx/include/media/stagefright/omx/SoftVideoEncoderOMXComponent.h @@ -67,6 +67,8 @@ protected: virtual OMX_ERRORTYPE getExtensionIndex(const char *name, OMX_INDEXTYPE *index); + OMX_ERRORTYPE validateInputBuffer(const OMX_BUFFERHEADERTYPE *inputBufferHeader); + enum { kInputPortIndex = 0, kOutputPortIndex = 1, diff --git a/media/mtp/MtpFfsHandle.cpp b/media/mtp/MtpFfsHandle.cpp index 8d894c17d1..9139925a8e 100644 --- a/media/mtp/MtpFfsHandle.cpp +++ b/media/mtp/MtpFfsHandle.cpp @@ -614,7 +614,7 @@ int MtpFfsHandle::start() { int MtpFfsHandle::configure(bool usePtp) { // Wait till previous server invocation has closed - if (!mLock.try_lock_for(std::chrono::milliseconds(1000))) { + if (!mLock.try_lock_for(std::chrono::milliseconds(300))) { LOG(ERROR) << "MtpServer was unable to get configure lock"; return -1; } diff --git a/media/mtp/MtpServer.cpp b/media/mtp/MtpServer.cpp index 2180462e87..67fd221287 100644 --- a/media/mtp/MtpServer.cpp +++ b/media/mtp/MtpServer.cpp @@ -132,7 +132,7 @@ int MtpServer::configure(bool usePtp) { int ret = sHandle->configure(usePtp); if (ret) ALOGE("Failed to configure MTP driver!"); - else android::base::SetProperty("sys.usb.ffs.mtp.ready", "1"); + android::base::SetProperty("sys.usb.ffs.mtp.ready", "1"); return ret; } diff --git a/services/camera/libcameraservice/api1/Camera2Client.cpp b/services/camera/libcameraservice/api1/Camera2Client.cpp index 2cf648f111..585d2ebd5f 100644 --- a/services/camera/libcameraservice/api1/Camera2Client.cpp +++ b/services/camera/libcameraservice/api1/Camera2Client.cpp @@ -859,6 +859,12 @@ status_t Camera2Client::startPreviewL(Parameters ¶ms, bool restart) { outputStreams.push(getPreviewStreamId()); + if (params.isDeviceZslSupported) { + // If device ZSL is supported, resume preview buffers that may be paused + // during last takePicture(). + mDevice->dropStreamBuffers(false, getPreviewStreamId()); + } + if (!params.recordingHint) { if (!restart) { res = mStreamingProcessor->updatePreviewRequest(params); diff --git a/services/camera/libcameraservice/api1/client2/CaptureSequencer.cpp b/services/camera/libcameraservice/api1/client2/CaptureSequencer.cpp index b65f1c76ca..1ee216fd9a 100644 --- a/services/camera/libcameraservice/api1/client2/CaptureSequencer.cpp +++ b/services/camera/libcameraservice/api1/client2/CaptureSequencer.cpp @@ -553,6 +553,12 @@ CaptureSequencer::CaptureState CaptureSequencer::manageStandardCapture( return DONE; } + if (l.mParameters.isDeviceZslSupported) { + // If device ZSL is supported, drop all pending preview buffers to reduce the chance of + // rendering preview frames newer than the still frame. + client->getCameraDevice()->dropStreamBuffers(true, client->getPreviewStreamId()); + } + /** * Clear the streaming request for still-capture pictures * (as opposed to i.e. video snapshots) diff --git a/services/camera/libcameraservice/common/CameraDeviceBase.h b/services/camera/libcameraservice/common/CameraDeviceBase.h index 3919bfa7c8..a90050e1bf 100644 --- a/services/camera/libcameraservice/common/CameraDeviceBase.h +++ b/services/camera/libcameraservice/common/CameraDeviceBase.h @@ -349,6 +349,11 @@ class CameraDeviceBase : public virtual RefBase { virtual status_t setConsumerSurfaces(int streamId, const std::vector<sp<Surface>>& consumers) = 0; + /** + * Drop buffers for stream of streamId if dropping is true. If dropping is false, do not + * drop buffers for stream of streamId. + */ + virtual status_t dropStreamBuffers(bool /*dropping*/, int /*streamId*/) = 0; }; }; // namespace android diff --git a/services/camera/libcameraservice/device3/Camera3Device.cpp b/services/camera/libcameraservice/device3/Camera3Device.cpp index ced1d3af42..a980cde235 100644 --- a/services/camera/libcameraservice/device3/Camera3Device.cpp +++ b/services/camera/libcameraservice/device3/Camera3Device.cpp @@ -1977,6 +1977,20 @@ status_t Camera3Device::setConsumerSurfaces(int streamId, return OK; } +status_t Camera3Device::dropStreamBuffers(bool dropping, int streamId) { + Mutex::Autolock il(mInterfaceLock); + Mutex::Autolock l(mLock); + + int idx = mOutputStreams.indexOfKey(streamId); + if (idx == NAME_NOT_FOUND) { + ALOGE("%s: Stream %d is not found.", __FUNCTION__, streamId); + return BAD_VALUE; + } + + sp<Camera3OutputStreamInterface> stream = mOutputStreams.editValueAt(idx); + return stream->dropBuffers(dropping); +} + /** * Camera3Device private methods */ diff --git a/services/camera/libcameraservice/device3/Camera3Device.h b/services/camera/libcameraservice/device3/Camera3Device.h index fbbbd08ce9..081af1978b 100644 --- a/services/camera/libcameraservice/device3/Camera3Device.h +++ b/services/camera/libcameraservice/device3/Camera3Device.h @@ -178,6 +178,12 @@ class Camera3Device : */ status_t setConsumerSurfaces(int streamId, const std::vector<sp<Surface>>& consumers) override; + /** + * Drop buffers for stream of streamId if dropping is true. If dropping is false, do not + * drop buffers for stream of streamId. + */ + status_t dropStreamBuffers(bool dropping, int streamId) override; + private: // internal typedefs diff --git a/services/camera/libcameraservice/device3/Camera3DummyStream.cpp b/services/camera/libcameraservice/device3/Camera3DummyStream.cpp index 6e2978f164..84fb8909d8 100644 --- a/services/camera/libcameraservice/device3/Camera3DummyStream.cpp +++ b/services/camera/libcameraservice/device3/Camera3DummyStream.cpp @@ -108,6 +108,10 @@ bool Camera3DummyStream::isConsumerConfigurationDeferred(size_t /*surface_id*/) return false; } +status_t Camera3DummyStream::dropBuffers(bool /*dropping*/) { + return OK; +} + status_t Camera3DummyStream::setConsumers(const std::vector<sp<Surface>>& /*consumers*/) { ALOGE("%s: Stream %d: Dummy stream doesn't support set consumer surface!", __FUNCTION__, mId); diff --git a/services/camera/libcameraservice/device3/Camera3DummyStream.h b/services/camera/libcameraservice/device3/Camera3DummyStream.h index 492fb49eb1..9710765c2a 100644 --- a/services/camera/libcameraservice/device3/Camera3DummyStream.h +++ b/services/camera/libcameraservice/device3/Camera3DummyStream.h @@ -57,6 +57,12 @@ class Camera3DummyStream : virtual status_t detachBuffer(sp<GraphicBuffer>* buffer, int* fenceFd); /** + * Drop buffers for stream of streamId if dropping is true. If dropping is false, do not + * drop buffers for stream of streamId. + */ + virtual status_t dropBuffers(bool /*dropping*/) override; + + /** * Return if this output stream is for video encoding. */ bool isVideoStream() const; diff --git a/services/camera/libcameraservice/device3/Camera3OutputStream.cpp b/services/camera/libcameraservice/device3/Camera3OutputStream.cpp index dcaefe374e..8460c34d00 100644 --- a/services/camera/libcameraservice/device3/Camera3OutputStream.cpp +++ b/services/camera/libcameraservice/device3/Camera3OutputStream.cpp @@ -44,6 +44,7 @@ Camera3OutputStream::Camera3OutputStream(int id, mUseBufferManager(false), mTimestampOffset(timestampOffset), mConsumerUsage(0), + mDropBuffers(false), mDequeueBufferLatency(kDequeueLatencyBinSize) { if (mConsumer == NULL) { @@ -70,6 +71,7 @@ Camera3OutputStream::Camera3OutputStream(int id, mUseBufferManager(false), mTimestampOffset(timestampOffset), mConsumerUsage(0), + mDropBuffers(false), mDequeueBufferLatency(kDequeueLatencyBinSize) { if (format != HAL_PIXEL_FORMAT_BLOB && format != HAL_PIXEL_FORMAT_RAW_OPAQUE) { @@ -100,6 +102,7 @@ Camera3OutputStream::Camera3OutputStream(int id, mUseBufferManager(false), mTimestampOffset(timestampOffset), mConsumerUsage(consumerUsage), + mDropBuffers(false), mDequeueBufferLatency(kDequeueLatencyBinSize) { // Deferred consumer only support preview surface format now. if (format != HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED) { @@ -139,6 +142,7 @@ Camera3OutputStream::Camera3OutputStream(int id, camera3_stream_type_t type, mUseBufferManager(false), mTimestampOffset(timestampOffset), mConsumerUsage(consumerUsage), + mDropBuffers(false), mDequeueBufferLatency(kDequeueLatencyBinSize) { if (setId > CAMERA3_STREAM_SET_ID_INVALID) { @@ -227,9 +231,14 @@ status_t Camera3OutputStream::returnBufferCheckedLocked( /** * Return buffer back to ANativeWindow */ - if (buffer.status == CAMERA3_BUFFER_STATUS_ERROR) { + if (buffer.status == CAMERA3_BUFFER_STATUS_ERROR || mDropBuffers) { // Cancel buffer - ALOGW("A frame is dropped for stream %d", mId); + if (mDropBuffers) { + ALOGV("%s: Dropping a frame for stream %d.", __FUNCTION__, mId); + } else { + ALOGW("%s: A frame is dropped for stream %d due to buffer error.", __FUNCTION__, mId); + } + res = currentConsumer->cancelBuffer(currentConsumer.get(), anwBuffer, anwReleaseFence); @@ -777,6 +786,12 @@ status_t Camera3OutputStream::detachBufferLocked(sp<GraphicBuffer>* buffer, int* return res; } +status_t Camera3OutputStream::dropBuffers(bool dropping) { + Mutex::Autolock l(mLock); + mDropBuffers = dropping; + return OK; +} + status_t Camera3OutputStream::notifyBufferReleased(ANativeWindowBuffer* /*anwBuffer*/) { return OK; } diff --git a/services/camera/libcameraservice/device3/Camera3OutputStream.h b/services/camera/libcameraservice/device3/Camera3OutputStream.h index 7023d5d623..4865be7d31 100644 --- a/services/camera/libcameraservice/device3/Camera3OutputStream.h +++ b/services/camera/libcameraservice/device3/Camera3OutputStream.h @@ -166,6 +166,11 @@ class Camera3OutputStream : virtual status_t notifyBufferReleased(ANativeWindowBuffer *anwBuffer); /** + * Drop buffers if dropping is true. If dropping is false, do not drop buffers. + */ + virtual status_t dropBuffers(bool dropping) override; + + /** * Set the graphic buffer manager to get/return the stream buffers. * * It is only legal to call this method when stream is in STATE_CONSTRUCTED state. @@ -247,6 +252,9 @@ class Camera3OutputStream : */ uint64_t mConsumerUsage; + // Whether to drop valid buffers. + bool mDropBuffers; + /** * Internal Camera3Stream interface */ diff --git a/services/camera/libcameraservice/device3/Camera3OutputStreamInterface.h b/services/camera/libcameraservice/device3/Camera3OutputStreamInterface.h index 8107dd02b0..1719d74a1c 100644 --- a/services/camera/libcameraservice/device3/Camera3OutputStreamInterface.h +++ b/services/camera/libcameraservice/device3/Camera3OutputStreamInterface.h @@ -59,6 +59,11 @@ class Camera3OutputStreamInterface : public virtual Camera3StreamInterface { * */ virtual status_t detachBuffer(sp<GraphicBuffer>* buffer, int* fenceFd) = 0; + + /** + * Drop buffers if dropping is true. If dropping is false, do not drop buffers. + */ + virtual status_t dropBuffers(bool /*dropping*/) = 0; }; } // namespace camera3 |