ext/a52dec/gsta52dec.c: Add some debug output. Check that a discont has a valid time...
authorJan Schmidt <thaytan@mad.scientist.com>
Tue, 25 Jan 2005 15:34:09 +0000 (15:34 +0000)
committerJan Schmidt <thaytan@mad.scientist.com>
Tue, 25 Jan 2005 15:34:09 +0000 (15:34 +0000)
Original commit message from CVS:
* ext/a52dec/gsta52dec.c: (gst_a52dec_push),
(gst_a52dec_handle_event), (gst_a52dec_chain):
Add some debug output. Check that a discont has a valid
time associated.
* ext/alsa/gstalsasink.c: (gst_alsa_sink_check_event),
(gst_alsa_sink_loop):
Ignore TAG events. A little extra debug for broken timestamps.
* ext/dvdnav/dvdnavsrc.c: (dvdnavsrc_init), (dvdnavsrc_loop),
(dvdnavsrc_change_state):
Ensure we send a discont to engage the link before we send any
other events.
* ext/dvdread/dvdreadsrc.c: (dvdreadsrc_init),
(dvdreadsrc_finalize), (_close), (_open), (_seek_title),
(_seek_chapter), (seek_sector), (dvdreadsrc_get),
(dvdreadsrc_uri_get_uri), (dvdreadsrc_uri_set_uri):
Handle URI of the form dvd://title[,chapter[,angle]]. Currently only
dvd://title works in totem because typefinding sends a seek that ends
up going back to chapter 1 regardless.
* ext/mpeg2dec/gstmpeg2dec.c:
* ext/mpeg2dec/gstmpeg2dec.h:
Output correct timestamps and handle disconts.
* ext/ogg/gstoggdemux.c: (get_relative):
Small guard against a null dereference.
* ext/pango/gsttextoverlay.c: (gst_textoverlay_finalize),
(gst_textoverlay_set_property):
Free memory when done. Don't call gst_event_filler_get_duration on
EOS events. Use GST_LOG and GST_WARNING instead of g_message and
g_warning.
* ext/smoothwave/gstsmoothwave.c: (gst_smoothwave_init),
(draw_line), (gst_smoothwave_dispose), (gst_sw_sinklink),
(gst_sw_srclink), (gst_smoothwave_chain):
Draw solid lines, prettier colours.
* gst/mpeg2sub/gstmpeg2subt.c: (gst_mpeg2subt_init):
Add a default palette that'll work for some movies.
* gst/mpegstream/gstdvddemux.c: (gst_dvd_demux_init),
(gst_dvd_demux_handle_dvd_event), (gst_dvd_demux_send_discont),
(gst_dvd_demux_send_subbuffer), (gst_dvd_demux_reset):
* gst/mpegstream/gstdvddemux.h:
* gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_send_discont),
(gst_mpeg_demux_parse_syshead), (gst_mpeg_demux_parse_pes):
* gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_init),
(gst_mpeg_parse_handle_discont), (gst_mpeg_parse_parse_packhead):
* gst/mpegstream/gstmpegparse.h:
Use PTM/NAV events when for timestamp adjustment when connected to
dvdnavsrc. Don't use many discont events where one suffices.
* gst/playback/gstplaybasebin.c: (group_destroy),
(gen_preroll_element), (gst_play_base_bin_add_element):
* gst/playback/gstplaybasebin.h:
Make sure we remove subtitles from the same bin we put them in.
* gst/subparse/gstsubparse.c: (convert_encoding), (parse_subrip),
(gst_subparse_buffer_format_autodetect),
(gst_subparse_change_state):
Fix some memleaks and invalid accesses.
* gst/typefind/gsttypefindfunctions.c: (ogganx_type_find),
(oggskel_type_find), (cmml_type_find), (plugin_init):
Some typefind functions for Annodex v3.0 files
* gst/wavparse/gstwavparse.h:
GstRiffReadClass is the correct parent class.

ChangeLog
ext/pango/gsttextoverlay.c
gst/smoothwave/gstsmoothwave.c
gst/smoothwave/gstsmoothwave.h
gst/wavparse/gstwavparse.h

