[EMSS] Fix decoder fails to initialize if video codec profile cannot be deduced from... 54/320554/4
authorPiotr Bałut <p.balut@samsung.com>
Wed, 13 Nov 2024 09:33:28 +0000 (10:33 +0100)
committerBot Blink <blinkbot@samsung.com>
Mon, 18 Nov 2024 14:24:58 +0000 (14:24 +0000)
[PROBLEM]
When a config is validated and codec profile cannot be determined,
"unknown" profile will be set. This make TTvd auto-fail
initialization.

[SOLUTION]
If profile cannot be determined a default value for a given codec will
be used.

Bug: https://jira-eu.sec.samsung.net/browse/VDWASM-1922
Signed-off-by: Piotr Bałut <p.balut@samsung.com>
Change-Id: Icc4f085a01741f0224a0f2b7ce8ebb8e86978a67

tizen_src/chromium_impl/third_party/blink/renderer/modules/elementary_media_stream_source/elementary_media_track.cc

index 9982a3bca266baf83cf1d9a0b42308f6fdb2dee1..a190244bc2e981c955ac616b8a701b10ac523b0e 100644 (file)
@@ -119,6 +119,26 @@ int32_t GetNextMsTrackUniqueId() {
   return unique_id.fetch_add(1);
 }
 
+media::VideoCodecProfile GetDefaultVideoCodecProfile(
+    media::VideoCodec video_codec) {
+  switch (video_codec) {
+    case media::VideoCodec::kH264:
+      return media::H264PROFILE_MAIN;
+    case media::VideoCodec::kVP8:
+      return media::VP8PROFILE_ANY;
+    case media::VideoCodec::kVP9:
+      return media::VP9PROFILE_PROFILE1;
+    case media::VideoCodec::kHEVC:
+      return media::HEVCPROFILE_MAIN;
+    case media::VideoCodec::kAV1:
+      return media::AV1PROFILE_PROFILE_MAIN;
+    default:
+      LOG(WARNING) << "Unsupported video codec: "
+                   << media::GetCodecName(video_codec);
+      return media::VIDEO_CODEC_PROFILE_UNKNOWN;
+  }
+}
+
 String MakeMsTrackId(int32_t unique_id, ElementaryMediaTrack::TrackType type) {
   std::ostringstream oss;
   oss << (type == ElementaryMediaTrack::TrackType::kVideo ? "video" : "audio")
@@ -635,8 +655,12 @@ ConfigVerificationResult VerifyVideoConfiguration(
   }
 
   if (profile == media::VIDEO_CODEC_PROFILE_UNKNOWN) {
-    // Don't return here. Some codecs doesn't have profile.
-    EMSS_LOG_NO_INSTANCE(INFO) << "Unknown video profile";
+    // Don't return here. Some codecs doesn't have profile, but profile is
+    // required by GPU factory.
+    profile = GetDefaultVideoCodecProfile(codec);
+    EMSS_LOG_NO_INSTANCE(INFO)
+        << "Unknown video profile, using default profile: "
+        << media::GetProfileName(profile) << "(" << profile << ")";
   }
 
   if (!config->hasWidth() || !config->hasHeight()) {
@@ -1198,6 +1222,10 @@ media::VideoDecoderConfig ElementaryMediaTrack::CreateVideoDecoderConfig(
   ContentType content_type(config->mimeType());
   auto video_codec = StringToVideoCodec(
       content_type.Parameter("codecs").Utf8().data(), &profile);
+  if (profile == media::VIDEO_CODEC_PROFILE_UNKNOWN) {
+    // See comment in VerifyVideoConfiguration(...)
+    profile = GetDefaultVideoCodecProfile(video_codec);
+  }
 
   auto video_size = gfx::Size{static_cast<int32_t>(config->width()),
                               static_cast<int32_t>(config->height())};