+2007-05-07 Michael Smith <msmith@fluendo.com>
+
+ * ext/theora/gsttheoradec.h:
+ * ext/theora/theoradec.c: (gst_theora_dec_reset),
+ (theora_dec_sink_event), (theora_handle_comment_packet),
+ (theora_handle_type_packet), (theora_dec_change_state):
+ Don't push events (newsegment, tags) before initialising the
+ decoder.
+ This is neccesary for seeking to work correctly in gnonlin.
+
2007-05-04 Stefan Kost <ensonic@users.sf.net>
* gst-libs/gst/rtp/gstbasertpaudiopayload.c:
gst_theora_dec_reset (GstTheoraDec * dec)
{
dec->need_keyframe = TRUE;
+ dec->sent_newsegment = FALSE;
dec->last_timestamp = -1;
dec->granulepos = -1;
dec->discont = TRUE;
g_list_foreach (dec->decode, (GFunc) gst_mini_object_unref, NULL);
g_list_free (dec->decode);
dec->decode = NULL;
+
+ if (dec->tags) {
+ gst_tag_list_free (dec->tags);
+ dec->tags = NULL;
+ }
}
static int
gst_segment_set_newsegment_full (&dec->segment, update,
rate, arate, format, start, stop, time);
- /* and forward */
- ret = gst_pad_push_event (dec->srcpad, event);
+ /* iWe don't forward this unless/until the decoder is initialised */
+ if (dec->have_header) {
+ ret = gst_pad_push_event (dec->srcpad, event);
+ dec->sent_newsegment = TRUE;
+ } else {
+ gst_event_unref (event);
+ ret = TRUE;
+ }
break;
}
default:
GST_TAG_NOMINAL_BITRATE, dec->info.target_bitrate, NULL);
}
- gst_element_found_tags_for_pad (GST_ELEMENT_CAST (dec), dec->srcpad, list);
+ dec->tags = list;
return GST_FLOW_OK;
}
{
GstCaps *caps;
gint par_num, par_den;
+ GstFlowReturn ret = GST_FLOW_OK;
+ GstEvent *event;
GST_DEBUG_OBJECT (dec, "fps %d/%d, PAR %d/%d",
dec->info.fps_numerator, dec->info.fps_denominator,
gst_caps_unref (caps);
dec->have_header = TRUE;
+ if (!dec->sent_newsegment) {
+ GST_DEBUG_OBJECT (dec, "Sending newsegment event");
+
+ event = gst_event_new_new_segment_full (FALSE,
+ dec->segment.rate, dec->segment.applied_rate,
+ dec->segment.format, dec->segment.start, dec->segment.stop,
+ dec->segment.time);
+ ret = gst_pad_push_event (dec->srcpad, event);
+ dec->sent_newsegment = TRUE;
+ }
- return GST_FLOW_OK;
+ if (dec->tags) {
+ gst_element_found_tags_for_pad (GST_ELEMENT_CAST (dec), dec->srcpad,
+ dec->tags);
+ dec->tags = NULL;
+ }
+
+ return ret;
}
static GstFlowReturn
case GST_STATE_CHANGE_READY_TO_PAUSED:
theora_info_init (&dec->info);
theora_comment_init (&dec->comment);
+ GST_DEBUG_OBJECT (dec, "Setting have_header to FALSE in READY->PAUSED");
dec->have_header = FALSE;
gst_theora_dec_reset (dec);
break;