index b6e0567..d525a72 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,63 @@
+2005-01-26  Jan Schmidt  <thaytan@mad.scientist.com>
+       * ext/a52dec/gsta52dec.c: (gst_a52dec_push),
+       (gst_a52dec_handle_event), (gst_a52dec_chain):
+       Add some debug output. Check that a discont has a valid
+       time associated.
+       * ext/alsa/gstalsasink.c: (gst_alsa_sink_check_event),
+       (gst_alsa_sink_loop):
+       Ignore TAG events. A little extra debug for broken timestamps.
+       * ext/dvdnav/dvdnavsrc.c: (dvdnavsrc_init), (dvdnavsrc_loop),
+       (dvdnavsrc_change_state):
+       Ensure we send a discont to engage the link before we send any
+       other events.
+       * ext/dvdread/dvdreadsrc.c: (dvdreadsrc_init),
+       (dvdreadsrc_finalize), (_close), (_open), (_seek_title),
+       (_seek_chapter), (seek_sector), (dvdreadsrc_get),
+       (dvdreadsrc_uri_get_uri), (dvdreadsrc_uri_set_uri):
+       Handle URI of the form dvd://title[,chapter[,angle]]. Currently only
+       dvd://title works in totem because typefinding sends a seek that ends
+       up going back to chapter 1 regardless.
+       * ext/mpeg2dec/gstmpeg2dec.c:
+       * ext/mpeg2dec/gstmpeg2dec.h:
+       Output correct timestamps and handle disconts.
+       * ext/ogg/gstoggdemux.c: (get_relative):
+       Small guard against a null dereference.
+       * ext/pango/gsttextoverlay.c: (gst_textoverlay_finalize),
+       (gst_textoverlay_set_property):
+       Free memory when done. Don't call gst_event_filler_get_duration on
+       EOS events. Use GST_LOG and GST_WARNING instead of g_message and
+       g_warning.
+       * ext/smoothwave/gstsmoothwave.c: (gst_smoothwave_init),
+       (draw_line), (gst_smoothwave_dispose), (gst_sw_sinklink),
+       (gst_sw_srclink), (gst_smoothwave_chain):
+       Draw solid lines, prettier colours.
+       * gst/mpeg2sub/gstmpeg2subt.c: (gst_mpeg2subt_init):
+       Add a default palette that'll work for some movies.
+       * gst/mpegstream/gstdvddemux.c: (gst_dvd_demux_init),
+       (gst_dvd_demux_handle_dvd_event), (gst_dvd_demux_send_discont),
+       (gst_dvd_demux_send_subbuffer), (gst_dvd_demux_reset):
+       * gst/mpegstream/gstdvddemux.h:
+       * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_send_discont),
+       (gst_mpeg_demux_parse_syshead), (gst_mpeg_demux_parse_pes):
+       * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_init),
+       (gst_mpeg_parse_handle_discont), (gst_mpeg_parse_parse_packhead):
+       * gst/mpegstream/gstmpegparse.h:
+       Use PTM/NAV events when for timestamp adjustment when connected to 
+       dvdnavsrc. Don't use many discont events where one suffices.
+       * gst/playback/gstplaybasebin.c: (group_destroy),
+       (gen_preroll_element), (gst_play_base_bin_add_element):
+       * gst/playback/gstplaybasebin.h:
+       Make sure we remove subtitles from the same bin we put them in.
+       * gst/subparse/gstsubparse.c: (convert_encoding), (parse_subrip),
+       (gst_subparse_buffer_format_autodetect),
+       (gst_subparse_change_state):
+       Fix some memleaks and invalid accesses.
+       * gst/typefind/gsttypefindfunctions.c: (ogganx_type_find),
+       (oggskel_type_find), (cmml_type_find), (plugin_init):
+       Some typefind functions for Annodex v3.0 files
+       * gst/wavparse/gstwavparse.h:
+       GstRiffReadClass is the correct parent class.
+
 2005-01-25  Ronald S. Bultje  <rbultje@ronald.bitfreak.net>
 
        * gst-libs/gst/riff/riff-media.c:
index bbd92b0..8b427ff 100644 (file)
@@ -443,7 +443,8 @@ gst_textoverlay_video_chain (GstPad * pad, GstData * _data)
      GST_BUFFER_TIMESTAMP (GST_BUFFER (data)))
 #define GST_DATA_DURATION(data) \
   (GST_IS_EVENT (data) ? \
-     gst_event_filler_get_duration (GST_EVENT (data)) : \
+     ((GST_EVENT_TYPE (data) == GST_EVENT_FILLER) ? gst_event_filler_get_duration (GST_EVENT (data)) : \
+      GST_CLOCK_TIME_NONE) : \
      GST_BUFFER_DURATION (GST_BUFFER (data)))
 
 #define PAST_END(data, time) \
