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