From: <al...@fr...> - 2005-07-19 20:51:31
|
CVS Root: /cvs/gstreamer Module: gst-plugins Changes by: alima Date: Tue Jul 19 2005 13:51:28 PDT Log message: Ported to 0.9 (faad, amrnb, mpeg2dec) Modified files: . : configure.ac ext : Makefile.am ext/amrnb : amrnbdec.c amrnbenc.c amrnbparse.c ext/faad : gstfaad.c ext/mpeg2dec : gstmpeg2dec.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/configure.ac.diff?r1=1.563&r2=1.564 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/ext/Makefile.am.diff?r1=1.134&r2=1.135 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/ext/amrnb/amrnbdec.c.diff?r1=1.3&r2=1.4 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/ext/amrnb/amrnbenc.c.diff?r1=1.2&r2=1.3 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/ext/amrnb/amrnbparse.c.diff?r1=1.3&r2=1.4 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/ext/faad/gstfaad.c.diff?r1=1.27&r2=1.28 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/ext/mpeg2dec/gstmpeg2dec.c.diff?r1=1.84&r2=1.85 ====Begin Diffs==== Index: configure.ac =================================================================== RCS file: /cvs/gstreamer/gst-plugins/configure.ac,v retrieving revision 1.563 retrieving revision 1.564 diff -u -d -r1.563 -r1.564 --- configure.ac 18 Jul 2005 15:44:48 -0000 1.563 +++ configure.ac 19 Jul 2005 20:51:15 -0000 1.564 @@ -378,6 +378,50 @@ AS_SCRUB_INCLUDE(AALIB_CFLAGS) ]) +dnl *** AMR-NB *** +translit(dnm, m, l) AM_CONDITIONAL(USE_AMRNB, true) +GST_CHECK_FEATURE(AMRNB, [AMR-NB], amrnbdec amrnbenc, [ + GST_CHECK_LIBHEADER(AMRNB, amrnb, + Decoder_Interface_init, -lm, + amrnb/interf_dec.h, + AMRNB_LIBS="-lamrnb -lm" + AC_SUBST(AMRNB_LIBS)) +]) + +dnl **** Free AAC Decoder (FAAD) **** +translit(dnm, m, l) AM_CONDITIONAL(USE_FAAD, true) +GST_CHECK_FEATURE(FAAD, [AAC decoder plug-in], faad, [ + HAVE_FAAD="yes" + GST_CHECK_LIBHEADER(FAAD, faad, faacDecOpen, -lm, faad.h, FAAD_LIBS="-lfaad -lm", HAVE_FAAD="no") + if test $HAVE_FAAD = "yes"; then + AC_MSG_CHECKING([Checking for FAAD >= 2]) + AC_TRY_RUN([ +#include <faad.h> +#if !defined(FAAD2_VERSION) || !defined(FAAD_FMT_DOUBLE) +#error Not faad2 +#else +#include <string.h> +int main() +{ +char version[9] = FAAD2_VERSION; +// a release candidate of 2.0 is not enought for us +if ( strstr( version, "2.0 RC" ) ) { return 1; } +return 0; +} +#endif + ], + [ HAVE_FAAD="yes" && AC_MSG_RESULT(yes)], + [ HAVE_FAAD="no" && AC_MSG_RESULT(no)]) + fi; + AS_SCRUB_INCLUDE(FAAD_CFLAGS) + AC_SUBST(FAAD_LIBS) dnl *** libcaca *** translit(dnm, m, l) AM_CONDITIONAL(USE_LIBCACA, true) GST_CHECK_FEATURE(LIBCACA, [libcaca], libcaca, [ @@ -434,6 +478,15 @@ AC_SUBST(MAD_LIBS) +dnl *** mpeg2dec *** +translit(dnm, m, l) AM_CONDITIONAL(USE_MPEG2DEC, true) +GST_CHECK_FEATURE(MPEG2DEC, [mpeg2dec], mpeg2dec, [ + PKG_CHECK_MODULES(MPEG2DEC, libmpeg2 >= 0.4.0, + HAVE_MPEG2DEC="yes", HAVE_MPEG2DEC="no") + AC_SUBST(MPEG2DEC_CFLAGS) + AC_SUBST(MPEG2DEC_LIBS) dnl *** dv1394 *** translit(dnm, m, l) AM_CONDITIONAL(USE_DV1394, true) GST_CHECK_FEATURE(DV1394, [raw1394 and avc1394 library], dv1394src, [ @@ -555,6 +608,9 @@ ext/shout2/Makefile ext/sidplay/Makefile ext/esd/Makefile +ext/mpeg2dec/Makefile +ext/faad/Makefile +ext/amrnb/Makefile po/Makefile.in common/Makefile common/m4/Makefile Index: Makefile.am RCS file: /cvs/gstreamer/gst-plugins/ext/Makefile.am,v retrieving revision 1.134 retrieving revision 1.135 diff -u -d -r1.134 -r1.135 --- Makefile.am 19 Jul 2005 11:14:39 -0000 1.134 +++ Makefile.am 19 Jul 2005 20:51:15 -0000 1.135 @@ -10,11 +10,11 @@ AALIB_DIR= endif -# if USE_AMRNB -# AMRNB_DIR=amrnb -# else -AMRNB_DIR= -# endif +if USE_AMRNB + AMRNB_DIR=amrnb +else + AMRNB_DIR= +endif # if USE_ARTS # ARTS_DIR=arts @@ -106,11 +106,11 @@ FAAC_DIR= # endif -# if USE_FAAD -# FAAD_DIR=faad -FAAD_DIR= +if USE_FAAD + FAAD_DIR=faad + FAAD_DIR= ## if USE_FESTIVAL ## FESTIVAL_DIR=festival @@ -238,11 +238,11 @@ MIKMOD_DIR= -# if USE_MPEG2DEC -# MPEG2DEC_DIR=mpeg2dec -MPEG2DEC_DIR= -#endif +if USE_MPEG2DEC + MPEG2DEC_DIR=mpeg2dec + MPEG2DEC_DIR= # if USE_MPEG2ENC # MPEG2ENC_DIR=mpeg2enc @@ -440,4 +440,7 @@ libcaca \ esd \ raw1394 \ - dv + dv \ + amrnb \ + faad \ + mpeg2dec Index: amrnbdec.c RCS file: /cvs/gstreamer/gst-plugins/ext/amrnb/amrnbdec.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- amrnbdec.c 25 May 2005 12:55:50 -0000 1.3 +++ amrnbdec.c 19 Jul 2005 20:51:15 -0000 1.4 @@ -206,7 +206,7 @@ (amrnbdec->rate * amrnbdec->channels); GST_BUFFER_TIMESTAMP (out) = amrnbdec->ts; amrnbdec->ts += GST_BUFFER_DURATION (out); - gst_buffer_set_caps (out, GST_RPAD_CAPS (amrnbdec->srcpad)); + gst_buffer_set_caps (out, gst_pad_get_caps (amrnbdec->srcpad)); /* decode */ Decoder_Interface_Decode (amrnbdec->handle, data, Index: amrnbenc.c RCS file: /cvs/gstreamer/gst-plugins/ext/amrnb/amrnbenc.c,v retrieving revision 1.2 diff -u -d -r1.2 -r1.3 --- amrnbenc.c 25 May 2005 12:55:50 -0000 1.2 +++ amrnbenc.c 19 Jul 2005 20:51:15 -0000 1.3 @@ -213,7 +213,7 @@ (amrnbenc->rate * amrnbenc->channels); GST_BUFFER_TIMESTAMP (out) = amrnbenc->ts; amrnbenc->ts += GST_BUFFER_DURATION (out); - gst_buffer_set_caps (out, GST_RPAD_CAPS (amrnbenc->srcpad)); + gst_buffer_set_caps (out, gst_pad_get_caps (amrnbenc->srcpad)); data = (guint8 *) gst_adapter_peek (amrnbenc->adapter, 320); Index: amrnbparse.c RCS file: /cvs/gstreamer/gst-plugins/ext/amrnb/amrnbparse.c,v --- amrnbparse.c 25 May 2005 12:55:50 -0000 1.3 +++ amrnbparse.c 19 Jul 2005 20:51:15 -0000 1.4 @@ -56,8 +56,7 @@ static gboolean gst_amrnbparse_event (GstPad * pad, GstEvent * event); static GstFlowReturn gst_amrnbparse_chain (GstPad * pad, GstBuffer * buffer); static void gst_amrnbparse_loop (GstPad * pad); -static gboolean gst_amrnbparse_sink_activate (GstPad * sinkpad, - GstActivateMode mode); +static gboolean gst_amrnbparse_sink_activate (GstPad * sinkpad); static GstElementStateReturn gst_amrnbparse_state_change (GstElement * element); static GstElementClass *parent_class = NULL; @@ -130,10 +129,11 @@ GST_DEBUG_FUNCPTR (gst_amrnbparse_chain)); gst_pad_set_event_function (amrnbparse->sinkpad, GST_DEBUG_FUNCPTR (gst_amrnbparse_event)); - gst_pad_set_loop_function (amrnbparse->sinkpad, +/* gst_pad_set_loop_function (amrnbparse->sinkpad, GST_DEBUG_FUNCPTR (gst_amrnbparse_loop)); +*/ gst_pad_set_activate_function (amrnbparse->sinkpad, - GST_DEBUG_FUNCPTR (gst_amrnbparse_sink_activate)); + gst_amrnbparse_sink_activate); gst_element_add_pad (GST_ELEMENT (amrnbparse), amrnbparse->sinkpad); /* create the src pad */ @@ -174,7 +174,6 @@ { static const GstQueryType list[] = { GST_QUERY_POSITION, - GST_QUERY_TOTAL, 0 }; @@ -260,7 +259,7 @@ GstAmrnbParse *amrnbparse; GstFlowReturn res; - gint block, mode, read; + gint block, mode; const guint8 *data; GstBuffer *out; @@ -365,7 +364,7 @@ GstBuffer *buffer; guint8 *data; gint size; GstFlowReturn ret; amrnbparse = GST_AMRNBPARSE (GST_PAD_PARENT (pad)); @@ -438,20 +437,25 @@ } static gboolean -gst_amrnbparse_sink_activate (GstPad * sinkpad, GstActivateMode mode) +gst_amrnbparse_sink_activate (GstPad * sinkpad) gboolean result = FALSE; + GstActivateMode mode; amrnbparse = GST_AMRNBPARSE (GST_OBJECT_PARENT (sinkpad)); + GST_LOCK (sinkpad); + mode = GST_PAD_ACTIVATE_MODE (sinkpad); + GST_UNLOCK (sinkpad); switch (mode) { case GST_ACTIVATE_PUSH: amrnbparse->seekable = FALSE; result = TRUE; break; case GST_ACTIVATE_PULL: - gst_pad_peer_set_active (sinkpad, mode); + /*gst_pad_peer_set_active (sinkpad, mode); */ amrnbparse->need_header = TRUE; amrnbparse->seekable = TRUE; Index: gstfaad.c RCS file: /cvs/gstreamer/gst-plugins/ext/faad/gstfaad.c,v retrieving revision 1.27 retrieving revision 1.28 diff -u -d -r1.27 -r1.28 --- gstfaad.c 21 Feb 2005 18:58:46 -0000 1.27 +++ gstfaad.c 19 Jul 2005 20:51:15 -0000 1.28 @@ -79,12 +79,15 @@ static void gst_faad_class_init (GstFaadClass * klass); static void gst_faad_init (GstFaad * faad); +/* static GstPadLinkReturn gst_faad_sinkconnect (GstPad * pad, const GstCaps * caps); -gst_faad_srcconnect (GstPad * pad, const GstCaps * caps); +gst_faad_srcconnect (GstPad * pad, const GstCaps * caps);*/ +static gboolean gst_faad_setcaps (GstPad * pad, GstCaps * caps); static GstCaps *gst_faad_srcgetcaps (GstPad * pad); -static void gst_faad_chain (GstPad * pad, GstData * data); +static gboolean gst_faad_event (GstPad * pad, GstEvent * event); +static GstFlowReturn gst_faad_chain (GstPad * pad, GstBuffer * buffer); static GstElementStateReturn gst_faad_change_state (GstElement * element); @@ -155,28 +158,59 @@ faad->channel_positions = NULL; faad->init = FALSE; - GST_FLAG_SET (faad, GST_ELEMENT_EVENT_AWARE); + /* GST_FLAG_SET (faad, GST_ELEMENT_EVENT_AWARE); */ faad->sinkpad = gst_pad_new_from_template (gst_static_pad_template_get (&sink_template), "sink"); gst_element_add_pad (GST_ELEMENT (faad), faad->sinkpad); + gst_pad_set_event_function (faad->sinkpad, gst_faad_event); + gst_pad_set_setcaps_function (faad->sinkpad, gst_faad_setcaps); gst_pad_set_chain_function (faad->sinkpad, gst_faad_chain); - gst_pad_set_link_function (faad->sinkpad, gst_faad_sinkconnect); + /*gst_pad_set_link_function (faad->sinkpad, gst_faad_sinkconnect); */ faad->srcpad = gst_pad_new_from_template (gst_static_pad_template_get (&src_template), "src"); gst_element_add_pad (GST_ELEMENT (faad), faad->srcpad); - gst_pad_set_link_function (faad->srcpad, gst_faad_srcconnect); - + gst_pad_use_fixed_caps (faad->srcpad); + /*gst_pad_set_link_function (faad->srcpad, gst_faad_srcconnect); */ gst_pad_set_getcaps_function (faad->srcpad, gst_faad_srcgetcaps); +static gboolean +gst_faad_setcaps (GstPad * pad, GstCaps * caps) + GstStructure *structure; + GstFaad *faad; + GstCaps *copy; + faad = GST_FAAD (GST_PAD_PARENT (pad)); + structure = gst_caps_get_structure (caps, 0); + /* get channel count */ + gst_structure_get_int (structure, "channels", &faad->channels); + gst_structure_get_int (structure, "rate", &faad->samplerate); + /* create reverse caps */ + copy = gst_caps_new_simple ("audio/x-raw-float", + "channels", G_TYPE_INT, faad->channels, + "depth", G_TYPE_INT, G_STRINGIFY (bpp), + "endianness", G_TYPE_INT, G_BYTE_ORDER, + "rate", G_TYPE_INT, faad->samplerate); + gst_pad_set_caps (faad->srcpad, copy); + gst_caps_unref (copy); + return TRUE; /* * Channel identifier conversion - caller g_free()s result! */ static guchar * gst_faad_chanpos_from_gst (GstAudioChannelPosition * pos, guint num) @@ -223,7 +257,7 @@ return fpos; static GstAudioChannelPosition * gst_faad_chanpos_to_gst (guchar * fpos, guint num) @@ -274,6 +308,7 @@ return pos; gst_faad_sinkconnect (GstPad * pad, const GstCaps * caps) @@ -282,18 +317,18 @@ const GValue *value; GstBuffer *buf; - /* Assume raw stream */ + // Assume raw stream faad->packetised = FALSE; if ((value = gst_structure_get_value (str, "codec_data"))) { gulong samplerate; guchar channels; - /* We have codec data, means packetised stream */ + // We have codec data, means packetised stream faad->packetised = TRUE; buf = g_value_get_boxed (value); - /* someone forgot that char can be unsigned when writing the API */ + // someone forgot that char can be unsigned when writing the API if ((gint8) faacDecInit2 (faad->handle, GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf), &samplerate, &channels) < 0) return GST_PAD_LINK_REFUSED; @@ -312,11 +347,11 @@ faad->need_channel_setup = TRUE; - /* if there's no decoderspecificdata, it's all fine. We cannot know - * much more at this point... */ + // if there's no decoderspecificdata, it's all fine. We cannot know + // * much more at this point... return GST_PAD_LINK_OK; static GstCaps * gst_faad_srcgetcaps (GstPad * pad) @@ -395,7 +430,7 @@ if (faad->channels != -1) { gst_structure_set (str, "channels", G_TYPE_INT, faad->channels, NULL); - /* put channel information here */ + // put channel information here */ if (faad->channel_positions) { GstAudioChannelPosition *pos; @@ -437,6 +472,7 @@ return templ; +/** gst_faad_srcconnect (GstPad * pad, const GstCaps * caps) @@ -455,15 +491,15 @@ mimetype = gst_structure_get_name (structure); - /* Samplerate and channels are normally provided through - * the getcaps function */ + // Samplerate and channels are normally provided through + // * the getcaps function if (!gst_structure_get_int (structure, "channels", &channels) || !gst_structure_get_int (structure, "rate", &rate) || rate != faad->samplerate || channels != faad->channels) { return GST_PAD_LINK_REFUSED; } - /* Another internal checkup. */ + // Another internal checkup. if (faad->need_channel_setup) { GstAudioChannelPosition *pos; guchar *fpos; @@ -533,28 +569,55 @@ if (faacDecSetConfiguration (faad->handle, conf) == 0) - /* FIXME: handle return value, how? */ + // FIXME: handle return value, how? faad->bps = depth / 8; return GST_PAD_LINK_OK; return GST_PAD_LINK_REFUSED; +}*/ + * Data reading. + */ +gst_faad_event (GstPad * pad, GstEvent * event) + gboolean res; + faad = GST_FAAD (gst_pad_get_parent (pad)); + GST_LOG ("handling event %d", GST_EVENT_TYPE (event)); + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_EOS: + case GST_EVENT_DISCONTINUOUS: + default: + break; + } + res = gst_pad_event_default (faad->sinkpad, event); + return res; -static void -gst_faad_chain (GstPad * pad, GstData * data) +static GstFlowReturn +gst_faad_chain (GstPad * pad, GstBuffer * buffer) + GstFlowReturn ret = GST_FLOW_OK; guint input_size; guint skip_bytes = 0; guchar *input_data; GstFaad *faad = GST_FAAD (gst_pad_get_parent (pad)); - GstBuffer *buf, *outbuf; + GstBuffer *outbuf; faacDecFrameInfo *info; guint64 next_ts; void *out; gboolean run_loop = TRUE; if (GST_IS_EVENT (data)) { GstEvent *event = GST_EVENT (data); @@ -572,14 +635,14 @@ return; } info = g_new0 (faacDecFrameInfo, 1); /* buffer + remaining data */ - buf = GST_BUFFER (data); - next_ts = GST_BUFFER_TIMESTAMP (buf); + /* buf = GST_BUFFER (data); */ + next_ts = GST_BUFFER_TIMESTAMP (buffer); if (faad->tempbuf) { - buf = gst_buffer_join (faad->tempbuf, buf); + buffer = gst_buffer_join (faad->tempbuf, buffer); faad->tempbuf = NULL; @@ -590,11 +653,12 @@ glong init_res; init_res = faacDecInit (faad->handle, - GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf), &samplerate, &channels); + GST_BUFFER_DATA (buffer), GST_BUFFER_SIZE (buffer), &samplerate, + &channels); if (init_res < 0) { GST_ELEMENT_ERROR (faad, STREAM, DECODE, (NULL), ("Failed to init decoder from stream")); - return; + return GST_FLOW_UNEXPECTED; skip_bytes = init_res; faad->init = TRUE; @@ -609,8 +673,8 @@ /* decode cycle */ - input_data = GST_BUFFER_DATA (buf); - input_size = GST_BUFFER_SIZE (buf); + input_data = GST_BUFFER_DATA (buffer); + input_size = GST_BUFFER_SIZE (buffer); info->bytesconsumed = input_size - skip_bytes; if (!faad->packetised) { @@ -660,7 +724,7 @@ } if (fmt_change) { - GstPadLinkReturn ret; + /*GstPadLinkReturn ret; */ /* store new negotiation information */ faad->samplerate = info->samplerate; @@ -671,12 +735,12 @@ memcpy (faad->channel_positions, info->channel_position, faad->channels); - /* and negotiate */ - ret = gst_pad_renegotiate (faad->srcpad); - if (GST_PAD_LINK_FAILED (ret)) { - GST_ELEMENT_ERROR (faad, CORE, NEGOTIATION, (NULL), (NULL)); - break; - } + /* and negotiate + ret = gst_pad_renegotiate (faad->srcpad); + if (GST_PAD_LINK_FAILED (ret)) { + GST_ELEMENT_ERROR (faad, CORE, NEGOTIATION, (NULL), (NULL)); + break; + } */ /* play decoded data */ @@ -690,25 +754,27 @@ if (GST_CLOCK_TIME_IS_VALID (next_ts)) { next_ts += GST_BUFFER_DURATION (outbuf); } - gst_pad_push (faad->srcpad, GST_DATA (outbuf)); + gst_pad_push (faad->srcpad, outbuf); /* Keep the leftovers in raw stream */ if (input_size > 0 && !faad->packetised) { - if (input_size < GST_BUFFER_SIZE (buf)) { - faad->tempbuf = gst_buffer_create_sub (buf, - GST_BUFFER_SIZE (buf) - input_size, input_size); + if (input_size < GST_BUFFER_SIZE (buffer)) { + faad->tempbuf = gst_buffer_create_sub (buffer, + GST_BUFFER_SIZE (buffer) - input_size, input_size); } else { - faad->tempbuf = buf; - gst_buffer_ref (buf); + faad->tempbuf = buffer; + gst_buffer_ref (buffer); - gst_buffer_unref (buf); + gst_buffer_unref (buffer); g_free (info); + return ret; static GstElementStateReturn @@ -758,8 +824,7 @@ plugin_init (GstPlugin * plugin) - return gst_library_load ("gstaudio") && - gst_element_register (plugin, "faad", GST_RANK_PRIMARY, GST_TYPE_FAAD); + return gst_element_register (plugin, "faad", GST_RANK_PRIMARY, GST_TYPE_FAAD); GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, Index: gstmpeg2dec.c RCS file: /cvs/gstreamer/gst-plugins/ext/mpeg2dec/gstmpeg2dec.c,v retrieving revision 1.84 retrieving revision 1.85 diff -u -d -r1.84 -r1.85 --- gstmpeg2dec.c 5 Jul 2005 10:51:31 -0000 1.84 +++ gstmpeg2dec.c 19 Jul 2005 20:51:16 -0000 1.85 @@ -28,7 +28,7 @@ /* mpeg2dec changed a struct name after 0.3.1, here's a workaround */ /* mpeg2dec also only defined MPEG2_RELEASE after 0.3.1 -#if MPEG2_RELEASE < MPEG2_VERSION(0,3,2) + #if MPEG2_RELEASE < MPEG2_VERSION(0,3,2) */ #ifndef MPEG2_RELEASE #define MPEG2_VERSION(a,b,c) ((((a)&0xff)<<16)|(((b)&0xff)<<8)|((c)&0xff)) @@ -158,22 +158,31 @@ static void gst_mpeg2dec_set_index (GstElement * element, GstIndex * index); static GstIndex *gst_mpeg2dec_get_index (GstElement * element); -static const GstFormat *gst_mpeg2dec_get_src_formats (GstPad * pad); -static const GstEventMask *gst_mpeg2dec_get_src_event_masks (GstPad * pad); static gboolean gst_mpeg2dec_src_event (GstPad * pad, GstEvent * event); static const GstQueryType *gst_mpeg2dec_get_src_query_types (GstPad * pad); -static gboolean gst_mpeg2dec_src_query (GstPad * pad, GstQueryType type, - GstFormat * format, gint64 * value); -static const GstFormat *gst_mpeg2dec_get_sink_formats (GstPad * pad); -static gboolean gst_mpeg2dec_convert_sink (GstPad * pad, GstFormat src_format, +static gboolean gst_mpeg2dec_src_query (GstPad * pad, GstQuery * query); +static gboolean gst_mpeg2dec_sink_convert (GstPad * pad, GstFormat src_format, gint64 src_value, GstFormat * dest_format, gint64 * dest_value); -static gboolean gst_mpeg2dec_convert_src (GstPad * pad, GstFormat src_format, +static gboolean gst_mpeg2dec_src_convert (GstPad * pad, GstFormat src_format, static GstElementStateReturn gst_mpeg2dec_change_state (GstElement * element); -static void gst_mpeg2dec_chain (GstPad * pad, GstData * _data); +static gboolean gst_mpeg2dec_sink_event (GstPad * pad, GstEvent * event); +static GstFlowReturn gst_mpeg2dec_chain (GstPad * pad, GstBuffer * buf); +//static gboolean gst_mpeg2dec_sink_query (GstPad * pad, GstQuery * query); +static GstCaps *gst_mpeg2dec_src_getcaps (GstPad * pad); +#if 0 +static const GstFormat *gst_mpeg2dec_get_formats (GstPad * pad); +static const GstEventMask *gst_mpeg2dec_get_event_masks (GstPad * pad); @@ -260,26 +269,21 @@ gst_element_add_pad (GST_ELEMENT (mpeg2dec), mpeg2dec->sinkpad); gst_pad_set_chain_function (mpeg2dec->sinkpad, GST_DEBUG_FUNCPTR (gst_mpeg2dec_chain)); - gst_pad_set_formats_function (mpeg2dec->sinkpad, - GST_DEBUG_FUNCPTR (gst_mpeg2dec_get_sink_formats)); - gst_pad_set_convert_function (mpeg2dec->sinkpad, - GST_DEBUG_FUNCPTR (gst_mpeg2dec_convert_sink)); + //gst_pad_set_query_function (mpeg2dec->sinkpad, + // GST_DEBUG_FUNCPTR (gst_mpeg2dec_get_sink_query)); + gst_pad_set_event_function (mpeg2dec->sinkpad, + GST_DEBUG_FUNCPTR (gst_mpeg2dec_sink_event)); mpeg2dec->srcpad = gst_pad_new_from_template (src_templ (), "src"); gst_element_add_pad (GST_ELEMENT (mpeg2dec), mpeg2dec->srcpad); - gst_pad_use_explicit_caps (mpeg2dec->srcpad); - gst_pad_set_formats_function (mpeg2dec->srcpad, - GST_DEBUG_FUNCPTR (gst_mpeg2dec_get_src_formats)); - gst_pad_set_event_mask_function (mpeg2dec->srcpad, - GST_DEBUG_FUNCPTR (gst_mpeg2dec_get_src_event_masks)); + gst_pad_set_getcaps_function (mpeg2dec->srcpad, + GST_DEBUG_FUNCPTR (gst_mpeg2dec_src_getcaps)); gst_pad_set_event_function (mpeg2dec->srcpad, GST_DEBUG_FUNCPTR (gst_mpeg2dec_src_event)); gst_pad_set_query_type_function (mpeg2dec->srcpad, GST_DEBUG_FUNCPTR (gst_mpeg2dec_get_src_query_types)); gst_pad_set_query_function (mpeg2dec->srcpad, GST_DEBUG_FUNCPTR (gst_mpeg2dec_src_query)); - gst_pad_set_convert_function (mpeg2dec->srcpad, - GST_DEBUG_FUNCPTR (gst_mpeg2dec_convert_src)); #ifdef enable_user_data mpeg2dec->userdatapad = @@ -297,7 +301,6 @@ for (i = 0; i < GST_MPEG2DEC_NUM_BUFS; i++) mpeg2dec->buffers[i] = NULL; - GST_FLAG_SET (GST_ELEMENT (mpeg2dec), GST_ELEMENT_EVENT_AWARE); static void @@ -342,7 +345,7 @@ mpeg2dec->segment_end = -1; mpeg2dec->discont_state = MPEG2DEC_DISC_NEW_PICTURE; mpeg2dec->frame_period = 0; - gst_pad_set_explicit_caps (mpeg2dec->srcpad, NULL); + gst_pad_use_fixed_caps (mpeg2dec->srcpad); gst_mpeg2dec_open_decoder (mpeg2dec); mpeg2dec->need_sequence = TRUE; @@ -436,13 +439,13 @@ /*We crop only if the target region is smaller than the input one */ if ((mpeg2dec->decoded_width > mpeg2dec->width) || (mpeg2dec->decoded_height > mpeg2dec->height)) { - /* If we don't know about the format, we just return the original + /* If we don't know about the format, we just return the original * buffer. */ if (mpeg2dec->format == MPEG2DEC_FORMAT_I422 || mpeg2dec->format == MPEG2DEC_FORMAT_I420 || mpeg2dec->format == MPEG2DEC_FORMAT_YV12) { - /*FIXME: I have tried to use gst_buffer_copy_on_write, but it + /*FIXME: I have tried to use gst_buffer_copy_on_write, but it * still have some artifact, so I'me allocating new buffer * for each frame decoded... */ @@ -498,61 +501,93 @@ GstBuffer *outbuf = NULL; gint size = mpeg2dec->decoded_width * mpeg2dec->decoded_height; - guint8 *buf[3], *out; - if (mpeg2dec->format == MPEG2DEC_FORMAT_I422) { - outbuf = - gst_pad_alloc_buffer (mpeg2dec->srcpad, GST_BUFFER_OFFSET_NONE, - size * 2); - if (!outbuf) { - GST_ELEMENT_ERROR (mpeg2dec, RESOURCE, FAILED, (NULL), - ("Failed to allocate memory for buffer")); - return NULL; - } + guint8 *buf[3], *out = NULL; - out = GST_BUFFER_DATA (outbuf); + do { - buf[0] = out; - buf[1] = buf[0] + size; - buf[2] = buf[1] + size / 2; + if (mpeg2dec->format == MPEG2DEC_FORMAT_I422) { + ret = + gst_pad_alloc_buffer (mpeg2dec->srcpad, GST_BUFFER_OFFSET_NONE, + size * 2, GST_PAD_CAPS (mpeg2dec->srcpad), &outbuf); + if (ret != GST_FLOW_OK) { + GST_ELEMENT_ERROR (mpeg2dec, RESOURCE, FAILED, (NULL), + ("Failed to allocate memory for buffer")); + break; + } + /* 0.9 + outbuf = + gst_pad_alloc_buffer (mpeg2dec->srcpad, GST_BUFFER_OFFSET_NONE, + size * 2); - } else { - (size * 3) / 2); + if (!outbuf) { + GST_ELEMENT_ERROR (mpeg2dec, RESOURCE, FAILED, (NULL), + ("Failed to allocate memory for buffer")); + return NULL; + } + */ + out = GST_BUFFER_DATA (outbuf); - if (mpeg2dec->format == MPEG2DEC_FORMAT_I420) { buf[0] = out; buf[1] = buf[0] + size; - buf[2] = buf[1] + size / 4; + buf[2] = buf[1] + size / 2; + (size * 3) / 2); - buf[2] = buf[0] + size; - buf[1] = buf[2] + size / 4; + if (mpeg2dec->format == MPEG2DEC_FORMAT_I420) { + buf[0] = out; + buf[1] = buf[0] + size; + buf[2] = buf[1] + size / 4; + } else { + buf[2] = buf[0] + size; + buf[1] = buf[2] + size / 4; - } - if (!put_buffer (mpeg2dec, outbuf)) { + if (!put_buffer (mpeg2dec, outbuf)) { #if 0 - GST_ELEMENT_ERROR (mpeg2dec, LIBRARY, TOO_LAZY, (NULL), - ("No free slot. libmpeg2 did not discard buffers.")); + GST_ELEMENT_ERROR (mpeg2dec, LIBRARY, TOO_LAZY, (NULL), + ("No free slot. libmpeg2 did not discard buffers.")); #else - GST_WARNING_OBJECT (mpeg2dec, - "No free slot. libmpeg2 did not discard buffers."); + GST_WARNING_OBJECT (mpeg2dec, + "No free slot. libmpeg2 did not discard buffers."); #endif - return NULL; + return NULL; + } - mpeg2_custom_fbuf (mpeg2dec->decoder, 1); - mpeg2_set_buf (mpeg2dec->decoder, buf, outbuf); + mpeg2_custom_fbuf (mpeg2dec->decoder, 1); + mpeg2_set_buf (mpeg2dec->decoder, buf, outbuf); - /* we store the original byteoffset of this picture in the stream here - * because we need it for indexing */ - GST_BUFFER_OFFSET (outbuf) = offset; + /* we store the original byteoffset of this picture in the stream here + * because we need it for indexing */ + GST_BUFFER_OFFSET (outbuf) = offset; + while (FALSE); + if (ret != GST_FLOW_OK) { + outbuf = NULL; /* just to asure NULL return, looking the path + above it happens only when gst_pad_alloc_buffer + fails to alloc outbf */ return outbuf; @@ -562,7 +597,7 @@ GstCaps *caps; guint32 fourcc, myFourcc; - gboolean ret; + gboolean ret = TRUE; const mpeg2_info_t *info; const mpeg2_sequence_t *sequence; @@ -593,7 +628,8 @@ mpeg2dec->pixel_height, "framerate", G_TYPE_DOUBLE, mpeg2dec->frame_rate, NULL); - ret = gst_pad_set_explicit_caps (mpeg2dec->srcpad, caps); + // ret = gst_pad_set_explicit_caps (mpeg2dec->srcpad, caps); + ret = gst_pad_set_caps (mpeg2dec->srcpad, caps); if (!ret) return FALSE; @@ -721,7 +757,8 @@ GST_DEBUG_OBJECT (mpeg2dec, "picture keyframe %d", key_frame); if (key_frame) { - GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_KEY_UNIT); + /* not need for decode GST_BUFFER_FLAG_UNSET (outbuf, GST_BUFFER_DELTA_UNIT); */ + /* 0.9 GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_KEY_UNIT); */ if (mpeg2dec->discont_state == MPEG2DEC_DISC_NEW_KEYFRAME && key_frame) mpeg2dec->discont_state = MPEG2DEC_DISC_NONE; @@ -776,7 +813,7 @@ GST_DEBUG_OBJECT (mpeg2dec, "dropping buffer because of skip flag"); gst_buffer_unref (outbuf); } else if (!GST_PAD_IS_USABLE (mpeg2dec->srcpad) - || !gst_pad_is_negotiated (mpeg2dec->srcpad)) { + || gst_pad_get_negotiated_caps (mpeg2dec->srcpad) == NULL) { GST_DEBUG_OBJECT (mpeg2dec, "dropping buffer, pad not usable"); } else if (mpeg2dec->discont_state != MPEG2DEC_DISC_NONE) { @@ -805,11 +842,13 @@ if (info->current_picture && (info->current_picture->flags & PIC_MASK_CODING_TYPE) == PIC_FLAG_CODING_TYPE_I) { - GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_KEY_UNIT); + /* not need for decode GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_DELTA_UNIT); */ + /* 0.9 GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_KEY_UNIT); */ } else { - GST_BUFFER_FLAG_UNSET (outbuf, GST_BUFFER_KEY_UNIT); + /* 0.9 GST_BUFFER_FLAG_UNSET (outbuf, GST_BUFFER_KEY_UNIT); */ - gst_pad_push (mpeg2dec->srcpad, GST_DATA (outbuf)); + gst_pad_push (mpeg2dec->srcpad, GST_BUFFER (outbuf)); } else if (info->display_fbuf && !info->display_fbuf->id) { GST_ELEMENT_ERROR (mpeg2dec, LIBRARY, TOO_LAZY, (NULL), @@ -926,11 +965,11 @@ -gst_mpeg2dec_chain (GstPad * pad, GstData * _data) +gst_mpeg2dec_chain (GstPad * pad, GstBuffer * buf) - GstBuffer *buf = GST_BUFFER (_data); - GstMpeg2dec *mpeg2dec = GST_MPEG2DEC (gst_pad_get_parent (pad)); + /* 0.9 GstBuffer *buf = GST_BUFFER (_data); */ + GstMpeg2dec *mpeg2dec = GST_MPEG2DEC (GST_PAD_PARENT (pad)); guint32 size; guint8 *data, *end; GstClockTime pts; @@ -938,54 +977,7 @@ mpeg2_state_t state; gboolean done = FALSE; - if (GST_IS_EVENT (buf)) { - GstEvent *event = GST_EVENT (buf); - switch (GST_EVENT_TYPE (event)) { - case GST_EVENT_DISCONTINUOUS: - { - GstClockTime time; - if (!gst_event_discont_get_value (event, GST_FORMAT_TIME, &time) - || !GST_CLOCK_TIME_IS_VALID (time)) { - GST_WARNING_OBJECT (mpeg2dec, - "No new time offset in discont event %p", event); - } else { - mpeg2dec->next_time = time; - GST_DEBUG_OBJECT (mpeg2dec, - "discont, reset next_time to %" G_GUINT64_FORMAT " (%" - GST_TIME_FORMAT ")", mpeg2dec->next_time, - GST_TIME_ARGS (mpeg2dec->next_time)); - if (GST_EVENT_DISCONT_NEW_MEDIA (event)) { - gst_mpeg2dec_reset (mpeg2dec); - mpeg2dec->discont_state = MPEG2DEC_DISC_NEW_PICTURE; - gst_mpeg2dec_flush_decoder (mpeg2dec); - gst_pad_event_default (pad, event); - return; - } - case GST_EVENT_FLUSH: - mpeg2dec->discont_state = MPEG2DEC_DISC_NEW_PICTURE; - gst_mpeg2dec_flush_decoder (mpeg2dec); - case GST_EVENT_EOS: - if (mpeg2dec->index && mpeg2dec->closed) { - gst_index_commit (mpeg2dec->index, mpeg2dec->index_id); - default: - GST_DEBUG_OBJECT (mpeg2dec, "Got event of type %d on sink pad", - GST_EVENT_TYPE (event)); size = GST_BUFFER_SIZE (buf); data = GST_BUFFER_DATA (buf); @@ -1011,6 +1003,7 @@ mpeg2_pts (mpeg2dec->decoder, mpeg_pts); } else { GST_LOG ("no pts"); @@ -1081,6 +1074,7 @@ break; default: GST_ERROR_OBJECT (mpeg2dec, "Unknown libmpeg2 state %d, FIXME", state); @@ -1094,13 +1088,14 @@ memcpy (GST_BUFFER_DATA (udbuf), info->user_data, info->user_data_len); - gst_pad_push (mpeg2dec->userdatapad, GST_DATA (udbuf)); + gst_pad_push (mpeg2dec->userdatapad, GST_BUFFER (udbuf)); gst_buffer_unref (buf); - return; + return GST_FLOW_OK; exit: /* @@ -1110,33 +1105,138 @@ gst_mpeg2dec_close_decoder (mpeg2dec); + return GST_FLOW_ERROR; +gst_mpeg2dec_sink_event (GstPad * pad, GstEvent * event) + { + GstClockTime time; + GstClockTime end_time; /* 0.9 just to call + gst_event_discont_get_value, non + used anywhere else */ + GST_STREAM_LOCK (pad); + if (!gst_event_discont_get_value (event, GST_FORMAT_TIME, &time, + &end_time) + || !GST_CLOCK_TIME_IS_VALID (time)) { + GST_WARNING_OBJECT (mpeg2dec, + "No new time offset in discont event %p", event); + mpeg2dec->next_time = time; + GST_DEBUG_OBJECT (mpeg2dec, + "discont, reset next_time to %" G_GUINT64_FORMAT " (%" + GST_TIME_FORMAT ")", mpeg2dec->next_time, + GST_TIME_ARGS (mpeg2dec->next_time)); + // what's hell is that + /* + if (GST_EVENT_DISCONT_NEW_MEDIA (event)) + { + gst_mpeg2dec_reset (mpeg2dec); + else + mpeg2dec->discont_state = MPEG2DEC_DISC_NEW_PICTURE; + gst_mpeg2dec_flush_decoder (mpeg2dec); + GST_STREAM_UNLOCK (pad); + ret = gst_pad_event_default (pad, event); + case GST_EVENT_FLUSH: + mpeg2dec->discont_state = MPEG2DEC_DISC_NEW_PICTURE; + gst_mpeg2dec_flush_decoder (mpeg2dec); + if (mpeg2dec->index && mpeg2dec->closed) { + gst_index_commit (mpeg2dec->index, mpeg2dec->index_id); + GST_DEBUG_OBJECT (mpeg2dec, "Got event of type %d on sink pad", + GST_EVENT_TYPE (event)); static const GstFormat * -gst_mpeg2dec_get_sink_formats (GstPad * pad) +gst_mpeg2dec_get_formats (GstPad * pad) - static const GstFormat formats[] = { + static GstFormat src_formats[] = { + GST_FORMAT_BYTES, + GST_FORMAT_TIME, + GST_FORMAT_DEFAULT, + 0 + }; + static GstFormat sink_formats[] = { GST_FORMAT_BYTES, GST_FORMAT_TIME, - return formats; + return (GST_PAD_IS_SRC (pad) ? src_formats : sink_formats); +static GstCaps * +gst_mpeg2dec_src_getcaps (GstPad * pad) + GstCaps *caps; + GST_LOCK (pad); + if (!(caps = GST_PAD_CAPS (pad))) + caps = (GstCaps *) gst_pad_get_pad_template_caps (pad); + caps = gst_caps_ref (caps); + GST_UNLOCK (pad); + return caps; -gst_mpeg2dec_convert_sink (GstPad * pad, GstFormat src_format, gint64 src_value, +gst_mpeg2dec_sink_convert (GstPad * pad, GstFormat src_format, gint64 src_value, GstFormat * dest_format, gint64 * dest_value) gboolean res = TRUE; GstMpeg2dec *mpeg2dec; - mpeg2dec = GST_MPEG2DEC (gst_pad_get_parent (pad)); + mpeg2dec = GST_MPEG2DEC (GST_PAD_PARENT (pad)); if (mpeg2dec->decoder == NULL) + if (src_format == *dest_format) { + *dest_value = src_value; + return TRUE; info = mpeg2_info (mpeg2dec->decoder); switch (src_format) { @@ -1168,21 +1268,9 @@ return res; -static const GstFormat * -gst_mpeg2dec_get_src_formats (GstPad * pad) -{ - GST_FORMAT_BYTES, - GST_FORMAT_TIME, - GST_FORMAT_DEFAULT, - 0 - }; -} -gst_mpeg2dec_convert_src (GstPad * pad, GstFormat src_format, gint64 src_value, +gst_mpeg2dec_src_convert (GstPad * pad, GstFormat src_format, gint64 src_value, @@ -1190,11 +1278,16 @@ guint64 scale = 1; @@ -1241,7 +1334,6 @@ gst_mpeg2dec_get_src_query_types (GstPad * pad) static const GstQueryType types[] = { @@ -1250,80 +1342,93 @@ -gst_mpeg2dec_src_query (GstPad * pad, GstQueryType type, - GstFormat * format, gint64 * value) +gst_mpeg2dec_src_query (GstPad * pad, GstQuery * query) - static const GstFormat *formats = NULL; - switch (type) { - case GST_QUERY_TOTAL: + switch (GST_QUERY_TYPE (query)) { + case GST_QUERY_POSITION: { - switch (*format) { - case GST_FORMAT_TIME: - case GST_FORMAT_BYTES: - case GST_FORMAT_DEFAULT: - { - res = FALSE; + GstFormat format; + GstFormat rformat; + gint64 cur, total, total_bytes; + GstPad *peer; - /* get our peer formats */ - if (GST_PAD_PEER (mpeg2dec->sinkpad)) - formats = gst_pad_get_formats (GST_PAD_PEER (mpeg2dec->sinkpad)); + /* save requested format */ + gst_query_parse_position (query, &format, NULL, NULL); - /* while we did not exhaust our seek formats without result */ - while (formats && *formats && !res) { - GstFormat peer_format; - gint64 peer_value; + /* query peer for total length in bytes */ + gst_query_set_position (query, GST_FORMAT_BYTES, -1, -1); - peer_format = *formats; + if ((peer = gst_pad_get_peer (mpeg2dec->sinkpad)) == NULL) + goto error; - /* do the probe */ - if (gst_pad_query (GST_PAD_PEER (mpeg2dec->sinkpad), - GST_QUERY_TOTAL, &peer_format, &peer_value)) { - GstFormat conv_format; + if (!gst_pad_query (peer, query)) { + GST_LOG_OBJECT (mpeg2dec, "query on peer pad failed"); + gst_object_unref (peer); - /* convert to TIME */ - conv_format = GST_FORMAT_TIME; - res = gst_pad_convert (mpeg2dec->sinkpad, - peer_format, peer_value, &conv_format, value); - /* and to final format */ - res &= gst_pad_convert (pad, - GST_FORMAT_TIME, *value, format, value); - } - formats++; - } - default: + /* get the returned format */ + gst_query_parse_position (query, &rformat, NULL, &total_bytes); + if (rformat == GST_FORMAT_BYTES) + GST_LOG_OBJECT (mpeg2dec, "peer pad returned total=%lld bytes", + total_bytes); + else if (rformat == GST_FORMAT_TIME) + GST_LOG_OBJECT (mpeg2dec, "peer pad returned time=%lld", total_bytes); + /* Check if requested format is returned format */ + if (format == rformat) + return TRUE; + /* and convert to the requested format */ + if (format != GST_FORMAT_DEFAULT) { + if (!gst_mpeg2dec_src_convert (pad, GST_FORMAT_DEFAULT, + mpeg2dec->next_time, &format, &cur)) + goto error; + cur = mpeg2dec->next_time; - break; - case GST_QUERY_POSITION: - { - res = gst_pad_convert (pad, - GST_FORMAT_TIME, mpeg2dec->next_time, format, value); + if (total_bytes != -1) { + if (format != GST_FORMAT_BYTES) { + if (!gst_mpeg2dec_sink_convert (pad, GST_FORMAT_BYTES, total_bytes, + &format, &total)) + goto error; + } else { + total = total_bytes; + } + total = -1; + gst_query_set_position (query, format, cur, total); + GST_LOG_OBJECT (mpeg2dec, + "position query: peer returned total: %llu - we return %llu (format %u)", + total, cur, format); default: res = FALSE; +error: + GST_DEBUG ("error handling query"); + return FALSE; static const GstEventMask * -gst_mpeg2dec_get_src_event_masks (GstPad * pad) +gst_mpeg2dec_get_event_masks (GstPad * pad) static const GstEventMask masks[] = { {GST_EVENT_SEEK, GST_SEEK_METHOD_SET | GST_SEEK_FLAG_FLUSH}, @@ -1333,6 +1438,7 @@ return masks; index_seek (GstPad * pad, GstEvent * event) @@ -1340,7 +1446,7 @@ GstIndexEntry *entry; entry = gst_index_get_assoc_entry (mpeg2dec->index, mpeg2dec->index_id, GST_INDEX_LOOKUP_BEFORE, GST_ASSOCIATION_FLAG_KEY_UNIT, @@ -1357,7 +1463,12 @@ }; try_formats = try_all_formats; peer_formats = gst_pad_get_formats (GST_PAD_PEER (mpeg2dec->sinkpad)); + peer_formats = try_all_formats; /* FIXE ME */ while (gst_formats_contains (peer_formats, *try_formats)) { gint64 value; @@ -1394,28 +1505,55 @@ normal_seek (GstPad * pad, GstEvent * event) - gint64 src_offset; - gboolean flush; + gint64 time_offset, bytes_offset; GstFormat format; - const GstFormat *peer_formats = NULL; - gboolean res = FALSE; + guint flush; - format = GST_FORMAT_TIME; + /* const GstFormat *peer_formats; */ - /* first bring the src_format to TIME */ - if (!gst_pad_convert (pad, - GST_EVENT_SEEK_FORMAT (event), GST_EVENT_SEEK_OFFSET (event), - &format, &src_offset)) { - /* didn't work, probably unsupported seek format then */ - return res; + GST_DEBUG ("normal seek"); + format = GST_FORMAT_TIME; + if (GST_EVENT_SEEK_FORMAT (event) != GST_FORMAT_TIME) { + if (!gst_mpeg2dec_src_convert (pad, GST_EVENT_SEEK_FORMAT (event), + GST_EVENT_SEEK_OFFSET (event), &format, &time_offset)) { + /* probably unsupported seek format */ + GST_DEBUG ("failed to convert format %u into GST_FORMAT_TIME", + GST_EVENT_SEEK_FORMAT (event)); + return FALSE; + } else { + time_offset = GST_EVENT_SEEK_OFFSET (event); + GST_DEBUG ("seek to time %" GST_TIME_FORMAT, GST_TIME_ARGS (time_offset)); /* shave off the flush flag, we'll need it later */ flush = GST_EVENT_SEEK_FLAGS (event) & GST_SEEK_FLAG_FLUSH; + /* assume the worst */ + res = FALSE; + format = GST_FORMAT_BYTES; + if (gst_mpeg2dec_sink_convert (pad, GST_FORMAT_TIME, time_offset, + &format, &bytes_offset)) { + GstEvent *seek_event; + /* conversion succeeded, create the seek */ + seek_event = + gst_event_new_seek (format | GST_EVENT_SEEK_METHOD (event) | flush, + bytes_offset); + /* do the seek */ + res = gst_pad_send_event (GST_PAD_PEER (mpeg2dec->sinkpad), seek_event); /* get our peer formats */ if (GST_PAD_PEER (mpeg2dec->sinkpad)) @@ -1427,8 +1565,8 @@ format = *peer_formats; /* try to convert requested format to one we can seek with on the sinkpad */ - if (gst_pad_convert (mpeg2dec->sinkpad, GST_FORMAT_TIME, src_offset, - &format, &desired_offset)) { + if (gst_mpeg2dec_sink_convert (mpeg2dec->sinkpad, GST_FORMAT_TIME, + src_offset, &format, &desired_offset)) { GstEvent *seek_event; /* conversion succeeded, create the seek */ @@ -1438,9 +1576,6 @@ /* do the seekk */ if (gst_pad_send_event (GST_PAD_PEER (mpeg2dec->sinkpad), seek_event)) { /* seek worked, we're done, loop will exit */ -#if 0 - mpeg2dec->segment_start = GST_EVENT_SEEK_OFFSET (event); res = TRUE; @@ -1453,17 +1588,19 @@ /* if we need to flush, iterate until the buffer is empty */ gst_mpeg2dec_flush_decoder (mpeg2dec); gst_mpeg2dec_src_event (GstPad * pad, GstEvent * event) @@ -1573,4 +1710,4 @@ GST_VERSION_MINOR, "mpeg2dec", - "LibMpeg2 decoder", plugin_init, VERSION, "GPL", GST_PACKAGE, GST_ORIGIN) + "LibMpeg2 decoder", plugin_init, VERSION, "GPL", GST_PACKAGE, GST_ORIGIN); |