
{"id":11175,"date":"2024-03-26T12:04:07","date_gmt":"2024-03-26T12:04:07","guid":{"rendered":"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_video_documentation\/vendor_porting_guide\/rdk_svp_designspecification\/"},"modified":"2025-03-25T05:18:37","modified_gmt":"2025-03-25T05:18:37","slug":"rdk_svp_designspecification","status":"publish","type":"page","link":"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_video_documentation\/rdk6\/vendor_porting_guide\/rdk_svp_designspecification\/","title":{"rendered":"RDK SVP Design(Specification)"},"content":{"rendered":"<p><!DOCTYPE html PUBLIC \"-\/\/W3C\/\/DTD HTML 4.0 Transitional\/\/EN\" \"http:\/\/www.w3.org\/TR\/REC-html40\/loose.dtd\"><br \/>\n <html><body><\/p>\n<div class=\"contentLayout2\">\n<div class=\"columnLayout single\" data-layout=\"single\">\n<div class=\"cell normal\" data-type=\"normal\">\n<div class=\"innerCell\">\n<div class=\"toc-macro client-side-toc-macro conf-macro output-block\" data-headerelements=\"H1,H2,H3,H4,H5,H6,H7\" data-hasbody=\"false\" data-macro-name=\"toc\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"columnLayout single\" data-layout=\"single\">\n<div class=\"cell normal\" data-type=\"normal\">\n<div class=\"innerCell\">\n<p><strong style=\"letter-spacing: 0.0px;\"><u>Document Status Codes<\/u><\/strong><\/p>\n<div class=\"table-wrap\">\n\n\n<table class=\"wrapped confluenceTable\"><colgroup><col><col><\/colgroup><tbody><tr><td class=\"confluenceTd\"><strong>Work in Progress (W)<\/strong><\/td><td class=\"confluenceTd\"><span>An incomplete document designed to guide discussion and generate feedback that may include several alternative requirements for consideration.<\/span><\/td><\/tr><tr><td class=\"confluenceTd\"><strong>Draft (D)<\/strong><\/td><td class=\"confluenceTd\"><span>A document in specification format considered largely complete, but lacking review. Drafts are susceptible to substantial change during the review process.<\/span><\/td><\/tr><tr><td class=\"confluenceTd\"><strong>Issued (I)<\/strong><\/td><td class=\"confluenceTd\"><span>A stable document that has undergone rigorous review and is suitable for product design and development. It will serve as a basis for testing requirements.<\/span><\/td><\/tr><\/tbody><\/table>\n\n\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"columnLayout single\" data-layout=\"single\">\n<div class=\"cell normal\" data-type=\"normal\">\n<div class=\"innerCell\">\n<hr><\/div>\n<\/div>\n<\/div>\n<div class=\"columnLayout single\" data-layout=\"single\">\n<div class=\"cell normal\" data-type=\"normal\">\n<div class=\"innerCell\">\n\n\n<h2 class=\"wp-block-heading wp-main-header\"><span class=\"nh-number\">1. <\/span><span>Introduction<\/span><\/h2>\n\n\n<h3 class=\"wp-sub-header\"><span class=\"nh-number\">1.1. <\/span>Overview<\/h3>\n<p><span>Secure video path is a means to protect decrypted content from the host processor.&nbsp; This means that the decrypted data is only accessible to the secure process space on the device and any rouge actor that gains access to the device will not be able to extract the content data.<\/span><\/p>\n<h3 class=\"wp-sub-header\"><span class=\"nh-number\">1.2. <\/span><span>Purpose of Document<\/span><\/h3>\n<p><span>This document defines data types and method interfaces that comprise the RDK SVP architectural design.<\/span><\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"columnLayout single\" data-layout=\"single\">\n<div class=\"cell normal\" data-type=\"normal\">\n<div class=\"innerCell\">\n<hr><\/div>\n<\/div>\n<\/div>\n<div class=\"columnLayout single\" data-layout=\"single\">\n<div class=\"cell normal\" data-type=\"normal\">\n<div class=\"innerCell\">\n\n\n<h2 class=\"wp-block-heading wp-main-header\"><span class=\"nh-number\">2. <\/span><span>References<\/span><\/h2>\n\n\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"columnLayout single\" data-layout=\"single\">\n<div class=\"cell normal\" data-type=\"normal\">\n<div class=\"innerCell\">\n<hr><\/div>\n<\/div>\n<\/div>\n<div class=\"columnLayout single\" data-layout=\"single\">\n<div class=\"cell normal\" data-type=\"normal\">\n<div class=\"innerCell\">\n\n\n<h2 class=\"wp-block-heading wp-main-header\"><span class=\"nh-number\">3. <\/span><span>Abbreviations and Acronyms<\/span><\/h2>\n\n\n<p><span>This document uses the following abbreviations and acronyms.<\/span><\/p>\n<div class=\"table-wrap\">\n\n\n<table class=\"wrapped confluenceTable\"><tbody class=\"\"><tr class=\"\"><th scope=\"col\" class=\"confluenceTh\"><p>Term<\/p><\/th><th scope=\"col\" class=\"confluenceTh\"><p>Definition<\/p><\/th><\/tr><tr class=\"\"><td class=\"confluenceTd\"><p><span>CENC<\/span><\/p><\/td><td class=\"confluenceTd\"><p>Common Encryption<\/p><\/td><\/tr><tr class=\"\"><td class=\"confluenceTd\"><p><span>SoC<\/span><\/p><\/td><td class=\"confluenceTd\"><p>System-on-Chip<\/p><\/td><\/tr><tr class=\"\"><td class=\"confluenceTd\"><p><span>STB<\/span><\/p><\/td><td class=\"confluenceTd\"><p>Set-Top Box<\/p><\/td><\/tr><tr class=\"\"><td class=\"confluenceTd\"><p><span>SVP<\/span><\/p><\/td><td class=\"confluenceTd\"><p>Secure Video Path<\/p><\/td><\/tr><tr class=\"\"><td class=\"confluenceTd\"><p><span>TEE<\/span><\/p><\/td><td class=\"confluenceTd\"><p>Trusted Execution Environment<\/p><\/td><\/tr><\/tbody><\/table>\n\n\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"columnLayout single\" data-layout=\"single\">\n<div class=\"cell normal\" data-type=\"normal\">\n<div class=\"innerCell\">\n<hr><\/div>\n<\/div>\n<\/div>\n<div class=\"columnLayout single\" data-layout=\"single\">\n<div class=\"cell normal\" data-type=\"normal\">\n<div class=\"innerCell\">\n\n\n<h2 class=\"wp-block-heading wp-main-header\"><span class=\"nh-number\">4. <\/span><span>SVP Decrypt Software Stack<\/span><\/h2>\n\n\n<p><span>The normal DRM decrypt flow in the RDK is for the player application either directly or through the gstreamer decryptor filter to call the OCDM service to decrypt a blob of data.&nbsp; This data arrives in the form of a GstBuffer object with meta data describing any CENC information about the location of clear and encrypted data chunks.<\/span><\/p>\n<p><span><\/span><\/p>\n<div class=\"conf-macro output-block\" data-hasbody=\"false\" data-macro-name=\"drawio\">\n<div class=\"drawio-macro\" data-macroid=\"b8ae92fd-6c8e-4aa8-9e69-7cd610184897\" data-buildnum=\"9012\" id=\"drawio-macro-content-b8ae92fd-6c8e-4aa8-9e69-7cd610184897\"><\/div>\n<div id=\"drawio-macro-data-b8ae92fd-6c8e-4aa8-9e69-7cd610184897\"><img decoding=\"async\" alt=\"SVPDecryptSoftwareStack\" title=\"SVPDecryptSoftwareStack\" src=\"https:\/\/developer.rdkcentral.com\/documentation\/wp-content\/uploads\/sites\/16\/2024\/06\/SVPDecryptSoftwareStack.png\"><\/div>\n<\/div>\n<p><span><br \/>There are two ways to handle the decryption of data.&nbsp; In-place and handle based decryption.&nbsp; In-place decryption is used for streams whose licenses do not require the highest level of content protection (generally SD and HD streams).&nbsp; Handle based decryption (SVP) is generally used for UHD content<\/span><\/p>\n<p><span>&nbsp;<\/span><span>In the in-place decryption use case the OCDM service receives encrypted data from the player app and then calls via RPC the DRM plugin operating in a different process that understands the interface of the DRM library (Playready or Widevine) that it encapsulates.&nbsp; This container manages the DRM session context.&nbsp; The Media Session object which receives the data chunk (generally reassembled into a contiguous block of encrypted data) calls the specific DRM method to decrypt the data.<\/span><\/p>\n<p><span>&nbsp;<\/span><span>The DRM decrypts the data chunk and returns the decrypted data in a buffer.&nbsp; This buffer is then returned via the same RPC mechanism to the OCDM service which puts it back into the GstBuffer, replacing the encrypted chunks with the newly decrypted data.&nbsp; The reassembled GstBuffer is then returned to the gstreamer pipeline where it will be processed by the appropriate decoder filter.<\/span><\/p>\n<p><span>&nbsp;<\/span><span>In the handle-based (SVP) use case, the DRM module allocates a secure buffer using an RDK SecAPI method to abstract the platform specifics of the allocation. This is then passed into the SecAPI using the SecCipher_ProcessOpaque() method.&nbsp; The decrypted data is returned in another Sec_OpaqueBufferHandle.&nbsp; This handle is then returned via shared memory to the player process space using a platform specific method.&nbsp; Once back in the ocdm adapter layer the platform specific handle for secure memory (the one that the HW decoder needs to access the memory) is extracted and added to the GstBuffer metadata along with the clear\/encrypted data locations so that the HW decoder can reassemble the data before processing.<\/span><\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"columnLayout single\" data-layout=\"single\">\n<div class=\"cell normal\" data-type=\"normal\">\n<div class=\"innerCell\">\n<h3 class=\"wp-sub-header\"><span class=\"nh-number\">4.1. <\/span><span>Gstreamer Decrypter Filter\/Application Direct Connect<\/span><\/h3>\n<p><span>Applications can process encrypted data in the gstreamer pipeline in two ways. First, they can decrypt the data directly and then push the result into the gstreamer pipeline directly via an appsrc filter.&nbsp; Second, they can setup the pipeline to have a decrypt filter.&nbsp; This filter will take the encrypted data and process it so that it can proceed to the media decoder.<\/span><\/p>\n<p><span>In both cases the encrypted data will be passed to the OCDM service via the opencdm_gstreamer_session_decrypt() function.<\/span><\/p>\n<div class=\"code panel pdl conf-macro output-block\" data-hasbody=\"true\" data-macro-name=\"code\">\n<div class=\"codeContent panelContent pdl\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">\/**\n\n&nbsp;* brief Performs decryption based on adapter implementation.\n\n&nbsp;*\n\n&nbsp;* This method accepts encrypted data and will typically decrypt it\n\n&nbsp;* out-of-process (for security reasons). The actual data copying is &nbsp;&nbsp;&nbsp;\n\n&nbsp;* performed using a memory-mapped file (for performance reasons). If\n\n&nbsp;* the DRM system allows access to decrypted data (i.e. decrypting is\n\n&nbsp;* not performed in a TEE), the decryption is performed in-place.\n\n&nbsp;* param session ref OpenCDMSession instance.\n\n&nbsp;* param buffer Gstreamer buffer containing encrypted data and related\n\n&nbsp;* meta data. If applicable, decrypted data will be stored here after\n\n&nbsp;* this call returns.\n\n&nbsp;* param subSample Gstreamer buffer containing subsamples size which\n\n&nbsp;* has been parsed from protection meta data.\n\n&nbsp;* param subSampleCount count of subsamples\n\n&nbsp;* param IV Gstreamer buffer containing initial vector (IV) used&nbsp;\n\n&nbsp;* during decryption.\n\n&nbsp;* param keyID Gstreamer buffer containing keyID to use for decryption\n\n&nbsp;* return Zero on success, non-zero on error.\n\n&nbsp;*\/<\/pre>\n<\/div>\n<\/div>\n<p><span>EXTERNAL OpenCDMError opencdm_gstreamer_session_decrypt(struct OpenCDMSession* session, GstBuffer* buffer, GstBuffer* subSample, const uint32_t subSampleCount, GstBuffer* IV, GstBuffer* keyID, uint32_t initWithLast15=0, uint32_t width=0, uint32_t height=0);<\/span><\/p>\n<p><span>This function runs in the application process space and will process and marshal the data over RPC to the DRM plugin running in the wpeframework process space.<\/span><\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"columnLayout single\" data-layout=\"single\">\n<div class=\"cell normal\" data-type=\"normal\">\n<div class=\"innerCell\">\n<h3 class=\"wp-sub-header\"><span class=\"nh-number\">4.2. <\/span><span>WPEFramework<\/span><\/h3>\n<p><span>The opencdm_gstreamer_session_decrypt() function will parse the incoming data, merge all the encrypted data into one block and call the DRM plugin decrypt function.<\/span><\/p>\n<div class=\"code panel pdl conf-macro output-block\" data-hasbody=\"true\" data-macro-name=\"code\">\n<div class=\"codeContent panelContent pdl\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">\/**\n\n&nbsp;* brief Performs decryption.\n\n&nbsp;*\n\n&nbsp;* This method accepts encrypted data and will typically decrypt it\n\n&nbsp;* out-of-process (for security reasons). The actual data copying is &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n\n&nbsp;* performed using a memory-mapped file (for performance reasons). If &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n\n&nbsp;* the DRM system allows access to decrypted data\n\n&nbsp;* (i.e. decrypting is not performed in a TEE), the decryption is\n\n&nbsp;* performed in-place.\n\n&nbsp;* param session ref OpenCDMSession instance.\n\n&nbsp;* param encrypted Buffer containing encrypted data.\n\n&nbsp;* If applicable, decrypted\n\n&nbsp;* data will be stored here after this call returns.\n\n&nbsp;* param encryptedLength Length of encrypted data buffer (in bytes).\n\n&nbsp;* param IV Initial vector (IV) used during decryption. Can be NULL,\n\n&nbsp;* in that case and IV of all zeroes is assumed.\n\n&nbsp;* param IVLength Length of IV buffer (in bytes).\n\n&nbsp;* param keyID keyID to use for decryption\n\n&nbsp;* param keyIDLength Length of keyID buffer (in bytes).\n\n&nbsp;* param initWithLast15 Whether decryption context needs to be\n\n&nbsp;* initialized with last 15 bytes.\n\n&nbsp;* Currently this only applies to PlayReady DRM.\n\n&nbsp;* return Zero on success, non-zero on error.\n\n&nbsp;*\/\nEXTERNAL OpenCDMError opencdm_session_decrypt(\n\n\n&nbsp;&nbsp;&nbsp; struct OpenCDMSession* session,\n\n&nbsp;&nbsp;&nbsp; uint8_t encrypted[],\n\n&nbsp;&nbsp;&nbsp; const uint32_t encryptedLength,\n\n&nbsp;&nbsp;&nbsp; const uint8_t* IV, uint16_t IVLength,\n\n&nbsp;&nbsp;&nbsp; const uint8_t* keyId, const uint16_t keyIdLength,\n\n&nbsp;&nbsp;&nbsp; uint32_t initWithLast15 = 0,\n\n&nbsp;&nbsp;&nbsp; uint32_t width = 0,\n\n&nbsp;&nbsp;&nbsp; uint32_t height = 0 );<\/pre>\n<\/div>\n<\/div>\n<p><span>If the DRM plugin decides that the content requires decryption using the SVP pipeline then the function will return ERROR_NONE_SVP, otherwise for in-place decryption it will return ERROR_NONE.<\/span><\/p>\n<p><span>When the SVP data return is signaled then this function will detokenize the data using the gst-svp-ext library function<\/span><\/p>\n<p><span>boolean svp_buffer_from_token(void* svp_token, void** svp_handle);<\/span><\/p>\n<p>which will convert the data back into the structure allocated by the DRM to house the SVP decrypted data.<\/p>\n<p><span>Then the function will call &nbsp;gst_buffer_append_svp_transform() to assemble the GstBuffer in a manner that is appropriate for the platform implementation.<\/span><\/p>\n<div class=\"code panel pdl conf-macro output-block\" data-hasbody=\"true\" data-macro-name=\"code\">\n<div class=\"codeContent panelContent pdl\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">\/*\n\n*&nbsp; GstBuffer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *buffer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - gstreamer buffer that svp\n\n*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; meta data will be appended to\n\n*&nbsp; svp_meta_data_t&nbsp;&nbsp;&nbsp; *svp_metadata&nbsp;&nbsp;&nbsp; - svp meta data\n\n*\/\ngboolean gst_buffer_append_svp_transform(GstBuffer* buffer, GstBuffer* subSampleBuffer, const guint32 subSampleCount, guint32 encryptedData);<\/pre>\n<\/div>\n<\/div>\n<p><span>This function takes in the GstBuffer to be returned to the gstreamer pipeline, the returned encrypted data, and the meta data about the CENC clear\/encrypted data locations and transforms the buffer into something that the platforms HW media decoders can consume. The SoC specific implementation needed to achive this is hidden in the gst-svp-ext library.<\/span><\/p>\n<p><span>This GstBuffer is then returned to the calling application and processed through the gstreamer filters.&nbsp; Any allocated memory pointers contained in the GstBuffer or its metadata will need to be freed by the hardware decoder.<\/span><\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"columnLayout single\" data-layout=\"single\">\n<div class=\"cell normal\" data-type=\"normal\">\n<div class=\"innerCell\">\n<h3 class=\"wp-sub-header\"><span class=\"nh-number\">4.3. <\/span><span>OCDM MediaSession<\/span><\/h3>\n<p><span>&nbsp;<\/span><span>The <\/span><span>opencdm_session_decrypt() function will call into the DRM plugin associated with the session variable using the wpeframeworks built in RPC mechanism. This will end up in the MediaSession::decrypt() function<\/span><\/p>\n<div class=\"code panel pdl conf-macro output-block\" data-hasbody=\"true\" data-macro-name=\"code\">\n<div class=\"codeContent panelContent pdl\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">CDMi_RESULT MediaKeySession::Decrypt(\n\n&nbsp;&nbsp;&nbsp; const uint8_t *f_pbSessionKey,\n\n&nbsp;&nbsp;&nbsp; uint32_t f_cbSessionKey,\n\n&nbsp;&nbsp;&nbsp; const uint32_t *f_pdwSubSampleMapping,\n\n&nbsp;&nbsp;&nbsp; uint32_t f_cdwSubSampleMapping,\n\n&nbsp;&nbsp;&nbsp; const uint8_t *f_pbIV,\n\n&nbsp;&nbsp;&nbsp; uint32_t f_cbIV,\n\n&nbsp;&nbsp;&nbsp; const uint8_t *payloadData,\n\n&nbsp;&nbsp;&nbsp; uint32_t payloadDataSize,\n\n&nbsp;&nbsp;&nbsp; uint32_t *f_pcbOpaqueClearContent,\n\n&nbsp;&nbsp;&nbsp; uint8_t **f_ppbOpaqueClearContent,\n\n&nbsp;&nbsp;&nbsp; const uint8_t keyIdLength,\n\n&nbsp;&nbsp;&nbsp; const uint8_t* f_keyId,\n\n&nbsp;&nbsp;&nbsp; bool initWithLast15\n\n#ifdef USE_STREAM_RESOLUTION_API\n\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ,uint32_t f_dwStreamWidth\n\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ,uint32_t f_dwStreamHeight\n\n#endif\n\n&nbsp;&nbsp;&nbsp; )<\/pre>\n<\/div>\n<\/div>\n<p><span>The MediaKeySession object will track the license requirements of the DRM via its specific callback mechanisms and decide if this session will require handle-based decryption (SVP) or in-place decryption.&nbsp; If SVP is indicated, then the MediaSession will call the appropriate DRM entry point for handle-based decryption.&nbsp; The decrypted data is returned as a handle to opaque memory that only the secure processor can access. <\/span><\/p>\n<p><span>This handle will need to get tokenized so that it can be transported across process space and returned to the application memory context.<\/span><\/p>\n<p><span>The gst-svp-ext library will provide an abstraction for the tokenization\/detokenization routines.<\/span><\/p>\n<p><span>boolean svp_buffer_to_token(void* svp_handle, void** svp_token);<\/span><\/p>\n<p><span>This function will take the handle returned from the DRM library and turn it into a value that can be dereferenced in the application process space.<\/span><\/p>\n<p><span>The function will then return ERROR_NONE_SVP to indicate that the returned data contains a token and not the actual decrypted data.<\/span><\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"columnLayout single\" data-layout=\"single\">\n<div class=\"cell normal\" data-type=\"normal\">\n<div class=\"innerCell\">\n<hr><\/div>\n<\/div>\n<\/div>\n<div class=\"columnLayout single\" data-layout=\"single\">\n<div class=\"cell normal\" data-type=\"normal\">\n<div class=\"innerCell\">\n\n\n<h2 class=\"wp-block-heading wp-main-header\"><span class=\"nh-number\">5. <\/span><span>Platform Abstractions<\/span><\/h2>\n\n\n<p>The way SVP data is generated, tokenized, and consumed will be different for each specific SoC platform.&nbsp; The gst-svp-ext library will abstract the platform dependencies at each step.<\/p>\n<p><span>There will be a public interface defined by the RDK and each SoC will have its own implementation in separate repositories that perform the necessary functions.<\/span><\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"columnLayout single\" data-layout=\"single\">\n<div class=\"cell normal\" data-type=\"normal\">\n<div class=\"innerCell\">\n<hr><\/div>\n<\/div>\n<\/div>\n<div class=\"columnLayout single\" data-layout=\"single\">\n<div class=\"cell normal\" data-type=\"normal\">\n<div class=\"innerCell\">\n\n\n<h2 class=\"wp-block-heading wp-main-header\"><span class=\"nh-number\">6. <\/span><span>Support for multiple decode paths<\/span><\/h2>\n\n\n<p>On some platforms the audio decode path can not support the use of SVP data handles.&nbsp; This will be handled by the dictates of the license provided for the content.&nbsp; If the license states that the content requires handle-based decryption then the DRM will decrypt the data in that format.&nbsp; If the license allows in place decryption then the DRM will return the decrypted data to host accessible memory for decoding.<\/p>\n<p><span>If forcing the DRM to use handle-based decryption (SVP) then an additional flag or configuration parameter will be needed at the MediaKeySession layer.<\/span><\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"columnLayout single\" data-layout=\"single\">\n<div class=\"cell normal\" data-type=\"normal\">\n<div class=\"innerCell\">\n<hr><\/div>\n<\/div>\n<\/div>\n<div class=\"columnLayout single\" data-layout=\"single\">\n<div class=\"cell normal\" data-type=\"normal\">\n<div class=\"innerCell\">\n\n\n<h2 class=\"wp-block-heading wp-main-header\"><span class=\"nh-number\">7. <\/span><span>GST-SVP-EXT<\/span><\/h2>\n\n\n<h3 class=\"wp-sub-header\"><span class=\"nh-number\">7.1. <\/span>Data Structures<\/h3>\n<h3 id=\"RDKSVPDesign(Specification)-EncryptedDataChunk\"><span class=\"nh-number\">7.1.1. <\/span>Encrypted Data Chunk<\/h3>\n<p>This structure defines a chunk of data with both encrypted and clear data segments.&nbsp; It is used to describe sections of the CENC data.<\/p>\n<div class=\"table-wrap\">\n\n\n<table class=\"wrapped confluenceTable\"><thead class=\"\"><tr class=\"\"><td class=\"confluenceTd\"><p>Structure Name<\/p><\/td><td class=\"confluenceTd\"><p>Description<\/p><\/td><\/tr><\/thead><tbody class=\"\"><tr class=\"\"><td class=\"confluenceTd\"><p>enc_chunk_data_t<\/p><p><br><\/p><\/td><td class=\"confluenceTd\"><p>typedef&nbsp;struct&nbsp;enc_data_chunk&nbsp;enc_chunk_data_t;<br><br><\/p><p>struct&nbsp;enc_data_chunk&nbsp;{<\/p><p>&nbsp;&nbsp;&nbsp;&nbsp;guint32&nbsp;clear_data_size;<\/p><p>&nbsp;&nbsp;&nbsp;&nbsp;guint32&nbsp;enc_data_size;<\/p><p>};<\/p><\/td><\/tr><\/tbody><\/table>\n\n\n<\/div>\n<h3 id=\"RDKSVPDesign(Specification)-SVPMetaData\"><span class=\"nh-number\">7.1.2. <\/span><span>SVP Meta Data<\/span><\/h3>\n<p><span>This structure defines the metadata that is appended to the gstreamer buffer.&nbsp; It contains an array of data chunks and the handle to the secure memory that contains the decrypted data.<\/span><\/p>\n<div class=\"table-wrap\">\n\n\n<table class=\"wrapped confluenceTable\"><thead class=\"\"><tr class=\"\"><td class=\"confluenceTd\"><p>Structure Name<\/p><\/td><td class=\"confluenceTd\"><p>Description<\/p><\/td><\/tr><\/thead><tbody class=\"\"><tr class=\"\"><td class=\"confluenceTd\"><p>svp_meta_data_t<\/p><p><br><\/p><\/td><td class=\"confluenceTd\"><p>typedef&nbsp;struct&nbsp;svp_meta_data&nbsp;svp_meta_data_t;<br><br><\/p><p>struct&nbsp;svp_meta_data&nbsp;{<\/p><p>&nbsp;&nbsp;&nbsp;&nbsp;guint32&nbsp;secure_memory_ptr;<\/p><p>&nbsp;&nbsp;&nbsp;&nbsp;guint32&nbsp;num_chunks;<\/p><p>&nbsp;&nbsp;&nbsp;&nbsp;enc_chunk_data&nbsp;*info;<\/p><p>};<\/p><\/td><\/tr><\/tbody><\/table>\n\n\n<\/div>\n<p><span>&nbsp;<\/span><\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"columnLayout single\" data-layout=\"single\">\n<div class=\"cell normal\" data-type=\"normal\">\n<div class=\"innerCell\">\n<h3 class=\"wp-sub-header\"><span class=\"nh-number\">7.2. <\/span><span>Methods<\/span><\/h3>\n<h4 id=\"RDKSVPDesign(Specification)-gst_buffer_append_svp_transform\"><span class=\"nh-number\">7.2.1.1. <\/span>gst_buffer_append_svp_transform<\/h4>\n<p>This function transforms the GstBuffer returned to gstreamer to a format that the SoC plarform knows how to consume. Any conversion of the data contained in the final buffer returned to gstreamer is performed in this function<\/p>\n<p><span>gboolean gst_buffer_append_svp_transform(void * pContext, GstBuffer* buffer, GstBuffer* subSampleBuffer, const guint32 subSampleCount, guint8* encryptedData,const guint32 mappedDataSize=0);<\/span><\/p>\n<div class=\"table-wrap\">\n\n\n<table class=\"wrapped confluenceTable\"><tbody class=\"\"><tr class=\"\"><th scope=\"col\" class=\"confluenceTh\"><p>Function Parameter<\/p><\/th><th scope=\"col\" class=\"confluenceTh\"><p>Description<\/p><\/th><\/tr><tr class=\"\"><td class=\"confluenceTd\"><p>GstBuffer *<\/p><\/td><td class=\"confluenceTd\"><p>Pointer to gstreamer buffer containing the original CENC data chunk<\/p><\/td><\/tr><tr class=\"\"><td class=\"confluenceTd\"><p>GstBuffer *<\/p><\/td><td class=\"confluenceTd\"><p>Pointer to gstreamer buffer containing the map of clear and encrypted chunks for the buffer in parameter 1<\/p><\/td><\/tr><tr class=\"\"><td class=\"confluenceTd\"><p>guint32<\/p><\/td><td class=\"confluenceTd\"><p>The count of the number of clear and encrypted data pairs<\/p><\/td><\/tr><tr class=\"\"><td class=\"confluenceTd\"><p>guint32<\/p><\/td><td class=\"confluenceTd\"><p>Handle to the opaque data containing the decrypted data<\/p><\/td><\/tr><tr class=\"\"><td class=\"confluenceTd\"><p>const guint32<\/p><\/td><td class=\"confluenceTd\"><p><br><\/p><\/td><\/tr><\/tbody><\/table>\n\n\n<\/div>\n<h4 id=\"RDKSVPDesign(Specification)-svp_buffer_to_token\"><span class=\"nh-number\">7.2.1.2. <\/span><span>svp_buffer_to_token<\/span><\/h4>\n<p>This function converts the SVP data handle into a token that will allow a different process to regenerate the SVP data handle and use it in that memory space.<\/p>\n<p>boolean svp_buffer_to_token(void* svp_handle, void** svp_token);<\/p>\n<div class=\"table-wrap\">\n\n\n<table class=\"wrapped confluenceTable\"><tbody class=\"\"><tr class=\"\"><th scope=\"col\" class=\"confluenceTh\"><p>Function Parameter<\/p><\/th><th scope=\"col\" class=\"confluenceTh\"><p>Description<\/p><\/th><\/tr><tr class=\"\"><td class=\"confluenceTd\"><p>void *<\/p><\/td><td class=\"confluenceTd\"><p>Handle to the SVP data returned from the DRM<\/p><\/td><\/tr><tr class=\"\"><td class=\"confluenceTd\"><p>void**<\/p><\/td><td class=\"confluenceTd\"><p>Pointer to the token that can be used to revive the SVP handle in a different process<\/p><\/td><\/tr><\/tbody><\/table>\n\n\n<\/div>\n<h4 id=\"RDKSVPDesign(Specification)-svp_buffer_from_token\"><span class=\"nh-number\">7.2.1.3. <\/span><span>svp_buffer_from_token<\/span><\/h4>\n<p>This function converts the SVP token back into a handle that can be used in the memory space of the current process.<\/p>\n<p><span>boolean svp_buffer_from_token(void* svp_token, void** svp_handle);<\/span><\/p>\n<div class=\"table-wrap\">\n\n\n<table class=\"wrapped confluenceTable\"><tbody class=\"\"><tr class=\"\"><th scope=\"col\" class=\"confluenceTh\"><p>Function Parameter<\/p><\/th><th scope=\"col\" class=\"confluenceTh\"><p>Description<\/p><\/th><\/tr><tr class=\"\"><td class=\"confluenceTd\"><p>void *<\/p><\/td><td class=\"confluenceTd\"><p>Token used to identify the SVP data handle<\/p><\/td><\/tr><tr class=\"\"><td class=\"confluenceTd\"><p>void**<\/p><\/td><td class=\"confluenceTd\"><p>Pointer to the SVP data handle<\/p><\/td><\/tr><\/tbody><\/table>\n\n\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"columnLayout single\" data-layout=\"single\">\n<div class=\"cell normal\" data-type=\"normal\">\n<div class=\"innerCell\">\n<h4 id=\"RDKSVPDesign(Specification)-gst_buffer_append_svp_metadata\"><span class=\"nh-number\">7.2.1.4. <\/span>gst_buffer_append_svp_metadata<\/h4>\n<p>This function appends the svp_meta_data_t structure to a GstBuffer for later processing by the TEE responsible for video processing. The function returns TRUE on success, FALSE on failure.<\/p>\n<p><span>gboolean gst_buffer_append_svp_metadata<\/span><span>(<\/span><span>GstBuffer<\/span><span> <\/span><span>*<\/span><span> buffer<\/span><span>,<\/span><span>&nbsp; <\/span><span>svp_meta_data_t<\/span><span> <\/span><span>*<\/span><span> svp_metadata<\/span><span>,<\/span><span> <\/span><span>const<\/span><span> guint32 mappedDataSize<\/span><span>=<\/span><span>0<\/span><span>);<\/span><\/p>\n<div class=\"table-wrap\">\n\n\n<table class=\"wrapped confluenceTable\"><tbody class=\"\"><tr class=\"\"><th scope=\"col\" class=\"confluenceTh\"><p>Function Parameter<\/p><\/th><th scope=\"col\" class=\"confluenceTh\"><p>Description<\/p><\/th><\/tr><tr class=\"\"><td class=\"confluenceTd\"><p>GstBuffer *<\/p><\/td><td class=\"confluenceTd\"><p>Pointer to gstreamer buffer containing the original CENC data chunk<\/p><\/td><\/tr><tr class=\"\"><td class=\"confluenceTd\"><p>svp_meta_data_t&nbsp;*<\/p><\/td><td class=\"confluenceTd\"><p>Pointer to a the svp meta data structure<br><br><\/p><p>typedef&nbsp;struct&nbsp;svp_meta_data&nbsp;svp_meta_data_t;<\/p><p>struct&nbsp;svp_meta_data&nbsp;{<\/p><p>&nbsp;&nbsp;&nbsp;&nbsp;guint32&nbsp;secure_memory_ptr;<\/p><p>&nbsp;&nbsp;&nbsp;&nbsp;guint32&nbsp;num_chunks;<\/p><p>&nbsp;&nbsp;&nbsp;&nbsp;enc_chunk_data_t&nbsp;*info;<\/p><p>};<\/p><\/td><\/tr><tr class=\"\"><td class=\"confluenceTd\"><p><span>Const <\/span><span>guint32<\/span><\/p><\/td><td class=\"confluenceTd\"><p>A const mappedDataSize and set to zero<\/p><\/td><\/tr><\/tbody><\/table>\n\n\n<\/div>\n<h4 id=\"RDKSVPDesign(Specification)-gst_svp_ext_get_context\"><span class=\"nh-number\">7.2.1.5. <\/span>gst_svp_ext_get_context<\/h4>\n<p>This function creates a new context to perform all further SVP related operation, if a context is not already created.<\/p>\n<p><span>gboolean gst_svp_ext_get_context<\/span><span>(<\/span><span>void<\/span><span> <\/span><span>**<\/span><span> ppContext<\/span><span>,<\/span><span> context_type type<\/span><span>,<\/span><span> <\/span><span>unsigned<\/span><span> <\/span><span>int<\/span><span> rpcID<\/span><span>);<\/span><\/p>\n<div class=\"table-wrap\">\n\n\n<table class=\"wrapped confluenceTable\"><tbody class=\"\"><tr class=\"\"><th scope=\"col\" class=\"confluenceTh\"><p>Function Parameter<\/p><\/th><th scope=\"col\" class=\"confluenceTh\"><p>Description<\/p><\/th><\/tr><tr class=\"\"><td class=\"confluenceTd\"><p>Void **ppContnext<\/p><\/td><td class=\"confluenceTd\"><p>Pointer to SVP context created by SOC platform<\/p><\/td><\/tr><tr class=\"\"><td class=\"confluenceTd\"><p>Context_type<\/p><\/td><td class=\"confluenceTd\"><p>Indicate type of the context going to create.<\/p><p>Possible Values:<\/p><p>Client<\/p><p>Server<\/p><p><br><\/p><\/td><\/tr><tr class=\"\"><td class=\"confluenceTd\"><p>rpcID<\/p><\/td><td class=\"confluenceTd\"><p>Not Using<\/p><\/td><\/tr><\/tbody><\/table>\n\n\n<\/div>\n<h4 id=\"RDKSVPDesign(Specification)-gst_svp_ext_context_set_caps\"><span class=\"nh-number\">7.2.1.6. <\/span>gst_svp_ext_context_set_caps<\/h4>\n<p>This function uses to set the Caps that is part of SVP context with capabilities passed to it.<\/p>\n<p><span>gboolean gst_svp_ext_context_set_caps<\/span><span>(<\/span><span>void<\/span><span> <\/span><span>*<\/span><span> pContext<\/span><span>,<\/span><span> <\/span><span>GstCaps<\/span><span> <\/span><span>*<\/span><span>caps<\/span><span>)<\/span><\/p>\n<div class=\"table-wrap\">\n\n\n<table class=\"wrapped confluenceTable\"><tbody class=\"\"><tr class=\"\"><th scope=\"col\" class=\"confluenceTh\"><p>Function Parameter<\/p><\/th><th scope=\"col\" class=\"confluenceTh\"><p>Description<\/p><\/th><\/tr><tr class=\"\"><td class=\"confluenceTd\"><p>Void *pContext<\/p><\/td><td class=\"confluenceTd\"><p>Pointer to SVP context created by SOC platform<\/p><\/td><\/tr><tr class=\"\"><td class=\"confluenceTd\"><p>GstCaps *<\/p><\/td><td class=\"confluenceTd\"><p>Describes the media Type and associated properties of the media type.<\/p><p><br><\/p><\/td><\/tr><\/tbody><\/table>\n\n\n<\/div>\n<h4 id=\"RDKSVPDesign(Specification)-gst_svp_ext_free_context\"><span class=\"nh-number\">7.2.1.7. <\/span>gst_svp_ext_free_context<\/h4>\n<p>This function free the context created.<\/p>\n<p><span>gboolean gst_svp_ext_free_context<\/span><span>(<\/span><span>void<\/span><span> <\/span><span>*<\/span><span> pContext<\/span><span>)<\/span><\/p>\n<div class=\"table-wrap\">\n\n\n<table class=\"wrapped confluenceTable\"><tbody class=\"\"><tr class=\"\"><th scope=\"col\" class=\"confluenceTh\"><p>Function Parameter<\/p><\/th><th scope=\"col\" class=\"confluenceTh\"><p>Description<\/p><\/th><\/tr><tr class=\"\"><td class=\"confluenceTd\"><p>Void *pContext<\/p><\/td><td class=\"confluenceTd\"><p>Pointer to SVP context created by SOC platform<\/p><\/td><\/tr><\/tbody><\/table>\n\n\n<\/div>\n<h4 id=\"RDKSVPDesign(Specification)-gst_svp_ext_transform_caps\"><span class=\"nh-number\">7.2.1.8. <\/span>gst_svp_ext_transform_caps<\/h4>\n<p>This function decides which memory (SOC specific Implementation) to be used based on the caps string passed to it.<\/p>\n<p><span>gboolean gst_svp_ext_transform_caps<\/span><span>(<\/span><span>GstCaps<\/span><span> <\/span><span>**<\/span><span>caps<\/span><span>,<\/span><span> gboolean bEncrypted<\/span><span>);<\/span><\/p>\n<div class=\"table-wrap\">\n\n\n<table class=\"wrapped confluenceTable\"><tbody class=\"\"><tr class=\"\"><th scope=\"col\" class=\"confluenceTh\"><p>Function Parameter<\/p><\/th><th scope=\"col\" class=\"confluenceTh\"><p>Description<\/p><\/th><\/tr><tr class=\"\"><td class=\"confluenceTd\"><p>GstCaps **<\/p><\/td><td class=\"confluenceTd\"><p>Describes the media Type and associated properties of the media type.<\/p><p><br><\/p><\/td><\/tr><tr class=\"\"><td class=\"confluenceTd\"><p>Gboolean bEncrypted<\/p><\/td><td class=\"confluenceTd\"><p>Not Using<\/p><\/td><\/tr><\/tbody><\/table>\n\n\n<\/div>\n<h4 id=\"RDKSVPDesign(Specification)-gst_svp_ext_transform_from_clear_data\"><span class=\"nh-number\">7.2.1.9. <\/span><span>gst_svp_ext_transform_from_clear_data<\/span><\/h4>\n<p>This function allocates a secure memory of Gst buffer size and put the newly allocated secure memory into gstBuffer.<\/p>\n<p><span>gboolean gst_buffer_svp_transform_from_cleardata_impl<\/span><span>(<\/span><span>void<\/span><span> <\/span><span>*<\/span><span> pContext<\/span><span>,<\/span><span> <\/span><span>GstBuffer<\/span><span>*<\/span><span> buffer<\/span><span>,<\/span><span> media_type mediaType<\/span><span>)<\/span><\/p>\n<div class=\"table-wrap\">\n\n\n<table class=\"wrapped confluenceTable\"><tbody class=\"\"><tr class=\"\"><th scope=\"col\" class=\"confluenceTh\"><p>Function Parameter<\/p><\/th><th scope=\"col\" class=\"confluenceTh\"><p>Description<\/p><\/th><\/tr><tr class=\"\"><td class=\"confluenceTd\"><p>void *pContext<\/p><\/td><td class=\"confluenceTd\"><p>Pointer to SVP context created by SOC platform<\/p><\/td><\/tr><tr class=\"\"><td class=\"confluenceTd\"><p>GstBuffer*<\/p><\/td><td class=\"confluenceTd\"><p>Pointer to gstreamer buffer containing the original data chunk<\/p><\/td><\/tr><tr class=\"\"><td class=\"confluenceTd\"><p>Media_type<\/p><\/td><td class=\"confluenceTd\"><p>Indicate the type of the media. Possible values are.<\/p><p>Audio<\/p><p>Video<\/p><\/td><\/tr><\/tbody><\/table>\n\n\n<\/div>\n<h4 id=\"RDKSVPDesign(Specification)-gst_buffer_svp_segmented_decrypt_size\"><span class=\"nh-number\">7.2.1.10. <\/span>gst_buffer_svp_segmented_decrypt_size<\/h4>\n<p>Yet to be Implemented.<\/p>\n<p><span>guint32&nbsp; gst_buffer_svp_segmented_decrypt_size<\/span><span>(<\/span><span>guint32 nEncryptedDataSize<\/span><span>);<\/span><\/p>\n<div class=\"table-wrap\">\n\n\n<table class=\"wrapped confluenceTable\"><tbody class=\"\"><tr class=\"\"><th scope=\"col\" class=\"confluenceTh\"><p>Function Parameter<\/p><\/th><th scope=\"col\" class=\"confluenceTh\"><p>Description<\/p><\/th><\/tr><tr class=\"\"><td class=\"confluenceTd\"><p>Guint32<\/p><\/td><td class=\"confluenceTd\"><p>Indicate the size of Encrypted data<\/p><\/td><\/tr><\/tbody><\/table>\n\n\n<\/div>\n<h4 id=\"RDKSVPDesign(Specification)-gst_buffer_append_svp_transform_segmented_init\"><span class=\"nh-number\">7.2.1.11. <\/span>gst_buffer_append_svp_transform_segmented_init<\/h4>\n<p>Yet to be Implemented.<\/p>\n<p><span>gboolean gst_buffer_append_svp_transform_segmented_init<\/span><span>(<\/span><span>void<\/span><span> <\/span><span>*<\/span><span> pContext<\/span><span>,<\/span><span> <\/span><span>GstBuffer<\/span><span>*<\/span><span> buffer<\/span><span>,<\/span><span> <\/span><span>GstBuffer<\/span><span>*<\/span><span> subSampleBuffer<\/span><span>,<\/span><span> <\/span><span>const<\/span><span> guint32 subSampleCount<\/span><span>);<\/span><\/p>\n<div class=\"table-wrap\">\n\n\n<table class=\"wrapped confluenceTable\"><tbody class=\"\"><tr class=\"\"><th scope=\"col\" class=\"confluenceTh\"><p>Function Parameter<\/p><\/th><th scope=\"col\" class=\"confluenceTh\"><p>Description<\/p><\/th><\/tr><tr class=\"\"><td class=\"confluenceTd\"><p>Void *<span> pContext<\/span><\/p><\/td><td class=\"confluenceTd\"><p>Pointer to SVP context created by SOC platform<\/p><\/td><\/tr><tr class=\"\"><td class=\"confluenceTd\"><p>GstBuffer *<\/p><\/td><td class=\"confluenceTd\"><p>Pointer to gstreamer buffer containing the original data chunk<\/p><\/td><\/tr><tr class=\"\"><td class=\"confluenceTd\"><p>GstBuffer *<\/p><\/td><td class=\"confluenceTd\"><p>Pointer to gstreamer buffer containing the map of clear and encrypted chunks for the buffer in parameter 1<\/p><\/td><\/tr><tr class=\"\"><td class=\"confluenceTd\"><p>guint32<\/p><\/td><td class=\"confluenceTd\"><p>The count of the number of clear and encrypted data pairs<\/p><\/td><\/tr><\/tbody><\/table>\n\n\n<\/div>\n<h4 id=\"RDKSVPDesign(Specification)-gst_buffer_append_svp_transform_segmented_process\"><span class=\"nh-number\">7.2.1.12. <\/span>gst_buffer_append_svp_transform_segmented_process<\/h4>\n<p>Yet to be Implemented.<\/p>\n<p><span>gboolean gst_buffer_append_svp_transform_segmented_process<\/span><span>(<\/span><span>void<\/span><span> <\/span><span>*<\/span><span> pContext<\/span><span>,<\/span><span> guint8<\/span><span>*<\/span><span> encryptedData<\/span><span>,<\/span><span> guint32 encyptedDataLength<\/span><span>);<\/span><\/p>\n<div class=\"table-wrap\">\n\n\n<table class=\"wrapped confluenceTable\"><tbody class=\"\"><tr class=\"\"><th scope=\"col\" class=\"confluenceTh\"><p>Function Parameter<\/p><\/th><th scope=\"col\" class=\"confluenceTh\"><p>Description<\/p><\/th><\/tr><tr class=\"\"><td class=\"confluenceTd\"><p>Void * pContext<\/p><\/td><td class=\"confluenceTd\"><p>Pointer to SVP context created by SOC platform<\/p><\/td><\/tr><tr class=\"\"><td class=\"confluenceTd\"><p>Guint8 *encryptedData<\/p><\/td><td class=\"confluenceTd\"><p>Copy the encrypted data converted as the token at the appropriate index of the buffer based on the subsample inform<\/p><\/td><\/tr><tr class=\"\"><td class=\"confluenceTd\"><p>guint32 encryptedDataLength<\/p><\/td><td class=\"confluenceTd\"><p>Indicate the length of the encrypted data<\/p><\/td><\/tr><\/tbody><\/table>\n\n\n<\/div>\n<h4 id=\"RDKSVPDesign(Specification)-gst_buffer_append_svp_transform_segmented_finalize\"><span class=\"nh-number\">7.2.1.13. <\/span>gst_buffer_append_svp_transform_segmented_finalize<\/h4>\n<p>Yet to be Implemented.<\/p>\n<p><span>gboolean gst_buffer_append_svp_transform_segmented_finalize<\/span><span>(<\/span><span>void<\/span><span> <\/span><span>*<\/span><span> pContext<\/span><span>);<\/span><\/p>\n<div class=\"table-wrap\">\n\n\n<table class=\"wrapped confluenceTable\"><tbody class=\"\"><tr class=\"\"><th scope=\"col\" class=\"confluenceTh\"><p>Function Parameter<\/p><\/th><th scope=\"col\" class=\"confluenceTh\"><p>Description<\/p><\/th><\/tr><tr class=\"\"><td class=\"confluenceTd\"><p>Void *<span> pContext<\/span><\/p><\/td><td class=\"confluenceTd\"><p>Pointer to SVP context created by SOC platform<\/p><\/td><\/tr><\/tbody><\/table>\n\n\n<\/div>\n<h4 id=\"RDKSVPDesign(Specification)-svp_token_size\"><span class=\"nh-number\">7.2.1.14. <\/span>svp_token_size<\/h4>\n<p>This API returns the size of the svp token created.<\/p>\n<p><span>guint32&nbsp; svp_token_size<\/span><span>(<\/span><span>void<\/span><span>);<\/span><\/p>\n<div class=\"table-wrap\">\n\n\n<table class=\"wrapped confluenceTable\"><tbody class=\"\"><tr class=\"\"><th scope=\"col\" class=\"confluenceTh\"><p>Function Parameter<\/p><\/th><th scope=\"col\" class=\"confluenceTh\"><p>Description<\/p><\/th><\/tr><tr class=\"\"><td class=\"confluenceTd\"><p>void<\/p><\/td><td class=\"confluenceTd\"><p><br><\/p><\/td><\/tr><\/tbody><\/table>\n\n\n<\/div>\n<h4 id=\"RDKSVPDesign(Specification)-svp_buffer_allocation_token\"><span class=\"nh-number\">7.2.1.15. <\/span>svp_buffer_allocation_token<\/h4>\n<p>This API allocates a secure memory. <span>To this memory the DRM decrypt&rsquo;s opaque data pointer is copied in the form of the svp_token using the svp_buffer_to_token() API<\/span><\/p>\n<p><span>gboolean svp_buffer_alloc_token<\/span><span>(<\/span><span>void<\/span><span> <\/span><span>**<\/span><span>token<\/span><span>);<\/span><\/p>\n<div class=\"table-wrap\">\n\n\n<table class=\"wrapped confluenceTable\"><tbody class=\"\"><tr class=\"\"><th scope=\"col\" class=\"confluenceTh\"><p>Function Parameter<\/p><\/th><th scope=\"col\" class=\"confluenceTh\"><p>Description<\/p><\/th><\/tr><tr class=\"\"><td class=\"confluenceTd\"><p>Void **token<\/p><\/td><td class=\"confluenceTd\"><p>Allocate the memory of size as returned by svp_token_size_impl() to the token<\/p><\/td><\/tr><\/tbody><\/table>\n\n\n<\/div>\n<h4 id=\"RDKSVPDesign(Specification)-svp_buffer_free_token\"><span class=\"nh-number\">7.2.1.16. <\/span>svp_buffer_free_token<\/h4>\n<p>This API free up the memory allocated for the token<span>.<\/span><\/p>\n<p><span>gboolean svp_buffer_free_token<\/span><span>(<\/span><span>void<\/span><span> <\/span><span>*<\/span><span>token<\/span><span>);<\/span><\/p>\n<div class=\"table-wrap\">\n\n\n<table class=\"wrapped confluenceTable\"><tbody class=\"\"><tr class=\"\"><th scope=\"col\" class=\"confluenceTh\"><p>Function Parameter<\/p><\/th><th scope=\"col\" class=\"confluenceTh\"><p>Description<\/p><\/th><\/tr><tr class=\"\"><td class=\"confluenceTd\"><p>Void *token<\/p><\/td><td class=\"confluenceTd\"><p>Token to free up the memory<\/p><\/td><\/tr><\/tbody><\/table>\n\n\n<\/div>\n<h4 id=\"RDKSVPDesign(Specification)-svp_pipeline_buffers_available\"><span class=\"nh-number\">7.2.1.17. <\/span>svp_pipeline_buffers_available<\/h4>\n<p>This API checks<span> if the secure buffer memory and sec mem handles are available for usage and are within the allowable thresholds.<\/span><\/p>\n<p><span>gboolean svp_pipeline_buffers_available<\/span><span>(<\/span><span>void<\/span><span> <\/span><span>*<\/span><span> pContext<\/span><span>,<\/span><span> media_type mediaType<\/span><span>);<\/span><\/p>\n<div class=\"table-wrap\">\n\n\n<table class=\"wrapped confluenceTable\"><tbody class=\"\"><tr class=\"\"><th scope=\"col\" class=\"confluenceTh\"><p>Function Parameter<\/p><\/th><th scope=\"col\" class=\"confluenceTh\"><p>Description<\/p><\/th><\/tr><tr class=\"\"><td class=\"confluenceTd\"><p>Void *<\/p><\/td><td class=\"confluenceTd\"><p>Token to free up the memory<\/p><\/td><\/tr><tr class=\"\"><td class=\"confluenceTd\"><p>Media_type<\/p><\/td><td class=\"confluenceTd\"><p>Indicate the type of the media. Possible values are:<\/p><p>Audio<\/p><p>Video<\/p><\/td><\/tr><\/tbody><\/table>\n\n\n<\/div>\n<h4 id=\"RDKSVPDesign(Specification)-gst_buffer_append_init_metadata\"><span class=\"nh-number\">7.2.1.18. <\/span>gst_buffer_append_init_metadata<\/h4>\n<p>Yet to be Implemented<\/p>\n<p><span>gboolean gst_buffer_append_init_metadata<\/span><span>(<\/span><span>GstBuffer<\/span><span> <\/span><span>*<\/span><span> buffer<\/span><span>);<\/span><\/p>\n<div class=\"table-wrap\">\n\n\n<table class=\"wrapped confluenceTable\"><tbody class=\"\"><tr class=\"\"><th scope=\"col\" class=\"confluenceTh\"><p>Function Parameter<\/p><\/th><th scope=\"col\" class=\"confluenceTh\"><p>Description<\/p><\/th><\/tr><tr class=\"\"><td class=\"confluenceTd\"><p>GstBuffer *<\/p><\/td><td class=\"confluenceTd\"><p>Pointer to gstreamer buffer containing the original data chunk<\/p><\/td><\/tr><\/tbody><\/table>\n\n\n<\/div>\n<h4 id=\"RDKSVPDesign(Specification)-svp_allocate_secure_buffers\"><span class=\"nh-number\">7.2.1.19. <\/span>svp_allocate_secure_buffers<\/h4>\n<p>Yet to be Implemented<\/p>\n<p><span>uint32_t<\/span><span> svp_allocate_secure_buffers<\/span><span>(<\/span><span>void<\/span><span>**<\/span><span> ppInBuf<\/span><span>,<\/span><span> <\/span><span>void<\/span><span>**<\/span><span> ppOutBuf<\/span><span>,<\/span><span> <\/span><span>const<\/span><span> <\/span><span>uint8_t<\/span><span>*<\/span><span> pInData<\/span><span>,<\/span><span> <\/span><span>const<\/span><span> <\/span><span>size_t<\/span><span> nDataLen<\/span><span>);<\/span><\/p>\n<div class=\"table-wrap\">\n\n\n<table class=\"wrapped confluenceTable\"><tbody class=\"\"><tr class=\"\"><th scope=\"col\" class=\"confluenceTh\"><p>Function Parameter<\/p><\/th><th scope=\"col\" class=\"confluenceTh\"><p>Description<\/p><\/th><\/tr><tr class=\"\"><td class=\"confluenceTd\"><p>void **<\/p><\/td><td class=\"confluenceTd\"><p><br><\/p><\/td><\/tr><tr class=\"\"><td class=\"confluenceTd\"><p>Void **<\/p><\/td><td class=\"confluenceTd\"><p><br><\/p><\/td><\/tr><tr class=\"\"><td class=\"confluenceTd\"><p>Const uint8_t *<\/p><\/td><td class=\"confluenceTd\"><p><br><\/p><\/td><\/tr><tr class=\"\"><td class=\"confluenceTd\"><p>Const size_t<\/p><\/td><td class=\"confluenceTd\"><p><br><\/p><\/td><\/tr><\/tbody><\/table>\n\n\n<\/div>\n<h4 id=\"RDKSVPDesign(Specification)-svp_release_secure_buffers\"><span class=\"nh-number\">7.2.1.20. <\/span>svp_release_secure_buffers<\/h4>\n<p>Yet to be Implemented<\/p>\n<p><span>uint32_t<\/span><span> svp_release_secure_buffers<\/span><span>(<\/span><span>void<\/span><span>*<\/span><span> pInBuf<\/span><span>,<\/span><span> <\/span><span>void<\/span><span>*<\/span><span> pOutBuf<\/span><span>,<\/span><span> <\/span><span>uint8_t<\/span><span>*<\/span><span> pDataOut<\/span><span>,<\/span><span> <\/span><span>size_t<\/span><span> nDataOutMax<\/span><span>,<\/span><span> <\/span><span>void<\/span><span>*<\/span><span> pContext<\/span><span>);<\/span><\/p>\n<div class=\"table-wrap\">\n\n\n<table class=\"wrapped confluenceTable\"><tbody class=\"\"><tr class=\"\"><th scope=\"col\" class=\"confluenceTh\"><p>Function Parameter<\/p><\/th><th scope=\"col\" class=\"confluenceTh\"><p>Description<\/p><\/th><\/tr><tr class=\"\"><td class=\"confluenceTd\"><p>void *<\/p><\/td><td class=\"confluenceTd\"><p><br><\/p><\/td><\/tr><tr class=\"\"><td class=\"confluenceTd\"><p>void *<\/p><\/td><td class=\"confluenceTd\"><p><br><\/p><\/td><\/tr><tr class=\"\"><td class=\"confluenceTd\"><p>uint8_t *<\/p><\/td><td class=\"confluenceTd\"><p><br><\/p><\/td><\/tr><tr class=\"\"><td class=\"confluenceTd\"><p>size_t<\/p><\/td><td class=\"confluenceTd\"><p><br><\/p><\/td><\/tr><tr class=\"\"><td class=\"confluenceTd\"><p>void *<\/p><\/td><td class=\"confluenceTd\"><p><br><\/p><\/td><\/tr><\/tbody><\/table>\n\n\n<\/div>\n<p><strong>&nbsp;<\/strong><\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"columnLayout single\" data-layout=\"single\">\n<div class=\"cell normal\" data-type=\"normal\">\n<div class=\"innerCell\">\n<h3 class=\"wp-sub-header\"><span class=\"nh-number\">7.3. <\/span><span>Header file<\/span><\/h3>\n<div class=\"code panel pdl conf-macro output-block\" data-hasbody=\"true\" data-macro-name=\"code\">\n<div class=\"codeContent panelContent pdl\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">\/*\n * If not stated otherwise in this file or this component's LICENSE file the\n * following copyright and licenses apply:\n *\n * Copyright 2020 RDK Management\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http:\/\/www.apache.org\/licenses\/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\/\n#ifndef __GST_BUFFER_SVP_H__\n#define __GST_BUFFER_SVP_H__\n#include &lt;stdint.h&gt;\n#include &lt;stdio.h&gt;\n#include &lt;string.h&gt;\n#include &lt;gst\/gst.h&gt;\n#include &lt;gst\/base\/gstbytereader.h&gt;\n#include \"gst_svp_performance.h\"\nG_BEGIN_DECLS\ntypedef struct enc_data_chunk enc_chunk_data_t;\nstruct enc_data_chunk {\n    guint32 clear_data_size;\n    guint32 enc_data_size;\n};\ntypedef struct svp_meta_data {\n    guint32 secure_memory_ptr;\n    guint32 num_chunks;\n    enc_chunk_data_t *info;\n} svp_meta_data_t;\ntypedef enum context_type_e {\n    Server = 0,\n    Client,\n    InProcess\n} context_type;\ntypedef enum TokenType_e {\n    InPlace = 0,\n    Handle  = 1\n} TokenType;\ntypedef enum media_type_e\n{\n    Unknown = 0,\n    Video,\n    Audio,\n    Data\n}  media_type;\n\n\/*\n *  GstBuffer          *buffer          - gstreamer buffer that svp meta data will be appended to\n *  svp_meta_data_t    *svp_metadata    - svp meta data\n *\/\ngboolean gst_svp_ext_get_context(void ** ppContext, context_type type, unsigned int rpcID);\n\ngboolean gst_svp_ext_context_set_caps(void * pContext, GstCaps *caps);\n\ngboolean gst_svp_ext_free_context(void * pContext);\n\ngboolean gst_svp_ext_transform_caps(GstCaps **caps, gboolean bEncrypted);\n\ngboolean gst_buffer_svp_transform_from_cleardata(void * pContext, GstBuffer* buffer, media_type mediaType);\n\ngboolean gst_buffer_append_svp_transform(void * pContext, GstBuffer* buffer, GstBuffer* subSampleBuffer, const guint32 subSampleCount, guint8* encryptedData,const guint32 mappedDataSize=0);\n\nguint32&nbsp; gst_buffer_svp_segmented_decrypt_size(guint32 nEncryptedDataSize);\n\ngboolean gst_buffer_append_svp_transform_segmented_init(void * pContext, GstBuffer* buffer, GstBuffer* subSampleBuffer, const guint32 subSampleCount);\n\ngboolean gst_buffer_append_svp_transform_segmented_process(void * pContext, guint8* encryptedData, guint32 encyptedDataLength);\n\ngboolean gst_buffer_append_svp_transform_segmented_finalize(void * pContext);\n\ngboolean gst_buffer_append_svp_metadata(GstBuffer * buffer,&nbsp; svp_meta_data_t * svp_metadata, const guint32 mappedDataSize=0);\n\ngboolean svp_buffer_to_token(void * pContext, void* svp_handle, void* svp_token);\n\ngboolean svp_buffer_from_token(void * pContext, void* svp_token, void* svp_handle);\n\nguint32&nbsp; svp_token_size(void);\n\ngboolean svp_buffer_alloc_token(void **token);\n\ngboolean svp_buffer_free_token(void *token);\n\ngboolean svp_pipeline_buffers_available(void * pContext, media_type mediaType);\n\ngboolean gst_buffer_append_init_metadata(GstBuffer * buffer);\n\nuint32_t svp_allocate_secure_buffers(void** ppInBuf, void** ppOutBuf, const uint8_t* pInData, const size_t nDataLen);\n\nuint32_t svp_release_secure_buffers(void* pInBuf, void* pOutBuf, uint8_t* pDataOut, size_t nDataOutMax, void* pContext);\n\nG_END_DECLS\n\n#endif \/\/ __GST_BUFFER_SVP_H__<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"columnLayout single\" data-layout=\"single\">\n<div class=\"cell normal\" data-type=\"normal\">\n<div class=\"innerCell\">\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p><\/body><\/html><\/p>","protected":false},"excerpt":{"rendered":"<p>Document Status Codes Work in Progress (W) An incomplete document designed to guide discussion and [&hellip;]<\/p>\n","protected":false},"author":28,"featured_media":0,"parent":11168,"menu_order":0,"comment_status":"open","ping_status":"closed","template":"","meta":{"_bbp_topic_count":0,"_bbp_reply_count":0,"_bbp_total_topic_count":0,"_bbp_total_reply_count":0,"_bbp_voice_count":0,"_bbp_anonymous_reply_count":0,"_bbp_topic_count_hidden":0,"_bbp_reply_count_hidden":0,"_bbp_forum_subforum_count":0,"footnotes":""},"class_list":["post-11175","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v24.9 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>RDK SVP Design(Specification) - RDK Documentation Portal | Documentation<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_video_documentation\/rdk6\/vendor_porting_guide\/rdk_svp_designspecification\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"RDK SVP Design(Specification) - RDK Documentation Portal | Documentation\" \/>\n<meta property=\"og:description\" content=\"Document Status Codes Work in Progress (W) An incomplete document designed to guide discussion and [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_video_documentation\/rdk6\/vendor_porting_guide\/rdk_svp_designspecification\/\" \/>\n<meta property=\"og:site_name\" content=\"RDK Documentation Portal | Documentation\" \/>\n<meta property=\"article:modified_time\" content=\"2025-03-25T05:18:37+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/developer.rdkcentral.com\/documentation\/wp-content\/uploads\/sites\/16\/2024\/06\/SVPDecryptSoftwareStack.png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"11 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_video_documentation\/rdk6\/vendor_porting_guide\/rdk_svp_designspecification\/\",\"url\":\"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_video_documentation\/rdk6\/vendor_porting_guide\/rdk_svp_designspecification\/\",\"name\":\"RDK SVP Design(Specification) - RDK Documentation Portal | Documentation\",\"isPartOf\":{\"@id\":\"https:\/\/developer.rdkcentral.com\/documentation\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_video_documentation\/rdk6\/vendor_porting_guide\/rdk_svp_designspecification\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_video_documentation\/rdk6\/vendor_porting_guide\/rdk_svp_designspecification\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/developer.rdkcentral.com\/documentation\/wp-content\/uploads\/sites\/16\/2024\/06\/SVPDecryptSoftwareStack.png\",\"datePublished\":\"2024-03-26T12:04:07+00:00\",\"dateModified\":\"2025-03-25T05:18:37+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_video_documentation\/rdk6\/vendor_porting_guide\/rdk_svp_designspecification\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_video_documentation\/rdk6\/vendor_porting_guide\/rdk_svp_designspecification\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_video_documentation\/rdk6\/vendor_porting_guide\/rdk_svp_designspecification\/#primaryimage\",\"url\":\"https:\/\/developer.rdkcentral.com\/documentation\/wp-content\/uploads\/sites\/16\/2024\/06\/SVPDecryptSoftwareStack.png\",\"contentUrl\":\"https:\/\/developer.rdkcentral.com\/documentation\/wp-content\/uploads\/sites\/16\/2024\/06\/SVPDecryptSoftwareStack.png\",\"width\":1730,\"height\":842},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_video_documentation\/rdk6\/vendor_porting_guide\/rdk_svp_designspecification\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/developer.rdkcentral.com\/documentation\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Documentation\",\"item\":\"https:\/\/developer.rdkcentral.com\/documentation\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"RDK Entertainment\",\"item\":\"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_video_documentation\/\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"RDK6\",\"item\":\"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_video_documentation\/rdk6\/\"},{\"@type\":\"ListItem\",\"position\":5,\"name\":\"RDK6 Vendor Porting Guide\",\"item\":\"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_video_documentation\/rdk6\/vendor_porting_guide\/\"},{\"@type\":\"ListItem\",\"position\":6,\"name\":\"RDK SVP Design(Specification)\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/developer.rdkcentral.com\/documentation\/#website\",\"url\":\"https:\/\/developer.rdkcentral.com\/documentation\/\",\"name\":\"RDK Documentation Portal | Documentation\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/developer.rdkcentral.com\/documentation\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"RDK SVP Design(Specification) - RDK Documentation Portal | Documentation","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_video_documentation\/rdk6\/vendor_porting_guide\/rdk_svp_designspecification\/","og_locale":"en_US","og_type":"article","og_title":"RDK SVP Design(Specification) - RDK Documentation Portal | Documentation","og_description":"Document Status Codes Work in Progress (W) An incomplete document designed to guide discussion and [&hellip;]","og_url":"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_video_documentation\/rdk6\/vendor_porting_guide\/rdk_svp_designspecification\/","og_site_name":"RDK Documentation Portal | Documentation","article_modified_time":"2025-03-25T05:18:37+00:00","og_image":[{"url":"https:\/\/developer.rdkcentral.com\/documentation\/wp-content\/uploads\/sites\/16\/2024\/06\/SVPDecryptSoftwareStack.png","type":"","width":"","height":""}],"twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"11 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_video_documentation\/rdk6\/vendor_porting_guide\/rdk_svp_designspecification\/","url":"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_video_documentation\/rdk6\/vendor_porting_guide\/rdk_svp_designspecification\/","name":"RDK SVP Design(Specification) - RDK Documentation Portal | Documentation","isPartOf":{"@id":"https:\/\/developer.rdkcentral.com\/documentation\/#website"},"primaryImageOfPage":{"@id":"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_video_documentation\/rdk6\/vendor_porting_guide\/rdk_svp_designspecification\/#primaryimage"},"image":{"@id":"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_video_documentation\/rdk6\/vendor_porting_guide\/rdk_svp_designspecification\/#primaryimage"},"thumbnailUrl":"https:\/\/developer.rdkcentral.com\/documentation\/wp-content\/uploads\/sites\/16\/2024\/06\/SVPDecryptSoftwareStack.png","datePublished":"2024-03-26T12:04:07+00:00","dateModified":"2025-03-25T05:18:37+00:00","breadcrumb":{"@id":"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_video_documentation\/rdk6\/vendor_porting_guide\/rdk_svp_designspecification\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_video_documentation\/rdk6\/vendor_porting_guide\/rdk_svp_designspecification\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_video_documentation\/rdk6\/vendor_porting_guide\/rdk_svp_designspecification\/#primaryimage","url":"https:\/\/developer.rdkcentral.com\/documentation\/wp-content\/uploads\/sites\/16\/2024\/06\/SVPDecryptSoftwareStack.png","contentUrl":"https:\/\/developer.rdkcentral.com\/documentation\/wp-content\/uploads\/sites\/16\/2024\/06\/SVPDecryptSoftwareStack.png","width":1730,"height":842},{"@type":"BreadcrumbList","@id":"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_video_documentation\/rdk6\/vendor_porting_guide\/rdk_svp_designspecification\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/developer.rdkcentral.com\/documentation\/"},{"@type":"ListItem","position":2,"name":"Documentation","item":"https:\/\/developer.rdkcentral.com\/documentation\/"},{"@type":"ListItem","position":3,"name":"RDK Entertainment","item":"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_video_documentation\/"},{"@type":"ListItem","position":4,"name":"RDK6","item":"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_video_documentation\/rdk6\/"},{"@type":"ListItem","position":5,"name":"RDK6 Vendor Porting Guide","item":"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_video_documentation\/rdk6\/vendor_porting_guide\/"},{"@type":"ListItem","position":6,"name":"RDK SVP Design(Specification)"}]},{"@type":"WebSite","@id":"https:\/\/developer.rdkcentral.com\/documentation\/#website","url":"https:\/\/developer.rdkcentral.com\/documentation\/","name":"RDK Documentation Portal | Documentation","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/developer.rdkcentral.com\/documentation\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"}]}},"_links":{"self":[{"href":"https:\/\/developer.rdkcentral.com\/documentation\/wp-json\/wp\/v2\/pages\/11175","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/developer.rdkcentral.com\/documentation\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/developer.rdkcentral.com\/documentation\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/developer.rdkcentral.com\/documentation\/wp-json\/wp\/v2\/users\/28"}],"replies":[{"embeddable":true,"href":"https:\/\/developer.rdkcentral.com\/documentation\/wp-json\/wp\/v2\/comments?post=11175"}],"version-history":[{"count":7,"href":"https:\/\/developer.rdkcentral.com\/documentation\/wp-json\/wp\/v2\/pages\/11175\/revisions"}],"predecessor-version":[{"id":11898,"href":"https:\/\/developer.rdkcentral.com\/documentation\/wp-json\/wp\/v2\/pages\/11175\/revisions\/11898"}],"up":[{"embeddable":true,"href":"https:\/\/developer.rdkcentral.com\/documentation\/wp-json\/wp\/v2\/pages\/11168"}],"wp:attachment":[{"href":"https:\/\/developer.rdkcentral.com\/documentation\/wp-json\/wp\/v2\/media?parent=11175"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}