@@ -164,55 +164,46 @@ create_buffer_with_current_time(GstSigning *signing)
164164 return buf ;
165165}
166166
167- static void
168- free_nalu_data (gpointer data )
169- {
170- signed_video_nalu_data_free (data );
171- }
172-
173- /* Prepend NALUs according to results from Signed Video lib calls. Returns the number of NALUs
174- * that were prepended to |current_au|, or -1 on error. */
167+ /* Prepend seis fetched from Signed Video lib.
168+ * Returns the number of nalus that were prepended to @current_au,
169+ * or -1 on error. */
175170static gint
176- prepend_nalus (GstSigning * signing , GstBuffer * current_au )
171+ get_and_add_sei (GstSigning * signing , GstBuffer * current_au , gint idx , const guint8 * peek_nalu , gsize peek_nalu_size )
177172{
178- SignedVideoReturnCode sv_rc = SV_UNKNOWN_FAILURE ;
179- signed_video_nalu_to_prepend_t nalu_to_prepend = {0 };
173+ SignedVideoReturnCode sv_rc ;
180174 gint prepend_count = 0 ;
181-
182- sv_rc = signed_video_get_nalu_to_prepend (signing -> priv -> signed_video , & nalu_to_prepend );
183- while (sv_rc == SV_OK && nalu_to_prepend .prepend_instruction != SIGNED_VIDEO_PREPEND_NOTHING ) {
184- gpointer data = nalu_to_prepend .nalu_data ;
185- gsize size = nalu_to_prepend .nalu_data_size ;
175+ guint8 * sei = NULL ;
176+ gsize sei_size = 0 ;
177+
178+ /* Brief description of API. For more details see the public header file.
179+ * SignedVideoReturnCode
180+ * signed_video_get_sei(signed_video_t *self, uint8_t **sei, size_t *sei_size,
181+ * unsigned *payload_offset, const uint8_t *peek_nalu,
182+ * size_t peek_nalu_size, unsigned *num_pending_seis); */
183+ sv_rc = signed_video_get_sei (signing -> priv -> signed_video , & sei , & sei_size , NULL , peek_nalu , peek_nalu_size , NULL );
184+ while (sv_rc == SV_OK && sei_size > 0 && sei ) {
186185 GstMemory * prepend_mem ;
187186
188- // Write size into NALU header. The size value should be the data size, minus the size of the
189- // size value itself
190- GST_WRITE_UINT32_BE (data , size - sizeof (guint32 ));
191-
192- GST_DEBUG_OBJECT (signing , "create a %" G_GSIZE_FORMAT "bytes nalu to prepend" , size );
193- prepend_mem = gst_memory_new_wrapped (0 , data , size , 0 , size , data , free_nalu_data );
194-
195- switch (nalu_to_prepend .prepend_instruction ) {
196- case SIGNED_VIDEO_PREPEND_NALU :
197- GST_DEBUG_OBJECT (signing , "prepend nalu to current AU" );
198- gst_buffer_prepend_memory (current_au , prepend_mem );
199- prepend_count ++ ;
200- break ;
201- default :
202- GST_FIXME_OBJECT (
203- signing , "unsupported prepend instruction %d" , nalu_to_prepend .prepend_instruction );
204- break ;
205- }
187+ /* Write size into nalu header. The size value should be the data size,
188+ * minus the size of the size value itself. */
189+ GST_WRITE_UINT32_BE (sei , (guint32 )(sei_size - sizeof (guint32 )));
190+
191+ GST_DEBUG_OBJECT (signing , "preped sei of size %" G_GSIZE_FORMAT " to current AU" , sei_size );
192+ prepend_mem = gst_memory_new_wrapped (0 , sei , sei_size , 0 , sei_size , sei , g_free );
193+ gst_buffer_insert_memory (current_au , idx , prepend_mem );
194+ prepend_count ++ ;
206195
207- sv_rc = signed_video_get_nalu_to_prepend (signing -> priv -> signed_video , & nalu_to_prepend );
196+ sv_rc = signed_video_get_sei (signing -> priv -> signed_video , & sei , & sei_size , NULL , peek_nalu , peek_nalu_size , NULL );
208197 }
209198
210- if (sv_rc != SV_OK ) goto get_nalu_failed ;
199+ if (sv_rc != SV_OK ) {
200+ goto get_sei_failed ;
201+ }
211202
212203 return prepend_count ;
213204
214- get_nalu_failed :
215- GST_ERROR_OBJECT (signing , "signed_video_get_nalu_to_prepend failed" );
205+ get_sei_failed :
206+ GST_ERROR_OBJECT (signing , "signed_video_get_sei failed" );
216207 return -1 ;
217208}
218209
@@ -224,7 +215,7 @@ gst_signing_transform_ip(GstBaseTransform *trans, GstBuffer *buf)
224215 guint idx = 0 ;
225216 GstMemory * nalu_mem = NULL ;
226217 GstMapInfo map_info ;
227- gint prepend_count = 0 ;
218+ gboolean got_sei = false ;
228219
229220 priv -> last_pts = GST_BUFFER_PTS (buf );
230221 // last_pts is an GstClockTime object, which is measured in nanoseconds.
@@ -242,6 +233,26 @@ gst_signing_transform_ip(GstBaseTransform *trans, GstBuffer *buf)
242233 goto map_failed ;
243234 }
244235
236+ /* SEIs generated by the Signed Video lib should be passed in as any nalu. The reason
237+ * for this is that not all are signed and hence 'floating around' in the stream.
238+ * Therefore, pull and add them before adding the current nalu. */
239+ gint add_count = get_and_add_sei (signing , buf , idx , & (map_info .data [4 ]), map_info .size - 4 );
240+ if (add_count < 0 ) {
241+ GST_ELEMENT_ERROR (signing , STREAM , FAILED , ("failed to add nalus" ), (NULL ));
242+ goto get_and_add_sei_failed ;
243+ }
244+ if (add_count > 0 ) {
245+ gst_memory_unmap (nalu_mem , & map_info );
246+ /* Get the newly added seis. They need to be added for signing like any other
247+ * Bitstream Unit. */
248+ nalu_mem = gst_buffer_peek_memory (buf , idx );
249+ if (G_UNLIKELY (!gst_memory_map (nalu_mem , & map_info , GST_MAP_READ ))) {
250+ GST_ELEMENT_ERROR (signing , RESOURCE , FAILED , ("Failed to map memory" ), (NULL ));
251+ goto map_failed ;
252+ }
253+ got_sei = true;
254+ }
255+
245256 // Depending on bitstream format the start code is optional, hence libsigned-video supports
246257 // both. Therefore, since the start code in the pipeline temporarily may have been replaced by
247258 // the picture data size this format is violated. To pass in valid input data, skip the first
@@ -254,19 +265,12 @@ gst_signing_transform_ip(GstBaseTransform *trans, GstBuffer *buf)
254265 goto add_nalu_failed ;
255266 }
256267
257- prepend_count = prepend_nalus (signing , buf );
258- if (prepend_count < 0 ) {
259- GST_ELEMENT_ERROR (signing , STREAM , FAILED , ("failed to prepend nalus" ), (NULL ));
260- goto prepend_nalus_failed ;
261- }
262-
263268 gst_memory_unmap (nalu_mem , & map_info );
264269
265- idx += prepend_count ; // Move past prepended nalus
266270 idx ++ ; // Go to next nalu
267271 }
268272
269- if (prepend_count > 0 ) {
273+ if (got_sei ) {
270274 // Push an event to produce a message saying SEIs have been added.
271275 GstStructure * structure = gst_structure_new (
272276 SIGNING_STRUCTURE_NAME , SIGNING_FIELD_NAME , G_TYPE_STRING , "signed" , NULL );
@@ -275,11 +279,11 @@ gst_signing_transform_ip(GstBaseTransform *trans, GstBuffer *buf)
275279 GST_ELEMENT_ERROR (signing , STREAM , FAILED , ("failed to push message" ), (NULL ));
276280 }
277281 }
278- GST_DEBUG_OBJECT (signing , "push AU with %d nalus " , gst_buffer_n_memory (buf ));
282+ GST_DEBUG_OBJECT (signing , "push AU with %d Bitstream Units " , gst_buffer_n_memory (buf ));
279283
280284 return GST_FLOW_OK ;
281285
282- prepend_nalus_failed :
286+ get_and_add_sei_failed :
283287add_nalu_failed :
284288 gst_memory_unmap (nalu_mem , & map_info );
285289map_failed :
@@ -298,8 +302,8 @@ push_access_unit_at_eos(GstSigning *signing)
298302 }
299303
300304 au = create_buffer_with_current_time (signing );
301- if (prepend_nalus (signing , au ) < 0 ) {
302- GST_ERROR_OBJECT (signing , "failed to prepend nalus " );
305+ if (get_and_add_sei (signing , au , 0 , NULL , 0 ) < 0 ) {
306+ GST_ERROR_OBJECT (signing , "failed to get SEIs " );
303307 goto prepend_failed ;
304308 }
305309
@@ -363,13 +367,11 @@ setup_signing(GstSigning *signing, GstCaps *caps)
363367 GST_ERROR_OBJECT (signing , "could not create Signed Video object" );
364368 goto create_failed ;
365369 }
366- if (signed_video_generate_private_key (
367- SIGN_ALGO_ECDSA , PATH_TO_KEY_FILES , & private_key , & private_key_size ) != SV_OK ) {
370+ if (signed_video_generate_ecdsa_private_key (PATH_TO_KEY_FILES , & private_key , & private_key_size ) != SV_OK ) {
368371 GST_DEBUG_OBJECT (signing , "failed to generate pem file" );
369372 goto generate_private_key_failed ;
370373 }
371- if (signed_video_set_private_key (
372- priv -> signed_video , SIGN_ALGO_ECDSA , private_key , private_key_size ) != SV_OK ) {
374+ if (signed_video_set_private_key_new (priv -> signed_video , private_key , private_key_size ) != SV_OK ) {
373375 GST_DEBUG_OBJECT (signing , "failed to set private key content" );
374376 goto set_private_key_failed ;
375377 }
0 commit comments