From: Wim T. <wt...@us...> - 2002-11-28 22:07:18
|
CVS Root: /cvsroot/gstreamer Module: gst-plugins Changes by: wtay Date: Thu Nov 28 2002 14:07:17 PST Log message: Make mpeg2dec cache aware Modified files: ext/mpeg2dec : gstmpeg2deccvs.c gstmpeg2deccvs.h Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/ext/mpeg2dec/gstmpeg2deccvs.c.diff?r1=1.13&r2=1.14 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/ext/mpeg2dec/gstmpeg2deccvs.h.diff?r1=1.4&r2=1.5 ====Begin Diffs==== Index: gstmpeg2deccvs.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/ext/mpeg2dec/gstmpeg2deccvs.c,v retrieving revision 1.13 retrieving revision 1.14 diff -u -d -r1.13 -r1.14 --- gstmpeg2deccvs.c 23 Nov 2002 18:21:17 -0000 1.13 +++ gstmpeg2deccvs.c 28 Nov 2002 22:07:05 -0000 1.14 @@ -93,6 +93,8 @@ const GValue *value, GParamSpec *pspec); static void gst_mpeg2dec_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); +static void gst_mpeg2dec_set_cache (GstElement *element, GstCache *cache); +static GstCache* gst_mpeg2dec_get_cache (GstElement *element); static const GstFormat* gst_mpeg2dec_get_src_formats (GstPad *pad); @@ -161,6 +163,8 @@ gobject_class->dispose = gst_mpeg2dec_dispose; gstelement_class->change_state = gst_mpeg2dec_change_state; + gstelement_class->set_cache = gst_mpeg2dec_set_cache; + gstelement_class->get_cache = gst_mpeg2dec_get_cache; } static void @@ -201,6 +205,24 @@ G_OBJECT_CLASS (parent_class)->dispose (object); } +static void +gst_mpeg2dec_set_cache (GstElement *element, GstCache *cache) +{ + GstMpeg2dec *mpeg2dec = GST_MPEG2DEC (element); + + mpeg2dec->cache = cache; + + gst_cache_get_writer_id (cache, GST_OBJECT (element), &mpeg2dec->cache_id); +} + +static GstCache* +gst_mpeg2dec_get_cache (GstElement *element) +{ + GstMpeg2dec *mpeg2dec = GST_MPEG2DEC (element); + + return mpeg2dec->cache; +} + static gboolean gst_mpeg2dec_alloc_buffer (GstMpeg2dec *mpeg2dec, const mpeg2_info_t *info) { @@ -389,11 +411,16 @@ case STATE_GOP: break; case STATE_PICTURE: + { + gboolean key_frame = FALSE; + + + if (info->current_picture) + key_frame = (info->current_picture->flags & PIC_MASK_CODING_TYPE) == PIC_FLAG_CODING_TYPE_I; + gst_mpeg2dec_alloc_buffer (mpeg2dec, info); - if (info->current_picture && - (info->current_picture->flags & PIC_MASK_CODING_TYPE) == PIC_FLAG_CODING_TYPE_I && - mpeg2dec->discont_pending) - { + + if (key_frame && mpeg2dec->discont_pending) { mpeg2dec->discont_pending = FALSE; mpeg2dec->first = TRUE; if (pts != -1 && mpeg2dec->last_PTS == -1) { @@ -401,7 +428,15 @@ mpeg2dec->next_time = pts; } } + + if (mpeg2dec->cache && pts != GST_CLOCK_TIME_NONE) { + gst_cache_add_association (mpeg2dec->cache, mpeg2dec->cache_id, + (key_frame ? GST_ACCOCIATION_FLAG_KEY_UNIT : 0), + GST_FORMAT_BYTES, GST_BUFFER_OFFSET (buf), + GST_FORMAT_TIME, pts, 0); + } break; + } case STATE_SLICE_1ST: GST_DEBUG (0, "slice 1st"); break; Index: gstmpeg2deccvs.h =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/ext/mpeg2dec/gstmpeg2deccvs.h,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- gstmpeg2deccvs.h 3 Nov 2002 04:29:01 -0000 1.4 +++ gstmpeg2deccvs.h 28 Nov 2002 22:07:05 -0000 1.5 @@ -83,6 +83,9 @@ gint frame_rate_code; gint64 total_frames; gint64 frame_period; + + GstCache *cache; + gint cache_id; }; struct _GstMpeg2decClass { |