StreamingProcessor.h revision 727d172137b4f32681c098de8e2623c0b65a6406
143cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala/* 243cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala * Copyright (C) 2012 The Android Open Source Project 343cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala * 443cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala * Licensed under the Apache License, Version 2.0 (the "License"); 543cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala * you may not use this file except in compliance with the License. 643cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala * You may obtain a copy of the License at 743cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala * 843cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala * http://www.apache.org/licenses/LICENSE-2.0 943cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala * 1043cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala * Unless required by applicable law or agreed to in writing, software 1143cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala * distributed under the License is distributed on an "AS IS" BASIS, 1243cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1343cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala * See the License for the specific language governing permissions and 1443cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala * limitations under the License. 1543cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala */ 1643cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala 1743cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala#ifndef ANDROID_SERVERS_CAMERA_CAMERA2_STREAMINGPROCESSOR_H 1843cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala#define ANDROID_SERVERS_CAMERA_CAMERA2_STREAMINGPROCESSOR_H 1943cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala 2043cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala#include <utils/Mutex.h> 2143cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala#include <utils/String16.h> 2243cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala#include <gui/BufferItemConsumer.h> 2343cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala 24bd02dd1bf1f34eb4e100d0d058f1fe5a2790d67eIgor Murashkin#include "camera/CameraMetadata.h" 2543cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala 2643cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvalanamespace android { 2743cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala 2843cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvalaclass Camera2Client; 2902f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvalaclass CameraDeviceBase; 3043cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvalaclass IMemory; 3143cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala 3243cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvalanamespace camera2 { 3343cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala 347b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvalaclass Parameters; 3543cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvalaclass Camera2Heap; 3643cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala 3743cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala/** 3843cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala * Management and processing for preview and recording streams 3943cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala */ 40254446a80cb13d5beb606bfc3e60a17473869478Eino-Ville Talvalaclass StreamingProcessor: 41254446a80cb13d5beb606bfc3e60a17473869478Eino-Ville Talvala public Thread, public BufferItemConsumer::FrameAvailableListener { 4243cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala public: 4302f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala StreamingProcessor(sp<Camera2Client> client); 4443cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala ~StreamingProcessor(); 4543cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala 46727d172137b4f32681c098de8e2623c0b65a6406Eino-Ville Talvala status_t setPreviewWindow(sp<Surface> window); 4743cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala 4843cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala bool haveValidPreviewWindow() const; 4943cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala 5043cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala status_t updatePreviewRequest(const Parameters ¶ms); 5143cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala status_t updatePreviewStream(const Parameters ¶ms); 5243cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala status_t deletePreviewStream(); 5343cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala int getPreviewStreamId() const; 5443cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala 5543cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala status_t setRecordingBufferCount(size_t count); 56d46a6b9fd8b2a4f9098757384711e2cd03a91651Eino-Ville Talvala status_t setRecordingFormat(int format, android_dataspace_t dataspace); 57d46a6b9fd8b2a4f9098757384711e2cd03a91651Eino-Ville Talvala 5843cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala status_t updateRecordingRequest(const Parameters ¶ms); 59a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh // If needsUpdate is set to true, a updateRecordingStream call with params will recreate 60a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh // recording stream 61a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh status_t recordingStreamNeedsUpdate(const Parameters ¶ms, bool *needsUpdate); 6243cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala status_t updateRecordingStream(const Parameters ¶ms); 6343cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala status_t deleteRecordingStream(); 6443cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala int getRecordingStreamId() const; 6543cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala 6643cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala enum StreamType { 674c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala NONE, 6843cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala PREVIEW, 6943cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala RECORD 7043cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala }; 7143cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala status_t startStream(StreamType type, 72d1d6467d3bcbc1305eeba0176a2edf04925c368eZhijun He const Vector<int32_t> &outputStreams); 7343cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala 745282713a976184e41451315f1286d8075b257d58Igor Murashkin // Toggle between paused and unpaused. Stream must be started first. 755282713a976184e41451315f1286d8075b257d58Igor Murashkin status_t togglePauseStream(bool pause); 765282713a976184e41451315f1286d8075b257d58Igor Murashkin 7743cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala status_t stopStream(); 7843cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala 794c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala // Returns the request ID for the currently streaming request 804c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala // Returns 0 if there is no active request. 814c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala status_t getActiveRequestId() const; 824c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala status_t incrementStreamingIds(); 834c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala 8443cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala // Callback for new recording frames from HAL 8504f101c35eaa90b1f95939afac30674ec1611e6fDan Stoza virtual void onFrameAvailable(const BufferItem& item); 8643cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala // Callback from stagefright which returns used recording frames 8743cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala void releaseRecordingFrame(const sp<IMemory>& mem); 8843cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala 8943cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala status_t dump(int fd, const Vector<String16>& args); 9043cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala 9143cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala private: 9243cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala mutable Mutex mMutex; 9343cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala 9443cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala enum { 9543cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala NO_STREAM = -1 9643cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala }; 9743cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala 9843cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala wp<Camera2Client> mClient; 9902f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala wp<CameraDeviceBase> mDevice; 10002f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala int mId; 10143cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala 1024c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala StreamType mActiveRequest; 1035282713a976184e41451315f1286d8075b257d58Igor Murashkin bool mPaused; 1044c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala 105d1d6467d3bcbc1305eeba0176a2edf04925c368eZhijun He Vector<int32_t> mActiveStreamIds; 1064a5c009bc2389304cf078c270bceb656479367d2Eino-Ville Talvala 10743cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala // Preview-related members 1084c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala int32_t mPreviewRequestId; 10943cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala int mPreviewStreamId; 11043cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala CameraMetadata mPreviewRequest; 111727d172137b4f32681c098de8e2623c0b65a6406Eino-Ville Talvala sp<Surface> mPreviewWindow; 11243cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala 11343cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala // Recording-related members 114254446a80cb13d5beb606bfc3e60a17473869478Eino-Ville Talvala static const nsecs_t kWaitDuration = 50000000; // 50 ms 115254446a80cb13d5beb606bfc3e60a17473869478Eino-Ville Talvala 1164c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala int32_t mRecordingRequestId; 11743cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala int mRecordingStreamId; 11843cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala int mRecordingFrameCount; 11943cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala sp<BufferItemConsumer> mRecordingConsumer; 120727d172137b4f32681c098de8e2623c0b65a6406Eino-Ville Talvala sp<Surface> mRecordingWindow; 12143cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala CameraMetadata mRecordingRequest; 12243cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala sp<camera2::Camera2Heap> mRecordingHeap; 12343cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala 124254446a80cb13d5beb606bfc3e60a17473869478Eino-Ville Talvala bool mRecordingFrameAvailable; 125254446a80cb13d5beb606bfc3e60a17473869478Eino-Ville Talvala Condition mRecordingFrameAvailableSignal; 126254446a80cb13d5beb606bfc3e60a17473869478Eino-Ville Talvala 12743cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala static const size_t kDefaultRecordingHeapCount = 8; 12843cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala size_t mRecordingHeapCount; 129549e735c2ca22d16eea32fda418ba80da32a8558Dan Stoza Vector<BufferItem> mRecordingBuffers; 13043cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala size_t mRecordingHeapHead, mRecordingHeapFree; 13143cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala 132d46a6b9fd8b2a4f9098757384711e2cd03a91651Eino-Ville Talvala static const int kDefaultRecordingFormat = 133d46a6b9fd8b2a4f9098757384711e2cd03a91651Eino-Ville Talvala HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED; 134d46a6b9fd8b2a4f9098757384711e2cd03a91651Eino-Ville Talvala int mRecordingFormat; 135d46a6b9fd8b2a4f9098757384711e2cd03a91651Eino-Ville Talvala 136d46a6b9fd8b2a4f9098757384711e2cd03a91651Eino-Ville Talvala static const android_dataspace kDefaultRecordingDataSpace = 137d46a6b9fd8b2a4f9098757384711e2cd03a91651Eino-Ville Talvala HAL_DATASPACE_BT709; 138d46a6b9fd8b2a4f9098757384711e2cd03a91651Eino-Ville Talvala android_dataspace mRecordingDataSpace; 139d46a6b9fd8b2a4f9098757384711e2cd03a91651Eino-Ville Talvala 140d46a6b9fd8b2a4f9098757384711e2cd03a91651Eino-Ville Talvala static const int kDefaultRecordingGrallocUsage = 141d46a6b9fd8b2a4f9098757384711e2cd03a91651Eino-Ville Talvala GRALLOC_USAGE_HW_VIDEO_ENCODER; 142d46a6b9fd8b2a4f9098757384711e2cd03a91651Eino-Ville Talvala int mRecordingGrallocUsage; 143d46a6b9fd8b2a4f9098757384711e2cd03a91651Eino-Ville Talvala 144254446a80cb13d5beb606bfc3e60a17473869478Eino-Ville Talvala virtual bool threadLoop(); 145254446a80cb13d5beb606bfc3e60a17473869478Eino-Ville Talvala 146254446a80cb13d5beb606bfc3e60a17473869478Eino-Ville Talvala status_t processRecordingFrame(); 1474a5c009bc2389304cf078c270bceb656479367d2Eino-Ville Talvala 1484a5c009bc2389304cf078c270bceb656479367d2Eino-Ville Talvala // Unilaterally free any buffers still outstanding to stagefright 1494a5c009bc2389304cf078c270bceb656479367d2Eino-Ville Talvala void releaseAllRecordingFramesLocked(); 1504a5c009bc2389304cf078c270bceb656479367d2Eino-Ville Talvala 1514a5c009bc2389304cf078c270bceb656479367d2Eino-Ville Talvala // Determine if the specified stream is currently in use 152d1d6467d3bcbc1305eeba0176a2edf04925c368eZhijun He static bool isStreamActive(const Vector<int32_t> &streams, 153d1d6467d3bcbc1305eeba0176a2edf04925c368eZhijun He int32_t recordingStreamId); 15443cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala}; 15543cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala 15643cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala 15743cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala}; // namespace camera2 15843cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala}; // namespace android 15943cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala 16043cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala#endif 161