@@ -631,6 +632,11 @@ gst_textoverlay_finalize (GObject * object)
 {
   GstTextOverlay *overlay = GST_TEXTOVERLAY (object);
 
+  if (overlay->default_text) {
+    g_free (overlay->default_text);
+    overlay->default_text = NULL;
+  }
+
   if (overlay->layout) {
     g_object_unref (overlay->layout);
     overlay->layout = NULL;
@@ -751,12 +757,12 @@ gst_textoverlay_set_property (GObject * object, guint prop_id,
 
       desc = pango_font_description_from_string (g_value_get_string (value));
       if (desc) {
-        g_message ("font description set: %s", g_value_get_string (value));
+        GST_LOG ("font description set: %s", g_value_get_string (value));
         pango_layout_set_font_description (overlay->layout, desc);
         pango_font_description_free (desc);
         render_text (overlay);
       } else
-        g_warning ("font description parse failed: %s",
+        GST_WARNING ("font description parse failed: %s",
             g_value_get_string (value));
       break;
     }
index 4fd998f..16d57da 100644 (file)
@@ -195,6 +195,27 @@ gst_smoothwave_init (GstSmoothWave * smoothwave)
   smoothwave->samples_consumed = 0;
 }
 
+inline guchar *
+draw_line (guchar * cur_pos, gint diff_y, gint stride)
+{
+  gint j;
+
+  if (diff_y > 0) {
+    for (j = diff_y; j > 0; j--) {
+      cur_pos += stride;
+      *cur_pos = 0xff;
+    }
+  } else if (diff_y < 0) {
+    for (j = diff_y; j < 0; j++) {
+      cur_pos -= stride;
+      *cur_pos = 0xff;
+    }
+  } else {
+    *cur_pos = 0xff;
+  }
+  return cur_pos;
+}
+
 static void
 gst_smoothwave_dispose (GObject * object)
 {
@@ -247,7 +268,6 @@ gst_smoothwave_chain (GstPad * pad, GstData * _data)
   GstSmoothWave *smoothwave;
   guint32 bytesperread;
   gint samples_per_frame;
-  gint qheight;
 
   g_return_if_fail (pad != NULL);
   g_return_if_fail (GST_IS_PAD (pad));
@@ -290,27 +310,60 @@ gst_smoothwave_chain (GstPad * pad, GstData * _data)
   gst_adapter_push (smoothwave->adapter, buf);
   while (gst_adapter_available (smoothwave->adapter) > MAX (bytesperread,
           samples_per_frame * smoothwave->channels * sizeof (gint16))) {
+    guint32 *ptr;
+    gint i;
+    gint qheight;
     const gint16 *samples =
         (const guint16 *) gst_adapter_peek (smoothwave->adapter, bytesperread);
-    register guint32 *ptr;
-    gint i;
+    gint stride = smoothwave->width;
 
     /* First draw the new waveform */
     if (smoothwave->channels == 2) {
+      guchar *cur_pos[2];
+      gint prev_y[2];
+
       qheight = smoothwave->height / 4;
-      for (i = 0; i < smoothwave->width; i++) {
-        gint16 y1 = (gint32) (samples[i * 2] * qheight) / 32768 + qheight;
-        gint16 y2 = (gint32) (samples[(i * 2) + 1] * qheight) / 32768 +
-            (qheight + smoothwave->height / 2);
-        smoothwave->imagebuffer[y1 * smoothwave->width + i] = 0xff;
-        smoothwave->imagebuffer[y2 * smoothwave->width + i] = 0xff;
+      prev_y[0] = (gint32) (*samples) * qheight / 32768;
+      samples++;
+      prev_y[1] = (gint32) (*samples) * qheight / 32768;
+      samples++;
+      cur_pos[0] = smoothwave->imagebuffer + ((prev_y[0] + qheight) * stride);
+      cur_pos[1] =
+          smoothwave->imagebuffer + ((prev_y[1] +
+              (3 * smoothwave->height / 4)) * stride);
+      *(cur_pos[0]) = 0xff;
+      *(cur_pos[1]) = 0xff;
+
+      for (i = 1; i < smoothwave->width; i++) {
+        gint diff_y = (gint) (*samples) * qheight / 32768 - prev_y[0];
+
+        samples++;
+        cur_pos[0] = draw_line (cur_pos[0], diff_y, stride);
+        cur_pos[0]++;
+        prev_y[0] += diff_y;
+
+        diff_y = (gint) (*samples) * qheight / 32768 - prev_y[1];
+        samples++;
+        cur_pos[1] = draw_line (cur_pos[1], diff_y, stride);
+        cur_pos[1]++;
+        prev_y[1] += diff_y;
       }
     } else {
       qheight = smoothwave->height / 2;
-      for (i = 0; i < smoothwave->width; i++) {
-        gint16 y1 = (gint32) (samples[i] * qheight) / 32768 + qheight;
-
-        smoothwave->imagebuffer[y1 * smoothwave->width + i] = 0xff;
+      guchar *cur_pos;
+      gint prev_y;
+
+      prev_y = (gint32) (*samples) * qheight / 32768;
+      samples++;
+      cur_pos = smoothwave->imagebuffer + ((prev_y + qheight) * stride);
+      *cur_pos = 0xff;
+      for (i = 1; i < smoothwave->width; i++) {
+        gint diff_y = (gint) (*samples) * qheight / 32768 - prev_y;
+
+        samples++;
+        cur_pos = draw_line (cur_pos, diff_y, stride);
+        cur_pos++;
+        prev_y += diff_y;
       }
     }
 
@@ -338,7 +391,6 @@ gst_smoothwave_chain (GstPad * pad, GstData * _data)
       in = smoothwave->imagebuffer;
 
       for (i = 0; i < (smoothwave->width * smoothwave->height); i++) {
-        // guchar t = *in++;
         *out++ = smoothwave->palette[*in++];    // t | (t << 8) | (t << 16) | (t << 24);
       }
       gst_pad_push (smoothwave->srcpad, GST_DATA (bufout));
index a0dfe40..fe935a7 100644 (file)
@@ -26,8 +26,9 @@
 #include <gst/bytestream/adapter.h>
 
 #ifdef __cplusplus
-extern "C" {
-#endif /* __cplusplus */
+extern "C"
+{
+#endif                          /* __cplusplus */
 
 #define GST_TYPE_SMOOTHWAVE \
   (gst_smoothwave_get_type())
@@ -40,36 +41,38 @@ extern "C" {
 #define GST_IS_SMOOTHWAVE_CLASS(obj) \
   (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_SMOOTHWAVE))
 
-typedef struct _GstSmoothWave GstSmoothWave;
-typedef struct _GstSmoothWaveClass GstSmoothWaveClass;
+  typedef struct _GstSmoothWave GstSmoothWave;
+  typedef struct _GstSmoothWaveClass GstSmoothWaveClass;
 
-struct _GstSmoothWave {
-  GstElement element;
+  struct _GstSmoothWave
+  {
+    GstElement element;
 
-  GstPad *sinkpad,*srcpad;
-  GstAdapter *adapter;
+    GstPad *sinkpad, *srcpad;
+    GstAdapter *adapter;
 
-  guchar *imagebuffer;
-  GstClockTime audio_basetime;
-  guint64 samples_consumed;
+    guchar *imagebuffer;
+    GstClockTime audio_basetime;
+    guint64 samples_consumed;
 
-  gint    sample_rate;
-  gint    width,height;
-  gdouble fps;
-  gint    channels;
-  guint32 palette[256];
-};
+    gint sample_rate;
+    gint width, height;
+    gdouble fps;
+    gint channels;
+    guint32 palette[256];
+  };
 
-struct _GstSmoothWaveClass {
-  GstElementClass parent_class;
-};
+  struct _GstSmoothWaveClass
+  {
+    GstElementClass parent_class;
+  };
 
-GType gst_smoothwave_get_type(void);
+  GType gst_smoothwave_get_type (void);
 
 
 #ifdef __cplusplus
 }
-#endif /* __cplusplus */
+#endif                          /* __cplusplus */
 
 
-#endif /* __GST_SMOOTHWAVE_H__ */
+#endif                          /* __GST_SMOOTHWAVE_H__ */
index 495c58d..1e79b16 100644 (file)
@@ -80,7 +80,7 @@ struct _GstWavParse {
 };
 
 struct _GstWavParseClass {
-  GstElementClass parent_class;
+  GstRiffReadClass parent_class;
 };
 
 GType gst_wavparse_get_type(void);