copy->buffer = gst_buffer_ref (frame->buffer);
copy->_private_flags &= ~GST_BASE_PARSE_FRAME_PRIVATE_FLAG_NOALLOC;
+ GST_TRACE ("copied frame %p -> %p", frame, copy);
+
return copy;
}
static void
gst_base_parse_frame_free (GstBaseParseFrame * frame)
{
+ GST_TRACE ("freeing frame %p", frame);
+
if (frame->buffer) {
gst_buffer_unref (frame->buffer);
frame->buffer = NULL;
{
memset (frame, 0, sizeof (GstBaseParseFrame));
frame->_private_flags = GST_BASE_PARSE_FRAME_PRIVATE_FLAG_NOALLOC;
+ GST_TRACE ("inited frame %p", frame);
}
/**
frame = g_slice_new0 (GstBaseParseFrame);
frame->buffer = gst_buffer_ref (buffer);
+ GST_TRACE ("created frame %p", frame);
return frame;
}
GST_DEBUG_OBJECT (parse, "media is video == %d", parse->priv->is_video);
}
+/* takes ownership of frame */
+static void
+gst_base_parse_queue_frame (GstBaseParse * parse, GstBaseParseFrame * frame)
+{
+ if (!(frame->_private_flags & GST_BASE_PARSE_FRAME_PRIVATE_FLAG_NOALLOC)) {
+ /* frame allocated on the heap, we can just take ownership */
+ g_queue_push_tail (&parse->priv->queued_frames, frame);
+ GST_TRACE ("queued frame %p", frame);
+ } else {
+ GstBaseParseFrame *copy;
+
+ /* probably allocated on the stack, must make a proper copy */
+ copy = gst_base_parse_frame_copy (frame);
+ g_queue_push_tail (&parse->priv->queued_frames, copy);
+ GST_TRACE ("queued frame %p (copy of %p)", copy, frame);
+ gst_base_parse_frame_free (frame);
+ }
+}
+
/* gst_base_parse_handle_and_push_buffer:
* @parse: #GstBaseParse.
* @klass: #GstBaseParseClass.
gst_base_parse_frame_free (frame);
return GST_FLOW_OK;
} else if (ret == GST_BASE_PARSE_FLOW_QUEUED) {
- if (!(frame->_private_flags & GST_BASE_PARSE_FRAME_PRIVATE_FLAG_NOALLOC)) {
- /* frame allocated on the heap, we can just take ownership */
- g_queue_push_tail (&parse->priv->queued_frames, frame);
- } else {
- /* probably allocated on the stack, must make a proper copy */
- g_queue_push_tail (&parse->priv->queued_frames,
- gst_base_parse_frame_copy (frame));
- gst_base_parse_frame_free (frame);
- }
+ gst_base_parse_queue_frame (parse, frame);
return GST_FLOW_OK;
} else if (ret != GST_FLOW_OK) {
return ret;
g_return_val_if_fail (frame != NULL, GST_FLOW_ERROR);
g_return_val_if_fail (frame->buffer != NULL, GST_FLOW_ERROR);
+ GST_TRACE_OBJECT (parse, "pushing frame %p", frame);
+
buffer = frame->buffer;
GST_LOG_OBJECT (parse,