*
*/
-#include "gstmaru.h"
+// #include "gstmaru.h"
+#include "gstmarudevice.h"
#include "gstmaruutils.h"
#include "gstmaruinterface.h"
-#include "gstmarudevice.h"
+// #include "gstmarudevice.h"
#define GST_MARUDEC_PARAMS_QDATA g_quark_from_static_string("marudec-params")
#define MAX_TS_MASK 0xff
-typedef struct _GstEmulDec
+typedef struct _GstMaruDec
{
GstElement element;
/* reverse playback queue */
GList *queued;
-} GstEmulDec;
+} GstMaruDec;
-typedef struct _GstEmulDecClass
+typedef struct _GstMaruDecClass
{
GstElementClass parent_class;
CodecElement *codec;
GstPadTemplate *sinktempl;
GstPadTemplate *srctempl;
-} GstEmulDecClass;
+} GstMaruDecClass;
static GstElementClass *parent_class = NULL;
-static void gst_marudec_base_init (GstEmulDecClass *klass);
-static void gst_marudec_class_init (GstEmulDecClass *klass);
-static void gst_marudec_init (GstEmulDec *marudec);
+static void gst_marudec_base_init (GstMaruDecClass *klass);
+static void gst_marudec_class_init (GstMaruDecClass *klass);
+static void gst_marudec_init (GstMaruDec *marudec);
static void gst_marudec_finalize (GObject *object);
static gboolean gst_marudec_setcaps (GstPad *pad, GstCaps *caps);
static GstStateChangeReturn gst_marudec_change_state (GstElement *element,
GstStateChange transition);
-static gboolean gst_marudec_negotiate (GstEmulDec *dec, gboolean force);
+static gboolean gst_marudec_negotiate (GstMaruDec *dec, gboolean force);
-static gint gst_marudec_frame (GstEmulDec *marudec, guint8 *data,
+static gint gst_marudec_frame (GstMaruDec *marudec, guint8 *data,
guint size, gint *got_data,
const GstTSInfo *dec_info, gint64 in_offset, GstFlowReturn *ret);
-static gboolean gst_marudec_open (GstEmulDec *marudec);
-static int gst_marudec_close (GstEmulDec *marudec);
+static gboolean gst_marudec_open (GstMaruDec *marudec);
+static int gst_marudec_close (GstMaruDec *marudec);
static const GstTSInfo *
-gst_ts_info_store (GstEmulDec *dec, GstClockTime timestamp,
+gst_ts_info_store (GstMaruDec *dec, GstClockTime timestamp,
GstClockTime duration, gint64 offset)
{
gint idx = dec->ts_idx;
}
static const GstTSInfo *
-gst_ts_info_get (GstEmulDec *dec, gint idx)
+gst_ts_info_get (GstMaruDec *dec, gint idx)
{
if (G_UNLIKELY (idx < 0 || idx > MAX_TS_MASK))
return GST_TS_INFO_NONE;
}
static void
-gst_marudec_reset_ts (GstEmulDec *marudec)
+gst_marudec_reset_ts (GstMaruDec *marudec)
{
marudec->next_out = GST_CLOCK_TIME_NONE;
}
static void
-gst_marudec_update_qos (GstEmulDec *marudec, gdouble proportion,
+gst_marudec_update_qos (GstMaruDec *marudec, gdouble proportion,
GstClockTime timestamp)
{
GST_LOG_OBJECT (marudec, "update QOS: %f, %" GST_TIME_FORMAT,
}
static void
-gst_marudec_reset_qos (GstEmulDec *marudec)
+gst_marudec_reset_qos (GstMaruDec *marudec)
{
gst_marudec_update_qos (marudec, 0.5, GST_CLOCK_TIME_NONE);
marudec->processed = 0;
}
static gboolean
-gst_marudec_do_qos (GstEmulDec *marudec, GstClockTime timestamp,
+gst_marudec_do_qos (GstMaruDec *marudec, GstClockTime timestamp,
gboolean *mode_switch)
{
GstClockTimeDiff diff;
// if (marudec->waiting_for_key) {
if (0) {
res = FALSE;
- } else {
}
+#if 0
+ else {
+ }
+#endif
GstClockTime stream_time, jitter;
GstMessage *qos_msg;
}
static void
-clear_queued (GstEmulDec *marudec)
+clear_queued (GstMaruDec *marudec)
{
g_list_foreach (marudec->queued, (GFunc) gst_mini_object_unref, NULL);
g_list_free (marudec->queued);
}
static GstFlowReturn
-flush_queued (GstEmulDec *marudec)
+flush_queued (GstMaruDec *marudec)
{
GstFlowReturn res = GST_FLOW_OK;
}
static void
-gst_marudec_drain (GstEmulDec *marudec)
+gst_marudec_drain (GstMaruDec *marudec)
{
- GstEmulDecClass *oclass;
+ GstMaruDecClass *oclass;
- oclass = (GstEmulDecClass *) (G_OBJECT_GET_CLASS (marudec));
+ oclass = (GstMaruDecClass *) (G_OBJECT_GET_CLASS (marudec));
- // TODO: drain
+ CODEC_LOG (DEBUG, "drain frame\n");
#if 1
{
gint have_data, len, try = 0;
* Implementation
*/
static void
-gst_marudec_base_init (GstEmulDecClass *klass)
+gst_marudec_base_init (GstMaruDecClass *klass)
{
GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
GstCaps *sinkcaps = NULL, *srccaps = NULL;
}
static void
-gst_marudec_class_init (GstEmulDecClass *klass)
+gst_marudec_class_init (GstMaruDecClass *klass)
{
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass);
}
static void
-gst_marudec_init (GstEmulDec *marudec)
+gst_marudec_init (GstMaruDec *marudec)
{
- GstEmulDecClass *oclass;
+ GstMaruDecClass *oclass;
- oclass = (GstEmulDecClass*) (G_OBJECT_GET_CLASS(marudec));
+ oclass = (GstMaruDecClass*) (G_OBJECT_GET_CLASS(marudec));
marudec->sinkpad = gst_pad_new_from_template (oclass->sinktempl, "sink");
gst_pad_set_setcaps_function (marudec->sinkpad,
static void
gst_marudec_finalize (GObject *object)
{
- GstEmulDec *marudec = (GstEmulDec *) object;
+ GstMaruDec *marudec = (GstMaruDec *) object;
if (marudec->context) {
g_free (marudec->context);
static gboolean
gst_marudec_src_event (GstPad *pad, GstEvent *event)
{
- GstEmulDec *marudec;
+ GstMaruDec *marudec;
gboolean res;
- marudec = (GstEmulDec *) gst_pad_get_parent (pad);
+ marudec = (GstMaruDec *) gst_pad_get_parent (pad);
switch (GST_EVENT_TYPE (event)) {
/* Quality Of Service (QOS) event contains a report
static gboolean
gst_marudec_sink_event (GstPad *pad, GstEvent *event)
{
- GstEmulDec *marudec;
+ GstMaruDec *marudec;
gboolean ret = FALSE;
- marudec = (GstEmulDec *) gst_pad_get_parent (pad);
+ marudec = (GstMaruDec *) gst_pad_get_parent (pad);
GST_DEBUG_OBJECT (marudec, "Handling %s event",
GST_EVENT_TYPE_NAME (event));
break;
case GST_EVENT_FLUSH_STOP:
{
-#if 0
if (marudec->opened) {
- // TODO: what does avcodec_flush_buffers do?
- maru_avcodec_flush_buffers (marudec->context, marudec->dev);
+ codec_flush_buffers (marudec->context, marudec->dev);
}
-#endif
+
gst_marudec_reset_ts (marudec);
gst_marudec_reset_qos (marudec);
#if 0
static gboolean
gst_marudec_setcaps (GstPad *pad, GstCaps *caps)
{
- GstEmulDec *marudec;
- GstEmulDecClass *oclass;
+ GstMaruDec *marudec;
+ GstMaruDecClass *oclass;
GstStructure *structure;
const GValue *par;
const GValue *fps;
GST_DEBUG_OBJECT (pad, "setcaps called.");
- marudec = (GstEmulDec *) (gst_pad_get_parent (pad));
- oclass = (GstEmulDecClass *) (G_OBJECT_GET_CLASS (marudec));
+ marudec = (GstMaruDec *) (gst_pad_get_parent (pad));
+ oclass = (GstMaruDecClass *) (G_OBJECT_GET_CLASS (marudec));
GST_OBJECT_LOCK (marudec);
}
static gboolean
-gst_marudec_open (GstEmulDec *marudec)
+gst_marudec_open (GstMaruDec *marudec)
{
- GstEmulDecClass *oclass;
+ GstMaruDecClass *oclass;
- oclass = (GstEmulDecClass *) (G_OBJECT_GET_CLASS (marudec));
+ oclass = (GstMaruDecClass *) (G_OBJECT_GET_CLASS (marudec));
if (!marudec->dev) {
return FALSE;
}
static int
-gst_marudec_close (GstEmulDec *marudec)
+gst_marudec_close (GstMaruDec *marudec)
{
int ret = 0;
static gboolean
-gst_marudec_negotiate (GstEmulDec *marudec, gboolean force)
+gst_marudec_negotiate (GstMaruDec *marudec, gboolean force)
{
- GstEmulDecClass *oclass;
+ GstMaruDecClass *oclass;
GstCaps *caps;
- oclass = (GstEmulDecClass *) (G_OBJECT_GET_CLASS (marudec));
+ oclass = (GstMaruDecClass *) (G_OBJECT_GET_CLASS (marudec));
switch (oclass->codec->media_type) {
case AVMEDIA_TYPE_VIDEO:
}
static GstFlowReturn
-get_output_buffer (GstEmulDec *marudec, GstBuffer **outbuf)
+get_output_buffer (GstMaruDec *marudec, GstBuffer **outbuf)
{
gint pict_size;
GstFlowReturn ret;
return GST_FLOW_ERROR;
}
- CODEC_LOG (DEBUG, "outbuf size of decoded video: %d\n", pict_size);
+ CODEC_LOG (DEBUG, "outbuf size of decoded video: %d\n", pict_size);
- if (pict_size < (256 * 1024)) {
- /* GstPadBufferAllocFunction is mostly overridden by elements that can
- * provide a hardware buffer in order to avoid additional memcpy operations.
- */
+ if (pict_size < (256 * 1024)) {
+ /* GstPadBufferAllocFunction is mostly overridden by elements that can
+ * provide a hardware buffer in order to avoid additional memcpy operations.
+ */
gst_pad_set_bufferalloc_function(
GST_PAD_PEER(marudec->srcpad),
(GstPadBufferAllocFunction) codec_buffer_alloc);
- } else {
- CODEC_LOG (DEBUG, "request a large size of memory\n");
- }
+ } else {
+ CODEC_LOG (DEBUG, "request large size of memory. pict_size: %d\n", pict_size);
+ }
ret = gst_pad_alloc_buffer_and_set_caps (marudec->srcpad,
GST_BUFFER_OFFSET_NONE, pict_size,
}
static gboolean
-clip_video_buffer (GstEmulDec *dec, GstBuffer *buf,
+clip_video_buffer (GstMaruDec *dec, GstBuffer *buf,
GstClockTime in_ts, GstClockTime in_dur)
{
gboolean res = TRUE;
}
static gboolean
-clip_audio_buffer (GstEmulDec *dec, GstBuffer *buf,
+clip_audio_buffer (GstMaruDec *dec, GstBuffer *buf,
GstClockTime in_ts, GstClockTime in_dur)
{
GstClockTime stop;
}
static gint
-gst_marudec_video_frame (GstEmulDec *marudec, guint8 *data, guint size,
+gst_marudec_video_frame (GstMaruDec *marudec, guint8 *data, guint size,
const GstTSInfo *dec_info, gint64 in_offset, GstBuffer **outbuf,
GstFlowReturn *ret)
{
codec_decode_video (marudec->context, data, size,
dec_info->idx, in_offset, outbuf,
&have_data, marudec->dev);
-
+#if 0
+ // skip_frame
if (!decode) {
- // skip_frame
}
-
+#endif
GST_DEBUG_OBJECT (marudec, "after decode: len %d, have_data %d",
len, have_data);
#endif
if (len < 0 || have_data <= 0) {
+// if (len < 0) { // have_data <= 0) {
GST_DEBUG_OBJECT (marudec, "return flow %d, out %p, len %d",
*ret, *outbuf, len);
+
+ CODEC_LOG (DEBUG,
+ "return flow %d, out %p, len %d, have_data: %d\n",
+ *ret, *outbuf, len, have_data);
+
return len;
}
}
static gint
-gst_marudec_audio_frame (GstEmulDec *marudec, CodecElement *codec,
+gst_marudec_audio_frame (GstMaruDec *marudec, CodecElement *codec,
guint8 *data, guint size,
const GstTSInfo *dec_info, GstBuffer **outbuf,
GstFlowReturn *ret)
}
static gint
-gst_marudec_frame (GstEmulDec *marudec, guint8 *data, guint size,
+gst_marudec_frame (GstMaruDec *marudec, guint8 *data, guint size,
gint *got_data, const GstTSInfo *dec_info, gint64 in_offset, GstFlowReturn *ret)
{
- GstEmulDecClass *oclass;
+ GstMaruDecClass *oclass;
GstBuffer *outbuf = NULL;
gint have_data = 0, len = 0;
}
*ret = GST_FLOW_OK;
- oclass = (GstEmulDecClass *) (G_OBJECT_GET_CLASS (marudec));
+ oclass = (GstMaruDecClass *) (G_OBJECT_GET_CLASS (marudec));
switch (oclass->codec->media_type) {
case AVMEDIA_TYPE_VIDEO:
static GstFlowReturn
gst_marudec_chain (GstPad *pad, GstBuffer *buffer)
{
- GstEmulDec *marudec;
- GstEmulDecClass *oclass;
+ GstMaruDec *marudec;
+ GstMaruDecClass *oclass;
guint8 *in_buf;
gint in_size, len, have_data;
GstFlowReturn ret = GST_FLOW_OK;
const GstTSInfo *in_info;
const GstTSInfo *dec_info;
- marudec = (GstEmulDec *) (GST_PAD_PARENT (pad));
+ marudec = (GstMaruDec *) (GST_PAD_PARENT (pad));
if (G_UNLIKELY (!marudec->opened)) {
// not_negotiated
- oclass = (GstEmulDecClass *) (G_OBJECT_GET_CLASS (marudec));
+ oclass = (GstMaruDecClass *) (G_OBJECT_GET_CLASS (marudec));
GST_ELEMENT_ERROR (marudec, CORE, NEGOTIATION, (NULL),
("maru_%sdec: input format was not set before data start",
oclass->codec->name));
discont = GST_BUFFER_IS_DISCONT (buffer);
-// FIXME
+ // FIXME
if (G_UNLIKELY (discont)) {
GST_DEBUG_OBJECT (marudec, "received DISCONT");
gst_marudec_drain (marudec);
// gst_marudec_flush_pcache (marudec);
-// maru_avcodec_flush buffers (marudec->context, marudec->dev);
+ codec_flush_buffers (marudec->context, marudec->dev);
marudec->discont = TRUE;
gst_marudec_reset_ts (marudec);
}
// marudec->clear_ts = TRUE;
- oclass = (GstEmulDecClass *) (G_OBJECT_GET_CLASS (marudec));
+ oclass = (GstMaruDecClass *) (G_OBJECT_GET_CLASS (marudec));
#if 0
if (G_UNLIKELY (marudec->waiting_for_key)) {
if (GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_DELTA_UNIT) &&
static GstStateChangeReturn
gst_marudec_change_state (GstElement *element, GstStateChange transition)
{
- GstEmulDec *marudec = (GstEmulDec *) element;
+ GstMaruDec *marudec = (GstMaruDec *) element;
GstStateChangeReturn ret;
ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
gst_marudec_register (GstPlugin *plugin, GList *element)
{
GTypeInfo typeinfo = {
- sizeof (GstEmulDecClass),
+ sizeof (GstMaruDecClass),
(GBaseInitFunc) gst_marudec_base_init,
NULL,
(GClassInitFunc) gst_marudec_class_init,
NULL,
NULL,
- sizeof (GstEmulDec),
+ sizeof (GstMaruDec),
0,
(GInstanceInitFunc) gst_marudec_init,
};