X-Git-Url: http://code.vuplus.com/gitweb/?a=blobdiff_plain;ds=sidebyside;f=lib%2Fdvb%2Fpvrparse.cpp;h=71cbd602f06187bb7fced1640eb5f6c29ce8031a;hb=bbfcb7ea1f040d030277e2b6f2efa9ea0967bf2b;hp=1b827d3c03d8ac98ec81d52c08e5dfa01d1ac3e7;hpb=93ff1a63d34e62db3f83779de962b13a0464500f;p=vuplus_dvbapp diff --git a/lib/dvb/pvrparse.cpp b/lib/dvb/pvrparse.cpp index 1b827d3..71cbd60 100644 --- a/lib/dvb/pvrparse.cpp +++ b/lib/dvb/pvrparse.cpp @@ -36,8 +36,6 @@ int eMPEGStreamInformation::load(const char *filename) return -1; m_access_points.clear(); m_pts_to_offset.clear(); - pts_t last = -(1LL<<62); - int loaded = 0, skipped = 0; while (1) { unsigned long long d[2]; @@ -48,16 +46,9 @@ int eMPEGStreamInformation::load(const char *filename) d[0] = bswap_64(d[0]); d[1] = bswap_64(d[1]); #endif - if ((d[1] - last) > 90000/2) - { - m_access_points[d[0]] = d[1]; - m_pts_to_offset.insert(std::pair(d[1], d[0])); - last = d[1]; - loaded++; - } else - skipped++; + m_access_points[d[0]] = d[1]; + m_pts_to_offset.insert(std::pair(d[1], d[0])); } - eDebug("loaded %d, skipped %d", loaded, skipped); fclose(f); fixupDiscontinuties(); return 0; @@ -216,30 +207,45 @@ pts_t eMPEGStreamInformation::getInterpolated(off_t offset) return before_ts + diff; } -off_t eMPEGStreamInformation::getAccessPoint(pts_t ts) +off_t eMPEGStreamInformation::getAccessPoint(pts_t ts, int marg) { /* FIXME: more efficient implementation */ off_t last = 0; + off_t last2 = 0; + pts_t lastc = 0; for (std::map::const_iterator i(m_access_points.begin()); i != m_access_points.end(); ++i) { pts_t delta = getDelta(i->first); pts_t c = i->second - delta; - if (c > ts) - break; + if (c > ts) { + if (marg > 0) + return (last + i->first)/376*188; + else if (marg < 0) + return (last + last2)/376*188; + else + return last; + } + lastc = c; + last2 = last; last = i->first; } - return last; + if (marg < 0) + return (last + last2)/376*188; + else + return last; } int eMPEGStreamInformation::getNextAccessPoint(pts_t &ts, const pts_t &start, int direction) { off_t offset = getAccessPoint(start); + pts_t c1, c2; std::map::const_iterator i = m_access_points.find(offset); if (i == m_access_points.end()) { eDebug("getNextAccessPoint: initial AP not found"); return -1; } + c1 = i->second - getDelta(i->first); while (direction) { if (direction > 0) @@ -247,6 +253,12 @@ int eMPEGStreamInformation::getNextAccessPoint(pts_t &ts, const pts_t &start, in if (i == m_access_points.end()) return -1; ++i; + c2 = i->second - getDelta(i->first); + if (c1 == c2) { // Discontinuity + ++i; + c2 = i->second - getDelta(i->first); + } + c1 = c2; direction--; } if (direction < 0) @@ -257,6 +269,12 @@ int eMPEGStreamInformation::getNextAccessPoint(pts_t &ts, const pts_t &start, in return -1; } --i; + c2 = i->second - getDelta(i->first); + if (c1 == c2) { // Discontinuity + --i; + c2 = i->second - getDelta(i->first); + } + c1 = c2; direction++; } } @@ -266,7 +284,7 @@ int eMPEGStreamInformation::getNextAccessPoint(pts_t &ts, const pts_t &start, in return 0; } -eMPEGStreamParserTS::eMPEGStreamParserTS(eMPEGStreamInformation &streaminfo): m_streaminfo(streaminfo), m_pktptr(0), m_pid(-1), m_need_next_packet(0), m_skip(0) +eMPEGStreamParserTS::eMPEGStreamParserTS(eMPEGStreamInformation &streaminfo): m_streaminfo(streaminfo), m_pktptr(0), m_pid(-1), m_need_next_packet(0), m_skip(0), m_last_pts_valid(0) { } @@ -313,6 +331,9 @@ int eMPEGStreamParserTS::processPacket(const unsigned char *pkt, off_t offset) pts |= ((unsigned long long)(pkt[12]&0xFF)) << 7; pts |= ((unsigned long long)(pkt[13]&0xFE)) >> 1; ptsvalid = 1; + + m_last_pts = pts; + m_last_pts_valid = 1; #if 0 int sec = pts / 90000; @@ -347,19 +368,20 @@ int eMPEGStreamParserTS::processPacket(const unsigned char *pkt, off_t offset) if (ptsvalid) { m_streaminfo.m_access_points[offset] = pts; - eDebug("Sequence header at %llx, pts %llx", offset, pts); +// eDebug("Sequence header at %llx, pts %llx", offset, pts); } else - eDebug("Sequence header but no valid PTS value."); + /*eDebug("Sequence header but no valid PTS value.")*/; } - if (pkt[3] == 0x09) /* MPEG4 AVC unit access delimiter */ + if (pkt[3] == 0x09 && /* MPEG4 AVC unit access delimiter */ + (pkt[4] >> 5) == 0) /* and I-frame */ { if (ptsvalid) { m_streaminfo.m_access_points[offset] = pts; - eDebug("MPEG4 AVC UAD at %llx, pts %llx", offset, pts); +// eDebug("MPEG4 AVC UAD at %llx, pts %llx", offset, pts); } else - eDebug("MPEG4 AVC UAD but no valid PTS value."); + /*eDebug("MPEG4 AVC UAD but no valid PTS value.")*/; } } return 0; @@ -503,3 +525,15 @@ void eMPEGStreamParserTS::setPid(int _pid) m_pktptr = 0; m_pid = _pid; } + +int eMPEGStreamParserTS::getLastPTS(pts_t &last_pts) +{ + if (!m_last_pts_valid) + { + last_pts = 0; + return -1; + } + last_pts = m_last_pts; + return 0; +} +