From e38fa979923a2c3ce47822bce550ed2a5ed9364b Mon Sep 17 00:00:00 2001 From: Felix Domke Date: Sun, 5 Mar 2006 21:49:32 +0000 Subject: [PATCH 1/1] only sample each 40MB at max, use fallback bitrate if no other bitrate available --- lib/dvb/tstools.cpp | 55 ++++++++++++++++++++++++--------------------- 1 file changed, 29 insertions(+), 26 deletions(-) diff --git a/lib/dvb/tstools.cpp b/lib/dvb/tstools.cpp index 73ceb7e3..34edbc9e 100644 --- a/lib/dvb/tstools.cpp +++ b/lib/dvb/tstools.cpp @@ -185,36 +185,39 @@ int eDVBTSTools::getOffset(off_t &offset, pts_t &pts) if (!m_samples_taken) takeSamples(); - if (m_samples.empty()) - return -1; - + if (!m_samples.empty()) + { // eDebug("ok, samples ok"); - /* search entry before and after */ - std::map::const_iterator l = m_samples.lower_bound(pts); - std::map::const_iterator u = l; + /* search entry before and after */ + std::map::const_iterator l = m_samples.lower_bound(pts); + std::map::const_iterator u = l; - if (l != m_samples.begin()) - --l; + if (l != m_samples.begin()) + --l; - int birate; - if ((u == m_samples.end()) || (l == m_samples.end())) - return -1; - - pts_t pts_diff = u->first - l->first; - off_t offset_diff = u->second - l->second; + if ((u != m_samples.end()) && (l != m_samples.end())) + { + pts_t pts_diff = u->first - l->first; + off_t offset_diff = u->second - l->second; // eDebug("using: %llx:%llx -> %llx:%llx", l->first, u->first, l->second, u->second); - if (!pts_diff) - return -1; - - int bitrate = calcBitrate(); /* in bits/s */ - bitrate = offset_diff * 90000 * 8 / pts_diff; - - if (bitrate <= 0) - return -1; + if (pts_diff) + { + int bitrate = offset_diff * 90000 * 8 / pts_diff; + if (bitrate > 0) + { + offset = l->second; + offset += ((pts - l->first) * (pts_t)bitrate) / 8ULL / 90000ULL; + offset -= offset % 188; + return 0; + } + } + } + } - offset = l->second; - offset += ((pts - l->first) * (pts_t)bitrate) / 8ULL / 90000ULL; + eDebug("falling back"); + int bitrate = calcBitrate(); + offset = pts * (pts_t)bitrate / 8ULL / 90000ULL; offset -= offset % 188; return 0; @@ -322,8 +325,8 @@ void eDVBTSTools::takeSamples() int nr_samples = 30; off_t bytes_per_sample = (m_offset_end - m_offset_begin) / (long long)nr_samples; - if (bytes_per_sample < 1*1024*1024) - bytes_per_sample = 1*1024*1024; + if (bytes_per_sample < 40*1024*1024) + bytes_per_sample = 40*1024*1024; bytes_per_sample -= bytes_per_sample % 188; -- 2.30.2