Additional tags are: audiocodecid, videocodecid framerate and (in the
non-live case) filesize.
While at it, fix index rewriting to update duration and filesize
values even if the index is empty.
Fixes#613094.
Some Flash players (for instance JW Player) always expect a duration
tag, otherwise they don't start playback.
If duration can be queried from the sink pads or is provided as a tag,
use it. Otherwise try to determine it from the last seen timestamp of
the sink pads after EOS and rewrite it in the header before writing
the index.
For files containing video only video keyframes are valid points to
which a player can seek. For audio-only files any tag start is a valid
seek point.
See #601236.
* The nb_elements for arrays is just an indication, we can therefore ignore
it and carry on parsing metadata items until we reach the end marker.
* If type == 3, then the script tag contains a list of object followed
by the end marker.
Refactor code slightly to handle both cases
https://bugzilla.gnome.org/show_bug.cgi?id=610447
Scan for needed part upon a seek as opposed to doing a complete scan
at startup, which may take some time depending on file and/or platform.
Also accept index metadata in pull mode and peek for some metadata
at the end of the file when deemed appropriate.
Multiple flvparse/flvdemux instances should be able to operate without
trampling over each other by accidentally re-using the same (static)
variables. (Spotted by Mark Nauwelaerts)
Used the _add_associationv variant of GstIndex since we know how many
associations we're adding. Trims up to 50% from index generation time.
Note : It would be great if the index could be generated on the fly or
on request as opposed to being fully created at startup.
sizeof("foo") includes the string's NUL-terminator in the size returned,
but we're writing strings here with an explicit size at the beginning
and no NUL-terminator. In most cases using sizeof("foo") as length in
memcpy is not harmful, but it is where the string goes right at the
end of our buffer to write, since we don't allocate space for that
NUL terminator.
We shouldn't register a new GstTag for every unknown tag
we find as this might lead to conflicts and also those
tags are essentially unknown.
Add mappings for some known tags and also convert string
dates to GDate, as found in many FLV files.
Add support for ECMA arrays in script tags. This fixes
seeking on some files that have the seek table stored
inside an ECMA array instead of the normal array.
Original commit message from CVS:
2008-11-24 Julien Moutte <julien@fluendo.com>
* gst/flv/gstflvdemux.c: (gst_flv_demux_find_offset),
(gst_flv_demux_handle_seek_push),
(gst_flv_demux_handle_seek_pull):
Fix non key unit seeking by always going to the previous
keyframe. Mark
the discont flag when we've moved in the file.
* gst/flv/gstflvparse.c: (gst_flv_parse_audio_negotiate): MP3
streams
are parsed already, makes autoplugged pipelines shorter.
Original commit message from CVS:
* gst/flv/gstflvdemux.c: (gst_flv_demux_cleanup),
(gst_flv_demux_loop), (gst_flv_demux_handle_seek_push),
(gst_flv_demux_handle_seek_pull), (gst_flv_demux_sink_event),
(gst_flv_demux_dispose), (gst_flv_demux_init):
* gst/flv/gstflvdemux.h:
* gst/flv/gstflvparse.c: (gst_flv_parse_tag_audio),
(gst_flv_parse_tag_video), (gst_flv_parse_tag_timestamp):
Put the GstSegment directly into the instance struct instead of
allocating and free'ing it again.
Push tags already if only one pad was added, no need to wait for
the second one.
When generating our index set has_video and has_audio if we find
video or audio in case the FLV header has incorrect data.
Original commit message from CVS:
* gst/flv/gstflvdemux.c: (gst_flv_demux_chain),
(gst_flv_demux_pull_tag), (gst_flv_demux_pull_header),
(gst_flv_demux_create_index):
* gst/flv/gstflvparse.c: (gst_flv_parse_tag_script),
(gst_flv_parse_tag_audio), (gst_flv_parse_tag_video),
(gst_flv_parse_tag_timestamp), (gst_flv_parse_tag_type),
(gst_flv_parse_header):
* gst/flv/gstflvparse.h:
Don't memcpy() all data we want to push downstream, instead just
create subbuffers and push them downstream.
Fix some minor memory leaks.
Original commit message from CVS:
* gst/flv/Makefile.am:
Fix (non-critical) syntax error and add all required CFLAGS and LIBS.
* gst/flv/gstflvparse.c: (FLV_GET_STRING),
(gst_flv_parse_metadata_item), (gst_flv_parse_tag_script),
(gst_flv_parse_tag_audio), (gst_flv_parse_tag_video),
(gst_flv_parse_tag_timestamp), (gst_flv_parse_tag_type):
Rewrite the script tag parsing to make sure we don't try to read
more data than we have. Also use GST_READ_UINT24_BE directly and
fix some minor memory leaks.
This should make all crashes on fuzzed FLV files disappear.
Original commit message from CVS:
* gst/flv/gstflvparse.c: (FLV_GET_STRING),
(gst_flv_parse_tag_audio), (gst_flv_parse_tag_video),
(gst_flv_parse_tag_type), (gst_flv_parse_header):
Properly check everywhere that we have enough data to parse and
don't read outside the allocated memory region.
Original commit message from CVS:
* gst/flv/gstflvparse.c: (gst_flv_parse_tag_audio),
(gst_flv_parse_tag_video):
If the caps change during playback and negotiation fails error out
instead of trying to continue.
Original commit message from CVS:
* gst/flv/gstflvmux.c: (gst_flv_mux_audio_pad_setcaps),
(gst_flv_mux_request_new_pad), (gst_flv_mux_write_buffer),
(gst_flv_mux_collected):
* gst/flv/gstflvmux.h:
* gst/flv/gstflvparse.c: (gst_flv_parse_audio_negotiate):
Add support for Speex audio and allow buffers without valid
timestamp in the muxer.
Original commit message from CVS:
* gst/flv/gstflvdemux.c: (gst_flv_demux_loop),
(gst_flv_demux_find_offset), (gst_flv_demux_handle_seek_push),
(gst_flv_demux_handle_seek_pull):
Don't post an error message on the bus if sending EOS downstream
didn't work. Fixes bug #550454.
Fix seek event handling to look at the flags of the seek event
instead of assuming some random flags, don't send segment-start
messages when operating in push mode and push seek events upstream
if we couldn't handle them.
Original commit message from CVS:
* gst/flv/gstflvdemux.c: (gst_flv_demux_create_index),
(gst_flv_demux_loop):
* gst/flv/gstflvparse.c: (gst_flv_parse_tag_script),
(gst_flv_parse_tag_audio), (gst_flv_parse_tag_video),
(gst_flv_parse_tag_timestamp):
* gst/flv/gstflvparse.h:
In pull mode we create our own index before doing anything else
and don't use the index provided by some files (which are more than
often incorrect and cause failed seeks).
For push mode we still use the index provided by the file and extend it
while doing the playback.
Original commit message from CVS:
* gst/flv/gstflvdemux.c: (gst_flv_demux_push_src_event),
(gst_flv_demux_loop), (gst_flv_demux_handle_seek_pull),
(gst_flv_demux_sink_event):
Instead of using gst_pad_event_default() use a small
gst_pad_push_event() wrapper that only does what we want and is much
more simple.
Original commit message from CVS:
* gst/flv/gstflvdemux.c: (gst_flv_demux_change_state),
(gst_flv_demux_set_index), (gst_flv_demux_init):
* gst/flv/gstflvdemux.h:
If our index was created by the element and not provided from the
outside we should destroy it when starting a new stream to get
all old entries removed.
Original commit message from CVS:
* gst/flv/gstflvdemux.c: (gst_flv_demux_pull_range):
Improve debugging a bit when pulling a buffer from upstream fails.
Original commit message from CVS:
* gst/flv/gstflvdemux.c: (gst_flv_demux_cleanup),
(gst_flv_demux_handle_seek_pull), (gst_flv_demux_dispose):
* gst/flv/gstflvdemux.h:
* gst/flv/gstflvparse.c: (gst_flv_parse_tag_audio),
(gst_flv_parse_tag_video):
Close the currently playing segment from the streaming thread
instead of the thread where the seek event is handled.
Original commit message from CVS:
* gst/flv/gstflvmux.c: (gst_flv_mux_audio_pad_setcaps),
(gst_flv_mux_write_buffer):
Don't set video_codec to the value that actually should go
into audio codec, otherwise we create invalid files.
Fixes bug #556564.
Original commit message from CVS:
* gst/flv/gstflvparse.c: (gst_flv_parse_tag_audio),
(gst_flv_parse_tag_video):
Use gst_pad_alloc_buffer_and_set_caps() to make sure we get
a buffer with caps that we can work with (i.e. the pad's caps).
Add non-keyframe video frames to the index too but without the
keyframe flag.
Add audio frames to the index only if we have no video stream.
Original commit message from CVS:
* gst/flv/gstflvparse.c: (gst_flv_parse_tag_audio),
(gst_flv_parse_tag_video):
Create pads from the pad templates, use fixed caps on them
and only activate them after the caps are set.
Original commit message from CVS:
* gst/flv/gstflvdemux.c: (gst_flv_demux_loop):
* gst/flv/gstflvparse.c: (gst_flv_parse_tag_timestamp):
* gst/flv/gstflvparse.h:
Get an approximate duration of the file by looking at the timestamp
of the last tag in pull mode. If we get (maybe better) duration from
metadata later we'll use that instead.
Original commit message from CVS:
* gst/flv/gstflvdemux.c: (gst_flv_demux_pull_range),
(gst_flv_demux_pull_tag), (gst_flv_demux_pull_header):
Refactor _pull_range() logic with checks into a seperate function
to make things a bit more readable.
Original commit message from CVS:
* gst/flv/gstflvdemux.c: (gst_flv_demux_chain),
(gst_flv_demux_base_init):
Use gst_element_class_set_details_simple().
If we get GST_FLOW_NOT_LINKED in the parse loop but at least
one of the pads is linked continue the loop.
Original commit message from CVS:
* gst/flv/gstflvparse.c: (gst_flv_parse_audio_negotiate),
(gst_flv_parse_tag_audio), (gst_flv_parse_video_negotiate):
Correct caps for video codec id 5: It's On2 VP6 with alpha channel
which needs a different decoder and has different caps.
Add support for audio codec id 14, which is MP3 with 8kHz sampling
rate.
Fix endianness and signedness for raw audio codec ids.
Add support for alaw and mulaw audio.
Original commit message from CVS:
* gst/flv/gstflvdemux.c: (gst_flv_demux_chain):
Go out of the parse loop as soon as we get an error instead
of parsing until the GstAdapter is empty.
Add some explanations about the header and tag size.
Don't print synchronizing message if everything is fine.
Original commit message from CVS:
* gst/flv/Makefile.am:
* gst/flv/gstflvdemux.c: (plugin_init):
* gst/flv/gstflvmux.c: (gst_flv_mux_base_init),
(gst_flv_mux_class_init), (gst_flv_mux_init),
(gst_flv_mux_finalize), (gst_flv_mux_reset),
(gst_flv_mux_handle_src_event), (gst_flv_mux_handle_sink_event),
(gst_flv_mux_video_pad_setcaps), (gst_flv_mux_audio_pad_setcaps),
(gst_flv_mux_request_new_pad), (gst_flv_mux_release_pad),
(gst_flv_mux_write_header), (gst_flv_mux_write_buffer),
(gst_flv_mux_collected), (gst_flv_mux_change_state):
* gst/flv/gstflvmux.h:
Add first version of a FLV muxer. The only missing feature is writing
of stream metadata.
Original commit message from CVS:
* gst/flv/gstflvparse.c: (gst_flv_parse_metadata_item),
(gst_flv_parse_tag_script):
Handle NULL returns from FLV_GET_STRING() more gracefully. Fixes
crash caused by a strlen on a NULL string (#527622).