]> Gitweb @ Texas Instruments - Open Source Git Repositories - git.TI.com/gitweb - glsdk/gst-plugin-ducati.git/blobdiff - src/gstducatividdec.h
viddec: Drop frames if out of segment
[glsdk/gst-plugin-ducati.git] / src / gstducatividdec.h
index 5b64b20d8b04b5292262923dacf9515e85f39425..accdf60243c51e663f687e9cf287fe0e8e497ca8 100644 (file)
 #ifndef __GST_DUCATIVIDDEC_H__
 #define __GST_DUCATIVIDDEC_H__
 
+#include <stdint.h>
+#include <stddef.h>
+#include <unistd.h>
+#include <omap_drm.h>
+#include <omap_drmif.h>
+
 #include "gstducati.h"
-#include "gstducatibufferpool.h"
+#include "gstducatibufferpriv.h"
 
+#include <gst/drm/gstdrmallocator.h>
 #include <gst/video/video.h>
+#include <gst/video/gstvideometa.h>
 
 G_BEGIN_DECLS
-
-
 #define GST_TYPE_DUCATIVIDDEC               (gst_ducati_viddec_get_type())
 #define GST_DUCATIVIDDEC(obj)               (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_DUCATIVIDDEC, GstDucatiVidDec))
 #define GST_DUCATIVIDDEC_CLASS(klass)       (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_DUCATIVIDDEC, GstDucatiVidDecClass))
 #define GST_IS_DUCATIVIDDEC(obj)            (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_DUCATIVIDDEC))
 #define GST_IS_DUCATIVIDDEC_CLASS(klass)    (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_DUCATIVIDDEC))
 #define GST_DUCATIVIDDEC_GET_CLASS(obj)     (G_TYPE_INSTANCE_GET_CLASS((obj), GST_TYPE_DUCATIVIDDEC, GstDucatiVidDecClass))
-
-typedef struct _GstDucatiVidDec      GstDucatiVidDec;
+typedef struct _GstDucatiVidDec GstDucatiVidDec;
 typedef struct _GstDucatiVidDecClass GstDucatiVidDecClass;
 
+/* For re-ordering in normal playback */
+#define MAX_BACKLOG_FRAMES 16
+/* For re-ordering in reverse playback */
+#define MAX_BACKLOG_ARRAY_SIZE 120
+
 struct _GstDucatiVidDec
 {
   GstElement parent;
 
   GstPad *sinkpad, *srcpad;
 
-  GstDucatiBufferPool *pool;
+  GstBufferPool *pool;
 
   /* minimum output size required by the codec: */
   gint outsize;
@@ -68,6 +78,7 @@ struct _GstDucatiVidDec
 
   gboolean interlaced;
 
+  struct omap_bo *input_bo;
   /* input buffer, allocated when codec is created: */
   guint8 *input;
 
@@ -79,7 +90,6 @@ struct _GstDucatiVidDec
    * input buffers:
    */
   gboolean first_out_buffer, first_in_buffer;
-  gboolean send_crop_event;
 
   GstSegment segment;
   gdouble qos_proportion;
@@ -88,7 +98,9 @@ struct _GstDucatiVidDec
   gboolean need_out_buf;
 
   /* by default, codec_data from sinkpad is prepended to first buffer: */
-  GstBuffer *codec_data;
+
+  guint8 *codecdata;
+  gsize codecdatasize;
 
   /* workaround enabled to indicate that timestamp from demuxer is PTS,
    * not DTS (cough, cough.. avi):
@@ -104,22 +116,45 @@ struct _GstDucatiVidDec
 
   gboolean wait_keyframe;
 
+  gboolean needs_flushing;
+
+  gboolean codec_create_params_changed;
+
+  GHashTable *passed_in_bufs;
+
+  GHashTable *dce_locked_bufs;
+
 #define NDTS 32
   GstClockTime dts_queue[NDTS];
   gint dts_ridx, dts_widx;
   GstClockTime last_dts, last_pts;
 
-  Engine_Handle           engine;
-  VIDDEC3_Handle          codec;
-  VIDDEC3_Params         *params;
-  VIDDEC3_DynamicParams  *dynParams;
-  VIDDEC3_Status         *status;
-  XDM2_BufDesc           *inBufs;
-  XDM2_BufDesc           *outBufs;
-  VIDDEC3_InArgs         *inArgs;
-  VIDDEC3_OutArgs        *outArgs;
+  Engine_Handle engine;
+  VIDDEC3_Handle codec;
+  VIDDEC3_Params *params;
+  VIDDEC3_DynamicParams *dynParams;
+  VIDDEC3_Status *status;
+  XDM2_BufDesc *inBufs;
+  XDM2_BufDesc *outBufs;
+  VIDDEC3_InArgs *inArgs;
+  VIDDEC3_OutArgs *outArgs;
 
   XDAS_Int16 pageMemType;
+  struct omap_device *device;
+
+  GstCaps *sinkcaps;
+
+  /* Frames waiting to be reordered */
+  GstBuffer *backlog_frames[MAX_BACKLOG_ARRAY_SIZE + 1];
+  gint backlog_maxframes;
+  gint backlog_nframes;
+  gint backlog_max_maxframes;
+  gint displayDelay;
+
+  gboolean codec_debug_info;
+  gboolean out_of_segment;
+
+  const char *error_strings[32];
 };
 
 struct _GstDucatiVidDecClass
