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 ¶m)
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 ¶m)
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