playbin2 uses ducati for MJPEG/JPEG playback
authorSubhajit Paul <subhajit_paul@ti.com>
Thu, 13 Jun 2013 14:28:14 +0000 (19:58 +0530)
committerSubhajit Paul <subhajit_paul@ti.com>
Thu, 13 Jun 2013 14:28:14 +0000 (19:58 +0530)
Bugs fixed:
- larger files (> 4K x 4k) will still use jpegdec
- smaller files will use ducati, though nowhere to be displayed
- putting a jpegparse explicitly will not affect operation
- mjpeg is played using ducati in playbin2

src/gstducati.c
src/gstducatijpegdec.c
src/gstducatividdec.c

index bdd867fbfcaa968da241685ad3bdc9643d89fdcd..d14472d037e61462c36492af502fa7a5cc6e45a2 100644 (file)
@@ -76,7 +76,7 @@ plugin_init (GstPlugin * plugin)
       GST_TYPE_DUCATIMPEG2DEC) &&
       gst_element_register (plugin, "ducativc1dec", GST_RANK_PRIMARY,
       GST_TYPE_DUCATIVC1DEC) &&
-      gst_element_register (plugin, "ducatijpegdec", GST_RANK_PRIMARY,
+      gst_element_register (plugin, "ducatijpegdec", GST_RANK_PRIMARY + 1,
       GST_TYPE_DUCATIJPEGDEC) &&
       gst_element_register (plugin, "ducatih264enc", GST_RANK_PRIMARY + 1,
       GST_TYPE_DUCATIH264ENC) &&
index 2923d37bf0201ea49ffb383ad45fa6baa93c1ae9..768a5c9db77461da155f21c6217227d2fadcfd09 100644 (file)
@@ -44,8 +44,8 @@ static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink",
     GST_PAD_ALWAYS,
     GST_STATIC_CAPS ("image/jpeg, "
         "parsed = (boolean)true, "
-        "width = (int)[ 32, 2048 ], "
-        "height = (int)[ 32, 2048 ], " "framerate = (fraction)[ 0, max ];")
+        "width = (int)[ 32, 4096 ], "
+        "height = (int)[ 32, 4096 ], " "framerate = (fraction)[ 0, max ];")
     );
 
 /* GstDucatiVidDec vmethod implementations */
index f398b09620a805d6127b3de3f97b98c314718179..9078b37945bde8e51a1c12d923450d598bc6cd52 100644 (file)
@@ -1074,9 +1074,17 @@ gst_ducati_viddec_can_drop_frame (GstDucatiVidDec * self, GstBuffer * buf,
   return FALSE;
 }
 
+GstElement *parser = NULL;
+
 static GstFlowReturn
 gst_ducati_viddec_chain (GstPad * pad, GstBuffer * buf)
 {
+  GstElement *element = NULL;
+  GstElement *pipe = NULL;
+  GstPad *mypad = NULL;
+  GstPad *peerpad = NULL;
+  GstElement *peerelement = NULL;
+
   GstDucatiVidDec *self = GST_DUCATIVIDDEC (GST_OBJECT_PARENT (pad));
   GstClockTime ts = GST_BUFFER_TIMESTAMP (buf);
   GstFlowReturn ret = GST_FLOW_OK;
@@ -1085,6 +1093,40 @@ gst_ducati_viddec_chain (GstPad * pad, GstBuffer * buf)
   GstCaps *outcaps = NULL;
   gboolean decode;
 
+  *element = gst_pad_get_parent_element (pad);
+  pipe = GST_ELEMENT (gst_element_get_parent (element));
+  mypad = gst_element_get_static_pad (element, "sink");
+  peerpad = gst_pad_get_peer (mypad);
+  peerelement = gst_pad_get_parent_element (peerpad);
+  if (parser == NULL)
+    {
+      parser = gst_element_factory_make ("jpegparse", NULL);
+      if (parser == NULL)
+       {
+         goto normal;
+       }
+      if (gst_bin_add (GST_BIN (pipe), parser) == FALSE)
+       {
+         gst_object_unref (parser);
+         parser = NULL;
+         goto normal;
+       }
+      gst_element_set_state (parser, GST_STATE_PAUSED);
+      gst_element_unlink (peerelement, element);
+      gst_element_link (parser, element);
+      if (FALSE == gst_element_link (peerelement, parser))
+       {
+         gst_element_set_state (parser, GST_STATE_NULL);
+         gst_element_unlink (parser, element);
+         gst_element_link (peerelement, element);
+         gst_bin_remove (GST_BIN (pipe), parser);
+         goto normal;
+       }
+      gst_pad_chain (gst_element_get_static_pad (parser, "sink"), buf);
+      return GST_FLOW_OK;
+    }
+
+normal:
   if (G_UNLIKELY (!self->engine)) {
     GST_ERROR_OBJECT (self, "no engine");
     gst_buffer_unref (buf);