42 #define MAX_RESYNC_SIZE 65536
44 #define MAX_PES_PAYLOAD 200*1024
46 #define MAX_MP4_DESCR_COUNT 16
87 #define MAX_PIDS_PER_PROGRAM 64
156 #define PES_START_SIZE 6
157 #define PES_HEADER_SIZE 9
158 #define MAX_PES_HEADER_SIZE (9 + 255)
188 for(i=0; i<ts->
nb_prg; i++)
189 if(ts->
prg[i].
id == programid)
216 for(i=0; i<ts->
nb_prg; i++) {
217 if(ts->
prg[i].
id == programid) {
241 int used = 0, discarded = 0;
243 for(i=0; i<ts->
nb_prg; i++) {
246 if(p->
pids[j] != pid)
260 return !used && discarded;
268 const uint8_t *buf,
int buf_size,
int is_start)
387 memset(stat, 0, packet_size*
sizeof(
int));
389 for(x=i=0; i<size-3; i++){
390 if(buf[i] == 0x47 && !(buf[i+1] & 0x80) && (buf[i+3] & 0x30)){
392 if(stat[x] > best_score){
399 if(x == packet_size) x= 0;
408 int score, fec_score, dvhs_score;
418 if (score > fec_score && score > dvhs_score)
return TS_PACKET_SIZE;
432 static inline int get8(
const uint8_t **pp,
const uint8_t *p_end)
445 static inline int get16(
const uint8_t **pp,
const uint8_t *p_end)
451 if ((p + 1) >= p_end)
460 static char *
getstr8(
const uint8_t **pp,
const uint8_t *p_end)
467 len =
get8(&p, p_end);
470 if ((p + len) > p_end)
483 const uint8_t **pp,
const uint8_t *p_end)
487 val =
get8(pp, p_end);
492 val =
get16(pp, p_end);
496 val =
get8(pp, p_end);
499 h->
version = (val >> 1) & 0x1f;
500 val =
get8(pp, p_end);
504 val =
get8(pp, p_end);
566 uint32_t stream_type,
const StreamType *types)
578 uint32_t stream_type, uint32_t prog_reg_desc)
589 "stream=%d stream_type=%x pid=%x prog_reg_desc=%.4s\n",
595 if (prog_reg_desc ==
AV_RL32(
"HDMV") &&
606 memcpy(sub_pes, pes,
sizeof(*sub_pes));
614 sub_st->
id = pes->
pid;
679 int au_start_flag = 0, au_end_flag = 0, ocr_flag = 0, idle_flag = 0;
680 int padding_flag = 0, padding_bits = 0, inst_bitrate_flag = 0;
681 int dts_flag = -1, cts_flag = -1;
690 au_start_flag = au_end_flag = 1;
700 if (!idle_flag && (!padding_flag || padding_bits != 0)) {
726 if (inst_bitrate_flag)
743 const uint8_t *buf,
int buf_size,
int is_start,
764 while (buf_size > 0) {
780 code = pes->
header[3] | 0x100;
807 if (code != 0x1bc && code != 0x1bf &&
808 code != 0x1f0 && code != 0x1f1 &&
809 code != 0x1ff && code != 0x1f2 &&
859 unsigned int flags, pes_ext, skip;
865 if ((flags & 0xc0) == 0x80) {
868 }
else if ((flags & 0xc0) == 0xc0) {
878 skip = (pes_ext >> 4) & 0xb;
881 if ((pes_ext & 0x41) == 0x01 &&
884 if ((r[0] & 0x7f) > 0 && (r[1] & 0x80) == 0)
895 p += sl_header_bytes;
896 buf_size -= sl_header_bytes;
901 if (buf_size > 0 && pes->
buffer) {
997 (*len) -= new_off - *
off;
1032 if (!(id_flags & 0x0020)) {
1109 if (len < 0 || len1 > len || len1 <= 0) {
1110 av_log(d->
s,
AV_LOG_ERROR,
"Tag %x length violation new length %d bytes remaining %d\n", tag, len1, len);
1119 if (target_tag && tag != target_tag) {
1149 Mp4Descr *descr,
int *descr_count,
int max_descr_count)
1162 Mp4Descr *descr,
int *descr_count,
int max_descr_count)
1178 const uint8_t *p, *p_end;
1181 int mp4_descr_count = 0;
1185 p_end = section + section_len - 4;
1197 for (i = 0; i < mp4_descr_count; i++) {
1212 pes->
sl = mp4_descr[i].
sl;
1234 for (i = 0; i < mp4_descr_count; i++)
1235 av_free(mp4_descr[i].dec_config_descr);
1239 const uint8_t **pp,
const uint8_t *desc_list_end,
1240 Mp4Descr *mp4_descr,
int mp4_descr_count,
int pid,
1243 const uint8_t *desc_end;
1244 int desc_len, desc_tag, desc_es_id;
1248 desc_tag =
get8(pp, desc_list_end);
1251 desc_len =
get8(pp, desc_list_end);
1254 desc_end = *pp + desc_len;
1255 if (desc_end > desc_list_end)
1258 av_dlog(fc,
"tag: 0x%02x len=%d\n", desc_tag, desc_len);
1266 desc_es_id =
get16(pp, desc_end);
1267 if (ts && ts->
pids[pid])
1269 for (i = 0; i < mp4_descr_count; i++)
1270 if (mp4_descr[i].dec_config_descr_len &&
1271 mp4_descr[i].es_id == desc_es_id) {
1284 get16(pp, desc_end);
1297 language[0] =
get8(pp, desc_end);
1298 language[1] =
get8(pp, desc_end);
1299 language[2] =
get8(pp, desc_end);
1304 language[0] =
get8(pp, desc_end);
1305 language[1] =
get8(pp, desc_end);
1306 language[2] =
get8(pp, desc_end);
1309 switch(
get8(pp, desc_end)) {
1333 for (i = 0; i + 4 <= desc_len; i += 4) {
1334 language[i + 0] =
get8(pp, desc_end);
1335 language[i + 1] =
get8(pp, desc_end);
1336 language[i + 2] =
get8(pp, desc_end);
1337 language[i + 3] =
',';
1338 switch (
get8(pp, desc_end)) {
1345 language[i - 1] = 0;
1369 const uint8_t *p, *p_end, *desc_list_end;
1370 int program_info_length, pcr_pid, pid, stream_type;
1372 uint32_t prog_reg_desc = 0;
1375 int mp4_descr_count = 0;
1381 p_end = section + section_len - 4;
1393 pcr_pid =
get16(&p, p_end) & 0x1fff;
1400 program_info_length =
get16(&p, p_end) & 0xfff;
1401 if (program_info_length < 0)
1403 while(program_info_length >= 2) {
1405 tag =
get8(&p, p_end);
1406 len =
get8(&p, p_end);
1408 av_dlog(ts->
stream,
"program tag: 0x%02x len=%d\n", tag, len);
1410 if(len > program_info_length - 2)
1413 program_info_length -= len + 2;
1420 }
else if (tag == 0x05 && len >= 4) {
1421 prog_reg_desc = bytestream_get_le32(&p);
1426 p += program_info_length;
1437 stream_type =
get8(&p, p_end);
1438 if (stream_type < 0)
1440 pid =
get16(&p, p_end) & 0x1fff;
1452 }
else if (stream_type != 0x13) {
1480 desc_list_len =
get16(&p, p_end) & 0xfff;
1481 if (desc_list_len < 0)
1483 desc_list_end = p + desc_list_len;
1484 if (desc_list_end > p_end)
1488 mp4_descr, mp4_descr_count, pid, ts) < 0)
1491 if (pes && prog_reg_desc ==
AV_RL32(
"HDMV") && stream_type == 0x83 && pes->
sub_st) {
1500 for (i = 0; i < mp4_descr_count; i++)
1501 av_free(mp4_descr[i].dec_config_descr);
1508 const uint8_t *p, *p_end;
1514 p_end = section + section_len - 4;
1523 sid =
get16(&p, p_end);
1526 pmt_pid =
get16(&p, p_end) & 0x1fff;
1532 if (sid == 0x0000) {
1536 if (ts->
pids[pmt_pid])
1550 const uint8_t *p, *p_end, *desc_list_end, *desc_end;
1551 int onid, val, sid, desc_list_len, desc_tag, desc_len, service_type;
1552 char *
name, *provider_name;
1557 p_end = section + section_len - 4;
1563 onid =
get16(&p, p_end);
1566 val =
get8(&p, p_end);
1570 sid =
get16(&p, p_end);
1573 val =
get8(&p, p_end);
1576 desc_list_len =
get16(&p, p_end) & 0xfff;
1577 if (desc_list_len < 0)
1579 desc_list_end = p + desc_list_len;
1580 if (desc_list_end > p_end)
1583 desc_tag =
get8(&p, desc_list_end);
1586 desc_len =
get8(&p, desc_list_end);
1587 desc_end = p + desc_len;
1588 if (desc_end > desc_list_end)
1592 desc_tag, desc_len);
1596 service_type =
get8(&p, p_end);
1597 if (service_type < 0)
1599 provider_name =
getstr8(&p, p_end);
1627 int len, pid, cc, expected_cc, cc_ok, afc, is_start, is_discontinuity,
1628 has_adaptation, has_payload;
1629 const uint8_t *p, *p_end;
1632 pid =
AV_RB16(packet + 1) & 0x1fff;
1635 is_start = packet[1] & 0x40;
1636 tss = ts->
pids[pid];
1639 tss = ts->
pids[pid];
1644 afc = (packet[3] >> 4) & 3;
1647 has_adaptation = afc & 2;
1648 has_payload = afc & 1;
1649 is_discontinuity = has_adaptation
1651 && (packet[5] & 0x80);
1654 cc = (packet[3] & 0xf);
1655 expected_cc = has_payload ? (tss->
last_cc + 1) & 0x0f : tss->
last_cc;
1656 cc_ok = pid == 0x1FFF
1659 || expected_cc == cc;
1664 "Continuity check failed for pid %d expected %d got %d\n",
1665 pid, expected_cc, cc);
1675 if (has_adaptation) {
1691 if (p + len > p_end)
1755 if (buf[0] != 0x47) {
1776 int packet_num, ret = 0;
1802 if (nb_packets != 0 && packet_num >= nb_packets)
1819 int score, fec_score, dvhs_score;
1821 #define CHECK_COUNT 10
1833 else if(dvhs_score > score && dvhs_score > fec_score && dvhs_score > 6)
return AVPROBE_SCORE_MAX + dvhs_score - CHECK_COUNT;
1848 const uint8_t *packet)
1854 afc = (packet[3] >> 4) & 3;
1864 if (!(flags & 0x10))
1869 *ppcr_high = ((int64_t)v << 1) | (p[4] >> 7);
1870 *ppcr_low = ((p[4] & 1) << 8) | p[5];
1879 uint8_t buf[5*1024];
1886 if (len !=
sizeof(buf))
1894 if (s->
iformat == &ff_mpegts_demuxer) {
1915 int pcr_pid, pid, nb_packets, nb_pcrs, ret, pcr_l;
1916 int64_t pcrs[2], pcr_h;
1917 int packet_count[2];
1937 pid =
AV_RB16(packet + 1) & 0x1fff;
1938 if ((pcr_pid == -1 || pcr_pid == pid) &&
1939 parse_pcr(&pcr_h, &pcr_l, packet) == 0) {
1941 packet_count[nb_pcrs] = nb_packets;
1942 pcrs[nb_pcrs] = pcr_h * 300 + pcr_l;
1952 ts->
pcr_incr = (pcrs[1] - pcrs[0]) / (packet_count[1] - packet_count[0]);
1967 #define MAX_PACKET_READAHEAD ((128 * 1024) / 188)
1974 int64_t pcr_h, next_pcr_h, pos;
1975 int pcr_l, next_pcr_l;
1976 uint8_t pcr_buf[12];
1994 if (
parse_pcr(&next_pcr_h, &next_pcr_l, pcr_buf) == 0) {
1996 ts->
pcr_incr = ((next_pcr_h - pcr_h) * 300 + (next_pcr_l - pcr_l)) /
2003 ts->
cur_pcr = pcr_h * 300 + pcr_l;
2053 int64_t *ppos, int64_t pos_limit)
2056 int64_t pos, timestamp;
2059 const int find_next= 1;
2066 if ((pcr_pid < 0 || (
AV_RB16(buf + 1) & 0x1fff) == pcr_pid) &&
2067 parse_pcr(×tamp, &pcr_l, buf) == 0) {
2080 if ((pcr_pid < 0 || (
AV_RB16(buf + 1) & 0x1fff) == pcr_pid) &&
2081 parse_pcr(×tamp, &pcr_l, buf) == 0) {
2091 #ifdef USE_SYNCPOINT_SEARCH
2102 int64_t ts_ret, ts_adj;
2103 int stream_index_gen_search;
2110 flags |= (target_ts - min_ts > (uint64_t)(max_ts - target_ts)) ?
2118 if (stream_index < 0) {
2120 if (stream_index_gen_search < 0) {
2125 st = s->
streams[stream_index_gen_search];
2132 stream_index_gen_search = stream_index;
2147 min_ts, target_ts, max_ts,
2161 flags &= ~AVSEEK_FLAG_BACKWARD;
2192 if(buf[1] & 0x40)
break;
2222 const uint8_t *buf,
int len)
2234 if (buf[0] != 0x47) {
2266 #ifdef USE_SYNCPOINT_SEARCH
2272 .
name =
"mpegtsraw",
2281 #ifdef USE_SYNCPOINT_SEARCH
2284 .priv_class = &mpegtsraw_class,