You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
192 lines
6.0 KiB
192 lines
6.0 KiB
4 months ago
|
/*
|
||
|
* Copyright 2021 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_CARSERVICE_EVS_SERVICE_WRAPPER_H
|
||
|
#define ANDROID_CARSERVICE_EVS_SERVICE_WRAPPER_H
|
||
|
|
||
|
#include "EvsCallbackThread.h"
|
||
|
#include "EvsDeathRecipient.h"
|
||
|
#include "EvsServiceCallback.h"
|
||
|
#include "StreamHandler.h"
|
||
|
|
||
|
#include <android/hardware/automotive/evs/1.1/IEvsDisplay.h>
|
||
|
#include <android/hardware/automotive/evs/1.1/IEvsEnumerator.h>
|
||
|
#include <android/hardware/automotive/evs/1.1/types.h>
|
||
|
#include <hidl/HidlTransportSupport.h>
|
||
|
#include <utils/Mutex.h>
|
||
|
#include <utils/StrongPointer.h>
|
||
|
|
||
|
#include <jni.h>
|
||
|
|
||
|
#include <mutex>
|
||
|
|
||
|
namespace android {
|
||
|
namespace automotive {
|
||
|
namespace evs {
|
||
|
|
||
|
/*
|
||
|
* This class wraps around HIDL transactions to the Extended View System service
|
||
|
* and the video stream managements.
|
||
|
*/
|
||
|
class EvsServiceContext : public EvsServiceCallback {
|
||
|
public:
|
||
|
EvsServiceContext(JavaVM* vm, jclass clazz);
|
||
|
virtual ~EvsServiceContext();
|
||
|
|
||
|
/*
|
||
|
* Initializes the service context and connects to the native Extended View
|
||
|
* System service.
|
||
|
*
|
||
|
* @param env A pointer to the JNI environment
|
||
|
* @param env A reference to CarEvsService object
|
||
|
* @return false if it fails to connect to the native Extended View System
|
||
|
* service or to register a death recipient.
|
||
|
* true otherwise.
|
||
|
*/
|
||
|
bool initialize(JNIEnv* env, jobject thiz) ACQUIRE(mLock);
|
||
|
|
||
|
/*
|
||
|
* Requests to open a target camera device.
|
||
|
*
|
||
|
* @param id a string camera device identifier
|
||
|
* @return bool false if it has not connected to EVS service, fails to open
|
||
|
* a camera device, or fails to initialize a stream handler;
|
||
|
* true otherwise.
|
||
|
*/
|
||
|
bool openCamera(const char* id) ACQUIRE(mLock);
|
||
|
|
||
|
/*
|
||
|
* Requests to close an active camera device.
|
||
|
*/
|
||
|
void closeCamera();
|
||
|
|
||
|
/*
|
||
|
* Requests to start a video stream from a successfully opened camera device.
|
||
|
*/
|
||
|
bool startVideoStream();
|
||
|
|
||
|
/*
|
||
|
* Requests to stop an active video stream.
|
||
|
*/
|
||
|
void stopVideoStream();
|
||
|
|
||
|
/*
|
||
|
* Notifies that the client finishes with this buffer.
|
||
|
*
|
||
|
* @param frame a consumed frame buffer
|
||
|
*/
|
||
|
void doneWithFrame(int bufferId);
|
||
|
|
||
|
/*
|
||
|
* Tells whether or not we're connected to the Extended View System service
|
||
|
*/
|
||
|
bool isAvailable() ACQUIRE(mLock) {
|
||
|
std::lock_guard<std::mutex> lock(mLock);
|
||
|
return mService != nullptr;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* Tells whether or not a target camera device is opened
|
||
|
*/
|
||
|
bool isCameraOpened() ACQUIRE(mLock) {
|
||
|
std::lock_guard<std::mutex> lock(mLock);
|
||
|
return mCamera != nullptr;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* Compares the binder interface
|
||
|
*/
|
||
|
bool isEqual(const wp<hidl::base::V1_0::IBase>& who) ACQUIRE(mLock) {
|
||
|
std::lock_guard<std::mutex> lock(mLock);
|
||
|
return hardware::interfacesEqual(mService, who.promote());
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* Implements EvsServiceCallback methods
|
||
|
*/
|
||
|
void onNewEvent(hardware::automotive::evs::V1_1::EvsEventDesc) override;
|
||
|
void onNewFrame(hardware::automotive::evs::V1_1::BufferDesc) override;
|
||
|
void onServiceDied(const wp<hidl::base::V1_0::IBase>&) override;
|
||
|
|
||
|
private:
|
||
|
// Acquires the camera and the display exclusive ownerships.
|
||
|
void acquireCameraAndDisplay() ACQUIRE(mLock);
|
||
|
|
||
|
// A mutex to protect shared resources
|
||
|
mutable std::mutex mLock;
|
||
|
|
||
|
// Extended View System Enumerator service handle
|
||
|
sp<hardware::automotive::evs::V1_1::IEvsEnumerator> mService GUARDED_BY(mLock);
|
||
|
|
||
|
// A camera device opened for the rearview service
|
||
|
sp<hardware::automotive::evs::V1_1::IEvsCamera> mCamera GUARDED_BY(mLock);
|
||
|
|
||
|
// A handler of a video stream from the rearview camera device
|
||
|
sp<StreamHandler> mStreamHandler GUARDED_BY(mLock);
|
||
|
|
||
|
// Extended View System display handle. This would not be used but held by
|
||
|
// us to prevent other EVS clients from using EvsDisplay.
|
||
|
sp<hardware::automotive::evs::V1_1::IEvsDisplay> mDisplay;
|
||
|
|
||
|
// A flag to acquire a display handle only once
|
||
|
std::once_flag mDisplayAcquired;
|
||
|
|
||
|
// A death recipient of Extended View System service
|
||
|
sp<EvsDeathRecipient> mDeathRecipient GUARDED_BY(mLock);
|
||
|
|
||
|
// Java VM
|
||
|
JavaVM* mVm;
|
||
|
|
||
|
// Background thread to handle callbacks from the native Extended View
|
||
|
// System service
|
||
|
EvsCallbackThread mCallbackThread;
|
||
|
|
||
|
// Reference to CarEvsService object
|
||
|
jobject mCarEvsServiceObj;
|
||
|
|
||
|
// CarEvsService object's method to handle the accidental death of the
|
||
|
// native Extended View System service
|
||
|
jmethodID mDeathHandlerMethodId;
|
||
|
|
||
|
// CarEvsService object's method to handle a new frame buffer
|
||
|
jmethodID mFrameHandlerMethodId;
|
||
|
|
||
|
// CarEvsService object's method to handle a new stream event
|
||
|
jmethodID mEventHandlerMethodId;
|
||
|
|
||
|
// Bookkeeps descriptors of received frame buffers.
|
||
|
std::map<int, hardware::automotive::evs::V1_1::BufferDesc> mBufferRecords GUARDED_BY(mLock);
|
||
|
|
||
|
// A name of the camera device currently in use.
|
||
|
const char* mCameraIdInUse;
|
||
|
|
||
|
// Service name for EVS enumerator
|
||
|
static const char* kServiceName;
|
||
|
|
||
|
// Maximum number of frames CarEvsService can hold. This number has been
|
||
|
// chosen heuristically.
|
||
|
static constexpr int kMaxNumFramesInFlight = 6;
|
||
|
|
||
|
// EVS service reserves a display ID 255 to allow the clients to open the main
|
||
|
// display exclusively.
|
||
|
static constexpr uint8_t kExclusiveMainDisplayId = 0xFF;
|
||
|
};
|
||
|
|
||
|
} // namespace evs
|
||
|
} // namespace automotive
|
||
|
} // namespace android
|
||
|
|
||
|
#endif // ANDROID_CARSERVICE_EVS_SERVICE_WRAPPER_H
|