1 /*
2  * Copyright (C) 2021 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 "avmetadatahelper_client.h"
17 #include "helper_listener_stub.h"
18 #include "media_log.h"
19 #include "media_errors.h"
20 
21 namespace {
22 constexpr OHOS::HiviewDFX::HiLogLabel LABEL = {LOG_CORE, LOG_DOMAIN_METADATA, "AVMetadataHelperClient"};
23 }
24 
25 namespace OHOS {
26 namespace Media {
Create(const sptr<IStandardAVMetadataHelperService> & ipcProxy)27 std::shared_ptr<AVMetadataHelperClient> AVMetadataHelperClient::Create(
28     const sptr<IStandardAVMetadataHelperService> &ipcProxy)
29 {
30     std::shared_ptr<AVMetadataHelperClient> AVMetadataHelper = std::make_shared<AVMetadataHelperClient>(ipcProxy);
31     int32_t ret = AVMetadataHelper->CreateListenerObject();
32     CHECK_AND_RETURN_RET_LOG(ret == MSERR_OK, nullptr, "failed to create listener object..");
33     return AVMetadataHelper;
34 }
35 
AVMetadataHelperClient(const sptr<IStandardAVMetadataHelperService> & ipcProxy)36 AVMetadataHelperClient::AVMetadataHelperClient(const sptr<IStandardAVMetadataHelperService> &ipcProxy)
37     : avMetadataHelperProxy_(ipcProxy)
38 {
39     MEDIA_LOGD("0x%{public}06" PRIXPTR " Instances create", FAKE_POINTER(this));
40 }
41 
~AVMetadataHelperClient()42 AVMetadataHelperClient::~AVMetadataHelperClient()
43 {
44     std::lock_guard<std::mutex> lock(mutex_);
45     if (avMetadataHelperProxy_ != nullptr) {
46         (void)avMetadataHelperProxy_->DestroyStub();
47     }
48     callback_ = nullptr;
49     MEDIA_LOGD("0x%{public}06" PRIXPTR " Instances destroy", FAKE_POINTER(this));
50 }
51 
SetHelperCallback(const std::shared_ptr<HelperCallback> & callback)52 int32_t AVMetadataHelperClient::SetHelperCallback(const std::shared_ptr<HelperCallback> &callback)
53 {
54     std::lock_guard<std::mutex> lock(mutex_);
55     CHECK_AND_RETURN_RET_LOG(callback != nullptr, MSERR_NO_MEMORY, "input param callback is nullptr..");
56     CHECK_AND_RETURN_RET_LOG(listenerStub_ != nullptr, MSERR_NO_MEMORY, "listenerStub_ is nullptr..");
57 
58     callback_ = callback;
59     listenerStub_->SetHelperCallback(callback);
60 
61     CHECK_AND_RETURN_RET_LOG(avMetadataHelperProxy_ != nullptr, MSERR_SERVICE_DIED,
62         "metadata service does not exist..");
63     return avMetadataHelperProxy_->SetHelperCallback();
64 }
65 
MediaServerDied()66 void AVMetadataHelperClient::MediaServerDied()
67 {
68     std::lock_guard<std::mutex> lock(mutex_);
69     avMetadataHelperProxy_ = nullptr;
70     if (callback_ != nullptr) {
71         callback_->OnError(MSERR_SERVICE_DIED,
72             "mediaserver is died, please create a new meta data helper instance again");
73     }
74 }
75 
SetSource(const std::string & uri,int32_t usage)76 int32_t AVMetadataHelperClient::SetSource(const std::string &uri, int32_t usage)
77 {
78     std::lock_guard<std::mutex> lock(mutex_);
79     CHECK_AND_RETURN_RET_LOG(avMetadataHelperProxy_ != nullptr, MSERR_NO_MEMORY,
80         "avmetadatahelper service does not exist.");
81     return avMetadataHelperProxy_->SetSource(uri, usage);
82 }
83 
SetSource(int32_t fd,int64_t offset,int64_t size,int32_t usage)84 int32_t AVMetadataHelperClient::SetSource(int32_t fd, int64_t offset, int64_t size, int32_t usage)
85 {
86     std::lock_guard<std::mutex> lock(mutex_);
87     CHECK_AND_RETURN_RET_LOG(avMetadataHelperProxy_ != nullptr, MSERR_NO_MEMORY,
88         "avmetadatahelper service does not exist.");
89     return avMetadataHelperProxy_->SetSource(fd, offset, size, usage);
90 }
91 
SetSource(const std::shared_ptr<IMediaDataSource> & dataSrc)92 int32_t AVMetadataHelperClient::SetSource(const std::shared_ptr<IMediaDataSource> &dataSrc)
93 {
94     std::lock_guard<std::mutex> lock(mutex_);
95     CHECK_AND_RETURN_RET_LOG(avMetadataHelperProxy_ != nullptr, MSERR_SERVICE_DIED,
96         "Meta data service does not exist..");
97     CHECK_AND_RETURN_RET_LOG(dataSrc != nullptr, MSERR_NO_MEMORY, "data source is nullptr");
98 
99     dataSrcStub_ = new(std::nothrow) MediaDataSourceStub(dataSrc);
100     CHECK_AND_RETURN_RET_LOG(dataSrcStub_ != nullptr, MSERR_NO_MEMORY, "failed to new dataSrcStub object");
101 
102     sptr<IRemoteObject> object = dataSrcStub_->AsObject();
103     CHECK_AND_RETURN_RET_LOG(object != nullptr, MSERR_NO_MEMORY, "listener object is nullptr..");
104     return avMetadataHelperProxy_->SetSource(object);
105 }
106 
ResolveMetadata(int32_t key)107 std::string AVMetadataHelperClient::ResolveMetadata(int32_t key)
108 {
109     std::lock_guard<std::mutex> lock(mutex_);
110     CHECK_AND_RETURN_RET_LOG(avMetadataHelperProxy_ != nullptr, "", "avmetadatahelper service does not exist.");
111     return avMetadataHelperProxy_->ResolveMetadata(key);
112 }
113 
ResolveMetadata()114 std::unordered_map<int32_t, std::string> AVMetadataHelperClient::ResolveMetadata()
115 {
116     std::lock_guard<std::mutex> lock(mutex_);
117     CHECK_AND_RETURN_RET_LOG(avMetadataHelperProxy_ != nullptr, {}, "avmetadatahelper service does not exist.");
118     return avMetadataHelperProxy_->ResolveMetadataMap();
119 }
120 
GetAVMetadata()121 std::shared_ptr<Meta> AVMetadataHelperClient::GetAVMetadata()
122 {
123     std::lock_guard<std::mutex> lock(mutex_);
124     CHECK_AND_RETURN_RET_LOG(avMetadataHelperProxy_ != nullptr, {}, "avmetadatahelper service does not exist.");
125     return avMetadataHelperProxy_->GetAVMetadata();
126 }
127 
FetchArtPicture()128 std::shared_ptr<AVSharedMemory> AVMetadataHelperClient::FetchArtPicture()
129 {
130     std::lock_guard<std::mutex> lock(mutex_);
131     CHECK_AND_RETURN_RET_LOG(avMetadataHelperProxy_ != nullptr, {}, "avmetadatahelper service does not exist.");
132     return avMetadataHelperProxy_->FetchArtPicture();
133 }
134 
FetchFrameAtTime(int64_t timeUs,int32_t option,const OutputConfiguration & param)135 std::shared_ptr<AVSharedMemory> AVMetadataHelperClient::FetchFrameAtTime(int64_t timeUs, int32_t option,
136     const OutputConfiguration &param)
137 {
138     std::lock_guard<std::mutex> lock(mutex_);
139     CHECK_AND_RETURN_RET_LOG(avMetadataHelperProxy_ != nullptr, nullptr, "avmetadatahelper service does not exist.");
140     return avMetadataHelperProxy_->FetchFrameAtTime(timeUs, option, param);
141 }
142 
GetTimeByFrameIndex(uint32_t index,uint64_t & time)143 int32_t AVMetadataHelperClient::GetTimeByFrameIndex(uint32_t index, uint64_t &time)
144 {
145     CHECK_AND_RETURN_RET_LOG(avMetadataHelperProxy_ != nullptr, 0, "avmetadatahelper service does not exist.");
146     return avMetadataHelperProxy_->GetTimeByFrameIndex(index, time);
147 }
148 
GetFrameIndexByTime(uint64_t time,uint32_t & index)149 int32_t AVMetadataHelperClient::GetFrameIndexByTime(uint64_t time, uint32_t &index)
150 {
151     CHECK_AND_RETURN_RET_LOG(avMetadataHelperProxy_ != nullptr, 0, "avmetadatahelper service does not exist.");
152     return avMetadataHelperProxy_->GetFrameIndexByTime(time, index);
153 }
154 
FetchFrameYuv(int64_t timeUs,int32_t option,const OutputConfiguration & param)155 std::shared_ptr<AVBuffer> AVMetadataHelperClient::FetchFrameYuv(int64_t timeUs, int32_t option,
156     const OutputConfiguration &param)
157 {
158     std::lock_guard<std::mutex> lock(mutex_);
159     CHECK_AND_RETURN_RET_LOG(avMetadataHelperProxy_ != nullptr, nullptr, "avmetadatahelper service does not exist.");
160     return avMetadataHelperProxy_->FetchFrameYuv(timeUs, option, param);
161 }
162 
Release()163 void AVMetadataHelperClient::Release()
164 {
165     CHECK_AND_RETURN_LOG(avMetadataHelperProxy_ != nullptr, "avmetadatahelper service does not exist.");
166     avMetadataHelperProxy_->Release();
167     callback_ = nullptr;
168 }
169 
CreateListenerObject()170 int32_t AVMetadataHelperClient::CreateListenerObject()
171 {
172     std::lock_guard<std::mutex> lock(mutex_);
173     listenerStub_ = new(std::nothrow) HelperListenerStub();
174     CHECK_AND_RETURN_RET_LOG(listenerStub_ != nullptr, MSERR_NO_MEMORY, "failed to new HelperListenerStub object");
175     CHECK_AND_RETURN_RET_LOG(avMetadataHelperProxy_ != nullptr, MSERR_SERVICE_DIED, "player service does not exist..");
176 
177     sptr<IRemoteObject> object = listenerStub_->AsObject();
178     CHECK_AND_RETURN_RET_LOG(object != nullptr, MSERR_NO_MEMORY, "listener object is nullptr..");
179 
180     MEDIA_LOGD("SetListenerObject");
181     return avMetadataHelperProxy_->SetListenerObject(object);
182 }
183 } // namespace Media
184 } // namespace OHOS