• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2022 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #include "HidlCameraStream.h"
18 
19 #include "HidlCamera.h"
20 #include "utils/include/Utils.h"
21 
22 #include <android-base/logging.h>
23 #include <utils/SystemClock.h>
24 
25 namespace aidl::android::automotive::evs::implementation {
26 
27 namespace hidlevs = ::android::hardware::automotive::evs;
28 
29 using ::aidl::android::hardware::automotive::evs::BufferDesc;
30 using ::android::hardware::hidl_vec;
31 using ::android::hardware::Return;
32 using ::android::hardware::Status;
33 using ::ndk::ScopedAStatus;
34 
deliverFrame(const hidlevs::V1_0::BufferDesc & buffer)35 Return<void> HidlCameraStream::deliverFrame(const hidlevs::V1_0::BufferDesc& buffer) {
36     if (!mAidlStream) {
37         LOG(ERROR) << "A reference to AIDL IEvsCameraStream is invalid.";
38         return {};
39     }
40 
41     std::vector<BufferDesc> aidlBuffers(1);
42     aidlBuffers[0] = std::move(Utils::makeFromHidl(buffer, /* doDup= */ true));
43 
44     // android::hardware::automotive::evs::V1_0::BufferDesc does not contain a
45     // timestamp so we need to fill it here.
46     aidlBuffers[0].timestamp = static_cast<int64_t>(::android::elapsedRealtimeNano() * 1e+3);
47     aidlBuffers[0].deviceId = mSourceDeviceId;
48 
49     mHidlV0Buffers.push_back(buffer);
50     auto aidlStatus = mAidlStream->deliverFrame(std::move(aidlBuffers));
51     if (!aidlStatus.isOk()) {
52         LOG(ERROR) << "Failed to forward frames to AIDL client";
53     }
54 
55     return {};
56 }
57 
deliverFrame_1_1(const hidl_vec<hidlevs::V1_1::BufferDesc> & buffers)58 Return<void> HidlCameraStream::deliverFrame_1_1(
59         const hidl_vec<hidlevs::V1_1::BufferDesc>& buffers) {
60     if (!mAidlStream) {
61         LOG(ERROR) << "A reference to AIDL IEvsCameraStream is invalid.";
62         return {};
63     }
64 
65     std::vector<BufferDesc> aidlBuffers(buffers.size());
66     for (auto i = 0; i < buffers.size(); ++i) {
67         hidlevs::V1_1::BufferDesc buffer = std::move(buffers[i]);
68         aidlBuffers[i] = std::move(Utils::makeFromHidl(buffer, /* doDup= */ true));
69         mHidlV1Buffers.push_back(std::move(buffer));
70     }
71 
72     if (!mAidlStream->deliverFrame(std::move(aidlBuffers)).isOk()) {
73         LOG(ERROR) << "Failed to forward frames to AIDL client";
74     }
75 
76     return {};
77 }
78 
notify(const hidlevs::V1_1::EvsEventDesc & event)79 Return<void> HidlCameraStream::notify(const hidlevs::V1_1::EvsEventDesc& event) {
80     if (!mAidlStream) {
81         LOG(ERROR) << "A reference to AIDL IEvsCameraStream is invalid.";
82         return {};
83     }
84 
85     if (!mAidlStream->notify(std::move(Utils::makeFromHidl(event))).isOk()) {
86         LOG(ERROR) << "Failed to forward events to AIDL client";
87     }
88 
89     return {};
90 }
91 
getHidlBuffer(int id,hidlevs::V1_0::BufferDesc * _return)92 bool HidlCameraStream::getHidlBuffer(int id, hidlevs::V1_0::BufferDesc* _return) {
93     auto it = std::find_if(mHidlV0Buffers.begin(), mHidlV0Buffers.end(),
94                            [id](const hidlevs::V1_0::BufferDesc& buffer) {
95                                return id == buffer.bufferId;
96                            });
97     if (it == mHidlV0Buffers.end()) {
98         return false;
99     }
100 
101     *_return = std::move(*it);
102     mHidlV0Buffers.erase(it);
103     return true;
104 }
105 
getHidlBuffer(int id,hidlevs::V1_1::BufferDesc * _return)106 bool HidlCameraStream::getHidlBuffer(int id, hidlevs::V1_1::BufferDesc* _return) {
107     auto it = std::find_if(mHidlV1Buffers.begin(), mHidlV1Buffers.end(),
108                            [id](const hidlevs::V1_1::BufferDesc& buffer) {
109                                return id == buffer.bufferId;
110                            });
111     if (it == mHidlV1Buffers.end()) {
112         return false;
113     }
114 
115     *_return = std::move(*it);
116     mHidlV1Buffers.erase(it);
117     return true;
118 }
119 
120 }  // namespace aidl::android::automotive::evs::implementation
121