mpeg2dec: Fix negotiation issue with playbin
[glsdk/gst-plugin-ducati.git] / src / gstducatijpegdec.c
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 /**
21  * SECTION:element-ducatijpegdec
22  *
23  * FIXME:Describe ducatijpegdec here.
24  *
25  * <refsect2>
26  * <title>Example launch line</title>
27  * |[
28  * gst-launch -v -m fakesrc ! ducatijpegdec ! fakesink silent=TRUE
29  * ]|
30  * </refsect2>
31  */
33 #ifdef HAVE_CONFIG_H
34 #include <config.h>
35 #endif
37 #include "gstducatijpegdec.h"
39 static void gst_ducati_jpegdec_base_init (gpointer gclass);
40 static void gst_ducati_jpegdec_class_init (GstDucatiJpegDecClass * klass);
41 static void gst_ducati_jpegdec_init (GstDucatiJpegDec * self, gpointer klass);
43 static GstDucatiVidDecClass *parent_class = NULL;
45 GType
46 gst_ducati_jpegdec_get_type (void)
47 {
48   static GType ducati_jpegdec_type = 0;
50   if (!ducati_jpegdec_type) {
51     static const GTypeInfo ducati_jpegdec_info = {
52       sizeof (GstDucatiJpegDecClass),
53       (GBaseInitFunc) gst_ducati_jpegdec_base_init,
54       NULL,
55       (GClassInitFunc) gst_ducati_jpegdec_class_init,
56       NULL,
57       NULL,
58       sizeof (GstDucatiJpegDec),
59       0,
60       (GInstanceInitFunc) gst_ducati_jpegdec_init,
61     };
63     ducati_jpegdec_type = g_type_register_static (GST_TYPE_DUCATIVIDDEC,
64         "GstDucatiJpegDec", &ducati_jpegdec_info, 0);
65   }
66   return ducati_jpegdec_type;
67 }
69 static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink",
70     GST_PAD_SINK,
71     GST_PAD_ALWAYS,
72     GST_STATIC_CAPS ("image/jpeg, "
73         "parsed = (boolean)true, "
74         "width = (int)[ 32, 4096 ], "
75         "height = (int)[ 32, 4096 ], " "framerate = (fraction)[ 0, max ];")
76     );
78 /* GstDucatiVidDec vmethod implementations */
80 static void
81 gst_ducati_jpegdec_update_buffer_size (GstDucatiVidDec * self)
82 {
83   gint w = self->width;
84   gint h = self->height;
86   /* calculate output buffer parameters: */
87   self->padded_width = w;
88   self->padded_height = h;
89   self->min_buffers = 1;
90 }
92 static gboolean
93 gst_ducati_jpegdec_allocate_params (GstDucatiVidDec * self, gint params_sz,
94     gint dynparams_sz, gint status_sz, gint inargs_sz, gint outargs_sz)
95 {
96   IJPEGVDEC_DynamicParams *dynParams;
98   gboolean ret = GST_DUCATIVIDDEC_CLASS (parent_class)->allocate_params (self,
99       sizeof (IJPEGVDEC_Params), sizeof (IJPEGVDEC_DynamicParams),
100       sizeof (IJPEGVDEC_Status), sizeof (IJPEGVDEC_InArgs),
101       sizeof (IJPEGVDEC_OutArgs));
103   if (!ret)
104     return ret;
106   /* We're doing ENTIREFRAME decoding so in theory 0 should be a valid value
107    * for this. The codec seems to check that it's non-zero though...
108    */
109   self->params->numOutputDataUnits = 1;
111   dynParams = (IJPEGVDEC_DynamicParams *) self->dynParams;
112   dynParams->decodeThumbnail = 0;
113   dynParams->thumbnailMode = 3;
114   dynParams->downsamplingFactor = 1;
115   dynParams->streamingCompliant = 0;
117   return ret;
120 /* GObject vmethod implementations */
122 static void
123 gst_ducati_jpegdec_base_init (gpointer gclass)
125   GstElementClass *element_class = GST_ELEMENT_CLASS (gclass);
127   gst_element_class_set_static_metadata (element_class,
128       "DucatiJpegDec",
129       "Codec/Decoder/Video",
130       "Decodes video in MJPEG format with ducati",
131       "Alessandro Decina <alessandro.decina@collabora.co.uk>");
133   gst_element_class_add_pad_template (element_class,
134       gst_static_pad_template_get (&sink_factory));
137 static void
138 gst_ducati_jpegdec_class_init (GstDucatiJpegDecClass * klass)
140   GstDucatiVidDecClass *bclass = GST_DUCATIVIDDEC_CLASS (klass);
142   parent_class = g_type_class_peek_parent (klass);
144   bclass->codec_name = "ivahd_jpegvdec";
145   bclass->update_buffer_size =
146       GST_DEBUG_FUNCPTR (gst_ducati_jpegdec_update_buffer_size);
147   bclass->allocate_params =
148       GST_DEBUG_FUNCPTR (gst_ducati_jpegdec_allocate_params);
151 static void
152 gst_ducati_jpegdec_init (GstDucatiJpegDec * self,
153     gpointer gclass)
155   GstDucatiVidDec *vdec = GST_DUCATIVIDDEC (self);
156   vdec->pageMemType = XDM_MEMTYPE_RAW;
157 #ifndef GST_DISABLE_GST_DEBUG
158   vdec->error_strings[0] = "unsupported VIDDEC3 parameters";
159   vdec->error_strings[1] = "unsupported VIDDEC3 dynamic parameters";
160   vdec->error_strings[2] = "unsupported JPEGDEC dynamic parameters";
161   vdec->error_strings[3] = "no slice";
162   vdec->error_strings[4] = "MB data error";
163   vdec->error_strings[5] = "standby";
164   vdec->error_strings[6] = "invalid mbox message";
165   vdec->error_strings[7] = "HDVICP reset";
166   vdec->error_strings[16] = "HDVICP wait not clean exit";
167   vdec->error_strings[17] = "Frame header error";
168   vdec->error_strings[18] = "Scan header error";
169   vdec->error_strings[19] = "Huffman table header error";
170   vdec->error_strings[20] = "Quantization table header error";
171   vdec->error_strings[21] = "Bad chroma format";
172   vdec->error_strings[22] = "Unsupported marker";
173   vdec->error_strings[23] = "Thumbnail error";
174   vdec->error_strings[24] = "IRES handle error";
175   vdec->error_strings[25] = "Dynamic params handle error";
176   vdec->error_strings[26] = "Data sync error";
177   vdec->error_strings[27] = "Downsample input format error";
178   vdec->error_strings[28] = "Unsupported feature";
179   vdec->error_strings[29] = "Unsupported resolution";
180 #endif