![Thomas Petazzoni](/assets/img/avatar_default.png)
In the past xbmc delivered its own ffmpeg source code with specific patches to address bugs found during the use of xbmc. For Helix the ffmpeg source code was removed, Helix uses a vanilla ffmpeg source tarball and applies this patchset on top of it. Downloaded from https://github.com/xbmc/FFmpeg/compare/FFmpeg:release/2.5...release/2.5-xbmc.patch [Thomas: use individual patches instead.] Signed-off-by: Bernd Kuhls <bernd.kuhls@t-online.de> Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
75 lines
2.5 KiB
Diff
75 lines
2.5 KiB
Diff
From c57e5b8154f5fe1457f4c64e04885a2cdfb37f51 Mon Sep 17 00:00:00 2001
|
|
From: Joakim Plate <elupus@ecce.se>
|
|
Date: Sat, 22 Oct 2011 19:01:38 +0200
|
|
Subject: [PATCH 08/13] Get stream durations using read_timestamp
|
|
|
|
Patch part of the XBMC patch set for ffmpeg, downloaded from
|
|
https://github.com/xbmc/FFmpeg/.
|
|
|
|
Signed-off-by: Bernd Kuhls <bernd.kuhls@t-online.de>
|
|
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
|
---
|
|
libavformat/utils.c | 39 +++++++++++++++++++++++++++++++++++++++
|
|
1 file changed, 39 insertions(+)
|
|
|
|
diff --git a/libavformat/utils.c b/libavformat/utils.c
|
|
index 3e8af50..f4fb172 100644
|
|
--- a/libavformat/utils.c
|
|
+++ b/libavformat/utils.c
|
|
@@ -2356,6 +2356,41 @@ static void estimate_timings_from_bit_rate(AVFormatContext *ic)
|
|
#define DURATION_MAX_READ_SIZE 250000LL
|
|
#define DURATION_MAX_RETRY 4
|
|
|
|
+static void av_estimate_timings_from_pts2(AVFormatContext *ic, int64_t old_offset)
|
|
+{
|
|
+ AVStream *st;
|
|
+ int i, step= 1024;
|
|
+ int64_t ts, pos;
|
|
+
|
|
+ for(i=0;i<ic->nb_streams;i++) {
|
|
+ st = ic->streams[i];
|
|
+
|
|
+ pos = 0;
|
|
+ ts = ic->iformat->read_timestamp(ic, i, &pos, DURATION_MAX_READ_SIZE);
|
|
+ if (ts == AV_NOPTS_VALUE)
|
|
+ continue;
|
|
+ if (st->start_time > ts || st->start_time == AV_NOPTS_VALUE)
|
|
+ st->start_time = ts;
|
|
+
|
|
+ pos = avio_size(ic->pb) - 1;
|
|
+ do {
|
|
+ pos -= step;
|
|
+ ts = ic->iformat->read_timestamp(ic, i, &pos, pos + step);
|
|
+ step += step;
|
|
+ } while (ts == AV_NOPTS_VALUE && pos >= step && step < DURATION_MAX_READ_SIZE);
|
|
+
|
|
+ if (ts == AV_NOPTS_VALUE)
|
|
+ continue;
|
|
+
|
|
+ if (st->duration < ts - st->start_time || st->duration == AV_NOPTS_VALUE)
|
|
+ st->duration = ts - st->start_time;
|
|
+ }
|
|
+
|
|
+ fill_all_stream_timings(ic);
|
|
+
|
|
+ avio_seek(ic->pb, old_offset, SEEK_SET);
|
|
+}
|
|
+
|
|
/* only usable for MPEG-PS streams */
|
|
static void estimate_timings_from_pts(AVFormatContext *ic, int64_t old_offset)
|
|
{
|
|
@@ -2506,6 +2541,10 @@ static void estimate_timings(AVFormatContext *ic, int64_t old_offset)
|
|
* the components */
|
|
fill_all_stream_timings(ic);
|
|
ic->duration_estimation_method = AVFMT_DURATION_FROM_STREAM;
|
|
+ } else if (ic->iformat->read_timestamp &&
|
|
+ file_size && ic->pb->seekable) {
|
|
+ /* get accurate estimate from the PTSes */
|
|
+ av_estimate_timings_from_pts2(ic, old_offset);
|
|
} else {
|
|
/* less precise: use bitrate info */
|
|
estimate_timings_from_bit_rate(ic);
|
|
--
|
|
2.1.0
|
|
|