ducatividdec: remove another leftover -strided caps remnant
[glsdk/gst-plugin-ducati.git] / src / gstducatimpeg4enc.c
1 /* GStreamer
2  * Copyright (c) 2011, Texas Instruments Incorporated
3  * Copyright (c) 2011, Collabora Ltd.
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Library General Public
7  * License as published by the Free Software Foundation; either
8  * version 2 of the License, or (at your option) any later version.
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  * Library General Public License for more details.
14  *
15  * You should have received a copy of the GNU Library General Public
16  * License along with this library; if not, write to the
17  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18  * Boston, MA 02111-1307, USA.
19  *
20  * Author: Alessandro Decina <alessandro.decina@collabora.com>
21  */
23 #ifdef HAVE_CONFIG_H
24 #include "config.h"
25 #endif
27 #include "gstducati.h"
28 #include "gstducatimpeg4enc.h"
30 #include <string.h>
32 #include <math.h>
34 #define GST_CAT_DEFAULT gst_ducati_debug
36 #define DEFAULT_PROFILE GST_DUCATI_MPEG4ENC_PROFILE_SIMPLE
37 #define DEFAULT_LEVEL GST_DUCATI_MPEG4ENC_LEVEL_5
39 #define GST_TYPE_DUCATI_MPEG4ENC_PROFILE (gst_ducati_mpeg4enc_profile_get_type ())
40 #define GST_TYPE_DUCATI_MPEG4ENC_LEVEL (gst_ducati_mpeg4enc_level_get_type ())
43 enum
44 {
45   LAST_SIGNAL
46 };
48 enum
49 {
50   PROP_0,
51   PROP_PROFILE,
52   PROP_LEVEL,
53 };
55 static void gst_ducati_mpeg4enc_set_property (GObject * object, guint prop_id,
56     const GValue * value, GParamSpec * pspec);
57 static void gst_ducati_mpeg4enc_get_property (GObject * object, guint prop_id,
58     GValue * value, GParamSpec * pspec);
60 static gboolean gst_ducati_mpeg4enc_allocate_params (GstDucatiVidEnc *
61     self, gint params_sz, gint dynparams_sz, gint status_sz, gint inargs_sz,
62     gint outargs_sz);
63 static gboolean gst_ducati_mpeg4enc_configure (GstDucatiVidEnc * self);
66 static GstStaticPadTemplate gst_ducati_mpeg4enc_sink_template =
67 GST_STATIC_PAD_TEMPLATE ("sink",
68     GST_PAD_SINK,
69     GST_PAD_ALWAYS,
70     GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("NV12"))
71     );
73 static GstStaticPadTemplate gst_ducati_mpeg4enc_src_template =
74 GST_STATIC_PAD_TEMPLATE ("src",
75     GST_PAD_SRC,
76     GST_PAD_ALWAYS,
77     GST_STATIC_CAPS ("video/mpeg, mpegversion=4, systemstream=false")
78     );
80 GST_BOILERPLATE (GstDucatiMPEG4Enc, gst_ducati_mpeg4enc, GstDucatiVidEnc,
81     GST_TYPE_DUCATIVIDENC);
84 /* the values for the following enums are taken from the codec */
86 enum
87 {
88   GST_DUCATI_MPEG4ENC_PROFILE_SIMPLE = 3,            /**< BaseLine Profile   */
89 };
91 enum
92 {
93   GST_DUCATI_MPEG4ENC_LEVEL_0 = 0, /**< MPEG4 Simple Profile Level 0 */
94   GST_DUCATI_MPEG4ENC_LEVEL_0B = 9, /**< MPEG4 Simple Profile Level 0b*/
95   GST_DUCATI_MPEG4ENC_LEVEL_1 = 1, /**< MPEG4 Simple Profile Level 1 */
96   GST_DUCATI_MPEG4ENC_LEVEL_2 = 2, /**< MPEG4 Simple Profile Level 2 */
97   GST_DUCATI_MPEG4ENC_LEVEL_3 = 3, /**< MPEG4 Simple Profile Level 3 */
98   GST_DUCATI_MPEG4ENC_LEVEL_4A = 4, /**< MPEG4 Simple Profile Level 4a*/
99   GST_DUCATI_MPEG4ENC_LEVEL_5 = 5, /**< MPEG4 Simple Profile Level 5 */
100   GST_DUCATI_MPEG4ENC_LEVEL_6 = 6 /**< MPEG4 Simple Profile Level 6 */
101 };
103 static GType
104 gst_ducati_mpeg4enc_profile_get_type (void)
106   static GType type = 0;
108   if (!type) {
109     static const GEnumValue vals[] = {
110       {GST_DUCATI_MPEG4ENC_PROFILE_SIMPLE, "Simple", "simple"},
111       {0, NULL, NULL},
112     };
114     type = g_enum_register_static ("GstDucatiMPEG4EncProfile", vals);
115   }
117   return type;
120 static GType
121 gst_ducati_mpeg4enc_level_get_type (void)
123   static GType type = 0;
125   if (!type) {
126     static const GEnumValue vals[] = {
127       {GST_DUCATI_MPEG4ENC_LEVEL_0, "Level 0", "level-0"},
128       {GST_DUCATI_MPEG4ENC_LEVEL_0B, "Level 0B", "level-0b"},
129       {GST_DUCATI_MPEG4ENC_LEVEL_1, "Level 1", "level-1"},
130       {GST_DUCATI_MPEG4ENC_LEVEL_2, "Level 2", "level-2"},
131       {GST_DUCATI_MPEG4ENC_LEVEL_3, "Level 3", "level-3"},
132       {GST_DUCATI_MPEG4ENC_LEVEL_4A, "Level 4", "level-4"},
133       {GST_DUCATI_MPEG4ENC_LEVEL_5, "Level 5", "level-5"},
134       {GST_DUCATI_MPEG4ENC_LEVEL_6, "Level 6", "level-6"},
135       {0, NULL, NULL},
136     };
138     type = g_enum_register_static ("GstDucatiMPEG4EncLevel", vals);
139   }
141   return type;
144 static void
145 gst_ducati_mpeg4enc_base_init (gpointer g_class)
148   GstElementClass *element_class = GST_ELEMENT_CLASS (g_class);
150   gst_element_class_add_pad_template (element_class,
151       gst_static_pad_template_get (&gst_ducati_mpeg4enc_src_template));
152   gst_element_class_add_pad_template (element_class,
153       gst_static_pad_template_get (&gst_ducati_mpeg4enc_sink_template));
155   gst_element_class_set_details_simple (element_class, "MPEG4 Encoder",
156       "Codec/Encoder/Video",
157       "Encode raw video into MPEG4 stream",
158       "Alessandro Decina <alessandro.decina@collabora.com>");
160   GST_DUCATIVIDENC_CLASS (element_class)->codec_name = "ivahd_mpeg4enc";
163 static void
164 gst_ducati_mpeg4enc_class_init (GstDucatiMPEG4EncClass * klass)
166   GObjectClass *gobject_class;
167   GstDucatiVidEncClass *videnc_class;
169   gobject_class = G_OBJECT_CLASS (klass);
170   videnc_class = GST_DUCATIVIDENC_CLASS (klass);
172   gobject_class->set_property = gst_ducati_mpeg4enc_set_property;
173   gobject_class->get_property = gst_ducati_mpeg4enc_get_property;
175   videnc_class->allocate_params = gst_ducati_mpeg4enc_allocate_params;
176   videnc_class->configure = gst_ducati_mpeg4enc_configure;
178   g_object_class_install_property (gobject_class, PROP_PROFILE,
179       g_param_spec_enum ("profile", "MPEG4 Profile", "MPEG4 Profile",
180           GST_TYPE_DUCATI_MPEG4ENC_PROFILE, DEFAULT_PROFILE,
181           G_PARAM_READWRITE));
183   g_object_class_install_property (gobject_class, PROP_LEVEL,
184       g_param_spec_enum ("level", "MPEG4 Level", "MPEG4 Level",
185           GST_TYPE_DUCATI_MPEG4ENC_LEVEL, DEFAULT_LEVEL, G_PARAM_READWRITE));
188 static void
189 gst_ducati_mpeg4enc_init (GstDucatiMPEG4Enc * self,
190     GstDucatiMPEG4EncClass * klass)
192   GST_DEBUG ("gst_ducati_mpeg4enc_init");
194   self->profile = DEFAULT_PROFILE;
195   self->level = DEFAULT_LEVEL;
198 static void
199 gst_ducati_mpeg4enc_set_property (GObject * object, guint prop_id,
200     const GValue * value, GParamSpec * pspec)
202   GstDucatiMPEG4Enc *self;
204   g_return_if_fail (GST_IS_DUCATIMPEG4ENC (object));
205   self = GST_DUCATIMPEG4ENC (object);
207   switch (prop_id) {
208     case PROP_PROFILE:
209       self->profile = g_value_get_enum (value);
210       break;
211     case PROP_LEVEL:
212       self->level = g_value_get_enum (value);
213       break;
214     default:
215       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
216   }
219 static void
220 gst_ducati_mpeg4enc_get_property (GObject * object, guint prop_id,
221     GValue * value, GParamSpec * pspec)
223   GstDucatiMPEG4Enc *self;
225   g_return_if_fail (GST_IS_DUCATIMPEG4ENC (object));
226   self = GST_DUCATIMPEG4ENC (object);
228   switch (prop_id) {
229     case PROP_PROFILE:
230       g_value_set_enum (value, self->profile);
231       break;
232     case PROP_LEVEL:
233       g_value_set_enum (value, self->level);
234       break;
235     default:
236       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
237   }
240 static const char *
241 get_profile_name (guint profile)
243   switch (profile) {
244     case GST_DUCATI_MPEG4ENC_PROFILE_SIMPLE:
245       return "simple";
246     default:
247       return NULL;
248   }
251 static gboolean
252 gst_ducati_mpeg4enc_configure (GstDucatiVidEnc * videnc)
254   GstDucatiMPEG4Enc *self = GST_DUCATIMPEG4ENC (videnc);
255   const GstVideoState *state;
256   GstCaps *caps;
257   const char *s;
258   gboolean ret = TRUE;
260   if (!GST_DUCATIVIDENC_CLASS (parent_class)->configure (videnc))
261     return FALSE;
263   videnc->params->profile = self->profile;
264   videnc->params->level = self->level;
265   videnc->params->maxInterFrameInterval = 0;
266   videnc->dynParams->mvAccuracy = IVIDENC2_MOTIONVECTOR_HALFPEL;
267   videnc->dynParams->interFrameInterval = 0;
269   state = gst_base_video_encoder_get_state (GST_BASE_VIDEO_ENCODER (videnc));
270   caps = gst_caps_new_simple ("video/mpeg",
271       "mpegversion", G_TYPE_INT, 4,
272       "systemstream", G_TYPE_BOOLEAN, FALSE,
273       "width", G_TYPE_INT, videnc->rect.w,
274       "height", G_TYPE_INT, videnc->rect.h,
275       "framerate", GST_TYPE_FRACTION, state->fps_n, state->fps_d,
276       "pixel-aspect-ratio", GST_TYPE_FRACTION, state->par_n, state->par_d,
277       NULL);
278   s = get_profile_name (self->profile);
279   if (s)
280     gst_caps_set_simple (caps, "profile", G_TYPE_STRING, s, NULL);
281   ret = gst_pad_set_caps (GST_BASE_VIDEO_CODEC_SRC_PAD (self), caps);
283   return ret;
286 static gboolean
287 gst_ducati_mpeg4enc_allocate_params (GstDucatiVidEnc *
288     videnc, gint params_sz, gint dynparams_sz, gint status_sz, gint inargs_sz,
289     gint outargs_sz)
291   return GST_DUCATIVIDENC_CLASS (parent_class)->allocate_params (videnc,
292       sizeof (IVIDENC2_Params), sizeof (IVIDENC2_DynamicParams),
293       sizeof (IVIDENC2_Status), sizeof (IVIDENC2_InArgs),
294       sizeof (IVIDENC2_OutArgs));