1 /* 2 * Copyright (c) 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 "avmeta_data.h" 17 #include "avsession_log.h" 18 19 namespace OHOS::AVSession { Marshalling(Parcel & parcel) const20 bool AVMetaData::Marshalling(Parcel& parcel) const 21 { 22 return parcel.WriteString(metaMask_.to_string()) && 23 parcel.WriteString(assetId_) && 24 parcel.WriteString(title_) && 25 parcel.WriteString(artist_) && 26 parcel.WriteString(author_) && 27 parcel.WriteString(avQueueName_) && 28 parcel.WriteString(avQueueId_) && 29 parcel.WriteString(avQueueImageUri_) && 30 parcel.WriteString(album_) && 31 parcel.WriteString(writer_) && 32 parcel.WriteString(composer_) && 33 parcel.WriteInt64(duration_) && 34 parcel.WriteString(mediaImageUri_) && 35 parcel.WriteDouble(publishDate_) && 36 parcel.WriteString(subTitle_) && 37 parcel.WriteString(description_) && 38 parcel.WriteString(lyric_) && 39 parcel.WriteString(previousAssetId_) && 40 parcel.WriteString(nextAssetId_) && 41 parcel.WriteInt32(skipIntervals_) && 42 parcel.WriteInt32(filter_) && 43 parcel.WriteInt32(displayTags_) && 44 WriteDrmSchemes(parcel) && 45 parcel.WriteParcelable(mediaImage_.get()) && 46 parcel.WriteParcelable(avQueueImage_.get()); 47 } 48 Unmarshalling(Parcel & data)49 AVMetaData *AVMetaData::Unmarshalling(Parcel& data) 50 { 51 std::string mask; 52 CHECK_AND_RETURN_RET_LOG(data.ReadString(mask) && mask.length() == META_KEY_MAX, nullptr, "mask not valid"); 53 CHECK_AND_RETURN_RET_LOG(mask.find_first_not_of("01") == std::string::npos, nullptr, "mask string not 0 or 1"); 54 auto *result = new (std::nothrow) AVMetaData(); 55 CHECK_AND_RETURN_RET_LOG(result != nullptr, nullptr, "new AVMetaData failed"); 56 result->metaMask_ = MetaMaskType(mask); 57 58 if (!UnmarshallingCheckParamTask(data, result)) { 59 delete result; 60 return nullptr; 61 } 62 if (!UnmarshallingCheckImageTask(data, result)) { 63 delete result; 64 return nullptr; 65 } 66 return result; 67 } 68 UnmarshallingCheckParamTask(Parcel & data,AVMetaData * result)69 bool AVMetaData::UnmarshallingCheckParamTask(Parcel& data, AVMetaData *result) 70 { 71 bool isParamUnsupport = (!data.ReadString(result->assetId_) || 72 !data.ReadString(result->title_) || 73 !data.ReadString(result->artist_) || 74 !data.ReadString(result->author_) || 75 !data.ReadString(result->avQueueName_) || 76 !data.ReadString(result->avQueueId_) || 77 !data.ReadString(result->avQueueImageUri_) || 78 !data.ReadString(result->album_) || 79 !data.ReadString(result->writer_) || 80 !data.ReadString(result->composer_) || 81 !data.ReadInt64(result->duration_) || 82 !data.ReadString(result->mediaImageUri_) || 83 !data.ReadDouble(result->publishDate_) || 84 !data.ReadString(result->subTitle_) || 85 !data.ReadString(result->description_) || 86 !data.ReadString(result->lyric_) || 87 !data.ReadString(result->previousAssetId_) || 88 !data.ReadString(result->nextAssetId_) || 89 !data.ReadInt32(result->skipIntervals_) || 90 !data.ReadInt32(result->filter_) || 91 !data.ReadInt32(result->displayTags_) || 92 !ReadDrmSchemes(data, result)); 93 if (isParamUnsupport) { 94 SLOGE("read AVMetaData failed"); 95 return false; 96 } 97 return true; 98 } 99 UnmarshallingCheckImageTask(Parcel & data,AVMetaData * result)100 bool AVMetaData::UnmarshallingCheckImageTask(Parcel& data, AVMetaData *result) 101 { 102 result->mediaImage_ = std::shared_ptr<AVSessionPixelMap>(data.ReadParcelable<AVSessionPixelMap>()); 103 if (result->metaMask_.test(META_KEY_MEDIA_IMAGE) && result->mediaImage_ == nullptr) { 104 SLOGE("read PixelMap failed"); 105 return false; 106 } 107 result->avQueueImage_ = std::shared_ptr<AVSessionPixelMap>(data.ReadParcelable<AVSessionPixelMap>()); 108 if (result->metaMask_.test(META_KEY_AVQUEUE_IMAGE) && result->avQueueImage_ == nullptr) { 109 SLOGE("read avqueue PixelMap failed"); 110 return false; 111 } 112 return true; 113 } 114 MarshallingExceptImg(MessageParcel & data,const AVMetaData metaIn)115 bool AVMetaData::MarshallingExceptImg(MessageParcel& data, const AVMetaData metaIn) 116 { 117 bool ret = data.WriteString(metaIn.metaMask_.to_string()) && 118 data.WriteString(metaIn.assetId_) && 119 data.WriteString(metaIn.title_) && 120 data.WriteString(metaIn.artist_) && 121 data.WriteString(metaIn.author_) && 122 data.WriteString(metaIn.avQueueName_) && 123 data.WriteString(metaIn.avQueueId_) && 124 data.WriteString(metaIn.avQueueImageUri_) && 125 data.WriteString(metaIn.album_) && 126 data.WriteString(metaIn.writer_) && 127 data.WriteString(metaIn.composer_) && 128 data.WriteInt64(metaIn.duration_) && 129 data.WriteString(metaIn.mediaImageUri_) && 130 data.WriteDouble(metaIn.publishDate_) && 131 data.WriteString(metaIn.subTitle_) && 132 data.WriteString(metaIn.description_) && 133 data.WriteString(metaIn.lyric_) && 134 data.WriteString(metaIn.previousAssetId_) && 135 data.WriteString(metaIn.nextAssetId_) && 136 data.WriteInt32(metaIn.skipIntervals_) && 137 data.WriteInt32(metaIn.filter_) && 138 data.WriteInt32(metaIn.mediaLength_) && 139 data.WriteInt32(metaIn.avQueueLength_) && 140 data.WriteInt32(metaIn.displayTags_) && 141 WriteDrmSchemes(data, metaIn); 142 SLOGD("MarshallingExceptImg without small img ret %{public}d", static_cast<int>(ret)); 143 return ret; 144 } 145 UnmarshallingExceptImg(MessageParcel & data,AVMetaData & metaOut)146 bool AVMetaData::UnmarshallingExceptImg(MessageParcel& data, AVMetaData& metaOut) 147 { 148 std::string mask; 149 data.ReadString(mask); 150 int32_t maskSize = static_cast<int32_t>(mask.size()); 151 if (maskSize <= 0 || maskSize > META_KEY_MAX) { 152 SLOGE("get err mask, return"); 153 return false; 154 } 155 SLOGD("get mask with %{public}s", mask.c_str()); 156 for (int32_t i = 0; i < maskSize; ++i) { 157 if (mask[i] == '1') { 158 metaOut.metaMask_.flip(maskSize - i - 1); 159 } 160 } 161 162 bool ret = !data.ReadString(metaOut.assetId_) || 163 !data.ReadString(metaOut.title_) || 164 !data.ReadString(metaOut.artist_) || 165 !data.ReadString(metaOut.author_) || 166 !data.ReadString(metaOut.avQueueName_) || 167 !data.ReadString(metaOut.avQueueId_) || 168 !data.ReadString(metaOut.avQueueImageUri_) || 169 !data.ReadString(metaOut.album_) || 170 !data.ReadString(metaOut.writer_) || 171 !data.ReadString(metaOut.composer_) || 172 !data.ReadInt64(metaOut.duration_) || 173 !data.ReadString(metaOut.mediaImageUri_) || 174 !data.ReadDouble(metaOut.publishDate_) || 175 !data.ReadString(metaOut.subTitle_) || 176 !data.ReadString(metaOut.description_) || 177 !data.ReadString(metaOut.lyric_) || 178 !data.ReadString(metaOut.previousAssetId_) || 179 !data.ReadString(metaOut.nextAssetId_) || 180 !data.ReadInt32(metaOut.skipIntervals_) || 181 !data.ReadInt32(metaOut.filter_) || 182 !data.ReadInt32(metaOut.mediaLength_) || 183 !data.ReadInt32(metaOut.avQueueLength_) || 184 !data.ReadInt32(metaOut.displayTags_) || 185 !ReadDrmSchemes(data, metaOut); 186 SLOGD("UnmarshallingExceptImg with drm but no small img ret %{public}d", static_cast<int>(ret)); 187 return ret; 188 } 189 WriteDrmSchemes(Parcel & parcel) const190 bool AVMetaData::WriteDrmSchemes(Parcel& parcel) const 191 { 192 CHECK_AND_RETURN_RET_LOG(parcel.WriteInt32(drmSchemes_.size()), false, 193 "write drmSchemes size failed"); 194 for (auto drmScheme : drmSchemes_) { 195 CHECK_AND_RETURN_RET_LOG(parcel.WriteString(drmScheme), false, "write drmScheme failed"); 196 } 197 return true; 198 } 199 WriteDrmSchemes(MessageParcel & parcel,const AVMetaData metaData)200 bool AVMetaData::WriteDrmSchemes(MessageParcel& parcel, const AVMetaData metaData) 201 { 202 CHECK_AND_RETURN_RET_LOG(parcel.WriteInt32(metaData.drmSchemes_.size()), false, 203 "write drmSchemes size failed"); 204 for (auto drmScheme : metaData.drmSchemes_) { 205 CHECK_AND_RETURN_RET_LOG(parcel.WriteString(drmScheme), false, "write drmScheme failed"); 206 } 207 return true; 208 } 209 ReadDrmSchemes(Parcel & parcel,AVMetaData * metaData)210 bool AVMetaData::ReadDrmSchemes(Parcel& parcel, AVMetaData *metaData) 211 { 212 int32_t drmSchemesLen = 0; 213 CHECK_AND_RETURN_RET_LOG(parcel.ReadInt32(drmSchemesLen), false, "read drmSchemesLen failed"); 214 std::vector<std::string> drmSchemes; 215 int32_t maxDrmSchemesLen = 10; 216 CHECK_AND_RETURN_RET_LOG((drmSchemesLen >= 0) && 217 (drmSchemesLen <= maxDrmSchemesLen), false, "drmSchemesLen is illegal"); 218 for (int i = 0; i < drmSchemesLen; i++) { 219 std::string drmScheme; 220 CHECK_AND_RETURN_RET_LOG(parcel.ReadString(drmScheme), false, "read drmScheme failed"); 221 drmSchemes.emplace_back(drmScheme); 222 } 223 metaData->drmSchemes_ = drmSchemes; 224 return true; 225 } 226 ReadDrmSchemes(MessageParcel & parcel,AVMetaData & metaData)227 bool AVMetaData::ReadDrmSchemes(MessageParcel& parcel, AVMetaData& metaData) 228 { 229 int32_t drmSchemesLen = 0; 230 CHECK_AND_RETURN_RET_LOG(parcel.ReadInt32(drmSchemesLen), false, "read drmSchemesLen failed"); 231 std::vector<std::string> drmSchemes; 232 int32_t maxDrmSchemesLen = 10; 233 CHECK_AND_RETURN_RET_LOG((drmSchemesLen >= 0) && 234 (drmSchemesLen <= maxDrmSchemesLen), false, "drmSchemesLen is illegal"); 235 for (int i = 0; i < drmSchemesLen; i++) { 236 std::string drmScheme; 237 CHECK_AND_RETURN_RET_LOG(parcel.ReadString(drmScheme), false, "read drmScheme failed"); 238 drmSchemes.emplace_back(drmScheme); 239 } 240 metaData.drmSchemes_ = drmSchemes; 241 return true; 242 } 243 SetAssetId(const std::string & assetId)244 void AVMetaData::SetAssetId(const std::string& assetId) 245 { 246 assetId_ = assetId; 247 metaMask_.set(META_KEY_ASSET_ID); 248 } 249 GetAssetId() const250 std::string AVMetaData::GetAssetId() const 251 { 252 return assetId_; 253 } 254 SetTitle(const std::string & title)255 void AVMetaData::SetTitle(const std::string& title) 256 { 257 title_ = title; 258 metaMask_.set(META_KEY_TITLE); 259 } 260 GetTitle() const261 std::string AVMetaData::GetTitle() const 262 { 263 return title_; 264 } 265 SetArtist(const std::string & artist)266 void AVMetaData::SetArtist(const std::string& artist) 267 { 268 artist_ = artist; 269 metaMask_.set(META_KEY_ARTIST); 270 } 271 GetArtist() const272 std::string AVMetaData::GetArtist() const 273 { 274 return artist_; 275 } 276 SetAuthor(const std::string & author)277 void AVMetaData::SetAuthor(const std::string& author) 278 { 279 author_ = author; 280 metaMask_.set(META_KEY_AUTHOR); 281 } 282 GetAuthor() const283 std::string AVMetaData::GetAuthor() const 284 { 285 return author_; 286 } 287 SetAVQueueName(const std::string & avQueueName)288 void AVMetaData::SetAVQueueName(const std::string& avQueueName) 289 { 290 avQueueName_ = avQueueName; 291 metaMask_.set(META_KEY_AVQUEUE_NAME); 292 } 293 GetAVQueueName() const294 std::string AVMetaData::GetAVQueueName() const 295 { 296 return avQueueName_; 297 } 298 SetAVQueueId(const std::string & avQueueId)299 void AVMetaData::SetAVQueueId(const std::string& avQueueId) 300 { 301 avQueueId_ = avQueueId; 302 metaMask_.set(META_KEY_AVQUEUE_ID); 303 } 304 GetAVQueueId() const305 std::string AVMetaData::GetAVQueueId() const 306 { 307 return avQueueId_; 308 } 309 SetAVQueueImage(const std::shared_ptr<AVSessionPixelMap> & avQueueImage)310 void AVMetaData::SetAVQueueImage(const std::shared_ptr<AVSessionPixelMap>& avQueueImage) 311 { 312 avQueueImage_ = avQueueImage; 313 metaMask_.set(META_KEY_AVQUEUE_IMAGE); 314 } 315 GetAVQueueImage() const316 std::shared_ptr<AVSessionPixelMap> AVMetaData::GetAVQueueImage() const 317 { 318 return avQueueImage_; 319 } 320 SetAVQueueImageUri(const std::string & avQueueImageUri)321 void AVMetaData::SetAVQueueImageUri(const std::string& avQueueImageUri) 322 { 323 avQueueImageUri_ = avQueueImageUri; 324 metaMask_.set(META_KEY_AVQUEUE_IMAGE_URI); 325 } 326 GetAVQueueImageUri() const327 std::string AVMetaData::GetAVQueueImageUri() const 328 { 329 return avQueueImageUri_; 330 } 331 SetAlbum(const std::string & album)332 void AVMetaData::SetAlbum(const std::string& album) 333 { 334 album_ = album; 335 metaMask_.set(META_KEY_ALBUM); 336 } 337 GetAlbum() const338 std::string AVMetaData::GetAlbum() const 339 { 340 return album_; 341 } 342 SetWriter(const std::string & writer)343 void AVMetaData::SetWriter(const std::string& writer) 344 { 345 writer_ = writer; 346 metaMask_.set(META_KEY_WRITER); 347 } 348 GetWriter() const349 std::string AVMetaData::GetWriter() const 350 { 351 return writer_; 352 } 353 SetComposer(const std::string & composer)354 void AVMetaData::SetComposer(const std::string& composer) 355 { 356 composer_ = composer; 357 metaMask_.set(META_KEY_COMPOSER); 358 } 359 GetComposer() const360 std::string AVMetaData::GetComposer() const 361 { 362 return composer_; 363 } 364 SetDuration(int64_t duration)365 void AVMetaData::SetDuration(int64_t duration) 366 { 367 if (duration < AVMetaData::DURATION_ALWAYS_PLAY) { 368 SLOGW("invalid duration"); 369 } 370 duration_ = duration; 371 metaMask_.set(META_KEY_DURATION); 372 } 373 GetDuration() const374 int64_t AVMetaData::GetDuration() const 375 { 376 return duration_; 377 } 378 SetMediaImage(const std::shared_ptr<AVSessionPixelMap> & mediaImage)379 void AVMetaData::SetMediaImage(const std::shared_ptr<AVSessionPixelMap>& mediaImage) 380 { 381 mediaImage_ = mediaImage; 382 metaMask_.set(META_KEY_MEDIA_IMAGE); 383 } 384 GetMediaImage() const385 std::shared_ptr<AVSessionPixelMap> AVMetaData::GetMediaImage() const 386 { 387 return mediaImage_; 388 } 389 SetMediaImageUri(const std::string & mediaImageUri)390 void AVMetaData::SetMediaImageUri(const std::string& mediaImageUri) 391 { 392 mediaImageUri_ = mediaImageUri; 393 metaMask_.set(META_KEY_MEDIA_IMAGE_URI); 394 } 395 GetMediaImageUri() const396 std::string AVMetaData::GetMediaImageUri() const 397 { 398 return mediaImageUri_; 399 } 400 SetPublishDate(double date)401 void AVMetaData::SetPublishDate(double date) 402 { 403 if (date < 0) { 404 SLOGW("invalid publish date"); 405 } 406 publishDate_ = date; 407 metaMask_.set(META_KEY_PUBLISH_DATE); 408 } 409 GetPublishDate() const410 double AVMetaData::GetPublishDate() const 411 { 412 return publishDate_; 413 } 414 SetSubTitle(const std::string & subTitle)415 void AVMetaData::SetSubTitle(const std::string& subTitle) 416 { 417 subTitle_ = subTitle; 418 metaMask_.set(META_KEY_SUBTITLE); 419 } 420 GetSubTitle() const421 std::string AVMetaData::GetSubTitle() const 422 { 423 return subTitle_; 424 } 425 SetDescription(const std::string & description)426 void AVMetaData::SetDescription(const std::string& description) 427 { 428 description_ = description; 429 metaMask_.set(META_KEY_DESCRIPTION); 430 } 431 GetDescription() const432 std::string AVMetaData::GetDescription() const 433 { 434 return description_; 435 } 436 SetLyric(const std::string & lyric)437 void AVMetaData::SetLyric(const std::string& lyric) 438 { 439 lyric_ = lyric; 440 metaMask_.set(META_KEY_LYRIC); 441 } 442 GetLyric() const443 std::string AVMetaData::GetLyric() const 444 { 445 return lyric_; 446 } 447 SetPreviousAssetId(const std::string & assetId)448 void AVMetaData::SetPreviousAssetId(const std::string& assetId) 449 { 450 previousAssetId_ = assetId; 451 metaMask_.set(META_KEY_PREVIOUS_ASSET_ID); 452 } 453 GetPreviousAssetId() const454 std::string AVMetaData::GetPreviousAssetId() const 455 { 456 return previousAssetId_; 457 } 458 SetNextAssetId(const std::string & assetId)459 void AVMetaData::SetNextAssetId(const std::string& assetId) 460 { 461 nextAssetId_ = assetId; 462 metaMask_.set(META_KEY_NEXT_ASSET_ID); 463 } 464 GetNextAssetId() const465 std::string AVMetaData::GetNextAssetId() const 466 { 467 return nextAssetId_; 468 } 469 SetSkipIntervals(int32_t skipIntervals)470 void AVMetaData::SetSkipIntervals(int32_t skipIntervals) 471 { 472 SLOGD("SetSkipIntervals %{public}d", static_cast<int32_t>(skipIntervals)); 473 skipIntervals_ = skipIntervals; 474 metaMask_.set(META_KEY_SKIP_INTERVALS); 475 } 476 GetSkipIntervals() const477 int32_t AVMetaData::GetSkipIntervals() const 478 { 479 SLOGD("GetSkipIntervals %{public}d", static_cast<int32_t>(skipIntervals_)); 480 return skipIntervals_; 481 } 482 SetFilter(int32_t filter)483 void AVMetaData::SetFilter(int32_t filter) 484 { 485 SLOGD("SetFilter %{public}d", static_cast<int32_t>(filter)); 486 filter_ = filter; 487 metaMask_.set(META_KEY_FILTER); 488 } 489 GetFilter() const490 int32_t AVMetaData::GetFilter() const 491 { 492 SLOGD("GetFilter %{public}d", static_cast<int32_t>(filter_)); 493 return filter_; 494 } 495 SetMediaLength(int32_t mediaLength)496 void AVMetaData::SetMediaLength(int32_t mediaLength) 497 { 498 mediaLength_ = mediaLength; 499 } 500 GetMediaLength() const501 int32_t AVMetaData::GetMediaLength() const 502 { 503 return mediaLength_; 504 } 505 SetAVQueueLength(int32_t avQueueLength)506 void AVMetaData::SetAVQueueLength(int32_t avQueueLength) 507 { 508 avQueueLength_ = avQueueLength; 509 } 510 GetAVQueueLength() const511 int32_t AVMetaData::GetAVQueueLength() const 512 { 513 return avQueueLength_; 514 } 515 SetDisplayTags(int32_t displayTags)516 void AVMetaData::SetDisplayTags(int32_t displayTags) 517 { 518 SLOGD("SetDisplayTags %{public}d", static_cast<int32_t>(displayTags)); 519 displayTags_ = displayTags; 520 metaMask_.set(META_KEY_DISPLAY_TAGS); 521 } 522 GetDisplayTags() const523 int32_t AVMetaData::GetDisplayTags() const 524 { 525 SLOGD("GetDisplayTags %{public}d", static_cast<int32_t>(displayTags_)); 526 return displayTags_; 527 } 528 SetDrmSchemes(std::vector<std::string> drmSchemes)529 void AVMetaData::SetDrmSchemes(std::vector<std::string> drmSchemes) 530 { 531 drmSchemes_ = drmSchemes; 532 metaMask_.set(META_KEY_DRM_SCHEMES); 533 } 534 GetDrmSchemes() const535 std::vector<std::string> AVMetaData::GetDrmSchemes() const 536 { 537 return drmSchemes_; 538 } 539 GetMetaMask() const540 AVMetaData::MetaMaskType AVMetaData::GetMetaMask() const 541 { 542 return metaMask_; 543 } 544 Reset()545 void AVMetaData::Reset() 546 { 547 metaMask_.reset(); 548 assetId_ = ""; 549 title_ = ""; 550 artist_ = ""; 551 author_ = ""; 552 avQueueName_ = ""; 553 avQueueId_ = ""; 554 avQueueImage_ = nullptr; 555 avQueueImageUri_ = ""; 556 album_ = ""; 557 writer_ = ""; 558 composer_ = ""; 559 duration_ = 0; 560 mediaImage_ = nullptr; 561 mediaImageUri_ = ""; 562 publishDate_ = 0; 563 subTitle_ = ""; 564 description_ = ""; 565 lyric_ = ""; 566 previousAssetId_ = ""; 567 nextAssetId_ = ""; 568 skipIntervals_ = SECONDS_15; 569 displayTags_ = 0; 570 drmSchemes_.clear(); 571 } 572 ResetExtAssetId()573 void AVMetaData::ResetExtAssetId() 574 { 575 metaMask_.reset(); 576 metaMask_.set(META_KEY_ASSET_ID); 577 title_ = ""; 578 artist_ = ""; 579 author_ = ""; 580 avQueueName_ = ""; 581 avQueueId_ = ""; 582 avQueueImage_ = nullptr; 583 avQueueImageUri_ = ""; 584 album_ = ""; 585 writer_ = ""; 586 composer_ = ""; 587 duration_ = 0; 588 mediaImage_ = nullptr; 589 mediaImageUri_ = ""; 590 publishDate_ = 0; 591 subTitle_ = ""; 592 description_ = ""; 593 lyric_ = ""; 594 previousAssetId_ = ""; 595 nextAssetId_ = ""; 596 skipIntervals_ = SECONDS_15; 597 displayTags_ = 0; 598 drmSchemes_.clear(); 599 } 600 CopyToByMask(MetaMaskType & mask,AVMetaData & metaOut) const601 bool AVMetaData::CopyToByMask(MetaMaskType& mask, AVMetaData& metaOut) const 602 { 603 bool result = false; 604 auto intersection = metaMask_ & mask; 605 for (int i = 0; i < META_KEY_MAX; i++) { 606 if (intersection.test(i)) { 607 cloneActions[i](*this, metaOut); 608 metaOut.metaMask_.set(i); 609 result = true; 610 } 611 } 612 613 return result; 614 } 615 CopyFrom(const AVMetaData & metaIn)616 bool AVMetaData::CopyFrom(const AVMetaData& metaIn) 617 { 618 if (metaIn.assetId_.empty()) { 619 SLOGE("assetId is empty"); 620 return false; 621 } 622 623 if (metaIn.assetId_ != assetId_) { 624 SLOGE("assetId not equal here"); 625 *this = metaIn; 626 return true; 627 } 628 629 bool result = false; 630 for (int i = 0; i < META_KEY_MAX; i++) { 631 if (metaIn.metaMask_.test(i)) { 632 cloneActions[i](metaIn, *this); 633 metaMask_.set(i); 634 result = true; 635 } 636 } 637 638 return result; 639 } 640 EqualWithUri(const AVMetaData & metaData)641 bool AVMetaData::EqualWithUri(const AVMetaData& metaData) 642 { 643 if (metaData.mediaImage_ != nullptr) { 644 SLOGI("Current fun cannot determine whether mediaImage_ is equal,\ 645 not perform subsequent judgments when mediaImage_ is not null."); 646 return false; 647 } 648 649 return (assetId_ == metaData.assetId_) 650 && (title_ == metaData.title_) 651 && (artist_ == metaData.artist_) 652 && (author_ == metaData.author_) 653 && (avQueueName_ == metaData.avQueueName_) 654 && (avQueueId_ == metaData.avQueueId_) 655 && (avQueueImageUri_ == metaData.avQueueImageUri_) 656 && (album_ == metaData.album_) 657 && (writer_ == metaData.writer_) 658 && (composer_ == metaData.composer_) 659 && (duration_ == metaData.duration_) 660 && (mediaImageUri_ == metaData.mediaImageUri_) 661 && (publishDate_ == metaData.publishDate_) 662 && (subTitle_ == metaData.subTitle_) 663 && (description_ == metaData.description_) 664 && (lyric_ == metaData.lyric_) 665 && (previousAssetId_ == metaData.previousAssetId_) 666 && (nextAssetId_ == metaData.nextAssetId_) 667 && (skipIntervals_ == metaData.skipIntervals_) 668 && (filter_ == metaData.filter_) 669 && (displayTags_ == metaData.displayTags_) 670 && (drmSchemes_ == metaData.drmSchemes_); 671 } 672 IsValid() const673 bool AVMetaData::IsValid() const 674 { 675 return duration_ >= AVMetaData::DURATION_ALWAYS_PLAY && publishDate_ >= 0 676 && displayTags_ <= AVMetaData::DISPLAY_TAG_ALL; 677 } 678 CloneAssetId(const AVMetaData & from,AVMetaData & to)679 void AVMetaData::CloneAssetId(const AVMetaData& from, AVMetaData& to) 680 { 681 to.assetId_ = from.assetId_; 682 } 683 CloneTitle(const AVMetaData & from,AVMetaData & to)684 void AVMetaData::CloneTitle(const AVMetaData& from, AVMetaData& to) 685 { 686 to.title_ = from.title_; 687 } 688 CloneArtist(const AVMetaData & from,AVMetaData & to)689 void AVMetaData::CloneArtist(const AVMetaData& from, AVMetaData& to) 690 { 691 to.artist_ = from.artist_; 692 } 693 CloneAuthor(const AVMetaData & from,AVMetaData & to)694 void AVMetaData::CloneAuthor(const AVMetaData& from, AVMetaData& to) 695 { 696 to.author_ = from.author_; 697 } 698 CloneAVQueueName(const AVMetaData & from,AVMetaData & to)699 void AVMetaData::CloneAVQueueName(const AVMetaData& from, AVMetaData& to) 700 { 701 to.avQueueName_ = from.avQueueName_; 702 } 703 CloneAVQueueId(const AVMetaData & from,AVMetaData & to)704 void AVMetaData::CloneAVQueueId(const AVMetaData& from, AVMetaData& to) 705 { 706 to.avQueueId_ = from.avQueueId_; 707 } 708 CloneAVQueueImage(const AVMetaData & from,AVMetaData & to)709 void AVMetaData::CloneAVQueueImage(const AVMetaData& from, AVMetaData& to) 710 { 711 to.avQueueImage_ = from.avQueueImage_; 712 } 713 CloneAVQueueImageUri(const AVMetaData & from,AVMetaData & to)714 void AVMetaData::CloneAVQueueImageUri(const AVMetaData& from, AVMetaData& to) 715 { 716 to.avQueueImageUri_ = from.avQueueImageUri_; 717 } 718 CloneAlbum(const AVMetaData & from,AVMetaData & to)719 void AVMetaData::CloneAlbum(const AVMetaData& from, AVMetaData& to) 720 { 721 to.album_ = from.album_; 722 } 723 CloneWriter(const AVMetaData & from,AVMetaData & to)724 void AVMetaData::CloneWriter(const AVMetaData& from, AVMetaData& to) 725 { 726 to.writer_ = from.writer_; 727 } 728 CloneComposer(const AVMetaData & from,AVMetaData & to)729 void AVMetaData::CloneComposer(const AVMetaData& from, AVMetaData& to) 730 { 731 to.composer_ = from.composer_; 732 } 733 CloneDuration(const AVMetaData & from,AVMetaData & to)734 void AVMetaData::CloneDuration(const AVMetaData& from, AVMetaData& to) 735 { 736 to.duration_ = from.duration_; 737 } 738 CloneMediaImage(const AVMetaData & from,AVMetaData & to)739 void AVMetaData::CloneMediaImage(const AVMetaData& from, AVMetaData& to) 740 { 741 to.mediaImage_ = from.mediaImage_; 742 } 743 CloneMediaImageUri(const AVMetaData & from,AVMetaData & to)744 void AVMetaData::CloneMediaImageUri(const AVMetaData& from, AVMetaData& to) 745 { 746 to.mediaImageUri_ = from.mediaImageUri_; 747 } 748 ClonePublishData(const AVMetaData & from,AVMetaData & to)749 void AVMetaData::ClonePublishData(const AVMetaData& from, AVMetaData& to) 750 { 751 to.publishDate_ = from.publishDate_; 752 } 753 CloneSubTitle(const AVMetaData & from,AVMetaData & to)754 void AVMetaData::CloneSubTitle(const AVMetaData& from, AVMetaData& to) 755 { 756 to.subTitle_ = from.subTitle_; 757 } 758 CloneDescription(const AVMetaData & from,AVMetaData & to)759 void AVMetaData::CloneDescription(const AVMetaData& from, AVMetaData& to) 760 { 761 to.description_ = from.description_; 762 } 763 CloneLyric(const AVMetaData & from,AVMetaData & to)764 void AVMetaData::CloneLyric(const AVMetaData& from, AVMetaData& to) 765 { 766 to.lyric_ = from.lyric_; 767 } 768 ClonePreviousAssetId(const AVMetaData & from,AVMetaData & to)769 void AVMetaData::ClonePreviousAssetId(const AVMetaData& from, AVMetaData& to) 770 { 771 to.previousAssetId_ = from.previousAssetId_; 772 } 773 CloneNextAssetId(const AVMetaData & from,AVMetaData & to)774 void AVMetaData::CloneNextAssetId(const AVMetaData& from, AVMetaData& to) 775 { 776 to.nextAssetId_ = from.nextAssetId_; 777 } 778 CloneSkipIntervals(const AVMetaData & from,AVMetaData & to)779 void AVMetaData::CloneSkipIntervals(const AVMetaData& from, AVMetaData& to) 780 { 781 to.skipIntervals_ = from.skipIntervals_; 782 } 783 CloneFilter(const AVMetaData & from,AVMetaData & to)784 void AVMetaData::CloneFilter(const AVMetaData& from, AVMetaData& to) 785 { 786 to.filter_ = from.filter_; 787 } 788 CloneDisplayTags(const AVMetaData & from,AVMetaData & to)789 void AVMetaData::CloneDisplayTags(const AVMetaData& from, AVMetaData& to) 790 { 791 to.displayTags_ = from.displayTags_; 792 } 793 CloneDrmSchemes(const AVMetaData & from,AVMetaData & to)794 void AVMetaData::CloneDrmSchemes(const AVMetaData& from, AVMetaData& to) 795 { 796 to.drmSchemes_ = from.drmSchemes_; 797 } 798 } // namespace OHOS::AVSession 799