Make mpeg2dec cache aware

Original commit message from CVS:
Make mpeg2dec cache aware
This commit is contained in:
Wim Taymans 2002-11-28 22:07:05 +00:00
parent 30f148f5f8
commit adef0284f8
2 changed files with 42 additions and 4 deletions

View file

@ -93,6 +93,8 @@ static void gst_mpeg2dec_set_property (GObject *object, guint prop_id,
const GValue *value, GParamSpec *pspec); const GValue *value, GParamSpec *pspec);
static void gst_mpeg2dec_get_property (GObject *object, guint prop_id, static void gst_mpeg2dec_get_property (GObject *object, guint prop_id,
GValue *value, GParamSpec *pspec); 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* static const GstFormat*
gst_mpeg2dec_get_src_formats (GstPad *pad); gst_mpeg2dec_get_src_formats (GstPad *pad);
@ -161,6 +163,8 @@ gst_mpeg2dec_class_init(GstMpeg2decClass *klass)
gobject_class->dispose = gst_mpeg2dec_dispose; gobject_class->dispose = gst_mpeg2dec_dispose;
gstelement_class->change_state = gst_mpeg2dec_change_state; 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 static void
@ -201,6 +205,24 @@ gst_mpeg2dec_dispose (GObject *object)
G_OBJECT_CLASS (parent_class)->dispose (object); 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 static gboolean
gst_mpeg2dec_alloc_buffer (GstMpeg2dec *mpeg2dec, const mpeg2_info_t *info) gst_mpeg2dec_alloc_buffer (GstMpeg2dec *mpeg2dec, const mpeg2_info_t *info)
{ {
@ -389,11 +411,16 @@ gst_mpeg2dec_chain (GstPad *pad, GstBuffer *buf)
case STATE_GOP: case STATE_GOP:
break; break;
case STATE_PICTURE: 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); gst_mpeg2dec_alloc_buffer (mpeg2dec, info);
if (info->current_picture &&
(info->current_picture->flags & PIC_MASK_CODING_TYPE) == PIC_FLAG_CODING_TYPE_I && if (key_frame && mpeg2dec->discont_pending) {
mpeg2dec->discont_pending)
{
mpeg2dec->discont_pending = FALSE; mpeg2dec->discont_pending = FALSE;
mpeg2dec->first = TRUE; mpeg2dec->first = TRUE;
if (pts != -1 && mpeg2dec->last_PTS == -1) { if (pts != -1 && mpeg2dec->last_PTS == -1) {
@ -401,7 +428,15 @@ gst_mpeg2dec_chain (GstPad *pad, GstBuffer *buf)
mpeg2dec->next_time = pts; 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; break;
}
case STATE_SLICE_1ST: case STATE_SLICE_1ST:
GST_DEBUG (0, "slice 1st"); GST_DEBUG (0, "slice 1st");
break; break;

View file

@ -83,6 +83,9 @@ struct _GstMpeg2dec {
gint frame_rate_code; gint frame_rate_code;
gint64 total_frames; gint64 total_frames;
gint64 frame_period; gint64 frame_period;
GstCache *cache;
gint cache_id;
}; };
struct _GstMpeg2decClass { struct _GstMpeg2decClass {