1 /*
2 * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "output/deferred_photo_proxy.h"
17
18 #include <sys/mman.h>
19 #include <unistd.h>
20
21 #include "camera_buffer_handle_utils.h"
22 #include "camera_log.h"
23 #include "output/deferred_photo_proxy.h"
24 #include "photo_proxy.h"
25
26 namespace OHOS {
27 namespace CameraStandard {
28
DeferredPhotoProxy()29 DeferredPhotoProxy::DeferredPhotoProxy()
30 {
31 photoId_ = "";
32 deferredProcType_ = 0;
33 photoWidth_ = 0;
34 photoHeight_ = 0;
35 bufferHandle_ = nullptr;
36 fileDataAddr_ = nullptr;
37 fileSize_ = 0;
38 isMmaped_ = false;
39 buffer_ = nullptr;
40 }
41
DeferredPhotoProxy(const BufferHandle * bufferHandle,std::string imageId,int32_t deferredProcType)42 DeferredPhotoProxy::DeferredPhotoProxy(const BufferHandle* bufferHandle,
43 std::string imageId, int32_t deferredProcType)
44 {
45 MEDIA_INFO_LOG("DeferredPhotoProxy");
46 photoId_ = imageId;
47 deferredProcType_ = deferredProcType;
48 bufferHandle_ = bufferHandle;
49 fileDataAddr_ = nullptr;
50 photoWidth_ = 0;
51 photoHeight_ = 0;
52 fileSize_ = 0;
53 isMmaped_ = false;
54 buffer_ = nullptr;
55 MEDIA_INFO_LOG("DeferredPhotoProxy imageId: = %{public}s, deferredProcType = %{public}d",
56 imageId.c_str(), deferredProcType);
57 }
58
DeferredPhotoProxy(const BufferHandle * bufferHandle,std::string imageId,int32_t deferredProcType,int32_t photoWidth,int32_t photoHeight)59 DeferredPhotoProxy::DeferredPhotoProxy(const BufferHandle* bufferHandle,
60 std::string imageId, int32_t deferredProcType, int32_t photoWidth, int32_t photoHeight)
61 {
62 MEDIA_INFO_LOG("DeferredPhotoProxy");
63 photoId_ = imageId;
64 deferredProcType_ = deferredProcType;
65 photoWidth_ = photoWidth;
66 photoHeight_ = photoHeight;
67 bufferHandle_ = bufferHandle;
68 fileDataAddr_ = nullptr;
69 fileSize_ = 0;
70 isMmaped_ = false;
71 buffer_ = nullptr;
72 MEDIA_INFO_LOG("imageId: = %{public}s, deferredProcType = %{public}d, width = %{public}d, height = %{public}d",
73 imageId.c_str(), deferredProcType, photoWidth, photoHeight);
74 }
75
DeferredPhotoProxy(const BufferHandle * bufferHandle,std::string imageId,int32_t deferredProcType,uint8_t * buffer,size_t fileSize)76 DeferredPhotoProxy::DeferredPhotoProxy(const BufferHandle* bufferHandle,
77 std::string imageId, int32_t deferredProcType, uint8_t* buffer, size_t fileSize)
78 {
79 MEDIA_INFO_LOG("DeferredPhotoProxy");
80 photoId_ = imageId;
81 deferredProcType_ = deferredProcType;
82 photoWidth_ = 0;
83 photoHeight_ = 0;
84 bufferHandle_ = bufferHandle;
85 fileDataAddr_ = nullptr;
86 fileSize_ = fileSize;
87 isMmaped_ = false;
88 buffer_ = buffer;
89 MEDIA_INFO_LOG("DeferredPhotoProxy imageId: = %{public}s, deferredProcType = %{public}d",
90 imageId.c_str(), deferredProcType);
91 }
92
~DeferredPhotoProxy()93 DeferredPhotoProxy::~DeferredPhotoProxy()
94 {
95 std::lock_guard<std::mutex> lock(mutex_);
96 MEDIA_INFO_LOG("~DeferredPhotoProxy");
97 if (isMmaped_) {
98 munmap(fileDataAddr_, fileSize_);
99 }
100 CameraFreeBufferHandle(const_cast<BufferHandle*>(bufferHandle_));
101 fileDataAddr_ = nullptr;
102 fileSize_ = 0;
103 delete [] buffer_;
104 buffer_ = nullptr;
105 }
106
ReadFromParcel(MessageParcel & parcel)107 void DeferredPhotoProxy::ReadFromParcel(MessageParcel &parcel)
108 {
109 std::lock_guard<std::mutex> lock(mutex_);
110 photoId_ = parcel.ReadString();
111 deferredProcType_ = parcel.ReadInt32();
112 photoWidth_ = parcel.ReadInt32();
113 photoHeight_ = parcel.ReadInt32();
114 bufferHandle_ = ReadBufferHandle(parcel);
115 MEDIA_INFO_LOG("DeferredPhotoProxy::ReadFromParcel");
116 }
117
WriteToParcel(MessageParcel & parcel)118 void DeferredPhotoProxy::WriteToParcel(MessageParcel &parcel)
119 {
120 std::lock_guard<std::mutex> lock(mutex_);
121 parcel.WriteString(photoId_);
122 parcel.WriteInt32(deferredProcType_);
123 parcel.WriteInt32(photoWidth_);
124 parcel.WriteInt32(photoHeight_);
125 WriteBufferHandle(parcel, *bufferHandle_);
126 MEDIA_INFO_LOG("DeferredPhotoProxy::WriteToParcel");
127 }
128
GetPhotoId()129 std::string DeferredPhotoProxy::GetPhotoId()
130 {
131 MEDIA_INFO_LOG("DeferredPhotoProxy::GetPhotoId photoId: = %{public}s", photoId_.c_str());
132 std::lock_guard<std::mutex> lock(mutex_);
133 return photoId_;
134 }
135
GetDeferredProcType()136 Media::DeferredProcType DeferredPhotoProxy::GetDeferredProcType()
137 {
138 MEDIA_INFO_LOG("DeferredPhotoProxy::GetDeferredProcType");
139 std::lock_guard<std::mutex> lock(mutex_);
140 if (deferredProcType_ == 0) {
141 return Media::DeferredProcType::BACKGROUND;
142 } else {
143 return Media::DeferredProcType::OFFLINE;
144 }
145 }
146
GetFileDataAddr()147 void* DeferredPhotoProxy::GetFileDataAddr()
148 {
149 MEDIA_INFO_LOG("DeferredPhotoProxy::GetFileDataAddr");
150 std::lock_guard<std::mutex> lock(mutex_);
151 if (buffer_ != nullptr) {
152 MEDIA_INFO_LOG("DeferredPhotoProxy::GetFileDataAddr get addr temp!");
153 return buffer_;
154 }
155
156 if (!isMmaped_) {
157 MEDIA_INFO_LOG("DeferredPhotoProxy::GetFileDataAddr mmap");
158 fileDataAddr_ = mmap(nullptr, bufferHandle_->size, PROT_READ | PROT_WRITE, MAP_SHARED, bufferHandle_->fd, 0);
159 CHECK_ERROR_RETURN_RET_LOG(
160 fileDataAddr_ == MAP_FAILED, fileDataAddr_, "DeferredPhotoProxy::GetFileDataAddr mmap failed");
161 isMmaped_ = true;
162 } else {
163 MEDIA_ERR_LOG("DeferredPhotoProxy::GetFileDataAddr mmap failed");
164 }
165 return fileDataAddr_;
166 }
167
GetFormat()168 Media::PhotoFormat DeferredPhotoProxy::GetFormat()
169 {
170 return Media::PhotoFormat::RGBA;
171 }
172
GetPhotoQuality()173 Media::PhotoQuality DeferredPhotoProxy::GetPhotoQuality()
174 {
175 return Media::PhotoQuality::LOW;
176 }
177
GetFileSize()178 size_t DeferredPhotoProxy::GetFileSize()
179 {
180 MEDIA_INFO_LOG("DeferredPhotoProxy::GetFileSize");
181 std::lock_guard<std::mutex> lock(mutex_);
182 CHECK_ERROR_RETURN_RET_LOG(buffer_ != nullptr, fileSize_,
183 "DeferredPhotoProxy::GetFileSize temp!");
184
185 fileSize_ = bufferHandle_->size;
186 return fileSize_;
187 }
188
GetWidth()189 int32_t DeferredPhotoProxy::GetWidth()
190 {
191 return photoWidth_;
192 }
193
GetHeight()194 int32_t DeferredPhotoProxy::GetHeight()
195 {
196 return photoHeight_;
197 }
198
Release()199 void DeferredPhotoProxy::Release()
200 {
201 MEDIA_INFO_LOG("DeferredPhotoProxy release start");
202 }
203
GetTitle()204 std::string DeferredPhotoProxy::GetTitle()
205 {
206 return "";
207 }
208
GetExtension()209 std::string DeferredPhotoProxy::GetExtension()
210 {
211 return "";
212 }
GetLatitude()213 double DeferredPhotoProxy::GetLatitude()
214 {
215 return 0;
216 }
GetLongitude()217 double DeferredPhotoProxy::GetLongitude()
218 {
219 return 0;
220 }
GetBurstKey()221 std::string DeferredPhotoProxy::GetBurstKey()
222 {
223 return "";
224 }
IsCoverPhoto()225 bool DeferredPhotoProxy::IsCoverPhoto()
226 {
227 return false;
228 }
GetShootingMode()229 int32_t DeferredPhotoProxy::GetShootingMode()
230 {
231 return 0;
232 }
233 } // namespace CameraStandard
234 } // namespace OHOS
235