mpeg4dec: add MPEG-4 support
[glsdk/gst-plugin-ducati.git] / src / gstducatividdec.h
1 /*
2  * GStreamer
3  * Copyright (c) 2010, Texas Instruments Incorporated
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Lesser General Public
7  * License as published by the Free Software Foundation
8  * version 2.1 of the License.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13  * Lesser General Public License for more details.
14  *
15  * You should have received a copy of the GNU Lesser General Public
16  * License along with this library; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
18  */
20 #ifndef __GST_DUCATIVIDDEC_H__
21 #define __GST_DUCATIVIDDEC_H__
23 #include <gst/gst.h>
25 #include "gstducati.h"
28 G_BEGIN_DECLS
30 // XXX move these
31 GST_DEBUG_CATEGORY_EXTERN (gst_ducati_debug);
34 #define GST_TYPE_DUCATIVIDDEC               (gst_ducati_viddec_get_type())
35 #define GST_DUCATIVIDDEC(obj)               (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_DUCATIVIDDEC, GstDucatiVidDec))
36 #define GST_DUCATIVIDDEC_CLASS(klass)       (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_DUCATIVIDDEC, GstDucatiVidDecClass))
37 #define GST_IS_DUCATIVIDDEC(obj)            (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_DUCATIVIDDEC))
38 #define GST_IS_DUCATIVIDDEC_CLASS(klass)    (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_DUCATIVIDDEC))
39 #define GST_DUCATIVIDDEC_GET_CLASS(obj)     (G_TYPE_INSTANCE_GET_CLASS((obj), GST_TYPE_DUCATIVIDDEC, GstDucatiVidDecClass))
41 typedef struct _GstDucatiVidDec      GstDucatiVidDec;
42 typedef struct _GstDucatiVidDecClass GstDucatiVidDecClass;
44 struct _GstDucatiVidDec
45 {
46   GstElement parent;
48   GstPad *sinkpad, *srcpad;
50   /* minimum output size required by the codec: */
51   gint outsize;
53   /* minimum number of buffers required by the codec: */
54   gint min_buffers;
56   /* input (unpadded) size of video: */
57   gint width, height;
59   /* output (padded) size including any codec padding: */
60   gint padded_width, padded_height;
62   /* output stride (>= padded_width) */
63   gint stride;
65   /* input buffer, allocated when codec is created: */
66   guint8 *input;
68   /* number of bytes pushed to input on current frame: */
69   gint in_size;
71   /* on first output buffer, we need to send crop info to sink.. and some
72    * operations like flushing should be avoided if we haven't sent any
73    * input buffers:
74    */
75   gboolean first_out_buffer, first_in_buffer;
77   /* by default, codec_data from sinkpad is prepended to first buffer: */
78   GstBuffer *codec_data;
80   Engine_Handle           engine;
81   VIDDEC3_Handle          codec;
82   VIDDEC3_Params         *params;
83   VIDDEC3_DynamicParams  *dynParams;
84   VIDDEC3_Status         *status;
85   XDM2_BufDesc           *inBufs;
86   XDM2_BufDesc           *outBufs;
87   VIDDEC3_InArgs         *inArgs;
88   VIDDEC3_OutArgs        *outArgs;
89 };
91 struct _GstDucatiVidDecClass
92 {
93   GstElementClass parent_class;
95   const gchar *codec_name;
97   /**
98    * Called when the input buffer size changes, to recalculate codec required
99    * output buffer size and minimum count
100    */
101   void (*update_buffer_size) (GstDucatiVidDec * self);
103   gboolean (*allocate_params) (GstDucatiVidDec * self, gint params_sz,
104       gint dynparams_sz, gint status_sz, gint inargs_sz, gint outargs_sz);
106   /**
107    * Push input data into codec's input buffer, returning a sub-buffer of
108    * any remaining data, or NULL if none.  Consumes reference to 'buf'
109    */
110   GstBuffer * (*push_input) (GstDucatiVidDec * self, GstBuffer * buf);
111 };
113 GType gst_ducati_viddec_get_type (void);
115 G_END_DECLS
117 #endif /* __GST_DUCATIVIDDEC_H__ */