dummydrm: CF1 support playersinkbin playback [1/1]
PD#OTT-40282
Problem:
need to use secure buffer to support playersinkbin playback.
Solution:
add property stream mode.
Verify:
S905X4+RDK
Signed-off-by: yanting.zhou <yanting.zhou@amlogic.com>
Change-Id: I33959de2b6682de9c7b5319d909f2dc5c6a07290
diff --git a/gst-aml-drm-plugins-1.0/src/dummy/gstdummydrm.c b/gst-aml-drm-plugins-1.0/src/dummy/gstdummydrm.c
index 585007a..3a28697 100644
--- a/gst-aml-drm-plugins-1.0/src/dummy/gstdummydrm.c
+++ b/gst-aml-drm-plugins-1.0/src/dummy/gstdummydrm.c
@@ -40,6 +40,12 @@
static GstFlowReturn gst_dummydrm_prepare_output_buffer(GstBaseTransform * trans, GstBuffer *input, GstBuffer **outbuf);
static GstFlowReturn gst_dummydrm_transform(GstBaseTransform *trans, GstBuffer *inbuf, GstBuffer *outbuf);
+enum
+{
+ PROP_0,
+ PROP_IS_4K,
+ PROP_STREAM_MODE,
+};
static void
gst_dummydrm_class_init (GstDummyDrmClass * klass)
@@ -58,6 +64,17 @@
base_class->passthrough_on_same_caps = FALSE;
base_class->transform_ip_on_passthrough = FALSE;
+ g_object_class_install_property(gobject_class, PROP_IS_4K,
+ g_param_spec_boolean("is-4k", "is-4k",
+ "is 4k stream",
+ FALSE,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property(gobject_class, PROP_STREAM_MODE,
+ g_param_spec_boolean("stream-mode", "stream-mode",
+ "secmem stream mode",
+ FALSE,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
gst_element_class_add_pad_template (element_class,
gst_static_pad_template_get (&sinktemplate));
gst_element_class_add_pad_template (element_class,
@@ -78,19 +95,56 @@
plugin->allocator = NULL;
plugin->outcaps = NULL;
-
+ plugin->is_4k = FALSE;
+ plugin->stream_mode = FALSE;
}
void
gst_dummydrm_set_property(GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec)
{
- //TODO
+ GstDummyDrm *plugin = GST_DUMMYDRM(object);
+ switch (prop_id)
+ {
+ case PROP_IS_4K:
+ {
+ plugin->is_4k = g_value_get_boolean(value);
+ GST_DEBUG_OBJECT(plugin, "set PROP_IS_4K:%d", plugin->is_4k);
+ break;
+ }
+ case PROP_STREAM_MODE:
+ {
+ plugin->stream_mode = g_value_get_boolean(value);
+ GST_DEBUG_OBJECT(plugin, "set PROP_STREAM_MODE:%d", plugin->stream_mode);
+ break;
+ }
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
+ break;
+ }
}
void
gst_dummydrm_get_property(GObject * object, guint prop_id, GValue * value, GParamSpec * pspec)
{
- //TODO
+ GstDummyDrm *plugin = GST_DUMMYDRM(object);
+ switch (prop_id)
+ {
+ case PROP_IS_4K:
+ {
+ g_value_set_boolean(value, plugin->is_4k);
+ GST_DEBUG_OBJECT(plugin, "get PROP_IS_4K:%d", plugin->is_4k);
+ break;
+ }
+ case PROP_STREAM_MODE:
+ {
+ g_value_set_boolean(value, plugin->stream_mode);
+ GST_DEBUG_OBJECT(plugin, "get PROP_STREAM_MODE:%d", plugin->stream_mode);
+ break;
+ }
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
+ break;
+ }
}
gboolean
@@ -144,11 +198,18 @@
find = true;
gst_caps_set_features(ret, i,
gst_caps_features_from_string (GST_CAPS_FEATURE_MEMORY_SECMEM_MEMORY));
+ if (g_str_has_suffix (gst_structure_get_name (structure), "/mpegts")) {
+ plugin->stream_mode = TRUE;
+ GST_DEBUG_OBJECT (plugin, "source suffix is mpegts, config streammode is true.");
+ }
}
}
if (find) {
if (!plugin->allocator) {
- plugin->allocator = gst_secmem_allocator_new(false, false);
+ uint32_t flag = (plugin->is_4k ? 2 : 1);
+ if (plugin->stream_mode)
+ flag |= (1<<8);
+ plugin->allocator = gst_secmem_allocator_new_ex(false, flag);
}
if (plugin->outcaps) {
gst_caps_unref(plugin->outcaps);
diff --git a/gst-aml-drm-plugins-1.0/src/dummy/gstdummydrm.h b/gst-aml-drm-plugins-1.0/src/dummy/gstdummydrm.h
index 6f2fd2b..5ffce7f 100644
--- a/gst-aml-drm-plugins-1.0/src/dummy/gstdummydrm.h
+++ b/gst-aml-drm-plugins-1.0/src/dummy/gstdummydrm.h
@@ -39,7 +39,8 @@
GstCaps *outcaps;
GstAllocator *allocator;
-
+ gboolean is_4k;
+ gboolean stream_mode;
};
struct _GstDummyDrmClass {
diff --git a/gst-aml-drm-plugins-1.0/src/secmem/gstsecmemallocator.c b/gst-aml-drm-plugins-1.0/src/secmem/gstsecmemallocator.c
index b7b9833..6084b3a 100644
--- a/gst-aml-drm-plugins-1.0/src/secmem/gstsecmemallocator.c
+++ b/gst-aml-drm-plugins-1.0/src/secmem/gstsecmemallocator.c
@@ -186,7 +186,7 @@
}
GstAllocator *
-gst_secmem_allocator_new_ex (uint8_t decoder_format, uint8_t reserved) {
+gst_secmem_allocator_new_ex (uint8_t decoder_format, uint32_t reserved) {
unsigned int ret;
uint32_t flag;
GstAllocator *alloc;
@@ -216,9 +216,10 @@
setsize = CEIL_POS(((uint32_t)(capacity >> 20) + 1) * 0.75);
if(setsize > 12)
setsize = 12;
+ flag |= reserved;
ret = Secure_V2_Init(self->sess, 1, flag, 0, setsize);
g_return_val_if_fail(ret == 0, alloc);
- GST_INFO("secmem init return %d, flag %x", ret, flag);
+ GST_INFO("secmem init return %d, flag 0x%x", ret, flag);
return alloc;
}
diff --git a/gst-aml-drm-plugins-1.0/src/secmem/gstsecmemallocator.h b/gst-aml-drm-plugins-1.0/src/secmem/gstsecmemallocator.h
old mode 100755
new mode 100644
index 728a6f6..592f426
--- a/gst-aml-drm-plugins-1.0/src/secmem/gstsecmemallocator.h
+++ b/gst-aml-drm-plugins-1.0/src/secmem/gstsecmemallocator.h
@@ -72,7 +72,7 @@
GType gst_secmem_allocator_get_type (void);
GstAllocator * gst_secmem_allocator_new (gboolean is_4k, uint8_t decoder_format);
-GstAllocator * gst_secmem_allocator_new_ex (uint8_t decoder_format, uint8_t reserved);
+GstAllocator * gst_secmem_allocator_new_ex (uint8_t decoder_format, uint32_t reserved);
gboolean gst_is_secmem_memory (GstMemory *mem);
gboolean gst_secmem_fill(GstMemory *mem, uint32_t offset, uint8_t *buffer, uint32_t length);
gboolean gst_secmem_copybyhandle(GstMemory *mem, uint32_t dst_handle, uint32_t range, uint32_t dst_offset[], uint32_t src_offset[], uint32_t size[]);