@@ -133,7 +168,7 @@ struct _GstDucatiVidDecClass
    * class implementation of this method handles standard stuff like
    * width/height/framerate/codec_data.
    */
-  gboolean (*parse_caps) (GstDucatiVidDec * self, GstStructure * s);
+    gboolean (*parse_caps) (GstDucatiVidDec * self, GstStructure * s);
 
   /**
    * Called when the input buffer size changes, to recalculate codec required
@@ -144,28 +179,44 @@ struct _GstDucatiVidDecClass
   /**
    * Called to allocate/initialize  params/dynParams/status/inArgs/outArgs
    */
-  gboolean (*allocate_params) (GstDucatiVidDec * self, gint params_sz,
+    gboolean (*allocate_params) (GstDucatiVidDec * self, gint params_sz,
       gint dynparams_sz, gint status_sz, gint inargs_sz, gint outargs_sz);
 
   /**
    * Push input data into codec's input buffer, returning a sub-buffer of
    * any remaining data, or NULL if none.  Consumes reference to 'buf'
    */
-  GstBuffer * (*push_input) (GstDucatiVidDec * self, GstBuffer * buf);
+  GstBuffer *(*push_input) (GstDucatiVidDec * self, GstBuffer * buf);
 
   /**
    * Called to handle errors returned by VIDDEC3_process.
    */
-  gint (*handle_error) (GstDucatiVidDec * self, gint ret, gint extended_error,
+    gint (*handle_error) (GstDucatiVidDec * self, gint ret, gint extended_error,
       gint status_extended_error);
 
   /**
    * Called to check whether it's a good idea to drop buf or not.
    */
-  gboolean (*drop_frame) (GstDucatiVidDec * self, GstBuffer * buf, gint64 diff);
+    gboolean (*can_drop_frame) (GstDucatiVidDec * self, GstBuffer * buf,
+      gint64 diff);
 
-  gboolean (*query) (GstDucatiVidDec * self, GstPad * pad, GstQuery * query,
+    gboolean (*query) (GstDucatiVidDec * self, GstPad * pad, GstQuery * query,
       gboolean * forward);
+
+  /**
+   * Called to push a decoder buffer. Consumes reference to 'buf'.
+   */
+    GstFlowReturn (*push_output) (GstDucatiVidDec * self, GstBuffer * buf);
+
+  /**
+   * Called before a flush happens.
+   */
+  void (*on_flush) (GstDucatiVidDec * self, gboolean eos);
+
+  /**
+   * Called to set new caps on the sink pad.
+   */
+    gboolean (*set_sink_caps) (GstDucatiVidDec * self, GstCaps * caps);
 };
 
 GType gst_ducati_viddec_get_type (void);
@@ -173,7 +224,7 @@ GType gst_ducati_viddec_get_type (void);
 /* helper methods for derived classes: */
 
 static inline void
-push_input (GstDucatiVidDec * self, const guint8 *in, gint sz)
+push_input (GstDucatiVidDec * self, const guint8 * in, gint sz)
 {
   GST_DEBUG_OBJECT (self, "push: %d bytes)", sz);
   memcpy (self->input + self->in_size, in, sz);
@@ -181,8 +232,8 @@ push_input (GstDucatiVidDec * self, const guint8 *in, gint sz)
 }
 
 static inline int
-check_start_code (const guint8 *sc, gint scsize,
-    const guint8 *inbuf, gint insize)
+check_start_code (const guint8 * sc, gint scsize,
+    const guint8 * inbuf, gint insize)
 {
   if (insize < scsize)
     return FALSE;
@@ -199,8 +250,8 @@ check_start_code (const guint8 *sc, gint scsize,
 }
 
 static inline int
-find_start_code (const guint8 *sc, gint scsize,
-    const guint8 *inbuf, gint insize)
+find_start_code (const guint8 * sc, gint scsize,
+    const guint8 * inbuf, gint insize)
 {
   gint size = 0;
   while (insize) {
@@ -213,9 +264,7 @@ find_start_code (const guint8 *sc, gint scsize,
   return size;
 }
 
-gboolean
-gst_ducati_viddec_codec_flush (GstDucatiVidDec * self, gboolean eos);
+gboolean gst_ducati_viddec_codec_flush (GstDucatiVidDec * self, gboolean eos);
 
 G_END_DECLS
-
 #endif /* __GST_DUCATIVIDDEC_H__ */