Changeset 25480 for titan/titan/player.h


Ignore:
Timestamp:
01/06/14 17:36:42 (9 years ago)
Author:
gost
Message:

[intern] add new function playergetptspos

File:
1 edited

Legend:

Unmodified
Added
Removed
  • titan/titan/player.h

    r25392 r25480  
    16181618}
    16191619
    1620 
    1621 #endif
     1620//praez = 1 .... sekunden
     1621//                      =       2 .... zehntel
     1622//                      = 3 .... hundertstel
     1623//                      = 4 .... volle Uebereinstimmung
     1624//
     1625//type  = 0 .... alle
     1626//                      = 1 .... nur PCR
     1627//                      = 2 .... nur Video
     1628//                      = 3 .... nur Audio
     1629//
     1630//flag = 0 --> play ts
     1631//flag = 1 --> timeshift
     1632//flag = 2 --> timeshift, not in play mode (only recording)
     1633//flag = 9 --> dataset mode
     1634//
     1635off64_t playergetptspos(unsigned long long fpts, off64_t pos, int dir, int praez, int type, int flag, char* dsn)
     1636{
     1637        unsigned long long pts;
     1638        int ret = 0, dupfd = -1, left = 0, tssize = 0, recbsize = 0;
     1639        unsigned char* buf = NULL;
     1640        unsigned char *payload;
     1641        int pid = 0, pusi = 0;
     1642        char* packet;
     1643       
     1644        if(type > 3)
     1645        {
     1646                printf("type %i nicht unterstützt\n", type);
     1647                return -1;
     1648        }
     1649       
     1650        if(flag == 2)
     1651                snode = getservice(RECORDTIMESHIFT, 0);
     1652        else if(flag != 9)
     1653                snode = getservice(RECORDPLAY, 0);
     1654               
     1655        if(flag == 9)
     1656        {
     1657                tssize = 188;
     1658                recbsize = tssize * 1024;
     1659                dupfd = open(dsn, O_RDONLY | O_LARGEFILE );
     1660        }
     1661        else
     1662        {
     1663                tssize = snode->tssize;
     1664                recbsize = snode->tssize * 1024;
     1665                dupfd = open(snode->recname, O_RDONLY | O_LARGEFILE);
     1666        }
     1667
     1668        if(dupfd < 0)
     1669        {
     1670                err("copy source fd not ok");
     1671                return -1;
     1672        }
     1673
     1674        buf = malloc(recbsize);
     1675        if(buf == NULL)
     1676        {
     1677                err("no mem");
     1678                return -1;
     1679        }
     1680        packet = buf;
     1681        if(dir > 0) 
     1682                pos = lseek64(dupfd, pos, SEEK_SET);
     1683        else
     1684                pos = lseek64(dupfd, pos - recbsize, SEEK_SET);
     1685       
     1686        ret = read(dupfd,  buf, recbsize);
     1687        close(dupfd);
     1688        left = 0;
     1689       
     1690        if(buf[0] != 0x47)
     1691        {
     1692                while(left < tssize)
     1693                {
     1694                        if(buf[left] == 0x47) break;
     1695                        left++;
     1696                }
     1697                if(left >= tssize)
     1698                {
     1699                        free(buf);
     1700                        return -1;
     1701                }       
     1702        }
     1703        pts = 0;
     1704        while(left <= recbsize - tssize)
     1705        {
     1706                if(pts != 0)
     1707                {
     1708                        switch( praez )
     1709          {
     1710        case 1 :        if(fpts / 90000 != pts / 90000)
     1711                                                        pts = 0;
     1712                                                break;
     1713        case 2 :        if(fpts / 9000 != pts / 9000)
     1714                                                        pts = 0;
     1715                                                break;
     1716        case 3 :        if(fpts / 900 != pts / 900)
     1717                                                        pts = 0;
     1718                                                break;         
     1719        case 4 :        if(fpts != pts )
     1720                                                        pts = 0;
     1721                                                break;
     1722                                default :       free(buf); return -1; break;
     1723                        }
     1724                        if(pts != 0)
     1725                        {       
     1726                                pos = pos + left - tssize;
     1727                                free(buf);
     1728                                return pos;
     1729                        }
     1730                }
     1731                packet = buf + left;
     1732                left = left + tssize;
     1733                                               
     1734                pid = ((packet[1] << 8) | packet[2]) & 0x1FFF;
     1735                pusi = !!(packet[1] & 0x40);
     1736                //check for adaption field
     1737                if(packet[3] & 0x20)
     1738                {
     1739                        if(type > 1)continue;
     1740                        if(packet[4] >= 183) continue;
     1741                        if(packet[4])
     1742                        {
     1743                                if(packet[5] & 0x10) //PCR present
     1744                                {
     1745                                        pts = ((unsigned long long)(packet[6] & 0xFF)) << 25;
     1746                                        pts |= ((unsigned long long)(packet[7] & 0xFF)) << 17;
     1747                                        pts |= ((unsigned long long)(packet[8] & 0xFE)) << 9;
     1748                                        pts |= ((unsigned long long)(packet[9] & 0xFF)) << 1;
     1749                                        pts |= ((unsigned long long)(packet[10] & 0x80)) >> 7;
     1750                                        continue;
     1751                                }
     1752                        }
     1753                        payload = packet + packet[4] + 4 + 1;
     1754                } else
     1755                        payload = packet + 4;
     1756               
     1757                if(type == 1) continue;
     1758                if(!pusi) continue;
     1759               
     1760                if (payload[0] || payload[1] || (payload[2] != 1))
     1761                        continue;
     1762               
     1763                        //stream use extension mechanism def in ISO 13818-1 Amendment 2
     1764                if(payload[3] == 0xFD)
     1765                {
     1766                        if(payload[7] & 1) //PES extension flag
     1767                        {
     1768                                int offs = 0;
     1769                                if(payload[7] & 0x80) offs += 5; //pts avail
     1770                                if(payload[7] & 0x40) offs += 5; //dts avail
     1771                                if(payload[7] & 0x20) offs += 6; //escr avail
     1772                                if(payload[7] & 0x10) offs += 3; //es rate
     1773                                if(payload[7] & 0x8) offs += 1; //dsm trickmode
     1774                                if(payload[7] & 0x4) offs += 1; //additional copy info
     1775                                if(payload[7] & 0x2) offs += 2; //crc
     1776                                if(payload[8] < offs) continue;
     1777
     1778                                uint8_t pef = payload[9 + offs++]; //pes extension field
     1779                                if(pef & 1) //pes extension flag 2
     1780                                {
     1781                                        if(pef & 0x80) offs += 16; //private data flag
     1782                                        if(pef & 0x40) offs += 1; //pack header field flag
     1783                                        if(pef & 0x20) offs += 2; //program packet sequence counter flag
     1784                                        if(pef & 0x10) offs += 2; //P-STD buffer flag
     1785                                        if(payload[8] < offs) continue;
     1786
     1787                                        uint8_t stream_id_extension_len = payload[9 + offs++] & 0x7F;
     1788                                        if(stream_id_extension_len >= 1)
     1789                                        {
     1790                                                if(payload[8] < (offs + stream_id_extension_len)) continue;
     1791                                                //stream_id_extension_bit (should not set)
     1792                                                if(payload[9 + offs] & 0x80) continue;
     1793                                                switch(payload[9 + offs])
     1794                                                {
     1795                                                        case 0x55 ... 0x5f: break; //VC-1
     1796                                                        case 0x71: break; //AC3 / DTS
     1797                                                        case 0x72: break; //DTS - HD
     1798                                                        default:
     1799                                                                printf("skip unknwn stream_id_extension %02x\n", payload[9 + offs]);
     1800                                                                continue;
     1801                                                }
     1802                                        }
     1803                                        else
     1804                                                continue;
     1805                                }
     1806                                else
     1807                                        continue;
     1808                        }
     1809                        else
     1810                                continue;
     1811                }
     1812                //drop non-audio, non-video packets because other streams
     1813                //can be non-compliant.
     1814                //0xC0 = audio, 0xE0 = video
     1815                else if(((payload[3] & 0xE0) != 0xC0) && ((payload[3] & 0xF0) != 0xE0))
     1816                        continue;
     1817
     1818                if((payload[7] & 0x80) && ((payload[3] & 0xF0) != 0xE0) && (type == 0 || type == 2)) //PTS video
     1819                {
     1820                        pts = ((unsigned long long)(payload[9] & 0xE)) << 29;
     1821                        pts |= ((unsigned long long)(payload[10] & 0xFF)) << 22;
     1822                        pts |= ((unsigned long long)(payload[11] & 0xFE)) << 14;
     1823                        pts |= ((unsigned long long)(payload[12] & 0xFF)) << 7;
     1824                        pts |= ((unsigned long long)(payload[13] & 0xFE)) >> 1;
     1825                        continue;
     1826                }
     1827                if((payload[7] & 0x80) && ((payload[3] & 0xE0) != 0xC0) && (type == 0 || type == 3)) //PTS audio
     1828                {
     1829                        pts = ((unsigned long long)(payload[9] & 0xE)) << 29;
     1830                        pts |= ((unsigned long long)(payload[10] & 0xFF)) << 22;
     1831                        pts |= ((unsigned long long)(payload[11] & 0xFE)) << 14;
     1832                        pts |= ((unsigned long long)(payload[12] & 0xFF)) << 7;
     1833                        pts |= ((unsigned long long)(payload[13] & 0xFE)) >> 1;
     1834                        continue;
     1835                }
     1836        }
     1837        free(buf);
     1838        return recbsize * -1;
     1839}
     1840
     1841#endif
Note: See TracChangeset for help on using the changeset viewer.