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 &params);
5143cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala    status_t updatePreviewStream(const Parameters &params);
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 &params);
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 &params, bool *needsUpdate);
6243cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala    status_t updateRecordingStream(const Parameters &params);
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