mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-20 04:56:24 +00:00
mpeg2dec: update for GstIndex removal
This commit is contained in:
parent
add96c2567
commit
51794ce082
2 changed files with 1 additions and 131 deletions
|
@ -81,9 +81,6 @@ GST_STATIC_PAD_TEMPLATE ("src",
|
||||||
static void gst_mpeg2dec_finalize (GObject * object);
|
static void gst_mpeg2dec_finalize (GObject * object);
|
||||||
static void gst_mpeg2dec_reset (GstMpeg2dec * mpeg2dec);
|
static void gst_mpeg2dec_reset (GstMpeg2dec * mpeg2dec);
|
||||||
|
|
||||||
static void gst_mpeg2dec_set_index (GstElement * element, GstIndex * index);
|
|
||||||
static GstIndex *gst_mpeg2dec_get_index (GstElement * element);
|
|
||||||
|
|
||||||
static gboolean gst_mpeg2dec_src_event (GstPad * pad, GstObject * parent,
|
static gboolean gst_mpeg2dec_src_event (GstPad * pad, GstObject * parent,
|
||||||
GstEvent * event);
|
GstEvent * event);
|
||||||
|
|
||||||
|
@ -150,8 +147,6 @@ gst_mpeg2dec_class_init (GstMpeg2decClass * klass)
|
||||||
"Wim Taymans <wim.taymans@gmail.com>");
|
"Wim Taymans <wim.taymans@gmail.com>");
|
||||||
|
|
||||||
gstelement_class->change_state = gst_mpeg2dec_change_state;
|
gstelement_class->change_state = gst_mpeg2dec_change_state;
|
||||||
gstelement_class->set_index = gst_mpeg2dec_set_index;
|
|
||||||
gstelement_class->get_index = gst_mpeg2dec_get_index;
|
|
||||||
|
|
||||||
GST_DEBUG_CATEGORY_INIT (mpeg2dec_debug, "mpeg2dec", 0,
|
GST_DEBUG_CATEGORY_INIT (mpeg2dec_debug, "mpeg2dec", 0,
|
||||||
"MPEG2 decoder element");
|
"MPEG2 decoder element");
|
||||||
|
@ -192,8 +187,6 @@ gst_mpeg2dec_init (GstMpeg2dec * mpeg2dec)
|
||||||
mpeg2dec->error_count = 0;
|
mpeg2dec->error_count = 0;
|
||||||
mpeg2dec->can_allocate_aligned = TRUE;
|
mpeg2dec->can_allocate_aligned = TRUE;
|
||||||
|
|
||||||
GST_OBJECT_FLAG_SET (mpeg2dec, GST_ELEMENT_FLAG_INDEXABLE);
|
|
||||||
|
|
||||||
/* initialize the mpeg2dec acceleration */
|
/* initialize the mpeg2dec acceleration */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -202,12 +195,6 @@ gst_mpeg2dec_finalize (GObject * object)
|
||||||
{
|
{
|
||||||
GstMpeg2dec *mpeg2dec = GST_MPEG2DEC (object);
|
GstMpeg2dec *mpeg2dec = GST_MPEG2DEC (object);
|
||||||
|
|
||||||
if (mpeg2dec->index) {
|
|
||||||
gst_object_unref (mpeg2dec->index);
|
|
||||||
mpeg2dec->index = NULL;
|
|
||||||
mpeg2dec->index_id = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mpeg2dec->decoder) {
|
if (mpeg2dec->decoder) {
|
||||||
GST_DEBUG_OBJECT (mpeg2dec, "closing decoder");
|
GST_DEBUG_OBJECT (mpeg2dec, "closing decoder");
|
||||||
mpeg2_close (mpeg2dec->decoder);
|
mpeg2_close (mpeg2dec->decoder);
|
||||||
|
@ -223,12 +210,6 @@ gst_mpeg2dec_finalize (GObject * object)
|
||||||
static void
|
static void
|
||||||
gst_mpeg2dec_reset (GstMpeg2dec * mpeg2dec)
|
gst_mpeg2dec_reset (GstMpeg2dec * mpeg2dec)
|
||||||
{
|
{
|
||||||
if (mpeg2dec->index) {
|
|
||||||
gst_object_unref (mpeg2dec->index);
|
|
||||||
mpeg2dec->index = NULL;
|
|
||||||
mpeg2dec->index_id = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* reset the initial video state */
|
/* reset the initial video state */
|
||||||
gst_video_info_init (&mpeg2dec->vinfo);
|
gst_video_info_init (&mpeg2dec->vinfo);
|
||||||
gst_segment_init (&mpeg2dec->segment, GST_FORMAT_UNDEFINED);
|
gst_segment_init (&mpeg2dec->segment, GST_FORMAT_UNDEFINED);
|
||||||
|
@ -253,33 +234,6 @@ gst_mpeg2dec_qos_reset (GstMpeg2dec * mpeg2dec)
|
||||||
GST_OBJECT_UNLOCK (mpeg2dec);
|
GST_OBJECT_UNLOCK (mpeg2dec);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
gst_mpeg2dec_set_index (GstElement * element, GstIndex * index)
|
|
||||||
{
|
|
||||||
GstMpeg2dec *mpeg2dec = GST_MPEG2DEC (element);
|
|
||||||
|
|
||||||
GST_OBJECT_LOCK (mpeg2dec);
|
|
||||||
if (mpeg2dec->index)
|
|
||||||
gst_object_unref (mpeg2dec->index);
|
|
||||||
mpeg2dec->index = NULL;
|
|
||||||
mpeg2dec->index_id = 0;
|
|
||||||
if (index) {
|
|
||||||
mpeg2dec->index = gst_object_ref (index);
|
|
||||||
}
|
|
||||||
GST_OBJECT_UNLOCK (mpeg2dec);
|
|
||||||
/* object lock might be taken again */
|
|
||||||
if (index)
|
|
||||||
gst_index_get_writer_id (index, GST_OBJECT (element), &mpeg2dec->index_id);
|
|
||||||
}
|
|
||||||
|
|
||||||
static GstIndex *
|
|
||||||
gst_mpeg2dec_get_index (GstElement * element)
|
|
||||||
{
|
|
||||||
GstMpeg2dec *mpeg2dec = GST_MPEG2DEC (element);
|
|
||||||
|
|
||||||
return (mpeg2dec->index) ? gst_object_ref (mpeg2dec->index) : NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
static GstFlowReturn
|
static GstFlowReturn
|
||||||
gst_mpeg2dec_crop_buffer (GstMpeg2dec * dec, GstBuffer ** buf)
|
gst_mpeg2dec_crop_buffer (GstMpeg2dec * dec, GstBuffer ** buf)
|
||||||
|
@ -922,14 +876,6 @@ handle_slice (GstMpeg2dec * mpeg2dec, const mpeg2_info_t * info)
|
||||||
picture->nb_fields, GST_BUFFER_OFFSET (outbuf),
|
picture->nb_fields, GST_BUFFER_OFFSET (outbuf),
|
||||||
GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (outbuf)));
|
GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (outbuf)));
|
||||||
|
|
||||||
if (mpeg2dec->index) {
|
|
||||||
gst_index_add_association (mpeg2dec->index, mpeg2dec->index_id,
|
|
||||||
(key_frame ? GST_ASSOCIATION_FLAG_KEY_UNIT :
|
|
||||||
GST_ASSOCIATION_FLAG_DELTA_UNIT),
|
|
||||||
GST_FORMAT_BYTES, GST_BUFFER_OFFSET (outbuf),
|
|
||||||
GST_FORMAT_TIME, GST_BUFFER_TIMESTAMP (outbuf), 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (picture->flags & PIC_FLAG_SKIP)
|
if (picture->flags & PIC_FLAG_SKIP)
|
||||||
goto skip;
|
goto skip;
|
||||||
|
|
||||||
|
@ -1286,9 +1232,6 @@ gst_mpeg2dec_sink_event (GstPad * pad, GstObject * parent, GstEvent * event)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case GST_EVENT_EOS:
|
case GST_EVENT_EOS:
|
||||||
if (mpeg2dec->index && mpeg2dec->closed) {
|
|
||||||
gst_index_commit (mpeg2dec->index, mpeg2dec->index_id);
|
|
||||||
}
|
|
||||||
ret = gst_pad_push_event (mpeg2dec->srcpad, event);
|
ret = gst_pad_push_event (mpeg2dec->srcpad, event);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -1562,73 +1505,6 @@ gst_mpeg2dec_get_event_masks (GstPad * pad)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static gboolean
|
|
||||||
index_seek (GstPad * pad, GstEvent * event)
|
|
||||||
{
|
|
||||||
GstIndexEntry *entry;
|
|
||||||
GstMpeg2dec *mpeg2dec;
|
|
||||||
gdouble rate;
|
|
||||||
GstFormat format;
|
|
||||||
GstSeekFlags flags;
|
|
||||||
GstSeekType cur_type, stop_type;
|
|
||||||
gint64 cur, stop;
|
|
||||||
|
|
||||||
mpeg2dec = GST_MPEG2DEC (GST_PAD_PARENT (pad));
|
|
||||||
|
|
||||||
gst_event_parse_seek (event, &rate, &format, &flags,
|
|
||||||
&cur_type, &cur, &stop_type, &stop);
|
|
||||||
|
|
||||||
entry = gst_index_get_assoc_entry (mpeg2dec->index, mpeg2dec->index_id,
|
|
||||||
GST_INDEX_LOOKUP_BEFORE, GST_ASSOCIATION_FLAG_KEY_UNIT, format, cur);
|
|
||||||
|
|
||||||
if ((entry) && gst_pad_is_linked (mpeg2dec->sinkpad)) {
|
|
||||||
const GstFormat *peer_formats, *try_formats;
|
|
||||||
|
|
||||||
/* since we know the exact byteoffset of the frame, make sure to seek on bytes first */
|
|
||||||
const GstFormat try_all_formats[] = {
|
|
||||||
GST_FORMAT_BYTES,
|
|
||||||
GST_FORMAT_TIME,
|
|
||||||
0
|
|
||||||
};
|
|
||||||
|
|
||||||
try_formats = try_all_formats;
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
peer_formats = gst_pad_get_formats (GST_PAD_PEER (mpeg2dec->sinkpad));
|
|
||||||
#else
|
|
||||||
peer_formats = try_all_formats; /* FIXE ME */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
while (gst_formats_contains (peer_formats, *try_formats)) {
|
|
||||||
gint64 value;
|
|
||||||
|
|
||||||
if (gst_index_entry_assoc_map (entry, *try_formats, &value)) {
|
|
||||||
GstEvent *seek_event;
|
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (mpeg2dec, "index %s %" G_GINT64_FORMAT
|
|
||||||
" -> %s %" G_GINT64_FORMAT,
|
|
||||||
gst_format_get_details (format)->nick,
|
|
||||||
cur, gst_format_get_details (*try_formats)->nick, value);
|
|
||||||
|
|
||||||
/* lookup succeeded, create the seek */
|
|
||||||
seek_event =
|
|
||||||
gst_event_new_seek (rate, *try_formats, flags, cur_type, value,
|
|
||||||
stop_type, stop);
|
|
||||||
/* do the seek */
|
|
||||||
if (gst_pad_push_event (mpeg2dec->sinkpad, seek_event)) {
|
|
||||||
/* seek worked, we're done, loop will exit */
|
|
||||||
#if 0
|
|
||||||
mpeg2dec->segment_start = GST_EVENT_SEEK_OFFSET (event);
|
|
||||||
#endif
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
try_formats++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
normal_seek (GstPad * pad, GstEvent * event)
|
normal_seek (GstPad * pad, GstEvent * event)
|
||||||
{
|
{
|
||||||
|
@ -1713,10 +1589,7 @@ gst_mpeg2dec_src_event (GstPad * pad, GstObject * parent, GstEvent * event)
|
||||||
case GST_EVENT_SEEK:{
|
case GST_EVENT_SEEK:{
|
||||||
gst_event_ref (event);
|
gst_event_ref (event);
|
||||||
if (!(res = gst_pad_push_event (mpeg2dec->sinkpad, event))) {
|
if (!(res = gst_pad_push_event (mpeg2dec->sinkpad, event))) {
|
||||||
if (mpeg2dec->index)
|
res = normal_seek (pad, event); /* FIXME: get rid of seeking code */
|
||||||
res = index_seek (pad, event);
|
|
||||||
else
|
|
||||||
res = normal_seek (pad, event);
|
|
||||||
}
|
}
|
||||||
gst_event_unref (event);
|
gst_event_unref (event);
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -103,9 +103,6 @@ struct _GstMpeg2dec {
|
||||||
guint64 offset;
|
guint64 offset;
|
||||||
gboolean need_sequence;
|
gboolean need_sequence;
|
||||||
|
|
||||||
GstIndex *index;
|
|
||||||
gint index_id;
|
|
||||||
|
|
||||||
gint error_count;
|
gint error_count;
|
||||||
gboolean can_allocate_aligned;
|
gboolean can_allocate_aligned;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue