[EMSS] Set encryption scheme on media track 26/320926/3
authorPiotr Bałut <p.balut@samsung.com>
Fri, 12 Jul 2024 16:21:18 +0000 (18:21 +0200)
committerBot Blink <blinkbot@samsung.com>
Mon, 25 Nov 2024 17:47:26 +0000 (17:47 +0000)
This commit changes how EMSS handles the encryption scheme metadata.
Previously it was set on each media packet, which meant that it was
only available once a packet was pushed to the source. This is an issue,
because a track config is created much earlier and has to contain valid
encryption scheme metadata.

With the current change, the track itself will contain information
about the encryption scheme and not the packets that are pushed to it.

Change-Id: I355be7c5d9847ab2d8b84380703aa5700282d026
Signed-off-by: Krystian Plata <k.plata@samsung.com>
Signed-off-by: Piotr Bałut <p.balut@samsung.com>
Bug: https://jira-eu.sec.samsung.net/browse/VDWASM-1487

third_party/blink/renderer/modules/elementary_media_stream_source/elementary_media_stream_track_config.idl
third_party/blink/renderer/modules/elementary_media_stream_source/elementary_packet_metadata.idl
tizen_src/chromium_impl/content/renderer/media/tizen/elementary_media_stream_source/any_thread/source_dispatcher.cc
tizen_src/chromium_impl/content/renderer/media/tizen/elementary_media_stream_source/any_thread/track_impl.cc
tizen_src/chromium_impl/content/renderer/media/tizen/elementary_media_stream_source/common/common.h
tizen_src/chromium_impl/content/renderer/media/tizen/elementary_media_stream_source/worker_thread/track_impl.cc
tizen_src/chromium_impl/third_party/blink/renderer/modules/elementary_media_stream_source/elementary_media_track.cc
tizen_src/chromium_impl/third_party/blink/renderer/modules/elementary_media_stream_source/elementary_media_track.h
tizen_src/chromium_impl/third_party/blink/renderer/platform/elementary_media_stream_source/web_elementary_media_packet_metadata.h

index b43436b48f97ca0d6ee3e4f520b9bf876006c957..e007ceca19d8f670786399037724d02e27a50288 100644 (file)
@@ -16,4 +16,5 @@ dictionary ElementaryMediaStreamTrackConfig {
   BufferSource extradata;
   // Since ElementaryMediaStreamSource version 3.0
   DecodingMode? decodingMode;
+  EncryptionMode? encryptionMode;
 };
index 2786325226a6459af9c17f581861ab00d64b62bb..b7a539ee16d872581d89d5465c3ad90059f28ce5 100644 (file)
@@ -20,7 +20,9 @@ dictionary ElementaryPacketMetadata {
   sequence<EncryptedSubsampleDescription> subsamples;
   BufferSource keyId;
   BufferSource initializationVector;
-  EncryptionMode encryptionMode;
   unsigned long cryptByteBlock;
   unsigned long skipByteBlock;
+
+  // deprecated since TTvd, but provided for backward compatibility
+  EncryptionMode? encryptionMode;
 };
