Changeset 25480 for titan/titan/player.h
- Timestamp:
- 01/06/14 17:36:42 (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
titan/titan/player.h
r25392 r25480 1618 1618 } 1619 1619 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 // 1635 off64_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.