From fdf6d4edf512dc94a1d745e1e7981257bf293daa Mon Sep 17 00:00:00 2001 From: "Ronald S. Bultje" Date: Wed, 10 Mar 2004 05:45:23 +0000 Subject: [PATCH] ext/divx/gstdivxdec.c: Downgrade priority. We prefer ffdec_mpeg4. Original commit message from CVS: * ext/divx/gstdivxdec.c: Downgrade priority. We prefer ffdec_mpeg4. * ext/faad/gstfaad.c: (gst_faad_srcgetcaps), (gst_faad_srcconnect), (gst_faad_chain), (gst_faad_change_state): Fix capsnego. Doesn't work for some sounds because we don't have a 5:1 to stereo element. * ext/xvid/gstxvid.c: (plugin_init): Add priority. * sys/oss/gstosssink.c: (gst_osssink_init), (gst_osssink_chain), (gst_osssink_change_state): Add discont handling. --- ChangeLog | 14 +++++++++++++ sys/oss/gstosssink.c | 49 ++++++++++++++++++++++++++++++-------------- 2 files changed, 48 insertions(+), 15 deletions(-) diff --git a/ChangeLog b/ChangeLog index 732177b5d8..741c470bd2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,17 @@ +2004-03-10 Ronald Bultje + + * ext/divx/gstdivxdec.c: + Downgrade priority. We prefer ffdec_mpeg4. + * ext/faad/gstfaad.c: (gst_faad_srcgetcaps), (gst_faad_srcconnect), + (gst_faad_chain), (gst_faad_change_state): + Fix capsnego. Doesn't work for some sounds because we don't have + a 5:1 to stereo element. + * ext/xvid/gstxvid.c: (plugin_init): + Add priority. + * sys/oss/gstosssink.c: (gst_osssink_init), (gst_osssink_chain), + (gst_osssink_change_state): + Add discont handling. + 2004-03-09 Colin Walters * gst/audioconvert/gstaudioconvert.c: Fix typo in width 8 diff --git a/sys/oss/gstosssink.c b/sys/oss/gstosssink.c index 9e6a253e71..fba0857ff7 100644 --- a/sys/oss/gstosssink.c +++ b/sys/oss/gstosssink.c @@ -207,6 +207,7 @@ gst_osssink_init (GstOssSink *osssink) osssink->chunk_size = 4096; osssink->mute = FALSE; osssink->sync = TRUE; + osssink->resync = FALSE; osssink->provided_clock = gst_audio_clock_new ("ossclock", gst_osssink_get_time, osssink); gst_object_set_parent (GST_OBJECT (osssink->provided_clock), GST_OBJECT (osssink)); osssink->handled = 0; @@ -356,6 +357,17 @@ gst_osssink_chain (GstPad *pad, GstData *_data) gst_audio_clock_set_active (GST_AUDIO_CLOCK (osssink->provided_clock), FALSE); gst_pad_event_default (pad, event); return; + case GST_EVENT_DISCONTINUOUS: { + osssink->resync = TRUE; + gint64 offset; + if (gst_event_discont_get_value (event, GST_FORMAT_TIME, &offset)) { + gst_audio_clock_update_time ((GstAudioClock*)osssink->provided_clock, + offset); + osssink->handled = offset * GST_OSSELEMENT(osssink)->bps / GST_SECOND; + } + gst_pad_event_default (pad, event); + return; + } default: gst_pad_event_default (pad, event); return; @@ -369,6 +381,16 @@ gst_osssink_chain (GstPad *pad, GstData *_data) return; } + if (osssink->resync) { + if (GST_BUFFER_TIMESTAMP_IS_VALID (buf)) { + gst_audio_clock_update_time ((GstAudioClock*)osssink->provided_clock, + GST_BUFFER_TIMESTAMP (buf)); + osssink->handled = GST_BUFFER_TIMESTAMP (buf) * + GST_OSSELEMENT(osssink)->bps / GST_SECOND; + } + osssink->resync = FALSE; + } + data = GST_BUFFER_DATA (buf); to_write = GST_BUFFER_SIZE (buf); /* sync audio with buffers timestamp */ @@ -384,41 +406,37 @@ gst_osssink_chain (GstPad *pad, GstData *_data) } GST_LOG_OBJECT (osssink, "time: element %"G_GUINT64_FORMAT", real %"G_GUINT64_FORMAT", buffer: %"G_GUINT64_FORMAT, elementtime, soundtime, buftime); - if (MAX (buftime, soundtime) - MIN (buftime, soundtime) > GST_SECOND / 10) { + if (MAX (buftime, soundtime) - MIN (buftime, soundtime) > (GST_SECOND / 10)) { /* we need to adjust to the buffers here */ GST_INFO_OBJECT (osssink, "need sync: element %"G_GUINT64_FORMAT", real %"G_GUINT64_FORMAT", buffer: %"G_GUINT64_FORMAT, elementtime, soundtime, buftime); if (soundtime > buftime) { /* full frames */ - guint throw_away = (soundtime - buftime) * GST_OSSELEMENT (osssink)->bps / GST_SECOND; + guint64 throw_away = (soundtime - buftime) * GST_OSSELEMENT (osssink)->bps / GST_SECOND; throw_away &= ~(GST_OSSELEMENT (osssink)->width * GST_OSSELEMENT (osssink)->channels); - osssink->handled += throw_away; - if (throw_away >= GST_BUFFER_SIZE (buf)) { - gst_data_unref (_data); - return; + if (throw_away > to_write) { + gst_buffer_unref (buf); + return; } to_write -= throw_away; data += throw_away; } else { - guint64 to_handle = (buftime - soundtime) * GST_OSSELEMENT (osssink)->bps / GST_SECOND - / GST_OSSELEMENT (osssink)->width / GST_OSSELEMENT (osssink)->channels - * GST_OSSELEMENT (osssink)->width * GST_OSSELEMENT (osssink)->channels; + guint64 to_handle = (buftime - soundtime) / (GST_SECOND / G_USEC_PER_SEC); + to_handle &= ~(GST_OSSELEMENT (osssink)->width * GST_OSSELEMENT (osssink)->channels); /* FIXME: we really should output silence here */ /* round to full frames */ - g_usleep (to_handle * G_USEC_PER_SEC / GST_OSSELEMENT (osssink)->bps); - osssink->handled += (buftime - soundtime) * GST_OSSELEMENT (osssink)->bps / GST_SECOND - / GST_OSSELEMENT (osssink)->width / GST_OSSELEMENT (osssink)->channels - * GST_OSSELEMENT (osssink)->width * GST_OSSELEMENT (osssink)->channels; + g_usleep (to_handle); + osssink->handled += ((buftime - soundtime) * GST_OSSELEMENT (osssink)->bps / GST_SECOND) &~ + (GST_OSSELEMENT (osssink)->width / GST_OSSELEMENT (osssink)->channels); } } - if (GST_OSSELEMENT (osssink)->fd >= 0) { + if (GST_OSSELEMENT (osssink)->fd >= 0 && to_write > 0) { if (!osssink->mute) { while (to_write > 0) { gint done = write (GST_OSSELEMENT (osssink)->fd, data, MIN (to_write, osssink->chunk_size)); - if (done == -1) { if (errno != EINTR) break; @@ -601,6 +619,7 @@ gst_osssink_change_state (GstElement *element) ioctl (GST_OSSELEMENT (osssink)->fd, SNDCTL_DSP_RESET, 0); gst_osselement_reset (GST_OSSELEMENT (osssink)); osssink->handled = 0; + osssink->resync = FALSE; break; default: break;