Fix up esdmon timestamps, so that they don't go completely wrong if someone changes the frequency, depth or mono/ster...

Original commit message from CVS:
Fix up esdmon timestamps, so that they don't go completely wrong if
someone changes the frequency, depth or mono/stereo parameters.
This commit is contained in:
Richard Boulton 2002-03-02 15:51:47 +00:00
parent b6c08a233a
commit e13d88d991

View file

@ -56,6 +56,7 @@ struct _GstEsdmon {
gint frequency; gint frequency;
guint64 basetime; guint64 basetime;
guint64 samples_since_basetime;
guint64 curoffset; guint64 curoffset;
guint64 bytes_per_read; guint64 bytes_per_read;
}; };
@ -249,6 +250,7 @@ gst_esdmon_init(GstEsdmon *esdmon)
esdmon->bytes_per_read = 4096; esdmon->bytes_per_read = 4096;
esdmon->curoffset = 0; esdmon->curoffset = 0;
esdmon->basetime = 0; esdmon->basetime = 0;
esdmon->samples_since_basetime = 0;
} }
static gboolean static gboolean
@ -314,11 +316,12 @@ gst_esdmon_get (GstPad *pad)
GST_BUFFER_SIZE (buf) = readbytes; GST_BUFFER_SIZE (buf) = readbytes;
GST_BUFFER_OFFSET (buf) = esdmon->curoffset; GST_BUFFER_OFFSET (buf) = esdmon->curoffset;
GST_BUFFER_TIMESTAMP (buf) = esdmon->basetime + GST_BUFFER_TIMESTAMP (buf) = esdmon->basetime +
esdmon->curoffset * 1000000LL / esdmon->frequency; esdmon->samples_since_basetime * 1000000LL / esdmon->frequency;
esdmon->curoffset += readbytes;
readsamples = readbytes / esdmon->channels; readsamples = readbytes / esdmon->channels;
if (esdmon->depth == 16) readsamples /= 2; if (esdmon->depth == 16) readsamples /= 2;
esdmon->curoffset += readsamples; esdmon->samples_since_basetime += readsamples;
GST_DEBUG (GST_CAT_PLUGIN_INFO, "pushed buffer from esdmon of %ld bytes, timestamp %lld\n", readbytes, GST_BUFFER_TIMESTAMP (buf)); GST_DEBUG (GST_CAT_PLUGIN_INFO, "pushed buffer from esdmon of %ld bytes, timestamp %lld\n", readbytes, GST_BUFFER_TIMESTAMP (buf));
return buf; return buf;
@ -348,8 +351,8 @@ gst_esdmon_set_property (GObject *object, guint prop_id, const GValue *value, GP
break; break;
case ARG_RATE: case ARG_RATE:
/* Preserve the timestamps */ /* Preserve the timestamps */
esdmon->basetime = esdmon->curoffset * 1000000LL / esdmon->frequency; esdmon->basetime = esdmon->samples_since_basetime * 1000000LL / esdmon->frequency;
esdmon->curoffset = 0; esdmon->samples_since_basetime = 0;
/* Set the new frequency */ /* Set the new frequency */
esdmon->frequency = g_value_get_int (value); esdmon->frequency = g_value_get_int (value);