videoparsers: Clear user_data_unregistered explicitly in _reset_frame

This fits better with the model used by the parser elements. It also
properly resets the data when the parser is reset.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5450>
This commit is contained in:
Jan Alexander Steffens (heftig) 2023-10-10 08:41:12 +02:00 committed by GStreamer Marge Bot
parent 3577fdec51
commit 75f61cba80
4 changed files with 42 additions and 28 deletions

View file

@ -235,7 +235,7 @@ gst_h264_parse_finalize (GObject * object)
{
GstH264Parse *h264parse = GST_H264_PARSE (object);
gst_video_user_data_unregistered_clear (&h264parse->user_data_unregistered);
gst_video_clear_user_data_unregistered (&h264parse->user_data_unregistered);
g_object_unref (h264parse->frame_out);
g_array_unref (h264parse->nal_backlog);
@ -263,6 +263,7 @@ gst_h264_parse_reset_frame (GstH264Parse * h264parse)
h264parse->have_aud_in_frame = FALSE;
gst_adapter_clear (h264parse->frame_out);
gst_video_clear_user_data (&h264parse->user_data);
gst_video_clear_user_data_unregistered (&h264parse->user_data_unregistered);
}
static void

View file

@ -182,7 +182,8 @@ gst_h265_parse_finalize (GObject * object)
{
GstH265Parse *h265parse = GST_H265_PARSE (object);
gst_video_user_data_unregistered_clear (&h265parse->user_data_unregistered);
gst_video_clear_user_data_unregistered (&h265parse->user_data_unregistered);
g_object_unref (h265parse->frame_out);
G_OBJECT_CLASS (parent_class)->finalize (object);
@ -208,6 +209,7 @@ gst_h265_parse_reset_frame (GstH265Parse * h265parse)
h265parse->have_pps_in_frame = FALSE;
gst_adapter_clear (h265parse->frame_out);
gst_video_clear_user_data (&h265parse->user_data);
gst_video_clear_user_data_unregistered (&h265parse->user_data_unregistered);
}
static void

View file

@ -454,46 +454,35 @@ gst_video_clear_user_data (GstVideoParseUserData * user_data)
/*
* gst_video_parse_user_data_unregistered:
* @elt: #GstElement that is parsing user data
* @user_data: #GstVideoParseUserDataUnregistered struct to hold parsed data
* @user_data: #GstVideoParseUserDataUnregistered to hold SEI User Data Unregistered
* @br: #GstByteReader attached to buffer of user data
* @uuid: User Data Unregistered UUID
*
* Parse user data and store in @user_data
* Copy remaining bytes in @br and store in @user_data
*/
void
gst_video_parse_user_data_unregistered (GstElement * elt,
GstVideoParseUserDataUnregistered * user_data,
GstByteReader * br, guint8 uuid[16])
{
gst_video_user_data_unregistered_clear (user_data);
gst_video_clear_user_data_unregistered (user_data);
memcpy (&user_data->uuid, uuid, 16);
user_data->size = gst_byte_reader_get_size (br);
gst_byte_reader_dup_data (br, user_data->size, &user_data->data);
}
/*
* gst_video_user_data_unregistered_clear:
* @user_data: #GstVideoParseUserDataUnregistered holding SEI User Data Unregistered
*
* Clears the user data unregistered
*/
void
gst_video_user_data_unregistered_clear (GstVideoParseUserDataUnregistered *
user_data)
{
g_free (user_data->data);
user_data->data = NULL;
user_data->size = 0;
user_data->size = gst_byte_reader_get_size (br);
if (!gst_byte_reader_dup_data (br, user_data->size, &user_data->data)) {
g_return_if_reached ();
}
}
/*
* gst_video_push_user_data_unregistered:
* @elt: #GstElement that is pushing user data
* @user_data: #GstVideoParseUserDataUnregistered holding SEI User Data Unregistered
* @buf: #GstBuffer that receives the parsed data
* @buf: (transfer none): #GstBuffer that receives the unregistered data
*
* After user data has been parsed, add the data to @buf
* Attach unregistered user data from @user_data to @buf as
* GstVideoSEIUserDataUnregisteredMeta
*/
void
gst_video_push_user_data_unregistered (GstElement * elt,
@ -502,6 +491,19 @@ gst_video_push_user_data_unregistered (GstElement * elt,
if (user_data->data != NULL) {
gst_buffer_add_video_sei_user_data_unregistered_meta (buf, user_data->uuid,
user_data->data, user_data->size);
gst_video_user_data_unregistered_clear (user_data);
}
}
/*
* gst_video_clear_user_data_unregistered:
* @user_data: #GstVideoParseUserDataUnregistered holding SEI User Data Unregistered
*
* Clears the user data unregistered, resetting it for the next frame
*/
void gst_video_clear_user_data_unregistered
(GstVideoParseUserDataUnregistered * user_data)
{
memset (&msg->uuid, 0, sizeof msg->uuid);
g_clear_pointer (&msg->data, g_free);
msg->size = 0;
}

View file

@ -169,7 +169,7 @@ typedef struct
/*
* GstVideoParseUserDataUnregistered
*
* Holds unparsed User Data Unregistered.
* Holds unparsed, unregistered user data.
*/
typedef struct
{
@ -192,10 +192,19 @@ void gst_video_push_user_data (GstElement * elt,
void gst_video_clear_user_data (GstVideoParseUserData * user_data);
void gst_video_user_data_unregistered_clear(GstVideoParseUserDataUnregistered * user_data);
void gst_video_push_user_data_unregistered(GstElement * elt, GstVideoParseUserDataUnregistered * user_data,
GstBuffer * buf);
void gst_video_parse_user_data_unregistered (GstElement * elt,
GstVideoParseUserDataUnregistered * user_data,
GstByteReader * br,
guint8 uuid[16]);
void gst_video_push_user_data_unregistered (GstElement * elt,
GstVideoParseUserDataUnregistered * user_data,
GstBuffer * buf);
void gst_video_clear_user_data_unregistered (GstVideoParseUserDataUnregistered * user_data,
gboolean free);
G_END_DECLS
#endif /* __VIDEO_PARSE_UTILS_H__ */