| GST_API_VIDEO_TOOLBOX, &error);
if (error != NULL)
goto api_error;
+
+ self->cur_outbufs = g_ptr_array_new ();
}
ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
self->caps_width = self->caps_height = 0;
self->caps_fps_n = self->caps_fps_d = 0;
+ g_ptr_array_free (self->cur_outbufs, TRUE);
+ self->cur_outbufs = NULL;
+
g_object_unref (self->ctx);
self->ctx = NULL;
}
GstVTApi *vt = self->ctx->vt;
CMSampleBufferRef sbuf;
VTStatus status;
+ GstFlowReturn ret = GST_FLOW_OK;
+ guint i;
self->cur_inbuf = buf;
- self->cur_flowret = GST_FLOW_OK;
-
sbuf = gst_vtdec_sample_buffer_from (self, buf);
status = vt->VTDecompressionSessionDecodeFrame (self->session, sbuf, 0, 0, 0);
}
self->ctx->cm->FigSampleBufferRelease (sbuf);
-
- gst_buffer_unref (buf);
self->cur_inbuf = NULL;
+ gst_buffer_unref (buf);
+
+ for (i = 0; i != self->cur_outbufs->len; i++) {
+ GstBuffer *buf = g_ptr_array_index (self->cur_outbufs, i);
- return self->cur_flowret;
+ if (ret == GST_FLOW_OK)
+ ret = gst_pad_push (self->srcpad, buf);
+ else
+ gst_buffer_unref (buf);
+ }
+ g_ptr_array_set_size (self->cur_outbufs, 0);
+
+ return ret;
}
static void
GstVTDec *self = GST_VTDEC_CAST (data);
GstBuffer *buf;
- if (result != kVTSuccess || self->cur_flowret != GST_FLOW_OK)
+ if (result != kVTSuccess)
goto beach;
if (!gst_vtdec_negotiate_downstream (self))
gst_buffer_copy_metadata (buf, self->cur_inbuf,
GST_BUFFER_COPY_FLAGS | GST_BUFFER_COPY_TIMESTAMPS);
- self->cur_flowret = gst_pad_push (self->srcpad, buf);
+ g_ptr_array_add (self->cur_outbufs, buf);
beach:
return;
VTDecompressionSessionRef session;
GstBuffer * cur_inbuf;
- GstFlowReturn cur_flowret;
+ GPtrArray * cur_outbufs;
};
void gst_vtdec_register_elements (GstPlugin * plugin);
| GST_API_VIDEO_TOOLBOX, &error);
if (error != NULL)
goto api_error;
+
+ self->cur_outbufs = g_ptr_array_new ();
}
ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
GST_OBJECT_UNLOCK (self);
+ g_ptr_array_free (self->cur_outbufs, TRUE);
+ self->cur_outbufs = NULL;
+
g_object_unref (self->ctx);
self->ctx = NULL;
}
CMTime ts, duration;
CVPixelBufferRef pbuf = NULL;
VTStatus vt_status;
+ GstFlowReturn ret = GST_FLOW_OK;
+ guint i;
self->cur_inbuf = buf;
- self->cur_flowret = GST_FLOW_OK;
ts = self->ctx->cm->CMTimeMake
(GST_TIME_AS_MSECONDS (GST_BUFFER_TIMESTAMP (buf)), 1000);
GST_OBJECT_UNLOCK (self);
cv->CVPixelBufferRelease (pbuf);
-
- gst_buffer_unref (buf);
self->cur_inbuf = NULL;
+ gst_buffer_unref (buf);
+
+ for (i = 0; i != self->cur_outbufs->len; i++) {
+ GstBuffer *buf = g_ptr_array_index (self->cur_outbufs, i);
- return self->cur_flowret;
+ if (ret == GST_FLOW_OK)
+ ret = gst_pad_push (self->srcpad, buf);
+ else
+ gst_buffer_unref (buf);
+ }
+ g_ptr_array_set_size (self->cur_outbufs, 0);
+
+ return ret;
cv_error:
{
- gst_buffer_unref (buf);
self->cur_inbuf = NULL;
+ gst_buffer_unref (buf);
return GST_FLOW_ERROR;
}
GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_DELTA_UNIT);
}
- GST_OBJECT_UNLOCK (self);
- self->cur_flowret = gst_pad_push (self->srcpad, buf);
- GST_OBJECT_LOCK (self);
+ g_ptr_array_add (self->cur_outbufs, buf);
beach:
return kVTSuccess;
CFMutableDictionaryRef options;
GstBuffer * cur_inbuf;
- GstFlowReturn cur_flowret;
+ GPtrArray * cur_outbufs;
gboolean expect_keyframe;
};