--- a/omx/gstomxmjpegdec.h +++ b/omx/gstomxmjpegdec.h @@ -45,6 +45,16 @@ struct _GstOMXMJPEGDec { GstOMXVideoDec parent; +#ifdef USE_OMX_TARGET_STARFIVE + //If container shows fps as public api, it won't work + //as GstBuffer containing pts/dts/duration and it will calculate fps in upstream. + //i.e. + //not works: + // gst-launch-1.0 -v filesrc location=xxx.mp4 ! qtdemux name=demux demux.video_0 ! jpegparse ! omxmjpegdec framerate=xxx ! kmssink driver-name=starfive force-modesetting=1 + //works: + // gst-launch-1.0 -v filesrc location=xxx.mjpeg ! jpegparse ! omxmjpegdec framerate=xxx ! kmssink driver-name=starfive force-modesetting=1 + gint framerate; +#endif }; struct _GstOMXMJPEGDecClass --- a/omx/gstomxmjpegdec.c +++ b/omx/gstomxmjpegdec.c @@ -28,16 +28,28 @@ GST_DEBUG_CATEGORY_STATIC (gst_omx_mjpeg_dec_debug_category); #define GST_CAT_DEFAULT gst_omx_mjpeg_dec_debug_category - +#ifdef USE_OMX_TARGET_STARFIVE +#define DEFAULT_FRAMERATE 0 +#endif /* prototypes */ static gboolean gst_omx_mjpeg_dec_is_format_change (GstOMXVideoDec * dec, GstOMXPort * port, GstVideoCodecState * state); static gboolean gst_omx_mjpeg_dec_set_format (GstOMXVideoDec * dec, GstOMXPort * port, GstVideoCodecState * state); - +#ifdef USE_OMX_TARGET_STARFIVE +static void gst_omx_mjpeg_dec_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_omx_mjpeg_dec_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); +#endif enum { +#ifdef USE_OMX_TARGET_STARFIVE + PROP_0, + PROP_FRAMERATE +#else PROP_0 +#endif }; /* class initialization */ @@ -54,11 +66,16 @@ { GstOMXVideoDecClass *videodec_class = GST_OMX_VIDEO_DEC_CLASS (klass); GstElementClass *element_class = GST_ELEMENT_CLASS (klass); - +#ifdef USE_OMX_TARGET_STARFIVE + GObjectClass *gobject_class = G_OBJECT_CLASS (videodec_class); +#endif videodec_class->is_format_change = GST_DEBUG_FUNCPTR (gst_omx_mjpeg_dec_is_format_change); videodec_class->set_format = GST_DEBUG_FUNCPTR (gst_omx_mjpeg_dec_set_format); - +#ifdef USE_OMX_TARGET_STARFIVE + gobject_class->set_property = GST_DEBUG_FUNCPTR (gst_omx_mjpeg_dec_set_property); + gobject_class->get_property = GST_DEBUG_FUNCPTR (gst_omx_mjpeg_dec_get_property); +#endif videodec_class->cdata.default_sink_template_caps = "image/jpeg, " "width=(int) [1,MAX], " "height=(int) [1,MAX]"; @@ -67,7 +84,16 @@ "Codec/Decoder/Video/Hardware", "Decode MJPEG video streams", "Sebastian Dröge "); - +#ifdef USE_OMX_TARGET_STARFIVE + g_object_class_install_property (gobject_class, PROP_FRAMERATE, + g_param_spec_int ("framerate", + "Framerate", + "Frames per second in raw stream.\n \ + Only workable for the container not exposing fps.\n\ + '0' means disabled.", + 0, G_MAXINT, + DEFAULT_FRAMERATE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); +#endif gst_omx_set_default_role (&videodec_class->cdata, "video_decoder.mjpeg"); } @@ -89,10 +115,53 @@ { gboolean ret; OMX_PARAM_PORTDEFINITIONTYPE port_def; +#ifdef USE_OMX_TARGET_STARFIVE + GstVideoInfo *info = &state->info; + GstOMXMJPEGDec * mjpeg_dec = GST_OMX_MJPEG_DEC (dec); + if (mjpeg_dec->framerate != DEFAULT_FRAMERATE) { + GST_DEBUG_OBJECT (dec, " change fps from %d/%d to %d/1" GST_PTR_FORMAT, info->fps_n, info->fps_d, mjpeg_dec->framerate); + info->fps_n = mjpeg_dec->framerate; + info->fps_d = 1; + if (state->caps) { + gst_caps_set_simple (state->caps, "framerate", GST_TYPE_FRACTION, info->fps_n, info->fps_d, NULL); + } + } +#endif gst_omx_port_get_port_definition (port, &port_def); port_def.format.video.eCompressionFormat = OMX_VIDEO_CodingMJPEG; ret = gst_omx_port_update_port_definition (port, &port_def) == OMX_ErrorNone; return ret; } +#ifdef USE_OMX_TARGET_STARFIVE +static void +gst_omx_mjpeg_dec_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstOMXMJPEGDec * mjpeg_dec = GST_OMX_MJPEG_DEC (object); + switch (prop_id) { + case PROP_FRAMERATE: + mjpeg_dec->framerate = g_value_get_int (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_omx_mjpeg_dec_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) +{ + GstOMXMJPEGDec * mjpeg_dec = GST_OMX_MJPEG_DEC (object); + switch (prop_id) { + case PROP_FRAMERATE: + g_value_set_int (value, mjpeg_dec->framerate); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} +#endif