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