Railto initial support
- set 'native audio' flags for RialtoAudioSink
- set maxVideoWidth/Height for secondary video
- initial cbcs support
Change-Id: Ibd76b4c6e196d306fba183377222bbe7b0d90e54
Signed-off-by: Eugene Mutavchi <Ievgen_Mutavchi@comcast.com>
diff --git a/src/third_party/starboard/rdk/shared/BUILD.gn b/src/third_party/starboard/rdk/shared/BUILD.gn
index b0b23eb..6dfbcbd 100644
--- a/src/third_party/starboard/rdk/shared/BUILD.gn
+++ b/src/third_party/starboard/rdk/shared/BUILD.gn
@@ -34,6 +34,7 @@
rdk_enable_securityagent = true
rdk_enable_ocdm = true
rdk_enable_cryptography = true
+ rdk_enable_cbcs = false
}
pkg_config("glib") {
@@ -87,6 +88,8 @@
static_library("starboard_platform") {
check_includes = false
+ defines = []
+
sources = [
# Shared sources
"//starboard/shared/gles/system_gles2.cc",
@@ -484,6 +487,10 @@
configs += [ ":ocdm" ]
}
+ if (rdk_enable_cbcs) {
+ defines += [ "ENABLE_CBCS=1" ]
+ }
+
public_deps = [
"//starboard:starboard_headers_only",
"//starboard/common",
diff --git a/src/third_party/starboard/rdk/shared/drm/gst_decryptor_ocdm.cc b/src/third_party/starboard/rdk/shared/drm/gst_decryptor_ocdm.cc
index c8f10ec..982e7a7 100644
--- a/src/third_party/starboard/rdk/shared/drm/gst_decryptor_ocdm.cc
+++ b/src/third_party/starboard/rdk/shared/drm/gst_decryptor_ocdm.cc
@@ -429,16 +429,16 @@
GstBuffer* iv = nullptr;
GstBuffer* key = nullptr;
uint32_t subsample_count = 0u;
- uint32_t encryption_scheme = kSbDrmEncryptionSchemeAesCtr;
const GValue* value = nullptr;
- if ( gst_structure_get_uint(info, "encryption_scheme", &encryption_scheme) ) {
- if (encryption_scheme != kSbDrmEncryptionSchemeAesCtr) {
- GST_ELEMENT_ERROR (self, STREAM, DECRYPT, ("Decryption failed"), ("Unsupported encryption scheme = %d", encryption_scheme));
- goto exit;
- }
+#if !(defined(ENABLE_CBCS) && ENABLE_CBCS)
+ const char* cipher_mode = gst_structure_get_string(info, "cipher-mode");
+ if ( g_strcmp0(cipher_mode, "cbcs") == 0 ) {
+ GST_ELEMENT_ERROR (self, STREAM, DECRYPT, ("Decryption failed"), ("Unsupported chipher-mode = %s", cipher_mode));
+ goto exit;
}
+#endif
value = gst_structure_get_value(info, "kid");
if (!value) {
diff --git a/src/third_party/starboard/rdk/shared/player/player_internal.cc b/src/third_party/starboard/rdk/shared/player/player_internal.cc
index d5ce9a6..79074cb 100644
--- a/src/third_party/starboard/rdk/shared/player/player_internal.cc
+++ b/src/third_party/starboard/rdk/shared/player/player_internal.cc
@@ -124,6 +124,11 @@
gst_object_unref(GST_OBJECT(factory));
enable_native_audio = true;
}
+ else if ((factory = gst_element_factory_find("rialtomseaudiosink"))) {
+ guint rank = gst_plugin_feature_get_rank((GstPluginFeature*)factory);
+ gst_object_unref(GST_OBJECT(factory));
+ enable_native_audio = (rank >= GST_RANK_PRIMARY);
+ }
g_once_init_leave (&init, 1);
}
@@ -1950,6 +1955,21 @@
g_object_set(G_OBJECT(element), "async", TRUE, nullptr);
}
}
+
+ if ( !self->max_video_capabilities_.empty() ) {
+ const gchar* klass_str =
+ gst_element_class_get_metadata (GST_ELEMENT_GET_CLASS (element), "klass");
+ if ( strstr(klass_str, "Sink") && strstr(klass_str, "Video") ) {
+ GObjectClass* oclass = G_OBJECT_GET_CLASS(element);
+ if ( g_object_class_find_property(oclass, "maxVideoWidth") &&
+ g_object_class_find_property(oclass, "maxVideoHeight") ) {
+ uint32_t width = 0, height = 0;
+ ParseMaxVideoCapabilities(self->max_video_capabilities_.c_str(), &width, &height, nullptr);
+ g_object_set(G_OBJECT(element), "maxVideoWidth", width, "maxVideoHeight", height, nullptr);
+ }
+ }
+ }
+
}
void PlayerImpl::MarkEOS(SbMediaType stream_type) {
@@ -2089,16 +2109,19 @@
sample_type == kSbMediaTypeVideo ? "video" : "audio");
SB_DCHECK(drm_system_);
- GST_LOG("Encryption scheme %s",
- sample_infos[0].drm_info->encryption_scheme == kSbDrmEncryptionSchemeAesCtr ? "Ctr" :
- (sample_infos[0].drm_info->encryption_scheme == kSbDrmEncryptionSchemeAesCbc ? "Cbc" : "Unknown") );
-
GstBuffer* subsamples = nullptr;
GstBuffer* iv = nullptr;
GstBuffer* key = nullptr;
uint32_t subsamples_count = 0u;
uint32_t iv_size = 0u;
+
const int8_t kEmptyArray[kMaxIvSize / 2] = {0};
+ const auto encryption_scheme = sample_infos[0].drm_info->encryption_scheme;
+ const char* cipher_mode =
+ (encryption_scheme == kSbDrmEncryptionSchemeAesCtr) ? "cenc" :
+ (encryption_scheme == kSbDrmEncryptionSchemeAesCbc ? "cbcs" : "unknown");
+
+ GST_LOG("Encryption cipher-mode: %s", cipher_mode);
key = gst_buffer_new_allocate(
nullptr, sample_infos[0].drm_info->identifier_size, nullptr);
@@ -2144,9 +2167,17 @@
"iv", GST_TYPE_BUFFER, iv,
"subsample_count", G_TYPE_UINT, subsamples_count,
"subsamples", GST_TYPE_BUFFER, subsamples,
- "encryption_scheme", G_TYPE_UINT, sample_infos[0].drm_info->encryption_scheme,
+ "cipher-mode", G_TYPE_STRING, cipher_mode,
NULL);
+ if (encryption_scheme == kSbDrmEncryptionSchemeAesCbc) {
+ const auto& encryption_pattern = sample_infos[0].drm_info->encryption_pattern;
+ gst_structure_set(info,
+ "crypt_byte_block", G_TYPE_UINT, encryption_pattern.crypt_byte_block,
+ "skip_byte_block", G_TYPE_UINT, encryption_pattern.skip_byte_block,
+ NULL);
+ }
+
gst_buffer_add_protection_meta(buffer, info);
gst_buffer_unref(iv);