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 "libavutil/buffer.h"
23 #include "libavutil/crc.h"
24 #include "libavutil/internal.h"
25 #include "libavutil/intreadwrite.h"
26 #include "libavutil/log.h"
27 #include "libavutil/dict.h"
28 #include "libavutil/mathematics.h"
29 #include "libavutil/opt.h"
30 #include "libavutil/avassert.h"
31 #include "libavutil/dovi_meta.h"
32 #include "libavcodec/bytestream.h"
33 #include "libavcodec/get_bits.h"
34 #include "libavcodec/opus.h"
35 #include "avformat.h"
36 #include "mpegts.h"
37 #include "internal.h"
38 #include "avio_internal.h"
39 #include "mpeg.h"
40 #include "isom.h"
41 #if CONFIG_ICONV
42 #include <iconv.h>
43 #endif
44 
45 /* maximum size in which we look for synchronization if
46  * synchronization is lost */
47 #define MAX_RESYNC_SIZE 65536
48 
49 #define MAX_PES_PAYLOAD 200 * 1024
50 
51 #define MAX_MP4_DESCR_COUNT 16
52 
53 #define MOD_UNLIKELY(modulus, dividend, divisor, prev_dividend) \
54  do { \
55  if ((prev_dividend) == 0 || (dividend) - (prev_dividend) != (divisor)) \
56  (modulus) = (dividend) % (divisor); \
57  (prev_dividend) = (dividend); \
58  } while (0)
59 
60 #define PROBE_PACKET_MAX_BUF 8192
61 #define PROBE_PACKET_MARGIN 5
62 
67 };
68 
69 typedef struct MpegTSFilter MpegTSFilter;
70 
71 typedef int PESCallback (MpegTSFilter *f, const uint8_t *buf, int len,
72  int is_start, int64_t pos);
73 
74 typedef struct MpegTSPESFilter {
76  void *opaque;
78 
79 typedef void SectionCallback (MpegTSFilter *f, const uint8_t *buf, int len);
80 
81 typedef void SetServiceCallback (void *opaque, int ret);
82 
83 typedef struct MpegTSSectionFilter {
86  int last_ver;
87  unsigned crc;
88  unsigned last_crc;
90  unsigned int check_crc : 1;
91  unsigned int end_of_section_reached : 1;
93  void *opaque;
95 
96 struct MpegTSFilter {
97  int pid;
98  int es_id;
99  int last_cc; /* last cc code (-1 if first packet) */
100  int64_t last_pcr;
101  int discard;
103  union {
106  } u;
107 };
108 
109 #define MAX_PIDS_PER_PROGRAM 64
110 struct Program {
111  unsigned int id; // program id/service id
112  unsigned int nb_pids;
113  unsigned int pids[MAX_PIDS_PER_PROGRAM];
114 
115  /** have we found pmt for this program */
117 };
118 
120  const AVClass *class;
121  /* user data */
123  /** raw packet size, including FEC if present */
125 
126  int64_t pos47_full;
127 
128  /** if true, all pids are analyzed to find streams */
130 
131  /** compute exact PCR for each transport stream packet */
133 
134  /** fix dvb teletext pts */
136 
137  int64_t cur_pcr; /**< used to estimate the exact PCR */
138  int64_t pcr_incr; /**< used to estimate the exact PCR */
139 
140  /* data needed to handle file based ts */
141  /** stop parsing loop */
143  /** packet containing Audio/Video data */
145  /** to detect seek */
146  int64_t last_pos;
147 
151 
153 
156 
157  /******************************************/
158  /* private mpegts data */
159  /* scan context */
160  /** structure to keep track of Program->pids mapping */
161  unsigned int nb_prg;
162  struct Program *prg;
163 
165  /** filters for various streams specified by PMT + for the PAT and PMT */
168 
171 };
172 
173 #define MPEGTS_OPTIONS \
174  { "resync_size", "set size limit for looking up a new synchronization", offsetof(MpegTSContext, resync_size), AV_OPT_TYPE_INT, { .i64 = MAX_RESYNC_SIZE}, 0, INT_MAX, AV_OPT_FLAG_DECODING_PARAM }
175 
176 static const AVOption options[] = {
178  {"fix_teletext_pts", "try to fix pts values of dvb teletext streams", offsetof(MpegTSContext, fix_teletext_pts), AV_OPT_TYPE_BOOL,
179  {.i64 = 1}, 0, 1, AV_OPT_FLAG_DECODING_PARAM },
180  {"ts_packetsize", "output option carrying the raw packet size", offsetof(MpegTSContext, raw_packet_size), AV_OPT_TYPE_INT,
182  {"scan_all_pmts", "scan and combine all PMTs", offsetof(MpegTSContext, scan_all_pmts), AV_OPT_TYPE_BOOL,
183  {.i64 = -1}, -1, 1, AV_OPT_FLAG_DECODING_PARAM },
184  {"skip_unknown_pmt", "skip PMTs for programs not advertised in the PAT", offsetof(MpegTSContext, skip_unknown_pmt), AV_OPT_TYPE_BOOL,
185  {.i64 = 0}, 0, 1, AV_OPT_FLAG_DECODING_PARAM },
186  {"merge_pmt_versions", "re-use streams when PMT's version/pids change", offsetof(MpegTSContext, merge_pmt_versions), AV_OPT_TYPE_BOOL,
187  {.i64 = 0}, 0, 1, AV_OPT_FLAG_DECODING_PARAM },
188  {"skip_changes", "skip changing / adding streams / programs", offsetof(MpegTSContext, skip_changes), AV_OPT_TYPE_BOOL,
189  {.i64 = 0}, 0, 1, 0 },
190  {"skip_clear", "skip clearing programs", offsetof(MpegTSContext, skip_clear), AV_OPT_TYPE_BOOL,
191  {.i64 = 0}, 0, 1, 0 },
192  { NULL },
193 };
194 
195 static const AVClass mpegts_class = {
196  .class_name = "mpegts demuxer",
197  .item_name = av_default_item_name,
198  .option = options,
199  .version = LIBAVUTIL_VERSION_INT,
200 };
201 
202 static const AVOption raw_options[] = {
204  { "compute_pcr", "compute exact PCR for each transport stream packet",
205  offsetof(MpegTSContext, mpeg2ts_compute_pcr), AV_OPT_TYPE_BOOL,
206  { .i64 = 0 }, 0, 1, AV_OPT_FLAG_DECODING_PARAM },
207  { "ts_packetsize", "output option carrying the raw packet size",
208  offsetof(MpegTSContext, raw_packet_size), AV_OPT_TYPE_INT,
209  { .i64 = 0 }, 0, 0,
211  { NULL },
212 };
213 
214 static const AVClass mpegtsraw_class = {
215  .class_name = "mpegtsraw demuxer",
216  .item_name = av_default_item_name,
217  .option = raw_options,
218  .version = LIBAVUTIL_VERSION_INT,
219 };
220 
221 /* TS stream handling */
222 
229 };
230 
231 /* enough for PES header + length */
232 #define PES_START_SIZE 6
233 #define PES_HEADER_SIZE 9
234 #define MAX_PES_HEADER_SIZE (9 + 255)
235 
236 typedef struct PESContext {
237  int pid;
238  int pcr_pid; /**< if -1 then all packets containing PCR are considered */
243  AVStream *sub_st; /**< stream for the embedded AC3 stream in HDMV TrueHD */
245  /* used to get the format */
247  int flags; /**< copied to the AVPacket flags */
252  int64_t pts, dts;
253  int64_t ts_packet_pos; /**< position of first TS packet of this PES packet */
258 } PESContext;
259 
261 
262 static struct Program * get_program(MpegTSContext *ts, unsigned int programid)
263 {
264  int i;
265  for (i = 0; i < ts->nb_prg; i++) {
266  if (ts->prg[i].id == programid) {
267  return &ts->prg[i];
268  }
269  }
270  return NULL;
271 }
272 
273 static void clear_avprogram(MpegTSContext *ts, unsigned int programid)
274 {
275  AVProgram *prg = NULL;
276  int i;
277 
278  for (i = 0; i < ts->stream->nb_programs; i++)
279  if (ts->stream->programs[i]->id == programid) {
280  prg = ts->stream->programs[i];
281  break;
282  }
283  if (!prg)
284  return;
285  prg->nb_stream_indexes = 0;
286 }
287 
288 static void clear_program(MpegTSContext *ts, unsigned int programid)
289 {
290  int i;
291 
292  clear_avprogram(ts, programid);
293  for (i = 0; i < ts->nb_prg; i++)
294  if (ts->prg[i].id == programid) {
295  ts->prg[i].nb_pids = 0;
296  ts->prg[i].pmt_found = 0;
297  }
298 }
299 
301 {
302  av_freep(&ts->prg);
303  ts->nb_prg = 0;
304 }
305 
306 static void add_pat_entry(MpegTSContext *ts, unsigned int programid)
307 {
308  struct Program *p;
309  if (av_reallocp_array(&ts->prg, ts->nb_prg + 1, sizeof(*ts->prg)) < 0) {
310  ts->nb_prg = 0;
311  return;
312  }
313  p = &ts->prg[ts->nb_prg];
314  p->id = programid;
315  p->nb_pids = 0;
316  p->pmt_found = 0;
317  ts->nb_prg++;
318 }
319 
320 static void add_pid_to_pmt(MpegTSContext *ts, unsigned int programid,
321  unsigned int pid)
322 {
323  struct Program *p = get_program(ts, programid);
324  int i;
325  if (!p)
326  return;
327 
328  if (p->nb_pids >= MAX_PIDS_PER_PROGRAM)
329  return;
330 
331  for (i = 0; i < p->nb_pids; i++)
332  if (p->pids[i] == pid)
333  return;
334 
335  p->pids[p->nb_pids++] = pid;
336 }
337 
338 static void set_pmt_found(MpegTSContext *ts, unsigned int programid)
339 {
340  struct Program *p = get_program(ts, programid);
341  if (!p)
342  return;
343 
344  p->pmt_found = 1;
345 }
346 
347 static void update_av_program_info(AVFormatContext *s, unsigned int programid,
348  unsigned int pid, int version)
349 {
350  int i;
351  for (i = 0; i < s->nb_programs; i++) {
352  AVProgram *program = s->programs[i];
353  if (program->id == programid) {
354  int old_pcr_pid = program->pcr_pid,
355  old_version = program->pmt_version;
356  program->pcr_pid = pid;
357  program->pmt_version = version;
358 
359  if (old_version != -1 && old_version != version) {
361  "detected PMT change (program=%d, version=%d/%d, pcr_pid=0x%x/0x%x)\n",
362  programid, old_version, version, old_pcr_pid, pid);
363  }
364  break;
365  }
366  }
367 }
368 
369 /**
370  * @brief discard_pid() decides if the pid is to be discarded according
371  * to caller's programs selection
372  * @param ts : - TS context
373  * @param pid : - pid
374  * @return 1 if the pid is only comprised in programs that have .discard=AVDISCARD_ALL
375  * 0 otherwise
376  */
377 static int discard_pid(MpegTSContext *ts, unsigned int pid)
378 {
379  int i, j, k;
380  int used = 0, discarded = 0;
381  struct Program *p;
382 
383  /* If none of the programs have .discard=AVDISCARD_ALL then there's
384  * no way we have to discard this packet */
385  for (k = 0; k < ts->stream->nb_programs; k++)
386  if (ts->stream->programs[k]->discard == AVDISCARD_ALL)
387  break;
388  if (k == ts->stream->nb_programs)
389  return 0;
390 
391  for (i = 0; i < ts->nb_prg; i++) {
392  p = &ts->prg[i];
393  for (j = 0; j < p->nb_pids; j++) {
394  if (p->pids[j] != pid)
395  continue;
396  // is program with id p->id set to be discarded?
397  for (k = 0; k < ts->stream->nb_programs; k++) {
398  if (ts->stream->programs[k]->id == p->id) {
399  if (ts->stream->programs[k]->discard == AVDISCARD_ALL)
400  discarded++;
401  else
402  used++;
403  }
404  }
405  }
406  }
407 
408  return !used && discarded;
409 }
410 
411 /**
412  * Assemble PES packets out of TS packets, and then call the "section_cb"
413  * function when they are complete.
414  */
416  const uint8_t *buf, int buf_size, int is_start)
417 {
418  MpegTSSectionFilter *tss = &tss1->u.section_filter;
419  uint8_t *cur_section_buf = NULL;
420  int len, offset;
421 
422  if (is_start) {
423  memcpy(tss->section_buf, buf, buf_size);
424  tss->section_index = buf_size;
425  tss->section_h_size = -1;
426  tss->end_of_section_reached = 0;
427  } else {
428  if (tss->end_of_section_reached)
429  return;
431  if (buf_size < len)
432  len = buf_size;
433  memcpy(tss->section_buf + tss->section_index, buf, len);
434  tss->section_index += len;
435  }
436 
437  offset = 0;
438  cur_section_buf = tss->section_buf;
439  while (cur_section_buf - tss->section_buf < MAX_SECTION_SIZE && cur_section_buf[0] != 0xff) {
440  /* compute section length if possible */
441  if (tss->section_h_size == -1 && tss->section_index - offset >= 3) {
442  len = (AV_RB16(cur_section_buf + 1) & 0xfff) + 3;
443  if (len > MAX_SECTION_SIZE)
444  return;
445  tss->section_h_size = len;
446  }
447 
448  if (tss->section_h_size != -1 &&
449  tss->section_index >= offset + tss->section_h_size) {
450  int crc_valid = 1;
451  tss->end_of_section_reached = 1;
452 
453  if (tss->check_crc) {
454  crc_valid = !av_crc(av_crc_get_table(AV_CRC_32_IEEE), -1, cur_section_buf, tss->section_h_size);
455  if (tss->section_h_size >= 4)
456  tss->crc = AV_RB32(cur_section_buf + tss->section_h_size - 4);
457 
458  if (crc_valid) {
459  ts->crc_validity[ tss1->pid ] = 100;
460  }else if (ts->crc_validity[ tss1->pid ] > -10) {
461  ts->crc_validity[ tss1->pid ]--;
462  }else
463  crc_valid = 2;
464  }
465  if (crc_valid) {
466  tss->section_cb(tss1, cur_section_buf, tss->section_h_size);
467  if (crc_valid != 1)
468  tss->last_ver = -1;
469  }
470 
471  cur_section_buf += tss->section_h_size;
472  offset += tss->section_h_size;
473  tss->section_h_size = -1;
474  } else {
475  tss->section_h_size = -1;
476  tss->end_of_section_reached = 0;
477  break;
478  }
479  }
480 }
481 
482 static MpegTSFilter *mpegts_open_filter(MpegTSContext *ts, unsigned int pid,
483  enum MpegTSFilterType type)
484 {
486 
487  av_log(ts->stream, AV_LOG_TRACE, "Filter: pid=0x%x type=%d\n", pid, type);
488 
489  if (pid >= NB_PID_MAX || ts->pids[pid])
490  return NULL;
491  filter = av_mallocz(sizeof(MpegTSFilter));
492  if (!filter)
493  return NULL;
494  ts->pids[pid] = filter;
495 
496  filter->type = type;
497  filter->pid = pid;
498  filter->es_id = -1;
499  filter->last_cc = -1;
500  filter->last_pcr= -1;
501 
502  return filter;
503 }
504 
506  unsigned int pid,
507  SectionCallback *section_cb,
508  void *opaque,
509  int check_crc)
510 {
512  MpegTSSectionFilter *sec;
513  uint8_t *section_buf = av_mallocz(MAX_SECTION_SIZE);
514 
515  if (!section_buf)
516  return NULL;
517 
518  if (!(filter = mpegts_open_filter(ts, pid, MPEGTS_SECTION))) {
519  av_free(section_buf);
520  return NULL;
521  }
522  sec = &filter->u.section_filter;
523  sec->section_cb = section_cb;
524  sec->opaque = opaque;
525  sec->section_buf = section_buf;
526  sec->check_crc = check_crc;
527  sec->last_ver = -1;
528 
529  return filter;
530 }
531 
532 static MpegTSFilter *mpegts_open_pes_filter(MpegTSContext *ts, unsigned int pid,
533  PESCallback *pes_cb,
534  void *opaque)
535 {
537  MpegTSPESFilter *pes;
538 
539  if (!(filter = mpegts_open_filter(ts, pid, MPEGTS_PES)))
540  return NULL;
541 
542  pes = &filter->u.pes_filter;
543  pes->pes_cb = pes_cb;
544  pes->opaque = opaque;
545  return filter;
546 }
547 
548 static MpegTSFilter *mpegts_open_pcr_filter(MpegTSContext *ts, unsigned int pid)
549 {
550  return mpegts_open_filter(ts, pid, MPEGTS_PCR);
551 }
552 
554 {
555  int pid;
556 
557  pid = filter->pid;
558  if (filter->type == MPEGTS_SECTION)
559  av_freep(&filter->u.section_filter.section_buf);
560  else if (filter->type == MPEGTS_PES) {
561  PESContext *pes = filter->u.pes_filter.opaque;
562  av_buffer_unref(&pes->buffer);
563  /* referenced private data will be freed later in
564  * avformat_close_input (pes->st->priv_data == pes) */
565  if (!pes->st || pes->merged_st) {
566  av_freep(&filter->u.pes_filter.opaque);
567  }
568  }
569 
570  av_free(filter);
571  ts->pids[pid] = NULL;
572 }
573 
574 static int analyze(const uint8_t *buf, int size, int packet_size,
575  int probe)
576 {
577  int stat[TS_MAX_PACKET_SIZE];
578  int stat_all = 0;
579  int i;
580  int best_score = 0;
581 
582  memset(stat, 0, packet_size * sizeof(*stat));
583 
584  for (i = 0; i < size - 3; i++) {
585  if (buf[i] == 0x47) {
586  int pid = AV_RB16(buf+1) & 0x1FFF;
587  int asc = buf[i + 3] & 0x30;
588  if (!probe || pid == 0x1FFF || asc) {
589  int x = i % packet_size;
590  stat[x]++;
591  stat_all++;
592  if (stat[x] > best_score) {
593  best_score = stat[x];
594  }
595  }
596  }
597  }
598 
599  return best_score - FFMAX(stat_all - 10*best_score, 0)/10;
600 }
601 
602 /* autodetect fec presence */
604 {
605  int score, fec_score, dvhs_score;
606  int margin;
607  int ret;
608 
609  /*init buffer to store stream for probing */
610  uint8_t buf[PROBE_PACKET_MAX_BUF] = {0};
611  int buf_size = 0;
612 
613  while (buf_size < PROBE_PACKET_MAX_BUF) {
614  ret = avio_read_partial(s->pb, buf + buf_size, PROBE_PACKET_MAX_BUF - buf_size);
615  if (ret < 0)
616  return AVERROR_INVALIDDATA;
617  buf_size += ret;
618 
619  score = analyze(buf, buf_size, TS_PACKET_SIZE, 0);
620  dvhs_score = analyze(buf, buf_size, TS_DVHS_PACKET_SIZE, 0);
621  fec_score = analyze(buf, buf_size, TS_FEC_PACKET_SIZE, 0);
622  av_log(s, AV_LOG_TRACE, "Probe: %d, score: %d, dvhs_score: %d, fec_score: %d \n",
623  buf_size, score, dvhs_score, fec_score);
624 
625  margin = mid_pred(score, fec_score, dvhs_score);
626 
627  if (buf_size < PROBE_PACKET_MAX_BUF)
628  margin += PROBE_PACKET_MARGIN; /*if buffer not filled */
629 
630  if (score > margin)
631  return TS_PACKET_SIZE;
632  else if (dvhs_score > margin)
633  return TS_DVHS_PACKET_SIZE;
634  else if (fec_score > margin)
635  return TS_FEC_PACKET_SIZE;
636  }
637  return AVERROR_INVALIDDATA;
638 }
639 
640 typedef struct SectionHeader {
642  uint16_t id;
646 } SectionHeader;
647 
649 {
650  if (h->version == tssf->last_ver && tssf->last_crc == tssf->crc)
651  return 1;
652 
653  tssf->last_ver = h->version;
654  tssf->last_crc = tssf->crc;
655 
656  return 0;
657 }
658 
659 static inline int get8(const uint8_t **pp, const uint8_t *p_end)
660 {
661  const uint8_t *p;
662  int c;
663 
664  p = *pp;
665  if (p >= p_end)
666  return AVERROR_INVALIDDATA;
667  c = *p++;
668  *pp = p;
669  return c;
670 }
671 
672 static inline int get16(const uint8_t **pp, const uint8_t *p_end)
673 {
674  const uint8_t *p;
675  int c;
676 
677  p = *pp;
678  if (1 >= p_end - p)
679  return AVERROR_INVALIDDATA;
680  c = AV_RB16(p);
681  p += 2;
682  *pp = p;
683  return c;
684 }
685 
686 /* read and allocate a DVB string preceded by its length */
687 static char *getstr8(const uint8_t **pp, const uint8_t *p_end)
688 {
689  int len;
690  const uint8_t *p;
691  char *str;
692 
693  p = *pp;
694  len = get8(&p, p_end);
695  if (len < 0)
696  return NULL;
697  if (len > p_end - p)
698  return NULL;
699 #if CONFIG_ICONV
700  if (len) {
701  const char *encodings[] = {
702  "ISO6937", "ISO-8859-5", "ISO-8859-6", "ISO-8859-7",
703  "ISO-8859-8", "ISO-8859-9", "ISO-8859-10", "ISO-8859-11",
704  "", "ISO-8859-13", "ISO-8859-14", "ISO-8859-15", "", "", "", "",
705  "", "UCS-2BE", "KSC_5601", "GB2312", "UCS-2BE", "UTF-8", "", "",
706  "", "", "", "", "", "", "", ""
707  };
708  iconv_t cd;
709  char *in, *out;
710  size_t inlen = len, outlen = inlen * 6 + 1;
711  if (len >= 3 && p[0] == 0x10 && !p[1] && p[2] && p[2] <= 0xf && p[2] != 0xc) {
712  char iso8859[12];
713  snprintf(iso8859, sizeof(iso8859), "ISO-8859-%d", p[2]);
714  inlen -= 3;
715  in = (char *)p + 3;
716  cd = iconv_open("UTF-8", iso8859);
717  } else if (p[0] < 0x20) {
718  inlen -= 1;
719  in = (char *)p + 1;
720  cd = iconv_open("UTF-8", encodings[*p]);
721  } else {
722  in = (char *)p;
723  cd = iconv_open("UTF-8", encodings[0]);
724  }
725  if (cd == (iconv_t)-1)
726  goto no_iconv;
727  str = out = av_malloc(outlen);
728  if (!str) {
729  iconv_close(cd);
730  return NULL;
731  }
732  if (iconv(cd, &in, &inlen, &out, &outlen) == -1) {
733  iconv_close(cd);
734  av_freep(&str);
735  goto no_iconv;
736  }
737  iconv_close(cd);
738  *out = 0;
739  *pp = p + len;
740  return str;
741  }
742 no_iconv:
743 #endif
744  str = av_malloc(len + 1);
745  if (!str)
746  return NULL;
747  memcpy(str, p, len);
748  str[len] = '\0';
749  p += len;
750  *pp = p;
751  return str;
752 }
753 
755  const uint8_t **pp, const uint8_t *p_end)
756 {
757  int val;
758 
759  val = get8(pp, p_end);
760  if (val < 0)
761  return val;
762  h->tid = val;
763  *pp += 2;
764  val = get16(pp, p_end);
765  if (val < 0)
766  return val;
767  h->id = val;
768  val = get8(pp, p_end);
769  if (val < 0)
770  return val;
771  h->version = (val >> 1) & 0x1f;
772  val = get8(pp, p_end);
773  if (val < 0)
774  return val;
775  h->sec_num = val;
776  val = get8(pp, p_end);
777  if (val < 0)
778  return val;
779  h->last_sec_num = val;
780  return 0;
781 }
782 
783 typedef struct StreamType {
784  uint32_t stream_type;
787 } StreamType;
788 
789 static const StreamType ISO_types[] = {
796  /* Makito encoder sets stream type 0x11 for AAC,
797  * so auto-detect LOAS/LATM instead of hardcoding it. */
798 #if !CONFIG_LOAS_DEMUXER
799  { 0x11, AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_AAC_LATM }, /* LATM syntax */
800 #endif
810  { 0 },
811 };
812 
813 static const StreamType HDMV_types[] = {
819  { 0x85, AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_DTS }, /* DTS HD */
820  { 0x86, AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_DTS }, /* DTS HD MASTER*/
821  { 0xa1, AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_EAC3 }, /* E-AC3 Secondary Audio */
822  { 0xa2, AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_DTS }, /* DTS Express Secondary Audio */
825  { 0 },
826 };
827 
828 /* SCTE types */
829 static const StreamType SCTE_types[] = {
831  { 0 },
832 };
833 
834 /* ATSC ? */
835 static const StreamType MISC_types[] = {
838  { 0 },
839 };
840 
841 static const StreamType REGD_types[] = {
842  { MKTAG('d', 'r', 'a', 'c'), AVMEDIA_TYPE_VIDEO, AV_CODEC_ID_DIRAC },
843  { MKTAG('A', 'C', '-', '3'), AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_AC3 },
844  { MKTAG('B', 'S', 'S', 'D'), AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_S302M },
845  { MKTAG('D', 'T', 'S', '1'), AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_DTS },
846  { MKTAG('D', 'T', 'S', '2'), AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_DTS },
847  { MKTAG('D', 'T', 'S', '3'), AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_DTS },
848  { MKTAG('E', 'A', 'C', '3'), AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_EAC3 },
849  { MKTAG('H', 'E', 'V', 'C'), AVMEDIA_TYPE_VIDEO, AV_CODEC_ID_HEVC },
850  { MKTAG('K', 'L', 'V', 'A'), AVMEDIA_TYPE_DATA, AV_CODEC_ID_SMPTE_KLV },
851  { MKTAG('I', 'D', '3', ' '), AVMEDIA_TYPE_DATA, AV_CODEC_ID_TIMED_ID3 },
852  { MKTAG('V', 'C', '-', '1'), AVMEDIA_TYPE_VIDEO, AV_CODEC_ID_VC1 },
853  { MKTAG('O', 'p', 'u', 's'), AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_OPUS },
854  { 0 },
855 };
856 
857 static const StreamType METADATA_types[] = {
858  { MKTAG('K','L','V','A'), AVMEDIA_TYPE_DATA, AV_CODEC_ID_SMPTE_KLV },
859  { MKTAG('I','D','3',' '), AVMEDIA_TYPE_DATA, AV_CODEC_ID_TIMED_ID3 },
860  { 0 },
861 };
862 
863 /* descriptor present */
864 static const StreamType DESC_types[] = {
865  { 0x6a, AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_AC3 }, /* AC-3 descriptor */
866  { 0x7a, AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_EAC3 }, /* E-AC-3 descriptor */
869  { 0x59, AVMEDIA_TYPE_SUBTITLE, AV_CODEC_ID_DVB_SUBTITLE }, /* subtitling descriptor */
870  { 0 },
871 };
872 
874  uint32_t stream_type,
875  const StreamType *types)
876 {
877  for (; types->stream_type; types++)
878  if (stream_type == types->stream_type) {
879  if (st->codecpar->codec_type != types->codec_type ||
880  st->codecpar->codec_id != types->codec_id) {
881  st->codecpar->codec_type = types->codec_type;
882  st->codecpar->codec_id = types->codec_id;
883  st->internal->need_context_update = 1;
884  }
885  st->request_probe = 0;
886  return;
887  }
888 }
889 
891  uint32_t stream_type, uint32_t prog_reg_desc)
892 {
893  int old_codec_type = st->codecpar->codec_type;
894  int old_codec_id = st->codecpar->codec_id;
895  int old_codec_tag = st->codecpar->codec_tag;
896 
897  if (avcodec_is_open(st->internal->avctx)) {
898  av_log(pes->stream, AV_LOG_DEBUG, "cannot set stream info, internal codec is open\n");
899  return 0;
900  }
901 
902  avpriv_set_pts_info(st, 33, 1, 90000);
903  st->priv_data = pes;
907  pes->st = st;
908  pes->stream_type = stream_type;
909 
910  av_log(pes->stream, AV_LOG_DEBUG,
911  "stream=%d stream_type=%x pid=%x prog_reg_desc=%.4s\n",
912  st->index, pes->stream_type, pes->pid, (char *)&prog_reg_desc);
913 
914  st->codecpar->codec_tag = pes->stream_type;
915 
917  if (pes->stream_type == 4 || pes->stream_type == 0x0f)
918  st->request_probe = 50;
919  if ((prog_reg_desc == AV_RL32("HDMV") ||
920  prog_reg_desc == AV_RL32("HDPR")) &&
923  if (pes->stream_type == 0x83) {
924  // HDMV TrueHD streams also contain an AC3 coded version of the
925  // audio track - add a second stream for this
926  AVStream *sub_st;
927  // priv_data cannot be shared between streams
928  PESContext *sub_pes = av_malloc(sizeof(*sub_pes));
929  if (!sub_pes)
930  return AVERROR(ENOMEM);
931  memcpy(sub_pes, pes, sizeof(*sub_pes));
932 
933  sub_st = avformat_new_stream(pes->stream, NULL);
934  if (!sub_st) {
935  av_free(sub_pes);
936  return AVERROR(ENOMEM);
937  }
938 
939  sub_st->id = pes->pid;
940  avpriv_set_pts_info(sub_st, 33, 1, 90000);
941  sub_st->priv_data = sub_pes;
943  sub_st->codecpar->codec_id = AV_CODEC_ID_AC3;
945  sub_pes->sub_st = pes->sub_st = sub_st;
946  }
947  }
948  if (st->codecpar->codec_id == AV_CODEC_ID_NONE)
950  if (st->codecpar->codec_id == AV_CODEC_ID_NONE) {
951  st->codecpar->codec_id = old_codec_id;
952  st->codecpar->codec_type = old_codec_type;
953  }
954  if ((st->codecpar->codec_id == AV_CODEC_ID_NONE ||
955  (st->request_probe > 0 && st->request_probe < AVPROBE_SCORE_STREAM_RETRY / 5)) &&
956  st->probe_packets > 0 &&
957  stream_type == STREAM_TYPE_PRIVATE_DATA) {
961  }
962 
963  /* queue a context update if properties changed */
964  if (old_codec_type != st->codecpar->codec_type ||
965  old_codec_id != st->codecpar->codec_id ||
966  old_codec_tag != st->codecpar->codec_tag)
967  st->internal->need_context_update = 1;
968 
969  return 0;
970 }
971 
973 {
974  pes->pts = AV_NOPTS_VALUE;
975  pes->dts = AV_NOPTS_VALUE;
976  pes->data_index = 0;
977  pes->flags = 0;
978  av_buffer_unref(&pes->buffer);
979 }
980 
981 static void new_data_packet(const uint8_t *buffer, int len, AVPacket *pkt)
982 {
984  pkt->data = (uint8_t *)buffer;
985  pkt->size = len;
986 }
987 
989 {
990  uint8_t *sd;
991 
993 
994  pkt->buf = pes->buffer;
995  pkt->data = pes->buffer->data;
996  pkt->size = pes->data_index;
997 
998  if (pes->total_size != MAX_PES_PAYLOAD &&
999  pes->pes_header_size + pes->data_index != pes->total_size +
1000  PES_START_SIZE) {
1001  av_log(pes->stream, AV_LOG_WARNING, "PES packet size mismatch\n");
1002  pes->flags |= AV_PKT_FLAG_CORRUPT;
1003  }
1004  memset(pkt->data + pkt->size, 0, AV_INPUT_BUFFER_PADDING_SIZE);
1005 
1006  // Separate out the AC3 substream from an HDMV combined TrueHD/AC3 PID
1007  if (pes->sub_st && pes->stream_type == 0x83 && pes->extended_stream_id == 0x76)
1008  pkt->stream_index = pes->sub_st->index;
1009  else
1010  pkt->stream_index = pes->st->index;
1011  pkt->pts = pes->pts;
1012  pkt->dts = pes->dts;
1013  /* store position of first TS packet of this PES packet */
1014  pkt->pos = pes->ts_packet_pos;
1015  pkt->flags = pes->flags;
1016 
1017  pes->buffer = NULL;
1019 
1021  if (!sd)
1022  return AVERROR(ENOMEM);
1023  *sd = pes->stream_id;
1024 
1025  return 0;
1026 }
1027 
1028 static uint64_t get_ts64(GetBitContext *gb, int bits)
1029 {
1030  if (get_bits_left(gb) < bits)
1031  return AV_NOPTS_VALUE;
1032  return get_bits64(gb, bits);
1033 }
1034 
1036  const uint8_t *buf, int buf_size)
1037 {
1038  GetBitContext gb;
1039  int au_start_flag = 0, au_end_flag = 0, ocr_flag = 0, idle_flag = 0;
1040  int padding_flag = 0, padding_bits = 0, inst_bitrate_flag = 0;
1041  int dts_flag = -1, cts_flag = -1;
1042  int64_t dts = AV_NOPTS_VALUE, cts = AV_NOPTS_VALUE;
1043  uint8_t buf_padded[128 + AV_INPUT_BUFFER_PADDING_SIZE];
1044  int buf_padded_size = FFMIN(buf_size, sizeof(buf_padded) - AV_INPUT_BUFFER_PADDING_SIZE);
1045 
1046  memcpy(buf_padded, buf, buf_padded_size);
1047 
1048  init_get_bits(&gb, buf_padded, buf_padded_size * 8);
1049 
1050  if (sl->use_au_start)
1051  au_start_flag = get_bits1(&gb);
1052  if (sl->use_au_end)
1053  au_end_flag = get_bits1(&gb);
1054  if (!sl->use_au_start && !sl->use_au_end)
1055  au_start_flag = au_end_flag = 1;
1056  if (sl->ocr_len > 0)
1057  ocr_flag = get_bits1(&gb);
1058  if (sl->use_idle)
1059  idle_flag = get_bits1(&gb);
1060  if (sl->use_padding)
1061  padding_flag = get_bits1(&gb);
1062  if (padding_flag)
1063  padding_bits = get_bits(&gb, 3);
1064 
1065  if (!idle_flag && (!padding_flag || padding_bits != 0)) {
1066  if (sl->packet_seq_num_len)
1068  if (sl->degr_prior_len)
1069  if (get_bits1(&gb))
1070  skip_bits(&gb, sl->degr_prior_len);
1071  if (ocr_flag)
1072  skip_bits_long(&gb, sl->ocr_len);
1073  if (au_start_flag) {
1074  if (sl->use_rand_acc_pt)
1075  get_bits1(&gb);
1076  if (sl->au_seq_num_len > 0)
1077  skip_bits_long(&gb, sl->au_seq_num_len);
1078  if (sl->use_timestamps) {
1079  dts_flag = get_bits1(&gb);
1080  cts_flag = get_bits1(&gb);
1081  }
1082  }
1083  if (sl->inst_bitrate_len)
1084  inst_bitrate_flag = get_bits1(&gb);
1085  if (dts_flag == 1)
1086  dts = get_ts64(&gb, sl->timestamp_len);
1087  if (cts_flag == 1)
1088  cts = get_ts64(&gb, sl->timestamp_len);
1089  if (sl->au_len > 0)
1090  skip_bits_long(&gb, sl->au_len);
1091  if (inst_bitrate_flag)
1092  skip_bits_long(&gb, sl->inst_bitrate_len);
1093  }
1094 
1095  if (dts != AV_NOPTS_VALUE)
1096  pes->dts = dts;
1097  if (cts != AV_NOPTS_VALUE)
1098  pes->pts = cts;
1099 
1100  if (sl->timestamp_len && sl->timestamp_res)
1102 
1103  return (get_bits_count(&gb) + 7) >> 3;
1104 }
1105 
1107 {
1109  if (!ts->pools[index]) {
1110  int pool_size = FFMIN(MAX_PES_PAYLOAD + AV_INPUT_BUFFER_PADDING_SIZE, 2 << index);
1111  ts->pools[index] = av_buffer_pool_init(pool_size, NULL);
1112  if (!ts->pools[index])
1113  return NULL;
1114  }
1115  return av_buffer_pool_get(ts->pools[index]);
1116 }
1117 
1118 /* return non zero if a packet could be constructed */
1120  const uint8_t *buf, int buf_size, int is_start,
1121  int64_t pos)
1122 {
1123  PESContext *pes = filter->u.pes_filter.opaque;
1124  MpegTSContext *ts = pes->ts;
1125  const uint8_t *p;
1126  int ret, len, code;
1127 
1128  if (!ts->pkt)
1129  return 0;
1130 
1131  if (is_start) {
1132  if (pes->state == MPEGTS_PAYLOAD && pes->data_index > 0) {
1133  ret = new_pes_packet(pes, ts->pkt);
1134  if (ret < 0)
1135  return ret;
1136  ts->stop_parse = 1;
1137  } else {
1139  }
1140  pes->state = MPEGTS_HEADER;
1141  pes->ts_packet_pos = pos;
1142  }
1143  p = buf;
1144  while (buf_size > 0) {
1145  switch (pes->state) {
1146  case MPEGTS_HEADER:
1147  len = PES_START_SIZE - pes->data_index;
1148  if (len > buf_size)
1149  len = buf_size;
1150  memcpy(pes->header + pes->data_index, p, len);
1151  pes->data_index += len;
1152  p += len;
1153  buf_size -= len;
1154  if (pes->data_index == PES_START_SIZE) {
1155  /* we got all the PES or section header. We can now
1156  * decide */
1157  if (pes->header[0] == 0x00 && pes->header[1] == 0x00 &&
1158  pes->header[2] == 0x01) {
1159  /* it must be an MPEG-2 PES stream */
1160  code = pes->header[3] | 0x100;
1161  av_log(pes->stream, AV_LOG_TRACE, "pid=%x pes_code=%#x\n", pes->pid,
1162  code);
1163  pes->stream_id = pes->header[3];
1164 
1165  if ((pes->st && pes->st->discard == AVDISCARD_ALL &&
1166  (!pes->sub_st ||
1167  pes->sub_st->discard == AVDISCARD_ALL)) ||
1168  code == 0x1be) /* padding_stream */
1169  goto skip;
1170 
1171  /* stream not present in PMT */
1172  if (!pes->st) {
1173  if (ts->skip_changes)
1174  goto skip;
1175  if (ts->merge_pmt_versions)
1176  goto skip; /* wait for PMT to merge new stream */
1177 
1178  pes->st = avformat_new_stream(ts->stream, NULL);
1179  if (!pes->st)
1180  return AVERROR(ENOMEM);
1181  pes->st->id = pes->pid;
1182  mpegts_set_stream_info(pes->st, pes, 0, 0);
1183  }
1184 
1185  pes->total_size = AV_RB16(pes->header + 4);
1186  /* NOTE: a zero total size means the PES size is
1187  * unbounded */
1188  if (!pes->total_size)
1189  pes->total_size = MAX_PES_PAYLOAD;
1190 
1191  /* allocate pes buffer */
1192  pes->buffer = buffer_pool_get(ts, pes->total_size);
1193  if (!pes->buffer)
1194  return AVERROR(ENOMEM);
1195 
1196  if (code != 0x1bc && code != 0x1bf && /* program_stream_map, private_stream_2 */
1197  code != 0x1f0 && code != 0x1f1 && /* ECM, EMM */
1198  code != 0x1ff && code != 0x1f2 && /* program_stream_directory, DSMCC_stream */
1199  code != 0x1f8) { /* ITU-T Rec. H.222.1 type E stream */
1200  pes->state = MPEGTS_PESHEADER;
1201  if (pes->st->codecpar->codec_id == AV_CODEC_ID_NONE && !pes->st->request_probe) {
1202  av_log(pes->stream, AV_LOG_TRACE,
1203  "pid=%x stream_type=%x probing\n",
1204  pes->pid,
1205  pes->stream_type);
1206  pes->st->request_probe = 1;
1207  }
1208  } else {
1209  pes->pes_header_size = 6;
1210  pes->state = MPEGTS_PAYLOAD;
1211  pes->data_index = 0;
1212  }
1213  } else {
1214  /* otherwise, it should be a table */
1215  /* skip packet */
1216 skip:
1217  pes->state = MPEGTS_SKIP;
1218  continue;
1219  }
1220  }
1221  break;
1222  /**********************************************/
1223  /* PES packing parsing */
1224  case MPEGTS_PESHEADER:
1225  len = PES_HEADER_SIZE - pes->data_index;
1226  if (len < 0)
1227  return AVERROR_INVALIDDATA;
1228  if (len > buf_size)
1229  len = buf_size;
1230  memcpy(pes->header + pes->data_index, p, len);
1231  pes->data_index += len;
1232  p += len;
1233  buf_size -= len;
1234  if (pes->data_index == PES_HEADER_SIZE) {
1235  pes->pes_header_size = pes->header[8] + 9;
1237  }
1238  break;
1239  case MPEGTS_PESHEADER_FILL:
1240  len = pes->pes_header_size - pes->data_index;
1241  if (len < 0)
1242  return AVERROR_INVALIDDATA;
1243  if (len > buf_size)
1244  len = buf_size;
1245  memcpy(pes->header + pes->data_index, p, len);
1246  pes->data_index += len;
1247  p += len;
1248  buf_size -= len;
1249  if (pes->data_index == pes->pes_header_size) {
1250  const uint8_t *r;
1251  unsigned int flags, pes_ext, skip;
1252 
1253  flags = pes->header[7];
1254  r = pes->header + 9;
1255  pes->pts = AV_NOPTS_VALUE;
1256  pes->dts = AV_NOPTS_VALUE;
1257  if ((flags & 0xc0) == 0x80) {
1258  pes->dts = pes->pts = ff_parse_pes_pts(r);
1259  r += 5;
1260  } else if ((flags & 0xc0) == 0xc0) {
1261  pes->pts = ff_parse_pes_pts(r);
1262  r += 5;
1263  pes->dts = ff_parse_pes_pts(r);
1264  r += 5;
1265  }
1266  pes->extended_stream_id = -1;
1267  if (flags & 0x01) { /* PES extension */
1268  pes_ext = *r++;
1269  /* Skip PES private data, program packet sequence counter and P-STD buffer */
1270  skip = (pes_ext >> 4) & 0xb;
1271  skip += skip & 0x9;
1272  r += skip;
1273  if ((pes_ext & 0x41) == 0x01 &&
1274  (r + 2) <= (pes->header + pes->pes_header_size)) {
1275  /* PES extension 2 */
1276  if ((r[0] & 0x7f) > 0 && (r[1] & 0x80) == 0)
1277  pes->extended_stream_id = r[1];
1278  }
1279  }
1280 
1281  /* we got the full header. We parse it and get the payload */
1282  pes->state = MPEGTS_PAYLOAD;
1283  pes->data_index = 0;
1284  if (pes->stream_type == 0x12 && buf_size > 0) {
1285  int sl_header_bytes = read_sl_header(pes, &pes->sl, p,
1286  buf_size);
1287  pes->pes_header_size += sl_header_bytes;
1288  p += sl_header_bytes;
1289  buf_size -= sl_header_bytes;
1290  }
1291  if (pes->stream_type == 0x15 && buf_size >= 5) {
1292  /* skip metadata access unit header */
1293  pes->pes_header_size += 5;
1294  p += 5;
1295  buf_size -= 5;
1296  }
1297  if ( pes->ts->fix_teletext_pts
1300  ) {
1301  AVProgram *p = NULL;
1302  int pcr_found = 0;
1303  while ((p = av_find_program_from_stream(pes->stream, p, pes->st->index))) {
1304  if (p->pcr_pid != -1 && p->discard != AVDISCARD_ALL) {
1305  MpegTSFilter *f = pes->ts->pids[p->pcr_pid];
1306  if (f) {
1307  AVStream *st = NULL;
1308  if (f->type == MPEGTS_PES) {
1309  PESContext *pcrpes = f->u.pes_filter.opaque;
1310  if (pcrpes)
1311  st = pcrpes->st;
1312  } else if (f->type == MPEGTS_PCR) {
1313  int i;
1314  for (i = 0; i < p->nb_stream_indexes; i++) {
1315  AVStream *pst = pes->stream->streams[p->stream_index[i]];
1316  if (pst->codecpar->codec_type == AVMEDIA_TYPE_VIDEO)
1317  st = pst;
1318  }
1319  }
1320  if (f->last_pcr != -1 && !f->discard) {
1321  // teletext packets do not always have correct timestamps,
1322  // the standard says they should be handled after 40.6 ms at most,
1323  // and the pcr error to this packet should be no more than 100 ms.
1324  // TODO: we should interpolate the PCR, not just use the last one
1325  int64_t pcr = f->last_pcr / 300;
1326  pcr_found = 1;
1327  if (st) {
1330  }
1331  if (pes->dts == AV_NOPTS_VALUE || pes->dts < pcr) {
1332  pes->pts = pes->dts = pcr;
1333  } else if (pes->st->codecpar->codec_id == AV_CODEC_ID_DVB_TELETEXT &&
1334  pes->dts > pcr + 3654 + 9000) {
1335  pes->pts = pes->dts = pcr + 3654 + 9000;
1336  } else if (pes->st->codecpar->codec_id == AV_CODEC_ID_DVB_SUBTITLE &&
1337  pes->dts > pcr + 10*90000) { //10sec
1338  pes->pts = pes->dts = pcr + 3654 + 9000;
1339  }
1340  break;
1341  }
1342  }
1343  }
1344  }
1345 
1346  if (!pcr_found) {
1348  "Forcing DTS/PTS to be unset for a "
1349  "non-trustworthy PES packet for PID %d as "
1350  "PCR hasn't been received yet.\n",
1351  pes->pid);
1352  pes->dts = pes->pts = AV_NOPTS_VALUE;
1353  }
1354  }
1355  }
1356  break;
1357  case MPEGTS_PAYLOAD:
1358  if (pes->buffer) {
1359  if (pes->data_index > 0 &&
1360  pes->data_index + buf_size > pes->total_size) {
1361  ret = new_pes_packet(pes, ts->pkt);
1362  if (ret < 0)
1363  return ret;
1364  pes->total_size = MAX_PES_PAYLOAD;
1365  pes->buffer = buffer_pool_get(ts, pes->total_size);
1366  if (!pes->buffer)
1367  return AVERROR(ENOMEM);
1368  ts->stop_parse = 1;
1369  } else if (pes->data_index == 0 &&
1370  buf_size > pes->total_size) {
1371  // pes packet size is < ts size packet and pes data is padded with 0xff
1372  // not sure if this is legal in ts but see issue #2392
1373  buf_size = pes->total_size;
1374  }
1375  memcpy(pes->buffer->data + pes->data_index, p, buf_size);
1376  pes->data_index += buf_size;
1377  /* emit complete packets with known packet size
1378  * decreases demuxer delay for infrequent packets like subtitles from
1379  * a couple of seconds to milliseconds for properly muxed files.
1380  * total_size is the number of bytes following pes_packet_length
1381  * in the pes header, i.e. not counting the first PES_START_SIZE bytes */
1382  if (!ts->stop_parse && pes->total_size < MAX_PES_PAYLOAD &&
1383  pes->pes_header_size + pes->data_index == pes->total_size + PES_START_SIZE) {
1384  ts->stop_parse = 1;
1385  ret = new_pes_packet(pes, ts->pkt);
1386  if (ret < 0)
1387  return ret;
1388  }
1389  }
1390  buf_size = 0;
1391  break;
1392  case MPEGTS_SKIP:
1393  buf_size = 0;
1394  break;
1395  }
1396  }
1397 
1398  return 0;
1399 }
1400 
1401 static PESContext *add_pes_stream(MpegTSContext *ts, int pid, int pcr_pid)
1402 {
1403  MpegTSFilter *tss;
1404  PESContext *pes;
1405 
1406  /* if no pid found, then add a pid context */
1407  pes = av_mallocz(sizeof(PESContext));
1408  if (!pes)
1409  return 0;
1410  pes->ts = ts;
1411  pes->stream = ts->stream;
1412  pes->pid = pid;
1413  pes->pcr_pid = pcr_pid;
1414  pes->state = MPEGTS_SKIP;
1415  pes->pts = AV_NOPTS_VALUE;
1416  pes->dts = AV_NOPTS_VALUE;
1417  tss = mpegts_open_pes_filter(ts, pid, mpegts_push_data, pes);
1418  if (!tss) {
1419  av_free(pes);
1420  return 0;
1421  }
1422  return pes;
1423 }
1424 
1425 #define MAX_LEVEL 4
1426 typedef struct MP4DescrParseContext {
1433  int level;
1436 
1438  const uint8_t *buf, unsigned size,
1439  Mp4Descr *descr, int max_descr_count)
1440 {
1441  int ret;
1442  if (size > (1 << 30))
1443  return AVERROR_INVALIDDATA;
1444 
1445  if ((ret = ffio_init_context(&d->pb, (unsigned char *)buf, size, 0,
1446  NULL, NULL, NULL, NULL)) < 0)
1447  return ret;
1448 
1449  d->s = s;
1450  d->level = 0;
1451  d->descr_count = 0;
1452  d->descr = descr;
1453  d->active_descr = NULL;
1454  d->max_descr_count = max_descr_count;
1455 
1456  return 0;
1457 }
1458 
1459 static void update_offsets(AVIOContext *pb, int64_t *off, int *len)
1460 {
1461  int64_t new_off = avio_tell(pb);
1462  (*len) -= new_off - *off;
1463  *off = new_off;
1464 }
1465 
1466 static int parse_mp4_descr(MP4DescrParseContext *d, int64_t off, int len,
1467  int target_tag);
1468 
1469 static int parse_mp4_descr_arr(MP4DescrParseContext *d, int64_t off, int len)
1470 {
1471  while (len > 0) {
1472  int ret = parse_mp4_descr(d, off, len, 0);
1473  if (ret < 0)
1474  return ret;
1475  update_offsets(&d->pb, &off, &len);
1476  }
1477  return 0;
1478 }
1479 
1480 static int parse_MP4IODescrTag(MP4DescrParseContext *d, int64_t off, int len)
1481 {
1482  avio_rb16(&d->pb); // ID
1483  avio_r8(&d->pb);
1484  avio_r8(&d->pb);
1485  avio_r8(&d->pb);
1486  avio_r8(&d->pb);
1487  avio_r8(&d->pb);
1488  update_offsets(&d->pb, &off, &len);
1489  return parse_mp4_descr_arr(d, off, len);
1490 }
1491 
1492 static int parse_MP4ODescrTag(MP4DescrParseContext *d, int64_t off, int len)
1493 {
1494  int id_flags;
1495  if (len < 2)
1496  return 0;
1497  id_flags = avio_rb16(&d->pb);
1498  if (!(id_flags & 0x0020)) { // URL_Flag
1499  update_offsets(&d->pb, &off, &len);
1500  return parse_mp4_descr_arr(d, off, len); // ES_Descriptor[]
1501  } else {
1502  return 0;
1503  }
1504 }
1505 
1506 static int parse_MP4ESDescrTag(MP4DescrParseContext *d, int64_t off, int len)
1507 {
1508  int es_id = 0;
1509  int ret = 0;
1510 
1511  if (d->descr_count >= d->max_descr_count)
1512  return AVERROR_INVALIDDATA;
1513  ff_mp4_parse_es_descr(&d->pb, &es_id);
1514  d->active_descr = d->descr + (d->descr_count++);
1515 
1516  d->active_descr->es_id = es_id;
1517  update_offsets(&d->pb, &off, &len);
1518  if ((ret = parse_mp4_descr(d, off, len, MP4DecConfigDescrTag)) < 0)
1519  return ret;
1520  update_offsets(&d->pb, &off, &len);
1521  if (len > 0)
1522  ret = parse_mp4_descr(d, off, len, MP4SLDescrTag);
1523  d->active_descr = NULL;
1524  return ret;
1525 }
1526 
1528  int len)
1529 {
1530  Mp4Descr *descr = d->active_descr;
1531  if (!descr)
1532  return AVERROR_INVALIDDATA;
1534  if (!descr->dec_config_descr)
1535  return AVERROR(ENOMEM);
1536  descr->dec_config_descr_len = len;
1537  avio_read(&d->pb, descr->dec_config_descr, len);
1538  return 0;
1539 }
1540 
1541 static int parse_MP4SLDescrTag(MP4DescrParseContext *d, int64_t off, int len)
1542 {
1543  Mp4Descr *descr = d->active_descr;
1544  int predefined;
1545  if (!descr)
1546  return AVERROR_INVALIDDATA;
1547 
1548 #define R8_CHECK_CLIP_MAX(dst, maxv) do { \
1549  descr->sl.dst = avio_r8(&d->pb); \
1550  if (descr->sl.dst > maxv) { \
1551  descr->sl.dst = maxv; \
1552  return AVERROR_INVALIDDATA; \
1553  } \
1554 } while (0)
1555 
1556  predefined = avio_r8(&d->pb);
1557  if (!predefined) {
1558  int lengths;
1559  int flags = avio_r8(&d->pb);
1560  descr->sl.use_au_start = !!(flags & 0x80);
1561  descr->sl.use_au_end = !!(flags & 0x40);
1562  descr->sl.use_rand_acc_pt = !!(flags & 0x20);
1563  descr->sl.use_padding = !!(flags & 0x08);
1564  descr->sl.use_timestamps = !!(flags & 0x04);
1565  descr->sl.use_idle = !!(flags & 0x02);
1566  descr->sl.timestamp_res = avio_rb32(&d->pb);
1567  avio_rb32(&d->pb);
1568  R8_CHECK_CLIP_MAX(timestamp_len, 63);
1569  R8_CHECK_CLIP_MAX(ocr_len, 63);
1570  R8_CHECK_CLIP_MAX(au_len, 31);
1571  descr->sl.inst_bitrate_len = avio_r8(&d->pb);
1572  lengths = avio_rb16(&d->pb);
1573  descr->sl.degr_prior_len = lengths >> 12;
1574  descr->sl.au_seq_num_len = (lengths >> 7) & 0x1f;
1575  descr->sl.packet_seq_num_len = (lengths >> 2) & 0x1f;
1576  } else if (!d->predefined_SLConfigDescriptor_seen){
1577  avpriv_report_missing_feature(d->s, "Predefined SLConfigDescriptor");
1579  }
1580  return 0;
1581 }
1582 
1583 static int parse_mp4_descr(MP4DescrParseContext *d, int64_t off, int len,
1584  int target_tag)
1585 {
1586  int tag;
1587  int len1 = ff_mp4_read_descr(d->s, &d->pb, &tag);
1588  int ret = 0;
1589 
1590  update_offsets(&d->pb, &off, &len);
1591  if (len < 0 || len1 > len || len1 <= 0) {
1592  av_log(d->s, AV_LOG_ERROR,
1593  "Tag %x length violation new length %d bytes remaining %d\n",
1594  tag, len1, len);
1595  return AVERROR_INVALIDDATA;
1596  }
1597 
1598  if (d->level++ >= MAX_LEVEL) {
1599  av_log(d->s, AV_LOG_ERROR, "Maximum MP4 descriptor level exceeded\n");
1601  goto done;
1602  }
1603 
1604  if (target_tag && tag != target_tag) {
1605  av_log(d->s, AV_LOG_ERROR, "Found tag %x expected %x\n", tag,
1606  target_tag);
1608  goto done;
1609  }
1610 
1611  switch (tag) {
1612  case MP4IODescrTag:
1613  ret = parse_MP4IODescrTag(d, off, len1);
1614  break;
1615  case MP4ODescrTag:
1616  ret = parse_MP4ODescrTag(d, off, len1);
1617  break;
1618  case MP4ESDescrTag:
1619  ret = parse_MP4ESDescrTag(d, off, len1);
1620  break;
1621  case MP4DecConfigDescrTag:
1622  ret = parse_MP4DecConfigDescrTag(d, off, len1);
1623  break;
1624  case MP4SLDescrTag:
1625  ret = parse_MP4SLDescrTag(d, off, len1);
1626  break;
1627  }
1628 
1629 
1630 done:
1631  d->level--;
1632  avio_seek(&d->pb, off + len1, SEEK_SET);
1633  return ret;
1634 }
1635 
1636 static int mp4_read_iods(AVFormatContext *s, const uint8_t *buf, unsigned size,
1637  Mp4Descr *descr, int *descr_count, int max_descr_count)
1638 {
1640  int ret;
1641 
1642  ret = init_MP4DescrParseContext(&d, s, buf, size, descr, max_descr_count);
1643  if (ret < 0)
1644  return ret;
1645 
1647 
1648  *descr_count = d.descr_count;
1649  return ret;
1650 }
1651 
1652 static int mp4_read_od(AVFormatContext *s, const uint8_t *buf, unsigned size,
1653  Mp4Descr *descr, int *descr_count, int max_descr_count)
1654 {
1656  int ret;
1657 
1658  ret = init_MP4DescrParseContext(&d, s, buf, size, descr, max_descr_count);
1659  if (ret < 0)
1660  return ret;
1661 
1662  ret = parse_mp4_descr_arr(&d, avio_tell(&d.pb), size);
1663 
1664  *descr_count = d.descr_count;
1665  return ret;
1666 }
1667 
1669  int section_len)
1670 {
1671  MpegTSContext *ts = filter->u.section_filter.opaque;
1672  MpegTSSectionFilter *tssf = &filter->u.section_filter;
1673  SectionHeader h;
1674  const uint8_t *p, *p_end;
1675  AVIOContext pb;
1676  int mp4_descr_count = 0;
1677  Mp4Descr mp4_descr[MAX_MP4_DESCR_COUNT] = { { 0 } };
1678  int i, pid;
1679  AVFormatContext *s = ts->stream;
1680 
1681  p_end = section + section_len - 4;
1682  p = section;
1683  if (parse_section_header(&h, &p, p_end) < 0)
1684  return;
1685  if (h.tid != M4OD_TID)
1686  return;
1687  if (skip_identical(&h, tssf))
1688  return;
1689 
1690  mp4_read_od(s, p, (unsigned) (p_end - p), mp4_descr, &mp4_descr_count,
1692 
1693  for (pid = 0; pid < NB_PID_MAX; pid++) {
1694  if (!ts->pids[pid])
1695  continue;
1696  for (i = 0; i < mp4_descr_count; i++) {
1697  PESContext *pes;
1698  AVStream *st;
1699  if (ts->pids[pid]->es_id != mp4_descr[i].es_id)
1700  continue;
1701  if (ts->pids[pid]->type != MPEGTS_PES) {
1702  av_log(s, AV_LOG_ERROR, "pid %x is not PES\n", pid);
1703  continue;
1704  }
1705  pes = ts->pids[pid]->u.pes_filter.opaque;
1706  st = pes->st;
1707  if (!st)
1708  continue;
1709 
1710  pes->sl = mp4_descr[i].sl;
1711 
1712  ffio_init_context(&pb, mp4_descr[i].dec_config_descr,
1713  mp4_descr[i].dec_config_descr_len, 0,
1714  NULL, NULL, NULL, NULL);
1715  ff_mp4_read_dec_config_descr(s, st, &pb);
1716  if (st->codecpar->codec_id == AV_CODEC_ID_AAC &&
1717  st->codecpar->extradata_size > 0)
1718  st->need_parsing = 0;
1719  if (st->codecpar->codec_id == AV_CODEC_ID_H264 &&
1720  st->codecpar->extradata_size > 0)
1721  st->need_parsing = 0;
1722 
1724  st->internal->need_context_update = 1;
1725  }
1726  }
1727  for (i = 0; i < mp4_descr_count; i++)
1728  av_free(mp4_descr[i].dec_config_descr);
1729 }
1730 
1732  int section_len)
1733 {
1734  AVProgram *prg = NULL;
1735  MpegTSContext *ts = filter->u.section_filter.opaque;
1736 
1737  int idx = ff_find_stream_index(ts->stream, filter->pid);
1738  if (idx < 0)
1739  return;
1740 
1741  /**
1742  * In case we receive an SCTE-35 packet before mpegts context is fully
1743  * initialized.
1744  */
1745  if (!ts->pkt)
1746  return;
1747 
1748  new_data_packet(section, section_len, ts->pkt);
1749  ts->pkt->stream_index = idx;
1750  prg = av_find_program_from_stream(ts->stream, NULL, idx);
1751  if (prg && prg->pcr_pid != -1 && prg->discard != AVDISCARD_ALL) {
1752  MpegTSFilter *f = ts->pids[prg->pcr_pid];
1753  if (f && f->last_pcr != -1)
1754  ts->pkt->pts = ts->pkt->dts = f->last_pcr/300;
1755  }
1756  ts->stop_parse = 1;
1757 
1758 }
1759 
1761  1, 0, 1, 1, 2, 2, 2, 3, 3
1762 };
1763 
1764 static const uint8_t opus_stream_cnt[9] = {
1765  1, 1, 1, 2, 2, 3, 4, 4, 5,
1766 };
1767 
1768 static const uint8_t opus_channel_map[8][8] = {
1769  { 0 },
1770  { 0,1 },
1771  { 0,2,1 },
1772  { 0,1,2,3 },
1773  { 0,4,1,2,3 },
1774  { 0,4,1,2,3,5 },
1775  { 0,4,1,2,3,5,6 },
1776  { 0,6,1,2,3,4,5,7 },
1777 };
1778 
1780  const uint8_t **pp, const uint8_t *desc_list_end,
1781  Mp4Descr *mp4_descr, int mp4_descr_count, int pid,
1782  MpegTSContext *ts)
1783 {
1784  const uint8_t *desc_end;
1785  int desc_len, desc_tag, desc_es_id, ext_desc_tag, channels, channel_config_code;
1786  char language[252];
1787  int i;
1788 
1789  desc_tag = get8(pp, desc_list_end);
1790  if (desc_tag < 0)
1791  return AVERROR_INVALIDDATA;
1792  desc_len = get8(pp, desc_list_end);
1793  if (desc_len < 0)
1794  return AVERROR_INVALIDDATA;
1795  desc_end = *pp + desc_len;
1796  if (desc_end > desc_list_end)
1797  return AVERROR_INVALIDDATA;
1798 
1799  av_log(fc, AV_LOG_TRACE, "tag: 0x%02x len=%d\n", desc_tag, desc_len);
1800 
1801  if ((st->codecpar->codec_id == AV_CODEC_ID_NONE || st->request_probe > 0) &&
1802  stream_type == STREAM_TYPE_PRIVATE_DATA)
1803  mpegts_find_stream_type(st, desc_tag, DESC_types);
1804 
1805  switch (desc_tag) {
1806  case 0x02: /* video stream descriptor */
1807  if (get8(pp, desc_end) & 0x1) {
1809  }
1810  break;
1811  case 0x1E: /* SL descriptor */
1812  desc_es_id = get16(pp, desc_end);
1813  if (desc_es_id < 0)
1814  break;
1815  if (ts && ts->pids[pid])
1816  ts->pids[pid]->es_id = desc_es_id;
1817  for (i = 0; i < mp4_descr_count; i++)
1818  if (mp4_descr[i].dec_config_descr_len &&
1819  mp4_descr[i].es_id == desc_es_id) {
1820  AVIOContext pb;
1821  ffio_init_context(&pb, mp4_descr[i].dec_config_descr,
1822  mp4_descr[i].dec_config_descr_len, 0,
1823  NULL, NULL, NULL, NULL);
1824  ff_mp4_read_dec_config_descr(fc, st, &pb);
1825  if (st->codecpar->codec_id == AV_CODEC_ID_AAC &&
1826  st->codecpar->extradata_size > 0) {
1827  st->need_parsing = 0;
1828  st->internal->need_context_update = 1;
1829  }
1831  mpegts_open_section_filter(ts, pid, m4sl_cb, ts, 1);
1832  }
1833  break;
1834  case 0x1F: /* FMC descriptor */
1835  if (get16(pp, desc_end) < 0)
1836  break;
1837  if (mp4_descr_count > 0 &&
1839  (st->request_probe == 0 && st->codecpar->codec_id == AV_CODEC_ID_NONE) ||
1840  st->request_probe > 0) &&
1841  mp4_descr->dec_config_descr_len && mp4_descr->es_id == pid) {
1842  AVIOContext pb;
1843  ffio_init_context(&pb, mp4_descr->dec_config_descr,
1844  mp4_descr->dec_config_descr_len, 0,
1845  NULL, NULL, NULL, NULL);
1846  ff_mp4_read_dec_config_descr(fc, st, &pb);
1847  if (st->codecpar->codec_id == AV_CODEC_ID_AAC &&
1848  st->codecpar->extradata_size > 0) {
1849  st->request_probe = st->need_parsing = 0;
1851  st->internal->need_context_update = 1;
1852  }
1853  }
1854  break;
1855  case 0x56: /* DVB teletext descriptor */
1856  {
1857  uint8_t *extradata = NULL;
1858  int language_count = desc_len / 5, ret;
1859 
1860  if (desc_len > 0 && desc_len % 5 != 0)
1861  return AVERROR_INVALIDDATA;
1862 
1863  if (language_count > 0) {
1864  /* 4 bytes per language code (3 bytes) with comma or NUL byte should fit language buffer */
1865  av_assert0(language_count <= sizeof(language) / 4);
1866 
1867  if (st->codecpar->extradata == NULL) {
1868  ret = ff_alloc_extradata(st->codecpar, language_count * 2);
1869  if (ret < 0)
1870  return ret;
1871  }
1872 
1873  if (st->codecpar->extradata_size < language_count * 2)
1874  return AVERROR_INVALIDDATA;
1875 
1876  extradata = st->codecpar->extradata;
1877 
1878  for (i = 0; i < language_count; i++) {
1879  language[i * 4 + 0] = get8(pp, desc_end);
1880  language[i * 4 + 1] = get8(pp, desc_end);
1881  language[i * 4 + 2] = get8(pp, desc_end);
1882  language[i * 4 + 3] = ',';
1883 
1884  memcpy(extradata, *pp, 2);
1885  extradata += 2;
1886 
1887  *pp += 2;
1888  }
1889 
1890  language[i * 4 - 1] = 0;
1891  av_dict_set(&st->metadata, "language", language, 0);
1892  st->internal->need_context_update = 1;
1893  }
1894  }
1895  break;
1896  case 0x59: /* subtitling descriptor */
1897  {
1898  /* 8 bytes per DVB subtitle substream data:
1899  * ISO_639_language_code (3 bytes),
1900  * subtitling_type (1 byte),
1901  * composition_page_id (2 bytes),
1902  * ancillary_page_id (2 bytes) */
1903  int language_count = desc_len / 8, ret;
1904 
1905  if (desc_len > 0 && desc_len % 8 != 0)
1906  return AVERROR_INVALIDDATA;
1907 
1908  if (language_count > 1) {
1909  avpriv_request_sample(fc, "DVB subtitles with multiple languages");
1910  }
1911 
1912  if (language_count > 0) {
1913  uint8_t *extradata;
1914 
1915  /* 4 bytes per language code (3 bytes) with comma or NUL byte should fit language buffer */
1916  av_assert0(language_count <= sizeof(language) / 4);
1917 
1918  if (st->codecpar->extradata == NULL) {
1919  ret = ff_alloc_extradata(st->codecpar, language_count * 5);
1920  if (ret < 0)
1921  return ret;
1922  }
1923 
1924  if (st->codecpar->extradata_size < language_count * 5)
1925  return AVERROR_INVALIDDATA;
1926 
1927  extradata = st->codecpar->extradata;
1928 
1929  for (i = 0; i < language_count; i++) {
1930  language[i * 4 + 0] = get8(pp, desc_end);
1931  language[i * 4 + 1] = get8(pp, desc_end);
1932  language[i * 4 + 2] = get8(pp, desc_end);
1933  language[i * 4 + 3] = ',';
1934 
1935  /* hearing impaired subtitles detection using subtitling_type */
1936  switch (*pp[0]) {
1937  case 0x20: /* DVB subtitles (for the hard of hearing) with no monitor aspect ratio criticality */
1938  case 0x21: /* DVB subtitles (for the hard of hearing) for display on 4:3 aspect ratio monitor */
1939  case 0x22: /* DVB subtitles (for the hard of hearing) for display on 16:9 aspect ratio monitor */
1940  case 0x23: /* DVB subtitles (for the hard of hearing) for display on 2.21:1 aspect ratio monitor */
1941  case 0x24: /* DVB subtitles (for the hard of hearing) for display on a high definition monitor */
1942  case 0x25: /* DVB subtitles (for the hard of hearing) with plano-stereoscopic disparity for display on a high definition monitor */
1944  break;
1945  }
1946 
1947  extradata[4] = get8(pp, desc_end); /* subtitling_type */
1948  memcpy(extradata, *pp, 4); /* composition_page_id and ancillary_page_id */
1949  extradata += 5;
1950 
1951  *pp += 4;
1952  }
1953 
1954  language[i * 4 - 1] = 0;
1955  av_dict_set(&st->metadata, "language", language, 0);
1956  st->internal->need_context_update = 1;
1957  }
1958  }
1959  break;
1960  case 0x0a: /* ISO 639 language descriptor */
1961  for (i = 0; i + 4 <= desc_len; i += 4) {
1962  language[i + 0] = get8(pp, desc_end);
1963  language[i + 1] = get8(pp, desc_end);
1964  language[i + 2] = get8(pp, desc_end);
1965  language[i + 3] = ',';
1966  switch (get8(pp, desc_end)) {
1967  case 0x01:
1969  break;
1970  case 0x02:
1972  break;
1973  case 0x03:
1976  break;
1977  }
1978  }
1979  if (i && language[0]) {
1980  language[i - 1] = 0;
1981  /* don't overwrite language, as it may already have been set by
1982  * another, more specific descriptor (e.g. supplementary audio) */
1984  }
1985  break;
1986  case 0x05: /* registration descriptor */
1987  st->codecpar->codec_tag = bytestream_get_le32(pp);
1988  av_log(fc, AV_LOG_TRACE, "reg_desc=%.4s\n", (char *)&st->codecpar->codec_tag);
1989  if (st->codecpar->codec_id == AV_CODEC_ID_NONE || st->request_probe > 0) {
1991  if (st->codecpar->codec_tag == MKTAG('B', 'S', 'S', 'D'))
1992  st->request_probe = 50;
1993  }
1994  break;
1995  case 0x52: /* stream identifier descriptor */
1996  st->stream_identifier = 1 + get8(pp, desc_end);
1997  break;
1998  case 0x26: /* metadata descriptor */
1999  if (get16(pp, desc_end) == 0xFFFF)
2000  *pp += 4;
2001  if (get8(pp, desc_end) == 0xFF) {
2002  st->codecpar->codec_tag = bytestream_get_le32(pp);
2003  if (st->codecpar->codec_id == AV_CODEC_ID_NONE)
2005  }
2006  break;
2007  case 0x7f: /* DVB extension descriptor */
2008  ext_desc_tag = get8(pp, desc_end);
2009  if (ext_desc_tag < 0)
2010  return AVERROR_INVALIDDATA;
2011  if (st->codecpar->codec_id == AV_CODEC_ID_OPUS &&
2012  ext_desc_tag == 0x80) { /* User defined (provisional Opus) */
2013  if (!st->codecpar->extradata) {
2016  if (!st->codecpar->extradata)
2017  return AVERROR(ENOMEM);
2018 
2021 
2022  channel_config_code = get8(pp, desc_end);
2023  if (channel_config_code < 0)
2024  return AVERROR_INVALIDDATA;
2025  if (channel_config_code <= 0x8) {
2026  st->codecpar->extradata[9] = channels = channel_config_code ? channel_config_code : 2;
2027  st->codecpar->extradata[18] = channel_config_code ? (channels > 2) : /* Dual Mono */ 255;
2028  st->codecpar->extradata[19] = opus_stream_cnt[channel_config_code];
2029  st->codecpar->extradata[20] = opus_coupled_stream_cnt[channel_config_code];
2030  memcpy(&st->codecpar->extradata[21], opus_channel_map[channels - 1], channels);
2031  } else {
2032  avpriv_request_sample(fc, "Opus in MPEG-TS - channel_config_code > 0x8");
2033  }
2035  st->internal->need_context_update = 1;
2036  }
2037  }
2038  if (ext_desc_tag == 0x06) { /* supplementary audio descriptor */
2039  int flags;
2040 
2041  if (desc_len < 1)
2042  return AVERROR_INVALIDDATA;
2043  flags = get8(pp, desc_end);
2044 
2045  if ((flags & 0x80) == 0) /* mix_type */
2047 
2048  switch ((flags >> 2) & 0x1F) { /* editorial_classification */
2049  case 0x01:
2052  break;
2053  case 0x02:
2055  break;
2056  case 0x03:
2058  break;
2059  }
2060 
2061  if (flags & 0x01) { /* language_code_present */
2062  if (desc_len < 4)
2063  return AVERROR_INVALIDDATA;
2064  language[0] = get8(pp, desc_end);
2065  language[1] = get8(pp, desc_end);
2066  language[2] = get8(pp, desc_end);
2067  language[3] = 0;
2068 
2069  /* This language always has to override a possible
2070  * ISO 639 language descriptor language */
2071  if (language[0])
2072  av_dict_set(&st->metadata, "language", language, 0);
2073  }
2074  }
2075  break;
2076  case 0x6a: /* ac-3_descriptor */
2077  {
2078  int component_type_flag = get8(pp, desc_end) & (1 << 7);
2079  if (component_type_flag) {
2080  int component_type = get8(pp, desc_end);
2081  int service_type_mask = 0x38; // 0b00111000
2082  int service_type = ((component_type & service_type_mask) >> 3);
2083  if (service_type == 0x02 /* 0b010 */) {
2085  av_log(ts ? ts->stream : fc, AV_LOG_DEBUG, "New track disposition for id %u: %u\n", st->id, st->disposition);
2086  }
2087  }
2088  }
2089  break;
2090  case 0x7a: /* enhanced_ac-3_descriptor */
2091  {
2092  int component_type_flag = get8(pp, desc_end) & (1 << 7);
2093  if (component_type_flag) {
2094  int component_type = get8(pp, desc_end);
2095  int service_type_mask = 0x38; // 0b00111000
2096  int service_type = ((component_type & service_type_mask) >> 3);
2097  if (service_type == 0x02 /* 0b010 */) {
2099  av_log(ts ? ts->stream : fc, AV_LOG_DEBUG, "New track disposition for id %u: %u\n", st->id, st->disposition);
2100  }
2101  }
2102  }
2103  break;
2104  case 0xfd: /* ARIB data coding type descriptor */
2105  // STD-B24, fascicle 3, chapter 4 defines private_stream_1
2106  // for captions
2107  if (stream_type == STREAM_TYPE_PRIVATE_DATA) {
2108  // This structure is defined in STD-B10, part 1, listing 5.4 and
2109  // part 2, 6.2.20).
2110  // Listing of data_component_ids is in STD-B10, part 2, Annex J.
2111  // Component tag limits are documented in TR-B14, fascicle 2,
2112  // Vol. 3, Section 2, 4.2.8.1
2113  int actual_component_tag = st->stream_identifier - 1;
2114  int picked_profile = FF_PROFILE_UNKNOWN;
2115  int data_component_id = get16(pp, desc_end);
2116  if (data_component_id < 0)
2117  return AVERROR_INVALIDDATA;
2118 
2119  switch (data_component_id) {
2120  case 0x0008:
2121  // [0x30..0x37] are component tags utilized for
2122  // non-mobile captioning service ("profile A").
2123  if (actual_component_tag >= 0x30 &&
2124  actual_component_tag <= 0x37) {
2125  picked_profile = FF_PROFILE_ARIB_PROFILE_A;
2126  }
2127  break;
2128  case 0x0012:
2129  // component tag 0x87 signifies a mobile/partial reception
2130  // (1seg) captioning service ("profile C").
2131  if (actual_component_tag == 0x87) {
2132  picked_profile = FF_PROFILE_ARIB_PROFILE_C;
2133  }
2134  break;
2135  default:
2136  break;
2137  }
2138 
2139  if (picked_profile == FF_PROFILE_UNKNOWN)
2140  break;
2141 
2144  st->codecpar->profile = picked_profile;
2145  st->request_probe = 0;
2146  }
2147  break;
2148  case 0xb0: /* DOVI video stream descriptor */
2149  {
2150  uint32_t buf;
2152  size_t dovi_size;
2153  int ret;
2154  if (desc_end - *pp < 4) // (8 + 8 + 7 + 6 + 1 + 1 + 1) / 8
2155  return AVERROR_INVALIDDATA;
2156 
2157  dovi = av_dovi_alloc(&dovi_size);
2158  if (!dovi)
2159  return AVERROR(ENOMEM);
2160 
2161  dovi->dv_version_major = get8(pp, desc_end);
2162  dovi->dv_version_minor = get8(pp, desc_end);
2163  buf = get16(pp, desc_end);
2164  dovi->dv_profile = (buf >> 9) & 0x7f; // 7 bits
2165  dovi->dv_level = (buf >> 3) & 0x3f; // 6 bits
2166  dovi->rpu_present_flag = (buf >> 2) & 0x01; // 1 bit
2167  dovi->el_present_flag = (buf >> 1) & 0x01; // 1 bit
2168  dovi->bl_present_flag = buf & 0x01; // 1 bit
2169  if (desc_end - *pp >= 20) { // 4 + 4 * 4
2170  buf = get8(pp, desc_end);
2171  dovi->dv_bl_signal_compatibility_id = (buf >> 4) & 0x0f; // 4 bits
2172  } else {
2173  // 0 stands for None
2174  // Dolby Vision V1.2.93 profiles and levels
2176  }
2177 
2179  (uint8_t *)dovi, dovi_size);
2180  if (ret < 0) {
2181  av_free(dovi);
2182  return ret;
2183  }
2184 
2185  av_log(fc, AV_LOG_TRACE, "DOVI, version: %d.%d, profile: %d, level: %d, "
2186  "rpu flag: %d, el flag: %d, bl flag: %d, compatibility id: %d\n",
2187  dovi->dv_version_major, dovi->dv_version_minor,
2188  dovi->dv_profile, dovi->dv_level,
2189  dovi->rpu_present_flag,
2190  dovi->el_present_flag,
2191  dovi->bl_present_flag,
2192  dovi->dv_bl_signal_compatibility_id);
2193  }
2194  break;
2195  default:
2196  break;
2197  }
2198  *pp = desc_end;
2199  return 0;
2200 }
2201 
2202 static AVStream *find_matching_stream(MpegTSContext *ts, int pid, unsigned int programid,
2203  int stream_identifier, int pmt_stream_idx)
2204 {
2205  AVFormatContext *s = ts->stream;
2206  int i;
2207  AVStream *found = NULL;
2208 
2209  for (i = 0; i < s->nb_streams; i++) {
2210  AVStream *st = s->streams[i];
2211  if (st->program_num != programid)
2212  continue;
2213  if (stream_identifier != -1) { /* match based on "stream identifier descriptor" if present */
2214  if (st->stream_identifier == stream_identifier+1) {
2215  found = st;
2216  break;
2217  }
2218  } else if (st->pmt_stream_idx == pmt_stream_idx) { /* match based on position within the PMT */
2219  found = st;
2220  break;
2221  }
2222  }
2223 
2224  if (found) {
2226  "re-using existing %s stream %d (pid=0x%x) for new pid=0x%x\n",
2228  i, found->id, pid);
2229  }
2230 
2231  return found;
2232 }
2233 
2234 static int parse_stream_identifier_desc(const uint8_t *p, const uint8_t *p_end)
2235 {
2236  const uint8_t **pp = &p;
2237  const uint8_t *desc_list_end;
2238  const uint8_t *desc_end;
2239  int desc_list_len;
2240  int desc_len, desc_tag;
2241 
2242  desc_list_len = get16(pp, p_end);
2243  if (desc_list_len < 0)
2244  return -1;
2245  desc_list_len &= 0xfff;
2246  desc_list_end = p + desc_list_len;
2247  if (desc_list_end > p_end)
2248  return -1;
2249 
2250  while (1) {
2251  desc_tag = get8(pp, desc_list_end);
2252  if (desc_tag < 0)
2253  return -1;
2254  desc_len = get8(pp, desc_list_end);
2255  if (desc_len < 0)
2256  return -1;
2257  desc_end = *pp + desc_len;
2258  if (desc_end > desc_list_end)
2259  return -1;
2260 
2261  if (desc_tag == 0x52) {
2262  return get8(pp, desc_end);
2263  }
2264  *pp = desc_end;
2265  }
2266 
2267  return -1;
2268 }
2269 
2270 static int is_pes_stream(int stream_type, uint32_t prog_reg_desc)
2271 {
2272  return !(stream_type == 0x13 ||
2273  (stream_type == 0x86 && prog_reg_desc == AV_RL32("CUEI")) );
2274 }
2275 
2276 static void pmt_cb(MpegTSFilter *filter, const uint8_t *section, int section_len)
2277 {
2278  MpegTSContext *ts = filter->u.section_filter.opaque;
2279  MpegTSSectionFilter *tssf = &filter->u.section_filter;
2280  SectionHeader h1, *h = &h1;
2281  PESContext *pes;
2282  AVStream *st;
2283  const uint8_t *p, *p_end, *desc_list_end;
2284  int program_info_length, pcr_pid, pid, stream_type;
2285  int desc_list_len;
2286  uint32_t prog_reg_desc = 0; /* registration descriptor */
2287  int stream_identifier = -1;
2288 
2289  int mp4_descr_count = 0;
2290  Mp4Descr mp4_descr[MAX_MP4_DESCR_COUNT] = { { 0 } };
2291  int i;
2292 
2293  av_log(ts->stream, AV_LOG_TRACE, "PMT: len %i\n", section_len);
2294  hex_dump_debug(ts->stream, section, section_len);
2295 
2296  p_end = section + section_len - 4;
2297  p = section;
2298  if (parse_section_header(h, &p, p_end) < 0)
2299  return;
2300  if (h->tid != PMT_TID)
2301  return;
2302  if (skip_identical(h, tssf))
2303  return;
2304 
2305  av_log(ts->stream, AV_LOG_TRACE, "sid=0x%x sec_num=%d/%d version=%d tid=%d\n",
2306  h->id, h->sec_num, h->last_sec_num, h->version, h->tid);
2307 
2308  if (!ts->scan_all_pmts && ts->skip_changes)
2309  return;
2310 
2311  if (ts->skip_unknown_pmt && !get_program(ts, h->id))
2312  return;
2313  if (!ts->skip_clear)
2314  clear_program(ts, h->id);
2315 
2316  pcr_pid = get16(&p, p_end);
2317  if (pcr_pid < 0)
2318  return;
2319  pcr_pid &= 0x1fff;
2320  add_pid_to_pmt(ts, h->id, pcr_pid);
2321  update_av_program_info(ts->stream, h->id, pcr_pid, h->version);
2322 
2323  av_log(ts->stream, AV_LOG_TRACE, "pcr_pid=0x%x\n", pcr_pid);
2324 
2325  program_info_length = get16(&p, p_end);
2326  if (program_info_length < 0)
2327  return;
2328  program_info_length &= 0xfff;
2329  while (program_info_length >= 2) {
2330  uint8_t tag, len;
2331  tag = get8(&p, p_end);
2332  len = get8(&p, p_end);
2333 
2334  av_log(ts->stream, AV_LOG_TRACE, "program tag: 0x%02x len=%d\n", tag, len);
2335 
2336  if (len > program_info_length - 2)
2337  // something else is broken, exit the program_descriptors_loop
2338  break;
2339  program_info_length -= len + 2;
2340  if (tag == 0x1d) { // IOD descriptor
2341  get8(&p, p_end); // scope
2342  get8(&p, p_end); // label
2343  len -= 2;
2344  mp4_read_iods(ts->stream, p, len, mp4_descr + mp4_descr_count,
2345  &mp4_descr_count, MAX_MP4_DESCR_COUNT);
2346  } else if (tag == 0x05 && len >= 4) { // registration descriptor
2347  prog_reg_desc = bytestream_get_le32(&p);
2348  len -= 4;
2349  }
2350  p += len;
2351  }
2352  p += program_info_length;
2353  if (p >= p_end)
2354  goto out;
2355 
2356  // stop parsing after pmt, we found header
2357  if (!ts->pkt)
2358  ts->stop_parse = 2;
2359 
2360  set_pmt_found(ts, h->id);
2361 
2362 
2363  for (i = 0; ; i++) {
2364  st = 0;
2365  pes = NULL;
2366  stream_type = get8(&p, p_end);
2367  if (stream_type < 0)
2368  break;
2369  pid = get16(&p, p_end);
2370  if (pid < 0)
2371  goto out;
2372  pid &= 0x1fff;
2373  if (pid == ts->current_pid)
2374  goto out;
2375 
2376  if (ts->merge_pmt_versions)
2377  stream_identifier = parse_stream_identifier_desc(p, p_end);
2378 
2379  /* now create stream */
2380  if (ts->pids[pid] && ts->pids[pid]->type == MPEGTS_PES) {
2381  pes = ts->pids[pid]->u.pes_filter.opaque;
2382  if (ts->merge_pmt_versions && !pes->st) {
2383  st = find_matching_stream(ts, pid, h->id, stream_identifier, i);
2384  if (st) {
2385  pes->st = st;
2386  pes->stream_type = stream_type;
2387  pes->merged_st = 1;
2388  }
2389  }
2390  if (!pes->st) {
2391  pes->st = avformat_new_stream(pes->stream, NULL);
2392  if (!pes->st)
2393  goto out;
2394  pes->st->id = pes->pid;
2395  pes->st->program_num = h->id;
2396  pes->st->pmt_version = h->version;
2397  pes->st->pmt_stream_idx = i;
2398  }
2399  st = pes->st;
2400  } else if (is_pes_stream(stream_type, prog_reg_desc)) {
2401  if (ts->pids[pid])
2402  mpegts_close_filter(ts, ts->pids[pid]); // wrongly added sdt filter probably
2403  pes = add_pes_stream(ts, pid, pcr_pid);
2404  if (ts->merge_pmt_versions && pes && !pes->st) {
2405  st = find_matching_stream(ts, pid, h->id, stream_identifier, i);
2406  if (st) {
2407  pes->st = st;
2408  pes->stream_type = stream_type;
2409  pes->merged_st = 1;
2410  }
2411  }
2412  if (pes && !pes->st) {
2413  st = avformat_new_stream(pes->stream, NULL);
2414  if (!st)
2415  goto out;
2416  st->id = pes->pid;
2417  st->program_num = h->id;
2418  st->pmt_version = h->version;
2419  st->pmt_stream_idx = i;
2420  }
2421  } else {
2422  int idx = ff_find_stream_index(ts->stream, pid);
2423  if (idx >= 0) {
2424  st = ts->stream->streams[idx];
2425  }
2426  if (ts->merge_pmt_versions && !st) {
2427  st = find_matching_stream(ts, pid, h->id, stream_identifier, i);
2428  }
2429  if (!st) {
2430  st = avformat_new_stream(ts->stream, NULL);
2431  if (!st)
2432  goto out;
2433  st->id = pid;
2434  st->program_num = h->id;
2435  st->pmt_version = h->version;
2436  st->pmt_stream_idx = i;
2438  if (stream_type == 0x86 && prog_reg_desc == AV_RL32("CUEI")) {
2439  mpegts_find_stream_type(st, stream_type, SCTE_types);
2440  mpegts_open_section_filter(ts, pid, scte_data_cb, ts, 1);
2441  }
2442  }
2443  }
2444 
2445  if (!st)
2446  goto out;
2447 
2448  if (pes && !pes->stream_type)
2449  mpegts_set_stream_info(st, pes, stream_type, prog_reg_desc);
2450 
2451  add_pid_to_pmt(ts, h->id, pid);
2452 
2453  av_program_add_stream_index(ts->stream, h->id, st->index);
2454 
2455  desc_list_len = get16(&p, p_end);
2456  if (desc_list_len < 0)
2457  goto out;
2458  desc_list_len &= 0xfff;
2459  desc_list_end = p + desc_list_len;
2460  if (desc_list_end > p_end)
2461  goto out;
2462  for (;;) {
2463  if (ff_parse_mpeg2_descriptor(ts->stream, st, stream_type, &p,
2464  desc_list_end, mp4_descr,
2465  mp4_descr_count, pid, ts) < 0)
2466  break;
2467 
2468  if (pes && prog_reg_desc == AV_RL32("HDMV") &&
2469  stream_type == 0x83 && pes->sub_st) {
2471  pes->sub_st->index);
2472  pes->sub_st->codecpar->codec_tag = st->codecpar->codec_tag;
2473  }
2474  }
2475  p = desc_list_end;
2476  }
2477 
2478  if (!ts->pids[pcr_pid])
2479  mpegts_open_pcr_filter(ts, pcr_pid);
2480 
2481 out:
2482  for (i = 0; i < mp4_descr_count; i++)
2483  av_free(mp4_descr[i].dec_config_descr);
2484 }
2485 
2486 static void pat_cb(MpegTSFilter *filter, const uint8_t *section, int section_len)
2487 {
2488  MpegTSContext *ts = filter->u.section_filter.opaque;
2489  MpegTSSectionFilter *tssf = &filter->u.section_filter;
2490  SectionHeader h1, *h = &h1;
2491  const uint8_t *p, *p_end;
2492  int sid, pmt_pid;
2493  AVProgram *program;
2494 
2495  av_log(ts->stream, AV_LOG_TRACE, "PAT:\n");
2496  hex_dump_debug(ts->stream, section, section_len);
2497 
2498  p_end = section + section_len - 4;
2499  p = section;
2500  if (parse_section_header(h, &p, p_end) < 0)
2501  return;
2502  if (h->tid != PAT_TID)
2503  return;
2504  if (ts->skip_changes)
2505  return;
2506 
2507  if (skip_identical(h, tssf))
2508  return;
2509  ts->stream->ts_id = h->id;
2510 
2511  clear_programs(ts);
2512  for (;;) {
2513  sid = get16(&p, p_end);
2514  if (sid < 0)
2515  break;
2516  pmt_pid = get16(&p, p_end);
2517  if (pmt_pid < 0)
2518  break;
2519  pmt_pid &= 0x1fff;
2520 
2521  if (pmt_pid == ts->current_pid)
2522  break;
2523 
2524  av_log(ts->stream, AV_LOG_TRACE, "sid=0x%x pid=0x%x\n", sid, pmt_pid);
2525 
2526  if (sid == 0x0000) {
2527  /* NIT info */
2528  } else {
2529  MpegTSFilter *fil = ts->pids[pmt_pid];
2530  program = av_new_program(ts->stream, sid);
2531  if (program) {
2532  program->program_num = sid;
2533  program->pmt_pid = pmt_pid;
2534  }
2535  if (fil)
2536  if ( fil->type != MPEGTS_SECTION
2537  || fil->pid != pmt_pid
2538  || fil->u.section_filter.section_cb != pmt_cb)
2539  mpegts_close_filter(ts, ts->pids[pmt_pid]);
2540 
2541  if (!ts->pids[pmt_pid])
2542  mpegts_open_section_filter(ts, pmt_pid, pmt_cb, ts, 1);
2543  add_pat_entry(ts, sid);
2544  add_pid_to_pmt(ts, sid, 0); // add pat pid to program
2545  add_pid_to_pmt(ts, sid, pmt_pid);
2546  }
2547  }
2548 
2549  if (sid < 0) {
2550  int i,j;
2551  for (j=0; j<ts->stream->nb_programs; j++) {
2552  for (i = 0; i < ts->nb_prg; i++)
2553  if (ts->prg[i].id == ts->stream->programs[j]->id)
2554  break;
2555  if (i==ts->nb_prg && !ts->skip_clear)
2556  clear_avprogram(ts, ts->stream->programs[j]->id);
2557  }
2558  }
2559 }
2560 
2561 static void eit_cb(MpegTSFilter *filter, const uint8_t *section, int section_len)
2562 {
2563  MpegTSContext *ts = filter->u.section_filter.opaque;
2564  const uint8_t *p, *p_end;
2565  SectionHeader h1, *h = &h1;
2566 
2567  /*
2568  * Sometimes we receive EPG packets but SDT table do not have
2569  * eit_pres_following or eit_sched turned on, so we open EPG
2570  * stream directly here.
2571  */
2572  if (!ts->epg_stream) {
2574  if (!ts->epg_stream)
2575  return;
2576  ts->epg_stream->id = EIT_PID;
2579  }
2580 
2581  if (ts->epg_stream->discard == AVDISCARD_ALL)
2582  return;
2583 
2584  p_end = section + section_len - 4;
2585  p = section;
2586 
2587  if (parse_section_header(h, &p, p_end) < 0)
2588  return;
2589  if (h->tid < EIT_TID || h->tid > OEITS_END_TID)
2590  return;
2591 
2592  av_log(ts->stream, AV_LOG_TRACE, "EIT: tid received = %.02x\n", h->tid);
2593 
2594  /**
2595  * Service_id 0xFFFF is reserved, it indicates that the current EIT table
2596  * is scrambled.
2597  */
2598  if (h->id == 0xFFFF) {
2599  av_log(ts->stream, AV_LOG_TRACE, "Scrambled EIT table received.\n");
2600  return;
2601  }
2602 
2603  /**
2604  * In case we receive an EPG packet before mpegts context is fully
2605  * initialized.
2606  */
2607  if (!ts->pkt)
2608  return;
2609 
2610  new_data_packet(section, section_len, ts->pkt);
2611  ts->pkt->stream_index = ts->epg_stream->index;
2612  ts->stop_parse = 1;
2613 }
2614 
2615 static void sdt_cb(MpegTSFilter *filter, const uint8_t *section, int section_len)
2616 {
2617  MpegTSContext *ts = filter->u.section_filter.opaque;
2618  MpegTSSectionFilter *tssf = &filter->u.section_filter;
2619  SectionHeader h1, *h = &h1;
2620  const uint8_t *p, *p_end, *desc_list_end, *desc_end;
2621  int onid, val, sid, desc_list_len, desc_tag, desc_len, service_type;
2622  char *name, *provider_name;
2623 
2624  av_log(ts->stream, AV_LOG_TRACE, "SDT:\n");
2625  hex_dump_debug(ts->stream, section, section_len);
2626 
2627  p_end = section + section_len - 4;
2628  p = section;
2629  if (parse_section_header(h, &p, p_end) < 0)
2630  return;
2631  if (h->tid != SDT_TID)
2632  return;
2633  if (ts->skip_changes)
2634  return;
2635  if (skip_identical(h, tssf))
2636  return;
2637 
2638  onid = get16(&p, p_end);
2639  if (onid < 0)
2640  return;
2641  val = get8(&p, p_end);
2642  if (val < 0)
2643  return;
2644  for (;;) {
2645  sid = get16(&p, p_end);
2646  if (sid < 0)
2647  break;
2648  val = get8(&p, p_end);
2649  if (val < 0)
2650  break;
2651  desc_list_len = get16(&p, p_end);
2652  if (desc_list_len < 0)
2653  break;
2654  desc_list_len &= 0xfff;
2655  desc_list_end = p + desc_list_len;
2656  if (desc_list_end > p_end)
2657  break;
2658  for (;;) {
2659  desc_tag = get8(&p, desc_list_end);
2660  if (desc_tag < 0)
2661  break;
2662  desc_len = get8(&p, desc_list_end);
2663  desc_end = p + desc_len;
2664  if (desc_len < 0 || desc_end > desc_list_end)
2665  break;
2666 
2667  av_log(ts->stream, AV_LOG_TRACE, "tag: 0x%02x len=%d\n",
2668  desc_tag, desc_len);
2669 
2670  switch (desc_tag) {
2671  case 0x48:
2672  service_type = get8(&p, p_end);
2673  if (service_type < 0)
2674  break;
2675  provider_name = getstr8(&p, p_end);
2676  if (!provider_name)
2677  break;
2678  name = getstr8(&p, p_end);
2679  if (name) {
2680  AVProgram *program = av_new_program(ts->stream, sid);
2681  if (program) {
2682  av_dict_set(&program->metadata, "service_name", name, 0);
2683  av_dict_set(&program->metadata, "service_provider",
2684  provider_name, 0);
2685  }
2686  }
2687  av_free(name);
2688  av_free(provider_name);
2689  break;
2690  default:
2691  break;
2692  }
2693  p = desc_end;
2694  }
2695  p = desc_list_end;
2696  }
2697 }
2698 
2699 static int parse_pcr(int64_t *ppcr_high, int *ppcr_low,
2700  const uint8_t *packet);
2701 
2702 /* handle one TS packet */
2703 static int handle_packet(MpegTSContext *ts, const uint8_t *packet, int64_t pos)
2704 {
2705  MpegTSFilter *tss;
2706  int len, pid, cc, expected_cc, cc_ok, afc, is_start, is_discontinuity,
2707  has_adaptation, has_payload;
2708  const uint8_t *p, *p_end;
2709 
2710  pid = AV_RB16(packet + 1) & 0x1fff;
2711  is_start = packet[1] & 0x40;
2712  tss = ts->pids[pid];
2713  if (ts->auto_guess && !tss && is_start) {
2714  add_pes_stream(ts, pid, -1);
2715  tss = ts->pids[pid];
2716  }
2717  if (!tss)
2718  return 0;
2719  if (is_start)
2720  tss->discard = discard_pid(ts, pid);
2721  if (tss->discard)
2722  return 0;
2723  ts->current_pid = pid;
2724 
2725  afc = (packet[3] >> 4) & 3;
2726  if (afc == 0) /* reserved value */
2727  return 0;
2728  has_adaptation = afc & 2;
2729  has_payload = afc & 1;
2730  is_discontinuity = has_adaptation &&
2731  packet[4] != 0 && /* with length > 0 */
2732  (packet[5] & 0x80); /* and discontinuity indicated */
2733 
2734  /* continuity check (currently not used) */
2735  cc = (packet[3] & 0xf);
2736  expected_cc = has_payload ? (tss->last_cc + 1) & 0x0f : tss->last_cc;
2737  cc_ok = pid == 0x1FFF || // null packet PID
2738  is_discontinuity ||
2739  tss->last_cc < 0 ||
2740  expected_cc == cc;
2741 
2742  tss->last_cc = cc;
2743  if (!cc_ok) {
2744  av_log(ts->stream, AV_LOG_DEBUG,
2745  "Continuity check failed for pid %d expected %d got %d\n",
2746  pid, expected_cc, cc);
2747  if (tss->type == MPEGTS_PES) {
2748  PESContext *pc = tss->u.pes_filter.opaque;
2749  pc->flags |= AV_PKT_FLAG_CORRUPT;
2750  }
2751  }
2752 
2753  if (packet[1] & 0x80) {
2754  av_log(ts->stream, AV_LOG_DEBUG, "Packet had TEI flag set; marking as corrupt\n");
2755  if (tss->type == MPEGTS_PES) {
2756  PESContext *pc = tss->u.pes_filter.opaque;
2757  pc->flags |= AV_PKT_FLAG_CORRUPT;
2758  }
2759  }
2760 
2761  p = packet + 4;
2762  if (has_adaptation) {
2763  int64_t pcr_h;
2764  int pcr_l;
2765  if (parse_pcr(&pcr_h, &pcr_l, packet) == 0)
2766  tss->last_pcr = pcr_h * 300 + pcr_l;
2767  /* skip adaptation field */
2768  p += p[0] + 1;
2769  }
2770  /* if past the end of packet, ignore */
2771  p_end = packet + TS_PACKET_SIZE;
2772  if (p >= p_end || !has_payload)
2773  return 0;
2774 
2775  if (pos >= 0) {
2777  ts->pos47_full = pos - TS_PACKET_SIZE;
2778  }
2779 
2780  if (tss->type == MPEGTS_SECTION) {
2781  if (is_start) {
2782  /* pointer field present */
2783  len = *p++;
2784  if (len > p_end - p)
2785  return 0;
2786  if (len && cc_ok) {
2787  /* write remaining section bytes */
2788  write_section_data(ts, tss,
2789  p, len, 0);
2790  /* check whether filter has been closed */
2791  if (!ts->pids[pid])
2792  return 0;
2793  }
2794  p += len;
2795  if (p < p_end) {
2796  write_section_data(ts, tss,
2797  p, p_end - p, 1);
2798  }
2799  } else {
2800  if (cc_ok) {
2801  write_section_data(ts, tss,
2802  p, p_end - p, 0);
2803  }
2804  }
2805 
2806  // stop find_stream_info from waiting for more streams
2807  // when all programs have received a PMT
2808  if (ts->stream->ctx_flags & AVFMTCTX_NOHEADER && ts->scan_all_pmts <= 0) {
2809  int i;
2810  for (i = 0; i < ts->nb_prg; i++) {
2811  if (!ts->prg[i].pmt_found)
2812  break;
2813  }
2814  if (i == ts->nb_prg && ts->nb_prg > 0) {
2815  int types = 0;
2816  for (i = 0; i < ts->stream->nb_streams; i++) {
2817  AVStream *st = ts->stream->streams[i];
2818  if (st->codecpar->codec_type >= 0)
2819  types |= 1<<st->codecpar->codec_type;
2820  }
2821  if ((types & (1<<AVMEDIA_TYPE_AUDIO) && types & (1<<AVMEDIA_TYPE_VIDEO)) || pos > 100000) {
2822  av_log(ts->stream, AV_LOG_DEBUG, "All programs have pmt, headers found\n");
2824  }
2825  }
2826  }
2827 
2828  } else {
2829  int ret;
2830  // Note: The position here points actually behind the current packet.
2831  if (tss->type == MPEGTS_PES) {
2832  if ((ret = tss->u.pes_filter.pes_cb(tss, p, p_end - p, is_start,
2833  pos - ts->raw_packet_size)) < 0)
2834  return ret;
2835  }
2836  }
2837 
2838  return 0;
2839 }
2840 
2841 static int mpegts_resync(AVFormatContext *s, int seekback, const uint8_t *current_packet)
2842 {
2843  MpegTSContext *ts = s->priv_data;
2844  AVIOContext *pb = s->pb;
2845  int c, i;
2846  uint64_t pos = avio_tell(pb);
2847  int64_t back = FFMIN(seekback, pos);
2848 
2849  //Special case for files like 01c56b0dc1.ts
2850  if (current_packet[0] == 0x80 && current_packet[12] == 0x47 && pos >= TS_PACKET_SIZE) {
2851  avio_seek(pb, 12 - TS_PACKET_SIZE, SEEK_CUR);
2852  return 0;
2853  }
2854 
2855  avio_seek(pb, -back, SEEK_CUR);
2856 
2857  for (i = 0; i < ts->resync_size; i++) {
2858  c = avio_r8(pb);
2859  if (avio_feof(pb))
2860  return AVERROR_EOF;
2861  if (c == 0x47) {
2862  int new_packet_size, ret;
2863  avio_seek(pb, -1, SEEK_CUR);
2864  pos = avio_tell(pb);
2866  if (ret < 0)
2867  return ret;
2868  new_packet_size = get_packet_size(s);
2869  if (new_packet_size > 0 && new_packet_size != ts->raw_packet_size) {
2870  av_log(ts->stream, AV_LOG_WARNING, "changing packet size to %d\n", new_packet_size);
2871  ts->raw_packet_size = new_packet_size;
2872  }
2873  avio_seek(pb, pos, SEEK_SET);
2874  return 0;
2875  }
2876  }
2878  "max resync size reached, could not find sync byte\n");
2879  /* no sync found */
2880  return AVERROR_INVALIDDATA;
2881 }
2882 
2883 /* return AVERROR_something if error or EOF. Return 0 if OK. */
2884 static int read_packet(AVFormatContext *s, uint8_t *buf, int raw_packet_size,
2885  const uint8_t **data)
2886 {
2887  AVIOContext *pb = s->pb;
2888  int len;
2889 
2890  for (;;) {
2892  if (len != TS_PACKET_SIZE)
2893  return len < 0 ? len : AVERROR_EOF;
2894  /* check packet sync byte */
2895  if ((*data)[0] != 0x47) {
2896  /* find a new packet start */
2897 
2898  if (mpegts_resync(s, raw_packet_size, *data) < 0)
2899  return AVERROR(EAGAIN);
2900  else
2901  continue;
2902  } else {
2903  break;
2904  }
2905  }
2906  return 0;
2907 }
2908 
2909 static void finished_reading_packet(AVFormatContext *s, int raw_packet_size)
2910 {
2911  AVIOContext *pb = s->pb;
2912  int skip = raw_packet_size - TS_PACKET_SIZE;
2913  if (skip > 0)
2914  avio_skip(pb, skip);
2915 }
2916 
2917 static int handle_packets(MpegTSContext *ts, int64_t nb_packets)
2918 {
2919  AVFormatContext *s = ts->stream;
2921  const uint8_t *data;
2922  int64_t packet_num;
2923  int ret = 0;
2924 
2925  if (avio_tell(s->pb) != ts->last_pos) {
2926  int i;
2927  av_log(ts->stream, AV_LOG_TRACE, "Skipping after seek\n");
2928  /* seek detected, flush pes buffer */
2929  for (i = 0; i < NB_PID_MAX; i++) {
2930  if (ts->pids[i]) {
2931  if (ts->pids[i]->type == MPEGTS_PES) {
2932  PESContext *pes = ts->pids[i]->u.pes_filter.opaque;
2933  av_buffer_unref(&pes->buffer);
2934  pes->data_index = 0;
2935  pes->state = MPEGTS_SKIP; /* skip until pes header */
2936  } else if (ts->pids[i]->type == MPEGTS_SECTION) {
2937  ts->pids[i]->u.section_filter.last_ver = -1;
2938  }
2939  ts->pids[i]->last_cc = -1;
2940  ts->pids[i]->last_pcr = -1;
2941  }
2942  }
2943  }
2944 
2945  ts->stop_parse = 0;
2946  packet_num = 0;
2947  memset(packet + TS_PACKET_SIZE, 0, AV_INPUT_BUFFER_PADDING_SIZE);
2948  for (;;) {
2949  packet_num++;
2950  if (nb_packets != 0 && packet_num >= nb_packets ||
2951  ts->stop_parse > 1) {
2952  ret = AVERROR(EAGAIN);
2953  break;
2954  }
2955  if (ts->stop_parse > 0)
2956  break;
2957 
2958  ret = read_packet(s, packet, ts->raw_packet_size, &data);
2959  if (ret != 0)
2960  break;
2961  ret = handle_packet(ts, data, avio_tell(s->pb));
2963  if (ret != 0)
2964  break;
2965  }
2966  ts->last_pos = avio_tell(s->pb);
2967  return ret;
2968 }
2969 
2970 static int mpegts_probe(const AVProbeData *p)
2971 {
2972  const int size = p->buf_size;
2973  int maxscore = 0;
2974  int sumscore = 0;
2975  int i;
2976  int check_count = size / TS_FEC_PACKET_SIZE;
2977 #define CHECK_COUNT 10
2978 #define CHECK_BLOCK 100
2979 
2980  if (!check_count)
2981  return 0;
2982 
2983  for (i = 0; i<check_count; i+=CHECK_BLOCK) {
2984  int left = FFMIN(check_count - i, CHECK_BLOCK);
2985  int score = analyze(p->buf + TS_PACKET_SIZE *i, TS_PACKET_SIZE *left, TS_PACKET_SIZE , 1);
2988  score = FFMAX3(score, dvhs_score, fec_score);
2989  sumscore += score;
2990  maxscore = FFMAX(maxscore, score);
2991  }
2992 
2993  sumscore = sumscore * CHECK_COUNT / check_count;
2994  maxscore = maxscore * CHECK_COUNT / CHECK_BLOCK;
2995 
2996  ff_dlog(0, "TS score: %d %d\n", sumscore, maxscore);
2997 
2998  if (check_count > CHECK_COUNT && sumscore > 6) {
2999  return AVPROBE_SCORE_MAX + sumscore - CHECK_COUNT;
3000  } else if (check_count >= CHECK_COUNT && sumscore > 6) {
3001  return AVPROBE_SCORE_MAX/2 + sumscore - CHECK_COUNT;
3002  } else if (check_count >= CHECK_COUNT && maxscore > 6) {
3003  return AVPROBE_SCORE_MAX/2 + sumscore - CHECK_COUNT;
3004  } else if (sumscore > 6) {
3005  return 2;
3006  } else {
3007  return 0;
3008  }
3009 }
3010 
3011 /* return the 90kHz PCR and the extension for the 27MHz PCR. return
3012  * (-1) if not available */
3013 static int parse_pcr(int64_t *ppcr_high, int *ppcr_low, const uint8_t *packet)
3014 {
3015  int afc, len, flags;
3016  const uint8_t *p;
3017  unsigned int v;
3018 
3019  afc = (packet[3] >> 4) & 3;
3020  if (afc <= 1)
3021  return AVERROR_INVALIDDATA;
3022  p = packet + 4;
3023  len = p[0];
3024  p++;
3025  if (len == 0)
3026  return AVERROR_INVALIDDATA;
3027  flags = *p++;
3028  len--;
3029  if (!(flags & 0x10))
3030  return AVERROR_INVALIDDATA;
3031  if (len < 6)
3032  return AVERROR_INVALIDDATA;
3033  v = AV_RB32(p);
3034  *ppcr_high = ((int64_t) v << 1) | (p[4] >> 7);
3035  *ppcr_low = ((p[4] & 1) << 8) | p[5];
3036  return 0;
3037 }
3038 
3039 static void seek_back(AVFormatContext *s, AVIOContext *pb, int64_t pos) {
3040 
3041  /* NOTE: We attempt to seek on non-seekable files as well, as the
3042  * probe buffer usually is big enough. Only warn if the seek failed
3043  * on files where the seek should work. */
3044  if (avio_seek(pb, pos, SEEK_SET) < 0)
3045  av_log(s, (pb->seekable & AVIO_SEEKABLE_NORMAL) ? AV_LOG_ERROR : AV_LOG_INFO, "Unable to seek back to the start\n");
3046 }
3047 
3049 {
3050  MpegTSContext *ts = s->priv_data;
3051  AVIOContext *pb = s->pb;
3052  int64_t pos, probesize = s->probesize;
3053 
3054  s->internal->prefer_codec_framerate = 1;
3055 
3056  if (ffio_ensure_seekback(pb, probesize) < 0)
3057  av_log(s, AV_LOG_WARNING, "Failed to allocate buffers for seekback\n");
3058 
3059  pos = avio_tell(pb);
3061  if (ts->raw_packet_size <= 0) {
3062  av_log(s, AV_LOG_WARNING, "Could not detect TS packet size, defaulting to non-FEC/DVHS\n");
3064  }
3065  ts->stream = s;
3066  ts->auto_guess = 0;
3067 
3068  if (s->iformat == &ff_mpegts_demuxer) {
3069  /* normal demux */
3070 
3071  /* first do a scan to get all the services */
3072  seek_back(s, pb, pos);
3073 
3077 
3078  handle_packets(ts, probesize / ts->raw_packet_size);
3079  /* if could not find service, enable auto_guess */
3080 
3081  ts->auto_guess = 1;
3082 
3083  av_log(ts->stream, AV_LOG_TRACE, "tuning done\n");
3084 
3085  s->ctx_flags |= AVFMTCTX_NOHEADER;
3086  } else {
3087  AVStream *st;
3088  int pcr_pid, pid, nb_packets, nb_pcrs, ret, pcr_l;
3089  int64_t pcrs[2], pcr_h;
3090  int packet_count[2];
3091  uint8_t packet[TS_PACKET_SIZE];
3092  const uint8_t *data;
3093 
3094  /* only read packets */
3095 
3096  st = avformat_new_stream(s, NULL);
3097  if (!st)
3098  return AVERROR(ENOMEM);
3099  avpriv_set_pts_info(st, 60, 1, 27000000);
3102 
3103  /* we iterate until we find two PCRs to estimate the bitrate */
3104  pcr_pid = -1;
3105  nb_pcrs = 0;
3106  nb_packets = 0;
3107  for (;;) {
3108  ret = read_packet(s, packet, ts->raw_packet_size, &data);
3109  if (ret < 0)
3110  return ret;
3111  pid = AV_RB16(data + 1) & 0x1fff;
3112  if ((pcr_pid == -1 || pcr_pid == pid) &&
3113  parse_pcr(&pcr_h, &pcr_l, data) == 0) {
3115  pcr_pid = pid;
3116  packet_count[nb_pcrs] = nb_packets;
3117  pcrs[nb_pcrs] = pcr_h * 300 + pcr_l;
3118  nb_pcrs++;
3119  if (nb_pcrs >= 2) {
3120  if (pcrs[1] - pcrs[0] > 0) {
3121  /* the difference needs to be positive to make sense for bitrate computation */
3122  break;
3123  } else {
3124  av_log(ts->stream, AV_LOG_WARNING, "invalid pcr pair %"PRId64" >= %"PRId64"\n", pcrs[0], pcrs[1]);
3125  pcrs[0] = pcrs[1];
3126  packet_count[0] = packet_count[1];
3127  nb_pcrs--;
3128  }
3129  }
3130  } else {
3132  }
3133  nb_packets++;
3134  }
3135 
3136  /* NOTE1: the bitrate is computed without the FEC */
3137  /* NOTE2: it is only the bitrate of the start of the stream */
3138  ts->pcr_incr = (pcrs[1] - pcrs[0]) / (packet_count[1] - packet_count[0]);
3139  ts->cur_pcr = pcrs[0] - ts->pcr_incr * packet_count[0];
3140  s->bit_rate = TS_PACKET_SIZE * 8 * 27000000LL / ts->pcr_incr;
3141  st->codecpar->bit_rate = s->bit_rate;
3142  st->start_time = ts->cur_pcr;
3143  av_log(ts->stream, AV_LOG_TRACE, "start=%0.3f pcr=%0.3f incr=%"PRId64"\n",
3144  st->start_time / 1000000.0, pcrs[0] / 27e6, ts->pcr_incr);
3145  }
3146 
3147  seek_back(s, pb, pos);
3148  return 0;
3149 }
3150 
3151 #define MAX_PACKET_READAHEAD ((128 * 1024) / 188)
3152 
3154 {
3155  MpegTSContext *ts = s->priv_data;
3156  int ret, i;
3157  int64_t pcr_h, next_pcr_h, pos;
3158  int pcr_l, next_pcr_l;
3159  uint8_t pcr_buf[12];
3160  const uint8_t *data;
3161 
3162  if ((ret = av_new_packet(pkt, TS_PACKET_SIZE)) < 0)
3163  return ret;
3165  pkt->pos = avio_tell(s->pb);
3166  if (ret < 0) {
3167  return ret;
3168  }
3169  if (data != pkt->data)
3170  memcpy(pkt->data, data, TS_PACKET_SIZE);
3172  if (ts->mpeg2ts_compute_pcr) {
3173  /* compute exact PCR for each packet */
3174  if (parse_pcr(&pcr_h, &pcr_l, pkt->data) == 0) {
3175  /* we read the next PCR (XXX: optimize it by using a bigger buffer */
3176  pos = avio_tell(s->pb);
3177  for (i = 0; i < MAX_PACKET_READAHEAD; i++) {
3178  avio_seek(s->pb, pos + i * ts->raw_packet_size, SEEK_SET);
3179  avio_read(s->pb, pcr_buf, 12);
3180  if (parse_pcr(&next_pcr_h, &next_pcr_l, pcr_buf) == 0) {
3181  /* XXX: not precise enough */
3182  ts->pcr_incr =
3183  ((next_pcr_h - pcr_h) * 300 + (next_pcr_l - pcr_l)) /
3184  (i + 1);
3185  break;
3186  }
3187  }
3188  avio_seek(s->pb, pos, SEEK_SET);
3189  /* no next PCR found: we use previous increment */
3190  ts->cur_pcr = pcr_h * 300 + pcr_l;
3191  }
3192  pkt->pts = ts->cur_pcr;
3193  pkt->duration = ts->pcr_incr;
3194  ts->cur_pcr += ts->pcr_incr;
3195  }
3196  pkt->stream_index = 0;
3197  return 0;
3198 }
3199 
3201 {
3202  MpegTSContext *ts = s->priv_data;
3203  int ret, i;
3204 
3205  pkt->size = -1;
3206  ts->pkt = pkt;
3207  ret = handle_packets(ts, 0);
3208  if (ret < 0) {
3209  av_packet_unref(ts->pkt);
3210  /* flush pes data left */
3211  for (i = 0; i < NB_PID_MAX; i++)
3212  if (ts->pids[i] && ts->pids[i]->type == MPEGTS_PES) {
3213  PESContext *pes = ts->pids[i]->u.pes_filter.opaque;
3214  if (pes->state == MPEGTS_PAYLOAD && pes->data_index > 0) {
3215  ret = new_pes_packet(pes, pkt);
3216  if (ret < 0)
3217  return ret;
3218  pes->state = MPEGTS_SKIP;
3219  ret = 0;
3220  break;
3221  }
3222  }
3223  }
3224 
3225  if (!ret && pkt->size < 0)
3227  return ret;
3228 }
3229 
3230 static void mpegts_free(MpegTSContext *ts)
3231 {
3232  int i;
3233 
3234  clear_programs(ts);
3235 
3236  for (i = 0; i < FF_ARRAY_ELEMS(ts->pools); i++)
3237  av_buffer_pool_uninit(&ts->pools[i]);
3238 
3239  for (i = 0; i < NB_PID_MAX; i++)
3240  if (ts->pids[i])
3241  mpegts_close_filter(ts, ts->pids[i]);
3242 }
3243 
3245 {
3246  MpegTSContext *ts = s->priv_data;
3247  mpegts_free(ts);
3248  return 0;
3249 }
3250 
3251 static av_unused int64_t mpegts_get_pcr(AVFormatContext *s, int stream_index,
3252  int64_t *ppos, int64_t pos_limit)
3253 {
3254  MpegTSContext *ts = s->priv_data;
3255  int64_t pos, timestamp;
3256  uint8_t buf[TS_PACKET_SIZE];
3257  int pcr_l, pcr_pid =
3258  ((PESContext *)s->streams[stream_index]->priv_data)->pcr_pid;
3259  int pos47 = ts->pos47_full % ts->raw_packet_size;
3260  pos =
3261  ((*ppos + ts->raw_packet_size - 1 - pos47) / ts->raw_packet_size) *
3262  ts->raw_packet_size + pos47;
3263  while(pos < pos_limit) {
3264  if (avio_seek(s->pb, pos, SEEK_SET) < 0)
3265  return AV_NOPTS_VALUE;
3266  if (avio_read(s->pb, buf, TS_PACKET_SIZE) != TS_PACKET_SIZE)
3267  return AV_NOPTS_VALUE;
3268  if (buf[0] != 0x47) {
3269  if (mpegts_resync(s, TS_PACKET_SIZE, buf) < 0)
3270  return AV_NOPTS_VALUE;
3271  pos = avio_tell(s->pb);
3272  continue;
3273  }
3274  if ((pcr_pid < 0 || (AV_RB16(buf + 1) & 0x1fff) == pcr_pid) &&
3275  parse_pcr(&timestamp, &pcr_l, buf) == 0) {
3276  *ppos = pos;
3277  return timestamp;
3278  }
3279  pos += ts->raw_packet_size;
3280  }
3281 
3282  return AV_NOPTS_VALUE;
3283 }
3284 
3285 static int64_t mpegts_get_dts(AVFormatContext *s, int stream_index,
3286  int64_t *ppos, int64_t pos_limit)
3287 {
3288  MpegTSContext *ts = s->priv_data;
3289  int64_t pos;
3290  int pos47 = ts->pos47_full % ts->raw_packet_size;
3291  pos = ((*ppos + ts->raw_packet_size - 1 - pos47) / ts->raw_packet_size) * ts->raw_packet_size + pos47;
3293  if (avio_seek(s->pb, pos, SEEK_SET) < 0)
3294  return AV_NOPTS_VALUE;
3295  while(pos < pos_limit) {
3296  int ret;
3297  AVPacket pkt;
3298  av_init_packet(&pkt);
3299  ret = av_read_frame(s, &pkt);
3300  if (ret < 0)
3301  return AV_NOPTS_VALUE;
3302  if (pkt.dts != AV_NOPTS_VALUE && pkt.pos >= 0) {
3304  av_add_index_entry(s->streams[pkt.stream_index], pkt.pos, pkt.dts, 0, 0, AVINDEX_KEYFRAME /* FIXME keyframe? */);
3305  if (pkt.stream_index == stream_index && pkt.pos >= *ppos) {
3306  int64_t dts = pkt.dts;
3307  *ppos = pkt.pos;
3308  av_packet_unref(&pkt);
3309  return dts;
3310  }
3311  }
3312  pos = pkt.pos;
3313  av_packet_unref(&pkt);
3314  }
3315 
3316  return AV_NOPTS_VALUE;
3317 }
3318 
3319 /**************************************************************/
3320 /* parsing functions - called from other demuxers such as RTP */
3321 
3323 {
3324  MpegTSContext *ts;
3325 
3326  ts = av_mallocz(sizeof(MpegTSContext));
3327  if (!ts)
3328  return NULL;
3329  /* no stream case, currently used by RTP */
3331  ts->stream = s;
3332  ts->auto_guess = 1;
3333 
3337 
3338  return ts;
3339 }
3340 
3341 /* return the consumed length if a packet was output, or -1 if no
3342  * packet is output */
3344  const uint8_t *buf, int len)
3345 {
3346  int len1;
3347 
3348  len1 = len;
3349  ts->pkt = pkt;
3350  for (;;) {
3351  ts->stop_parse = 0;
3352  if (len < TS_PACKET_SIZE)
3353  return AVERROR_INVALIDDATA;
3354  if (buf[0] != 0x47) {
3355  buf++;
3356  len--;
3357  } else {
3358  handle_packet(ts, buf, len1 - len + TS_PACKET_SIZE);
3359  buf += TS_PACKET_SIZE;
3360  len -= TS_PACKET_SIZE;
3361  if (ts->stop_parse == 1)
3362  break;
3363  }
3364  }
3365  return len1 - len;
3366 }
3367 
3369 {
3370  mpegts_free(ts);
3371  av_free(ts);
3372 }
3373 
3375  .name = "mpegts",
3376  .long_name = NULL_IF_CONFIG_SMALL("MPEG-TS (MPEG-2 Transport Stream)"),
3377  .priv_data_size = sizeof(MpegTSContext),
3382  .read_timestamp = mpegts_get_dts,
3384  .priv_class = &mpegts_class,
3385 };
3386 
3388  .name = "mpegtsraw",
3389  .long_name = NULL_IF_CONFIG_SMALL("raw MPEG-TS (MPEG-2 Transport Stream)"),
3390  .priv_data_size = sizeof(MpegTSContext),
3394  .read_timestamp = mpegts_get_dts,
3396  .priv_class = &mpegtsraw_class,
3397 };
parse_MP4DecConfigDescrTag
static int parse_MP4DecConfigDescrTag(MP4DescrParseContext *d, int64_t off, int len)
Definition: mpegts.c:1527
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:890
av_packet_unref
void av_packet_unref(AVPacket *pkt)
Wipe the packet.
Definition: avpacket.c:605
parse_mp4_descr_arr
static int parse_mp4_descr_arr(MP4DescrParseContext *d, int64_t off, int len)
Definition: mpegts.c:1469
new_pes_packet
static int new_pes_packet(PESContext *pes, AVPacket *pkt)
Definition: mpegts.c:988
AVMEDIA_TYPE_SUBTITLE
@ AVMEDIA_TYPE_SUBTITLE
Definition: avutil.h:204
skip_bits_long
static void skip_bits_long(GetBitContext *s, int n)
Skips the specified number of bits.
Definition: get_bits.h:291
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:182
StreamType::stream_type
uint32_t stream_type
Definition: mpegts.c:784
AVCodecParameters::extradata
uint8_t * extradata
Extra binary data needed for initializing the decoder, codec-dependent.
Definition: codec_par.h:74
MP4DescrParseContext::descr_count
int descr_count
Definition: mpegts.c:1431
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:304
AV_CODEC_ID_AC3
@ AV_CODEC_ID_AC3
Definition: codec_id.h:413
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:226
MpegTSFilter::discard
int discard
Definition: mpegts.c:101
get_bits_left
static int get_bits_left(GetBitContext *gb)
Definition: get_bits.h:849
r
const char * r
Definition: vf_curves.c:114
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
avformat_new_stream
AVStream * avformat_new_stream(AVFormatContext *s, const AVCodec *c)
Add a new stream to a media file.
Definition: utils.c:4526
MAX_LEVEL
#define MAX_LEVEL
Definition: mpegts.c:1425
AV_CODEC_ID_PCM_BLURAY
@ AV_CODEC_ID_PCM_BLURAY
Definition: codec_id.h:325
PAT_PID
#define PAT_PID
Definition: mpegts.h:37
AV_OPT_FLAG_READONLY
#define AV_OPT_FLAG_READONLY
The option may not be set through the AVOptions API, only read.
Definition: opt.h:289
AVCodecParameters::codec_type
enum AVMediaType codec_type
General type of the encoded data.
Definition: codec_par.h:56
AVFMT_SHOW_IDS
#define AVFMT_SHOW_IDS
Show format stream IDs numbers.
Definition: avformat.h:460
mpegts.h
AVProgram::nb_stream_indexes
unsigned int nb_stream_indexes
Definition: avformat.h:1262
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:215
out
FILE * out
Definition: movenc.c:54
ff_parse_pes_pts
static int64_t ff_parse_pes_pts(const uint8_t *buf)
Parse MPEG-PES five-byte timestamp.
Definition: mpeg.h:68
TS_DVHS_PACKET_SIZE
#define TS_DVHS_PACKET_SIZE
Definition: mpegts.h:28
AVStreamInternal::avctx
AVCodecContext * avctx
The codec context used by avformat_find_stream_info, the parser, etc.
Definition: internal.h:169
pmt_cb
static void pmt_cb(MpegTSFilter *filter, const uint8_t *section, int section_len)
Definition: mpegts.c:2276
AVBufferPool
The buffer pool.
Definition: buffer_internal.h:77
MpegTSFilter::pid
int pid
Definition: mpegts.c:97
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:682
STREAM_TYPE_PRIVATE_DATA
#define STREAM_TYPE_PRIVATE_DATA
Definition: mpeg.h:54
PESContext::flags
int flags
copied to the AVPacket flags
Definition: mpegts.c:247
AVStream::priv_data
void * priv_data
Definition: avformat.h:880
AVERROR_EOF
#define AVERROR_EOF
End of file.
Definition: error.h:55
avpriv_mpegts_parse_packet
int avpriv_mpegts_parse_packet(MpegTSContext *ts, AVPacket *pkt, const uint8_t *buf, int len)
Definition: mpegts.c:3343
AVBufferRef::data
uint8_t * data
The data buffer.
Definition: buffer.h:89
opus_default_extradata
static const uint8_t opus_default_extradata[30]
Definition: opus.h:56
MKTAG
#define MKTAG(a, b, c, d)
Definition: common.h:406
avcodec_get_type
enum AVMediaType avcodec_get_type(enum AVCodecID codec_id)
Get the type of the given codec.
Definition: codec_desc.c:3419
AVStream::discard
enum AVDiscard discard
Selects which packets can be discarded at will and do not need to be demuxed.
Definition: avformat.h:920
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: utils.c:4234
AVStream::program_num
int program_num
Details of the MPEG-TS program which created this stream.
Definition: avformat.h:1109
mpegts_close_filter
static void mpegts_close_filter(MpegTSContext *ts, MpegTSFilter *filter)
Definition: mpegts.c:553
AV_CODEC_ID_DIRAC
@ AV_CODEC_ID_DIRAC
Definition: codec_id.h:165
SLConfigDescr::au_seq_num_len
int au_seq_num_len
Definition: mpegts.h:160
Program::pmt_found
int pmt_found
have we found pmt for this program
Definition: mpegts.c:116
get_bits_count
static int get_bits_count(const GetBitContext *s)
Definition: get_bits.h:219
PESContext::dts
int64_t dts
Definition: mpegts.c:252
METADATA_types
static const StreamType METADATA_types[]
Definition: mpegts.c:857
av_unused
#define av_unused
Definition: attributes.h:131
MP4DescrParseContext::max_descr_count
int max_descr_count
Definition: mpegts.c:1432
AV_CODEC_ID_MPEG4
@ AV_CODEC_ID_MPEG4
Definition: codec_id.h:61
MpegTSContext::skip_changes
int skip_changes
Definition: mpegts.c:148
AVFormatContext::streams
AVStream ** streams
A list of all streams in the file.
Definition: avformat.h:1403
ff_mp4_read_dec_config_descr
int ff_mp4_read_dec_config_descr(AVFormatContext *fc, AVStream *st, AVIOContext *pb)
Definition: isom.c:515
mpegts_find_stream_type
static void mpegts_find_stream_type(AVStream *st, uint32_t stream_type, const StreamType *types)
Definition: mpegts.c:873
MpegTSContext::auto_guess
int auto_guess
if true, all pids are analyzed to find streams
Definition: mpegts.c:129
AVPacket::data
uint8_t * data
Definition: packet.h:355
AV_CODEC_ID_DVB_TELETEXT
@ AV_CODEC_ID_DVB_TELETEXT
Definition: codec_id.h:515
PESContext::total_size
int total_size
Definition: mpegts.c:248
AVStream::internal
AVStreamInternal * internal
An opaque field for libavformat internal usage.
Definition: avformat.h:1220
clear_avprogram
static void clear_avprogram(MpegTSContext *ts, unsigned int programid)
Definition: mpegts.c:273
CHECK_BLOCK
#define CHECK_BLOCK
AVOption
AVOption.
Definition: opt.h:246
MpegTSSectionFilter
Definition: mpegts.c:83
MPEGTS_SECTION
@ MPEGTS_SECTION
Definition: mpegts.c:65
getstr8
static char * getstr8(const uint8_t **pp, const uint8_t *p_end)
Definition: mpegts.c:687
MpegTSSectionFilter::section_h_size
int section_h_size
Definition: mpegts.c:85
AV_CODEC_ID_AVS2
@ AV_CODEC_ID_AVS2
Definition: codec_id.h:243
data
const char data[16]
Definition: mxf.c:91
opus.h
MpegTSFilter::section_filter
MpegTSSectionFilter section_filter
Definition: mpegts.c:105
MpegTSState
MpegTSState
Definition: mpegts.c:223
MP4SLDescrTag
#define MP4SLDescrTag
Definition: isom.h:306
AV_LOG_VERBOSE
#define AV_LOG_VERBOSE
Detailed information.
Definition: log.h:192
MP4DescrParseContext::s
AVFormatContext * s
Definition: mpegts.c:1427
buffer_pool_get
static AVBufferRef * buffer_pool_get(MpegTSContext *ts, int size)
Definition: mpegts.c:1106
PES_HEADER_SIZE
#define PES_HEADER_SIZE
Definition: mpegts.c:233
fc
#define fc(width, name, range_min, range_max)
Definition: cbs_av1.c:555
AVFormatContext::programs
AVProgram ** programs
Definition: avformat.h:1515
AVPacket::duration
int64_t duration
Duration of this packet in AVStream->time_base units, 0 if unknown.
Definition: packet.h:373
AVCodecParameters::codec_tag
uint32_t codec_tag
Additional information about the codec (corresponds to the AVI FOURCC).
Definition: codec_par.h:64
mathematics.h
filter
filter_frame For filters that do not use the this method is called when a frame is pushed to the filter s input It can be called at any time except in a reentrant way If the input frame is enough to produce then the filter should push the output frames on the output link immediately As an exception to the previous rule if the input frame is enough to produce several output frames then the filter needs output only at least one per link The additional frames can be left buffered in the filter
Definition: filter_design.txt:228
AVProbeData::buf_size
int buf_size
Size of buf except extra allocated bytes.
Definition: avformat.h:444
AVStream::pmt_version
int pmt_version
Definition: avformat.h:1110
SetServiceCallback
void SetServiceCallback(void *opaque, int ret)
Definition: mpegts.c:81
av_read_frame
int av_read_frame(AVFormatContext *s, AVPacket *pkt)
Return the next frame of a stream.
Definition: utils.c:1780
avcodec_is_open
int avcodec_is_open(AVCodecContext *s)
Definition: utils.c:1962
AV_CODEC_ID_HDMV_PGS_SUBTITLE
@ AV_CODEC_ID_HDMV_PGS_SUBTITLE
Definition: codec_id.h:514
PESContext::pts
int64_t pts
Definition: mpegts.c:252
AV_CODEC_ID_TRUEHD
@ AV_CODEC_ID_TRUEHD
Definition: codec_id.h:454
MAX_PES_PAYLOAD
#define MAX_PES_PAYLOAD
Definition: mpegts.c:49
init_get_bits
static int init_get_bits(GetBitContext *s, const uint8_t *buffer, int bit_size)
Initialize GetBitContext.
Definition: get_bits.h:659
MpegTSContext::nb_prg
unsigned int nb_prg
structure to keep track of Program->pids mapping
Definition: mpegts.c:161
MpegTSPESFilter::pes_cb
PESCallback * pes_cb
Definition: mpegts.c:75
AV_CODEC_ID_BIN_DATA
@ AV_CODEC_ID_BIN_DATA
Definition: codec_id.h:549
av_malloc
#define av_malloc(s)
Definition: tableprint_vlc.h:31
PESContext::pcr_pid
int pcr_pid
if -1 then all packets containing PCR are considered
Definition: mpegts.c:238
AVINDEX_KEYFRAME
#define AVINDEX_KEYFRAME
Definition: avformat.h:803
SectionHeader::id
uint16_t id
Definition: mpegts.c:642
SLConfigDescr::use_idle
int use_idle
Definition: mpegts.h:153
crc.h
skip_bits
static void skip_bits(GetBitContext *s, int n)
Definition: get_bits.h:467
AVPROBE_SCORE_MAX
#define AVPROBE_SCORE_MAX
maximum score
Definition: avformat.h:453
PROBE_PACKET_MAX_BUF
#define PROBE_PACKET_MAX_BUF
Definition: mpegts.c:60
mpegtsraw_class
static const AVClass mpegtsraw_class
Definition: mpegts.c:214
get_bits
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
Definition: get_bits.h:379
av_buffer_pool_init
AVBufferPool * av_buffer_pool_init(int size, AVBufferRef *(*alloc)(int size))
Allocate and initialize a buffer pool.
Definition: buffer.c:239
PESContext::state
enum MpegTSState state
Definition: mpegts.c:244
AVStream::pts_wrap_reference
int64_t pts_wrap_reference
Internal data to check for wrapping of the time stamp.
Definition: avformat.h:1172
MpegTSFilter::pes_filter
MpegTSPESFilter pes_filter
Definition: mpegts.c:104
SLConfigDescr::inst_bitrate_len
int inst_bitrate_len
Definition: mpegts.h:158
mpegts_read_close
static int mpegts_read_close(AVFormatContext *s)
Definition: mpegts.c:3244
mpegts_raw_read_packet
static int mpegts_raw_read_packet(AVFormatContext *s, AVPacket *pkt)
Definition: mpegts.c:3153
update_av_program_info
static void update_av_program_info(AVFormatContext *s, unsigned int programid, unsigned int pid, int version)
Definition: mpegts.c:347
MP4ODescrTag
#define MP4ODescrTag
Definition: isom.h:301
PESCallback
int PESCallback(MpegTSFilter *f, const uint8_t *buf, int len, int is_start, int64_t pos)
Definition: mpegts.c:71
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: utils.c:2052
pat_cb
static void pat_cb(MpegTSFilter *filter, const uint8_t *section, int section_len)
Definition: mpegts.c:2486
GetBitContext
Definition: get_bits.h:61
Program::nb_pids
unsigned int nb_pids
Definition: mpegts.c:112
SLConfigDescr::use_padding
int use_padding
Definition: mpegts.h:151
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:1636
AVProgram::discard
enum AVDiscard discard
selects which program to discard and which to feed to the caller
Definition: avformat.h:1260
read_close
static av_cold int read_close(AVFormatContext *ctx)
Definition: libcdio.c:145
AV_DISPOSITION_STILL_IMAGE
#define AV_DISPOSITION_STILL_IMAGE
still images in video stream (still_picture_flag=1 in mpegts)
Definition: avformat.h:849
avio_tell
static av_always_inline int64_t avio_tell(AVIOContext *s)
ftell() equivalent for AVIOContext.
Definition: avio.h:557
SectionHeader::last_sec_num
uint8_t last_sec_num
Definition: mpegts.c:645
val
static double val(void *priv, double ch)
Definition: aeval.c:76
EIT_TID
#define EIT_TID
Definition: mpegts.h:95
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:302
PESContext::sl
SLConfigDescr sl
Definition: mpegts.c:256
SLConfigDescr::use_rand_acc_pt
int use_rand_acc_pt
Definition: mpegts.h:150
SDT_PID
#define SDT_PID
Definition: mpegts.h:43
av_new_program
AVProgram * av_new_program(AVFormatContext *s, int id)
Definition: utils.c:4625
AV_CODEC_ID_MP3
@ AV_CODEC_ID_MP3
preferred ID for decoding MPEG audio layer 1, 2 or 3
Definition: codec_id.h:411
PESContext::stream
AVFormatContext * stream
Definition: mpegts.c:241
SLConfigDescr::timestamp_len
int timestamp_len
Definition: mpegts.h:155
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:24
AV_CODEC_ID_DVB_SUBTITLE
@ AV_CODEC_ID_DVB_SUBTITLE
Definition: codec_id.h:509
PESContext::sub_st
AVStream * sub_st
stream for the embedded AC3 stream in HDMV TrueHD
Definition: mpegts.c:243
ff_mp4_parse_es_descr
void ff_mp4_parse_es_descr(AVIOContext *pb, int *es_id)
Definition: isom.c:490
MpegTSContext::merge_pmt_versions
int merge_pmt_versions
Definition: mpegts.c:155
AV_DISPOSITION_CLEAN_EFFECTS
#define AV_DISPOSITION_CLEAN_EFFECTS
stream without voice
Definition: avformat.h:825
PESContext::header
uint8_t header[MAX_PES_HEADER_SIZE]
Definition: mpegts.c:254
avassert.h
MPEGTS_OPTIONS
#define MPEGTS_OPTIONS
Definition: mpegts.c:173
avio_rb32
unsigned int avio_rb32(AVIOContext *s)
Definition: aviobuf.c:778
MpegTSContext::pos47_full
int64_t pos47_full
Definition: mpegts.c:126
AV_LOG_TRACE
#define AV_LOG_TRACE
Extremely verbose debugging, useful for libav* development.
Definition: log.h:202
avpriv_mpegts_parse_close
void avpriv_mpegts_parse_close(MpegTSContext *ts)
Definition: mpegts.c:3368
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:176
AVStream::pts_wrap_behavior
int pts_wrap_behavior
Options for behavior, when a wrap is detected.
Definition: avformat.h:1184
AVInputFormat
Definition: avformat.h:636
StreamType::codec_id
enum AVCodecID codec_id
Definition: mpegts.c:786
PESContext
Definition: mpegts.c:236
AV_PKT_FLAG_CORRUPT
#define AV_PKT_FLAG_CORRUPT
The packet content is corrupted.
Definition: packet.h:389
Mp4Descr::sl
SLConfigDescr sl
Definition: mpegts.h:168
opus_coupled_stream_cnt
static const uint8_t opus_coupled_stream_cnt[9]
Definition: mpegts.c:1760
find_matching_stream
static AVStream * find_matching_stream(MpegTSContext *ts, int pid, unsigned int programid, int stream_identifier, int pmt_stream_idx)
Definition: mpegts.c:2202
AVFormatContext::ctx_flags
int ctx_flags
Flags signalling stream properties.
Definition: avformat.h:1384
AVProgram::id
int id
Definition: avformat.h:1258
ff_parse_mpeg2_descriptor
int ff_parse_mpeg2_descriptor(AVFormatContext *fc, AVStream *st, int stream_type, 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:1779
MpegTSContext::pools
AVBufferPool * pools[32]
Definition: mpegts.c:170
parse_pcr
static int parse_pcr(int64_t *ppcr_high, int *ppcr_low, const uint8_t *packet)
Definition: mpegts.c:3013
AV_CODEC_ID_S302M
@ AV_CODEC_ID_S302M
Definition: codec_id.h:327
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:337
MpegTSContext::stream
AVFormatContext * stream
Definition: mpegts.c:122
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:556
FFMAX3
#define FFMAX3(a, b, c)
Definition: common.h:95
intreadwrite.h
s
#define s(width, name)
Definition: cbs_vp9.c:257
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: avpacket.c:88
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:3251
mpegts_class
static const AVClass mpegts_class
Definition: mpegts.c:195
AVFormatContext::nb_programs
unsigned int nb_programs
Definition: avformat.h:1514
AVInputFormat::name
const char * name
A comma separated list of short names for the format.
Definition: avformat.h:641
AVProbeData::buf
unsigned char * buf
Buffer must have AVPROBE_PADDING_SIZE of extra allocated bytes filled with zero.
Definition: avformat.h:443
AVMEDIA_TYPE_AUDIO
@ AVMEDIA_TYPE_AUDIO
Definition: avutil.h:202
FF_PROFILE_ARIB_PROFILE_C
#define FF_PROFILE_ARIB_PROFILE_C
Definition: avcodec.h:1972
bits
uint8_t bits
Definition: vp3data.h:202
SLConfigDescr::degr_prior_len
int degr_prior_len
Definition: mpegts.h:159
FF_PROFILE_UNKNOWN
#define FF_PROFILE_UNKNOWN
Definition: avcodec.h:1860
av_assert0
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:37
AV_LOG_DEBUG
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:197
AVStream::need_parsing
enum AVStreamParseType need_parsing
Definition: avformat.h:1083
mpegts_open_filter
static MpegTSFilter * mpegts_open_filter(MpegTSContext *ts, unsigned int pid, enum MpegTSFilterType type)
Definition: mpegts.c:482
AVDOVIDecoderConfigurationRecord::dv_profile
uint8_t dv_profile
Definition: dovi_meta.h:54
PES_START_SIZE
#define PES_START_SIZE
Definition: mpegts.c:232
MpegTSContext::resync_size
int resync_size
Definition: mpegts.c:154
channels
channels
Definition: aptx.h:33
get_bits.h
SectionHeader::sec_num
uint8_t sec_num
Definition: mpegts.c:644
PESContext::stream_type
int stream_type
Definition: mpegts.c:239
parse_MP4IODescrTag
static int parse_MP4IODescrTag(MP4DescrParseContext *d, int64_t off, int len)
Definition: mpegts.c:1480
PMT_TID
#define PMT_TID
Definition: mpegts.h:81
skip_identical
static int skip_identical(const SectionHeader *h, MpegTSSectionFilter *tssf)
Definition: mpegts.c:648
opus_stream_cnt
static const uint8_t opus_stream_cnt[9]
Definition: mpegts.c:1764
AVMEDIA_TYPE_DATA
@ AVMEDIA_TYPE_DATA
Opaque data information usually continuous.
Definition: avutil.h:203
f
#define f(width, name)
Definition: cbs_vp9.c:255
AV_CODEC_ID_H264
@ AV_CODEC_ID_H264
Definition: codec_id.h:76
av_packet_new_side_data
uint8_t * av_packet_new_side_data(AVPacket *pkt, enum AVPacketSideDataType type, int size)
Allocate new information of a packet.
Definition: avpacket.c:332
AVDOVIDecoderConfigurationRecord::dv_version_major
uint8_t dv_version_major
Definition: dovi_meta.h:52
MPEGTS_SKIP
@ MPEGTS_SKIP
Definition: mpegts.c:228
MpegTSPESFilter::opaque
void * opaque
Definition: mpegts.c:76
get8
static int get8(const uint8_t **pp, const uint8_t *p_end)
Definition: mpegts.c:659
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:377
AV_CODEC_ID_ARIB_CAPTION
@ AV_CODEC_ID_ARIB_CAPTION
Definition: codec_id.h:534
if
if(ret)
Definition: filter_design.txt:179
MpegTSContext::cur_pcr
int64_t cur_pcr
used to estimate the exact PCR
Definition: mpegts.c:137
clear_programs
static void clear_programs(MpegTSContext *ts)
Definition: mpegts.c:300
MP4ESDescrTag
#define MP4ESDescrTag
Definition: isom.h:303
MP4DescrParseContext::active_descr
Mp4Descr * active_descr
Definition: mpegts.c:1430
AVDISCARD_ALL
@ AVDISCARD_ALL
discard all
Definition: avcodec.h:236
AVFormatContext
Format I/O context.
Definition: avformat.h:1335
internal.h
MpegTSContext::pcr_incr
int64_t pcr_incr
used to estimate the exact PCR
Definition: mpegts.c:138
AVPacket::buf
AVBufferRef * buf
A reference to the reference-counted buffer where the packet data is stored.
Definition: packet.h:338
AVStream::codecpar
AVCodecParameters * codecpar
Codec parameters associated with this stream.
Definition: avformat.h:1012
LIBAVUTIL_VERSION_INT
#define LIBAVUTIL_VERSION_INT
Definition: version.h:85
read_header
static int read_header(FFV1Context *f)
Definition: ffv1dec.c:527
AVClass
Describe the class of an AVClass context structure.
Definition: log.h:67
NULL
#define NULL
Definition: coverity.c:32
AVDOVIDecoderConfigurationRecord::dv_level
uint8_t dv_level
Definition: dovi_meta.h:55
AVDOVIDecoderConfigurationRecord::dv_bl_signal_compatibility_id
uint8_t dv_bl_signal_compatibility_id
Definition: dovi_meta.h:59
MPEGTS_HEADER
@ MPEGTS_HEADER
Definition: mpegts.c:224
MpegTSSectionFilter::crc
unsigned crc
Definition: mpegts.c:87
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:125
read_probe
static int read_probe(const AVProbeData *pd)
Definition: jvdec.c:55
MpegTSContext::stop_parse
int stop_parse
stop parsing loop
Definition: mpegts.c:142
AVFMTCTX_NOHEADER
#define AVFMTCTX_NOHEADER
signal that no header is present (streams are added dynamically)
Definition: avformat.h:1284
isom.h
AV_CODEC_ID_TIMED_ID3
@ AV_CODEC_ID_TIMED_ID3
Definition: codec_id.h:548
MpegTSContext::current_pid
int current_pid
Definition: mpegts.c:167
MpegTSSectionFilter::section_index
int section_index
Definition: mpegts.c:84
MpegTSContext::last_pos
int64_t last_pos
to detect seek
Definition: mpegts.c:146
Mp4Descr::es_id
int es_id
Definition: mpegts.h:165
MpegTSFilter::es_id
int es_id
Definition: mpegts.c:98
MPEGTS_PESHEADER
@ MPEGTS_PESHEADER
Definition: mpegts.c:225
DESC_types
static const StreamType DESC_types[]
Definition: mpegts.c:864
PESContext::extended_stream_id
int extended_stream_id
Definition: mpegts.c:250
av_stream_add_side_data
int av_stream_add_side_data(AVStream *st, enum AVPacketSideDataType type, uint8_t *data, size_t size)
Wrap an existing array as stream side data.
Definition: utils.c:5525
Mp4Descr::dec_config_descr_len
int dec_config_descr_len
Definition: mpegts.h:166
av_default_item_name
const char * av_default_item_name(void *ptr)
Return the context name.
Definition: log.c:235
MpegTSSectionFilter::section_buf
uint8_t * section_buf
Definition: mpegts.c:89
get_bits1
static unsigned int get_bits1(GetBitContext *s)
Definition: get_bits.h:498
eit_cb
static void eit_cb(MpegTSFilter *filter, const uint8_t *section, int section_len)
Definition: mpegts.c:2561
av_buffer_pool_uninit
void av_buffer_pool_uninit(AVBufferPool **ppool)
Mark the pool as being available for freeing.
Definition: buffer.c:276
MpegTSFilter::type
enum MpegTSFilterType type
Definition: mpegts.c:102
mpegts_open_pcr_filter
static MpegTSFilter * mpegts_open_pcr_filter(MpegTSContext *ts, unsigned int pid)
Definition: mpegts.c:548
AVProbeData
This structure contains the data a format has to probe a file.
Definition: avformat.h:441
SectionHeader::version
uint8_t version
Definition: mpegts.c:643
seek_back
static void seek_back(AVFormatContext *s, AVIOContext *pb, int64_t pos)
Definition: mpegts.c:3039
SLConfigDescr::ocr_len
int ocr_len
Definition: mpegts.h:156
AVProgram::stream_index
unsigned int * stream_index
Definition: avformat.h:1261
AVStream::metadata
AVDictionary * metadata
Definition: avformat.h:929
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:554
add_pes_stream
static PESContext * add_pes_stream(MpegTSContext *ts, int pid, int pcr_pid)
Definition: mpegts.c:1401
MpegTSFilterType
MpegTSFilterType
Definition: mpegts.c:63
AV_DICT_DONT_OVERWRITE
#define AV_DICT_DONT_OVERWRITE
Don't overwrite existing entries.
Definition: dict.h:76
StreamType
Definition: mpegts.c:783
AV_CODEC_ID_SMPTE_KLV
@ AV_CODEC_ID_SMPTE_KLV
Definition: codec_id.h:546
ff_mp4_read_descr
int ff_mp4_read_descr(AVFormatContext *fc, AVIOContext *pb, int *tag)
Definition: isom.c:481
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:505
SLConfigDescr::packet_seq_num_len
int packet_seq_num_len
Definition: mpegts.h:161
mpegts_open_pes_filter
static MpegTSFilter * mpegts_open_pes_filter(MpegTSContext *ts, unsigned int pid, PESCallback *pes_cb, void *opaque)
Definition: mpegts.c:532
PESContext::ts
MpegTSContext * ts
Definition: mpegts.c:240
OEITS_END_TID
#define OEITS_END_TID
Definition: mpegts.h:100
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:1437
MAX_PES_HEADER_SIZE
#define MAX_PES_HEADER_SIZE
Definition: mpegts.c:234
MAX_PACKET_READAHEAD
#define MAX_PACKET_READAHEAD
Definition: mpegts.c:3151
MAX_PIDS_PER_PROGRAM
#define MAX_PIDS_PER_PROGRAM
Definition: mpegts.c:109
MpegTSSectionFilter::end_of_section_reached
unsigned int end_of_section_reached
Definition: mpegts.c:91
index
int index
Definition: gxfenc.c:89
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:1492
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:1119
SLConfigDescr::use_au_start
int use_au_start
Definition: mpegts.h:148
new_data_packet
static void new_data_packet(const uint8_t *buffer, int len, AVPacket *pkt)
Definition: mpegts.c:981
AVCodecID
AVCodecID
Identify the syntax and semantics of the bitstream.
Definition: codec_id.h:46
AV_CODEC_ID_EAC3
@ AV_CODEC_ID_EAC3
Definition: codec_id.h:450
AVCodecParameters::extradata_size
int extradata_size
Size of the extradata content in bytes.
Definition: codec_par.h:78
SDT_TID
#define SDT_TID
Definition: mpegts.h:87
AVFormatContext::nb_streams
unsigned int nb_streams
Number of elements in AVFormatContext.streams.
Definition: avformat.h:1391
AV_CODEC_ID_AAC
@ AV_CODEC_ID_AAC
Definition: codec_id.h:412
ff_dlog
#define ff_dlog(a,...)
Definition: tableprint_vlc.h:29
SCTE_types
static const StreamType SCTE_types[]
Definition: mpegts.c:829
add_pid_to_pmt
static void add_pid_to_pmt(MpegTSContext *ts, unsigned int programid, unsigned int pid)
Definition: mpegts.c:320
MPEGTS_PES
@ MPEGTS_PES
Definition: mpegts.c:64
AVIOContext
Bytestream IO Context.
Definition: avio.h:161
ffio_init_context
int ffio_init_context(AVIOContext *s, unsigned char *buffer, int buffer_size, int write_flag, void *opaque, int(*read_packet)(void *opaque, uint8_t *buf, int buf_size), int(*write_packet)(void *opaque, uint8_t *buf, int buf_size), int64_t(*seek)(void *opaque, int64_t offset, int whence))
Definition: aviobuf.c:76
AVMediaType
AVMediaType
Definition: avutil.h:199
MP4DescrParseContext::descr
Mp4Descr * descr
Definition: mpegts.c:1429
AVPacket::size
int size
Definition: packet.h:356
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:188
AVIOContext::seekable
int seekable
A combination of AVIO_SEEKABLE_ flags or 0 when the stream is not seekable.
Definition: avio.h:260
SectionHeader::tid
uint8_t tid
Definition: mpegts.c:641
reset_pes_packet_state
static void reset_pes_packet_state(PESContext *pes)
Definition: mpegts.c:972
FFMAX
#define FFMAX(a, b)
Definition: common.h:94
avpriv_set_pts_info
void avpriv_set_pts_info(AVStream *s, int pts_wrap_bits, unsigned int pts_num, unsigned int pts_den)
Set the time base and wrapping info for a given stream.
Definition: utils.c:4948
AV_CODEC_ID_DTS
@ AV_CODEC_ID_DTS
Definition: codec_id.h:414
Program
Definition: mpegts.c:110
MpegTSContext
Definition: mpegts.c:119
AVStream::probe_packets
int probe_packets
Number of packets to buffer for codec probing.
Definition: avformat.h:1075
MpegTSFilter
Definition: mpegts.c:96
size
int size
Definition: twinvq_data.h:11134
MPEGTS_PAYLOAD
@ MPEGTS_PAYLOAD
Definition: mpegts.c:227
AV_NOPTS_VALUE
#define AV_NOPTS_VALUE
Undefined timestamp value.
Definition: avutil.h:248
MpegTSContext::raw_packet_size
int raw_packet_size
raw packet size, including FEC if present
Definition: mpegts.c:124
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:92
finished_reading_packet
static void finished_reading_packet(AVFormatContext *s, int raw_packet_size)
Definition: mpegts.c:2909
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.
section
Definition: ffprobe.c:140
SLConfigDescr::use_au_end
int use_au_end
Definition: mpegts.h:149
MpegTSSectionFilter::check_crc
unsigned int check_crc
Definition: mpegts.c:90
MpegTSContext::skip_clear
int skip_clear
Definition: mpegts.c:149
AVCodecParameters::profile
int profile
Codec-specific bitstream restrictions that the stream conforms to.
Definition: codec_par.h:120
mpegts_get_dts
static int64_t mpegts_get_dts(AVFormatContext *s, int stream_index, int64_t *ppos, int64_t pos_limit)
Definition: mpegts.c:3285
AV_CODEC_ID_OPUS
@ AV_CODEC_ID_OPUS
Definition: codec_id.h:470
mpegts_read_packet
static int mpegts_read_packet(AVFormatContext *s, AVPacket *pkt)
Definition: mpegts.c:3200
parse_MP4ESDescrTag
static int parse_MP4ESDescrTag(MP4DescrParseContext *d, int64_t off, int len)
Definition: mpegts.c:1506
buffer.h
AV_DISPOSITION_HEARING_IMPAIRED
#define AV_DISPOSITION_HEARING_IMPAIRED
stream for hearing impaired audiences
Definition: avformat.h:823
add_pat_entry
static void add_pat_entry(MpegTSContext *ts, unsigned int programid)
Definition: mpegts.c:306
AVPacket::dts
int64_t dts
Decompression timestamp in AVStream->time_base units; the time at which the packet is decompressed.
Definition: packet.h:354
avio_r8
int avio_r8(AVIOContext *s)
Definition: aviobuf.c:616
FFMIN
#define FFMIN(a, b)
Definition: common.h:96
av_reallocp_array
int av_reallocp_array(void *ptr, size_t nmemb, size_t size)
Allocate, reallocate, or free an array through a pointer to a pointer.
Definition: mem.c:206
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:982
av_crc_get_table
const AVCRC * av_crc_get_table(AVCRCId crc_id)
Get an initialized standard CRC table.
Definition: crc.c:374
SectionCallback
void SectionCallback(MpegTSFilter *f, const uint8_t *buf, int len)
Definition: mpegts.c:79
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
PESContext::pid
int pid
Definition: mpegts.c:237
AVPacket::flags
int flags
A combination of AV_PKT_FLAG values.
Definition: packet.h:361
version
version
Definition: libkvazaar.c:292
handle_packet
static int handle_packet(MpegTSContext *ts, const uint8_t *packet, int64_t pos)
Definition: mpegts.c:2703
AV_LOG_INFO
#define AV_LOG_INFO
Standard information.
Definition: log.h:187
update_offsets
static void update_offsets(AVIOContext *pb, int64_t *off, int *len)
Definition: mpegts.c:1459
get_bits64
static uint64_t get_bits64(GetBitContext *s, int n)
Read 0-64 bits.
Definition: get_bits.h:572
EIT_PID
#define EIT_PID
Definition: mpegts.h:45
in
uint8_t pi<< 24) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_U8, uint8_t,(*(const uint8_t *) pi - 0x80) *(1.0f/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_U8, uint8_t,(*(const uint8_t *) pi - 0x80) *(1.0/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S16, int16_t,(*(const int16_t *) pi >> 8)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S16, int16_t, *(const int16_t *) pi *(1.0f/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S16, int16_t, *(const int16_t *) pi *(1.0/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S32, int32_t,(*(const int32_t *) pi >> 24)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S32, int32_t, *(const int32_t *) pi *(1.0f/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S32, int32_t, *(const int32_t *) pi *(1.0/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_FLT, float, av_clip_uint8(lrintf(*(const float *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_FLT, float, av_clip_int16(lrintf(*(const float *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_FLT, float, av_clipl_int32(llrintf(*(const float *) pi *(1U<< 31)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_DBL, double, av_clip_uint8(lrint(*(const double *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_DBL, double, av_clip_int16(lrint(*(const double *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_DBL, double, av_clipl_int32(llrint(*(const double *) pi *(1U<< 31)))) #define SET_CONV_FUNC_GROUP(ofmt, ifmt) static void set_generic_function(AudioConvert *ac) { } void ff_audio_convert_free(AudioConvert **ac) { if(! *ac) return;ff_dither_free(&(*ac) ->dc);av_freep(ac);} AudioConvert *ff_audio_convert_alloc(AVAudioResampleContext *avr, enum AVSampleFormat out_fmt, enum AVSampleFormat in_fmt, int channels, int sample_rate, int apply_map) { AudioConvert *ac;int in_planar, out_planar;ac=av_mallocz(sizeof(*ac));if(!ac) return NULL;ac->avr=avr;ac->out_fmt=out_fmt;ac->in_fmt=in_fmt;ac->channels=channels;ac->apply_map=apply_map;if(avr->dither_method !=AV_RESAMPLE_DITHER_NONE &&av_get_packed_sample_fmt(out_fmt)==AV_SAMPLE_FMT_S16 &&av_get_bytes_per_sample(in_fmt) > 2) { ac->dc=ff_dither_alloc(avr, out_fmt, in_fmt, channels, sample_rate, apply_map);if(!ac->dc) { av_free(ac);return NULL;} return ac;} in_planar=ff_sample_fmt_is_planar(in_fmt, channels);out_planar=ff_sample_fmt_is_planar(out_fmt, channels);if(in_planar==out_planar) { ac->func_type=CONV_FUNC_TYPE_FLAT;ac->planes=in_planar ? ac->channels :1;} else if(in_planar) ac->func_type=CONV_FUNC_TYPE_INTERLEAVE;else ac->func_type=CONV_FUNC_TYPE_DEINTERLEAVE;set_generic_function(ac);if(ARCH_AARCH64) ff_audio_convert_init_aarch64(ac);if(ARCH_ARM) ff_audio_convert_init_arm(ac);if(ARCH_X86) ff_audio_convert_init_x86(ac);return ac;} int ff_audio_convert(AudioConvert *ac, AudioData *out, AudioData *in) { int use_generic=1;int len=in->nb_samples;int p;if(ac->dc) { av_log(ac->avr, AV_LOG_TRACE, "%d samples - audio_convert: %s to %s (dithered)\n", len, av_get_sample_fmt_name(ac->in_fmt), av_get_sample_fmt_name(ac->out_fmt));return ff_convert_dither(ac-> in
Definition: audio_convert.c:326
is_pes_stream
static int is_pes_stream(int stream_type, uint32_t prog_reg_desc)
Definition: mpegts.c:2270
FF_PROFILE_ARIB_PROFILE_A
#define FF_PROFILE_ARIB_PROFILE_A
Definition: avcodec.h:1971
SectionHeader
Definition: mpegts.c:640
log.h
AV_CODEC_ID_NONE
@ AV_CODEC_ID_NONE
Definition: codec_id.h:47
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:269
AVPacket::pts
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
Definition: packet.h:348
code
and forward the test the status of outputs and forward it to the corresponding return FFERROR_NOT_READY If the filters stores internally one or a few frame for some it can consider them to be part of the FIFO and delay acknowledging a status change accordingly Example code
Definition: filter_design.txt:178
avio_internal.h
parse_stream_identifier_desc
static int parse_stream_identifier_desc(const uint8_t *p, const uint8_t *p_end)
Definition: mpegts.c:2234
MAX_MP4_DESCR_COUNT
#define MAX_MP4_DESCR_COUNT
Definition: mpegts.c:51
PESContext::data_index
int data_index
Definition: mpegts.c:246
internal.h
get_program
static struct Program * get_program(MpegTSContext *ts, unsigned int programid)
Definition: mpegts.c:262
PAT_TID
#define PAT_TID
Definition: mpegts.h:79
MpegTSContext::pids
MpegTSFilter * pids[NB_PID_MAX]
filters for various streams specified by PMT + for the PAT and PMT
Definition: mpegts.c:166
PESContext::pes_header_size
int pes_header_size
Definition: mpegts.c:249
AV_CODEC_ID_CAVS
@ AV_CODEC_ID_CAVS
Definition: codec_id.h:136
get16
static int get16(const uint8_t **pp, const uint8_t *p_end)
Definition: mpegts.c:672
parse_section_header
static int parse_section_header(SectionHeader *h, const uint8_t **pp, const uint8_t *p_end)
Definition: mpegts.c:754
MpegTSContext::epg_stream
AVStream * epg_stream
Definition: mpegts.c:169
set_pmt_found
static void set_pmt_found(MpegTSContext *ts, unsigned int programid)
Definition: mpegts.c:338
AV_CODEC_ID_EPG
@ AV_CODEC_ID_EPG
Definition: codec_id.h:541
AV_CODEC_ID_HEVC
@ AV_CODEC_ID_HEVC
Definition: codec_id.h:223
xf
#define xf(width, name, var, range_min, range_max, subs,...)
Definition: cbs_av1.c:668
mpegts_resync
static int mpegts_resync(AVFormatContext *s, int seekback, const uint8_t *current_packet)
Definition: mpegts.c:2841
MpegTSContext::crc_validity
int8_t crc_validity[NB_PID_MAX]
Definition: mpegts.c:164
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:277
AVStream::pmt_stream_idx
int pmt_stream_idx
Definition: avformat.h:1111
PESContext::st
AVStream * st
Definition: mpegts.c:242
uint8_t
uint8_t
Definition: audio_convert.c:194
av_mallocz
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
Definition: mem.c:237
AVProgram
New fields can be added to the end with minor version bumps.
Definition: avformat.h:1257
handle_packets
static int handle_packets(MpegTSContext *ts, int64_t nb_packets)
Definition: mpegts.c:2917
clear_program
static void clear_program(MpegTSContext *ts, unsigned int programid)
Definition: mpegts.c:288
AV_CODEC_ID_VC1
@ AV_CODEC_ID_VC1
Definition: codec_id.h:119
MpegTSContext::prg
struct Program * prg
Definition: mpegts.c:162
AV_DISPOSITION_DEPENDENT
#define AV_DISPOSITION_DEPENDENT
dependent audio stream (mix_type=0 in mpegts)
Definition: avformat.h:848
len
int len
Definition: vorbis_enc_data.h:452
AV_CODEC_ID_JPEG2000
@ AV_CODEC_ID_JPEG2000
Definition: codec_id.h:137
AV_CRC_32_IEEE
@ AV_CRC_32_IEEE
Definition: crc.h:53
MpegTSPESFilter
Definition: mpegts.c:74
MP4DescrParseContext::pb
AVIOContext pb
Definition: mpegts.c:1428
AVStream::stream_identifier
int stream_identifier
Stream Identifier This is the MPEG-TS stream identifier +1 0 means unknown.
Definition: avformat.h:1104
SLConfigDescr::au_len
int au_len
Definition: mpegts.h:157
MpegTSFilter::last_pcr
int64_t last_pcr
Definition: mpegts.c:100
MpegTSSectionFilter::last_crc
unsigned last_crc
Definition: mpegts.c:88
language
Undefined Behavior In the C language
Definition: undefined.txt:3
AVStream::disposition
int disposition
AV_DISPOSITION_* bit field.
Definition: avformat.h:918
mid_pred
#define mid_pred
Definition: mathops.h:97
AV_DISPOSITION_VISUAL_IMPAIRED
#define AV_DISPOSITION_VISUAL_IMPAIRED
stream for visual impaired audiences
Definition: avformat.h:824
MP4DescrParseContext
Definition: mpegts.c:1426
tag
uint32_t tag
Definition: movenc.c:1532
AVStream::id
int id
Format-specific stream ID.
Definition: avformat.h:872
ret
ret
Definition: filter_design.txt:187
AVStream
Stream structure.
Definition: avformat.h:865
MpegTSSectionFilter::last_ver
int last_ver
Definition: mpegts.c:86
AVFormatContext::ts_id
int ts_id
Transport stream id.
Definition: avformat.h:1675
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:283
avio_seek
int64_t avio_seek(AVIOContext *s, int64_t offset, int whence)
fseek() equivalent for AVIOContext.
Definition: aviobuf.c:241
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:72
Mp4Descr::dec_config_descr
uint8_t * dec_config_descr
Definition: mpegts.h:167
SLConfigDescr::use_timestamps
int use_timestamps
Definition: mpegts.h:152
avio_rb16
unsigned int avio_rb16(AVIOContext *s)
Definition: aviobuf.c:763
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:1652
scte_data_cb
static void scte_data_cb(MpegTSFilter *filter, const uint8_t *section, int section_len)
Definition: mpegts.c:1731
pos
unsigned int pos
Definition: spdifenc.c:412
avformat.h
dovi_meta.h
m4sl_cb
static void m4sl_cb(MpegTSFilter *filter, const uint8_t *section, int section_len)
Definition: mpegts.c:1668
dict.h
AV_DISPOSITION_DESCRIPTIONS
#define AV_DISPOSITION_DESCRIPTIONS
Definition: avformat.h:846
AV_INPUT_BUFFER_PADDING_SIZE
#define AV_INPUT_BUFFER_PADDING_SIZE
Definition: avcodec.h:215
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
ff_mpegts_demuxer
AVInputFormat ff_mpegts_demuxer
Definition: mpegts.c:3374
FF_ARRAY_ELEMS
#define FF_ARRAY_ELEMS(a)
Definition: sinewin_tablegen_template.c:38
AV_RL32
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_RL32
Definition: bytestream.h:88
TS_MAX_PACKET_SIZE
#define TS_MAX_PACKET_SIZE
Definition: mpegts.h:30
M4OD_TID
#define M4OD_TID
Definition: mpegts.h:84
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:76
AVStream::index
int index
stream index in AVFormatContext
Definition: avformat.h:866
R8_CHECK_CLIP_MAX
#define R8_CHECK_CLIP_MAX(dst, maxv)
probe
static int probe(const AVProbeData *p)
Definition: act.c:36
mpegts_probe
static int mpegts_probe(const AVProbeData *p)
Definition: mpegts.c:2970
AV_OPT_FLAG_EXPORT
#define AV_OPT_FLAG_EXPORT
The option is intended for exporting values to the caller.
Definition: opt.h:284
pkt
static AVPacket pkt
Definition: demuxing_decoding.c:54
MpegTSFilter::u
union MpegTSFilter::@265 u
AVIO_SEEKABLE_NORMAL
#define AVIO_SEEKABLE_NORMAL
Seeking works like for a local file.
Definition: avio.h:40
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
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: utils.c:1980
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:392
NB_PID_MAX
#define NB_PID_MAX
Definition: mpegts.h:32
AVDOVIDecoderConfigurationRecord::bl_present_flag
uint8_t bl_present_flag
Definition: dovi_meta.h:58
AV_OPT_TYPE_INT
@ AV_OPT_TYPE_INT
Definition: opt.h:223
avio_read
int avio_read(AVIOContext *s, unsigned char *buf, int size)
Read size bytes from AVIOContext into buf.
Definition: aviobuf.c:625
PESContext::stream_id
uint8_t stream_id
Definition: mpegts.c:251
parse_MP4SLDescrTag
static int parse_MP4SLDescrTag(MP4DescrParseContext *d, int64_t off, int len)
Definition: mpegts.c:1541
avpriv_mpegts_parse_open
MpegTSContext * avpriv_mpegts_parse_open(AVFormatContext *s)
Definition: mpegts.c:3322
PESContext::buffer
AVBufferRef * buffer
Definition: mpegts.c:255
CHECK_COUNT
#define CHECK_COUNT
AVDOVIDecoderConfigurationRecord::rpu_present_flag
uint8_t rpu_present_flag
Definition: dovi_meta.h:56
mpegts_free
static void mpegts_free(MpegTSContext *ts)
Definition: mpegts.c:3230
HDMV_types
static const StreamType HDMV_types[]
Definition: mpegts.c:813
AVDOVIDecoderConfigurationRecord::el_present_flag
uint8_t el_present_flag
Definition: dovi_meta.h:57
AVStream::request_probe
int request_probe
stream probing state -1 -> probing finished 0 -> no probing requested rest -> perform probing with re...
Definition: avformat.h:1122
AVPacket::stream_index
int stream_index
Definition: packet.h:357
AVPROBE_SCORE_STREAM_RETRY
#define AVPROBE_SCORE_STREAM_RETRY
Definition: avformat.h:449
avio_skip
int64_t avio_skip(AVIOContext *s, int64_t offset)
Skip given number of bytes forward.
Definition: aviobuf.c:329
SLConfigDescr::timestamp_res
int timestamp_res
Definition: mpegts.h:154
ISO_types
static const StreamType ISO_types[]
Definition: mpegts.c:789
AVDOVIDecoderConfigurationRecord::dv_version_minor
uint8_t dv_version_minor
Definition: dovi_meta.h:53
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:201
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:1035
AVFMT_TS_DISCONT
#define AVFMT_TS_DISCONT
Format allows timestamp discontinuities.
Definition: avformat.h:464
AVStreamInternal::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:189
AVBufferRef
A reference to a data buffer.
Definition: buffer.h:81
MpegTSContext::pkt
AVPacket * pkt
packet containing Audio/Video data
Definition: mpegts.c:144
mpegts_read_header
static int mpegts_read_header(AVFormatContext *s)
Definition: mpegts.c:3048
avpriv_request_sample
#define avpriv_request_sample(...)
Definition: tableprint_vlc.h:39
MPEGTS_PCR
@ MPEGTS_PCR
Definition: mpegts.c:66
Program::id
unsigned int id
Definition: mpegts.c:111
MpegTSSectionFilter::opaque
void * opaque
Definition: mpegts.c:93
PESContext::merged_st
int merged_st
Definition: mpegts.c:257
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:60
AVPacket
This structure stores compressed data.
Definition: packet.h:332
ff_read_frame_flush
void ff_read_frame_flush(AVFormatContext *s)
Flush the frame reader.
Definition: utils.c:1931
ff_find_stream_index
int ff_find_stream_index(AVFormatContext *s, int id)
Find stream index based on format-specific stream ID.
Definition: utils.c:5032
AV_OPT_TYPE_BOOL
@ AV_OPT_TYPE_BOOL
Definition: opt.h:240
MpegTSFilter::last_cc
int last_cc
Definition: mpegts.c:99
ff_mpegtsraw_demuxer
AVInputFormat ff_mpegtsraw_demuxer
Definition: mpegts.c:3387
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:70
MpegTSContext::scan_all_pmts
int scan_all_pmts
Definition: mpegts.c:152
AVPacket::pos
int64_t pos
byte position in stream, -1 if unknown
Definition: packet.h:375
MP4DescrParseContext::predefined_SLConfigDescriptor_seen
int predefined_SLConfigDescriptor_seen
Definition: mpegts.c:1434
MP4DescrParseContext::level
int level
Definition: mpegts.c:1433
bytestream.h
convert_header.str
string str
Definition: convert_header.py:20
AVSTREAM_PARSE_FULL
@ AVSTREAM_PARSE_FULL
full parsing and repack
Definition: avformat.h:786
MpegTSContext::skip_unknown_pmt
int skip_unknown_pmt
Definition: mpegts.c:150
raw_options
static const AVOption raw_options[]
Definition: mpegts.c:202
flags
#define flags(name, subs,...)
Definition: cbs_av1.c:565
opus_channel_map
static const uint8_t opus_channel_map[8][8]
Definition: mpegts.c:1768
AVCodecParameters::bit_rate
int64_t bit_rate
The average bitrate of the encoded data (in bits per second).
Definition: codec_par.h:89
Program::pids
unsigned int pids[MAX_PIDS_PER_PROGRAM]
Definition: mpegts.c:113
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:28
AV_CODEC_ID_AAC_LATM
@ AV_CODEC_ID_AAC_LATM
Definition: codec_id.h:459
parse_mp4_descr
static int parse_mp4_descr(MP4DescrParseContext *d, int64_t off, int len, int target_tag)
Definition: mpegts.c:1583
AVERROR_INVALIDDATA
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:59
AV_CODEC_ID_HDMV_TEXT_SUBTITLE
@ AV_CODEC_ID_HDMV_TEXT_SUBTITLE
Definition: codec_id.h:532
TS_PACKET_SIZE
#define TS_PACKET_SIZE
Definition: mpegts.h:29
MpegTSSectionFilter::section_cb
SectionCallback * section_cb
Definition: mpegts.c:92
PROBE_PACKET_MARGIN
#define PROBE_PACKET_MARGIN
Definition: mpegts.c:61
h
h
Definition: vp9dsp_template.c:2038
get_ts64
static uint64_t get_ts64(GetBitContext *gb, int bits)
Definition: mpegts.c:1028
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:904
get_packet_size
static int get_packet_size(AVFormatContext *s)
Definition: mpegts.c:603
analyze
static int analyze(const uint8_t *buf, int size, int packet_size, int probe)
Definition: mpegts.c:574
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:415
read_packet
static int read_packet(AVFormatContext *s, uint8_t *buf, int raw_packet_size, const uint8_t **data)
Definition: mpegts.c:2884
MpegTSContext::mpeg2ts_compute_pcr
int mpeg2ts_compute_pcr
compute exact PCR for each transport stream packet
Definition: mpegts.c:132
REGD_types
static const StreamType REGD_types[]
Definition: mpegts.c:841
MISC_types
static const StreamType MISC_types[]
Definition: mpegts.c:835
AV_CODEC_ID_MPEG2VIDEO
@ AV_CODEC_ID_MPEG2VIDEO
preferred ID for MPEG-1/2 video decoding
Definition: codec_id.h:51
options
static const AVOption options[]
Definition: mpegts.c:176
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:253
av_log2
int av_log2(unsigned v)
Definition: intmath.c:26
AVProgram::pcr_pid
int pcr_pid
Definition: avformat.h:1267
Mp4Descr
Definition: mpegts.h:164
SLConfigDescr
Definition: mpegts.h:147
avio_read_partial
int avio_read_partial(AVIOContext *s, unsigned char *buf, int size)
Read size bytes from AVIOContext into buf.
Definition: aviobuf.c:694
sdt_cb
static void sdt_cb(MpegTSFilter *filter, const uint8_t *section, int section_len)
Definition: mpegts.c:2615
MpegTSContext::fix_teletext_pts
int fix_teletext_pts
fix dvb teletext pts
Definition: mpegts.c:135
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:94
av_init_packet
void av_init_packet(AVPacket *pkt)
Initialize optional fields of a packet with default values.
Definition: avpacket.c:35
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:3328
AVDOVIDecoderConfigurationRecord
Definition: dovi_meta.h:51
avio_feof
int avio_feof(AVIOContext *s)
Similar to feof() but also returns nonzero on read errors.
Definition: aviobuf.c:356
av_program_add_stream_index
void av_program_add_stream_index(AVFormatContext *ac, int progid, unsigned int idx)
AV_CODEC_ID_SCTE_35
@ AV_CODEC_ID_SCTE_35
Contain timestamp estimated through PCR of program stream.
Definition: codec_id.h:540
StreamType::codec_type
enum AVMediaType codec_type
Definition: mpegts.c:785