matroskademux: set limit how much to backtrack to find a keyframe

If we seek without an index and land on a cluster that starts
with a delta frame.

https://bugzilla.gnome.org/show_bug.cgi?id=790696
This commit is contained in:
Tim-Philipp Müller 2018-08-15 11:49:57 +01:00
parent ffb4533137
commit 2990f0730a

View file

@ -2082,6 +2082,12 @@ bit_reader_skip_ebml_num (GstBitReader * br)
* (random value, mostly for sanity checking) */ * (random value, mostly for sanity checking) */
#define MAX_CLUSTER_INFO_PROBE_LENGTH 256 #define MAX_CLUSTER_INFO_PROBE_LENGTH 256
/* Don't scan back more than this much in time from the cluster we originally
* landed on. This is mostly a sanity check in case a file always has keyframes
* in the middle of clusters and never at the beginning. Without this we would
* always scan back to the beginning of the file in that case. */
#define MAX_CLUSTER_BACKTRACK_SECS 30
static gboolean static gboolean
gst_matroska_demux_peek_cluster_info (GstMatroskaDemux * demux, gst_matroska_demux_peek_cluster_info (GstMatroskaDemux * demux,
ClusterInfo * cluster, guint64 offset) ClusterInfo * cluster, guint64 offset)
@ -2243,6 +2249,17 @@ gst_matroska_demux_scan_back_for_keyframe_cluster (GstMatroskaDemux * demux,
break; break;
} }
if (cluster.time != GST_CLOCK_TIME_NONE) {
GstClockTimeDiff distance = GST_CLOCK_DIFF (cluster.time, *cluster_time);
if (distance < 0 || distance > MAX_CLUSTER_BACKTRACK_SECS * GST_SECOND) {
GST_DEBUG_OBJECT (demux, "Haven't found cluster with keyframe within "
"%u secs of original seek target cluster, stopping",
MAX_CLUSTER_BACKTRACK_SECS);
break;
}
}
off -= cluster.prev_size; off -= cluster.prev_size;
if (off <= first_cluster_offset) { if (off <= first_cluster_offset) {
GST_LOG_OBJECT (demux, "Reached first cluster, stopping"); GST_LOG_OBJECT (demux, "Reached first cluster, stopping");