1dcc3534f0f7523e4ee7285522586d6e2827aa407Scott Randolph/* 2dcc3534f0f7523e4ee7285522586d6e2827aa407Scott Randolph * Copyright (C) 2016 The Android Open Source Project 3dcc3534f0f7523e4ee7285522586d6e2827aa407Scott Randolph * 4dcc3534f0f7523e4ee7285522586d6e2827aa407Scott Randolph * Licensed under the Apache License, Version 2.0 (the "License"); 5dcc3534f0f7523e4ee7285522586d6e2827aa407Scott Randolph * you may not use this file except in compliance with the License. 6dcc3534f0f7523e4ee7285522586d6e2827aa407Scott Randolph * You may obtain a copy of the License at 7dcc3534f0f7523e4ee7285522586d6e2827aa407Scott Randolph * 8dcc3534f0f7523e4ee7285522586d6e2827aa407Scott Randolph * http://www.apache.org/licenses/LICENSE-2.0 9dcc3534f0f7523e4ee7285522586d6e2827aa407Scott Randolph * 10dcc3534f0f7523e4ee7285522586d6e2827aa407Scott Randolph * Unless required by applicable law or agreed to in writing, software 11dcc3534f0f7523e4ee7285522586d6e2827aa407Scott Randolph * distributed under the License is distributed on an "AS IS" BASIS, 12dcc3534f0f7523e4ee7285522586d6e2827aa407Scott Randolph * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13dcc3534f0f7523e4ee7285522586d6e2827aa407Scott Randolph * See the License for the specific language governing permissions and 14dcc3534f0f7523e4ee7285522586d6e2827aa407Scott Randolph * limitations under the License. 15dcc3534f0f7523e4ee7285522586d6e2827aa407Scott Randolph */ 16dcc3534f0f7523e4ee7285522586d6e2827aa407Scott Randolph 17dcc3534f0f7523e4ee7285522586d6e2827aa407Scott Randolph#ifndef ANDROID_AUTOMOTIVE_EVS_V1_0_HALCAMERA_H 18dcc3534f0f7523e4ee7285522586d6e2827aa407Scott Randolph#define ANDROID_AUTOMOTIVE_EVS_V1_0_HALCAMERA_H 19dcc3534f0f7523e4ee7285522586d6e2827aa407Scott Randolph 20f1b55e7bfee3aeb42436373b4c6ea318c1ee56dfScott Randolph#include <android/hardware/automotive/evs/1.0/types.h> 21f1b55e7bfee3aeb42436373b4c6ea318c1ee56dfScott Randolph#include <android/hardware/automotive/evs/1.0/IEvsCamera.h> 22dcc3534f0f7523e4ee7285522586d6e2827aa407Scott Randolph#include <ui/GraphicBuffer.h> 23dcc3534f0f7523e4ee7285522586d6e2827aa407Scott Randolph 24dcc3534f0f7523e4ee7285522586d6e2827aa407Scott Randolph#include <thread> 25dcc3534f0f7523e4ee7285522586d6e2827aa407Scott Randolph#include <list> 26dcc3534f0f7523e4ee7285522586d6e2827aa407Scott Randolph 27da289be96177f528495cc660f83472ade76c5918Scott Randolph 28f1b55e7bfee3aeb42436373b4c6ea318c1ee56dfScott Randolphusing namespace ::android::hardware::automotive::evs::V1_0; 29dcc3534f0f7523e4ee7285522586d6e2827aa407Scott Randolphusing ::android::hardware::Return; 30dcc3534f0f7523e4ee7285522586d6e2827aa407Scott Randolphusing ::android::hardware::hidl_handle; 31dcc3534f0f7523e4ee7285522586d6e2827aa407Scott Randolph 32dcc3534f0f7523e4ee7285522586d6e2827aa407Scott Randolphnamespace android { 33dcc3534f0f7523e4ee7285522586d6e2827aa407Scott Randolphnamespace automotive { 34dcc3534f0f7523e4ee7285522586d6e2827aa407Scott Randolphnamespace evs { 35dcc3534f0f7523e4ee7285522586d6e2827aa407Scott Randolphnamespace V1_0 { 36dcc3534f0f7523e4ee7285522586d6e2827aa407Scott Randolphnamespace implementation { 37dcc3534f0f7523e4ee7285522586d6e2827aa407Scott Randolph 38dcc3534f0f7523e4ee7285522586d6e2827aa407Scott Randolph 39da289be96177f528495cc660f83472ade76c5918Scott Randolphclass VirtualCamera; // From VirtualCamera.h 40dcc3534f0f7523e4ee7285522586d6e2827aa407Scott Randolph 41dcc3534f0f7523e4ee7285522586d6e2827aa407Scott Randolph 42dcc3534f0f7523e4ee7285522586d6e2827aa407Scott Randolph// This class wraps the actual hardware IEvsCamera objects. There is a one to many 43dcc3534f0f7523e4ee7285522586d6e2827aa407Scott Randolph// relationship between instances of this class and instances of the VirtualCamera class. 44dcc3534f0f7523e4ee7285522586d6e2827aa407Scott Randolph// This class implements the IEvsCameraStream interface so that it can receive the video 45dcc3534f0f7523e4ee7285522586d6e2827aa407Scott Randolph// stream from the hardware camera and distribute it to the associated VirtualCamera objects. 46dcc3534f0f7523e4ee7285522586d6e2827aa407Scott Randolphclass HalCamera : public IEvsCameraStream { 47dcc3534f0f7523e4ee7285522586d6e2827aa407Scott Randolphpublic: 48dcc3534f0f7523e4ee7285522586d6e2827aa407Scott Randolph HalCamera(sp<IEvsCamera> hwCamera) : mHwCamera(hwCamera) {}; 49dcc3534f0f7523e4ee7285522586d6e2827aa407Scott Randolph 50dcc3534f0f7523e4ee7285522586d6e2827aa407Scott Randolph // Factory methods for client VirtualCameras 51dcc3534f0f7523e4ee7285522586d6e2827aa407Scott Randolph sp<VirtualCamera> makeVirtualCamera(); 52dcc3534f0f7523e4ee7285522586d6e2827aa407Scott Randolph void disownVirtualCamera(sp<VirtualCamera> virtualCamera); 53dcc3534f0f7523e4ee7285522586d6e2827aa407Scott Randolph 54dcc3534f0f7523e4ee7285522586d6e2827aa407Scott Randolph // Implementation details 55dcc3534f0f7523e4ee7285522586d6e2827aa407Scott Randolph sp<IEvsCamera> getHwCamera() { return mHwCamera; }; 56dcc3534f0f7523e4ee7285522586d6e2827aa407Scott Randolph unsigned getClientCount() { return mClients.size(); }; 57dcc3534f0f7523e4ee7285522586d6e2827aa407Scott Randolph bool changeFramesInFlight(int delta); 58dcc3534f0f7523e4ee7285522586d6e2827aa407Scott Randolph 59dcc3534f0f7523e4ee7285522586d6e2827aa407Scott Randolph Return<EvsResult> clientStreamStarting(); 60dcc3534f0f7523e4ee7285522586d6e2827aa407Scott Randolph void clientStreamEnding(); 61dcc3534f0f7523e4ee7285522586d6e2827aa407Scott Randolph Return<void> doneWithFrame(const BufferDesc& buffer); 62dcc3534f0f7523e4ee7285522586d6e2827aa407Scott Randolph 63f1b55e7bfee3aeb42436373b4c6ea318c1ee56dfScott Randolph // Methods from ::android::hardware::automotive::evs::V1_0::ICarCameraStream follow. 64dcc3534f0f7523e4ee7285522586d6e2827aa407Scott Randolph Return<void> deliverFrame(const BufferDesc& buffer) override; 65dcc3534f0f7523e4ee7285522586d6e2827aa407Scott Randolph 66dcc3534f0f7523e4ee7285522586d6e2827aa407Scott Randolphprivate: 67dcc3534f0f7523e4ee7285522586d6e2827aa407Scott Randolph sp<IEvsCamera> mHwCamera; 6829803803b299652fc219713774181dd9a7dd8decScott Randolph std::list<wp<VirtualCamera>> mClients; // Weak pointers -> objects destruct if client dies 69dcc3534f0f7523e4ee7285522586d6e2827aa407Scott Randolph 70dcc3534f0f7523e4ee7285522586d6e2827aa407Scott Randolph enum { 71dcc3534f0f7523e4ee7285522586d6e2827aa407Scott Randolph STOPPED, 72dcc3534f0f7523e4ee7285522586d6e2827aa407Scott Randolph RUNNING, 73dcc3534f0f7523e4ee7285522586d6e2827aa407Scott Randolph STOPPING, 74da289be96177f528495cc660f83472ade76c5918Scott Randolph } mStreamState = STOPPED; 75dcc3534f0f7523e4ee7285522586d6e2827aa407Scott Randolph 76dcc3534f0f7523e4ee7285522586d6e2827aa407Scott Randolph struct FrameRecord { 77dcc3534f0f7523e4ee7285522586d6e2827aa407Scott Randolph uint32_t frameId; 78dcc3534f0f7523e4ee7285522586d6e2827aa407Scott Randolph uint32_t refCount; 79dcc3534f0f7523e4ee7285522586d6e2827aa407Scott Randolph FrameRecord(uint32_t id) : frameId(id), refCount(0) {}; 80dcc3534f0f7523e4ee7285522586d6e2827aa407Scott Randolph }; 81dcc3534f0f7523e4ee7285522586d6e2827aa407Scott Randolph std::vector<FrameRecord> mFrames; 82dcc3534f0f7523e4ee7285522586d6e2827aa407Scott Randolph}; 83dcc3534f0f7523e4ee7285522586d6e2827aa407Scott Randolph 84dcc3534f0f7523e4ee7285522586d6e2827aa407Scott Randolph} // namespace implementation 85dcc3534f0f7523e4ee7285522586d6e2827aa407Scott Randolph} // namespace V1_0 86dcc3534f0f7523e4ee7285522586d6e2827aa407Scott Randolph} // namespace evs 87dcc3534f0f7523e4ee7285522586d6e2827aa407Scott Randolph} // namespace automotive 88dcc3534f0f7523e4ee7285522586d6e2827aa407Scott Randolph} // namespace android 89dcc3534f0f7523e4ee7285522586d6e2827aa407Scott Randolph 90dcc3534f0f7523e4ee7285522586d6e2827aa407Scott Randolph#endif // ANDROID_AUTOMOTIVE_EVS_V1_0_HALCAMERA_H 91