• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_server.h"
17 #include "media_log.h"
18 #include "media_errors.h"
19 #include "engine_factory_repo.h"
20 #include "uri_helper.h"
21 #include "media_dfx.h"
22 #include "ipc_skeleton.h"
23 
24 namespace {
25 constexpr OHOS::HiviewDFX::HiLogLabel LABEL = {LOG_CORE, LOG_DOMAIN_METADATA, "AVMetadataHelperServer"};
26 }
27 
28 namespace OHOS {
29 namespace Media {
30 static const std::unordered_map<int32_t, std::string> STATUS_TO_STATUS_DESCRIPTION_TABLE = {
31     {HELPER_STATE_ERROR, "HELPER_STATE_ERROR"},
32     {HELPER_IDLE, "HELPER_IDLE"},
33     {HELPER_PREPARED, "HELPER_PREPARED"},
34     {HELPER_CALL_DONE, "HELPER_CALL_DONE"},
35     {HELPER_RELEASED, "HELPER_RELEASED"},
36 };
37 
Create()38 std::shared_ptr<IAVMetadataHelperService> AVMetadataHelperServer::Create()
39 {
40     std::shared_ptr<AVMetadataHelperServer> server = std::make_shared<AVMetadataHelperServer>();
41     CHECK_AND_RETURN_RET_LOG(server != nullptr, nullptr, "Failed to new AVMetadataHelperServer");
42     return server;
43 }
44 
AVMetadataHelperServer()45 AVMetadataHelperServer::AVMetadataHelperServer()
46     : taskQue_("AVMetadata")
47 {
48     appUid_ = IPCSkeleton::GetCallingUid();
49     (void)taskQue_.Start();
50     MEDIA_LOGD("0x%{public}06" PRIXPTR " Instances create", FAKE_POINTER(this));
51 }
52 
~AVMetadataHelperServer()53 AVMetadataHelperServer::~AVMetadataHelperServer()
54 {
55     MEDIA_LOGD("0x%{public}06" PRIXPTR " Instances destroy", FAKE_POINTER(this));
56     std::lock_guard<std::mutex> lock(mutex_);
57     auto task = std::make_shared<TaskHandler<void>>([&, this] {
58         avMetadataHelperEngine_ = nullptr;
59     });
60     (void)taskQue_.EnqueueTask(task, true);
61     (void)task->GetResult();
62     uriHelper_ = nullptr;
63     taskQue_.Stop();
64 }
65 
SetSource(const std::string & uri,int32_t usage)66 int32_t AVMetadataHelperServer::SetSource(const std::string &uri, int32_t usage)
67 {
68     std::lock_guard<std::mutex> lock(mutex_);
69     MediaTrace trace("AVMetadataHelperServer::SetSource_uri");
70     MEDIA_LOGD("Current uri is : %{private}s %{public}u", uri.c_str(), usage);
71     CHECK_AND_RETURN_RET_LOG(!uri.empty(), MSERR_INVALID_VAL, "uri is empty");
72 
73     uriHelper_ = std::make_unique<UriHelper>(uri);
74     CHECK_AND_RETURN_RET_LOG(!uriHelper_->FormattedUri().empty(),
75                              MSERR_INVALID_VAL,
76                              "Failed to construct formatted uri");
77     if (!uriHelper_->AccessCheck(UriHelper::URI_READ)) {
78         MEDIA_LOGE("Failed to read the file");
79         return MSERR_INVALID_VAL;
80     }
81     auto res = InitEngine(uriHelper_->FormattedUri());
82     CHECK_AND_RETURN_RET(res == MSERR_OK, res);
83     auto task = std::make_shared<TaskHandler<int32_t>>([&, this, usage] {
84         CHECK_AND_RETURN_RET_LOG(avMetadataHelperEngine_ != nullptr,
85             (int32_t)MSERR_CREATE_AVMETADATAHELPER_ENGINE_FAILED, "Failed to create avmetadatahelper engine.");
86         int32_t ret = avMetadataHelperEngine_->SetSource(uriHelper_->FormattedUri(), usage);
87         currState_ = ret == MSERR_OK ? HELPER_PREPARED : HELPER_STATE_ERROR;
88         CHECK_AND_RETURN_RET_LOG(ret == MSERR_OK, ret, "0x%{public}06" PRIXPTR " SetSource failed", FAKE_POINTER(this));
89         return ret;
90     });
91     return taskQue_.EnqueueTask(task);
92 }
93 
SetSource(int32_t fd,int64_t offset,int64_t size,int32_t usage)94 int32_t AVMetadataHelperServer::SetSource(int32_t fd, int64_t offset, int64_t size, int32_t usage)
95 {
96     std::lock_guard<std::mutex> lock(mutex_);
97     MediaTrace trace("AVMetadataHelperServer::SetSource_fd");
98     MEDIA_LOGD("Current is fd source, offset: %{public}" PRIi64 ", size: %{public}" PRIi64 " usage: %{public}u",
99                offset, size, usage);
100     uriHelper_ = std::make_unique<UriHelper>(fd, offset, size);
101     CHECK_AND_RETURN_RET_LOG(!uriHelper_->FormattedUri().empty(),
102                              MSERR_INVALID_VAL,
103                              "Failed to construct formatted uri");
104     CHECK_AND_RETURN_RET_LOG(uriHelper_->AccessCheck(UriHelper::URI_READ), MSERR_INVALID_VAL, "Failed to read the fd");
105     auto res = InitEngine(uriHelper_->FormattedUri());
106     CHECK_AND_RETURN_RET(res == MSERR_OK, res);
107     auto task = std::make_shared<TaskHandler<int32_t>>([&, this, usage] {
108         CHECK_AND_RETURN_RET_LOG(avMetadataHelperEngine_ != nullptr,
109             (int32_t)MSERR_CREATE_AVMETADATAHELPER_ENGINE_FAILED, "Failed to create avmetadatahelper engine");
110 
111         int32_t ret = avMetadataHelperEngine_->SetSource(uriHelper_->FormattedUri(), usage);
112         currState_ = ret == MSERR_OK ? HELPER_PREPARED : HELPER_STATE_ERROR;
113         CHECK_AND_RETURN_RET_LOG(
114             ret == MSERR_OK, ret, "0x%{public}06" PRIXPTR " SetSource failed!", FAKE_POINTER(this));
115         return ret;
116     });
117     return taskQue_.EnqueueTask(task);
118 }
119 
SetSource(const std::shared_ptr<IMediaDataSource> & dataSrc)120 int32_t AVMetadataHelperServer::SetSource(const std::shared_ptr<IMediaDataSource> &dataSrc)
121 {
122     std::lock_guard<std::mutex> lock(mutex_);
123     MediaTrace trace("AVMetadataHelperServer::SetSource dataSrc");
124     MEDIA_LOGD("AVMetadataHelperServer SetSource");
125     CHECK_AND_RETURN_RET_LOG(dataSrc != nullptr, MSERR_INVALID_VAL, "data source is nullptr");
126     dataSrc_ = dataSrc;
127     auto res = InitEngine("media data source");
128     CHECK_AND_RETURN_RET(res == MSERR_OK, res);
129     auto task = std::make_shared<TaskHandler<int32_t>>([&, this] {
130         CHECK_AND_RETURN_RET_LOG(avMetadataHelperEngine_ != nullptr,
131             (int32_t)MSERR_CREATE_AVMETADATAHELPER_ENGINE_FAILED, "Failed to create avmetadatahelper engine");
132         int32_t ret = avMetadataHelperEngine_->SetSource(dataSrc_);
133         currState_ = ret == MSERR_OK ? HELPER_PREPARED : HELPER_STATE_ERROR;
134         CHECK_AND_RETURN_RET_LOG(ret == MSERR_OK, ret, "SetSource failed!");
135 
136         int64_t size = 0;
137         (void)dataSrc_->GetSize(size);
138         if (size == -1) {
139             config_.looping = false;
140             isLiveStream_ = true;
141         }
142         return ret;
143     });
144     return taskQue_.EnqueueTask(task);
145 }
146 
InitEngine(const std::string & uri)147 int32_t AVMetadataHelperServer::InitEngine(const std::string &uri)
148 {
149     auto engineFactory = EngineFactoryRepo::Instance().GetEngineFactory(
150         IEngineFactory::Scene::SCENE_AVMETADATA, appUid_, uri);
151     CHECK_AND_RETURN_RET_LOG(engineFactory != nullptr,
152         (int32_t)MSERR_CREATE_AVMETADATAHELPER_ENGINE_FAILED,  "Failed to get engine factory");
153     avMetadataHelperEngine_ = engineFactory->CreateAVMetadataHelperEngine();
154     CHECK_AND_RETURN_RET_LOG(avMetadataHelperEngine_ != nullptr,
155         (int32_t)MSERR_CREATE_AVMETADATAHELPER_ENGINE_FAILED, "Failed to create avmetadatahelper engine");
156     return MSERR_OK;
157 }
158 
ResolveMetadata(int32_t key)159 std::string AVMetadataHelperServer::ResolveMetadata(int32_t key)
160 {
161     std::lock_guard<std::mutex> lock(mutex_);
162     MediaTrace trace("AVMetadataHelperServer::ResolveMetadata_key");
163     MEDIA_LOGD("Key is %{public}d", key);
164     CHECK_AND_RETURN_RET_LOG(avMetadataHelperEngine_ != nullptr, "", "avMetadataHelperEngine_ is nullptr");
165     auto task = std::make_shared<TaskHandler<std::string>>([&, this] {
166         std::string err = "";
167         CHECK_AND_RETURN_RET(currState_ == HELPER_PREPARED || currState_ == HELPER_CALL_DONE, err);
168         return avMetadataHelperEngine_->ResolveMetadata(key);
169     });
170     int32_t ret = taskQue_.EnqueueTask(task);
171     CHECK_AND_RETURN_RET_LOG(ret == MSERR_OK, "", "EnqueueTask failed");
172 
173     auto result = task->GetResult();
174     CHECK_AND_RETURN_RET_LOG(result.HasResult(), "", "task has been cleared");
175     ChangeState(HelperStates::HELPER_CALL_DONE);
176     return result.Value();
177 }
178 
ResolveMetadata()179 std::unordered_map<int32_t, std::string> AVMetadataHelperServer::ResolveMetadata()
180 {
181     std::lock_guard<std::mutex> lock(mutex_);
182     MediaTrace trace("AVMetadataHelperServer::ResolveMetadata");
183     {
184         std::unordered_map<int32_t, std::string> map;
185         CHECK_AND_RETURN_RET_LOG(avMetadataHelperEngine_ != nullptr, map, "avMetadataHelperEngine_ is nullptr");
186     }
187     auto task = std::make_shared<TaskHandler<std::unordered_map<int32_t, std::string>>>([&, this] {
188         std::unordered_map<int32_t, std::string> err;
189         CHECK_AND_RETURN_RET(currState_ == HELPER_PREPARED || currState_ == HELPER_CALL_DONE, err);
190         return avMetadataHelperEngine_->ResolveMetadata();
191     });
192     int32_t ret = taskQue_.EnqueueTask(task);
193     CHECK_AND_RETURN_RET_LOG(ret == MSERR_OK, {}, "EnqueueTask failed");
194 
195     auto result = task->GetResult();
196     CHECK_AND_RETURN_RET_LOG(result.HasResult(), {}, "task has been cleared");
197     ChangeState(HelperStates::HELPER_CALL_DONE);
198     return result.Value();
199 }
200 
GetAVMetadata()201 std::shared_ptr<Meta> AVMetadataHelperServer::GetAVMetadata()
202 {
203     std::lock_guard<std::mutex> lock(mutex_);
204     MediaTrace trace("AVMetadataHelperServer::ResolveMetadata");
205     CHECK_AND_RETURN_RET_LOG(avMetadataHelperEngine_ != nullptr, {}, "avMetadataHelperEngine_ is nullptr");
206     auto task = std::make_shared<TaskHandler<std::shared_ptr<Meta>>>([&, this] {
207         std::shared_ptr<Meta> err = nullptr;
208         CHECK_AND_RETURN_RET(currState_ == HELPER_PREPARED || currState_ == HELPER_CALL_DONE, err);
209         return avMetadataHelperEngine_->GetAVMetadata();
210     });
211     int32_t ret = taskQue_.EnqueueTask(task);
212     CHECK_AND_RETURN_RET_LOG(ret == MSERR_OK, {}, "EnqueueTask failed");
213 
214     auto result = task->GetResult();
215     CHECK_AND_RETURN_RET_LOG(result.HasResult(), {}, "task has been cleared");
216     ChangeState(HelperStates::HELPER_CALL_DONE);
217     return result.Value();
218 }
219 
FetchArtPicture()220 std::shared_ptr<AVSharedMemory> AVMetadataHelperServer::FetchArtPicture()
221 {
222     std::lock_guard<std::mutex> lock(mutex_);
223     MediaTrace trace("AVMetadataHelperServer::FetchArtPicture");
224     CHECK_AND_RETURN_RET_LOG(avMetadataHelperEngine_ != nullptr, {}, "avMetadataHelperEngine_ is nullptr");
225     auto task = std::make_shared<TaskHandler<std::shared_ptr<AVSharedMemory>>>([&, this] {
226         std::shared_ptr<AVSharedMemory> err = nullptr;
227         CHECK_AND_RETURN_RET(currState_ == HELPER_PREPARED || currState_ == HELPER_CALL_DONE, err);
228         return avMetadataHelperEngine_->FetchArtPicture();
229     });
230     int32_t ret = taskQue_.EnqueueTask(task);
231     CHECK_AND_RETURN_RET_LOG(ret == MSERR_OK, nullptr, "EnqueueTask failed");
232 
233     auto result = task->GetResult();
234     CHECK_AND_RETURN_RET_LOG(result.HasResult(), nullptr, "task has been cleared");
235     if (result.Value() == nullptr) {
236         MEDIA_LOGE("FetchArtPicture result is nullptr.");
237         NotifyErrorCallback(HelperErrorType::INVALID_RESULT, "FetchArtPicture result is nullptr.");
238         return nullptr;
239     }
240     ChangeState(HelperStates::HELPER_CALL_DONE);
241     return result.Value();
242 }
243 
FetchFrameAtTime(int64_t timeUs,int32_t option,const OutputConfiguration & param)244 std::shared_ptr<AVSharedMemory> AVMetadataHelperServer::FetchFrameAtTime(int64_t timeUs, int32_t option,
245     const OutputConfiguration &param)
246 {
247     std::lock_guard<std::mutex> lock(mutex_);
248     MediaTrace trace("AVMetadataHelperServer::FetchFrameAtTime");
249     CHECK_AND_RETURN_RET_LOG(avMetadataHelperEngine_ != nullptr, nullptr, "avMetadataHelperEngine_ is nullptr");
250     auto task = std::make_shared<TaskHandler<std::shared_ptr<AVSharedMemory>>>([&, this] {
251         std::shared_ptr<AVSharedMemory> err = nullptr;
252         CHECK_AND_RETURN_RET(currState_ == HELPER_PREPARED || currState_ == HELPER_CALL_DONE, err);
253         return avMetadataHelperEngine_->FetchFrameAtTime(timeUs, option, param);
254     });
255     int32_t ret = taskQue_.EnqueueTask(task);
256     CHECK_AND_RETURN_RET_LOG(ret == MSERR_OK, nullptr, "EnqueueTask failed");
257 
258     auto result = task->GetResult();
259     CHECK_AND_RETURN_RET_LOG(result.HasResult(), nullptr, "task has been cleared");
260     ChangeState(HelperStates::HELPER_CALL_DONE);
261     return result.Value();
262 }
263 
FetchFrameYuv(int64_t timeUs,int32_t option,const OutputConfiguration & param)264 std::shared_ptr<AVBuffer> AVMetadataHelperServer::FetchFrameYuv(int64_t timeUs, int32_t option,
265     const OutputConfiguration &param)
266 {
267     MediaTrace trace("AVMetadataHelperServer::FetchFrameAtTime");
268     std::lock_guard<std::mutex> lock(mutex_);
269     CHECK_AND_RETURN_RET_LOG(avMetadataHelperEngine_ != nullptr, nullptr, "avMetadataHelperEngine_ is nullptr");
270     auto task = std::make_shared<TaskHandler<std::shared_ptr<AVBuffer>>>([&, this] {
271         std::shared_ptr<AVBuffer> err = nullptr;
272         CHECK_AND_RETURN_RET(currState_ == HELPER_PREPARED || currState_ == HELPER_CALL_DONE, err);
273         return avMetadataHelperEngine_->FetchFrameYuv(timeUs, option, param);
274     });
275     int32_t ret = taskQue_.EnqueueTask(task);
276     CHECK_AND_RETURN_RET_LOG(ret == MSERR_OK, nullptr, "EnqueueTask failed");
277     auto result = task->GetResult();
278     CHECK_AND_RETURN_RET_LOG(result.HasResult(), nullptr, "task has been cleared");
279     return result.Value();
280 }
281 
Release()282 void AVMetadataHelperServer::Release()
283 {
284     MediaTrace trace("AVMetadataHelperServer::Release");
285     {
286         auto avMetadataHelperEngine = avMetadataHelperEngine_;
287         CHECK_AND_RETURN_LOG(avMetadataHelperEngine != nullptr, "avMetadataHelperEngine_ is nullptr");
288         avMetadataHelperEngine->SetInterruptState(true);
289     }
290 
291     auto task = std::make_shared<TaskHandler<void>>([&, this] {
292         avMetadataHelperEngine_ = nullptr;
293         uriHelper_ = nullptr;
294         ChangeState(HelperStates::HELPER_RELEASED);
295         {
296             std::lock_guard<std::mutex> lockCb(mutexCb_);
297             helperCb_ = nullptr;
298         }
299     });
300     (void)taskQue_.EnqueueTask(task, true);
301     (void)task->GetResult();
302 }
303 
SetHelperCallback(const std::shared_ptr<HelperCallback> & callback)304 int32_t AVMetadataHelperServer::SetHelperCallback(const std::shared_ptr<HelperCallback> &callback)
305 {
306     std::lock_guard<std::mutex> lock(mutex_);
307     CHECK_AND_RETURN_RET_LOG(callback != nullptr, MSERR_INVALID_VAL, "callback is nullptr");
308 
309     if (currState_ != HELPER_IDLE) {
310         MEDIA_LOGE("Can not SetHelperCallback, currentState is %{public}s",
311             GetStatusDescription(currState_).c_str());
312         return MSERR_INVALID_OPERATION;
313     }
314 
315     {
316         std::lock_guard<std::mutex> lockCb(mutexCb_);
317         helperCb_ = callback;
318     }
319     return MSERR_OK;
320 }
321 
GetTimeByFrameIndex(uint32_t index,uint64_t & time)322 int32_t AVMetadataHelperServer::GetTimeByFrameIndex(uint32_t index, uint64_t &time)
323 {
324     MediaTrace trace("AVMetadataHelperServer::GetTimeByFrameIndex");
325     std::lock_guard<std::mutex> lock(mutex_);
326     CHECK_AND_RETURN_RET_LOG(avMetadataHelperEngine_ != nullptr, MSERR_NO_MEMORY, "avMetadataHelperEngine_ is nullptr");
327     auto task = std::make_shared<TaskHandler<int32_t>>([&, this, &timeUs = time] {
328         int32_t err = static_cast<int32_t>(MSERR_INVALID_STATE);
329         CHECK_AND_RETURN_RET(currState_ == HELPER_PREPARED || currState_ == HELPER_CALL_DONE, err);
330         return avMetadataHelperEngine_->GetTimeByFrameIndex(index, timeUs);
331     });
332     int32_t ret = taskQue_.EnqueueTask(task);
333     CHECK_AND_RETURN_RET_LOG(ret == MSERR_OK, MSERR_NO_MEMORY, "EnqueueTask failed");
334     auto result = task->GetResult();
335     CHECK_AND_RETURN_RET_LOG(result.HasResult(), MSERR_INVALID_STATE, "task has been cleared");
336     return result.Value();
337 }
338 
GetFrameIndexByTime(uint64_t time,uint32_t & index)339 int32_t AVMetadataHelperServer::GetFrameIndexByTime(uint64_t time, uint32_t &index)
340 {
341     MediaTrace trace("AVMetadataHelperServer::GetFrameIndexByTime");
342     std::lock_guard<std::mutex> lock(mutex_);
343     CHECK_AND_RETURN_RET_LOG(avMetadataHelperEngine_ != nullptr, MSERR_NO_MEMORY, "avMetadataHelperEngine_ is nullptr");
344     auto task = std::make_shared<TaskHandler<int32_t>>([&, this, &index = index] {
345         int32_t err = static_cast<int32_t>(MSERR_INVALID_STATE);
346         CHECK_AND_RETURN_RET(currState_ == HELPER_PREPARED || currState_ == HELPER_CALL_DONE, err);
347         return avMetadataHelperEngine_->GetFrameIndexByTime(time, index);
348     });
349     int32_t ret = taskQue_.EnqueueTask(task);
350     CHECK_AND_RETURN_RET_LOG(ret == MSERR_OK, ret, "EnqueueTask failed");
351     auto result = task->GetResult();
352     CHECK_AND_RETURN_RET_LOG(result.HasResult(), MSERR_INVALID_STATE, "task has been cleared");
353     return result.Value();
354 }
355 
ChangeState(const HelperStates state)356 void AVMetadataHelperServer::ChangeState(const HelperStates state)
357 {
358     switch (state) {
359         case HELPER_PREPARED:
360             if (currState_ == HELPER_IDLE) {
361                 currState_ = HELPER_PREPARED;
362                 NotifyInfoCallback(HELPER_INFO_TYPE_STATE_CHANGE, currState_);
363             } else {
364                 NotifyErrorCallback(HelperErrorType::INVALID_OPERATION, "State error, current Operation is invalid.");
365             }
366             break;
367         case HELPER_CALL_DONE:
368             if (currState_ == HELPER_CALL_DONE || currState_ == HELPER_PREPARED) {
369                 currState_ = HELPER_CALL_DONE;
370                 NotifyInfoCallback(HELPER_INFO_TYPE_STATE_CHANGE, currState_);
371             } else {
372                 NotifyErrorCallback(HelperErrorType::INVALID_OPERATION, "State error, current Operation is invalid.");
373             }
374             break;
375         case HELPER_RELEASED:
376             if (currState_ == HELPER_IDLE || currState_ == HELPER_PREPARED || currState_ == HELPER_CALL_DONE) {
377                 currState_ = HELPER_RELEASED;
378                 NotifyInfoCallback(HELPER_INFO_TYPE_STATE_CHANGE, currState_);
379             } else {
380                 NotifyErrorCallback(HelperErrorType::INVALID_OPERATION, "State error, current Operation is invalid.");
381             }
382             break;
383         case HELPER_STATE_ERROR:
384             currState_ = HELPER_STATE_ERROR;
385             NotifyInfoCallback(HELPER_INFO_TYPE_STATE_CHANGE, currState_);
386             break;
387         default:
388             MEDIA_LOGI("Changed state is invalid.");
389             break;
390     }
391 }
392 
NotifyErrorCallback(int32_t code,const std::string msg)393 void AVMetadataHelperServer::NotifyErrorCallback(int32_t code, const std::string msg)
394 {
395     std::lock_guard<std::mutex> lockCb(mutexCb_);
396     MEDIA_LOGD("NotifyErrorCallback error code: %{public}d", code);
397     if (helperCb_ != nullptr) {
398         helperCb_->OnError(code, msg);
399     }
400 }
401 
NotifyInfoCallback(HelperOnInfoType type,int32_t extra)402 void AVMetadataHelperServer::NotifyInfoCallback(HelperOnInfoType type, int32_t extra)
403 {
404     std::lock_guard<std::mutex> lockCb(mutexCb_);
405     MEDIA_LOGD("NotifyInfoCallback, extra: %{public}d", extra);
406     if (helperCb_ != nullptr) {
407         helperCb_->OnInfo(type, extra);
408     }
409 }
410 
GetStatusDescription(int32_t status)411 const std::string &AVMetadataHelperServer::GetStatusDescription(int32_t status)
412 {
413     static const std::string ILLEGAL_STATE = "PLAYER_STATUS_ILLEGAL";
414     if (status < HELPER_STATE_ERROR || status > HELPER_RELEASED) {
415         return ILLEGAL_STATE;
416     }
417 
418     return STATUS_TO_STATUS_DESCRIPTION_TABLE.find(status)->second;
419 }
420 } // namespace Media
421 } // namespace OHOS
422