FFmpeg
mpegts.c
Go to the documentation of this file.
1 /*
2  * MPEG-2 transport stream (aka DVB) demuxer
3  * Copyright (c) 2002-2003 Fabrice Bellard
4  *
5  * This file is part of FFmpeg.
6  *
7  * FFmpeg is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * FFmpeg is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with FFmpeg; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20  */
21 
22 #include "config_components.h"
23 
25 #include "libavutil/buffer.h"
26 #include "libavutil/crc.h"
27 #include "libavutil/internal.h"
28 #include "libavutil/intreadwrite.h"
29 #include "libavutil/log.h"
30 #include "libavutil/dict.h"
31 #include "libavutil/mem.h"
32 #include "libavutil/opt.h"
33 #include "libavutil/avassert.h"
34 #include "libavutil/dovi_meta.h"
35 #include "libavcodec/bytestream.h"
36 #include "libavcodec/defs.h"
37 #include "libavcodec/get_bits.h"
38 #include "libavcodec/opus/opus.h"
39 #include "avformat.h"
40 #include "mpegts.h"
41 #include "internal.h"
42 #include "avio_internal.h"
43 #include "demux.h"
44 #include "mpeg.h"
45 #include "isom.h"
46 #if CONFIG_ICONV
47 #include <iconv.h>
48 #endif
49 
50 /* maximum size in which we look for synchronization if
51  * synchronization is lost */
52 #define MAX_RESYNC_SIZE 65536
53 
54 #define MAX_MP4_DESCR_COUNT 16
55 
56 #define MOD_UNLIKELY(modulus, dividend, divisor, prev_dividend) \
57  do { \
58  if ((prev_dividend) == 0 || (dividend) - (prev_dividend) != (divisor)) \
59  (modulus) = (dividend) % (divisor); \
60  (prev_dividend) = (dividend); \
61  } while (0)
62 
63 #define PROBE_PACKET_MAX_BUF 8192
64 #define PROBE_PACKET_MARGIN 5
65 
70 };
71 
72 typedef struct MpegTSFilter MpegTSFilter;
73 
74 typedef int PESCallback (MpegTSFilter *f, const uint8_t *buf, int len,
75  int is_start, int64_t pos);
76 
77 typedef struct MpegTSPESFilter {
79  void *opaque;
81 
82 typedef void SectionCallback (MpegTSFilter *f, const uint8_t *buf, int len);
83 
84 typedef void SetServiceCallback (void *opaque, int ret);
85 
86 typedef struct MpegTSSectionFilter {
89  int last_ver;
90  unsigned crc;
91  unsigned last_crc;
92  uint8_t *section_buf;
93  unsigned int check_crc : 1;
94  unsigned int end_of_section_reached : 1;
96  void *opaque;
98 
99 struct MpegTSFilter {
100  int pid;
101  int es_id;
102  int last_cc; /* last cc code (-1 if first packet) */
104  int discard;
106  union {
109  } u;
110 };
111 
112 struct Stream {
113  int idx;
115 };
116 
117 #define MAX_STREAMS_PER_PROGRAM 128
118 #define MAX_PIDS_PER_PROGRAM (MAX_STREAMS_PER_PROGRAM + 2)
119 struct Program {
120  unsigned int id; // program id/service id
121  unsigned int nb_pids;
122  unsigned int pids[MAX_PIDS_PER_PROGRAM];
123  unsigned int nb_streams;
125 
126  /** have we found pmt for this program */
128 };
129 
131  const AVClass *class;
132  /* user data */
134  /** raw packet size, including FEC if present */
136 
138 
139  /** if true, all pids are analyzed to find streams */
141 
142  /** compute exact PCR for each transport stream packet */
144 
145  /** fix dvb teletext pts */
147 
148  int64_t cur_pcr; /**< used to estimate the exact PCR */
149  int64_t pcr_incr; /**< used to estimate the exact PCR */
150 
151  /* data needed to handle file based ts */
152  /** stop parsing loop */
154  /** packet containing Audio/Video data */
156  /** to detect seek */
158 
162 
164 
168 
169  int id;
170 
171  /******************************************/
172  /* private mpegts data */
173  /* scan context */
174  /** structure to keep track of Program->pids mapping */
175  unsigned int nb_prg;
176  struct Program *prg;
177 
179  /** filters for various streams specified by PMT + for the PAT and PMT */
182 
185 };
186 
187 #define MPEGTS_OPTIONS \
188  { "resync_size", "set size limit for looking up a new synchronization", \
189  offsetof(MpegTSContext, resync_size), AV_OPT_TYPE_INT, \
190  { .i64 = MAX_RESYNC_SIZE}, 0, INT_MAX, AV_OPT_FLAG_DECODING_PARAM }, \
191  { "ts_id", "transport stream id", \
192  offsetof(MpegTSContext, id), AV_OPT_TYPE_INT, \
193  { .i64 = 0 }, 0, INT_MAX, AV_OPT_FLAG_EXPORT | AV_OPT_FLAG_READONLY }, \
194  { "ts_packetsize", "output option carrying the raw packet size", \
195  offsetof(MpegTSContext, raw_packet_size), AV_OPT_TYPE_INT, \
196  { .i64 = 0 }, 0, INT_MAX, AV_OPT_FLAG_EXPORT | AV_OPT_FLAG_READONLY }
197 
198 static const AVOption options[] = {
200  {"fix_teletext_pts", "try to fix pts values of dvb teletext streams", offsetof(MpegTSContext, fix_teletext_pts), AV_OPT_TYPE_BOOL,
201  {.i64 = 1}, 0, 1, AV_OPT_FLAG_DECODING_PARAM },
202  {"scan_all_pmts", "scan and combine all PMTs", offsetof(MpegTSContext, scan_all_pmts), AV_OPT_TYPE_BOOL,
203  {.i64 = -1}, -1, 1, AV_OPT_FLAG_DECODING_PARAM },
204  {"skip_unknown_pmt", "skip PMTs for programs not advertised in the PAT", offsetof(MpegTSContext, skip_unknown_pmt), AV_OPT_TYPE_BOOL,
205  {.i64 = 0}, 0, 1, AV_OPT_FLAG_DECODING_PARAM },
206  {"merge_pmt_versions", "reuse streams when PMT's version/pids change", offsetof(MpegTSContext, merge_pmt_versions), AV_OPT_TYPE_BOOL,
207  {.i64 = 0}, 0, 1, AV_OPT_FLAG_DECODING_PARAM },
208  {"skip_changes", "skip changing / adding streams / programs", offsetof(MpegTSContext, skip_changes), AV_OPT_TYPE_BOOL,
209  {.i64 = 0}, 0, 1, 0 },
210  {"skip_clear", "skip clearing programs", offsetof(MpegTSContext, skip_clear), AV_OPT_TYPE_BOOL,
211  {.i64 = 0}, 0, 1, 0 },
212  {"max_packet_size", "maximum size of emitted packet", offsetof(MpegTSContext, max_packet_size), AV_OPT_TYPE_INT,
213  {.i64 = 204800}, 1, INT_MAX/2, AV_OPT_FLAG_DECODING_PARAM },
214  { NULL },
215 };
216 
217 static const AVClass mpegts_class = {
218  .class_name = "mpegts demuxer",
219  .item_name = av_default_item_name,
220  .option = options,
221  .version = LIBAVUTIL_VERSION_INT,
222 };
223 
224 static const AVOption raw_options[] = {
226  { "compute_pcr", "compute exact PCR for each transport stream packet",
227  offsetof(MpegTSContext, mpeg2ts_compute_pcr), AV_OPT_TYPE_BOOL,
228  { .i64 = 0 }, 0, 1, AV_OPT_FLAG_DECODING_PARAM },
229  { NULL },
230 };
231 
232 static const AVClass mpegtsraw_class = {
233  .class_name = "mpegtsraw demuxer",
234  .item_name = av_default_item_name,
235  .option = raw_options,
236  .version = LIBAVUTIL_VERSION_INT,
237 };
238 
239 /* TS stream handling */
240 
247 };
248 
249 /* enough for PES header + length */
250 #define PES_START_SIZE 6
251 #define PES_HEADER_SIZE 9
252 #define MAX_PES_HEADER_SIZE (9 + 255)
253 
254 typedef struct PESContext {
255  int pid;
256  int pcr_pid; /**< if -1 then all packets containing PCR are considered */
261  AVStream *sub_st; /**< stream for the embedded AC3 stream in HDMV TrueHD */
263  /* used to get the format */
265  int flags; /**< copied to the AVPacket flags */
269  uint8_t stream_id;
271  int64_t ts_packet_pos; /**< position of first TS packet of this PES packet */
276 } PESContext;
277 
279 
280 static struct Program * get_program(MpegTSContext *ts, unsigned int programid)
281 {
282  int i;
283  for (i = 0; i < ts->nb_prg; i++) {
284  if (ts->prg[i].id == programid) {
285  return &ts->prg[i];
286  }
287  }
288  return NULL;
289 }
290 
291 static void clear_avprogram(MpegTSContext *ts, unsigned int programid)
292 {
293  AVProgram *prg = NULL;
294  int i;
295 
296  for (i = 0; i < ts->stream->nb_programs; i++)
297  if (ts->stream->programs[i]->id == programid) {
298  prg = ts->stream->programs[i];
299  break;
300  }
301  if (!prg)
302  return;
303  prg->nb_stream_indexes = 0;
304 }
305 
306 static void clear_program(struct Program *p)
307 {
308  if (!p)
309  return;
310  p->nb_pids = 0;
311  p->nb_streams = 0;
312  p->pmt_found = 0;
313 }
314 
316 {
317  av_freep(&ts->prg);
318  ts->nb_prg = 0;
319 }
320 
321 static struct Program * add_program(MpegTSContext *ts, unsigned int programid)
322 {
323  struct Program *p = get_program(ts, programid);
324  if (p)
325  return p;
326  if (av_reallocp_array(&ts->prg, ts->nb_prg + 1, sizeof(*ts->prg)) < 0) {
327  ts->nb_prg = 0;
328  return NULL;
329  }
330  p = &ts->prg[ts->nb_prg];
331  p->id = programid;
332  clear_program(p);
333  ts->nb_prg++;
334  return p;
335 }
336 
337 static void add_pid_to_program(struct Program *p, unsigned int pid)
338 {
339  int i;
340  if (!p)
341  return;
342 
343  if (p->nb_pids >= MAX_PIDS_PER_PROGRAM)
344  return;
345 
346  for (i = 0; i < p->nb_pids; i++)
347  if (p->pids[i] == pid)
348  return;
349 
350  p->pids[p->nb_pids++] = pid;
351 }
352 
353 static void update_av_program_info(AVFormatContext *s, unsigned int programid,
354  unsigned int pid, int version)
355 {
356  int i;
357  for (i = 0; i < s->nb_programs; i++) {
358  AVProgram *program = s->programs[i];
359  if (program->id == programid) {
360  int old_pcr_pid = program->pcr_pid,
361  old_version = program->pmt_version;
362  program->pcr_pid = pid;
363  program->pmt_version = version;
364 
365  if (old_version != -1 && old_version != version) {
367  "detected PMT change (program=%d, version=%d/%d, pcr_pid=0x%x/0x%x)\n",
368  programid, old_version, version, old_pcr_pid, pid);
369  }
370  break;
371  }
372  }
373 }
374 
375 /**
376  * @brief discard_pid() decides if the pid is to be discarded according
377  * to caller's programs selection
378  * @param ts : - TS context
379  * @param pid : - pid
380  * @return 1 if the pid is only comprised in programs that have .discard=AVDISCARD_ALL
381  * 0 otherwise
382  */
383 static int discard_pid(MpegTSContext *ts, unsigned int pid)
384 {
385  int i, j, k;
386  int used = 0, discarded = 0;
387  struct Program *p;
388 
389  if (pid == PAT_PID)
390  return 0;
391 
392  /* If none of the programs have .discard=AVDISCARD_ALL then there's
393  * no way we have to discard this packet */
394  for (k = 0; k < ts->stream->nb_programs; k++)
395  if (ts->stream->programs[k]->discard == AVDISCARD_ALL)
396  break;
397  if (k == ts->stream->nb_programs)
398  return 0;
399 
400  for (i = 0; i < ts->nb_prg; i++) {
401  p = &ts->prg[i];
402  for (j = 0; j < p->nb_pids; j++) {
403  if (p->pids[j] != pid)
404  continue;
405  // is program with id p->id set to be discarded?
406  for (k = 0; k < ts->stream->nb_programs; k++) {
407  if (ts->stream->programs[k]->id == p->id) {
408  if (ts->stream->programs[k]->discard == AVDISCARD_ALL)
409  discarded++;
410  else
411  used++;
412  }
413  }
414  }
415  }
416 
417  return !used && discarded;
418 }
419 
420 /**
421  * Assemble PES packets out of TS packets, and then call the "section_cb"
422  * function when they are complete.
423  */
425  const uint8_t *buf, int buf_size, int is_start)
426 {
427  MpegTSSectionFilter *tss = &tss1->u.section_filter;
428  uint8_t *cur_section_buf = NULL;
429  int len, offset;
430 
431  if (is_start) {
432  memcpy(tss->section_buf, buf, buf_size);
433  tss->section_index = buf_size;
434  tss->section_h_size = -1;
435  tss->end_of_section_reached = 0;
436  } else {
437  if (tss->end_of_section_reached)
438  return;
440  if (buf_size < len)
441  len = buf_size;
442  memcpy(tss->section_buf + tss->section_index, buf, len);
443  tss->section_index += len;
444  }
445 
446  offset = 0;
447  cur_section_buf = tss->section_buf;
448  while (cur_section_buf - tss->section_buf < MAX_SECTION_SIZE && cur_section_buf[0] != STUFFING_BYTE) {
449  /* compute section length if possible */
450  if (tss->section_h_size == -1 && tss->section_index - offset >= 3) {
451  len = (AV_RB16(cur_section_buf + 1) & 0xfff) + 3;
452  if (len > MAX_SECTION_SIZE)
453  return;
454  tss->section_h_size = len;
455  }
456 
457  if (tss->section_h_size != -1 &&
458  tss->section_index >= offset + tss->section_h_size) {
459  int crc_valid = 1;
460  tss->end_of_section_reached = 1;
461 
462  if (tss->check_crc) {
463  crc_valid = !av_crc(av_crc_get_table(AV_CRC_32_IEEE), -1, cur_section_buf, tss->section_h_size);
464  if (tss->section_h_size >= 4)
465  tss->crc = AV_RB32(cur_section_buf + tss->section_h_size - 4);
466 
467  if (crc_valid) {
468  ts->crc_validity[ tss1->pid ] = 100;
469  }else if (ts->crc_validity[ tss1->pid ] > -10) {
470  ts->crc_validity[ tss1->pid ]--;
471  }else
472  crc_valid = 2;
473  }
474  if (crc_valid) {
475  tss->section_cb(tss1, cur_section_buf, tss->section_h_size);
476  if (crc_valid != 1)
477  tss->last_ver = -1;
478  }
479 
480  cur_section_buf += tss->section_h_size;
481  offset += tss->section_h_size;
482  tss->section_h_size = -1;
483  } else {
484  tss->section_h_size = -1;
485  tss->end_of_section_reached = 0;
486  break;
487  }
488  }
489 }
490 
491 static MpegTSFilter *mpegts_open_filter(MpegTSContext *ts, unsigned int pid,
492  enum MpegTSFilterType type)
493 {
495 
496  av_log(ts->stream, AV_LOG_TRACE, "Filter: pid=0x%x type=%d\n", pid, type);
497 
498  if (pid >= NB_PID_MAX || ts->pids[pid])
499  return NULL;
500  filter = av_mallocz(sizeof(MpegTSFilter));
501  if (!filter)
502  return NULL;
503  ts->pids[pid] = filter;
504 
505  filter->type = type;
506  filter->pid = pid;
507  filter->es_id = -1;
508  filter->last_cc = -1;
509  filter->last_pcr= -1;
510 
511  return filter;
512 }
513 
515  unsigned int pid,
516  SectionCallback *section_cb,
517  void *opaque,
518  int check_crc)
519 {
521  MpegTSSectionFilter *sec;
522  uint8_t *section_buf = av_mallocz(MAX_SECTION_SIZE);
523 
524  if (!section_buf)
525  return NULL;
526 
527  if (!(filter = mpegts_open_filter(ts, pid, MPEGTS_SECTION))) {
528  av_free(section_buf);
529  return NULL;
530  }
531  sec = &filter->u.section_filter;
532  sec->section_cb = section_cb;
533  sec->opaque = opaque;
534  sec->section_buf = section_buf;
535  sec->check_crc = check_crc;
536  sec->last_ver = -1;
537 
538  return filter;
539 }
540 
541 static MpegTSFilter *mpegts_open_pes_filter(MpegTSContext *ts, unsigned int pid,
542  PESCallback *pes_cb,
543  void *opaque)
544 {
546  MpegTSPESFilter *pes;
547 
548  if (!(filter = mpegts_open_filter(ts, pid, MPEGTS_PES)))
549  return NULL;
550 
551  pes = &filter->u.pes_filter;
552  pes->pes_cb = pes_cb;
553  pes->opaque = opaque;
554  return filter;
555 }
556 
557 static MpegTSFilter *mpegts_open_pcr_filter(MpegTSContext *ts, unsigned int pid)
558 {
559  return mpegts_open_filter(ts, pid, MPEGTS_PCR);
560 }
561 
563 {
564  int pid;
565 
566  pid = filter->pid;
567  if (filter->type == MPEGTS_SECTION)
568  av_freep(&filter->u.section_filter.section_buf);
569  else if (filter->type == MPEGTS_PES) {
570  PESContext *pes = filter->u.pes_filter.opaque;
571  av_buffer_unref(&pes->buffer);
572  /* referenced private data will be freed later in
573  * avformat_close_input (pes->st->priv_data == pes) */
574  if (!pes->st || pes->merged_st) {
575  av_freep(&filter->u.pes_filter.opaque);
576  }
577  }
578 
579  av_free(filter);
580  ts->pids[pid] = NULL;
581 }
582 
583 static int analyze(const uint8_t *buf, int size, int packet_size,
584  int probe)
585 {
586  int stat[TS_MAX_PACKET_SIZE];
587  int stat_all = 0;
588  int i;
589  int best_score = 0;
590 
591  memset(stat, 0, packet_size * sizeof(*stat));
592 
593  for (i = 0; i < size - 3; i++) {
594  if (buf[i] == SYNC_BYTE) {
595  int pid = AV_RB16(buf+1) & 0x1FFF;
596  int asc = buf[i + 3] & 0x30;
597  if (!probe || pid == 0x1FFF || asc) {
598  int x = i % packet_size;
599  stat[x]++;
600  stat_all++;
601  if (stat[x] > best_score) {
602  best_score = stat[x];
603  }
604  }
605  }
606  }
607 
608  return best_score - FFMAX(stat_all - 10*best_score, 0)/10;
609 }
610 
611 /* autodetect fec presence */
613 {
614  int score, fec_score, dvhs_score;
615  int margin;
616  int ret;
617 
618  /*init buffer to store stream for probing */
619  uint8_t buf[PROBE_PACKET_MAX_BUF] = {0};
620  int buf_size = 0;
621  int max_iterations = 16;
622 
623  while (buf_size < PROBE_PACKET_MAX_BUF && max_iterations--) {
624  ret = avio_read_partial(s->pb, buf + buf_size, PROBE_PACKET_MAX_BUF - buf_size);
625  if (ret < 0)
626  return AVERROR_INVALIDDATA;
627  buf_size += ret;
628 
629  score = analyze(buf, buf_size, TS_PACKET_SIZE, 0);
630  dvhs_score = analyze(buf, buf_size, TS_DVHS_PACKET_SIZE, 0);
631  fec_score = analyze(buf, buf_size, TS_FEC_PACKET_SIZE, 0);
632  av_log(s, AV_LOG_TRACE, "Probe: %d, score: %d, dvhs_score: %d, fec_score: %d \n",
633  buf_size, score, dvhs_score, fec_score);
634 
635  margin = mid_pred(score, fec_score, dvhs_score);
636 
637  if (buf_size < PROBE_PACKET_MAX_BUF)
638  margin += PROBE_PACKET_MARGIN; /*if buffer not filled */
639 
640  if (score > margin)
641  return TS_PACKET_SIZE;
642  else if (dvhs_score > margin)
643  return TS_DVHS_PACKET_SIZE;
644  else if (fec_score > margin)
645  return TS_FEC_PACKET_SIZE;
646  }
647  return AVERROR_INVALIDDATA;
648 }
649 
650 typedef struct SectionHeader {
651  uint8_t tid;
652  uint16_t id;
653  uint8_t version;
654  uint8_t current_next;
655  uint8_t sec_num;
656  uint8_t last_sec_num;
657 } SectionHeader;
658 
660 {
661  if (h->version == tssf->last_ver && tssf->last_crc == tssf->crc)
662  return 1;
663 
664  tssf->last_ver = h->version;
665  tssf->last_crc = tssf->crc;
666 
667  return 0;
668 }
669 
670 static inline int get8(const uint8_t **pp, const uint8_t *p_end)
671 {
672  const uint8_t *p;
673  int c;
674 
675  p = *pp;
676  if (p >= p_end)
677  return AVERROR_INVALIDDATA;
678  c = *p++;
679  *pp = p;
680  return c;
681 }
682 
683 static inline int get16(const uint8_t **pp, const uint8_t *p_end)
684 {
685  const uint8_t *p;
686  int c;
687 
688  p = *pp;
689  if (1 >= p_end - p)
690  return AVERROR_INVALIDDATA;
691  c = AV_RB16(p);
692  p += 2;
693  *pp = p;
694  return c;
695 }
696 
697 /* read and allocate a DVB string preceded by its length */
698 static char *getstr8(const uint8_t **pp, const uint8_t *p_end)
699 {
700  int len;
701  const uint8_t *p;
702  char *str;
703 
704  p = *pp;
705  len = get8(&p, p_end);
706  if (len < 0)
707  return NULL;
708  if (len > p_end - p)
709  return NULL;
710 #if CONFIG_ICONV
711  if (len) {
712  const char *encodings[] = {
713  "ISO6937", "ISO-8859-5", "ISO-8859-6", "ISO-8859-7",
714  "ISO-8859-8", "ISO-8859-9", "ISO-8859-10", "ISO-8859-11",
715  "", "ISO-8859-13", "ISO-8859-14", "ISO-8859-15", "", "", "", "",
716  "", "UCS-2BE", "KSC_5601", "GB2312", "UCS-2BE", "UTF-8", "", "",
717  "", "", "", "", "", "", "", ""
718  };
719  iconv_t cd;
720  char *in, *out;
721  size_t inlen = len, outlen = inlen * 6 + 1;
722  if (len >= 3 && p[0] == 0x10 && !p[1] && p[2] && p[2] <= 0xf && p[2] != 0xc) {
723  char iso8859[12];
724  snprintf(iso8859, sizeof(iso8859), "ISO-8859-%d", p[2]);
725  inlen -= 3;
726  in = (char *)p + 3;
727  cd = iconv_open("UTF-8", iso8859);
728  } else if (p[0] < 0x20) {
729  inlen -= 1;
730  in = (char *)p + 1;
731  cd = iconv_open("UTF-8", encodings[*p]);
732  } else {
733  in = (char *)p;
734  cd = iconv_open("UTF-8", encodings[0]);
735  }
736  if (cd == (iconv_t)-1)
737  goto no_iconv;
738  str = out = av_malloc(outlen);
739  if (!str) {
740  iconv_close(cd);
741  return NULL;
742  }
743  if (iconv(cd, &in, &inlen, &out, &outlen) == -1) {
744  iconv_close(cd);
745  av_freep(&str);
746  goto no_iconv;
747  }
748  iconv_close(cd);
749  *out = 0;
750  *pp = p + len;
751  return str;
752  }
753 no_iconv:
754 #endif
755  str = av_malloc(len + 1);
756  if (!str)
757  return NULL;
758  memcpy(str, p, len);
759  str[len] = '\0';
760  p += len;
761  *pp = p;
762  return str;
763 }
764 
766  const uint8_t **pp, const uint8_t *p_end)
767 {
768  int val;
769 
770  val = get8(pp, p_end);
771  if (val < 0)
772  return val;
773  h->tid = val;
774  *pp += 2;
775  val = get16(pp, p_end);
776  if (val < 0)
777  return val;
778  h->id = val;
779  val = get8(pp, p_end);
780  if (val < 0)
781  return val;
782  h->version = (val >> 1) & 0x1f;
783  h->current_next = val & 0x01;
784  val = get8(pp, p_end);
785  if (val < 0)
786  return val;
787  h->sec_num = val;
788  val = get8(pp, p_end);
789  if (val < 0)
790  return val;
791  h->last_sec_num = val;
792  return 0;
793 }
794 
795 typedef struct StreamType {
796  uint32_t stream_type;
799 } StreamType;
800 
801 static const StreamType ISO_types[] = {
808  /* Makito encoder sets stream type 0x11 for AAC,
809  * so auto-detect LOAS/LATM instead of hardcoding it. */
810 #if !CONFIG_LOAS_DEMUXER
812 #endif
826  { 0 },
827 };
828 
829 static const StreamType HDMV_types[] = {
841  { 0 },
842 };
843 
844 /* SCTE types */
845 static const StreamType SCTE_types[] = {
847  { 0 },
848 };
849 
850 /* ATSC ? */
851 static const StreamType MISC_types[] = {
855  { 0 },
856 };
857 
858 /* HLS Sample Encryption Types */
864  { 0 },
865 };
866 
867 static const StreamType REGD_types[] = {
868  { MKTAG('d', 'r', 'a', 'c'), AVMEDIA_TYPE_VIDEO, AV_CODEC_ID_DIRAC },
869  { MKTAG('A', 'C', '-', '3'), AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_AC3 },
870  { MKTAG('A', 'C', '-', '4'), AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_AC4 },
871  { MKTAG('B', 'S', 'S', 'D'), AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_S302M },
872  { MKTAG('D', 'T', 'S', '1'), AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_DTS },
873  { MKTAG('D', 'T', 'S', '2'), AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_DTS },
874  { MKTAG('D', 'T', 'S', '3'), AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_DTS },
875  { MKTAG('E', 'A', 'C', '3'), AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_EAC3 },
876  { MKTAG('H', 'E', 'V', 'C'), AVMEDIA_TYPE_VIDEO, AV_CODEC_ID_HEVC },
877  { MKTAG('V', 'V', 'C', ' '), AVMEDIA_TYPE_VIDEO, AV_CODEC_ID_VVC },
878  { MKTAG('K', 'L', 'V', 'A'), AVMEDIA_TYPE_DATA, AV_CODEC_ID_SMPTE_KLV },
879  { MKTAG('V', 'A', 'N', 'C'), AVMEDIA_TYPE_DATA, AV_CODEC_ID_SMPTE_2038 },
880  { MKTAG('I', 'D', '3', ' '), AVMEDIA_TYPE_DATA, AV_CODEC_ID_TIMED_ID3 },
881  { MKTAG('V', 'C', '-', '1'), AVMEDIA_TYPE_VIDEO, AV_CODEC_ID_VC1 },
882  { MKTAG('O', 'p', 'u', 's'), AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_OPUS },
883  { 0 },
884 };
885 
886 static const StreamType METADATA_types[] = {
887  { MKTAG('K','L','V','A'), AVMEDIA_TYPE_DATA, AV_CODEC_ID_SMPTE_KLV },
888  { MKTAG('I','D','3',' '), AVMEDIA_TYPE_DATA, AV_CODEC_ID_TIMED_ID3 },
889  { 0 },
890 };
891 
892 /* descriptor present */
893 static const StreamType DESC_types[] = {
899  { 0 },
900 };
901 
903  uint32_t stream_type,
904  const StreamType *types)
905 {
906  FFStream *const sti = ffstream(st);
907  for (; types->stream_type; types++)
908  if (stream_type == types->stream_type) {
909  if (st->codecpar->codec_type != types->codec_type ||
910  st->codecpar->codec_id != types->codec_id) {
911  st->codecpar->codec_type = types->codec_type;
912  st->codecpar->codec_id = types->codec_id;
913  sti->need_context_update = 1;
914  }
915  sti->request_probe = 0;
916  return;
917  }
918 }
919 
921  uint32_t stream_type, uint32_t prog_reg_desc)
922 {
923  FFStream *const sti = ffstream(st);
924  int old_codec_type = st->codecpar->codec_type;
925  int old_codec_id = st->codecpar->codec_id;
926  int old_codec_tag = st->codecpar->codec_tag;
927 
928  avpriv_set_pts_info(st, 33, 1, 90000);
929  st->priv_data = pes;
933  pes->st = st;
934  pes->stream_type = stream_type;
935 
936  av_log(pes->stream, AV_LOG_DEBUG,
937  "stream=%d stream_type=%x pid=%x prog_reg_desc=%.4s\n",
938  st->index, pes->stream_type, pes->pid, (char *)&prog_reg_desc);
939 
940  st->codecpar->codec_tag = pes->stream_type;
941 
944  sti->request_probe = 50;
947  if ((prog_reg_desc == AV_RL32("HDMV") ||
948  prog_reg_desc == AV_RL32("HDPR")) &&
952  // HDMV TrueHD streams also contain an AC3 coded version of the
953  // audio track - add a second stream for this
954  AVStream *sub_st;
955  // priv_data cannot be shared between streams
956  PESContext *sub_pes = av_memdup(pes, sizeof(*sub_pes));
957  if (!sub_pes)
958  return AVERROR(ENOMEM);
959 
960  sub_st = avformat_new_stream(pes->stream, NULL);
961  if (!sub_st) {
962  av_free(sub_pes);
963  return AVERROR(ENOMEM);
964  }
965 
966  sub_st->id = pes->pid;
967  avpriv_set_pts_info(sub_st, 33, 1, 90000);
968  sub_st->priv_data = sub_pes;
970  sub_st->codecpar->codec_id = AV_CODEC_ID_AC3;
972  sub_pes->sub_st = pes->sub_st = sub_st;
973  }
974  }
975  if (st->codecpar->codec_id == AV_CODEC_ID_NONE)
977  if (st->codecpar->codec_id == AV_CODEC_ID_NONE)
979  if (st->codecpar->codec_id == AV_CODEC_ID_NONE) {
980  st->codecpar->codec_id = old_codec_id;
981  st->codecpar->codec_type = old_codec_type;
982  }
983  if ((st->codecpar->codec_id == AV_CODEC_ID_NONE ||
984  (sti->request_probe > 0 && sti->request_probe < AVPROBE_SCORE_STREAM_RETRY / 5)) &&
985  sti->probe_packets > 0 &&
986  stream_type == STREAM_TYPE_PRIVATE_DATA) {
990  }
991 
992  /* queue a context update if properties changed */
993  if (old_codec_type != st->codecpar->codec_type ||
994  old_codec_id != st->codecpar->codec_id ||
995  old_codec_tag != st->codecpar->codec_tag)
996  sti->need_context_update = 1;
997 
998  return 0;
999 }
1000 
1002 {
1003  pes->pts = AV_NOPTS_VALUE;
1004  pes->dts = AV_NOPTS_VALUE;
1005  pes->data_index = 0;
1006  pes->flags = 0;
1007  av_buffer_unref(&pes->buffer);
1008 }
1009 
1010 static void new_data_packet(const uint8_t *buffer, int len, AVPacket *pkt)
1011 {
1013  pkt->data = (uint8_t *)buffer;
1014  pkt->size = len;
1015 }
1016 
1018 {
1019  uint8_t *sd;
1020 
1022 
1023  pkt->buf = pes->buffer;
1024  pkt->data = pes->buffer->data;
1025  pkt->size = pes->data_index;
1026 
1027  if (pes->PES_packet_length &&
1028  pes->pes_header_size + pes->data_index != pes->PES_packet_length +
1029  PES_START_SIZE) {
1030  av_log(pes->stream, AV_LOG_WARNING, "PES packet size mismatch\n");
1031  pes->flags |= AV_PKT_FLAG_CORRUPT;
1032  }
1033 
1034  // JPEG-XS PES payload
1035  if (pes->stream_id == 0xbd && pes->stream_type == 0x32 &&
1036  pkt->size >= 8 && memcmp(pkt->data + 4, "jxes", 4) == 0)
1037  {
1038  uint32_t header_size = AV_RB32(pkt->data);
1039  if (header_size > pkt->size) {
1041  "Invalid JPEG-XS header size %"PRIu32" > packet size %d\n",
1042  header_size, pkt->size);
1043  pes->flags |= AV_PKT_FLAG_CORRUPT;
1044  } else {
1045  pkt->data += header_size;
1046  pkt->size -= header_size;
1047  }
1048  }
1049 
1050  memset(pkt->data + pkt->size, 0, AV_INPUT_BUFFER_PADDING_SIZE);
1051 
1052  // Separate out the AC3 substream from an HDMV combined TrueHD/AC3 PID
1053  if (pes->sub_st && pes->stream_type == STREAM_TYPE_BLURAY_AUDIO_TRUEHD && pes->extended_stream_id == 0x76)
1054  pkt->stream_index = pes->sub_st->index;
1055  else
1056  pkt->stream_index = pes->st->index;
1057  pkt->pts = pes->pts;
1058  pkt->dts = pes->dts;
1059  /* store position of first TS packet of this PES packet */
1060  pkt->pos = pes->ts_packet_pos;
1061  pkt->flags = pes->flags;
1062 
1063  pes->buffer = NULL;
1065 
1067  if (!sd)
1068  return AVERROR(ENOMEM);
1069  *sd = pes->stream_id;
1070 
1071  return 0;
1072 }
1073 
1074 static uint64_t get_ts64(GetBitContext *gb, int bits)
1075 {
1076  if (get_bits_left(gb) < bits)
1077  return AV_NOPTS_VALUE;
1078  return get_bits64(gb, bits);
1079 }
1080 
1082  const uint8_t *buf, int buf_size)
1083 {
1084  GetBitContext gb;
1085  int au_start_flag = 0, au_end_flag = 0, ocr_flag = 0, idle_flag = 0;
1086  int padding_flag = 0, padding_bits = 0, inst_bitrate_flag = 0;
1087  int dts_flag = -1, cts_flag = -1;
1088  int64_t dts = AV_NOPTS_VALUE, cts = AV_NOPTS_VALUE;
1089  uint8_t buf_padded[128 + AV_INPUT_BUFFER_PADDING_SIZE];
1090  int buf_padded_size = FFMIN(buf_size, sizeof(buf_padded) - AV_INPUT_BUFFER_PADDING_SIZE);
1091 
1092  memcpy(buf_padded, buf, buf_padded_size);
1093 
1094  init_get_bits(&gb, buf_padded, buf_padded_size * 8);
1095 
1096  if (sl->use_au_start)
1097  au_start_flag = get_bits1(&gb);
1098  if (sl->use_au_end)
1099  au_end_flag = get_bits1(&gb);
1100  if (!sl->use_au_start && !sl->use_au_end)
1101  au_start_flag = au_end_flag = 1;
1102  if (sl->ocr_len > 0)
1103  ocr_flag = get_bits1(&gb);
1104  if (sl->use_idle)
1105  idle_flag = get_bits1(&gb);
1106  if (sl->use_padding)
1107  padding_flag = get_bits1(&gb);
1108  if (padding_flag)
1109  padding_bits = get_bits(&gb, 3);
1110 
1111  if (!idle_flag && (!padding_flag || padding_bits != 0)) {
1112  if (sl->packet_seq_num_len)
1114  if (sl->degr_prior_len)
1115  if (get_bits1(&gb))
1116  skip_bits(&gb, sl->degr_prior_len);
1117  if (ocr_flag)
1118  skip_bits_long(&gb, sl->ocr_len);
1119  if (au_start_flag) {
1120  if (sl->use_rand_acc_pt)
1121  get_bits1(&gb);
1122  if (sl->au_seq_num_len > 0)
1123  skip_bits_long(&gb, sl->au_seq_num_len);
1124  if (sl->use_timestamps) {
1125  dts_flag = get_bits1(&gb);
1126  cts_flag = get_bits1(&gb);
1127  }
1128  }
1129  if (sl->inst_bitrate_len)
1130  inst_bitrate_flag = get_bits1(&gb);
1131  if (dts_flag == 1)
1132  dts = get_ts64(&gb, sl->timestamp_len);
1133  if (cts_flag == 1)
1134  cts = get_ts64(&gb, sl->timestamp_len);
1135  if (sl->au_len > 0)
1136  skip_bits_long(&gb, sl->au_len);
1137  if (inst_bitrate_flag)
1138  skip_bits_long(&gb, sl->inst_bitrate_len);
1139  }
1140 
1141  if (dts != AV_NOPTS_VALUE)
1142  pes->dts = dts;
1143  if (cts != AV_NOPTS_VALUE)
1144  pes->pts = cts;
1145 
1146  if (sl->timestamp_len && sl->timestamp_res)
1148 
1149  return (get_bits_count(&gb) + 7) >> 3;
1150 }
1151 
1153 {
1155  if (!ts->pools[index]) {
1156  int pool_size = FFMIN(ts->max_packet_size + AV_INPUT_BUFFER_PADDING_SIZE, 2 << index);
1157  ts->pools[index] = av_buffer_pool_init(pool_size, NULL);
1158  if (!ts->pools[index])
1159  return NULL;
1160  }
1161  return av_buffer_pool_get(ts->pools[index]);
1162 }
1163 
1164 /* return non zero if a packet could be constructed */
1166  const uint8_t *buf, int buf_size, int is_start,
1167  int64_t pos)
1168 {
1169  PESContext *pes = filter->u.pes_filter.opaque;
1170  MpegTSContext *ts = pes->ts;
1171  const uint8_t *p;
1172  int ret, len;
1173 
1174  if (!ts->pkt)
1175  return 0;
1176 
1177  if (is_start) {
1178  if (pes->state == MPEGTS_PAYLOAD && pes->data_index > 0) {
1179  ret = new_pes_packet(pes, ts->pkt);
1180  if (ret < 0)
1181  return ret;
1182  ts->stop_parse = 1;
1183  } else {
1185  }
1186  pes->state = MPEGTS_HEADER;
1187  pes->ts_packet_pos = pos;
1188  }
1189  p = buf;
1190  while (buf_size > 0) {
1191  switch (pes->state) {
1192  case MPEGTS_HEADER:
1193  len = PES_START_SIZE - pes->data_index;
1194  if (len > buf_size)
1195  len = buf_size;
1196  memcpy(pes->header + pes->data_index, p, len);
1197  pes->data_index += len;
1198  p += len;
1199  buf_size -= len;
1200  if (pes->data_index == PES_START_SIZE) {
1201  /* we got all the PES or section header. We can now
1202  * decide */
1203  if (pes->header[0] == 0x00 && pes->header[1] == 0x00 &&
1204  pes->header[2] == 0x01) {
1205  /* it must be an MPEG-2 PES stream */
1206  pes->stream_id = pes->header[3];
1207  av_log(pes->stream, AV_LOG_TRACE, "pid=%x stream_id=%#x\n", pes->pid, pes->stream_id);
1208 
1209  if ((pes->st && pes->st->discard == AVDISCARD_ALL &&
1210  (!pes->sub_st ||
1211  pes->sub_st->discard == AVDISCARD_ALL)) ||
1213  goto skip;
1214 
1215  /* stream not present in PMT */
1216  if (!pes->st) {
1217  if (ts->skip_changes)
1218  goto skip;
1219  if (ts->merge_pmt_versions)
1220  goto skip; /* wait for PMT to merge new stream */
1221 
1222  pes->st = avformat_new_stream(ts->stream, NULL);
1223  if (!pes->st)
1224  return AVERROR(ENOMEM);
1225  pes->st->id = pes->pid;
1226  mpegts_set_stream_info(pes->st, pes, 0, 0);
1227  }
1228 
1229  pes->PES_packet_length = AV_RB16(pes->header + 4);
1230  /* NOTE: zero length means the PES size is unbounded */
1231 
1234  pes->stream_id != STREAM_ID_ECM_STREAM &&
1235  pes->stream_id != STREAM_ID_EMM_STREAM &&
1239  FFStream *const pes_sti = ffstream(pes->st);
1240  pes->state = MPEGTS_PESHEADER;
1241  if (pes->st->codecpar->codec_id == AV_CODEC_ID_NONE && !pes_sti->request_probe) {
1242  av_log(pes->stream, AV_LOG_TRACE,
1243  "pid=%x stream_type=%x probing\n",
1244  pes->pid,
1245  pes->stream_type);
1246  pes_sti->request_probe = 1;
1247  }
1248  } else {
1249  pes->pes_header_size = 6;
1250  pes->state = MPEGTS_PAYLOAD;
1251  pes->data_index = 0;
1252  }
1253  } else {
1254  /* otherwise, it should be a table */
1255  /* skip packet */
1256 skip:
1257  pes->state = MPEGTS_SKIP;
1258  continue;
1259  }
1260  }
1261  break;
1262  /**********************************************/
1263  /* PES packing parsing */
1264  case MPEGTS_PESHEADER:
1265  len = PES_HEADER_SIZE - pes->data_index;
1266  if (len < 0)
1267  return AVERROR_INVALIDDATA;
1268  if (len > buf_size)
1269  len = buf_size;
1270  memcpy(pes->header + pes->data_index, p, len);
1271  pes->data_index += len;
1272  p += len;
1273  buf_size -= len;
1274  if (pes->data_index == PES_HEADER_SIZE) {
1275  pes->pes_header_size = pes->header[8] + 9;
1277  }
1278  break;
1279  case MPEGTS_PESHEADER_FILL:
1280  len = pes->pes_header_size - pes->data_index;
1281  if (len < 0)
1282  return AVERROR_INVALIDDATA;
1283  if (len > buf_size)
1284  len = buf_size;
1285  memcpy(pes->header + pes->data_index, p, len);
1286  pes->data_index += len;
1287  p += len;
1288  buf_size -= len;
1289  if (pes->data_index == pes->pes_header_size) {
1290  const uint8_t *r;
1291  unsigned int flags, pes_ext, skip;
1292 
1293  flags = pes->header[7];
1294  r = pes->header + 9;
1295  pes->pts = AV_NOPTS_VALUE;
1296  pes->dts = AV_NOPTS_VALUE;
1297  if ((flags & 0xc0) == 0x80) {
1298  pes->dts = pes->pts = ff_parse_pes_pts(r);
1299  r += 5;
1300  } else if ((flags & 0xc0) == 0xc0) {
1301  pes->pts = ff_parse_pes_pts(r);
1302  r += 5;
1303  pes->dts = ff_parse_pes_pts(r);
1304  r += 5;
1305  }
1306  pes->extended_stream_id = -1;
1307  if (flags & 0x01) { /* PES extension */
1308  pes_ext = *r++;
1309  /* Skip PES private data, program packet sequence counter and P-STD buffer */
1310  skip = (pes_ext >> 4) & 0xb;
1311  skip += skip & 0x9;
1312  r += skip;
1313  if ((pes_ext & 0x41) == 0x01 &&
1314  (r + 2) <= (pes->header + pes->pes_header_size)) {
1315  /* PES extension 2 */
1316  if ((r[0] & 0x7f) > 0 && (r[1] & 0x80) == 0)
1317  pes->extended_stream_id = r[1];
1318  }
1319  }
1320 
1321  /* we got the full header. We parse it and get the payload */
1322  pes->state = MPEGTS_PAYLOAD;
1323  pes->data_index = 0;
1324  if (pes->stream_type == STREAM_TYPE_ISO_IEC_14496_PES && buf_size > 0) {
1325  int sl_header_bytes = read_sl_header(pes, &pes->sl, p,
1326  buf_size);
1327  pes->pes_header_size += sl_header_bytes;
1328  p += sl_header_bytes;
1329  buf_size -= sl_header_bytes;
1330  }
1331  if (pes->stream_type == STREAM_TYPE_METADATA &&
1334  buf_size >= 5) {
1335  /* skip metadata access unit header - see MISB ST 1402 */
1336  pes->pes_header_size += 5;
1337  p += 5;
1338  buf_size -= 5;
1339  }
1340  if ( pes->ts->fix_teletext_pts
1343  ) {
1344  AVProgram *p = NULL;
1345  int pcr_found = 0;
1346  while ((p = av_find_program_from_stream(pes->stream, p, pes->st->index))) {
1347  if (p->pcr_pid != -1 && p->discard != AVDISCARD_ALL) {
1348  MpegTSFilter *f = pes->ts->pids[p->pcr_pid];
1349  if (f) {
1350  AVStream *st = NULL;
1351  if (f->type == MPEGTS_PES) {
1352  PESContext *pcrpes = f->u.pes_filter.opaque;
1353  if (pcrpes)
1354  st = pcrpes->st;
1355  } else if (f->type == MPEGTS_PCR) {
1356  int i;
1357  for (i = 0; i < p->nb_stream_indexes; i++) {
1358  AVStream *pst = pes->stream->streams[p->stream_index[i]];
1359  if (pst->codecpar->codec_type == AVMEDIA_TYPE_VIDEO)
1360  st = pst;
1361  }
1362  }
1363  if (f->last_pcr != -1 && !f->discard) {
1364  // teletext packets do not always have correct timestamps,
1365  // the standard says they should be handled after 40.6 ms at most,
1366  // and the pcr error to this packet should be no more than 100 ms.
1367  // TODO: we should interpolate the PCR, not just use the last one
1368  int64_t pcr = f->last_pcr / SYSTEM_CLOCK_FREQUENCY_DIVISOR;
1369  pcr_found = 1;
1370  if (st) {
1371  const FFStream *const sti = ffstream(st);
1372  FFStream *const pes_sti = ffstream(pes->st);
1373 
1374  pes_sti->pts_wrap_reference = sti->pts_wrap_reference;
1375  pes_sti->pts_wrap_behavior = sti->pts_wrap_behavior;
1376  }
1377  if (pes->dts == AV_NOPTS_VALUE || pes->dts < pcr) {
1378  pes->pts = pes->dts = pcr;
1379  } else if (pes->st->codecpar->codec_id == AV_CODEC_ID_DVB_TELETEXT &&
1380  pes->dts > pcr + 3654 + 9000) {
1381  pes->pts = pes->dts = pcr + 3654 + 9000;
1382  } else if (pes->st->codecpar->codec_id == AV_CODEC_ID_DVB_SUBTITLE &&
1383  pes->dts > pcr + 10*90000) { //10sec
1384  pes->pts = pes->dts = pcr + 3654 + 9000;
1385  }
1386  break;
1387  }
1388  }
1389  }
1390  }
1391 
1392  if (pes->st->codecpar->codec_id == AV_CODEC_ID_DVB_TELETEXT &&
1393  !pcr_found) {
1395  "Forcing DTS/PTS to be unset for a "
1396  "non-trustworthy PES packet for PID %d as "
1397  "PCR hasn't been received yet.\n",
1398  pes->pid);
1399  pes->dts = pes->pts = AV_NOPTS_VALUE;
1400  }
1401  }
1402  }
1403  break;
1404  case MPEGTS_PAYLOAD:
1405  do {
1406  int max_packet_size = ts->max_packet_size;
1408  max_packet_size = pes->PES_packet_length + PES_START_SIZE - pes->pes_header_size;
1409 
1410  if (pes->data_index > 0 &&
1411  pes->data_index + buf_size > max_packet_size) {
1412  ret = new_pes_packet(pes, ts->pkt);
1413  if (ret < 0)
1414  return ret;
1415  pes->PES_packet_length = 0;
1416  max_packet_size = ts->max_packet_size;
1417  ts->stop_parse = 1;
1418  } else if (pes->data_index == 0 &&
1419  buf_size > max_packet_size) {
1420  // pes packet size is < ts size packet and pes data is padded with STUFFING_BYTE
1421  // not sure if this is legal in ts but see issue #2392
1422  buf_size = max_packet_size;
1423  }
1424 
1425  if (!pes->buffer) {
1426  pes->buffer = buffer_pool_get(ts, max_packet_size);
1427  if (!pes->buffer)
1428  return AVERROR(ENOMEM);
1429  }
1430 
1431  memcpy(pes->buffer->data + pes->data_index, p, buf_size);
1432  pes->data_index += buf_size;
1433  /* emit complete packets with known packet size
1434  * decreases demuxer delay for infrequent packets like subtitles from
1435  * a couple of seconds to milliseconds for properly muxed files. */
1436  if (!ts->stop_parse && pes->PES_packet_length &&
1438  ts->stop_parse = 1;
1439  ret = new_pes_packet(pes, ts->pkt);
1440  pes->state = MPEGTS_SKIP;
1441  if (ret < 0)
1442  return ret;
1443  }
1444  } while (0);
1445  buf_size = 0;
1446  break;
1447  case MPEGTS_SKIP:
1448  buf_size = 0;
1449  break;
1450  }
1451  }
1452 
1453  return 0;
1454 }
1455 
1456 static PESContext *add_pes_stream(MpegTSContext *ts, int pid, int pcr_pid)
1457 {
1458  MpegTSFilter *tss;
1459  PESContext *pes;
1460 
1461  /* if no pid found, then add a pid context */
1462  pes = av_mallocz(sizeof(PESContext));
1463  if (!pes)
1464  return 0;
1465  pes->ts = ts;
1466  pes->stream = ts->stream;
1467  pes->pid = pid;
1468  pes->pcr_pid = pcr_pid;
1469  pes->state = MPEGTS_SKIP;
1470  pes->pts = AV_NOPTS_VALUE;
1471  pes->dts = AV_NOPTS_VALUE;
1472  tss = mpegts_open_pes_filter(ts, pid, mpegts_push_data, pes);
1473  if (!tss) {
1474  av_free(pes);
1475  return 0;
1476  }
1477  return pes;
1478 }
1479 
1480 #define MAX_LEVEL 4
1481 typedef struct MP4DescrParseContext {
1488  int level;
1491 
1493  const uint8_t *buf, unsigned size,
1494  Mp4Descr *descr, int max_descr_count)
1495 {
1496  if (size > (1 << 30))
1497  return AVERROR_INVALIDDATA;
1498 
1499  ffio_init_read_context(&d->pb, buf, size);
1500 
1501  d->s = s;
1502  d->level = 0;
1503  d->descr_count = 0;
1504  d->descr = descr;
1505  d->active_descr = NULL;
1506  d->max_descr_count = max_descr_count;
1507 
1508  return 0;
1509 }
1510 
1511 static void update_offsets(AVIOContext *pb, int64_t *off, int *len)
1512 {
1513  int64_t new_off = avio_tell(pb);
1514  (*len) -= new_off - *off;
1515  *off = new_off;
1516 }
1517 
1518 static int parse_mp4_descr(MP4DescrParseContext *d, int64_t off, int len,
1519  int target_tag);
1520 
1522 {
1523  while (len > 0) {
1524  int ret = parse_mp4_descr(d, off, len, 0);
1525  if (ret < 0)
1526  return ret;
1527  update_offsets(&d->pb.pub, &off, &len);
1528  }
1529  return 0;
1530 }
1531 
1533 {
1534  AVIOContext *const pb = &d->pb.pub;
1535  avio_rb16(pb); // ID
1536  avio_r8(pb);
1537  avio_r8(pb);
1538  avio_r8(pb);
1539  avio_r8(pb);
1540  avio_r8(pb);
1541  update_offsets(pb, &off, &len);
1542  return parse_mp4_descr_arr(d, off, len);
1543 }
1544 
1546 {
1547  int id_flags;
1548  if (len < 2)
1549  return 0;
1550  id_flags = avio_rb16(&d->pb.pub);
1551  if (!(id_flags & 0x0020)) { // URL_Flag
1552  update_offsets(&d->pb.pub, &off, &len);
1553  return parse_mp4_descr_arr(d, off, len); // ES_Descriptor[]
1554  } else {
1555  return 0;
1556  }
1557 }
1558 
1560 {
1561  AVIOContext *const pb = &d->pb.pub;
1562  int es_id = 0;
1563  int ret = 0;
1564 
1565  if (d->descr_count >= d->max_descr_count)
1566  return AVERROR_INVALIDDATA;
1567  ff_mp4_parse_es_descr(pb, &es_id);
1568  d->active_descr = d->descr + (d->descr_count++);
1569 
1570  d->active_descr->es_id = es_id;
1571  update_offsets(pb, &off, &len);
1572  if ((ret = parse_mp4_descr(d, off, len, MP4DecConfigDescrTag)) < 0)
1573  return ret;
1574  update_offsets(pb, &off, &len);
1575  if (len > 0)
1576  ret = parse_mp4_descr(d, off, len, MP4SLDescrTag);
1577  d->active_descr = NULL;
1578  return ret;
1579 }
1580 
1582  int len)
1583 {
1584  Mp4Descr *descr = d->active_descr;
1585  if (!descr)
1586  return AVERROR_INVALIDDATA;
1588  if (!descr->dec_config_descr)
1589  return AVERROR(ENOMEM);
1590  descr->dec_config_descr_len = len;
1591  avio_read(&d->pb.pub, descr->dec_config_descr, len);
1592  return 0;
1593 }
1594 
1596 {
1597  Mp4Descr *descr = d->active_descr;
1598  AVIOContext *const pb = &d->pb.pub;
1599  int predefined;
1600  if (!descr)
1601  return AVERROR_INVALIDDATA;
1602 
1603 #define R8_CHECK_CLIP_MAX(dst, maxv) do { \
1604  descr->sl.dst = avio_r8(pb); \
1605  if (descr->sl.dst > maxv) { \
1606  descr->sl.dst = maxv; \
1607  return AVERROR_INVALIDDATA; \
1608  } \
1609 } while (0)
1610 
1611  predefined = avio_r8(pb);
1612  if (!predefined) {
1613  int lengths;
1614  int flags = avio_r8(pb);
1615  descr->sl.use_au_start = !!(flags & 0x80);
1616  descr->sl.use_au_end = !!(flags & 0x40);
1617  descr->sl.use_rand_acc_pt = !!(flags & 0x20);
1618  descr->sl.use_padding = !!(flags & 0x08);
1619  descr->sl.use_timestamps = !!(flags & 0x04);
1620  descr->sl.use_idle = !!(flags & 0x02);
1621  descr->sl.timestamp_res = avio_rb32(pb);
1622  avio_rb32(pb);
1623  R8_CHECK_CLIP_MAX(timestamp_len, 63);
1624  R8_CHECK_CLIP_MAX(ocr_len, 63);
1625  R8_CHECK_CLIP_MAX(au_len, 31);
1626  descr->sl.inst_bitrate_len = avio_r8(pb);
1627  lengths = avio_rb16(pb);
1628  descr->sl.degr_prior_len = lengths >> 12;
1629  descr->sl.au_seq_num_len = (lengths >> 7) & 0x1f;
1630  descr->sl.packet_seq_num_len = (lengths >> 2) & 0x1f;
1631  } else if (!d->predefined_SLConfigDescriptor_seen){
1632  avpriv_report_missing_feature(d->s, "Predefined SLConfigDescriptor");
1634  }
1635  return 0;
1636 }
1637 
1639  int target_tag)
1640 {
1641  int tag;
1642  AVIOContext *const pb = &d->pb.pub;
1643  int len1 = ff_mp4_read_descr(d->s, pb, &tag);
1644  int ret = 0;
1645 
1646  update_offsets(pb, &off, &len);
1647  if (len < 0 || len1 > len || len1 <= 0) {
1648  av_log(d->s, AV_LOG_ERROR,
1649  "Tag %x length violation new length %d bytes remaining %d\n",
1650  tag, len1, len);
1651  return AVERROR_INVALIDDATA;
1652  }
1653 
1654  if (d->level++ >= MAX_LEVEL) {
1655  av_log(d->s, AV_LOG_ERROR, "Maximum MP4 descriptor level exceeded\n");
1657  goto done;
1658  }
1659 
1660  if (target_tag && tag != target_tag) {
1661  av_log(d->s, AV_LOG_ERROR, "Found tag %x expected %x\n", tag,
1662  target_tag);
1664  goto done;
1665  }
1666 
1667  switch (tag) {
1668  case MP4IODescrTag:
1669  ret = parse_MP4IODescrTag(d, off, len1);
1670  break;
1671  case MP4ODescrTag:
1672  ret = parse_MP4ODescrTag(d, off, len1);
1673  break;
1674  case MP4ESDescrTag:
1675  ret = parse_MP4ESDescrTag(d, off, len1);
1676  break;
1677  case MP4DecConfigDescrTag:
1678  ret = parse_MP4DecConfigDescrTag(d, off, len1);
1679  break;
1680  case MP4SLDescrTag:
1681  ret = parse_MP4SLDescrTag(d, off, len1);
1682  break;
1683  }
1684 
1685 
1686 done:
1687  d->level--;
1688  avio_seek(pb, off + len1, SEEK_SET);
1689  return ret;
1690 }
1691 
1692 static int mp4_read_iods(AVFormatContext *s, const uint8_t *buf, unsigned size,
1693  Mp4Descr *descr, int *descr_count, int max_descr_count)
1694 {
1696  int ret;
1697 
1699 
1700  ret = init_MP4DescrParseContext(&d, s, buf, size, descr, max_descr_count);
1701  if (ret < 0)
1702  return ret;
1703 
1705 
1706  *descr_count += d.descr_count;
1707  return ret;
1708 }
1709 
1710 static int mp4_read_od(AVFormatContext *s, const uint8_t *buf, unsigned size,
1711  Mp4Descr *descr, int *descr_count, int max_descr_count)
1712 {
1714  int ret;
1715 
1716  ret = init_MP4DescrParseContext(&d, s, buf, size, descr, max_descr_count);
1717  if (ret < 0)
1718  return ret;
1719 
1721 
1722  *descr_count = d.descr_count;
1723  return ret;
1724 }
1725 
1726 static void m4sl_cb(MpegTSFilter *filter, const uint8_t *section,
1727  int section_len)
1728 {
1729  MpegTSContext *ts = filter->u.section_filter.opaque;
1730  MpegTSSectionFilter *tssf = &filter->u.section_filter;
1731  SectionHeader h;
1732  const uint8_t *p, *p_end;
1733  int mp4_descr_count = 0;
1734  Mp4Descr mp4_descr[MAX_MP4_DESCR_COUNT] = { { 0 } };
1735  int i, pid;
1736  AVFormatContext *s = ts->stream;
1737 
1738  p_end = section + section_len - 4;
1739  p = section;
1740  if (parse_section_header(&h, &p, p_end) < 0)
1741  return;
1742  if (h.tid != M4OD_TID)
1743  return;
1744  if (skip_identical(&h, tssf))
1745  return;
1746 
1747  mp4_read_od(s, p, (unsigned) (p_end - p), mp4_descr, &mp4_descr_count,
1749 
1750  for (pid = 0; pid < NB_PID_MAX; pid++) {
1751  if (!ts->pids[pid])
1752  continue;
1753  for (i = 0; i < mp4_descr_count; i++) {
1754  PESContext *pes;
1755  AVStream *st;
1756  FFStream *sti;
1757  FFIOContext pb;
1758  if (ts->pids[pid]->es_id != mp4_descr[i].es_id)
1759  continue;
1760  if (ts->pids[pid]->type != MPEGTS_PES) {
1761  av_log(s, AV_LOG_ERROR, "pid %x is not PES\n", pid);
1762  continue;
1763  }
1764  pes = ts->pids[pid]->u.pes_filter.opaque;
1765  st = pes->st;
1766  if (!st)
1767  continue;
1768  sti = ffstream(st);
1769 
1770  pes->sl = mp4_descr[i].sl;
1771 
1772  ffio_init_read_context(&pb, mp4_descr[i].dec_config_descr,
1773  mp4_descr[i].dec_config_descr_len);
1775  if (st->codecpar->codec_id == AV_CODEC_ID_AAC &&
1776  st->codecpar->extradata_size > 0)
1777  sti->need_parsing = 0;
1778  if (st->codecpar->codec_id == AV_CODEC_ID_H264 &&
1779  st->codecpar->extradata_size > 0)
1780  sti->need_parsing = 0;
1781 
1783  sti->need_context_update = 1;
1784  }
1785  }
1786  for (i = 0; i < mp4_descr_count; i++)
1787  av_free(mp4_descr[i].dec_config_descr);
1788 }
1789 
1790 static void scte_data_cb(MpegTSFilter *filter, const uint8_t *section,
1791  int section_len)
1792 {
1793  AVProgram *prg = NULL;
1794  MpegTSContext *ts = filter->u.section_filter.opaque;
1795 
1796  int idx = ff_find_stream_index(ts->stream, filter->pid);
1797  if (idx < 0)
1798  return;
1799 
1800  /**
1801  * In case we receive an SCTE-35 packet before mpegts context is fully
1802  * initialized.
1803  */
1804  if (!ts->pkt)
1805  return;
1806 
1807  new_data_packet(section, section_len, ts->pkt);
1808  ts->pkt->stream_index = idx;
1809  prg = av_find_program_from_stream(ts->stream, NULL, idx);
1810  if (prg && prg->pcr_pid != -1 && prg->discard != AVDISCARD_ALL) {
1811  MpegTSFilter *f = ts->pids[prg->pcr_pid];
1812  if (f && f->last_pcr != -1)
1813  ts->pkt->pts = ts->pkt->dts = f->last_pcr/SYSTEM_CLOCK_FREQUENCY_DIVISOR;
1814  }
1815  ts->stop_parse = 1;
1816 
1817 }
1818 
1819 static const uint8_t opus_coupled_stream_cnt[9] = {
1820  1, 0, 1, 1, 2, 2, 2, 3, 3
1821 };
1822 
1823 static const uint8_t opus_stream_cnt[9] = {
1824  1, 1, 1, 2, 2, 3, 4, 4, 5,
1825 };
1826 
1827 static const uint8_t opus_channel_map[8][8] = {
1828  { 0 },
1829  { 0,1 },
1830  { 0,2,1 },
1831  { 0,1,2,3 },
1832  { 0,4,1,2,3 },
1833  { 0,4,1,2,3,5 },
1834  { 0,4,1,2,3,5,6 },
1835  { 0,6,1,2,3,4,5,7 },
1836 };
1837 
1839  const uint8_t **pp, const uint8_t *desc_end)
1840 {
1841  MpegTSContext *ts = fc->priv_data;
1842  int ext_tag = get8(pp, desc_end);
1843 
1844  switch (ext_tag) {
1845  case JXS_VIDEO_DESCRIPTOR: /* JPEG-XS video descriptor*/
1846  {
1847  int horizontal_size, vertical_size, schar;
1848  int colour_primaries, transfer_characteristics, matrix_coefficients, video_full_range_flag;
1849  int descriptor_version, interlace_mode, n_fields;
1850  unsigned frat;
1851 
1852  if (desc_end - *pp < 29)
1853  return AVERROR_INVALIDDATA;
1854 
1855  descriptor_version = get8(pp, desc_end);
1856  if (descriptor_version) {
1857  av_log(fc, AV_LOG_WARNING, "Unsupported JPEG-XS descriptor version (%d != 0)", descriptor_version);
1858  return AVERROR_INVALIDDATA;
1859  }
1860 
1861  horizontal_size = get16(pp, desc_end);
1862  vertical_size = get16(pp, desc_end);
1863  *pp += 4; /* brat */
1864  frat = bytestream_get_be32(pp);
1865  schar = get16(pp, desc_end);
1866  *pp += 2; /* Ppih */
1867  *pp += 2; /* Plev */
1868  *pp += 4; /* max_buffer_size */
1869  *pp += 1; /* buffer_model_type */
1870  colour_primaries = get8(pp, desc_end);
1871  transfer_characteristics = get8(pp, desc_end);
1872  matrix_coefficients = get8(pp, desc_end);
1873  video_full_range_flag = (get8(pp, desc_end) & 0x80) == 0x80 ? 1 : 0;
1874 
1875  interlace_mode = (frat >> 30) & 0x3;
1876  if (interlace_mode == 3) {
1877  av_log(fc, AV_LOG_WARNING, "Unknown JPEG XS interlace mode 3");
1878  return AVERROR_INVALIDDATA;
1879  }
1880 
1881  st->codecpar->field_order = interlace_mode == 0 ? AV_FIELD_PROGRESSIVE
1882  : (interlace_mode == 1 ? AV_FIELD_TT : AV_FIELD_BB);
1883  n_fields = st->codecpar->field_order == AV_FIELD_PROGRESSIVE ? 1 : 2;
1884 
1885  st->codecpar->width = horizontal_size;
1886  st->codecpar->height = vertical_size * n_fields;
1887 
1888  if (frat != 0) {
1889  int framerate_num = (frat & 0x0000FFFFU);
1890  int framerate_den = ((frat >> 24) & 0x0000003FU);
1891 
1892  if (framerate_den == 2) {
1893  framerate_num *= 1000;
1894  framerate_den = 1001;
1895  } else if (framerate_den != 1) {
1896  av_log(fc, AV_LOG_WARNING, "Unknown JPEG XS framerate denominator code %u", framerate_den);
1897  return AVERROR_INVALIDDATA;
1898  }
1899 
1900  st->codecpar->framerate.num = framerate_num;
1901  st->codecpar->framerate.den = framerate_den;
1902  }
1903 
1904  switch (schar & 0xf) {
1905  case 0: st->codecpar->format = AV_PIX_FMT_YUV422P10LE; break;
1906  case 1: st->codecpar->format = AV_PIX_FMT_YUV444P10LE; break;
1907  default:
1908  av_log(fc, AV_LOG_WARNING, "Unknown JPEG XS sampling format");
1909  break;
1910  }
1911 
1912  st->codecpar->color_range = video_full_range_flag ? AVCOL_RANGE_JPEG : AVCOL_RANGE_MPEG;
1913  st->codecpar->color_primaries = colour_primaries;
1915  st->codecpar->color_space = matrix_coefficients;
1916  }
1917  break;
1919  {
1920  AVStreamGroup *stg = NULL;
1921  int lcevc_stream_tag = get8(pp, desc_end);
1922  int ret, i;
1923 
1924  if (!get_program(ts, prg_id))
1925  return 0;
1926 
1927  if (st->codecpar->codec_id != AV_CODEC_ID_LCEVC)
1928  return AVERROR_INVALIDDATA;
1929 
1930  for (i = 0; i < fc->nb_stream_groups; i++) {
1931  stg = fc->stream_groups[i];
1932  if (stg->type != AV_STREAM_GROUP_PARAMS_LCEVC)
1933  continue;
1934  if (stg->id == lcevc_stream_tag)
1935  break;
1936  }
1937  if (i == fc->nb_stream_groups)
1939  if (!stg)
1940  return AVERROR(ENOMEM);
1941 
1942  stg->id = lcevc_stream_tag;
1943  for (i = 0; i < stg->nb_streams; i++) {
1944  if (stg->streams[i]->codecpar->codec_id == AV_CODEC_ID_LCEVC)
1945  break;
1946  }
1947  if (i == stg->nb_streams) {
1949  av_assert0(ret != AVERROR(EEXIST));
1950  if (ret < 0)
1951  return ret;
1952  } else
1953  stg->streams[i] = st;
1954 
1955  av_assert0(i < stg->nb_streams);
1956  stg->params.lcevc->lcevc_index = i;
1957  }
1958  break;
1960  {
1961  int num_lcevc_stream_tags = get8(pp, desc_end);
1962 
1963  if (!get_program(ts, prg_id))
1964  return 0;
1965 
1966  if (st->codecpar->codec_id == AV_CODEC_ID_LCEVC)
1967  return AVERROR_INVALIDDATA;
1968 
1969  for (int i = 0; i < num_lcevc_stream_tags; i++) {
1970  AVStreamGroup *stg = NULL;
1971  int lcevc_stream_tag = get8(pp, desc_end);;
1972  int ret, j;
1973 
1974  for (j = 0; j < fc->nb_stream_groups; j++) {
1975  stg = fc->stream_groups[j];
1976  if (stg->type != AV_STREAM_GROUP_PARAMS_LCEVC)
1977  continue;
1978  if (stg->id == lcevc_stream_tag)
1979  break;
1980  }
1981  if (j == fc->nb_stream_groups)
1983  if (!stg)
1984  return AVERROR(ENOMEM);
1985 
1986  stg->id = lcevc_stream_tag;
1987  for (j = 0; j < stg->nb_streams; j++) {
1988  if (stg->streams[j]->index == st->index)
1989  break;
1990  }
1991  if (j == stg->nb_streams) {
1993  av_assert0(ret != AVERROR(EEXIST));
1994  if (ret < 0)
1995  return ret;
1996  }
1997  }
1998  }
1999  break;
2000  default:
2001  break;
2002  }
2003 
2004  return 0;
2005 }
2006 
2007 int ff_parse_mpeg2_descriptor(AVFormatContext *fc, AVStream *st, int stream_type, int prg_id,
2008  const uint8_t **pp, const uint8_t *desc_list_end,
2009  Mp4Descr *mp4_descr, int mp4_descr_count, int pid,
2010  MpegTSContext *ts)
2011 {
2012  FFStream *const sti = ffstream(st);
2013  const uint8_t *desc_end;
2014  int desc_len, desc_tag, desc_es_id, ext_desc_tag, channels, channel_config_code;
2015  char language[252];
2016  int i;
2017 
2018  desc_tag = get8(pp, desc_list_end);
2019  if (desc_tag < 0)
2020  return AVERROR_INVALIDDATA;
2021  desc_len = get8(pp, desc_list_end);
2022  if (desc_len < 0)
2023  return AVERROR_INVALIDDATA;
2024  desc_end = *pp + desc_len;
2025  if (desc_end > desc_list_end)
2026  return AVERROR_INVALIDDATA;
2027 
2028  av_log(fc, AV_LOG_TRACE, "tag: 0x%02x len=%d\n", desc_tag, desc_len);
2029 
2030  if ((st->codecpar->codec_id == AV_CODEC_ID_NONE || sti->request_probe > 0) &&
2031  stream_type == STREAM_TYPE_PRIVATE_DATA)
2032  mpegts_find_stream_type(st, desc_tag, DESC_types);
2033 
2034  switch (desc_tag) {
2036  if (get8(pp, desc_end) & 0x1) {
2038  }
2039  break;
2040  case SL_DESCRIPTOR:
2041  desc_es_id = get16(pp, desc_end);
2042  if (desc_es_id < 0)
2043  break;
2044  if (ts && ts->pids[pid])
2045  ts->pids[pid]->es_id = desc_es_id;
2046  for (i = 0; i < mp4_descr_count; i++)
2047  if (mp4_descr[i].dec_config_descr_len &&
2048  mp4_descr[i].es_id == desc_es_id) {
2049  FFIOContext pb;
2050  ffio_init_read_context(&pb, mp4_descr[i].dec_config_descr,
2051  mp4_descr[i].dec_config_descr_len);
2053  if (st->codecpar->codec_id == AV_CODEC_ID_AAC &&
2054  st->codecpar->extradata_size > 0) {
2055  sti->need_parsing = 0;
2056  sti->need_context_update = 1;
2057  }
2059  mpegts_open_section_filter(ts, pid, m4sl_cb, ts, 1);
2060  }
2061  break;
2062  case FMC_DESCRIPTOR:
2063  if (get16(pp, desc_end) < 0)
2064  break;
2065  if (mp4_descr_count > 0 &&
2067  (sti->request_probe == 0 && st->codecpar->codec_id == AV_CODEC_ID_NONE) ||
2068  sti->request_probe > 0) &&
2069  mp4_descr->dec_config_descr_len && mp4_descr->es_id == pid) {
2070  FFIOContext pb;
2071  ffio_init_read_context(&pb, mp4_descr->dec_config_descr,
2072  mp4_descr->dec_config_descr_len);
2074  if (st->codecpar->codec_id == AV_CODEC_ID_AAC &&
2075  st->codecpar->extradata_size > 0) {
2076  sti->request_probe = sti->need_parsing = 0;
2078  sti->need_context_update = 1;
2079  }
2080  }
2081  break;
2082  case TELETEXT_DESCRIPTOR:
2083  {
2084  uint8_t *extradata = NULL;
2085  int language_count = desc_len / 5, ret;
2086 
2087  if (desc_len > 0 && desc_len % 5 != 0)
2088  return AVERROR_INVALIDDATA;
2089 
2090  if (language_count > 0) {
2091  /* 4 bytes per language code (3 bytes) with comma or NUL byte should fit language buffer */
2092  av_assert0(language_count <= sizeof(language) / 4);
2093 
2094  if (st->codecpar->extradata == NULL) {
2095  ret = ff_alloc_extradata(st->codecpar, language_count * 2);
2096  if (ret < 0)
2097  return ret;
2098  }
2099 
2100  if (st->codecpar->extradata_size < language_count * 2)
2101  return AVERROR_INVALIDDATA;
2102 
2103  extradata = st->codecpar->extradata;
2104 
2105  for (i = 0; i < language_count; i++) {
2106  language[i * 4 + 0] = get8(pp, desc_end);
2107  language[i * 4 + 1] = get8(pp, desc_end);
2108  language[i * 4 + 2] = get8(pp, desc_end);
2109  language[i * 4 + 3] = ',';
2110 
2111  memcpy(extradata, *pp, 2);
2112  extradata += 2;
2113 
2114  *pp += 2;
2115  }
2116 
2117  language[i * 4 - 1] = 0;
2118  av_dict_set(&st->metadata, "language", language, 0);
2119  sti->need_context_update = 1;
2120  }
2121  }
2122  break;
2123  case SUBTITLING_DESCRIPTOR:
2124  {
2125  /* 8 bytes per DVB subtitle substream data:
2126  * ISO_639_language_code (3 bytes),
2127  * subtitling_type (1 byte),
2128  * composition_page_id (2 bytes),
2129  * ancillary_page_id (2 bytes) */
2130  int language_count = desc_len / 8, ret;
2131 
2132  if (desc_len > 0 && desc_len % 8 != 0)
2133  return AVERROR_INVALIDDATA;
2134 
2135  if (language_count > 1) {
2136  avpriv_request_sample(fc, "DVB subtitles with multiple languages");
2137  }
2138 
2139  if (language_count > 0) {
2140  uint8_t *extradata;
2141 
2142  /* 4 bytes per language code (3 bytes) with comma or NUL byte should fit language buffer */
2143  av_assert0(language_count <= sizeof(language) / 4);
2144 
2145  if (st->codecpar->extradata == NULL) {
2146  ret = ff_alloc_extradata(st->codecpar, language_count * 5);
2147  if (ret < 0)
2148  return ret;
2149  }
2150 
2151  if (st->codecpar->extradata_size < language_count * 5)
2152  return AVERROR_INVALIDDATA;
2153 
2154  extradata = st->codecpar->extradata;
2155 
2156  for (i = 0; i < language_count; i++) {
2157  language[i * 4 + 0] = get8(pp, desc_end);
2158  language[i * 4 + 1] = get8(pp, desc_end);
2159  language[i * 4 + 2] = get8(pp, desc_end);
2160  language[i * 4 + 3] = ',';
2161 
2162  /* hearing impaired subtitles detection using subtitling_type */
2163  switch (*pp[0]) {
2164  case 0x20: /* DVB subtitles (for the hard of hearing) with no monitor aspect ratio criticality */
2165  case 0x21: /* DVB subtitles (for the hard of hearing) for display on 4:3 aspect ratio monitor */
2166  case 0x22: /* DVB subtitles (for the hard of hearing) for display on 16:9 aspect ratio monitor */
2167  case 0x23: /* DVB subtitles (for the hard of hearing) for display on 2.21:1 aspect ratio monitor */
2168  case 0x24: /* DVB subtitles (for the hard of hearing) for display on a high definition monitor */
2169  case 0x25: /* DVB subtitles (for the hard of hearing) with plano-stereoscopic disparity for display on a high definition monitor */
2171  break;
2172  }
2173 
2174  extradata[4] = get8(pp, desc_end); /* subtitling_type */
2175  memcpy(extradata, *pp, 4); /* composition_page_id and ancillary_page_id */
2176  extradata += 5;
2177 
2178  *pp += 4;
2179  }
2180 
2181  language[i * 4 - 1] = 0;
2182  av_dict_set(&st->metadata, "language", language, 0);
2183  sti->need_context_update = 1;
2184  }
2185  }
2186  break;
2188  for (i = 0; i + 4 <= desc_len; i += 4) {
2189  language[i + 0] = get8(pp, desc_end);
2190  language[i + 1] = get8(pp, desc_end);
2191  language[i + 2] = get8(pp, desc_end);
2192  language[i + 3] = ',';
2193  switch (get8(pp, desc_end)) {
2194  case 0x01:
2196  break;
2197  case 0x02:
2199  break;
2200  case 0x03:
2203  break;
2204  }
2205  }
2206  if (i && language[0]) {
2207  language[i - 1] = 0;
2208  /* don't overwrite language, as it may already have been set by
2209  * another, more specific descriptor (e.g. supplementary audio) */
2211  }
2212  break;
2214  st->codecpar->codec_tag = bytestream_get_le32(pp);
2215  av_log(fc, AV_LOG_TRACE, "reg_desc=%.4s\n", (char *)&st->codecpar->codec_tag);
2216  if (st->codecpar->codec_id == AV_CODEC_ID_NONE || sti->request_probe > 0) {
2218  if (st->codecpar->codec_tag == MKTAG('B', 'S', 'S', 'D'))
2219  sti->request_probe = 50;
2220  }
2221  break;
2223  sti->stream_identifier = 1 + get8(pp, desc_end);
2224  break;
2225  case METADATA_DESCRIPTOR:
2226  if (get16(pp, desc_end) == 0xFFFF)
2227  *pp += 4;
2228  if (get8(pp, desc_end) == 0xFF) {
2229  st->codecpar->codec_tag = bytestream_get_le32(pp);
2230  if (st->codecpar->codec_id == AV_CODEC_ID_NONE)
2232  }
2233  break;
2234  case DVB_EXTENSION_DESCRIPTOR: /* DVB extension descriptor */
2235  ext_desc_tag = get8(pp, desc_end);
2236  if (ext_desc_tag < 0)
2237  return AVERROR_INVALIDDATA;
2238  if (st->codecpar->codec_id == AV_CODEC_ID_OPUS &&
2239  ext_desc_tag == 0x80) { /* User defined (provisional Opus) */
2240  if (!st->codecpar->extradata) {
2243  if (!st->codecpar->extradata)
2244  return AVERROR(ENOMEM);
2245 
2248 
2249  channel_config_code = get8(pp, desc_end);
2250  if (channel_config_code < 0)
2251  return AVERROR_INVALIDDATA;
2252  if (channel_config_code <= 0x8) {
2253  st->codecpar->extradata[9] = channels = channel_config_code ? channel_config_code : 2;
2254  AV_WL32(&st->codecpar->extradata[12], 48000);
2255  st->codecpar->extradata[18] = channel_config_code ? (channels > 2) : /* Dual Mono */ 255;
2256  st->codecpar->extradata[19] = opus_stream_cnt[channel_config_code];
2257  st->codecpar->extradata[20] = opus_coupled_stream_cnt[channel_config_code];
2258  memcpy(&st->codecpar->extradata[21], opus_channel_map[channels - 1], channels);
2259  st->codecpar->extradata_size = st->codecpar->extradata[18] ? 21 + channels : 19;
2260  } else {
2261  avpriv_request_sample(fc, "Opus in MPEG-TS - channel_config_code > 0x8");
2262  }
2264  sti->need_context_update = 1;
2265  }
2266  }
2267  if (ext_desc_tag == SUPPLEMENTARY_AUDIO_DESCRIPTOR) {
2268  int flags;
2269 
2270  if (desc_len < 1)
2271  return AVERROR_INVALIDDATA;
2272  flags = get8(pp, desc_end);
2273 
2274  if ((flags & 0x80) == 0) /* mix_type */
2276 
2277  switch ((flags >> 2) & 0x1F) { /* editorial_classification */
2278  case 0x01:
2281  break;
2282  case 0x02:
2284  break;
2285  case 0x03:
2287  break;
2288  }
2289 
2290  if (flags & 0x01) { /* language_code_present */
2291  if (desc_len < 4)
2292  return AVERROR_INVALIDDATA;
2293  language[0] = get8(pp, desc_end);
2294  language[1] = get8(pp, desc_end);
2295  language[2] = get8(pp, desc_end);
2296  language[3] = 0;
2297 
2298  /* This language always has to override a possible
2299  * ISO 639 language descriptor language */
2300  if (language[0])
2301  av_dict_set(&st->metadata, "language", language, 0);
2302  }
2303  }
2304  break;
2305  case AC3_DESCRIPTOR:
2306  {
2307  int component_type_flag = get8(pp, desc_end) & (1 << 7);
2308  if (component_type_flag) {
2309  int component_type = get8(pp, desc_end);
2310  int service_type_mask = 0x38; // 0b00111000
2311  int service_type = ((component_type & service_type_mask) >> 3);
2312  if (service_type == 0x02 /* 0b010 */) {
2314  av_log(ts ? ts->stream : fc, AV_LOG_DEBUG, "New track disposition for id %u: %u\n", st->id, st->disposition);
2315  }
2316  }
2317  }
2318  break;
2320  {
2321  int component_type_flag = get8(pp, desc_end) & (1 << 7);
2322  if (component_type_flag) {
2323  int component_type = get8(pp, desc_end);
2324  int service_type_mask = 0x38; // 0b00111000
2325  int service_type = ((component_type & service_type_mask) >> 3);
2326  if (service_type == 0x02 /* 0b010 */) {
2328  av_log(ts ? ts->stream : fc, AV_LOG_DEBUG, "New track disposition for id %u: %u\n", st->id, st->disposition);
2329  }
2330  }
2331  }
2332  break;
2334  // STD-B24, fascicle 3, chapter 4 defines private_stream_1
2335  // for captions
2336  if (stream_type == STREAM_TYPE_PRIVATE_DATA) {
2337  // This structure is defined in STD-B10, part 1, listing 5.4 and
2338  // part 2, 6.2.20).
2339  // Listing of data_component_ids is in STD-B10, part 2, Annex J.
2340  // Component tag limits are documented in TR-B14, fascicle 2,
2341  // Vol. 3, Section 2, 4.2.8.1
2342  int actual_component_tag = sti->stream_identifier - 1;
2343  int picked_profile = AV_PROFILE_UNKNOWN;
2344  int data_component_id = get16(pp, desc_end);
2345  if (data_component_id < 0)
2346  return AVERROR_INVALIDDATA;
2347 
2348  switch (data_component_id) {
2349  case 0x0008:
2350  // [0x30..0x37] are component tags utilized for
2351  // non-mobile captioning service ("profile A").
2352  if (actual_component_tag >= 0x30 &&
2353  actual_component_tag <= 0x37) {
2354  picked_profile = AV_PROFILE_ARIB_PROFILE_A;
2355  }
2356  break;
2357  case 0x0012:
2358  // component tag 0x87 signifies a mobile/partial reception
2359  // (1seg) captioning service ("profile C").
2360  if (actual_component_tag == 0x87) {
2361  picked_profile = AV_PROFILE_ARIB_PROFILE_C;
2362  }
2363  break;
2364  default:
2365  break;
2366  }
2367 
2368  if (picked_profile == AV_PROFILE_UNKNOWN)
2369  break;
2370 
2373  if (st->codecpar->profile != picked_profile) {
2374  st->codecpar->profile = picked_profile;
2375  sti->need_context_update = 1;
2376  }
2377  sti->request_probe = 0;
2378  sti->need_parsing = 0;
2379  }
2380  break;
2382  {
2383  uint32_t buf;
2385  size_t dovi_size;
2386  int dependency_pid = -1; // Unset
2387 
2388  if (desc_end - *pp < 4) // (8 + 8 + 7 + 6 + 1 + 1 + 1) / 8
2389  return AVERROR_INVALIDDATA;
2390 
2391  dovi = av_dovi_alloc(&dovi_size);
2392  if (!dovi)
2393  return AVERROR(ENOMEM);
2394 
2395  dovi->dv_version_major = get8(pp, desc_end);
2396  dovi->dv_version_minor = get8(pp, desc_end);
2397  buf = get16(pp, desc_end);
2398  dovi->dv_profile = (buf >> 9) & 0x7f; // 7 bits
2399  dovi->dv_level = (buf >> 3) & 0x3f; // 6 bits
2400  dovi->rpu_present_flag = (buf >> 2) & 0x01; // 1 bit
2401  dovi->el_present_flag = (buf >> 1) & 0x01; // 1 bit
2402  dovi->bl_present_flag = buf & 0x01; // 1 bit
2403  if (!dovi->bl_present_flag && desc_end - *pp >= 2) {
2404  buf = get16(pp, desc_end);
2405  dependency_pid = buf >> 3; // 13 bits
2406  }
2407  if (desc_end - *pp >= 1) { // 8 bits
2408  buf = get8(pp, desc_end);
2409  dovi->dv_bl_signal_compatibility_id = (buf >> 4) & 0x0f; // 4 bits
2410  dovi->dv_md_compression = (buf >> 2) & 0x03; // 2 bits
2411  } else {
2412  // 0 stands for None
2413  // Dolby Vision V1.2.93 profiles and levels
2416  }
2417 
2421  (uint8_t *)dovi, dovi_size, 0)) {
2422  av_free(dovi);
2423  return AVERROR(ENOMEM);
2424  }
2425 
2426  av_log(fc, AV_LOG_TRACE, "DOVI, version: %d.%d, profile: %d, level: %d, "
2427  "rpu flag: %d, el flag: %d, bl flag: %d, dependency_pid: %d, "
2428  "compatibility id: %d, compression: %d\n",
2429  dovi->dv_version_major, dovi->dv_version_minor,
2430  dovi->dv_profile, dovi->dv_level,
2431  dovi->rpu_present_flag,
2432  dovi->el_present_flag,
2433  dovi->bl_present_flag,
2434  dependency_pid,
2436  dovi->dv_md_compression);
2437  }
2438  break;
2439  case EXTENSION_DESCRIPTOR: /* descriptor extension */
2440  {
2441  int ret = parse_mpeg2_extension_descriptor(fc, st, prg_id, pp, desc_end);
2442 
2443  if (ret < 0)
2444  return ret;
2445  }
2446  break;
2447  default:
2448  break;
2449  }
2450  *pp = desc_end;
2451  return 0;
2452 }
2453 
2454 static AVStream *find_matching_stream(MpegTSContext *ts, int pid, unsigned int programid,
2455  int stream_identifier, int pmt_stream_idx, struct Program *p)
2456 {
2457  AVFormatContext *s = ts->stream;
2458  AVStream *found = NULL;
2459 
2460  if (stream_identifier) { /* match based on "stream identifier descriptor" if present */
2461  for (int i = 0; i < p->nb_streams; i++) {
2462  if (p->streams[i].stream_identifier == stream_identifier)
2463  if (!found || pmt_stream_idx == i) /* fallback to idx based guess if multiple streams have the same identifier */
2464  found = s->streams[p->streams[i].idx];
2465  }
2466  } else if (pmt_stream_idx < p->nb_streams) { /* match based on position within the PMT */
2467  found = s->streams[p->streams[pmt_stream_idx].idx];
2468  }
2469 
2470  if (found) {
2472  "reusing existing %s stream %d (pid=0x%x) for new pid=0x%x\n",
2474  found->index, found->id, pid);
2475  }
2476 
2477  return found;
2478 }
2479 
2480 static int parse_stream_identifier_desc(const uint8_t *p, const uint8_t *p_end)
2481 {
2482  const uint8_t **pp = &p;
2483  const uint8_t *desc_list_end;
2484  const uint8_t *desc_end;
2485  int desc_list_len;
2486  int desc_len, desc_tag;
2487 
2488  desc_list_len = get16(pp, p_end);
2489  if (desc_list_len < 0)
2490  return -1;
2491  desc_list_len &= 0xfff;
2492  desc_list_end = p + desc_list_len;
2493  if (desc_list_end > p_end)
2494  return -1;
2495 
2496  while (1) {
2497  desc_tag = get8(pp, desc_list_end);
2498  if (desc_tag < 0)
2499  return -1;
2500  desc_len = get8(pp, desc_list_end);
2501  if (desc_len < 0)
2502  return -1;
2503  desc_end = *pp + desc_len;
2504  if (desc_end > desc_list_end)
2505  return -1;
2506 
2507  if (desc_tag == STREAM_IDENTIFIER_DESCRIPTOR) {
2508  return get8(pp, desc_end);
2509  }
2510  *pp = desc_end;
2511  }
2512 
2513  return -1;
2514 }
2515 
2516 static int is_pes_stream(int stream_type, uint32_t prog_reg_desc)
2517 {
2518  switch (stream_type) {
2521  return 0;
2523  /* This User Private stream_type value is used by multiple organizations
2524  for different things. ANSI/SCTE 35 splice_info_section() is a
2525  private_section() not a PES_packet(). */
2526  return !(prog_reg_desc == AV_RL32("CUEI"));
2527  default:
2528  return 1;
2529  }
2530 }
2531 
2532 static void pmt_cb(MpegTSFilter *filter, const uint8_t *section, int section_len)
2533 {
2534  MpegTSContext *ts = filter->u.section_filter.opaque;
2535  MpegTSSectionFilter *tssf = &filter->u.section_filter;
2536  struct Program old_program;
2537  SectionHeader h1, *h = &h1;
2538  PESContext *pes;
2539  AVStream *st;
2540  const uint8_t *p, *p_end, *desc_list_end;
2541  int program_info_length, pcr_pid, pid, stream_type;
2542  int desc_list_len;
2543  uint32_t prog_reg_desc = 0; /* registration descriptor */
2544  int stream_identifier = -1;
2545  struct Program *prg;
2546 
2547  int mp4_descr_count = 0;
2548  Mp4Descr mp4_descr[MAX_MP4_DESCR_COUNT] = { { 0 } };
2549  int i;
2550 
2551  av_log(ts->stream, AV_LOG_TRACE, "PMT: len %i\n", section_len);
2552  hex_dump_debug(ts->stream, section, section_len);
2553 
2554  p_end = section + section_len - 4;
2555  p = section;
2556  if (parse_section_header(h, &p, p_end) < 0)
2557  return;
2558  if (h->tid != PMT_TID)
2559  return;
2560  if (!h->current_next)
2561  return;
2562  if (skip_identical(h, tssf))
2563  return;
2564 
2565  av_log(ts->stream, AV_LOG_TRACE, "sid=0x%x sec_num=%d/%d version=%d tid=%d\n",
2566  h->id, h->sec_num, h->last_sec_num, h->version, h->tid);
2567 
2568  if (!ts->scan_all_pmts && ts->skip_changes)
2569  return;
2570 
2571  prg = get_program(ts, h->id);
2572  if (prg)
2573  old_program = *prg;
2574  else
2575  clear_program(&old_program);
2576 
2577  if (ts->skip_unknown_pmt && !prg)
2578  return;
2579  if (prg && prg->nb_pids && prg->pids[0] != ts->current_pid)
2580  return;
2581  if (!ts->skip_clear)
2582  clear_avprogram(ts, h->id);
2583  clear_program(prg);
2584  add_pid_to_program(prg, ts->current_pid);
2585 
2586  pcr_pid = get16(&p, p_end);
2587  if (pcr_pid < 0)
2588  return;
2589  pcr_pid &= 0x1fff;
2590  add_pid_to_program(prg, pcr_pid);
2591  update_av_program_info(ts->stream, h->id, pcr_pid, h->version);
2592 
2593  av_log(ts->stream, AV_LOG_TRACE, "pcr_pid=0x%x\n", pcr_pid);
2594 
2595  program_info_length = get16(&p, p_end);
2596 
2597  if (program_info_length < 0 || (program_info_length & 0xFFF) > p_end - p)
2598  return;
2599  program_info_length &= 0xfff;
2600  while (program_info_length >= 2) {
2601  uint8_t tag, len;
2602  tag = get8(&p, p_end);
2603  len = get8(&p, p_end);
2604 
2605  av_log(ts->stream, AV_LOG_TRACE, "program tag: 0x%02x len=%d\n", tag, len);
2606 
2607  program_info_length -= 2;
2608  if (len > program_info_length)
2609  // something else is broken, exit the program_descriptors_loop
2610  break;
2611  program_info_length -= len;
2612  if (tag == IOD_DESCRIPTOR && len >= 2) {
2613  get8(&p, p_end); // scope
2614  get8(&p, p_end); // label
2615  len -= 2;
2616  mp4_read_iods(ts->stream, p, len, mp4_descr + mp4_descr_count,
2617  &mp4_descr_count, MAX_MP4_DESCR_COUNT - mp4_descr_count);
2618  } else if (tag == REGISTRATION_DESCRIPTOR && len >= 4) {
2619  prog_reg_desc = bytestream_get_le32(&p);
2620  len -= 4;
2621  }
2622  p += len;
2623  }
2624  p += program_info_length;
2625  if (p >= p_end)
2626  goto out;
2627 
2628  // stop parsing after pmt, we found header
2629  if (!ts->pkt)
2630  ts->stop_parse = 2;
2631 
2632  if (prg)
2633  prg->pmt_found = 1;
2634 
2635  for (i = 0; i < MAX_STREAMS_PER_PROGRAM; i++) {
2636  st = 0;
2637  pes = NULL;
2638  stream_type = get8(&p, p_end);
2639  if (stream_type < 0)
2640  break;
2641  pid = get16(&p, p_end);
2642  if (pid < 0)
2643  goto out;
2644  pid &= 0x1fff;
2645  if (pid == ts->current_pid)
2646  goto out;
2647 
2648  stream_identifier = parse_stream_identifier_desc(p, p_end) + 1;
2649 
2650  /* now create stream */
2651  if (ts->pids[pid] && ts->pids[pid]->type == MPEGTS_PES) {
2652  pes = ts->pids[pid]->u.pes_filter.opaque;
2653  if (ts->merge_pmt_versions && !pes->st) {
2654  st = find_matching_stream(ts, pid, h->id, stream_identifier, i, &old_program);
2655  if (st) {
2656  pes->st = st;
2657  pes->stream_type = stream_type;
2658  pes->merged_st = 1;
2659  }
2660  }
2661  if (!pes->st) {
2662  pes->st = avformat_new_stream(pes->stream, NULL);
2663  if (!pes->st)
2664  goto out;
2665  pes->st->id = pes->pid;
2666  }
2667  st = pes->st;
2668  } else if (is_pes_stream(stream_type, prog_reg_desc)) {
2669  if (ts->pids[pid])
2670  mpegts_close_filter(ts, ts->pids[pid]); // wrongly added sdt filter probably
2671  pes = add_pes_stream(ts, pid, pcr_pid);
2672  if (ts->merge_pmt_versions && pes && !pes->st) {
2673  st = find_matching_stream(ts, pid, h->id, stream_identifier, i, &old_program);
2674  if (st) {
2675  pes->st = st;
2676  pes->stream_type = stream_type;
2677  pes->merged_st = 1;
2678  }
2679  }
2680  if (pes && !pes->st) {
2681  st = avformat_new_stream(pes->stream, NULL);
2682  if (!st)
2683  goto out;
2684  st->id = pes->pid;
2685  }
2686  } else {
2687  int idx = ff_find_stream_index(ts->stream, pid);
2688  if (idx >= 0) {
2689  st = ts->stream->streams[idx];
2690  }
2691  if (ts->merge_pmt_versions && !st) {
2692  st = find_matching_stream(ts, pid, h->id, stream_identifier, i, &old_program);
2693  }
2694  if (!st) {
2695  st = avformat_new_stream(ts->stream, NULL);
2696  if (!st)
2697  goto out;
2698  st->id = pid;
2700  if (stream_type == STREAM_TYPE_SCTE_DATA_SCTE_35 && prog_reg_desc == AV_RL32("CUEI")) {
2701  mpegts_find_stream_type(st, stream_type, SCTE_types);
2702  mpegts_open_section_filter(ts, pid, scte_data_cb, ts, 1);
2703  }
2704  }
2705  }
2706 
2707  if (!st)
2708  goto out;
2709 
2710  if (pes && pes->stream_type != stream_type)
2711  mpegts_set_stream_info(st, pes, stream_type, prog_reg_desc);
2712 
2713  add_pid_to_program(prg, pid);
2714  if (prg) {
2715  prg->streams[i].idx = st->index;
2716  prg->streams[i].stream_identifier = stream_identifier;
2717  prg->nb_streams++;
2718  }
2719 
2720  av_program_add_stream_index(ts->stream, h->id, st->index);
2721 
2722  desc_list_len = get16(&p, p_end);
2723  if (desc_list_len < 0)
2724  goto out;
2725  desc_list_len &= 0xfff;
2726  desc_list_end = p + desc_list_len;
2727  if (desc_list_end > p_end)
2728  goto out;
2729  for (;;) {
2730  if (ff_parse_mpeg2_descriptor(ts->stream, st, stream_type, h->id, &p,
2731  desc_list_end, mp4_descr,
2732  mp4_descr_count, pid, ts) < 0)
2733  break;
2734 
2735  if (pes && prog_reg_desc == AV_RL32("HDMV") &&
2736  stream_type == STREAM_TYPE_BLURAY_AUDIO_TRUEHD && pes->sub_st) {
2738  pes->sub_st->index);
2739  pes->sub_st->codecpar->codec_tag = st->codecpar->codec_tag;
2740  }
2741  }
2742  p = desc_list_end;
2743  }
2744 
2745  if (!ts->pids[pcr_pid])
2746  mpegts_open_pcr_filter(ts, pcr_pid);
2747 
2748 out:
2749  for (i = 0; i < mp4_descr_count; i++)
2750  av_free(mp4_descr[i].dec_config_descr);
2751 }
2752 
2753 static void pat_cb(MpegTSFilter *filter, const uint8_t *section, int section_len)
2754 {
2755  MpegTSContext *ts = filter->u.section_filter.opaque;
2756  MpegTSSectionFilter *tssf = &filter->u.section_filter;
2757  SectionHeader h1, *h = &h1;
2758  const uint8_t *p, *p_end;
2759  int sid, pmt_pid;
2760  int nb_prg = 0;
2761  AVProgram *program;
2762 
2763  av_log(ts->stream, AV_LOG_TRACE, "PAT:\n");
2764  hex_dump_debug(ts->stream, section, section_len);
2765 
2766  p_end = section + section_len - 4;
2767  p = section;
2768  if (parse_section_header(h, &p, p_end) < 0)
2769  return;
2770  if (h->tid != PAT_TID)
2771  return;
2772  if (!h->current_next)
2773  return;
2774  if (ts->skip_changes)
2775  return;
2776 
2777  if (skip_identical(h, tssf))
2778  return;
2779  ts->id = h->id;
2780 
2781  for (;;) {
2782  sid = get16(&p, p_end);
2783  if (sid < 0)
2784  break;
2785  pmt_pid = get16(&p, p_end);
2786  if (pmt_pid < 0)
2787  break;
2788  pmt_pid &= 0x1fff;
2789 
2790  if (pmt_pid == ts->current_pid)
2791  break;
2792 
2793  av_log(ts->stream, AV_LOG_TRACE, "sid=0x%x pid=0x%x\n", sid, pmt_pid);
2794 
2795  if (sid == 0x0000) {
2796  /* NIT info */
2797  } else {
2798  MpegTSFilter *fil = ts->pids[pmt_pid];
2799  struct Program *prg;
2800  program = av_new_program(ts->stream, sid);
2801  if (program) {
2802  program->program_num = sid;
2803  program->pmt_pid = pmt_pid;
2804  }
2805  if (fil)
2806  if ( fil->type != MPEGTS_SECTION
2807  || fil->pid != pmt_pid
2808  || fil->u.section_filter.section_cb != pmt_cb)
2809  mpegts_close_filter(ts, ts->pids[pmt_pid]);
2810 
2811  if (!ts->pids[pmt_pid])
2812  mpegts_open_section_filter(ts, pmt_pid, pmt_cb, ts, 1);
2813  prg = add_program(ts, sid);
2814  if (prg) {
2815  unsigned prg_idx = prg - ts->prg;
2816  if (prg->nb_pids && prg->pids[0] != pmt_pid)
2817  clear_program(prg);
2818  add_pid_to_program(prg, pmt_pid);
2819  if (prg_idx > nb_prg)
2820  FFSWAP(struct Program, ts->prg[nb_prg], ts->prg[prg_idx]);
2821  if (prg_idx >= nb_prg)
2822  nb_prg++;
2823  } else
2824  nb_prg = 0;
2825  }
2826  }
2827  ts->nb_prg = nb_prg;
2828 
2829  if (sid < 0) {
2830  int i,j;
2831  for (j=0; j<ts->stream->nb_programs; j++) {
2832  for (i = 0; i < ts->nb_prg; i++)
2833  if (ts->prg[i].id == ts->stream->programs[j]->id)
2834  break;
2835  if (i==ts->nb_prg && !ts->skip_clear)
2836  clear_avprogram(ts, ts->stream->programs[j]->id);
2837  }
2838  }
2839 }
2840 
2841 static void eit_cb(MpegTSFilter *filter, const uint8_t *section, int section_len)
2842 {
2843  MpegTSContext *ts = filter->u.section_filter.opaque;
2844  const uint8_t *p, *p_end;
2845  SectionHeader h1, *h = &h1;
2846 
2847  /*
2848  * Sometimes we receive EPG packets but SDT table do not have
2849  * eit_pres_following or eit_sched turned on, so we open EPG
2850  * stream directly here.
2851  */
2852  if (!ts->epg_stream) {
2854  if (!ts->epg_stream)
2855  return;
2856  ts->epg_stream->id = EIT_PID;
2859  }
2860 
2861  if (ts->epg_stream->discard == AVDISCARD_ALL)
2862  return;
2863 
2864  p_end = section + section_len - 4;
2865  p = section;
2866 
2867  if (parse_section_header(h, &p, p_end) < 0)
2868  return;
2869  if (h->tid < EIT_TID || h->tid > OEITS_END_TID)
2870  return;
2871 
2872  av_log(ts->stream, AV_LOG_TRACE, "EIT: tid received = %.02x\n", h->tid);
2873 
2874  /**
2875  * Service_id 0xFFFF is reserved, it indicates that the current EIT table
2876  * is scrambled.
2877  */
2878  if (h->id == 0xFFFF) {
2879  av_log(ts->stream, AV_LOG_TRACE, "Scrambled EIT table received.\n");
2880  return;
2881  }
2882 
2883  /**
2884  * In case we receive an EPG packet before mpegts context is fully
2885  * initialized.
2886  */
2887  if (!ts->pkt)
2888  return;
2889 
2890  new_data_packet(section, section_len, ts->pkt);
2891  ts->pkt->stream_index = ts->epg_stream->index;
2892  ts->stop_parse = 1;
2893 }
2894 
2895 static void sdt_cb(MpegTSFilter *filter, const uint8_t *section, int section_len)
2896 {
2897  MpegTSContext *ts = filter->u.section_filter.opaque;
2898  MpegTSSectionFilter *tssf = &filter->u.section_filter;
2899  SectionHeader h1, *h = &h1;
2900  const uint8_t *p, *p_end, *desc_list_end, *desc_end;
2901  int onid, val, sid, desc_list_len, desc_tag, desc_len, service_type;
2902  char *name, *provider_name;
2903 
2904  av_log(ts->stream, AV_LOG_TRACE, "SDT:\n");
2905  hex_dump_debug(ts->stream, section, section_len);
2906 
2907  p_end = section + section_len - 4;
2908  p = section;
2909  if (parse_section_header(h, &p, p_end) < 0)
2910  return;
2911  if (h->tid != SDT_TID)
2912  return;
2913  if (!h->current_next)
2914  return;
2915  if (ts->skip_changes)
2916  return;
2917  if (skip_identical(h, tssf))
2918  return;
2919 
2920  onid = get16(&p, p_end);
2921  if (onid < 0)
2922  return;
2923  val = get8(&p, p_end);
2924  if (val < 0)
2925  return;
2926  for (;;) {
2927  sid = get16(&p, p_end);
2928  if (sid < 0)
2929  break;
2930  val = get8(&p, p_end);
2931  if (val < 0)
2932  break;
2933  desc_list_len = get16(&p, p_end);
2934  if (desc_list_len < 0)
2935  break;
2936  desc_list_len &= 0xfff;
2937  desc_list_end = p + desc_list_len;
2938  if (desc_list_end > p_end)
2939  break;
2940  for (;;) {
2941  desc_tag = get8(&p, desc_list_end);
2942  if (desc_tag < 0)
2943  break;
2944  desc_len = get8(&p, desc_list_end);
2945  desc_end = p + desc_len;
2946  if (desc_len < 0 || desc_end > desc_list_end)
2947  break;
2948 
2949  av_log(ts->stream, AV_LOG_TRACE, "tag: 0x%02x len=%d\n",
2950  desc_tag, desc_len);
2951 
2952  switch (desc_tag) {
2953  case SERVICE_DESCRIPTOR:
2954  service_type = get8(&p, desc_end);
2955  if (service_type < 0)
2956  break;
2957  provider_name = getstr8(&p, desc_end);
2958  if (!provider_name)
2959  break;
2960  name = getstr8(&p, desc_end);
2961  if (name) {
2962  AVProgram *program = av_new_program(ts->stream, sid);
2963  if (program) {
2964  av_dict_set(&program->metadata, "service_name", name, 0);
2965  av_dict_set(&program->metadata, "service_provider",
2966  provider_name, 0);
2967  }
2968  }
2969  av_free(name);
2970  av_free(provider_name);
2971  break;
2972  default:
2973  break;
2974  }
2975  p = desc_end;
2976  }
2977  p = desc_list_end;
2978  }
2979 }
2980 
2981 static int parse_pcr(int64_t *ppcr_high, int *ppcr_low,
2982  const uint8_t *packet);
2983 
2984 /* handle one TS packet */
2985 static int handle_packet(MpegTSContext *ts, const uint8_t *packet, int64_t pos)
2986 {
2987  MpegTSFilter *tss;
2988  int len, pid, cc, expected_cc, cc_ok, afc, is_start, is_discontinuity,
2989  has_adaptation, has_payload;
2990  const uint8_t *p, *p_end;
2991 
2992  pid = AV_RB16(packet + 1) & 0x1fff;
2993  is_start = packet[1] & 0x40;
2994  tss = ts->pids[pid];
2995  if (ts->auto_guess && !tss && is_start) {
2996  add_pes_stream(ts, pid, -1);
2997  tss = ts->pids[pid];
2998  }
2999  if (!tss)
3000  return 0;
3001  if (is_start)
3002  tss->discard = discard_pid(ts, pid);
3003  if (tss->discard)
3004  return 0;
3005  ts->current_pid = pid;
3006 
3007  afc = (packet[3] >> 4) & 3;
3008  if (afc == 0) /* reserved value */
3009  return 0;
3010  has_adaptation = afc & 2;
3011  has_payload = afc & 1;
3012  is_discontinuity = has_adaptation &&
3013  packet[4] != 0 && /* with length > 0 */
3014  (packet[5] & 0x80); /* and discontinuity indicated */
3015 
3016  /* continuity check (currently not used) */
3017  cc = (packet[3] & 0xf);
3018  expected_cc = has_payload ? (tss->last_cc + 1) & 0x0f : tss->last_cc;
3019  cc_ok = pid == NULL_PID ||
3020  is_discontinuity ||
3021  tss->last_cc < 0 ||
3022  expected_cc == cc;
3023 
3024  tss->last_cc = cc;
3025  if (!cc_ok) {
3026  av_log(ts->stream, AV_LOG_DEBUG,
3027  "Continuity check failed for pid %d expected %d got %d\n",
3028  pid, expected_cc, cc);
3029  if (tss->type == MPEGTS_PES) {
3030  PESContext *pc = tss->u.pes_filter.opaque;
3031  pc->flags |= AV_PKT_FLAG_CORRUPT;
3032  }
3033  }
3034 
3035  if (packet[1] & 0x80) {
3036  av_log(ts->stream, AV_LOG_DEBUG, "Packet had TEI flag set; marking as corrupt\n");
3037  if (tss->type == MPEGTS_PES) {
3038  PESContext *pc = tss->u.pes_filter.opaque;
3039  pc->flags |= AV_PKT_FLAG_CORRUPT;
3040  }
3041  }
3042 
3043  p = packet + 4;
3044  if (has_adaptation) {
3045  int64_t pcr_h;
3046  int pcr_l;
3047  if (parse_pcr(&pcr_h, &pcr_l, packet) == 0)
3048  tss->last_pcr = pcr_h * SYSTEM_CLOCK_FREQUENCY_DIVISOR + pcr_l;
3049  /* skip adaptation field */
3050  p += p[0] + 1;
3051  }
3052  /* if past the end of packet, ignore */
3053  p_end = packet + TS_PACKET_SIZE;
3054  if (p >= p_end || !has_payload)
3055  return 0;
3056 
3057  if (pos >= 0) {
3059  ts->pos47_full = pos - TS_PACKET_SIZE;
3060  }
3061 
3062  if (tss->type == MPEGTS_SECTION) {
3063  if (is_start) {
3064  /* pointer field present */
3065  len = *p++;
3066  if (len > p_end - p)
3067  return 0;
3068  if (len && cc_ok) {
3069  /* write remaining section bytes */
3070  write_section_data(ts, tss,
3071  p, len, 0);
3072  /* check whether filter has been closed */
3073  if (!ts->pids[pid])
3074  return 0;
3075  }
3076  p += len;
3077  if (p < p_end) {
3078  write_section_data(ts, tss,
3079  p, p_end - p, 1);
3080  }
3081  } else {
3082  if (cc_ok) {
3083  write_section_data(ts, tss,
3084  p, p_end - p, 0);
3085  }
3086  }
3087 
3088  // stop find_stream_info from waiting for more streams
3089  // when all programs have received a PMT
3090  if (ts->stream->ctx_flags & AVFMTCTX_NOHEADER && ts->scan_all_pmts <= 0) {
3091  int i;
3092  for (i = 0; i < ts->nb_prg; i++) {
3093  if (!ts->prg[i].pmt_found)
3094  break;
3095  }
3096  if (i == ts->nb_prg && ts->nb_prg > 0) {
3097  av_log(ts->stream, AV_LOG_DEBUG, "All programs have pmt, headers found\n");
3099  }
3100  }
3101 
3102  } else {
3103  int ret;
3104  // Note: The position here points actually behind the current packet.
3105  if (tss->type == MPEGTS_PES) {
3106  if ((ret = tss->u.pes_filter.pes_cb(tss, p, p_end - p, is_start,
3107  pos - ts->raw_packet_size)) < 0)
3108  return ret;
3109  }
3110  }
3111 
3112  return 0;
3113 }
3114 
3115 static int mpegts_resync(AVFormatContext *s, int seekback, const uint8_t *current_packet)
3116 {
3117  MpegTSContext *ts = s->priv_data;
3118  AVIOContext *pb = s->pb;
3119  int c, i;
3120  uint64_t pos = avio_tell(pb);
3121  int64_t back = FFMIN(seekback, pos);
3122 
3123  //Special case for files like 01c56b0dc1.ts
3124  if (current_packet[0] == 0x80 && current_packet[12] == SYNC_BYTE && pos >= TS_PACKET_SIZE) {
3125  avio_seek(pb, 12 - TS_PACKET_SIZE, SEEK_CUR);
3126  return 0;
3127  }
3128 
3129  avio_seek(pb, -back, SEEK_CUR);
3130 
3131  for (i = 0; i < ts->resync_size; i++) {
3132  c = avio_r8(pb);
3133  if (avio_feof(pb))
3134  return AVERROR_EOF;
3135  if (c == SYNC_BYTE) {
3136  int new_packet_size, ret;
3137  avio_seek(pb, -1, SEEK_CUR);
3138  pos = avio_tell(pb);
3140  if (ret < 0)
3141  return ret;
3142  new_packet_size = get_packet_size(s);
3143  if (new_packet_size > 0 && new_packet_size != ts->raw_packet_size) {
3144  av_log(ts->stream, AV_LOG_WARNING, "changing packet size to %d\n", new_packet_size);
3145  ts->raw_packet_size = new_packet_size;
3146  }
3147  avio_seek(pb, pos, SEEK_SET);
3148  return 0;
3149  }
3150  }
3152  "max resync size reached, could not find sync byte\n");
3153  /* no sync found */
3154  return AVERROR_INVALIDDATA;
3155 }
3156 
3157 /* return AVERROR_something if error or EOF. Return 0 if OK. */
3158 static int read_packet(AVFormatContext *s, uint8_t *buf, int raw_packet_size,
3159  const uint8_t **data)
3160 {
3161  AVIOContext *pb = s->pb;
3162  int len;
3163 
3164  // 192 bytes source packet that start with a 4 bytes TP_extra_header
3165  // followed by 188 bytes of TS packet. The sync byte is at offset 4, so skip
3166  // the first 4 bytes otherwise we'll end up syncing to the wrong packet.
3167  if (raw_packet_size == TS_DVHS_PACKET_SIZE)
3168  avio_skip(pb, 4);
3169 
3170  for (;;) {
3172  if (len != TS_PACKET_SIZE)
3173  return len < 0 ? len : AVERROR_EOF;
3174  /* check packet sync byte */
3175  if ((*data)[0] != SYNC_BYTE) {
3176  /* find a new packet start */
3177 
3178  if (mpegts_resync(s, raw_packet_size, *data) < 0)
3179  return AVERROR(EAGAIN);
3180  else
3181  continue;
3182  } else {
3183  break;
3184  }
3185  }
3186  return 0;
3187 }
3188 
3189 static void finished_reading_packet(AVFormatContext *s, int raw_packet_size)
3190 {
3191  AVIOContext *pb = s->pb;
3192  int skip;
3193  if (raw_packet_size == TS_DVHS_PACKET_SIZE)
3194  skip = raw_packet_size - TS_DVHS_PACKET_SIZE;
3195  else
3196  skip = raw_packet_size - TS_PACKET_SIZE;
3197  if (skip > 0)
3198  avio_skip(pb, skip);
3199 }
3200 
3201 static int handle_packets(MpegTSContext *ts, int64_t nb_packets)
3202 {
3203  AVFormatContext *s = ts->stream;
3204  uint8_t packet[TS_PACKET_SIZE + AV_INPUT_BUFFER_PADDING_SIZE];
3205  const uint8_t *data;
3206  int64_t packet_num;
3207  int ret = 0;
3208 
3209  if (avio_tell(s->pb) != ts->last_pos) {
3210  int i;
3211  av_log(ts->stream, AV_LOG_TRACE, "Skipping after seek\n");
3212  /* seek detected, flush pes buffer */
3213  for (i = 0; i < NB_PID_MAX; i++) {
3214  if (ts->pids[i]) {
3215  if (ts->pids[i]->type == MPEGTS_PES) {
3216  PESContext *pes = ts->pids[i]->u.pes_filter.opaque;
3217  av_buffer_unref(&pes->buffer);
3218  pes->data_index = 0;
3219  pes->state = MPEGTS_SKIP; /* skip until pes header */
3220  } else if (ts->pids[i]->type == MPEGTS_SECTION) {
3221  ts->pids[i]->u.section_filter.last_ver = -1;
3222  }
3223  ts->pids[i]->last_cc = -1;
3224  ts->pids[i]->last_pcr = -1;
3225  }
3226  }
3227  }
3228 
3229  ts->stop_parse = 0;
3230  packet_num = 0;
3231  memset(packet + TS_PACKET_SIZE, 0, AV_INPUT_BUFFER_PADDING_SIZE);
3232  for (;;) {
3233  packet_num++;
3234  if (nb_packets != 0 && packet_num >= nb_packets ||
3235  ts->stop_parse > 1) {
3236  ret = AVERROR(EAGAIN);
3237  break;
3238  }
3239  if (ts->stop_parse > 0)
3240  break;
3241 
3242  ret = read_packet(s, packet, ts->raw_packet_size, &data);
3243  if (ret != 0)
3244  break;
3245  ret = handle_packet(ts, data, avio_tell(s->pb));
3247  if (ret != 0)
3248  break;
3249  }
3250  ts->last_pos = avio_tell(s->pb);
3251  return ret;
3252 }
3253 
3254 static int mpegts_probe(const AVProbeData *p)
3255 {
3256  const int size = p->buf_size;
3257  int maxscore = 0;
3258  int sumscore = 0;
3259  int i;
3260  int check_count = size / TS_FEC_PACKET_SIZE;
3261 #define CHECK_COUNT 10
3262 #define CHECK_BLOCK 100
3263 
3264  if (!check_count)
3265  return 0;
3266 
3267  for (i = 0; i<check_count; i+=CHECK_BLOCK) {
3268  int left = FFMIN(check_count - i, CHECK_BLOCK);
3269  int score = analyze(p->buf + TS_PACKET_SIZE *i, TS_PACKET_SIZE *left, TS_PACKET_SIZE , 1);
3271  int fec_score = analyze(p->buf + TS_FEC_PACKET_SIZE *i, TS_FEC_PACKET_SIZE *left, TS_FEC_PACKET_SIZE , 1);
3272  score = FFMAX3(score, dvhs_score, fec_score);
3273  sumscore += score;
3274  maxscore = FFMAX(maxscore, score);
3275  }
3276 
3277  sumscore = sumscore * CHECK_COUNT / check_count;
3278  maxscore = maxscore * CHECK_COUNT / CHECK_BLOCK;
3279 
3280  ff_dlog(0, "TS score: %d %d\n", sumscore, maxscore);
3281 
3282  if (check_count > CHECK_COUNT && sumscore > 6) {
3283  return AVPROBE_SCORE_MAX + sumscore - CHECK_COUNT;
3284  } else if (check_count >= CHECK_COUNT && sumscore > 6) {
3285  return AVPROBE_SCORE_MAX/2 + sumscore - CHECK_COUNT;
3286  } else if (check_count >= CHECK_COUNT && maxscore > 6) {
3287  return AVPROBE_SCORE_MAX/2 + sumscore - CHECK_COUNT;
3288  } else if (sumscore > 6) {
3289  return 2;
3290  } else {
3291  return 0;
3292  }
3293 }
3294 
3295 /* return the 90kHz PCR and the extension for the 27MHz PCR. return
3296  * (-1) if not available */
3297 static int parse_pcr(int64_t *ppcr_high, int *ppcr_low, const uint8_t *packet)
3298 {
3299  int afc, len, flags;
3300  const uint8_t *p;
3301  unsigned int v;
3302 
3303  afc = (packet[3] >> 4) & 3;
3304  if (afc <= 1)
3305  return AVERROR_INVALIDDATA;
3306  p = packet + 4;
3307  len = p[0];
3308  p++;
3309  if (len == 0)
3310  return AVERROR_INVALIDDATA;
3311  flags = *p++;
3312  len--;
3313  if (!(flags & 0x10))
3314  return AVERROR_INVALIDDATA;
3315  if (len < 6)
3316  return AVERROR_INVALIDDATA;
3317  v = AV_RB32(p);
3318  *ppcr_high = ((int64_t) v << 1) | (p[4] >> 7);
3319  *ppcr_low = ((p[4] & 1) << 8) | p[5];
3320  return 0;
3321 }
3322 
3324 
3325  /* NOTE: We attempt to seek on non-seekable files as well, as the
3326  * probe buffer usually is big enough. Only warn if the seek failed
3327  * on files where the seek should work. */
3328  if (avio_seek(pb, pos, SEEK_SET) < 0)
3329  av_log(s, (pb->seekable & AVIO_SEEKABLE_NORMAL) ? AV_LOG_ERROR : AV_LOG_INFO, "Unable to seek back to the start\n");
3330 }
3331 
3333 {
3334  MpegTSContext *ts = s->priv_data;
3335  AVIOContext *pb = s->pb;
3336  int64_t pos, probesize = s->probesize;
3337  int64_t seekback = FFMAX(s->probesize, (int64_t)ts->resync_size + PROBE_PACKET_MAX_BUF);
3338 
3339  if (ffio_ensure_seekback(pb, seekback) < 0)
3340  av_log(s, AV_LOG_WARNING, "Failed to allocate buffers for seekback\n");
3341 
3342  pos = avio_tell(pb);
3344  if (ts->raw_packet_size <= 0) {
3345  av_log(s, AV_LOG_WARNING, "Could not detect TS packet size, defaulting to non-FEC/DVHS\n");
3347  }
3348  ts->stream = s;
3349  ts->auto_guess = 0;
3350 
3351  if (s->iformat == &ff_mpegts_demuxer.p) {
3352  /* normal demux */
3353 
3354  /* first do a scan to get all the services */
3355  seek_back(s, pb, pos);
3356 
3360 
3361  handle_packets(ts, probesize / ts->raw_packet_size);
3362  /* if could not find service, enable auto_guess */
3363 
3364  ts->auto_guess = 1;
3365 
3366  av_log(ts->stream, AV_LOG_TRACE, "tuning done\n");
3367 
3368  s->ctx_flags |= AVFMTCTX_NOHEADER;
3369  } else {
3370  AVStream *st;
3371  int pcr_pid, pid, nb_packets, nb_pcrs, ret, pcr_l;
3372  int64_t pcrs[2], pcr_h;
3373  uint8_t packet[TS_PACKET_SIZE];
3374  const uint8_t *data;
3375 
3376  /* only read packets */
3377 
3378  st = avformat_new_stream(s, NULL);
3379  if (!st)
3380  return AVERROR(ENOMEM);
3381  avpriv_set_pts_info(st, 60, 1, 27000000);
3384 
3385  /* we iterate until we find two PCRs to estimate the bitrate */
3386  pcr_pid = -1;
3387  nb_pcrs = 0;
3388  nb_packets = 0;
3389  for (;;) {
3390  ret = read_packet(s, packet, ts->raw_packet_size, &data);
3391  if (ret < 0)
3392  return ret;
3393  pid = AV_RB16(data + 1) & 0x1fff;
3394  if ((pcr_pid == -1 || pcr_pid == pid) &&
3395  parse_pcr(&pcr_h, &pcr_l, data) == 0) {
3397  pcr_pid = pid;
3398  pcrs[nb_pcrs] = pcr_h * SYSTEM_CLOCK_FREQUENCY_DIVISOR + pcr_l;
3399  nb_pcrs++;
3400  if (nb_pcrs >= 2) {
3401  if (pcrs[1] - pcrs[0] > 0) {
3402  /* the difference needs to be positive to make sense for bitrate computation */
3403  break;
3404  } else {
3405  av_log(ts->stream, AV_LOG_WARNING, "invalid pcr pair %"PRId64" >= %"PRId64"\n", pcrs[0], pcrs[1]);
3406  pcrs[0] = pcrs[1];
3407  nb_pcrs--;
3408  }
3409  }
3410  } else {
3412  }
3413  nb_packets++;
3414  }
3415 
3416  /* NOTE1: the bitrate is computed without the FEC */
3417  /* NOTE2: it is only the bitrate of the start of the stream */
3418  ts->pcr_incr = pcrs[1] - pcrs[0];
3419  ts->cur_pcr = pcrs[0] - ts->pcr_incr * (nb_packets - 1);
3420  s->bit_rate = TS_PACKET_SIZE * 8 * 27000000LL / ts->pcr_incr;
3421  st->codecpar->bit_rate = s->bit_rate;
3422  st->start_time = ts->cur_pcr;
3423  av_log(ts->stream, AV_LOG_TRACE, "start=%0.3f pcr=%0.3f incr=%"PRId64"\n",
3424  st->start_time / 1000000.0, pcrs[0] / 27e6, ts->pcr_incr);
3425  }
3426 
3427  seek_back(s, pb, pos);
3428  return 0;
3429 }
3430 
3431 #define MAX_PACKET_READAHEAD ((128 * 1024) / 188)
3432 
3434 {
3435  MpegTSContext *ts = s->priv_data;
3436  int ret, i;
3437  int64_t pcr_h, next_pcr_h, pos;
3438  int pcr_l, next_pcr_l;
3439  uint8_t pcr_buf[12];
3440  const uint8_t *data;
3441 
3442  if ((ret = av_new_packet(pkt, TS_PACKET_SIZE)) < 0)
3443  return ret;
3445  pkt->pos = avio_tell(s->pb);
3446  if (ret < 0) {
3447  return ret;
3448  }
3449  if (data != pkt->data)
3450  memcpy(pkt->data, data, TS_PACKET_SIZE);
3452  if (ts->mpeg2ts_compute_pcr) {
3453  /* compute exact PCR for each packet */
3454  if (parse_pcr(&pcr_h, &pcr_l, pkt->data) == 0) {
3455  /* we read the next PCR (XXX: optimize it by using a bigger buffer */
3456  pos = avio_tell(s->pb);
3457  for (i = 0; i < MAX_PACKET_READAHEAD; i++) {
3458  avio_seek(s->pb, pos + i * ts->raw_packet_size, SEEK_SET);
3459  avio_read(s->pb, pcr_buf, 12);
3460  if (parse_pcr(&next_pcr_h, &next_pcr_l, pcr_buf) == 0) {
3461  /* XXX: not precise enough */
3462  ts->pcr_incr =
3463  ((next_pcr_h - pcr_h) * SYSTEM_CLOCK_FREQUENCY_DIVISOR + (next_pcr_l - pcr_l)) /
3464  (i + 1);
3465  break;
3466  }
3467  }
3468  avio_seek(s->pb, pos, SEEK_SET);
3469  /* no next PCR found: we use previous increment */
3470  ts->cur_pcr = pcr_h * SYSTEM_CLOCK_FREQUENCY_DIVISOR + pcr_l;
3471  }
3472  pkt->pts = ts->cur_pcr;
3473  pkt->duration = ts->pcr_incr;
3474  ts->cur_pcr += ts->pcr_incr;
3475  }
3476  pkt->stream_index = 0;
3477  return 0;
3478 }
3479 
3481 {
3482  MpegTSContext *ts = s->priv_data;
3483  int ret, i;
3484 
3485  pkt->size = -1;
3486  ts->pkt = pkt;
3487  ret = handle_packets(ts, 0);
3488  if (ret < 0) {
3489  av_packet_unref(ts->pkt);
3490  /* flush pes data left */
3491  for (i = 0; i < NB_PID_MAX; i++)
3492  if (ts->pids[i] && ts->pids[i]->type == MPEGTS_PES) {
3493  PESContext *pes = ts->pids[i]->u.pes_filter.opaque;
3494  if (pes->state == MPEGTS_PAYLOAD && pes->data_index > 0) {
3495  ret = new_pes_packet(pes, pkt);
3496  if (ret < 0)
3497  return ret;
3498  pes->state = MPEGTS_SKIP;
3499  ret = 0;
3500  break;
3501  }
3502  }
3503  }
3504 
3505  if (!ret && pkt->size < 0)
3507  return ret;
3508 }
3509 
3510 static void mpegts_free(MpegTSContext *ts)
3511 {
3512  int i;
3513 
3514  clear_programs(ts);
3515 
3516  for (i = 0; i < FF_ARRAY_ELEMS(ts->pools); i++)
3517  av_buffer_pool_uninit(&ts->pools[i]);
3518 
3519  for (i = 0; i < NB_PID_MAX; i++)
3520  if (ts->pids[i])
3521  mpegts_close_filter(ts, ts->pids[i]);
3522 }
3523 
3525 {
3526  MpegTSContext *ts = s->priv_data;
3527  mpegts_free(ts);
3528  return 0;
3529 }
3530 
3532  int64_t *ppos, int64_t pos_limit)
3533 {
3534  MpegTSContext *ts = s->priv_data;
3535  int64_t pos, timestamp;
3536  uint8_t buf[TS_PACKET_SIZE];
3537  int pcr_l, pcr_pid =
3538  ((PESContext *)s->streams[stream_index]->priv_data)->pcr_pid;
3539  int pos47 = ts->pos47_full % ts->raw_packet_size;
3540  pos =
3541  ((*ppos + ts->raw_packet_size - 1 - pos47) / ts->raw_packet_size) *
3542  ts->raw_packet_size + pos47;
3543  while(pos < pos_limit) {
3544  if (avio_seek(s->pb, pos, SEEK_SET) < 0)
3545  return AV_NOPTS_VALUE;
3546  if (avio_read(s->pb, buf, TS_PACKET_SIZE) != TS_PACKET_SIZE)
3547  return AV_NOPTS_VALUE;
3548  if (buf[0] != SYNC_BYTE) {
3549  if (mpegts_resync(s, TS_PACKET_SIZE, buf) < 0)
3550  return AV_NOPTS_VALUE;
3551  pos = avio_tell(s->pb);
3552  continue;
3553  }
3554  if ((pcr_pid < 0 || (AV_RB16(buf + 1) & 0x1fff) == pcr_pid) &&
3555  parse_pcr(&timestamp, &pcr_l, buf) == 0) {
3556  *ppos = pos;
3557  return timestamp;
3558  }
3559  pos += ts->raw_packet_size;
3560  }
3561 
3562  return AV_NOPTS_VALUE;
3563 }
3564 
3565 static int64_t mpegts_get_dts(AVFormatContext *s, int stream_index,
3566  int64_t *ppos, int64_t pos_limit)
3567 {
3568  MpegTSContext *ts = s->priv_data;
3569  AVPacket *pkt;
3570  int64_t pos;
3571  int pos47 = ts->pos47_full % ts->raw_packet_size;
3572  pos = ((*ppos + ts->raw_packet_size - 1 - pos47) / ts->raw_packet_size) * ts->raw_packet_size + pos47;
3574  if (avio_seek(s->pb, pos, SEEK_SET) < 0)
3575  return AV_NOPTS_VALUE;
3576  pkt = av_packet_alloc();
3577  if (!pkt)
3578  return AV_NOPTS_VALUE;
3579  while(pos < pos_limit) {
3580  int ret = av_read_frame(s, pkt);
3581  if (ret < 0) {
3582  av_packet_free(&pkt);
3583  return AV_NOPTS_VALUE;
3584  }
3585  if (pkt->dts != AV_NOPTS_VALUE && pkt->pos >= 0) {
3587  av_add_index_entry(s->streams[pkt->stream_index], pkt->pos, pkt->dts, 0, 0, AVINDEX_KEYFRAME /* FIXME keyframe? */);
3588  if (pkt->stream_index == stream_index && pkt->pos >= *ppos) {
3589  int64_t dts = pkt->dts;
3590  *ppos = pkt->pos;
3591  av_packet_free(&pkt);
3592  return dts;
3593  }
3594  }
3595  pos = pkt->pos;
3597  }
3598 
3599  av_packet_free(&pkt);
3600  return AV_NOPTS_VALUE;
3601 }
3602 
3603 /**************************************************************/
3604 /* parsing functions - called from other demuxers such as RTP */
3605 
3607 {
3608  MpegTSContext *ts;
3609 
3610  ts = av_mallocz(sizeof(MpegTSContext));
3611  if (!ts)
3612  return NULL;
3613  /* no stream case, currently used by RTP */
3615  ts->max_packet_size = 2048000;
3616  ts->stream = s;
3617  ts->auto_guess = 1;
3618 
3622 
3623  return ts;
3624 }
3625 
3626 /* return the consumed length if a packet was output, or -1 if no
3627  * packet is output */
3629  const uint8_t *buf, int len)
3630 {
3631  int len1;
3632 
3633  len1 = len;
3634  ts->pkt = pkt;
3635  for (;;) {
3636  ts->stop_parse = 0;
3637  if (len < TS_PACKET_SIZE)
3638  return AVERROR_INVALIDDATA;
3639  if (buf[0] != SYNC_BYTE) {
3640  buf++;
3641  len--;
3642  } else {
3643  handle_packet(ts, buf, len1 - len + TS_PACKET_SIZE);
3644  buf += TS_PACKET_SIZE;
3645  len -= TS_PACKET_SIZE;
3646  if (ts->stop_parse == 1)
3647  break;
3648  }
3649  }
3650  return len1 - len;
3651 }
3652 
3654 {
3655  mpegts_free(ts);
3656  av_free(ts);
3657 }
3658 
3660  .p.name = "mpegts",
3661  .p.long_name = NULL_IF_CONFIG_SMALL("MPEG-TS (MPEG-2 Transport Stream)"),
3662  .p.flags = AVFMT_SHOW_IDS | AVFMT_TS_DISCONT,
3663  .p.priv_class = &mpegts_class,
3664  .priv_data_size = sizeof(MpegTSContext),
3670  .flags_internal = FF_INFMT_FLAG_PREFER_CODEC_FRAMERATE,
3671 };
3672 
3674  .p.name = "mpegtsraw",
3675  .p.long_name = NULL_IF_CONFIG_SMALL("raw MPEG-TS (MPEG-2 Transport Stream)"),
3676  .p.flags = AVFMT_SHOW_IDS | AVFMT_TS_DISCONT,
3677  .p.priv_class = &mpegtsraw_class,
3678  .priv_data_size = sizeof(MpegTSContext),
3683  .flags_internal = FF_INFMT_FLAG_PREFER_CODEC_FRAMERATE,
3684 };
parse_MP4DecConfigDescrTag
static int parse_MP4DecConfigDescrTag(MP4DescrParseContext *d, int64_t off, int len)
Definition: mpegts.c:1581
flags
const SwsFlags flags[]
Definition: swscale.c:71
mpegts_set_stream_info
static int mpegts_set_stream_info(AVStream *st, PESContext *pes, uint32_t stream_type, uint32_t prog_reg_desc)
Definition: mpegts.c:920
av_packet_unref
void av_packet_unref(AVPacket *pkt)
Wipe the packet.
Definition: packet.c:432
parse_mp4_descr_arr
static int parse_mp4_descr_arr(MP4DescrParseContext *d, int64_t off, int len)
Definition: mpegts.c:1521
new_pes_packet
static int new_pes_packet(PESContext *pes, AVPacket *pkt)
Definition: mpegts.c:1017
AVMEDIA_TYPE_SUBTITLE
@ AVMEDIA_TYPE_SUBTITLE
Definition: avutil.h:203
av_buffer_pool_init
AVBufferPool * av_buffer_pool_init(size_t size, AVBufferRef *(*alloc)(size_t size))
Allocate and initialize a buffer pool.
Definition: buffer.c:283
skip_bits_long
static void skip_bits_long(GetBitContext *s, int n)
Skips the specified number of bits.
Definition: get_bits.h:280
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:216
StreamType::stream_type
uint32_t stream_type
Definition: mpegts.c:796
AVCodecParameters::extradata
uint8_t * extradata
Extra binary data needed for initializing the decoder, codec-dependent.
Definition: codec_par.h:69
MP4DescrParseContext::descr_count
int descr_count
Definition: mpegts.c:1486
name
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf default minimum maximum flags name is the option name
Definition: writing_filters.txt:88
MP4DecConfigDescrTag
#define MP4DecConfigDescrTag
Definition: isom.h:399
AVStreamGroup::id
int64_t id
Group type-specific group ID.
Definition: avformat.h:1116
AV_CODEC_ID_AC3
@ AV_CODEC_ID_AC3
Definition: codec_id.h:463
program
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C program
Definition: undefined.txt:6
MPEGTS_PESHEADER_FILL
@ MPEGTS_PESHEADER_FILL
Definition: mpegts.c:244
MpegTSFilter::discard
int discard
Definition: mpegts.c:104
Program::nb_streams
unsigned int nb_streams
Definition: mpegts.c:123
get_bits_left
static int get_bits_left(GetBitContext *gb)
Definition: get_bits.h:688
r
const char * r
Definition: vf_curves.c:127
AVERROR
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
opt.h
MAX_LEVEL
#define MAX_LEVEL
Definition: mpegts.c:1480
SYSTEM_CLOCK_FREQUENCY_DIVISOR
#define SYSTEM_CLOCK_FREQUENCY_DIVISOR
Definition: mpegts.h:38
AV_CODEC_ID_PCM_BLURAY
@ AV_CODEC_ID_PCM_BLURAY
Definition: codec_id.h:362
PAT_PID
#define PAT_PID
Definition: mpegts.h:41
AVCodecParameters::codec_type
enum AVMediaType codec_type
General type of the encoded data.
Definition: codec_par.h:51
AVFMT_SHOW_IDS
#define AVFMT_SHOW_IDS
Show format stream IDs numbers.
Definition: avformat.h:476
AV_WL32
#define AV_WL32(p, v)
Definition: intreadwrite.h:422
mpegts.h
AV_STREAM_GROUP_PARAMS_LCEVC
@ AV_STREAM_GROUP_PARAMS_LCEVC
Definition: avformat.h:1091
AVProgram::nb_stream_indexes
unsigned int nb_stream_indexes
Definition: avformat.h:1192
ff_mp4_read_dec_config_descr
int ff_mp4_read_dec_config_descr(void *logctx, AVStream *st, AVIOContext *pb)
Definition: isom.c:329
out
static FILE * out
Definition: movenc.c:55
STREAM_TYPE_AUDIO_AAC
#define STREAM_TYPE_AUDIO_AAC
Definition: mpeg.h:55
ff_parse_pes_pts
static int64_t ff_parse_pes_pts(const uint8_t *buf)
Parse MPEG-PES five-byte timestamp.
Definition: mpeg.h:69
TS_DVHS_PACKET_SIZE
#define TS_DVHS_PACKET_SIZE
Definition: mpegts.h:28
pmt_cb
static void pmt_cb(MpegTSFilter *filter, const uint8_t *section, int section_len)
Definition: mpegts.c:2532
AVBufferPool
The buffer pool.
Definition: buffer_internal.h:88
MpegTSFilter::pid
int pid
Definition: mpegts.c:100
ffio_read_indirect
int ffio_read_indirect(AVIOContext *s, unsigned char *buf, int size, const unsigned char **data)
Read size bytes from AVIOContext, returning a pointer.
Definition: aviobuf.c:675
STREAM_TYPE_VIDEO_VC1
#define STREAM_TYPE_VIDEO_VC1
Definition: mpegts.h:153
STREAM_TYPE_PRIVATE_DATA
#define STREAM_TYPE_PRIVATE_DATA
Definition: mpeg.h:54
AVCodecParameters::color_space
enum AVColorSpace color_space
Definition: codec_par.h:169
PESContext::flags
int flags
copied to the AVPacket flags
Definition: mpegts.c:265
avformat_new_stream
AVStream * avformat_new_stream(AVFormatContext *s, const struct AVCodec *c)
Add a new stream to a media file.
AVStream::priv_data
void * priv_data
Definition: avformat.h:769
AVERROR_EOF
#define AVERROR_EOF
End of file.
Definition: error.h:57
avpriv_mpegts_parse_packet
int avpriv_mpegts_parse_packet(MpegTSContext *ts, AVPacket *pkt, const uint8_t *buf, int len)
Definition: mpegts.c:3628
AVBufferRef::data
uint8_t * data
The data buffer.
Definition: buffer.h:90
opus_default_extradata
static const uint8_t opus_default_extradata[30]
Definition: opus.h:35
avcodec_get_type
enum AVMediaType avcodec_get_type(enum AVCodecID codec_id)
Get the type of the given codec.
Definition: codec_desc.c:3913
AVStream::discard
enum AVDiscard discard
Selects which packets can be discarded at will and do not need to be demuxed.
Definition: avformat.h:815
AV_FIELD_PROGRESSIVE
@ AV_FIELD_PROGRESSIVE
Definition: defs.h:213
av_find_program_from_stream
AVProgram * av_find_program_from_stream(AVFormatContext *ic, AVProgram *last, int s)
Find the programs which belong to a given stream.
Definition: avformat.c:329
STREAM_ID_EMM_STREAM
#define STREAM_ID_EMM_STREAM
Definition: mpegts.h:191
mpegts_close_filter
static void mpegts_close_filter(MpegTSContext *ts, MpegTSFilter *filter)
Definition: mpegts.c:562
STREAM_ID_PADDING_STREAM
#define STREAM_ID_PADDING_STREAM
Definition: mpegts.h:186
AV_CODEC_ID_DIRAC
@ AV_CODEC_ID_DIRAC
Definition: codec_id.h:168
int64_t
long long int64_t
Definition: coverity.c:34
STREAM_ID_PROGRAM_STREAM_MAP
#define STREAM_ID_PROGRAM_STREAM_MAP
Definition: mpegts.h:184
SLConfigDescr::au_seq_num_len
int au_seq_num_len
Definition: mpegts.h:258
Program::pmt_found
int pmt_found
have we found pmt for this program
Definition: mpegts.c:127
get_bits_count
static int get_bits_count(const GetBitContext *s)
Definition: get_bits.h:254
PESContext::dts
int64_t dts
Definition: mpegts.c:270
METADATA_types
static const StreamType METADATA_types[]
Definition: mpegts.c:886
av_unused
#define av_unused
Definition: attributes.h:156
MP4DescrParseContext::max_descr_count
int max_descr_count
Definition: mpegts.c:1487
Stream::stream_identifier
int stream_identifier
Definition: mpegts.c:114
AV_CODEC_ID_MPEG4
@ AV_CODEC_ID_MPEG4
Definition: codec_id.h:64
MpegTSContext::skip_changes
int skip_changes
Definition: mpegts.c:159
STREAM_TYPE_AUDIO_MPEG1
#define STREAM_TYPE_AUDIO_MPEG1
Definition: mpeg.h:51
AVFormatContext::streams
AVStream ** streams
A list of all streams in the file.
Definition: avformat.h:1331
AVCOL_RANGE_JPEG
@ AVCOL_RANGE_JPEG
Full range content.
Definition: pixfmt.h:777
mpegts_find_stream_type
static void mpegts_find_stream_type(AVStream *st, uint32_t stream_type, const StreamType *types)
Definition: mpegts.c:902
STREAM_TYPE_VIDEO_VVC
#define STREAM_TYPE_VIDEO_VVC
Definition: mpeg.h:59
MpegTSContext::auto_guess
int auto_guess
if true, all pids are analyzed to find streams
Definition: mpegts.c:140
AVPacket::data
uint8_t * data
Definition: packet.h:588
AV_CODEC_ID_DVB_TELETEXT
@ AV_CODEC_ID_DVB_TELETEXT
Definition: codec_id.h:579
clear_avprogram
static void clear_avprogram(MpegTSContext *ts, unsigned int programid)
Definition: mpegts.c:291
CHECK_BLOCK
#define CHECK_BLOCK
AVOption
AVOption.
Definition: opt.h:429
NULL_PID
#define NULL_PID
Definition: mpegts.h:70
MpegTSSectionFilter
Definition: mpegts.c:86
MPEGTS_SECTION
@ MPEGTS_SECTION
Definition: mpegts.c:68
getstr8
static char * getstr8(const uint8_t **pp, const uint8_t *p_end)
Definition: mpegts.c:698
MpegTSSectionFilter::section_h_size
int section_h_size
Definition: mpegts.c:88
AV_CODEC_ID_AVS2
@ AV_CODEC_ID_AVS2
Definition: codec_id.h:248
data
const char data[16]
Definition: mxf.c:149
opus.h
MpegTSFilter::section_filter
MpegTSSectionFilter section_filter
Definition: mpegts.c:108
HLS_SAMPLE_ENC_types
static const StreamType HLS_SAMPLE_ENC_types[]
Definition: mpegts.c:859
MpegTSState
MpegTSState
Definition: mpegts.c:241
MP4SLDescrTag
#define MP4SLDescrTag
Definition: isom.h:401
DVB_EXTENSION_DESCRIPTOR
#define DVB_EXTENSION_DESCRIPTOR
Definition: mpegts.h:226
AVCodecParameters::framerate
AVRational framerate
Video only.
Definition: codec_par.h:156
AV_LOG_VERBOSE
#define AV_LOG_VERBOSE
Detailed information.
Definition: log.h:226
MP4DescrParseContext::s
AVFormatContext * s
Definition: mpegts.c:1482
filter
void(* filter)(uint8_t *src, int stride, int qscale)
Definition: h263dsp.c:29
buffer_pool_get
static AVBufferRef * buffer_pool_get(MpegTSContext *ts, int size)
Definition: mpegts.c:1152
PES_HEADER_SIZE
#define PES_HEADER_SIZE
Definition: mpegts.c:251
AVFormatContext::programs
AVProgram ** programs
Definition: avformat.h:1461
AVPacket::duration
int64_t duration
Duration of this packet in AVStream->time_base units, 0 if unknown.
Definition: packet.h:606
AVCodecParameters::codec_tag
uint32_t codec_tag
Additional information about the codec (corresponds to the AVI FOURCC).
Definition: codec_par.h:59
DOVI_VIDEO_STREAM_DESCRIPTOR
#define DOVI_VIDEO_STREAM_DESCRIPTOR
see "Dolby Vision Streams Within the MPEG-2 Transport Stream Format" https://professional....
Definition: mpegts.h:234
ffio_init_read_context
void ffio_init_read_context(FFIOContext *s, const uint8_t *buffer, int buffer_size)
Wrap a buffer in an AVIOContext for reading.
Definition: aviobuf.c:99
FFMAX
#define FFMAX(a, b)
Definition: macros.h:47
SetServiceCallback
void SetServiceCallback(void *opaque, int ret)
Definition: mpegts.c:84
av_read_frame
int av_read_frame(AVFormatContext *s, AVPacket *pkt)
Return the next frame of a stream.
Definition: demux.c:1588
AV_PROFILE_ARIB_PROFILE_C
#define AV_PROFILE_ARIB_PROFILE_C
Definition: defs.h:192
Stream::idx
int idx
Definition: mpegts.c:113
AV_CODEC_ID_HDMV_PGS_SUBTITLE
@ AV_CODEC_ID_HDMV_PGS_SUBTITLE
Definition: codec_id.h:578
ff_read_frame_flush
void ff_read_frame_flush(AVFormatContext *s)
Flush the frame reader.
Definition: seek.c:716
add_pid_to_program
static void add_pid_to_program(struct Program *p, unsigned int pid)
Definition: mpegts.c:337
PESContext::pts
int64_t pts
Definition: mpegts.c:270
AV_CODEC_ID_TRUEHD
@ AV_CODEC_ID_TRUEHD
Definition: codec_id.h:504
FFIOContext
Definition: avio_internal.h:28
init_get_bits
static int init_get_bits(GetBitContext *s, const uint8_t *buffer, int bit_size)
Initialize GetBitContext.
Definition: get_bits.h:517
STREAM_TYPE_VIDEO_JPEGXS
#define STREAM_TYPE_VIDEO_JPEGXS
Definition: mpegts.h:147
av_packet_free
void av_packet_free(AVPacket **pkt)
Free the packet, if the packet is reference counted, it will be unreferenced first.
Definition: packet.c:74
MpegTSContext::nb_prg
unsigned int nb_prg
structure to keep track of Program->pids mapping
Definition: mpegts.c:175
MpegTSPESFilter::pes_cb
PESCallback * pes_cb
Definition: mpegts.c:78
ENHANCED_AC3_DESCRIPTOR
#define ENHANCED_AC3_DESCRIPTOR
Definition: mpegts.h:224
Program::streams
struct Stream streams[MAX_STREAMS_PER_PROGRAM]
Definition: mpegts.c:124
AV_CODEC_ID_BIN_DATA
@ AV_CODEC_ID_BIN_DATA
Definition: codec_id.h:613
STREAM_TYPE_AUDIO_MPEG2
#define STREAM_TYPE_AUDIO_MPEG2
Definition: mpeg.h:52
PESContext::pcr_pid
int pcr_pid
if -1 then all packets containing PCR are considered
Definition: mpegts.c:256
AVINDEX_KEYFRAME
#define AVINDEX_KEYFRAME
Definition: avformat.h:606
SectionHeader::id
uint16_t id
Definition: mpegts.c:652
av_memdup
void * av_memdup(const void *p, size_t size)
Duplicate a buffer with av_malloc().
Definition: mem.c:304
SLConfigDescr::use_idle
int use_idle
Definition: mpegts.h:251
AV_PKT_DATA_DOVI_CONF
@ AV_PKT_DATA_DOVI_CONF
DOVI configuration ref: dolby-vision-bitstreams-within-the-iso-base-media-file-format-v2....
Definition: packet.h:280
crc.h
skip_bits
static void skip_bits(GetBitContext *s, int n)
Definition: get_bits.h:383
AVCodecParameters::color_primaries
enum AVColorPrimaries color_primaries
Definition: codec_par.h:167
AVPROBE_SCORE_MAX
#define AVPROBE_SCORE_MAX
maximum score
Definition: avformat.h:463
PROBE_PACKET_MAX_BUF
#define PROBE_PACKET_MAX_BUF
Definition: mpegts.c:63
mpegtsraw_class
static const AVClass mpegtsraw_class
Definition: mpegts.c:232
AV_PROFILE_ARIB_PROFILE_A
#define AV_PROFILE_ARIB_PROFILE_A
Definition: defs.h:191
get_bits
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
Definition: get_bits.h:337
AV_FIELD_TT
@ AV_FIELD_TT
Top coded_first, top displayed first.
Definition: defs.h:214
PESContext::state
enum MpegTSState state
Definition: mpegts.c:262
MpegTSFilter::pes_filter
MpegTSPESFilter pes_filter
Definition: mpegts.c:107
STREAM_TYPE_HLS_SE_AUDIO_AC3
#define STREAM_TYPE_HLS_SE_AUDIO_AC3
Definition: mpegts.h:179
METADATA_DESCRIPTOR
#define METADATA_DESCRIPTOR
Definition: mpegts.h:205
SLConfigDescr::inst_bitrate_len
int inst_bitrate_len
Definition: mpegts.h:256
avpriv_set_pts_info
void avpriv_set_pts_info(AVStream *st, int pts_wrap_bits, unsigned int pts_num, unsigned int pts_den)
Set the time base and wrapping info for a given stream.
Definition: avformat.c:781
REGISTRATION_DESCRIPTOR
#define REGISTRATION_DESCRIPTOR
Definition: mpegts.h:200
mpegts_read_close
static int mpegts_read_close(AVFormatContext *s)
Definition: mpegts.c:3524
mpegts_raw_read_packet
static int mpegts_raw_read_packet(AVFormatContext *s, AVPacket *pkt)
Definition: mpegts.c:3433
find_matching_stream
static AVStream * find_matching_stream(MpegTSContext *ts, int pid, unsigned int programid, int stream_identifier, int pmt_stream_idx, struct Program *p)
Definition: mpegts.c:2454
update_av_program_info
static void update_av_program_info(AVFormatContext *s, unsigned int programid, unsigned int pid, int version)
Definition: mpegts.c:353
ffstream
static av_always_inline FFStream * ffstream(AVStream *st)
Definition: internal.h:362
MP4ODescrTag
#define MP4ODescrTag
Definition: isom.h:396
PESCallback
int PESCallback(MpegTSFilter *f, const uint8_t *buf, int len, int is_start, int64_t pos)
Definition: mpegts.c:74
VIDEO_STREAM_DESCRIPTOR
#define VIDEO_STREAM_DESCRIPTOR
Definition: mpegts.h:199
STREAM_TYPE_VIDEO_AVS2
#define STREAM_TYPE_VIDEO_AVS2
Definition: mpegts.h:151
STREAM_TYPE_VIDEO_AVS3
#define STREAM_TYPE_VIDEO_AVS3
Definition: mpegts.h:152
STREAM_ID_DSMCC_STREAM
#define STREAM_ID_DSMCC_STREAM
Definition: mpegts.h:192
av_add_index_entry
int av_add_index_entry(AVStream *st, int64_t pos, int64_t timestamp, int size, int distance, int flags)
Add an index entry into a sorted list.
Definition: seek.c:122
pat_cb
static void pat_cb(MpegTSFilter *filter, const uint8_t *section, int section_len)
Definition: mpegts.c:2753
GetBitContext
Definition: get_bits.h:109
Program::nb_pids
unsigned int nb_pids
Definition: mpegts.c:121
AVDOVIDecoderConfigurationRecord::dv_md_compression
uint8_t dv_md_compression
Definition: dovi_meta.h:64
SLConfigDescr::use_padding
int use_padding
Definition: mpegts.h:249
mp4_read_iods
static int mp4_read_iods(AVFormatContext *s, const uint8_t *buf, unsigned size, Mp4Descr *descr, int *descr_count, int max_descr_count)
Definition: mpegts.c:1692
AVProgram::discard
enum AVDiscard discard
selects which program to discard and which to feed to the caller
Definition: avformat.h:1190
read_close
static av_cold int read_close(AVFormatContext *ctx)
Definition: libcdio.c:143
STREAM_TYPE_ATSC_AUDIO_EAC3
#define STREAM_TYPE_ATSC_AUDIO_EAC3
Definition: mpegts.h:172
AV_DISPOSITION_STILL_IMAGE
#define AV_DISPOSITION_STILL_IMAGE
The video stream contains still images.
Definition: avformat.h:709
avio_tell
static av_always_inline int64_t avio_tell(AVIOContext *s)
ftell() equivalent for AVIOContext.
Definition: avio.h:494
SectionHeader::last_sec_num
uint8_t last_sec_num
Definition: mpegts.c:656
val
static double val(void *priv, double ch)
Definition: aeval.c:77
EIT_TID
#define EIT_TID
Definition: mpegts.h:99
type
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf type
Definition: writing_filters.txt:86
MP4IODescrTag
#define MP4IODescrTag
Definition: isom.h:397
STREAM_TYPE_HLS_SE_AUDIO_EAC3
#define STREAM_TYPE_HLS_SE_AUDIO_EAC3
Definition: mpegts.h:180
PESContext::sl
SLConfigDescr sl
Definition: mpegts.c:274
SLConfigDescr::use_rand_acc_pt
int use_rand_acc_pt
Definition: mpegts.h:248
SDT_PID
#define SDT_PID
Definition: mpegts.h:47
av_new_program
AVProgram * av_new_program(AVFormatContext *ac, int id)
Definition: avformat.c:271
AV_CODEC_ID_MP3
@ AV_CODEC_ID_MP3
preferred ID for decoding MPEG audio layer 1, 2 or 3
Definition: codec_id.h:461
STREAM_TYPE_VIDEO_JPEG2000
#define STREAM_TYPE_VIDEO_JPEG2000
Definition: mpegts.h:145
AVRational::num
int num
Numerator.
Definition: rational.h:59
PESContext::stream
AVFormatContext * stream
Definition: mpegts.c:259
SLConfigDescr::timestamp_len
int timestamp_len
Definition: mpegts.h:253
MAX_SECTION_SIZE
#define MAX_SECTION_SIZE
Definition: mpegts.h:34
av_dovi_alloc
AVDOVIDecoderConfigurationRecord * av_dovi_alloc(size_t *size)
Allocate a AVDOVIDecoderConfigurationRecord structure and initialize its fields to default values.
Definition: dovi_meta.c:26
STREAM_ID_METADATA_STREAM
#define STREAM_ID_METADATA_STREAM
Definition: mpegts.h:194
AV_CODEC_ID_DVB_SUBTITLE
@ AV_CODEC_ID_DVB_SUBTITLE
Definition: codec_id.h:573
PESContext::sub_st
AVStream * sub_st
stream for the embedded AC3 stream in HDMV TrueHD
Definition: mpegts.c:261
ff_mp4_parse_es_descr
void ff_mp4_parse_es_descr(AVIOContext *pb, int *es_id)
Definition: isom.c:304
SectionHeader::current_next
uint8_t current_next
Definition: mpegts.c:654
MpegTSContext::merge_pmt_versions
int merge_pmt_versions
Definition: mpegts.c:166
AVCodecParameters::color_trc
enum AVColorTransferCharacteristic color_trc
Definition: codec_par.h:168
AV_DISPOSITION_CLEAN_EFFECTS
#define AV_DISPOSITION_CLEAN_EFFECTS
The audio stream contains music and sound effects without voice.
Definition: avformat.h:662
PESContext::header
uint8_t header[MAX_PES_HEADER_SIZE]
Definition: mpegts.c:272
SUBTITLING_DESCRIPTOR
#define SUBTITLING_DESCRIPTOR
Definition: mpegts.h:222
avassert.h
MPEGTS_OPTIONS
#define MPEGTS_OPTIONS
Definition: mpegts.c:187
avio_rb32
unsigned int avio_rb32(AVIOContext *s)
Definition: aviobuf.c:764
MpegTSContext::pos47_full
int64_t pos47_full
Definition: mpegts.c:137
AV_LOG_TRACE
#define AV_LOG_TRACE
Extremely verbose debugging, useful for libav* development.
Definition: log.h:236
avpriv_mpegts_parse_close
void avpriv_mpegts_parse_close(MpegTSContext *ts)
Definition: mpegts.c:3653
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:210
MpegTSContext::id
int id
Definition: mpegts.c:169
STREAM_TYPE_BLURAY_AUDIO_AC3
#define STREAM_TYPE_BLURAY_AUDIO_AC3
Definition: mpegts.h:158
FF_ARRAY_ELEMS
#define FF_ARRAY_ELEMS(a)
Definition: sinewin_tablegen.c:29
StreamType::codec_id
enum AVCodecID codec_id
Definition: mpegts.c:798
PESContext
Definition: mpegts.c:254
AV_PKT_FLAG_CORRUPT
#define AV_PKT_FLAG_CORRUPT
The packet content is corrupted.
Definition: packet.h:644
DTS_DESCRIPTOR
#define DTS_DESCRIPTOR
Definition: mpegts.h:225
Mp4Descr::sl
SLConfigDescr sl
Definition: mpegts.h:266
AV_PROFILE_UNKNOWN
#define AV_PROFILE_UNKNOWN
Definition: defs.h:65
opus_coupled_stream_cnt
static const uint8_t opus_coupled_stream_cnt[9]
Definition: mpegts.c:1819
transfer_characteristics
static const struct TransferCharacteristics transfer_characteristics[]
Definition: vf_colorspace.c:177
AVFormatContext::ctx_flags
int ctx_flags
Flags signalling stream properties.
Definition: avformat.h:1312
AVProgram::id
int id
Definition: avformat.h:1188
MpegTSContext::pools
AVBufferPool * pools[32]
Definition: mpegts.c:184
parse_pcr
static int parse_pcr(int64_t *ppcr_high, int *ppcr_low, const uint8_t *packet)
Definition: mpegts.c:3297
AV_CODEC_ID_S302M
@ AV_CODEC_ID_S302M
Definition: codec_id.h:364
av_buffer_pool_get
AVBufferRef * av_buffer_pool_get(AVBufferPool *pool)
Allocate a new AVBuffer, reusing an old buffer from the pool when available.
Definition: buffer.c:390
MpegTSContext::stream
AVFormatContext * stream
Definition: mpegts.c:133
AV_CODEC_ID_MPEG4SYSTEMS
@ AV_CODEC_ID_MPEG4SYSTEMS
FAKE codec to indicate a MPEG-4 Systems stream (only used by libavformat)
Definition: codec_id.h:623
STREAM_TYPE_VIDEO_MPEG4
#define STREAM_TYPE_VIDEO_MPEG4
Definition: mpeg.h:56
attributes_internal.h
intreadwrite.h
s
#define s(width, name)
Definition: cbs_vp9.c:198
av_new_packet
int av_new_packet(AVPacket *pkt, int size)
Allocate the payload of a packet and initialize its fields with default values.
Definition: packet.c:98
mpegts_get_pcr
static av_unused int64_t mpegts_get_pcr(AVFormatContext *s, int stream_index, int64_t *ppos, int64_t pos_limit)
Definition: mpegts.c:3531
mpegts_class
static const AVClass mpegts_class
Definition: mpegts.c:217
AVFormatContext::nb_programs
unsigned int nb_programs
Definition: avformat.h:1460
AVInputFormat::name
const char * name
A comma separated list of short names for the format.
Definition: avformat.h:549
TELETEXT_DESCRIPTOR
#define TELETEXT_DESCRIPTOR
Definition: mpegts.h:221
AVMEDIA_TYPE_AUDIO
@ AVMEDIA_TYPE_AUDIO
Definition: avutil.h:201
STUFFING_BYTE
#define STUFFING_BYTE
Definition: mpegts.h:37
AVCodecParameters::width
int width
Video only.
Definition: codec_par.h:134
STREAM_TYPE_SCTE_DATA_SCTE_35
#define STREAM_TYPE_SCTE_DATA_SCTE_35
Definition: mpegts.h:169
STREAM_TYPE_ISO_IEC_14496_PES
#define STREAM_TYPE_ISO_IEC_14496_PES
ISO/IEC 14496-1 (MPEG-4 Systems) SL-packetized stream or FlexMux stream carried in PES packets.
Definition: mpegts.h:135
fc
#define fc(width, name, range_min, range_max)
Definition: cbs_av1.c:494
bits
uint8_t bits
Definition: vp3data.h:128
SLConfigDescr::degr_prior_len
int degr_prior_len
Definition: mpegts.h:257
STREAM_TYPE_BLURAY_AUDIO_TRUEHD
#define STREAM_TYPE_BLURAY_AUDIO_TRUEHD
Definition: mpegts.h:160
av_assert0
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:42
SYNC_BYTE
#define SYNC_BYTE
Definition: mpegts.h:36
ff_mpegtsraw_demuxer
const FFInputFormat ff_mpegtsraw_demuxer
Definition: mpegts.c:3673
AV_LOG_DEBUG
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:231
mpegts_open_filter
static MpegTSFilter * mpegts_open_filter(MpegTSContext *ts, unsigned int pid, enum MpegTSFilterType type)
Definition: mpegts.c:491
AVDOVIDecoderConfigurationRecord::dv_profile
uint8_t dv_profile
Definition: dovi_meta.h:58
PES_START_SIZE
#define PES_START_SIZE
Definition: mpegts.c:250
MpegTSContext::resync_size
int resync_size
Definition: mpegts.c:165
channels
channels
Definition: aptx.h:31
get_bits.h
SectionHeader::sec_num
uint8_t sec_num
Definition: mpegts.c:655
STREAM_ID_TYPE_E_STREAM
#define STREAM_ID_TYPE_E_STREAM
Definition: mpegts.h:193
nb_streams
static int nb_streams
Definition: ffprobe.c:348
PESContext::stream_type
int stream_type
Definition: mpegts.c:257
parse_MP4IODescrTag
static int parse_MP4IODescrTag(MP4DescrParseContext *d, int64_t off, int len)
Definition: mpegts.c:1532
PMT_TID
#define PMT_TID
Definition: mpegts.h:85
skip_identical
static int skip_identical(const SectionHeader *h, MpegTSSectionFilter *tssf)
Definition: mpegts.c:659
opus_stream_cnt
static const uint8_t opus_stream_cnt[9]
Definition: mpegts.c:1823
AVCodecParameters::nb_coded_side_data
int nb_coded_side_data
Amount of entries in coded_side_data.
Definition: codec_par.h:86
AVMEDIA_TYPE_DATA
@ AVMEDIA_TYPE_DATA
Opaque data information usually continuous.
Definition: avutil.h:202
av_mallocz
#define av_mallocz(s)
Definition: tableprint_vlc.h:31
STREAM_TYPE_VIDEO_MPEG1
#define STREAM_TYPE_VIDEO_MPEG1
Definition: mpeg.h:49
AV_CODEC_ID_H264
@ AV_CODEC_ID_H264
Definition: codec_id.h:79
AVDOVIDecoderConfigurationRecord::dv_version_major
uint8_t dv_version_major
Definition: dovi_meta.h:56
MPEGTS_SKIP
@ MPEGTS_SKIP
Definition: mpegts.c:246
EXTERN
#define EXTERN
Definition: attributes_internal.h:34
AV_PIX_FMT_YUV444P10LE
@ AV_PIX_FMT_YUV444P10LE
planar YUV 4:4:4, 30bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian
Definition: pixfmt.h:162
MpegTSPESFilter::opaque
void * opaque
Definition: mpegts.c:79
get8
static int get8(const uint8_t **pp, const uint8_t *p_end)
Definition: mpegts.c:670
discard_pid
static int discard_pid(MpegTSContext *ts, unsigned int pid)
discard_pid() decides if the pid is to be discarded according to caller's programs selection
Definition: mpegts.c:383
AV_CODEC_ID_ARIB_CAPTION
@ AV_CODEC_ID_ARIB_CAPTION
Definition: codec_id.h:597
if
if(ret)
Definition: filter_design.txt:179
MpegTSContext::cur_pcr
int64_t cur_pcr
used to estimate the exact PCR
Definition: mpegts.c:148
clear_programs
static void clear_programs(MpegTSContext *ts)
Definition: mpegts.c:315
FFStream::need_parsing
enum AVStreamParseType need_parsing
Definition: internal.h:314
MP4ESDescrTag
#define MP4ESDescrTag
Definition: isom.h:398
AV_CODEC_ID_AVS3
@ AV_CODEC_ID_AVS3
Definition: codec_id.h:250
MP4DescrParseContext::active_descr
Mp4Descr * active_descr
Definition: mpegts.c:1485
AVDISCARD_ALL
@ AVDISCARD_ALL
discard all
Definition: defs.h:232
AVFormatContext
Format I/O context.
Definition: avformat.h:1263
FMC_DESCRIPTOR
#define FMC_DESCRIPTOR
Definition: mpegts.h:204
internal.h
MpegTSContext::pcr_incr
int64_t pcr_incr
used to estimate the exact PCR
Definition: mpegts.c:149
AVPacket::buf
AVBufferRef * buf
A reference to the reference-counted buffer where the packet data is stored.
Definition: packet.h:571
AVStream::codecpar
AVCodecParameters * codecpar
Codec parameters associated with this stream.
Definition: avformat.h:767
LIBAVUTIL_VERSION_INT
#define LIBAVUTIL_VERSION_INT
Definition: version.h:85
AVClass
Describe the class of an AVClass context structure.
Definition: log.h:76
STREAM_TYPE_ATSC_AUDIO_AC3
#define STREAM_TYPE_ATSC_AUDIO_AC3
Definition: mpegts.h:171
NULL
#define NULL
Definition: coverity.c:32
AVDOVIDecoderConfigurationRecord::dv_level
uint8_t dv_level
Definition: dovi_meta.h:59
av_program_add_stream_index
void av_program_add_stream_index(AVFormatContext *ac, int progid, unsigned idx)
Definition: avformat.c:302
AVDOVIDecoderConfigurationRecord::dv_bl_signal_compatibility_id
uint8_t dv_bl_signal_compatibility_id
Definition: dovi_meta.h:63
MPEGTS_HEADER
@ MPEGTS_HEADER
Definition: mpegts.c:242
MpegTSSectionFilter::crc
unsigned crc
Definition: mpegts.c:90
av_buffer_unref
void av_buffer_unref(AVBufferRef **buf)
Free a given reference and automatically free the buffer if there are no more references to it.
Definition: buffer.c:139
MpegTSContext::stop_parse
int stop_parse
stop parsing loop
Definition: mpegts.c:153
AVFMTCTX_NOHEADER
#define AVFMTCTX_NOHEADER
signal that no header is present (streams are added dynamically)
Definition: avformat.h:1214
isom.h
AV_CODEC_ID_TIMED_ID3
@ AV_CODEC_ID_TIMED_ID3
Definition: codec_id.h:612
MpegTSContext::current_pid
int current_pid
Definition: mpegts.c:181
MpegTSSectionFilter::section_index
int section_index
Definition: mpegts.c:87
MpegTSContext::last_pos
int64_t last_pos
to detect seek
Definition: mpegts.c:157
Mp4Descr::es_id
int es_id
Definition: mpegts.h:263
MpegTSFilter::es_id
int es_id
Definition: mpegts.c:101
MPEGTS_PESHEADER
@ MPEGTS_PESHEADER
Definition: mpegts.c:243
DESC_types
static const StreamType DESC_types[]
Definition: mpegts.c:893
PESContext::extended_stream_id
int extended_stream_id
Definition: mpegts.c:268
Mp4Descr::dec_config_descr_len
int dec_config_descr_len
Definition: mpegts.h:264
STREAM_TYPE_BLURAY_AUDIO_EAC3_SECONDARY
#define STREAM_TYPE_BLURAY_AUDIO_EAC3_SECONDARY
Definition: mpegts.h:164
av_default_item_name
const char * av_default_item_name(void *ptr)
Return the context name.
Definition: log.c:242
MpegTSSectionFilter::section_buf
uint8_t * section_buf
Definition: mpegts.c:92
get_bits1
static unsigned int get_bits1(GetBitContext *s)
Definition: get_bits.h:391
eit_cb
static void eit_cb(MpegTSFilter *filter, const uint8_t *section, int section_len)
Definition: mpegts.c:2841
av_buffer_pool_uninit
void av_buffer_pool_uninit(AVBufferPool **ppool)
Mark the pool as being available for freeing.
Definition: buffer.c:328
MpegTSFilter::type
enum MpegTSFilterType type
Definition: mpegts.c:105
mpegts_open_pcr_filter
static MpegTSFilter * mpegts_open_pcr_filter(MpegTSContext *ts, unsigned int pid)
Definition: mpegts.c:557
AVProbeData
This structure contains the data a format has to probe a file.
Definition: avformat.h:451
SectionHeader::version
uint8_t version
Definition: mpegts.c:653
options
Definition: swscale.c:44
seek_back
static void seek_back(AVFormatContext *s, AVIOContext *pb, int64_t pos)
Definition: mpegts.c:3323
SLConfigDescr::ocr_len
int ocr_len
Definition: mpegts.h:254
AVStream::metadata
AVDictionary * metadata
Definition: avformat.h:824
AV_CODEC_ID_MPEG2TS
@ AV_CODEC_ID_MPEG2TS
FAKE codec to indicate a raw MPEG-2 TS stream (only used by libavformat)
Definition: codec_id.h:621
add_pes_stream
static PESContext * add_pes_stream(MpegTSContext *ts, int pid, int pcr_pid)
Definition: mpegts.c:1456
MpegTSFilterType
MpegTSFilterType
Definition: mpegts.c:66
AV_DICT_DONT_OVERWRITE
#define AV_DICT_DONT_OVERWRITE
Don't overwrite existing entries.
Definition: dict.h:81
JXS_VIDEO_DESCRIPTOR
#define JXS_VIDEO_DESCRIPTOR
Definition: mpegts.h:211
StreamType
Definition: mpegts.c:795
STREAM_TYPE_HLS_SE_VIDEO_H264
#define STREAM_TYPE_HLS_SE_VIDEO_H264
Definition: mpegts.h:177
AV_CODEC_ID_SMPTE_KLV
@ AV_CODEC_ID_SMPTE_KLV
Definition: codec_id.h:610
mpegts_open_section_filter
static MpegTSFilter * mpegts_open_section_filter(MpegTSContext *ts, unsigned int pid, SectionCallback *section_cb, void *opaque, int check_crc)
Definition: mpegts.c:514
SLConfigDescr::packet_seq_num_len
int packet_seq_num_len
Definition: mpegts.h:259
LCEVC_LINKAGE_DESCRIPTOR
#define LCEVC_LINKAGE_DESCRIPTOR
Definition: mpegts.h:213
EXTENSION_DESCRIPTOR
#define EXTENSION_DESCRIPTOR
Definition: mpegts.h:207
mpegts_open_pes_filter
static MpegTSFilter * mpegts_open_pes_filter(MpegTSContext *ts, unsigned int pid, PESCallback *pes_cb, void *opaque)
Definition: mpegts.c:541
PESContext::ts
MpegTSContext * ts
Definition: mpegts.c:258
STREAM_TYPE_VIDEO_MVC
#define STREAM_TYPE_VIDEO_MVC
Definition: mpegts.h:144
OEITS_END_TID
#define OEITS_END_TID
Definition: mpegts.h:104
init_MP4DescrParseContext
static int init_MP4DescrParseContext(MP4DescrParseContext *d, AVFormatContext *s, const uint8_t *buf, unsigned size, Mp4Descr *descr, int max_descr_count)
Definition: mpegts.c:1492
MAX_PES_HEADER_SIZE
#define MAX_PES_HEADER_SIZE
Definition: mpegts.c:252
MAX_PACKET_READAHEAD
#define MAX_PACKET_READAHEAD
Definition: mpegts.c:3431
MAX_PIDS_PER_PROGRAM
#define MAX_PIDS_PER_PROGRAM
Definition: mpegts.c:118
MpegTSSectionFilter::end_of_section_reached
unsigned int end_of_section_reached
Definition: mpegts.c:94
index
int index
Definition: gxfenc.c:90
c
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
Definition: undefined.txt:32
parse_MP4ODescrTag
static int parse_MP4ODescrTag(MP4DescrParseContext *d, int64_t off, int len)
Definition: mpegts.c:1545
ff_mp4_read_descr
int ff_mp4_read_descr(void *logctx, AVIOContext *pb, int *tag)
Definition: isom.c:295
mpegts_push_data
static int mpegts_push_data(MpegTSFilter *filter, const uint8_t *buf, int buf_size, int is_start, int64_t pos)
Definition: mpegts.c:1165
SLConfigDescr::use_au_start
int use_au_start
Definition: mpegts.h:246
new_data_packet
static void new_data_packet(const uint8_t *buffer, int len, AVPacket *pkt)
Definition: mpegts.c:1010
AVCodecID
AVCodecID
Identify the syntax and semantics of the bitstream.
Definition: codec_id.h:49
AV_CODEC_ID_EAC3
@ AV_CODEC_ID_EAC3
Definition: codec_id.h:500
avformat_stream_group_add_stream
int avformat_stream_group_add_stream(AVStreamGroup *stg, AVStream *st)
Add an already allocated stream to a stream group.
Definition: options.c:520
AVCodecParameters::extradata_size
int extradata_size
Size of the extradata content in bytes.
Definition: codec_par.h:73
SDT_TID
#define SDT_TID
Definition: mpegts.h:91
AV_CODEC_ID_AAC
@ AV_CODEC_ID_AAC
Definition: codec_id.h:462
ff_dlog
#define ff_dlog(a,...)
Definition: tableprint_vlc.h:28
SCTE_types
static const StreamType SCTE_types[]
Definition: mpegts.c:845
MPEGTS_PES
@ MPEGTS_PES
Definition: mpegts.c:67
f
f
Definition: af_crystalizer.c:122
AVIOContext
Bytestream IO Context.
Definition: avio.h:160
ff_mpegts_demuxer
const EXTERN FFInputFormat ff_mpegts_demuxer
Definition: mpegts.c:278
AVMediaType
AVMediaType
Definition: avutil.h:198
MP4DescrParseContext::descr
Mp4Descr * descr
Definition: mpegts.c:1484
AVPacket::size
int size
Definition: packet.h:589
NULL_IF_CONFIG_SMALL
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
Definition: internal.h:94
AVIOContext::seekable
int seekable
A combination of AVIO_SEEKABLE_ flags or 0 when the stream is not seekable.
Definition: avio.h:261
MpegTSContext::max_packet_size
int max_packet_size
Definition: mpegts.c:167
STREAM_TYPE_VIDEO_HEVC
#define STREAM_TYPE_VIDEO_HEVC
Definition: mpeg.h:58
FFStream
Definition: internal.h:128
SectionHeader::tid
uint8_t tid
Definition: mpegts.c:651
reset_pes_packet_state
static void reset_pes_packet_state(PESContext *pes)
Definition: mpegts.c:1001
AV_PIX_FMT_YUV422P10LE
@ AV_PIX_FMT_YUV422P10LE
planar YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian
Definition: pixfmt.h:158
i
#define i(width, name, range_min, range_max)
Definition: cbs_h264.c:63
FFIOContext::pub
AVIOContext pub
Definition: avio_internal.h:29
AV_CODEC_ID_DTS
@ AV_CODEC_ID_DTS
Definition: codec_id.h:464
Program
Definition: mpegts.c:119
MpegTSContext
Definition: mpegts.c:130
MpegTSFilter
Definition: mpegts.c:99
size
int size
Definition: twinvq_data.h:10344
FF_INFMT_FLAG_PREFER_CODEC_FRAMERATE
#define FF_INFMT_FLAG_PREFER_CODEC_FRAMERATE
Definition: demux.h:40
MPEGTS_PAYLOAD
@ MPEGTS_PAYLOAD
Definition: mpegts.c:245
AV_NOPTS_VALUE
#define AV_NOPTS_VALUE
Undefined timestamp value.
Definition: avutil.h:247
MpegTSContext::raw_packet_size
int raw_packet_size
raw packet size, including FEC if present
Definition: mpegts.c:135
AV_RB32
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_WL16 uint64_t_TMPL AV_WB64 unsigned int_TMPL AV_RB32
Definition: bytestream.h:96
finished_reading_packet
static void finished_reading_packet(AVFormatContext *s, int raw_packet_size)
Definition: mpegts.c:3189
avpriv_report_missing_feature
void avpriv_report_missing_feature(void *avc, const char *msg,...) av_printf_format(2
Log a generic warning message about a missing feature.
STREAM_ID_PRIVATE_STREAM_2
#define STREAM_ID_PRIVATE_STREAM_2
Definition: mpegts.h:187
SLConfigDescr::use_au_end
int use_au_end
Definition: mpegts.h:247
MpegTSSectionFilter::check_crc
unsigned int check_crc
Definition: mpegts.c:93
MpegTSContext::skip_clear
int skip_clear
Definition: mpegts.c:160
AVCodecParameters::profile
int profile
Codec-specific bitstream restrictions that the stream conforms to.
Definition: codec_par.h:128
mpegts_get_dts
static int64_t mpegts_get_dts(AVFormatContext *s, int stream_index, int64_t *ppos, int64_t pos_limit)
Definition: mpegts.c:3565
AV_CODEC_ID_OPUS
@ AV_CODEC_ID_OPUS
Definition: codec_id.h:520
mpegts_read_packet
static int mpegts_read_packet(AVFormatContext *s, AVPacket *pkt)
Definition: mpegts.c:3480
ff_find_stream_index
int ff_find_stream_index(const AVFormatContext *s, int id)
Find stream index based on format-specific stream ID.
Definition: demux_utils.c:356
FFInputFormat::p
AVInputFormat p
The public AVInputFormat.
Definition: demux.h:70
parse_MP4ESDescrTag
static int parse_MP4ESDescrTag(MP4DescrParseContext *d, int64_t off, int len)
Definition: mpegts.c:1559
STREAM_IDENTIFIER_DESCRIPTOR
#define STREAM_IDENTIFIER_DESCRIPTOR
Definition: mpegts.h:220
buffer.h
AV_DISPOSITION_HEARING_IMPAIRED
#define AV_DISPOSITION_HEARING_IMPAIRED
The stream is intended for hearing impaired audiences.
Definition: avformat.h:654
AVPacket::dts
int64_t dts
Decompression timestamp in AVStream->time_base units; the time at which the packet is decompressed.
Definition: packet.h:587
STREAM_TYPE_AUDIO_MPEG4
#define STREAM_TYPE_AUDIO_MPEG4
ISO/IEC 14496-3 Audio, without using any additional transport syntax, such as DST,...
Definition: mpegts.h:143
AVStreamGroup::params
union AVStreamGroup::@433 params
Group type-specific parameters.
avio_r8
int avio_r8(AVIOContext *s)
Definition: aviobuf.c:606
av_reallocp_array
int av_reallocp_array(void *ptr, size_t nmemb, size_t size)
Allocate, reallocate an array through a pointer to a pointer.
Definition: mem.c:225
STREAM_TYPE_VIDEO_MPEG2
#define STREAM_TYPE_VIDEO_MPEG2
Definition: mpeg.h:50
ffio_ensure_seekback
int ffio_ensure_seekback(AVIOContext *s, int64_t buf_size)
Ensures that the requested seekback buffer size will be available.
Definition: aviobuf.c:1026
AV_CODEC_ID_VVC
@ AV_CODEC_ID_VVC
Definition: codec_id.h:252
av_crc_get_table
const AVCRC * av_crc_get_table(AVCRCId crc_id)
Get an initialized standard CRC table.
Definition: crc.c:389
SectionCallback
void SectionCallback(MpegTSFilter *f, const uint8_t *buf, int len)
Definition: mpegts.c:82
av_packet_side_data_add
AVPacketSideData * av_packet_side_data_add(AVPacketSideData **psd, int *pnb_sd, enum AVPacketSideDataType type, void *data, size_t size, int flags)
Wrap existing data as packet side data.
Definition: packet.c:687
mpeg.h
offset
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf offset
Definition: writing_filters.txt:86
FFStream::pts_wrap_behavior
int pts_wrap_behavior
Options for behavior, when a wrap is detected.
Definition: internal.h:267
AVStreamGroupLCEVC::lcevc_index
unsigned int lcevc_index
Index of the LCEVC data stream in AVStreamGroup.
Definition: avformat.h:1075
AVStreamGroup::lcevc
struct AVStreamGroupLCEVC * lcevc
Definition: avformat.h:1133
AV_CODEC_ID_LCEVC
@ AV_CODEC_ID_LCEVC
Definition: codec_id.h:615
PESContext::pid
int pid
Definition: mpegts.c:255
AVPacket::flags
int flags
A combination of AV_PKT_FLAG values.
Definition: packet.h:594
av_packet_alloc
AVPacket * av_packet_alloc(void)
Allocate an AVPacket and set its fields to default values.
Definition: packet.c:63
read_header
static int read_header(FFV1Context *f, RangeCoder *c)
Definition: ffv1dec.c:498
xf
#define xf(width, name, var, range_min, range_max, subs,...)
Definition: cbs_av1.c:622
version
version
Definition: libkvazaar.c:313
FFStream::probe_packets
int probe_packets
Number of packets to buffer for codec probing.
Definition: internal.h:311
handle_packet
static int handle_packet(MpegTSContext *ts, const uint8_t *packet, int64_t pos)
Definition: mpegts.c:2985
AVStreamGroup::streams
AVStream ** streams
A list of streams in the group.
Definition: avformat.h:1164
STREAM_TYPE_AUDIO_AAC_LATM
#define STREAM_TYPE_AUDIO_AAC_LATM
Definition: mpegts.h:131
DATA_COMPONENT_DESCRIPTOR
#define DATA_COMPONENT_DESCRIPTOR
Definition: mpegts.h:236
AV_LOG_INFO
#define AV_LOG_INFO
Standard information.
Definition: log.h:221
update_offsets
static void update_offsets(AVIOContext *pb, int64_t *off, int *len)
Definition: mpegts.c:1511
AV_CODEC_ID_JPEGXS
@ AV_CODEC_ID_JPEGXS
Definition: codec_id.h:334
get_bits64
static uint64_t get_bits64(GetBitContext *s, int n)
Read 0-64 bits.
Definition: get_bits.h:456
EIT_PID
#define EIT_PID
Definition: mpegts.h:49
is_pes_stream
static int is_pes_stream(int stream_type, uint32_t prog_reg_desc)
Definition: mpegts.c:2516
LCEVC_VIDEO_DESCRIPTOR
#define LCEVC_VIDEO_DESCRIPTOR
Definition: mpegts.h:212
STREAM_TYPE_VIDEO_DIRAC
#define STREAM_TYPE_VIDEO_DIRAC
Definition: mpegts.h:154
SectionHeader
Definition: mpegts.c:650
ISO_639_LANGUAGE_DESCRIPTOR
#define ISO_639_LANGUAGE_DESCRIPTOR
Definition: mpegts.h:201
MP4DescrParseContext::pb
FFIOContext pb
Definition: mpegts.c:1483
log.h
AV_CODEC_ID_NONE
@ AV_CODEC_ID_NONE
Definition: codec_id.h:50
AVPacket::pts
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
Definition: packet.h:581
avio_internal.h
IOD_DESCRIPTOR
#define IOD_DESCRIPTOR
Definition: mpegts.h:202
parse_stream_identifier_desc
static int parse_stream_identifier_desc(const uint8_t *p, const uint8_t *p_end)
Definition: mpegts.c:2480
MAX_MP4_DESCR_COUNT
#define MAX_MP4_DESCR_COUNT
Definition: mpegts.c:54
PESContext::data_index
int data_index
Definition: mpegts.c:264
AV_CODEC_ID_SMPTE_2038
@ AV_CODEC_ID_SMPTE_2038
Definition: codec_id.h:614
internal.h
get_program
static struct Program * get_program(MpegTSContext *ts, unsigned int programid)
Definition: mpegts.c:280
AVCodecParameters::height
int height
Definition: codec_par.h:135
STREAM_TYPE_BLURAY_SUBTITLE_TEXT
#define STREAM_TYPE_BLURAY_SUBTITLE_TEXT
Definition: mpegts.h:167
PAT_TID
#define PAT_TID
Definition: mpegts.h:83
MpegTSContext::pids
MpegTSFilter * pids[NB_PID_MAX]
filters for various streams specified by PMT + for the PAT and PMT
Definition: mpegts.c:180
PESContext::pes_header_size
int pes_header_size
Definition: mpegts.c:267
AV_CODEC_ID_CAVS
@ AV_CODEC_ID_CAVS
Definition: codec_id.h:139
get16
static int get16(const uint8_t **pp, const uint8_t *p_end)
Definition: mpegts.c:683
parse_section_header
static int parse_section_header(SectionHeader *h, const uint8_t **pp, const uint8_t *p_end)
Definition: mpegts.c:765
AV_FIELD_BB
@ AV_FIELD_BB
Bottom coded first, bottom displayed first.
Definition: defs.h:215
MpegTSContext::epg_stream
AVStream * epg_stream
Definition: mpegts.c:183
AV_CODEC_ID_EPG
@ AV_CODEC_ID_EPG
Definition: codec_id.h:605
AV_CODEC_ID_HEVC
@ AV_CODEC_ID_HEVC
Definition: codec_id.h:228
mpegts_resync
static int mpegts_resync(AVFormatContext *s, int seekback, const uint8_t *current_packet)
Definition: mpegts.c:3115
MpegTSContext::crc_validity
int8_t crc_validity[NB_PID_MAX]
Definition: mpegts.c:178
FFMIN
#define FFMIN(a, b)
Definition: macros.h:49
PESContext::st
AVStream * st
Definition: mpegts.c:260
STREAM_TYPE_BLURAY_AUDIO_DTS_HD_MASTER
#define STREAM_TYPE_BLURAY_AUDIO_DTS_HD_MASTER
Definition: mpegts.h:163
AV_PKT_DATA_MPEGTS_STREAM_ID
@ AV_PKT_DATA_MPEGTS_STREAM_ID
MPEGTS stream ID as uint8_t, this is required to pass the stream ID information from the demuxer to t...
Definition: packet.h:212
AVProgram
New fields can be added to the end with minor version bumps.
Definition: avformat.h:1187
handle_packets
static int handle_packets(MpegTSContext *ts, int64_t nb_packets)
Definition: mpegts.c:3201
AV_CODEC_ID_VC1
@ AV_CODEC_ID_VC1
Definition: codec_id.h:122
demux.h
MpegTSContext::prg
struct Program * prg
Definition: mpegts.c:176
AV_DISPOSITION_DEPENDENT
#define AV_DISPOSITION_DEPENDENT
The stream is intended to be mixed with another stream before presentation.
Definition: avformat.h:705
AVCodecParameters::color_range
enum AVColorRange color_range
Video only.
Definition: codec_par.h:166
len
int len
Definition: vorbis_enc_data.h:426
AV_CODEC_ID_JPEG2000
@ AV_CODEC_ID_JPEG2000
Definition: codec_id.h:140
STREAM_TYPE_BLURAY_AUDIO_DTS_HD
#define STREAM_TYPE_BLURAY_AUDIO_DTS_HD
Definition: mpegts.h:162
AV_CRC_32_IEEE
@ AV_CRC_32_IEEE
Definition: crc.h:52
MpegTSPESFilter
Definition: mpegts.c:77
AVCodecParameters::coded_side_data
AVPacketSideData * coded_side_data
Additional data associated with the entire stream.
Definition: codec_par.h:81
AVCOL_RANGE_MPEG
@ AVCOL_RANGE_MPEG
Narrow or limited range content.
Definition: pixfmt.h:760
SERVICE_DESCRIPTOR
#define SERVICE_DESCRIPTOR
Definition: mpegts.h:219
AVCodecParameters::field_order
enum AVFieldOrder field_order
Video only.
Definition: codec_par.h:161
SLConfigDescr::au_len
int au_len
Definition: mpegts.h:255
check_crc
static void check_crc(const AVCRC *table_new, const char *name, unsigned idx)
Definition: crc.c:37
MpegTSFilter::last_pcr
int64_t last_pcr
Definition: mpegts.c:103
STREAM_TYPE_PRIVATE_SECTION
#define STREAM_TYPE_PRIVATE_SECTION
Definition: mpeg.h:53
MpegTSSectionFilter::last_crc
unsigned last_crc
Definition: mpegts.c:91
language
Undefined Behavior In the C language
Definition: undefined.txt:3
STREAM_TYPE_BLURAY_AUDIO_DTS_EXPRESS_SECONDARY
#define STREAM_TYPE_BLURAY_AUDIO_DTS_EXPRESS_SECONDARY
Definition: mpegts.h:165
AVStream::disposition
int disposition
Stream disposition - a combination of AV_DISPOSITION_* flags.
Definition: avformat.h:813
mid_pred
#define mid_pred
Definition: mathops.h:115
AV_DISPOSITION_VISUAL_IMPAIRED
#define AV_DISPOSITION_VISUAL_IMPAIRED
The stream is intended for visually impaired audiences.
Definition: avformat.h:658
MP4DescrParseContext
Definition: mpegts.c:1481
SUPPLEMENTARY_AUDIO_DESCRIPTOR
#define SUPPLEMENTARY_AUDIO_DESCRIPTOR
Definition: mpegts.h:230
tag
uint32_t tag
Definition: movenc.c:2046
AVStream::id
int id
Format-specific stream ID.
Definition: avformat.h:756
ret
ret
Definition: filter_design.txt:187
AVStream
Stream structure.
Definition: avformat.h:744
MpegTSSectionFilter::last_ver
int last_ver
Definition: mpegts.c:89
avio_seek
int64_t avio_seek(AVIOContext *s, int64_t offset, int whence)
fseek() equivalent for AVIOContext.
Definition: aviobuf.c:236
FFSWAP
#define FFSWAP(type, a, b)
Definition: macros.h:52
AVClass::class_name
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
Definition: log.h:81
Mp4Descr::dec_config_descr
uint8_t * dec_config_descr
Definition: mpegts.h:265
SLConfigDescr::use_timestamps
int use_timestamps
Definition: mpegts.h:250
av_malloc
void * av_malloc(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
Definition: mem.c:98
avio_rb16
unsigned int avio_rb16(AVIOContext *s)
Definition: aviobuf.c:749
STREAM_TYPE_BLURAY_AUDIO_EAC3
#define STREAM_TYPE_BLURAY_AUDIO_EAC3
Definition: mpegts.h:161
mp4_read_od
static int mp4_read_od(AVFormatContext *s, const uint8_t *buf, unsigned size, Mp4Descr *descr, int *descr_count, int max_descr_count)
Definition: mpegts.c:1710
scte_data_cb
static void scte_data_cb(MpegTSFilter *filter, const uint8_t *section, int section_len)
Definition: mpegts.c:1790
AC3_DESCRIPTOR
#define AC3_DESCRIPTOR
Definition: mpegts.h:223
pos
unsigned int pos
Definition: spdifenc.c:414
avformat.h
dovi_meta.h
STREAM_TYPE_HLS_SE_AUDIO_AAC
#define STREAM_TYPE_HLS_SE_AUDIO_AAC
Definition: mpegts.h:178
m4sl_cb
static void m4sl_cb(MpegTSFilter *filter, const uint8_t *section, int section_len)
Definition: mpegts.c:1726
dict.h
AV_DISPOSITION_DESCRIPTIONS
#define AV_DISPOSITION_DESCRIPTIONS
The subtitle stream contains a textual description of the video content.
Definition: avformat.h:694
AV_INPUT_BUFFER_PADDING_SIZE
#define AV_INPUT_BUFFER_PADDING_SIZE
Definition: defs.h:40
left
Tag MUST be and< 10hcoeff half pel interpolation filter coefficients, hcoeff[0] are the 2 middle coefficients[1] are the next outer ones and so on, resulting in a filter like:...eff[2], hcoeff[1], hcoeff[0], hcoeff[0], hcoeff[1], hcoeff[2] ... the sign of the coefficients is not explicitly stored but alternates after each coeff and coeff[0] is positive, so ...,+,-,+,-,+,+,-,+,-,+,... hcoeff[0] is not explicitly stored but found by subtracting the sum of all stored coefficients with signs from 32 hcoeff[0]=32 - hcoeff[1] - hcoeff[2] - ... a good choice for hcoeff and htaps is htaps=6 hcoeff={40,-10, 2} an alternative which requires more computations at both encoder and decoder side and may or may not be better is htaps=8 hcoeff={42,-14, 6,-2}ref_frames minimum of the number of available reference frames and max_ref_frames for example the first frame after a key frame always has ref_frames=1spatial_decomposition_type wavelet type 0 is a 9/7 symmetric compact integer wavelet 1 is a 5/3 symmetric compact integer wavelet others are reserved stored as delta from last, last is reset to 0 if always_reset||keyframeqlog quality(logarithmic quantizer scale) stored as delta from last, last is reset to 0 if always_reset||keyframemv_scale stored as delta from last, last is reset to 0 if always_reset||keyframe FIXME check that everything works fine if this changes between framesqbias dequantization bias stored as delta from last, last is reset to 0 if always_reset||keyframeblock_max_depth maximum depth of the block tree stored as delta from last, last is reset to 0 if always_reset||keyframequant_table quantization tableHighlevel bitstream structure:==============================--------------------------------------------|Header|--------------------------------------------|------------------------------------|||Block0||||split?||||yes no||||......... intra?||||:Block01 :yes no||||:Block02 :....... ..........||||:Block03 ::y DC ::ref index:||||:Block04 ::cb DC ::motion x :||||......... :cr DC ::motion y :||||....... ..........|||------------------------------------||------------------------------------|||Block1|||...|--------------------------------------------|------------ ------------ ------------|||Y subbands||Cb subbands||Cr subbands||||--- ---||--- ---||--- ---|||||LL0||HL0||||LL0||HL0||||LL0||HL0|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||LH0||HH0||||LH0||HH0||||LH0||HH0|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||HL1||LH1||||HL1||LH1||||HL1||LH1|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||HH1||HL2||||HH1||HL2||||HH1||HL2|||||...||...||...|||------------ ------------ ------------|--------------------------------------------Decoding process:=================------------|||Subbands|------------||||------------|Intra DC||||LL0 subband prediction ------------|\ Dequantization ------------------- \||Reference frames|\ IDWT|------- -------|Motion \|||Frame 0||Frame 1||Compensation . OBMC v -------|------- -------|--------------. \------> Frame n output Frame Frame<----------------------------------/|...|------------------- Range Coder:============Binary Range Coder:------------------- The implemented range coder is an adapted version based upon "Range encoding: an algorithm for removing redundancy from a digitised message." by G. N. N. Martin. The symbols encoded by the Snow range coder are bits(0|1). The associated probabilities are not fix but change depending on the symbol mix seen so far. bit seen|new state ---------+----------------------------------------------- 0|256 - state_transition_table[256 - old_state];1|state_transition_table[old_state];state_transition_table={ 0, 0, 0, 0, 0, 0, 0, 0, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 190, 191, 192, 194, 194, 195, 196, 197, 198, 199, 200, 201, 202, 202, 204, 205, 206, 207, 208, 209, 209, 210, 211, 212, 213, 215, 215, 216, 217, 218, 219, 220, 220, 222, 223, 224, 225, 226, 227, 227, 229, 229, 230, 231, 232, 234, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 248, 0, 0, 0, 0, 0, 0, 0};FIXME Range Coding of integers:------------------------- FIXME Neighboring Blocks:===================left and top are set to the respective blocks unless they are outside of the image in which case they are set to the Null block top-left is set to the top left block unless it is outside of the image in which case it is set to the left block if this block has no larger parent block or it is at the left side of its parent block and the top right block is not outside of the image then the top right block is used for top-right else the top-left block is used Null block y, cb, cr are 128 level, ref, mx and my are 0 Motion Vector Prediction:=========================1. the motion vectors of all the neighboring blocks are scaled to compensate for the difference of reference frames scaled_mv=(mv *(256 *(current_reference+1)/(mv.reference+1))+128)> the median of the scaled left
Definition: snow.txt:386
AV_RL32
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_RL32
Definition: bytestream.h:92
U
#define U(x)
Definition: vpx_arith.h:37
TS_MAX_PACKET_SIZE
#define TS_MAX_PACKET_SIZE
Definition: mpegts.h:30
STREAM_TYPE_BLURAY_AUDIO_PCM_BLURAY
#define STREAM_TYPE_BLURAY_AUDIO_PCM_BLURAY
Definition: mpegts.h:157
M4OD_TID
#define M4OD_TID
Definition: mpegts.h:88
AVStreamGroup
Definition: avformat.h:1097
av_get_media_type_string
const char * av_get_media_type_string(enum AVMediaType media_type)
Return a string describing the media_type enum, NULL if media_type is unknown.
Definition: utils.c:28
AVStream::index
int index
stream index in AVFormatContext
Definition: avformat.h:750
R8_CHECK_CLIP_MAX
#define R8_CHECK_CLIP_MAX(dst, maxv)
probe
static int probe(const AVProbeData *p)
Definition: act.c:39
mpegts_probe
static int mpegts_probe(const AVProbeData *p)
Definition: mpegts.c:3254
PESContext::PES_packet_length
int PES_packet_length
Definition: mpegts.c:266
AVStreamGroup::nb_streams
unsigned int nb_streams
Number of elements in AVStreamGroup.streams.
Definition: avformat.h:1151
STREAM_TYPE_VIDEO_H264
#define STREAM_TYPE_VIDEO_H264
Definition: mpeg.h:57
clear_program
static void clear_program(struct Program *p)
Definition: mpegts.c:306
AVIO_SEEKABLE_NORMAL
#define AVIO_SEEKABLE_NORMAL
Seeking works like for a local file.
Definition: avio.h:41
av_packet_new_side_data
uint8_t * av_packet_new_side_data(AVPacket *pkt, enum AVPacketSideDataType type, size_t size)
Allocate new information of a packet.
Definition: packet.c:231
buffer
the frame and frame reference mechanism is intended to as much as expensive copies of that data while still allowing the filters to produce correct results The data is stored in buffers represented by AVFrame structures Several references can point to the same frame buffer
Definition: filter_design.txt:49
av_crc
uint32_t av_crc(const AVCRC *ctx, uint32_t crc, const uint8_t *buffer, size_t length)
Calculate the CRC of a block.
Definition: crc.c:421
AVRational::den
int den
Denominator.
Definition: rational.h:60
NB_PID_MAX
#define NB_PID_MAX
Definition: mpegts.h:32
AVDOVIDecoderConfigurationRecord::bl_present_flag
uint8_t bl_present_flag
Definition: dovi_meta.h:62
SL_DESCRIPTOR
#define SL_DESCRIPTOR
Definition: mpegts.h:203
AV_OPT_TYPE_INT
@ AV_OPT_TYPE_INT
Underlying C type is int.
Definition: opt.h:259
defs.h
parse_mpeg2_extension_descriptor
static int parse_mpeg2_extension_descriptor(AVFormatContext *fc, AVStream *st, int prg_id, const uint8_t **pp, const uint8_t *desc_end)
Definition: mpegts.c:1838
avio_read
int avio_read(AVIOContext *s, unsigned char *buf, int size)
Read size bytes from AVIOContext into buf.
Definition: aviobuf.c:615
STREAM_TYPE_VIDEO_CAVS
#define STREAM_TYPE_VIDEO_CAVS
Definition: mpeg.h:60
PESContext::stream_id
uint8_t stream_id
Definition: mpegts.c:269
parse_MP4SLDescrTag
static int parse_MP4SLDescrTag(MP4DescrParseContext *d, int64_t off, int len)
Definition: mpegts.c:1595
avpriv_mpegts_parse_open
MpegTSContext * avpriv_mpegts_parse_open(AVFormatContext *s)
Definition: mpegts.c:3606
PESContext::buffer
AVBufferRef * buffer
Definition: mpegts.c:273
CHECK_COUNT
#define CHECK_COUNT
AVDOVIDecoderConfigurationRecord::rpu_present_flag
uint8_t rpu_present_flag
Definition: dovi_meta.h:60
mpegts_free
static void mpegts_free(MpegTSContext *ts)
Definition: mpegts.c:3510
HDMV_types
static const StreamType HDMV_types[]
Definition: mpegts.c:829
AVDOVIDecoderConfigurationRecord::el_present_flag
uint8_t el_present_flag
Definition: dovi_meta.h:61
Windows::Graphics::DirectX::Direct3D11::p
IDirect3DDxgiInterfaceAccess _COM_Outptr_ void ** p
Definition: vsrc_gfxcapture_winrt.hpp:53
AVPacket::stream_index
int stream_index
Definition: packet.h:590
AVPROBE_SCORE_STREAM_RETRY
#define AVPROBE_SCORE_STREAM_RETRY
Definition: avformat.h:459
avio_skip
int64_t avio_skip(AVIOContext *s, int64_t offset)
Skip given number of bytes forward.
Definition: aviobuf.c:321
SLConfigDescr::timestamp_res
int timestamp_res
Definition: mpegts.h:252
ISO_types
static const StreamType ISO_types[]
Definition: mpegts.c:801
AV_OPT_FLAG_DECODING_PARAM
#define AV_OPT_FLAG_DECODING_PARAM
A generic parameter which can be set by the user for demuxing or decoding.
Definition: opt.h:356
AVDOVIDecoderConfigurationRecord::dv_version_minor
uint8_t dv_version_minor
Definition: dovi_meta.h:57
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:200
read_probe
static int read_probe(const AVProbeData *p)
Definition: cdg.c:30
hex_dump_debug
#define hex_dump_debug(class, buf, size)
Definition: internal.h:39
read_sl_header
static int read_sl_header(PESContext *pes, SLConfigDescr *sl, const uint8_t *buf, int buf_size)
Definition: mpegts.c:1081
AVFMT_TS_DISCONT
#define AVFMT_TS_DISCONT
Format allows timestamp discontinuities.
Definition: avformat.h:480
mem.h
AVStreamGroup::type
enum AVStreamGroupParamsType type
Group type.
Definition: avformat.h:1124
AVBufferRef
A reference to a data buffer.
Definition: buffer.h:82
MpegTSContext::pkt
AVPacket * pkt
packet containing Audio/Video data
Definition: mpegts.c:155
mpegts_read_header
static int mpegts_read_header(AVFormatContext *s)
Definition: mpegts.c:3332
AV_DOVI_COMPRESSION_NONE
@ AV_DOVI_COMPRESSION_NONE
Definition: dovi_meta.h:68
avpriv_request_sample
#define avpriv_request_sample(...)
Definition: tableprint_vlc.h:37
STREAM_TYPE_METADATA
#define STREAM_TYPE_METADATA
Definition: mpegts.h:139
AVCodecParameters::format
int format
Definition: codec_par.h:92
MPEGTS_PCR
@ MPEGTS_PCR
Definition: mpegts.c:69
STREAM_TYPE_VIDEO_LCEVC
#define STREAM_TYPE_VIDEO_LCEVC
Definition: mpegts.h:149
avformat_stream_group_create
AVStreamGroup * avformat_stream_group_create(AVFormatContext *s, enum AVStreamGroupParamsType type, AVDictionary **options)
Add a new empty stream group to a media file.
Definition: options.c:440
FFStream::request_probe
int request_probe
stream probing state -1 -> probing finished 0 -> no probing requested rest -> perform probing with re...
Definition: internal.h:198
Program::id
unsigned int id
Definition: mpegts.c:120
STREAM_ID_ECM_STREAM
#define STREAM_ID_ECM_STREAM
Definition: mpegts.h:190
MpegTSSectionFilter::opaque
void * opaque
Definition: mpegts.c:96
PESContext::merged_st
int merged_st
Definition: mpegts.c:275
av_free
#define av_free(p)
Definition: tableprint_vlc.h:34
TS_FEC_PACKET_SIZE
#define TS_FEC_PACKET_SIZE
Definition: mpegts.h:27
AVCodecParameters::codec_id
enum AVCodecID codec_id
Specific type of the encoded data (the codec used).
Definition: codec_par.h:55
MAX_STREAMS_PER_PROGRAM
#define MAX_STREAMS_PER_PROGRAM
Definition: mpegts.c:117
AVPacket
This structure stores compressed data.
Definition: packet.h:565
AV_OPT_TYPE_BOOL
@ AV_OPT_TYPE_BOOL
Underlying C type is int.
Definition: opt.h:327
STREAM_ID_PROGRAM_STREAM_DIRECTORY
#define STREAM_ID_PROGRAM_STREAM_DIRECTORY
Definition: mpegts.h:196
MpegTSFilter::last_cc
int last_cc
Definition: mpegts.c:102
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:35
av_dict_set
int av_dict_set(AVDictionary **pm, const char *key, const char *value, int flags)
Set the given entry in *pm, overwriting an existing entry.
Definition: dict.c:86
MpegTSContext::scan_all_pmts
int scan_all_pmts
Definition: mpegts.c:163
AV_CODEC_ID_AC4
@ AV_CODEC_ID_AC4
Definition: codec_id.h:563
AVPacket::pos
int64_t pos
byte position in stream, -1 if unknown
Definition: packet.h:608
MP4DescrParseContext::predefined_SLConfigDescriptor_seen
int predefined_SLConfigDescriptor_seen
Definition: mpegts.c:1489
FFInputFormat
Definition: demux.h:66
FFMAX3
#define FFMAX3(a, b, c)
Definition: macros.h:48
Stream
Definition: mpegts.c:112
MP4DescrParseContext::level
int level
Definition: mpegts.c:1488
bytestream.h
FFStream::stream_identifier
int stream_identifier
Stream Identifier This is the MPEG-TS stream identifier +1 0 means unknown.
Definition: internal.h:342
AVSTREAM_PARSE_FULL
@ AVSTREAM_PARSE_FULL
full parsing and repack
Definition: avformat.h:589
STREAM_TYPE_ISO_IEC_14496_SECTION
#define STREAM_TYPE_ISO_IEC_14496_SECTION
ISO/IEC 14496-1 (MPEG-4 Systems) SL-packetized stream or FlexMux stream carried in ISO_IEC_14496_sect...
Definition: mpegts.h:138
MpegTSContext::skip_unknown_pmt
int skip_unknown_pmt
Definition: mpegts.c:161
raw_options
static const AVOption raw_options[]
Definition: mpegts.c:224
FFStream::need_context_update
int need_context_update
Whether the internal avctx needs to be updated from codecpar (after a late change to codecpar)
Definition: internal.h:173
opus_channel_map
static const uint8_t opus_channel_map[8][8]
Definition: mpegts.c:1827
AVCodecParameters::bit_rate
int64_t bit_rate
The average bitrate of the encoded data (in bits per second).
Definition: codec_par.h:97
Program::pids
unsigned int pids[MAX_PIDS_PER_PROGRAM]
Definition: mpegts.c:122
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
AV_CODEC_ID_AAC_LATM
@ AV_CODEC_ID_AAC_LATM
Definition: codec_id.h:509
ff_parse_mpeg2_descriptor
int ff_parse_mpeg2_descriptor(AVFormatContext *fc, AVStream *st, int stream_type, int prg_id, const uint8_t **pp, const uint8_t *desc_list_end, Mp4Descr *mp4_descr, int mp4_descr_count, int pid, MpegTSContext *ts)
Parse an MPEG-2 descriptor.
Definition: mpegts.c:2007
parse_mp4_descr
static int parse_mp4_descr(MP4DescrParseContext *d, int64_t off, int len, int target_tag)
Definition: mpegts.c:1638
AVERROR_INVALIDDATA
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:61
STREAM_TYPE_BLURAY_AUDIO_DTS
#define STREAM_TYPE_BLURAY_AUDIO_DTS
Definition: mpegts.h:159
AV_CODEC_ID_HDMV_TEXT_SUBTITLE
@ AV_CODEC_ID_HDMV_TEXT_SUBTITLE
Definition: codec_id.h:595
TS_PACKET_SIZE
#define TS_PACKET_SIZE
Definition: mpegts.h:29
MpegTSSectionFilter::section_cb
SectionCallback * section_cb
Definition: mpegts.c:95
MKTAG
#define MKTAG(a, b, c, d)
Definition: macros.h:55
PROBE_PACKET_MARGIN
#define PROBE_PACKET_MARGIN
Definition: mpegts.c:64
h
h
Definition: vp9dsp_template.c:2070
read_timestamp
static int64_t read_timestamp(AVFormatContext *s, int stream_index, int64_t *ppos, int64_t pos_limit, int64_t(*read_timestamp)(struct AVFormatContext *, int, int64_t *, int64_t))
Definition: seek.c:281
get_ts64
static uint64_t get_ts64(GetBitContext *gb, int bits)
Definition: mpegts.c:1074
AVStream::start_time
int64_t start_time
Decoding: pts of the first frame of the stream in presentation order, in stream time base.
Definition: avformat.h:793
pkt
static AVPacket * pkt
Definition: demux_decode.c:55
get_packet_size
static int get_packet_size(AVFormatContext *s)
Definition: mpegts.c:612
analyze
static int analyze(const uint8_t *buf, int size, int packet_size, int probe)
Definition: mpegts.c:583
write_section_data
static void write_section_data(MpegTSContext *ts, MpegTSFilter *tss1, const uint8_t *buf, int buf_size, int is_start)
Assemble PES packets out of TS packets, and then call the "section_cb" function when they are complet...
Definition: mpegts.c:424
MpegTSFilter::u
union MpegTSFilter::@479 u
ff_reduce_index
void ff_reduce_index(AVFormatContext *s, int stream_index)
Ensure the index uses less memory than the maximum specified in AVFormatContext.max_index_size by dis...
Definition: seek.c:50
read_packet
static int read_packet(AVFormatContext *s, uint8_t *buf, int raw_packet_size, const uint8_t **data)
Definition: mpegts.c:3158
MpegTSContext::mpeg2ts_compute_pcr
int mpeg2ts_compute_pcr
compute exact PCR for each transport stream packet
Definition: mpegts.c:143
REGD_types
static const StreamType REGD_types[]
Definition: mpegts.c:867
MISC_types
static const StreamType MISC_types[]
Definition: mpegts.c:851
STREAM_TYPE_BLURAY_SUBTITLE_PGS
#define STREAM_TYPE_BLURAY_SUBTITLE_PGS
Definition: mpegts.h:166
AV_CODEC_ID_MPEG2VIDEO
@ AV_CODEC_ID_MPEG2VIDEO
preferred ID for MPEG-1/2 video decoding
Definition: codec_id.h:54
add_program
static struct Program * add_program(MpegTSContext *ts, unsigned int programid)
Definition: mpegts.c:321
options
static const AVOption options[]
Definition: mpegts.c:198
snprintf
#define snprintf
Definition: snprintf.h:34
PESContext::ts_packet_pos
int64_t ts_packet_pos
position of first TS packet of this PES packet
Definition: mpegts.c:271
av_log2
int av_log2(unsigned v)
Definition: intmath.c:26
AVProgram::pcr_pid
int pcr_pid
Definition: avformat.h:1197
FFStream::pts_wrap_reference
int64_t pts_wrap_reference
Internal data to check for wrapping of the time stamp.
Definition: internal.h:255
Mp4Descr
Definition: mpegts.h:262
SLConfigDescr
Definition: mpegts.h:245
avio_read_partial
int avio_read_partial(AVIOContext *s, unsigned char *buf, int size)
Read size bytes from AVIOContext into buf.
Definition: aviobuf.c:687
skip
static void BS_FUNC() skip(BSCTX *bc, unsigned int n)
Skip n bits in the buffer.
Definition: bitstream_template.h:383
sdt_cb
static void sdt_cb(MpegTSFilter *filter, const uint8_t *section, int section_len)
Definition: mpegts.c:2895
MpegTSContext::fix_teletext_pts
int fix_teletext_pts
fix dvb teletext pts
Definition: mpegts.c:146
AV_RB16
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_WL16 uint64_t_TMPL AV_WB64 unsigned int_TMPL AV_WB32 unsigned int_TMPL AV_WB24 unsigned int_TMPL AV_RB16
Definition: bytestream.h:98
ff_alloc_extradata
int ff_alloc_extradata(AVCodecParameters *par, int size)
Allocate extradata with additional AV_INPUT_BUFFER_PADDING_SIZE at end which is always set to 0.
Definition: utils.c:237
AVDOVIDecoderConfigurationRecord
Definition: dovi_meta.h:55
avio_feof
int avio_feof(AVIOContext *s)
Similar to feof() but also returns nonzero on read errors.
Definition: aviobuf.c:349
AV_CODEC_ID_SCTE_35
@ AV_CODEC_ID_SCTE_35
Contain timestamp estimated through PCR of program stream.
Definition: codec_id.h:604
StreamType::codec_type
enum AVMediaType codec_type
Definition: mpegts.c:797