index e2c1aa22755660ec37acb5ef5859c217b33426e5..6b3e74e367931c7eb7fcd5f729460b6ef5e7052e 100644 (file)
@@ -49,7 +49,8 @@ SourceDispatcher::TrackTuple SourceDispatcher::CreateAudioTrackDispatcher(
   std::tie(track_dispatcher, any_thread_track, control_thread_track,
            worker_thread_track) =
       TrackDispatcher::Create(
-          {pipeline_mode_, config.decoder_selection_policy()},
+          {pipeline_mode_, config.decoder_selection_policy(),
+           config.encryption_scheme()},
           GetControlThreadTaskRunner(), worker_thread_task_runner_,
           std::move(config));
 
@@ -70,7 +71,8 @@ SourceDispatcher::TrackTuple SourceDispatcher::CreateVideoTrackDispatcher(
   auto [track_dispatcher, any_thread_track, control_thread_track,
         worker_thread_track] =
       TrackDispatcher::Create(
-          {pipeline_mode_, config.decoder_selection_policy()},
+          {pipeline_mode_, config.decoder_selection_policy(),
+           config.encryption_scheme()},
           GetControlThreadTaskRunner(), worker_thread_task_runner_,
           std::move(config));
 
index 139a695160d9a582cc2c8ad22d3b6a14c8caa100..96df299ecc0f7cc60efd5af1a4d99fc85784eb39 100644 (file)
@@ -503,7 +503,8 @@ OperationResult TrackImpl::PrepareDecryptionConfig(
     std::unique_ptr<media::DecryptConfig>* config) {
   EMSS_VERBOSE_TYPED();
 
-  switch (packet_metadata.encryption_scheme) {
+  switch (packet_metadata.encryption_scheme.value_or(
+      track_mode_.encryption_scheme)) {
     case media::EncryptionScheme::kCenc: {
       *config = media::DecryptConfig::CreateCencConfig(
           packet_metadata.key_id, packet_metadata.initialization_vector,
index 5e72b116c7a180eefc63565fd22773f28aa7b717..1044b3155faddd9933f2ba719063db94698f15ad 100644 (file)
@@ -11,6 +11,7 @@
 
 #include "media/base/audio_decoder_config.h"
 #include "media/base/demuxer_stream.h"
+#include "media/base/encryption_scheme.h"
 #include "media/base/video_decoder_config.h"
 #include "media/filters/tizen/decoder_selection_policy.h"
 
@@ -131,6 +132,8 @@ struct PipelineMode {
 struct TrackMode : public PipelineMode {
   media::DecoderSelectionPolicy decoder_selection_policy{
       media::DecoderSelectionPolicy::kDefault};
+  media::EncryptionScheme encryption_scheme{
+      media::EncryptionScheme::kUnencrypted};
 };
 
 template <typename T>
index 94dd7a2d1654bdce14e6e1b1e40064ae36a99e81..b119535d17e90d9788e8086a97f4163985b8eaeb 100644 (file)
@@ -185,7 +185,9 @@ void TrackImpl::OnPrepareDemuxedFrameDataDone(
     uint32_t current_session_id = state_->GetLockedState()->session_id;
 
     if (session_id != current_session_id) {
-      EMSS_DEBUG_TYPED() << "session_id changed, ignoring packet: " << packet;
+      EMSS_DEBUG_TYPED() << "session_id changed, expected: "
+                         << current_session_id
+                         << ", ignored packet: " << packet;
       return OperationResult::kOkAppendIgnored;
     }
 
index 5abd4fbb956eeef8226fbc4e3477b9abbb198d71..f556b68bc2d09f940d37c5a4d3fe18850833c078 100644 (file)
@@ -213,15 +213,14 @@ CreateMsVideoComponent() {
 }
 
 media::EncryptionScheme EncryptionModeAsEnum(
-    const WTF::String& encryption_mode) {
+    const V8EncryptionMode::Enum& encryption_mode) {
   EMSS_VERBOSE_NO_INSTANCE();
 
-  if (encryption_mode == "cenc") {
-    return media::EncryptionScheme::kCenc;
-  }
-
-  if (encryption_mode == "cbcs") {
-    return media::EncryptionScheme::kCbcs;
+  switch (encryption_mode) {
+    case V8EncryptionMode::Enum::kCenc:
+      return media::EncryptionScheme::kCenc;
+    case V8EncryptionMode::Enum::kCbcs:
+      return media::EncryptionScheme::kCbcs;
   }
 
   return media::EncryptionScheme::kUnencrypted;
@@ -1148,12 +1147,15 @@ media::AudioDecoderConfig ElementaryMediaTrack::CreateAudioDecoderConfig(
           ? V8DecodingModeToDecoderSelectionPolicy(
                 config->decodingModeNonNull().AsEnum())
           : media::DecoderSelectionPolicy::kDefault;
+  const auto encryption_scheme =
+      config->hasEncryptionModeNonNull()
+          ? EncryptionModeAsEnum(config->encryptionModeNonNull().AsEnum())
+          : EncryptionScheme::kUnencrypted;
   auto audio_decoder_config = media::AudioDecoderConfig{
       audio_codec,        sample_format,    channel_layout,
-      samples_per_second, audio_extra_data, EncryptionScheme::kUnencrypted};
+      samples_per_second, audio_extra_data, encryption_scheme};
   audio_decoder_config.set_decoder_selection_policy(decoder_selection_policy);
 
-  // FIXME(p.balut): support encrypted streams
   return audio_decoder_config;
 }
 
@@ -1213,6 +1215,10 @@ media::VideoDecoderConfig ElementaryMediaTrack::CreateVideoDecoderConfig(
                 config->decodingModeNonNull().AsEnum())
           : media::DecoderSelectionPolicy::kDefault;
 
+  auto encryption_scheme =
+      config->hasEncryptionModeNonNull()
+          ? EncryptionModeAsEnum(config->encryptionModeNonNull().AsEnum())
+          : EncryptionScheme::kUnencrypted;
   auto video_decoder_config = media::VideoDecoderConfig{
       video_codec,
       profile,
@@ -1223,7 +1229,7 @@ media::VideoDecoderConfig ElementaryMediaTrack::CreateVideoDecoderConfig(
       gfx::Rect{video_size.width(), video_size.height()},  // visible_rect
       video_size,                                          // natural_size
       video_extra_data,
-      EncryptionScheme::kUnencrypted};
+      encryption_scheme};
   video_decoder_config.set_is_low_latency(emss_latency_mode !=
                                           EmssLatencyMode::kNormal);
 #if defined(TIZEN_TV_UPSTREAM_MULTIMEDIA)
@@ -1248,7 +1254,6 @@ media::VideoDecoderConfig ElementaryMediaTrack::CreateVideoDecoderConfig(
   }
 #endif  // BUILDFLAG(IS_TIZEN_TV)
 
-  // FIXME(p.balut): support encrypted streams
   return video_decoder_config;
 }
 
@@ -2392,14 +2397,13 @@ DOMExceptionCode ElementaryMediaTrack::PrepareWebElementaryMediaPacketMetadata(
 
   web_packet_metadata->initialization_vector = std::move(initialization_vector);
 
-  if (!packet_metadata->hasEncryptionMode()) {
-    EMSS_LOG_TYPED(WARNING) << "Missing encryption mode";
-    return DOMExceptionCode::kAppendUnknownDecryptionModeError;
+  if (packet_metadata->hasEncryptionModeNonNull()) {
+    // If used, overrides global track config. This is provided mostly for
+    // backward compatibility with pre-TTvd era.
+    web_packet_metadata->encryption_scheme =
+        EncryptionModeAsEnum(packet_metadata->encryptionModeNonNull().AsEnum());
   }
 
-  web_packet_metadata->encryption_scheme =
-      EncryptionModeAsEnum(packet_metadata->encryptionMode());
-
   if (packet_metadata->hasCryptByteBlock()) {
     web_packet_metadata->crypt_byte_block = packet_metadata->cryptByteBlock();
   }
index 399db2213e35b0f563921da305e510892ae9e6d6..fff098fc059dc6cacdec3dfa18a7dfecf368e2f7 100644 (file)
@@ -52,7 +52,6 @@ class ElementaryMediaTrackSeekEvent;
 class ElementaryPacketMetadata;
 class ElementaryVideoPicture;
 class ElementaryVideoStreamTrackConfig;
-class EncryptedElementaryPacketMetadata;
 class EventQueue;
 class MediaKeySession;
 class ScriptState;
index a221302990a1a4df54d840197143ed2188268826..7e218b84f72da7428d5910419f5e1eb910de6797 100644 (file)
@@ -30,9 +30,11 @@ struct WebElementaryMediaPacketMetadata {
   std::vector<media::SubsampleEntry> subsamples;
   std::string key_id;
   std::string initialization_vector;
-  media::EncryptionScheme encryption_scheme;
   absl::optional<uint32_t> crypt_byte_block;
   absl::optional<uint32_t> skip_byte_block;
+
+  // deprecated since TTvd, provided for backward compatibility
+  absl::optional<media::EncryptionScheme> encryption_scheme;
 };
 
 inline bool operator==(const WebElementaryMediaPacketMetadata& lhs,