/* FIXME, this needs to be moved to the demuxer */ static GstFlowReturn theora_dec_push_forward (GstTheoraDec * dec, GstBuffer * buf) { GstFlowReturn result = GST_FLOW_OK; GstClockTime outtime = GST_BUFFER_TIMESTAMP (buf); if (outtime == GST_CLOCK_TIME_NONE) { dec->queued = g_list_append (dec->queued, buf); GST_DEBUG_OBJECT (dec, "queued buffer"); } else { if (dec->queued) { gint64 size; GList *walk; GST_DEBUG_OBJECT (dec, "first buffer with time %" GST_TIME_FORMAT, GST_TIME_ARGS (outtime)); size = g_list_length (dec->queued); for (walk = dec->queued; walk; walk = g_list_next (walk)) { GstBuffer *buffer = GST_BUFFER (walk->data); GstClockTime time; time = outtime - gst_util_uint64_scale_int (size * GST_SECOND, dec->info.fps_denominator, dec->info.fps_numerator); GST_DEBUG_OBJECT (dec, "patch buffer %lld %lld", size, time); GST_BUFFER_TIMESTAMP (buffer) = time; /* Next timestamp - this one is duration */ GST_BUFFER_DURATION (buffer) = (outtime - gst_util_uint64_scale_int ((size - 1) * GST_SECOND, dec->info.fps_denominator, dec->info.fps_numerator)) - time; if (dec->discont) { GST_BUFFER_FLAG_SET (buffer, GST_BUFFER_FLAG_DISCONT); dec->discont = FALSE; } /* ignore the result.. */ if (clip_buffer (dec, buffer)) gst_pad_push (dec->srcpad, buffer); else gst_buffer_unref (buffer); size--; } g_list_free (dec->queued); dec->queued = NULL; } if (dec->discont) { GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_DISCONT); dec->discont = FALSE; } if (clip_buffer (dec, buf)) result = gst_pad_push (dec->srcpad, buf); else gst_buffer_unref (buf); } return result; }
static GstFlowReturn theora_dec_push_forward (GstTheoraDec * dec, GstBuffer * buf) { GstFlowReturn result = GST_FLOW_OK; if (clip_buffer (dec, buf)) { if (dec->discont) { GST_LOG_OBJECT (dec, "setting DISCONT"); GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_DISCONT); dec->discont = FALSE; } result = gst_pad_push (dec->srcpad, buf); } else { gst_buffer_unref (buf); } return result; }