/* * Copyright (C) 2023 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. */ #pragma once #include #include #include "abc3d.h" #include "AutoNativeHandle.h" #include "AFStateMachine.h" #include "HwCamera.h" namespace android { namespace hardware { namespace camera { namespace provider { namespace implementation { namespace hw { struct FakeRotatingCamera : public HwCamera { explicit FakeRotatingCamera(bool isBackFacing); ~FakeRotatingCamera() override; std::tuple overrideStreamParams(PixelFormat, BufferUsage, Dataspace) const override; bool configure(const CameraMetadata& sessionParams, size_t nStreams, const Stream* streams, const HalStream* halStreams) override; void close() override; std::tuple, std::vector> processCaptureRequest(CameraMetadata, Span) override; // metadata Span> getTargetFpsRanges() const override; Span> getAvailableThumbnailSizes() const override; bool isBackFacing() const override; Span getAvailableFocalLength() const override; std::tuple getMaxNumOutputStreams() const override; Span getSupportedPixelFormats() const override; Span> getSupportedResolutions() const override; int64_t getMinFrameDurationNs() const override; Rect getSensorSize() const override; uint8_t getSensorColorFilterArrangement() const override; std::pair getSensorExposureTimeRange() const override; int64_t getSensorMaxFrameDuration() const override; std::pair getDefaultTargetFpsRange(RequestTemplate) const override; int64_t getDefaultSensorExpTime() const override; int64_t getDefaultSensorFrameDuration() const override; float getDefaultFocalLength() const override; private: struct StreamInfo { std::unique_ptr rgbaBuffer; BufferUsage usage; Rect size; PixelFormat pixelFormat; uint32_t blobBufferSize; }; struct SensorValues { float accel[3]; float magnetic[3]; float rotation[3]; }; struct RenderParams { struct CameraParams { float pos3[3]; float rotXYZ3[3]; }; CameraParams cameraParams; }; abc3d::EglCurrentContext initOpenGL(); void closeImpl(bool everything); void captureFrame(const StreamInfo& si, const RenderParams& renderParams, CachedStreamBuffer* csb, std::vector* outputBuffers, std::vector* delayedOutputBuffers) const; bool captureFrameRGBA(const StreamInfo& si, const RenderParams& renderParams, CachedStreamBuffer* dst) const; bool captureFrameYUV(const StreamInfo& si, const RenderParams& renderParams, CachedStreamBuffer* dst) const; DelayedStreamBuffer captureFrameJpeg(const StreamInfo& si, const RenderParams& renderParams, CachedStreamBuffer* csb) const; std::vector captureFrameForCompressing(const StreamInfo& si, const RenderParams& renderParams) const; bool renderIntoRGBA(const StreamInfo& si, const RenderParams& renderParams, const native_handle_t* rgbaBuffer) const; bool drawScene(Rect imageSize, const RenderParams& renderParams, bool isHardwareBuffer) const; bool drawSceneImpl(const float pvMatrix44[]) const; CameraMetadata applyMetadata(const CameraMetadata& metadata); CameraMetadata updateCaptureResultMetadata(); bool readSensors(SensorValues* vals); const bool mIsBackFacing; AFStateMachine mAFStateMachine; std::unordered_map mStreamInfoCache; base::unique_fd mQemuChannel; abc3d::EglContext mEglContext; abc3d::AutoTexture mGlTestPatternTexture; GLint mGlProgramAttrPositionLoc; GLint mGlProgramAttrTexCoordLoc; GLint mGlProgramUniformTextureLoc; GLint mGlProgramUniformPvmMatrixLoc; abc3d::AutoProgram mGlProgram; CameraMetadata mCaptureResultMetadata; int64_t mFrameDurationNs = 0; }; } // namespace hw } // namespace implementation } // namespace provider } // namespace camera } // namespace hardware } // namespace android