/* * Copyright (C) 2012 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_SERVERS_CAMERA_CAMERA2_STREAMINGPROCESSOR_H #define ANDROID_SERVERS_CAMERA_CAMERA2_STREAMINGPROCESSOR_H #include #include #include #include "camera/CameraMetadata.h" namespace android { class Camera2Client; class CameraDeviceBase; class IMemory; namespace camera2 { class Parameters; class Camera2Heap; /** * Management and processing for preview and recording streams */ class StreamingProcessor: public Thread, public BufferItemConsumer::FrameAvailableListener { public: StreamingProcessor(sp client); ~StreamingProcessor(); status_t setPreviewWindow(sp window); bool haveValidPreviewWindow() const; status_t updatePreviewRequest(const Parameters ¶ms); status_t updatePreviewStream(const Parameters ¶ms); status_t deletePreviewStream(); int getPreviewStreamId() const; status_t setRecordingBufferCount(size_t count); status_t updateRecordingRequest(const Parameters ¶ms); // If needsUpdate is set to true, a updateRecordingStream call with params will recreate // recording stream status_t recordingStreamNeedsUpdate(const Parameters ¶ms, bool *needsUpdate); status_t updateRecordingStream(const Parameters ¶ms); status_t deleteRecordingStream(); int getRecordingStreamId() const; enum StreamType { NONE, PREVIEW, RECORD }; status_t startStream(StreamType type, const Vector &outputStreams); // Toggle between paused and unpaused. Stream must be started first. status_t togglePauseStream(bool pause); status_t stopStream(); // Returns the request ID for the currently streaming request // Returns 0 if there is no active request. status_t getActiveRequestId() const; status_t incrementStreamingIds(); // Callback for new recording frames from HAL virtual void onFrameAvailable(const BufferItem& item); // Callback from stagefright which returns used recording frames void releaseRecordingFrame(const sp& mem); status_t dump(int fd, const Vector& args); private: mutable Mutex mMutex; enum { NO_STREAM = -1 }; wp mClient; wp mDevice; int mId; StreamType mActiveRequest; bool mPaused; Vector mActiveStreamIds; // Preview-related members int32_t mPreviewRequestId; int mPreviewStreamId; CameraMetadata mPreviewRequest; sp mPreviewWindow; // Recording-related members static const nsecs_t kWaitDuration = 50000000; // 50 ms int32_t mRecordingRequestId; int mRecordingStreamId; int mRecordingFrameCount; sp mRecordingConsumer; sp mRecordingWindow; CameraMetadata mRecordingRequest; sp mRecordingHeap; bool mRecordingFrameAvailable; Condition mRecordingFrameAvailableSignal; static const size_t kDefaultRecordingHeapCount = 8; size_t mRecordingHeapCount; Vector mRecordingBuffers; size_t mRecordingHeapHead, mRecordingHeapFree; virtual bool threadLoop(); status_t processRecordingFrame(); // Unilaterally free any buffers still outstanding to stagefright void releaseAllRecordingFramesLocked(); // Determine if the specified stream is currently in use static bool isStreamActive(const Vector &streams, int32_t recordingStreamId); }; }; // namespace camera2 }; // namespace android #endif