mpeg2dec: Fix negotiation issue with playbin
[glsdk/gst-plugin-ducati.git] / src / gstducatijpegenc.c
1 /* GStreamer
2  * Copyright (c) 2017, 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  *         ti <ti@ti.com>
22  */
24 #ifdef HAVE_CONFIG_H
25 #include "config.h"
26 #endif
28 #include "gstducati.h"
29 #include "gstducatijpegenc.h"
31 #include <string.h>
33 #include <math.h>
35 #define GST_CAT_DEFAULT gst_ducati_debug
37 enum
38 {
39   LAST_SIGNAL
40 };
42 static gboolean gst_ducati_jpegenc_allocate_params (GstDucatiVidEnc *
43     self, gint params_sz, gint dynparams_sz, gint status_sz, gint inargs_sz,
44     gint outargs_sz);
45 static gboolean gst_ducati_jpegenc_configure (GstDucatiVidEnc * self);
48 static GstStaticPadTemplate gst_ducati_jpegenc_sink_template =
49 GST_STATIC_PAD_TEMPLATE ("sink",
50     GST_PAD_SINK,
51     GST_PAD_ALWAYS,
52     GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE ("NV12"))
53     );
55 static GstStaticPadTemplate gst_ducati_jpegenc_src_template =
56 GST_STATIC_PAD_TEMPLATE ("src",
57     GST_PAD_SRC,
58     GST_PAD_ALWAYS,
59     GST_STATIC_CAPS ("image/jpeg, "
60         "parsed = (boolean)true, "
61         "width = (int)[ 32, 4096 ], "
62         "height = (int)[ 32, 4096 ], "
63         "framerate = (fraction)[ 0, max ];")
64     );
66 #define parent_class gst_ducati_jpegenc_parent_class
67 G_DEFINE_TYPE (GstDucatiJPEGEnc, gst_ducati_jpegenc, GST_TYPE_DUCATIVIDENC);
69 static void
70 gst_ducati_jpegenc_class_init (GstDucatiJPEGEncClass * klass)
71 {
72   GstDucatiVidEncClass *videnc_class;
73   GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
75   videnc_class = GST_DUCATIVIDENC_CLASS (klass);
77   gst_element_class_add_pad_template (element_class,
78       gst_static_pad_template_get (&gst_ducati_jpegenc_src_template));
79   gst_element_class_add_pad_template (element_class,
80       gst_static_pad_template_get (&gst_ducati_jpegenc_sink_template));
82   gst_element_class_set_metadata (element_class, "JPEG Encoder",
83       "Codec/Encoder/Video",
84       "Encode raw video into JPEG stream",
85       "ti <ti@ti.com>");
87   GST_DUCATIVIDENC_CLASS (element_class)->codec_name = "ivahd_jpegvenc";
89   videnc_class->allocate_params = gst_ducati_jpegenc_allocate_params;
90   videnc_class->configure = gst_ducati_jpegenc_configure;
91 }
93 static void
94 gst_ducati_jpegenc_init (GstDucatiJPEGEnc * self)
95 {
96   GST_DEBUG ("gst_ducati_jpegenc_init");
97 }
99 static gboolean
100 gst_ducati_jpegenc_configure (GstDucatiVidEnc * videnc)
102   GstDucatiJPEGEnc *self = GST_DUCATIJPEGENC (videnc);
103   IJPEGVENC_Params *params;
104   IJPEGVENC_DynamicParams *dynParams;
105   const GstVideoCodecState *state;
106   GstCaps *caps;
107   const char *s;
108   gboolean ret = TRUE;
110   if (!GST_DUCATIVIDENC_CLASS (parent_class)->configure (videnc))
111     return FALSE;
113   params = (IJPEGVENC_Params *) videnc->params;
115   params->maxThumbnailHSizeApp0 = 4096;
116   params->maxThumbnailHSizeApp1 = 4096;
117   params->maxThumbnailVSizeApp0 = 4096;
118   params->maxThumbnailVSizeApp1 = 4096;
119   params->debugTraceLevel = 0;
121   params->lastNFramesToLog = 0;
122   params->Markerposition   = 0;
124   params->rateControlParams.VBRDuration     = 8;
125   params->rateControlParams.VBRsensitivity  = 0;
126   params->rateControlParams.vbvUseLevelThQ5 = 0;
128   params->rateControlParams.rateControlParamsPreset = 1;
129   params->rateControlParams.rcAlgo = 0;
130   params->rateControlParams.qpMaxI = 51;
131   params->rateControlParams.qpMinI = 1;
132   params->rateControlParams.qpI = -1;
133   params->rateControlParams.initialBufferLevel = 10000000;
134   params->rateControlParams.HRDBufferSize = 10000000;
135   params->rateControlParams.discardSavedBits = 0;
137   videnc->params->rateControlPreset = 4;
138   videnc->params->maxBitRate = 7500000;
139   videnc->params->minBitRate = 4500000;
141   dynParams = (IJPEGVENC_DynamicParams *) videnc->dynParams;
143   dynParams->restartInterval = 0;
144   dynParams->qualityFactor = 50;
145   dynParams->quantTable = NULL;
147   dynParams->enablePrivacyMasking = 0;
149   state = videnc->input_state;
150   caps = gst_caps_new_simple ("image/jpeg",
151       "parsed", G_TYPE_BOOLEAN, TRUE,
152       "width", G_TYPE_INT, videnc->rect.w,
153       "height", G_TYPE_INT, videnc->rect.h,
154       "framerate", GST_TYPE_FRACTION, GST_VIDEO_INFO_FPS_N (&state->info), GST_VIDEO_INFO_FPS_D (&state->info),
155       NULL);
156   ret = gst_pad_set_caps (GST_VIDEO_ENCODER_SRC_PAD (self), caps);
158   return ret;
161 static gboolean
162 gst_ducati_jpegenc_allocate_params (GstDucatiVidEnc *
163     videnc, gint params_sz, gint dynparams_sz, gint status_sz, gint inargs_sz,
164     gint outargs_sz)
166   return GST_DUCATIVIDENC_CLASS (parent_class)->allocate_params (videnc,
167       sizeof (IVIDENC2_Params), sizeof (IVIDENC2_DynamicParams),
168       sizeof (IVIDENC2_Status), sizeof (IVIDENC2_InArgs),
169       sizeof (IVIDENC2_OutArgs));