From: Jan S. <th...@pd...> - 2004-06-07 12:02:10
|
CVS Root: /cvs/gstreamer Module: gst-plugins Changes by: thaytan Date: Mon Jun 07 2004 22:02:04 EST Log message: * AUTHORS: Add me to the authors file * configure.ac: Increase the libdv requirement to >= version 0.100 * ext/dv/gstdvdec.c: (gst_dvdec_init), (gst_dvdec_src_convert), (gst_dvdec_src_query), (gst_dvdec_handle_sink_event), (gst_dvdec_push), (gst_dvdec_loop), (gst_dvdec_change_state): * ext/dv/gstdvdec.h: Add support for the new_media flag when sending DISCONT events Make the querying work when video pad is not linked Modified files: . : AUTHORS ChangeLog configure.ac ext/dv : gstdvdec.c gstdvdec.h Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/AUTHORS.diff?r1=1.5&r2=1.6 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/ChangeLog.diff?r1=1.740&r2=1.741 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/configure.ac.diff?r1=1.427&r2=1.428 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/ext/dv/gstdvdec.c.diff?r1=1.68&r2=1.69 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/ext/dv/gstdvdec.h.diff?r1=1.15&r2=1.16 ====Begin Diffs==== Index: AUTHORS =================================================================== RCS file: /cvs/gstreamer/gst-plugins/AUTHORS,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- a/AUTHORS 31 May 2004 20:36:07 -0000 1.5 +++ b/AUTHORS 7 Jun 2004 12:01:51 -0000 1.6 @@ -17,3 +17,4 @@ Benjamin Otte <in...@pu...> Ronald Bultje <rb...@ro...> Julien MOUTTE <ju...@mo...> +Jan Schmidt <th...@ma...> Index: ChangeLog RCS file: /cvs/gstreamer/gst-plugins/ChangeLog,v retrieving revision 1.740 retrieving revision 1.741 diff -u -d -r1.740 -r1.741 --- a/ChangeLog 7 Jun 2004 02:39:02 -0000 1.740 +++ b/ChangeLog 7 Jun 2004 12:01:51 -0000 1.741 @@ -1,3 +1,15 @@ +2004-06-07 Jan Schmidt <th...@ma...> + * AUTHORS: + Add me to the authors file + * configure.ac: + Increase the libdv requirement to >= version 0.100 + * ext/dv/gstdvdec.c: (gst_dvdec_init), (gst_dvdec_src_convert), + (gst_dvdec_src_query), (gst_dvdec_handle_sink_event), + (gst_dvdec_push), (gst_dvdec_loop), (gst_dvdec_change_state): + * ext/dv/gstdvdec.h: + Add support for the new_media flag when sending DISCONT events + Make the querying work when video pad is not linked + 2004-06-07 Tim-Philipp Müller <t....@ze...> reviewed by Benjamin Otte <ot...@gn...> Index: configure.ac RCS file: /cvs/gstreamer/gst-plugins/configure.ac,v retrieving revision 1.427 retrieving revision 1.428 diff -u -d -r1.427 -r1.428 --- a/configure.ac 5 Jun 2004 14:59:42 -0000 1.427 +++ b/configure.ac 7 Jun 2004 12:01:51 -0000 1.428 @@ -1157,7 +1157,7 @@ dnl *** libdv *** translit(dnm, m, l) AM_CONDITIONAL(USE_LIBDV, true) GST_CHECK_FEATURE(LIBDV, [libdv DV/video decoder], dvdec, [ - PKG_CHECK_MODULES(LIBDV, libdv >= 0.98, HAVE_LIBDV="yes", HAVE_LIBDV="no") + PKG_CHECK_MODULES(LIBDV, libdv >= 0.100, HAVE_LIBDV="yes", HAVE_LIBDV="no") AC_SUBST(LIBDV_CFLAGS) AC_SUBST(LIBDV_LIBS) ]) @@ -1499,11 +1499,16 @@ dnl *** theora *** -dnl FIXME: theora doesn't have proper pc/m4 files yet, change this when this happens translit(dnm, m, l) AM_CONDITIONAL(USE_THEORA, true) GST_CHECK_FEATURE(THEORA, [ogg theora codec], theoradec, [ - GST_CHECK_LIBHEADER(THEORA, theora, theora_version_string, , theora/theora.h, THEORA_LIBS="-ltheora") - AC_SUBST(THEORA_LIBS) + PKG_CHECK_MODULES(THEORA, theora, [ + HAVE_THEORA="yes" + AC_SUBST(THEORA_LIBS) + AC_SUBST(THEORA_CFLAGS) + ], [ + GST_CHECK_LIBHEADER(THEORA, theora, theora_version_string, , theora/theora.h, THEORA_LIBS="-ltheora") + ]) dnl *** vorbis *** Index: gstdvdec.c RCS file: /cvs/gstreamer/gst-plugins/ext/dv/gstdvdec.c,v retrieving revision 1.68 retrieving revision 1.69 diff -u -d -r1.68 -r1.69 --- a/gstdvdec.c 21 May 2004 23:28:53 -0000 1.68 +++ b/gstdvdec.c 7 Jun 2004 12:01:52 -0000 1.69 @@ -356,10 +356,12 @@ gst_element_set_loop_function (GST_ELEMENT (dvdec), gst_dvdec_loop); + dvdec->bs = NULL; dvdec->length = 0; dvdec->next_ts = 0LL; dvdec->end_position = -1LL; dvdec->need_discont = FALSE; + dvdec->new_media = FALSE; dvdec->framerate = 0; dvdec->height = 0; dvdec->frequency = 0; @@ -403,7 +405,6 @@ GstDVDec *dvdec; dvdec = GST_DVDEC (gst_pad_get_parent (pad)); - if (dvdec->length == 0) return FALSE; @@ -425,8 +426,7 @@ GST_SECOND); else if (pad == dvdec->audiosrcpad) *dest_value = src_value * GST_SECOND / - (2 * dvdec->decoder->audio->frequency * - dvdec->decoder->audio->num_channels); + (2 * dvdec->frequency * dvdec->channels); break; default: res = FALSE; @@ -439,8 +439,8 @@ *dest_value = src_value * 720 * dvdec->height * dvdec->bpp * dvdec->framerate / GST_SECOND; - *dest_value = 2 * src_value * dvdec->decoder->audio->frequency * - dvdec->decoder->audio->num_channels / GST_SECOND; + *dest_value = 2 * src_value * dvdec->frequency * + dvdec->channels / GST_SECOND; case GST_FORMAT_TIME: case GST_FORMAT_DEFAULT: @@ -546,6 +546,9 @@ guint64 len; GstFormat tmp_format; + if (!dvdec->bs) + return FALSE; len = gst_bytestream_length (dvdec->bs); tmp_format = GST_FORMAT_TIME; if (len == -1 || !gst_pad_convert (dvdec->sinkpad, @@ -605,6 +608,18 @@ switch (type) { case GST_EVENT_FLUSH: + case GST_EVENT_EOS: + case GST_EVENT_FILLER: + /* Forward the event to output sinks */ + if (GST_PAD_IS_LINKED (dvdec->videosrcpad)) { + gst_event_ref (event); + gst_pad_push (dvdec->videosrcpad, GST_DATA (event)); + } + if (GST_PAD_IS_LINKED (dvdec->audiosrcpad)) { + gst_pad_push (dvdec->audiosrcpad, GST_DATA (event)); + gst_event_unref (event); break; case GST_EVENT_DISCONTINUOUS: { @@ -784,10 +799,12 @@ { GST_BUFFER_TIMESTAMP (outbuf) = ts; - if (dvdec->need_discont) { + if ((dvdec->need_discont) || (dvdec->new_media)) { GstEvent *discont; discont = gst_event_new_discontinuous (FALSE, GST_FORMAT_TIME, ts, NULL); + GST_EVENT_DISCONT_NEW_MEDIA (discont) = dvdec->new_media; gst_pad_push (pad, GST_DATA (discont)); } @@ -858,6 +875,8 @@ dvdec->next_ts += GST_SECOND / dvdec->framerate; dv_parse_packs (dvdec->decoder, GST_BUFFER_DATA (buf)); + if (dv_is_new_recording (dvdec->decoder, GST_BUFFER_DATA (buf))) + dvdec->new_media = TRUE; if (GST_PAD_IS_LINKED (dvdec->audiosrcpad)) { gint16 *a_ptr; @@ -866,38 +885,44 @@ dv_decode_full_audio (dvdec->decoder, GST_BUFFER_DATA (buf), dvdec->audio_buffers); - if ((dvdec->decoder->audio->frequency != dvdec->frequency) || - (dvdec->decoder->audio->num_channels != dvdec->channels)) { + if ((dv_get_frequency (dvdec->decoder) != dvdec->frequency) || + (dv_get_num_channels (dvdec->decoder) != dvdec->channels)) { if (!gst_pad_set_explicit_caps (dvdec->audiosrcpad, gst_caps_new_simple ("audio/x-raw-int", - "rate", G_TYPE_INT, dvdec->decoder->audio->frequency, + "rate", G_TYPE_INT, dv_get_frequency (dvdec->decoder), "depth", G_TYPE_INT, 16, "width", G_TYPE_INT, 16, "signed", G_TYPE_BOOLEAN, TRUE, - "channels", G_TYPE_INT, dvdec->decoder->audio->num_channels, + "channels", G_TYPE_INT, dv_get_num_channels (dvdec->decoder), "endianness", G_TYPE_INT, G_LITTLE_ENDIAN, NULL))) { gst_buffer_unref (buf); - GST_ELEMENT_ERROR (dvdec, CORE, NEGOTIATION, (NULL), (NULL)); + GST_ELEMENT_ERROR (dvdec, CORE, NEGOTIATION, (NULL), + ("Failed to negotiate audio parameters for the DV audio stream")); return; } - dvdec->frequency = dvdec->decoder->audio->frequency; - dvdec->channels = dvdec->decoder->audio->num_channels; + dvdec->frequency = dv_get_frequency (dvdec->decoder); + dvdec->channels = dv_get_num_channels (dvdec->decoder); } - outbuf = gst_buffer_new (); - GST_BUFFER_SIZE (outbuf) = dvdec->decoder->audio->samples_this_frame * - sizeof (gint16) * dvdec->decoder->audio->num_channels; - GST_BUFFER_DATA (outbuf) = g_malloc (GST_BUFFER_SIZE (outbuf)); + if (dv_get_num_samples (dvdec->decoder) > 0) { + outbuf = gst_buffer_new (); + GST_BUFFER_SIZE (outbuf) = dv_get_num_samples (dvdec->decoder) * + sizeof (gint16) * dv_get_num_channels (dvdec->decoder); + GST_BUFFER_DATA (outbuf) = g_malloc (GST_BUFFER_SIZE (outbuf)); - a_ptr = (gint16 *) GST_BUFFER_DATA (outbuf); + a_ptr = (gint16 *) GST_BUFFER_DATA (outbuf); - for (i = 0; i < dvdec->decoder->audio->samples_this_frame; i++) { - for (j = 0; j < dvdec->decoder->audio->num_channels; j++) { - *(a_ptr++) = dvdec->audio_buffers[j][i]; + for (i = 0; i < dv_get_num_samples (dvdec->decoder); i++) { + for (j = 0; j < dv_get_num_channels (dvdec->decoder); j++) { + *(a_ptr++) = dvdec->audio_buffers[j][i]; + } + gst_dvdec_push (dvdec, outbuf, dvdec->audiosrcpad, ts); - gst_dvdec_push (dvdec, outbuf, dvdec->audiosrcpad, ts); + } else { + dvdec->frequency = dv_get_frequency (dvdec->decoder); + dvdec->channels = dv_get_num_channels (dvdec->decoder); if (GST_PAD_IS_LINKED (dvdec->videosrcpad)) { @@ -935,6 +960,9 @@ dvdec->space, outframe_ptrs, outframe_pitches); gst_dvdec_push (dvdec, outbuf, dvdec->videosrcpad, ts); + dvdec->height = height; + dvdec->framerate = fps; if ((dvdec->end_position != -1) && @@ -942,9 +970,8 @@ gst_element_set_eos (GST_ELEMENT (dvdec)); - dvdec->need_discont = FALSE; - } + dvdec->need_discont = FALSE; gst_buffer_unref (buf); } @@ -977,6 +1004,7 @@ dvdec->decoder = NULL; dvdec->found_header = FALSE; gst_bytestream_destroy (dvdec->bs); + dvdec->bs = NULL; case GST_STATE_READY_TO_NULL: Index: gstdvdec.h RCS file: /cvs/gstreamer/gst-plugins/ext/dv/gstdvdec.h,v retrieving revision 1.15 retrieving revision 1.16 diff -u -d -r1.15 -r1.16 --- a/gstdvdec.h 15 Mar 2004 16:32:30 -0000 1.15 +++ b/gstdvdec.h 7 Jun 2004 12:01:52 -0000 1.16 @@ -66,6 +66,7 @@ guint64 next_ts; guint64 end_position; gboolean need_discont; + gboolean new_media; gboolean loop; gboolean found_header; |