Implement keyframe seeking in oggdemux by doing the double seek trick. First
seek to the required position, then read pages for all streams to grab the
granulepos (to know the timing of the keyframe) of each stream, then seek back
to the first keyframe.
After a seek, discard all packets before the packet with the granulepos on it so
that the output buffers contain valid timestamps.
Reorder some code so that we check the timestamps before allocating and pushing
an output buffer.
Do more checks on valid packets in ogm mode.
OGM demuxing no longer requires helper elements. It's done internally
in oggdemux. Vorbis comments are still not handled because I don't
have anything to test with.
gstoggstream.c:419: error: format ‘%lld’ expects type ‘long long int’, but argument 8 has type ‘gint64’
gstoggdemux.c:2253: error: format ‘%lld’ expects type ‘long long int’, but argument 8 has type ‘GstClockTime’
gstoggdemux.c:2333: error: format ‘%lld’ expects type ‘long long int’, but argument 8 has type ‘GstClockTime’
Timestamp generation was broken by the last commit for formats
with a non-zero granule shift. Also keep track of the last keyframe
so that we can regenerate granulepos for theora.
Add a granule to granulepos conversion function. Fix the duration
function for vorbis. Handle timestamps on header packets differently
and be more careful about calculating OFFSET and OFFSET_END. After
this change, timestamps for vorbis don't exactly match up with the
timestamps that vorbisparse outputs, but it's unclear if vorbisparse
is actually correct and it would add a lot more code to make oggdemux
match vorbisparse. Fixes#602790.
Adds code that parses headers of various formats encapsulated in
Ogg in order to calculate timestamps and durations of each buffer.
Removes the creation of helper decoder elements to do this calculation
via conversion queries.
Fixes: #344013, #568014.
Revert previous 'fix' for bug #588717 and fix it properly, whilst
maintaining the streamheader field on the output caps. Also make
sure we don't leak header buffers we couldn't push when downstream
is unlinked. Add unit test for the presence of the streamheader
field on the output caps and for the issue from bug #588717.
Fix caps warning when there's no element linked downstream, and pass
not-linked flow return value correctly up the chain, so we error out
correctly. Fixes#588717.
For this to work properly, theoradec and vorbisdec need to put
tag events received from upstream into the pending_events list
so they get pushed out after any newsegment event, not before.
When we feed the ogg sync layer, we need to feed it contiguous data even if the
sync layer did not consume all of it yet. This makes sure that it always finds
the next page even for more corrupted files. Use a different read_offset for
this purpose. since we now keep track of the sync layer, we don't have to reset
after finding a start of a page.
Add some more debug info for the error paths.
Only reset the sync layer when we perform a seek operation.
Avoid failure when the next chain has no bos pages but instead simply ignore it.
when we receive unknown page serial numbers mid stream, don't fail but post a
warning and hope that we get back on track later.
Fixes#579642
Original commit message from CVS:
* ext/ogg/gstoggdemux.c: (gst_ogg_pad_class_init),
(gst_ogg_pad_dispose), (gst_ogg_pad_finalize):
Use G_DEFINE_TYPE for the OggPad to get some threadsafe type
init from glib.
Original commit message from CVS:
* ext/ogg/gstoggdemux.c: (gst_ogg_demux_sink_event):
If no stream was found before receiving EOS, post an error message.
Fixes#561924.
Original commit message from CVS:
* ext/ogg/gstoggdemux.c: (gst_ogg_pad_submit_packet),
(gst_ogg_demux_deactivate_current_chain),
(gst_ogg_demux_perform_seek), (gst_ogg_demux_handle_page),
(gst_ogg_demux_loop):
* ext/ogg/gstoggdemux.h:
Copy seqnums around to track playback segments and messages.
Original commit message from CVS:
Patch by: Daniel Drake <dsd at laptop dot org>
* ext/ogg/gstoggmux.c: (gst_ogg_mux_clear_collectpads):
Unref all buffers when clearing collectpads. Fixes bug #546955.
Original commit message from CVS:
Patch by: Alessandro Dessina <alessandro nnva org>
* ext/ogg/gstoggdemux.c: (gst_ogg_demux_deactivate_current_chain),
(gst_ogg_demux_activate_chain):
Don't add pads and activate them for skeleton streams. These are already
handled inside oggdemux. Fixes bug #537599.