CallbackProcessor.h revision 04f101c35eaa90b1f95939afac30674ec1611e6f
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright (C) 2012 The Android Open Source Project
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Licensed under the Apache License, Version 2.0 (the "License");
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * you may not use this file except in compliance with the License.
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * You may obtain a copy of the License at
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      http://www.apache.org/licenses/LICENSE-2.0
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Unless required by applicable law or agreed to in writing, software
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * distributed under the License is distributed on an "AS IS" BASIS,
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * See the License for the specific language governing permissions and
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * limitations under the License.
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef ANDROID_SERVERS_CAMERA_CAMERA2_CALLBACKPROCESSOR_H
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define ANDROID_SERVERS_CAMERA_CAMERA2_CALLBACKPROCESSOR_H
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <utils/Thread.h>
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <utils/String16.h>
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <utils/Vector.h>
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <utils/Mutex.h>
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <utils/Condition.h>
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <gui/CpuConsumer.h>
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "api1/client2/Camera2Heap.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace android {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Camera2Client;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CameraDeviceBase;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace camera2 {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Parameters;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/***
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Still image capture output image processing
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CallbackProcessor:
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            public Thread, public CpuConsumer::FrameAvailableListener {
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  public:
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CallbackProcessor(sp<Camera2Client> client);
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ~CallbackProcessor();
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void onFrameAvailable(const BufferItem& item);
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Set to NULL to disable the direct-to-app callback window
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    status_t setCallbackWindow(sp<ANativeWindow> callbackWindow);
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    status_t updateStream(const Parameters &params);
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    status_t deleteStream();
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int getStreamId() const;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void dump(int fd, const Vector<String16>& args) const;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  private:
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    static const nsecs_t kWaitDuration = 10000000; // 10 ms
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    wp<Camera2Client> mClient;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    wp<CameraDeviceBase> mDevice;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int mId;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mutable Mutex mInputMutex;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool mCallbackAvailable;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Condition mCallbackAvailableSignal;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    enum {
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        NO_STREAM = -1
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    };
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // True if mCallbackWindow is a remote consumer, false if just the local
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // mCallbackConsumer
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool mCallbackToApp;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int mCallbackStreamId;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    static const size_t kCallbackHeapCount = 6;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sp<CpuConsumer>    mCallbackConsumer;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sp<ANativeWindow>  mCallbackWindow;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sp<Camera2Heap>    mCallbackHeap;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int mCallbackHeapId;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_t mCallbackHeapHead, mCallbackHeapFree;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual bool threadLoop();
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    status_t processNewCallback(sp<Camera2Client> &client);
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Used when shutting down
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    status_t discardNewCallback();
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Convert from flexible YUV to NV21 or YV12
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    status_t convertFromFlexibleYuv(int32_t previewFormat,
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            uint8_t *dst,
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            const CpuConsumer::LockedBuffer &src,
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            uint32_t dstYStride,
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            uint32_t dstCStride) const;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; //namespace camera2
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; //namespace android
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)