FFmpeg
mpeg.c
Go to the documentation of this file.
1 /*
2  * MPEG-1/2 demuxer
3  * Copyright (c) 2000, 2001, 2002 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 "avformat.h"
23 #include "avio_internal.h"
24 #include "internal.h"
25 #include "mpeg.h"
26 
27 #if CONFIG_VOBSUB_DEMUXER
28 # include "subtitles.h"
29 # include "libavutil/bprint.h"
30 # include "libavutil/opt.h"
31 #endif
32 
33 #include "libavutil/avassert.h"
34 
35 /*********************************************/
36 /* demux code */
37 
38 #define MAX_SYNC_SIZE 100000
39 
40 static int check_pes(const uint8_t *p, const uint8_t *end)
41 {
42  int pes1;
43  int pes2 = (p[3] & 0xC0) == 0x80 &&
44  (p[4] & 0xC0) != 0x40 &&
45  ((p[4] & 0xC0) == 0x00 ||
46  (p[4] & 0xC0) >> 2 == (p[6] & 0xF0));
47 
48  for (p += 3; p < end && *p == 0xFF; p++) ;
49  if ((*p & 0xC0) == 0x40)
50  p += 2;
51 
52  if ((*p & 0xF0) == 0x20)
53  pes1 = p[0] & p[2] & p[4] & 1;
54  else if ((*p & 0xF0) == 0x30)
55  pes1 = p[0] & p[2] & p[4] & p[5] & p[7] & p[9] & 1;
56  else
57  pes1 = *p == 0x0F;
58 
59  return pes1 || pes2;
60 }
61 
62 static int check_pack_header(const uint8_t *buf)
63 {
64  return (buf[1] & 0xC0) == 0x40 || (buf[1] & 0xF0) == 0x20;
65 }
66 
67 static int mpegps_probe(const AVProbeData *p)
68 {
69  uint32_t code = -1;
70  int i;
71  int sys = 0, pspack = 0, priv1 = 0, vid = 0;
72  int audio = 0, invalid = 0, score = 0;
73  int endpes = 0;
74 
75  for (i = 0; i < p->buf_size; i++) {
76  code = (code << 8) + p->buf[i];
77  if ((code & 0xffffff00) == 0x100) {
78  int len = p->buf[i + 1] << 8 | p->buf[i + 2];
79  int pes = endpes <= i && check_pes(p->buf + i, p->buf + p->buf_size);
80  int pack = check_pack_header(p->buf + i);
81 
83  sys++;
84  else if (code == PACK_START_CODE && pack)
85  pspack++;
86  else if ((code & 0xf0) == VIDEO_ID && pes) {
87  endpes = i + len;
88  vid++;
89  }
90  // skip pes payload to avoid start code emulation for private
91  // and audio streams
92  else if ((code & 0xe0) == AUDIO_ID && pes) {audio++; i+=len;}
93  else if (code == PRIVATE_STREAM_1 && pes) {priv1++; i+=len;}
94  else if (code == 0x1fd && pes) vid++; //VC1
95 
96  else if ((code & 0xf0) == VIDEO_ID && !pes) invalid++;
97  else if ((code & 0xe0) == AUDIO_ID && !pes) invalid++;
98  else if (code == PRIVATE_STREAM_1 && !pes) invalid++;
99  }
100  }
101 
102  if (vid + audio > invalid + 1) /* invalid VDR files nd short PES streams */
103  score = AVPROBE_SCORE_EXTENSION / 2;
104 
105 // av_log(NULL, AV_LOG_ERROR, "vid:%d aud:%d sys:%d pspack:%d invalid:%d size:%d \n",
106 // vid, audio, sys, pspack, invalid, p->buf_size);
107 
108  if (sys > invalid && sys * 9 <= pspack * 10)
109  return (audio > 12 || vid > 3 || pspack > 2) ? AVPROBE_SCORE_EXTENSION + 2
110  : AVPROBE_SCORE_EXTENSION / 2 + (audio + vid + pspack > 1); // 1 more than mp3
111  if (pspack > invalid && (priv1 + vid + audio) * 10 >= pspack * 9)
112  return pspack > 2 ? AVPROBE_SCORE_EXTENSION + 2
113  : AVPROBE_SCORE_EXTENSION / 2; // 1 more than .mpg
114  if ((!!vid ^ !!audio) && (audio > 4 || vid > 1) && !sys &&
115  !pspack && p->buf_size > 2048 && vid + audio > invalid) /* PES stream */
116  return (audio > 12 || vid > 6 + 2 * invalid) ? AVPROBE_SCORE_EXTENSION + 2
118 
119  // 02-Penguin.flac has sys:0 priv1:0 pspack:0 vid:0 audio:1
120  // mp3_misidentified_2.mp3 has sys:0 priv1:0 pspack:0 vid:0 audio:6
121  // Have\ Yourself\ a\ Merry\ Little\ Christmas.mp3 0 0 0 5 0 1 len:21618
122  return score;
123 }
124 
125 typedef struct MpegDemuxContext {
126  AVClass *class;
128  unsigned char psm_es_type[256];
129  int sofdec;
130  int dvd;
132  int raw_ac3;
133 #if CONFIG_VOBSUB_DEMUXER
134  AVFormatContext *sub_ctx;
135  FFDemuxSubtitlesQueue q[32];
136  char *sub_name;
137 #endif
139 
141 {
142  MpegDemuxContext *m = s->priv_data;
143  char buffer[7] = { 0 };
144  int64_t last_pos = avio_tell(s->pb);
145 
146  m->header_state = 0xff;
147  s->ctx_flags |= AVFMTCTX_NOHEADER;
148 
149  avio_get_str(s->pb, 6, buffer, sizeof(buffer));
150  if (!memcmp("IMKH", buffer, 4)) {
151  m->imkh_cctv = 1;
152  } else if (!memcmp("Sofdec", buffer, 6)) {
153  m->sofdec = 1;
154  } else
155  avio_seek(s->pb, last_pos, SEEK_SET);
156 
157  /* no need to do more */
158  return 0;
159 }
160 
161 static int64_t get_pts(AVIOContext *pb, int c)
162 {
163  uint8_t buf[5];
164  int ret;
165 
166  buf[0] = c < 0 ? avio_r8(pb) : c;
167  ret = avio_read(pb, buf + 1, 4);
168  if (ret < 4)
169  return AV_NOPTS_VALUE;
170 
171  return ff_parse_pes_pts(buf);
172 }
173 
174 static int find_next_start_code(AVIOContext *pb, int *size_ptr,
175  int32_t *header_state)
176 {
177  unsigned int state, v;
178  int val, n;
179 
180  state = *header_state;
181  n = *size_ptr;
182  while (n > 0) {
183  if (avio_feof(pb))
184  break;
185  v = avio_r8(pb);
186  n--;
187  if (state == 0x000001) {
188  state = ((state << 8) | v) & 0xffffff;
189  val = state;
190  goto found;
191  }
192  state = ((state << 8) | v) & 0xffffff;
193  }
194  val = -1;
195 
196 found:
197  *header_state = state;
198  *size_ptr = n;
199  return val;
200 }
201 
202 /**
203  * Extract stream types from a program stream map
204  * According to ISO/IEC 13818-1 ('MPEG-2 Systems') table 2-35
205  *
206  * @return number of bytes occupied by PSM in the bitstream
207  */
209 {
210  int psm_length, ps_info_length, es_map_length;
211 
212  psm_length = avio_rb16(pb);
213  avio_r8(pb);
214  avio_r8(pb);
215  ps_info_length = avio_rb16(pb);
216 
217  /* skip program_stream_info */
218  avio_skip(pb, ps_info_length);
219  /*es_map_length = */avio_rb16(pb);
220  /* Ignore es_map_length, trust psm_length */
221  es_map_length = psm_length - ps_info_length - 10;
222 
223  /* at least one es available? */
224  while (es_map_length >= 4) {
225  unsigned char type = avio_r8(pb);
226  unsigned char es_id = avio_r8(pb);
227  uint16_t es_info_length = avio_rb16(pb);
228 
229  /* remember mapping from stream id to stream type */
230  m->psm_es_type[es_id] = type;
231  /* skip program_stream_info */
232  avio_skip(pb, es_info_length);
233  es_map_length -= 4 + es_info_length;
234  }
235  avio_rb32(pb); /* crc32 */
236  return 2 + psm_length;
237 }
238 
239 /* read the next PES header. Return its position in ppos
240  * (if not NULL), and its start code, pts and dts.
241  */
243  int64_t *ppos, int *pstart_code,
244  int64_t *ppts, int64_t *pdts)
245 {
246  MpegDemuxContext *m = s->priv_data;
247  int len, size, startcode, c, flags, header_len;
248  int pes_ext, ext2_len, id_ext, skip;
249  int64_t pts, dts;
250  int64_t last_sync = avio_tell(s->pb);
251 
252 error_redo:
253  avio_seek(s->pb, last_sync, SEEK_SET);
254 redo:
255  /* next start code (should be immediately after) */
256  m->header_state = 0xff;
258  startcode = find_next_start_code(s->pb, &size, &m->header_state);
259  last_sync = avio_tell(s->pb);
260  if (startcode < 0) {
261  if (avio_feof(s->pb))
262  return AVERROR_EOF;
263  // FIXME we should remember header_state
264  return FFERROR_REDO;
265  }
266 
267  if (startcode == PACK_START_CODE)
268  goto redo;
269  if (startcode == SYSTEM_HEADER_START_CODE)
270  goto redo;
271  if (startcode == PADDING_STREAM) {
272  avio_skip(s->pb, avio_rb16(s->pb));
273  goto redo;
274  }
275  if (startcode == PRIVATE_STREAM_2) {
276  if (!m->sofdec) {
277  /* Need to detect whether this from a DVD or a 'Sofdec' stream */
278  int len = avio_rb16(s->pb);
279  int bytesread = 0;
280  uint8_t *ps2buf = av_malloc(len);
281 
282  if (ps2buf) {
283  bytesread = avio_read(s->pb, ps2buf, len);
284 
285  if (bytesread != len) {
286  avio_skip(s->pb, len - bytesread);
287  } else {
288  uint8_t *p = 0;
289  if (len >= 6)
290  p = memchr(ps2buf, 'S', len - 5);
291 
292  if (p)
293  m->sofdec = !memcmp(p+1, "ofdec", 5);
294 
295  m->sofdec -= !m->sofdec;
296 
297  if (m->sofdec < 0) {
298  if (len == 980 && ps2buf[0] == 0) {
299  /* PCI structure? */
300  uint32_t startpts = AV_RB32(ps2buf + 0x0d);
301  uint32_t endpts = AV_RB32(ps2buf + 0x11);
302  uint8_t hours = ((ps2buf[0x19] >> 4) * 10) + (ps2buf[0x19] & 0x0f);
303  uint8_t mins = ((ps2buf[0x1a] >> 4) * 10) + (ps2buf[0x1a] & 0x0f);
304  uint8_t secs = ((ps2buf[0x1b] >> 4) * 10) + (ps2buf[0x1b] & 0x0f);
305 
306  m->dvd = (hours <= 23 &&
307  mins <= 59 &&
308  secs <= 59 &&
309  (ps2buf[0x19] & 0x0f) < 10 &&
310  (ps2buf[0x1a] & 0x0f) < 10 &&
311  (ps2buf[0x1b] & 0x0f) < 10 &&
312  endpts >= startpts);
313  } else if (len == 1018 && ps2buf[0] == 1) {
314  /* DSI structure? */
315  uint8_t hours = ((ps2buf[0x1d] >> 4) * 10) + (ps2buf[0x1d] & 0x0f);
316  uint8_t mins = ((ps2buf[0x1e] >> 4) * 10) + (ps2buf[0x1e] & 0x0f);
317  uint8_t secs = ((ps2buf[0x1f] >> 4) * 10) + (ps2buf[0x1f] & 0x0f);
318 
319  m->dvd = (hours <= 23 &&
320  mins <= 59 &&
321  secs <= 59 &&
322  (ps2buf[0x1d] & 0x0f) < 10 &&
323  (ps2buf[0x1e] & 0x0f) < 10 &&
324  (ps2buf[0x1f] & 0x0f) < 10);
325  }
326  }
327  }
328 
329  av_free(ps2buf);
330 
331  /* If this isn't a DVD packet or no memory
332  * could be allocated, just ignore it.
333  * If we did, move back to the start of the
334  * packet (plus 'length' field) */
335  if (!m->dvd || avio_skip(s->pb, -(len + 2)) < 0) {
336  /* Skip back failed.
337  * This packet will be lost but that can't be helped
338  * if we can't skip back
339  */
340  goto redo;
341  }
342  } else {
343  /* No memory */
344  avio_skip(s->pb, len);
345  goto redo;
346  }
347  } else if (!m->dvd) {
348  int len = avio_rb16(s->pb);
349  avio_skip(s->pb, len);
350  goto redo;
351  }
352  }
353  if (startcode == PROGRAM_STREAM_MAP) {
354  mpegps_psm_parse(m, s->pb);
355  goto redo;
356  }
357 
358  /* find matching stream */
359  if (!((startcode >= 0x1c0 && startcode <= 0x1df) ||
360  (startcode >= 0x1e0 && startcode <= 0x1ef) ||
361  (startcode == 0x1bd) ||
362  (startcode == PRIVATE_STREAM_2) ||
363  (startcode == 0x1fd)))
364  goto redo;
365  if (ppos) {
366  *ppos = avio_tell(s->pb) - 4;
367  }
368  len = avio_rb16(s->pb);
369  pts =
370  dts = AV_NOPTS_VALUE;
371  if (startcode != PRIVATE_STREAM_2)
372  {
373  /* stuffing */
374  for (;;) {
375  if (len < 1)
376  goto error_redo;
377  c = avio_r8(s->pb);
378  len--;
379  /* XXX: for MPEG-1, should test only bit 7 */
380  if (c != 0xff)
381  break;
382  }
383  if ((c & 0xc0) == 0x40) {
384  /* buffer scale & size */
385  avio_r8(s->pb);
386  c = avio_r8(s->pb);
387  len -= 2;
388  }
389  if ((c & 0xe0) == 0x20) {
390  dts =
391  pts = get_pts(s->pb, c);
392  len -= 4;
393  if (c & 0x10) {
394  dts = get_pts(s->pb, -1);
395  len -= 5;
396  }
397  } else if ((c & 0xc0) == 0x80) {
398  /* mpeg 2 PES */
399  flags = avio_r8(s->pb);
400  header_len = avio_r8(s->pb);
401  len -= 2;
402  if (header_len > len)
403  goto error_redo;
404  len -= header_len;
405  if (flags & 0x80) {
406  dts = pts = get_pts(s->pb, -1);
407  header_len -= 5;
408  if (flags & 0x40) {
409  dts = get_pts(s->pb, -1);
410  header_len -= 5;
411  }
412  }
413  if (flags & 0x3f && header_len == 0) {
414  flags &= 0xC0;
415  av_log(s, AV_LOG_WARNING, "Further flags set but no bytes left\n");
416  }
417  if (flags & 0x01) { /* PES extension */
418  pes_ext = avio_r8(s->pb);
419  header_len--;
420  /* Skip PES private data, program packet sequence counter
421  * and P-STD buffer */
422  skip = (pes_ext >> 4) & 0xb;
423  skip += skip & 0x9;
424  if (pes_ext & 0x40 || skip > header_len) {
425  av_log(s, AV_LOG_WARNING, "pes_ext %X is invalid\n", pes_ext);
426  pes_ext = skip = 0;
427  }
428  avio_skip(s->pb, skip);
429  header_len -= skip;
430 
431  if (pes_ext & 0x01) { /* PES extension 2 */
432  ext2_len = avio_r8(s->pb);
433  header_len--;
434  if ((ext2_len & 0x7f) > 0) {
435  id_ext = avio_r8(s->pb);
436  if ((id_ext & 0x80) == 0)
437  startcode = ((startcode & 0xff) << 8) | id_ext;
438  header_len--;
439  }
440  }
441  }
442  if (header_len < 0)
443  goto error_redo;
444  avio_skip(s->pb, header_len);
445  } else if (c != 0xf)
446  goto redo;
447  }
448 
449  if (startcode == PRIVATE_STREAM_1) {
450  int ret = ffio_ensure_seekback(s->pb, 2);
451 
452  if (ret < 0)
453  return ret;
454 
455  startcode = avio_r8(s->pb);
456  m->raw_ac3 = 0;
457  if (startcode == 0x0b) {
458  if (avio_r8(s->pb) == 0x77) {
459  startcode = 0x80;
460  m->raw_ac3 = 1;
461  avio_skip(s->pb, -2);
462  } else {
463  avio_skip(s->pb, -1);
464  }
465  } else {
466  len--;
467  }
468  }
469  if (len < 0)
470  goto error_redo;
471  if (dts != AV_NOPTS_VALUE && ppos) {
472  int i;
473  for (i = 0; i < s->nb_streams; i++) {
474  if (startcode == s->streams[i]->id &&
475  (s->pb->seekable & AVIO_SEEKABLE_NORMAL) /* index useless on streams anyway */) {
476  ff_reduce_index(s, i);
477  av_add_index_entry(s->streams[i], *ppos, dts, 0, 0,
478  AVINDEX_KEYFRAME /* FIXME keyframe? */);
479  }
480  }
481  }
482 
483  *pstart_code = startcode;
484  *ppts = pts;
485  *pdts = dts;
486  return len;
487 }
488 
490  AVPacket *pkt)
491 {
492  MpegDemuxContext *m = s->priv_data;
493  AVStream *st;
494  int len, startcode, i, es_type, ret;
495  int lpcm_header_len = -1; //Init to suppress warning
496  int request_probe= 0;
498  enum AVMediaType type;
499  int64_t pts, dts, dummy_pos; // dummy_pos is needed for the index building to work
500 
501 redo:
502  len = mpegps_read_pes_header(s, &dummy_pos, &startcode, &pts, &dts);
503  if (len < 0)
504  return len;
505 
506  if (startcode >= 0x80 && startcode <= 0xcf) {
507  if (len < 4)
508  goto skip;
509 
510  if (!m->raw_ac3) {
511  /* audio: skip header */
512  avio_r8(s->pb);
513  lpcm_header_len = avio_rb16(s->pb);
514  len -= 3;
515  if (startcode >= 0xb0 && startcode <= 0xbf) {
516  /* MLP/TrueHD audio has a 4-byte header */
517  avio_r8(s->pb);
518  len--;
519  }
520  }
521  }
522 
523  /* now find stream */
524  for (i = 0; i < s->nb_streams; i++) {
525  st = s->streams[i];
526  if (st->id == startcode)
527  goto found;
528  }
529 
530  es_type = m->psm_es_type[startcode & 0xff];
531  if (es_type == STREAM_TYPE_VIDEO_MPEG1) {
534  } else if (es_type == STREAM_TYPE_VIDEO_MPEG2) {
537  } else if (es_type == STREAM_TYPE_AUDIO_MPEG1 ||
538  es_type == STREAM_TYPE_AUDIO_MPEG2) {
541  } else if (es_type == STREAM_TYPE_AUDIO_AAC) {
544  } else if (es_type == STREAM_TYPE_VIDEO_MPEG4) {
547  } else if (es_type == STREAM_TYPE_VIDEO_H264) {
550  } else if (es_type == STREAM_TYPE_VIDEO_HEVC) {
553  } else if (es_type == STREAM_TYPE_AUDIO_AC3) {
556  } else if (m->imkh_cctv && es_type == 0x91) {
559  } else if (startcode >= 0x1e0 && startcode <= 0x1ef) {
560  static const unsigned char avs_seqh[4] = { 0, 0, 1, 0xb0 };
561  unsigned char buf[8];
562 
563  avio_read(s->pb, buf, 8);
564  avio_seek(s->pb, -8, SEEK_CUR);
565  if (!memcmp(buf, avs_seqh, 4) && (buf[6] != 0 || buf[7] != 1))
567  else
568  request_probe= 1;
570  } else if (startcode == PRIVATE_STREAM_2) {
573  } else if (startcode >= 0x1c0 && startcode <= 0x1df) {
575  if (m->sofdec > 0) {
577  // Auto-detect AC-3
578  request_probe = 50;
579  } else if (m->imkh_cctv && startcode == 0x1c0 && len > 80) {
581  request_probe = 50;
582  } else {
584  if (m->imkh_cctv)
585  request_probe = 25;
586  }
587  } else if (startcode >= 0x80 && startcode <= 0x87) {
590  } else if ((startcode >= 0x88 && startcode <= 0x8f) ||
591  (startcode >= 0x98 && startcode <= 0x9f)) {
592  /* 0x90 - 0x97 is reserved for SDDS in DVD specs */
595  } else if (startcode >= 0xa0 && startcode <= 0xaf) {
597  if (lpcm_header_len >= 6 && startcode == 0xa1) {
599  } else {
601  }
602  } else if (startcode >= 0xb0 && startcode <= 0xbf) {
605  } else if (startcode >= 0xc0 && startcode <= 0xcf) {
606  /* Used for both AC-3 and E-AC-3 in EVOB files */
609  } else if (startcode >= 0x20 && startcode <= 0x3f) {
612  } else if (startcode >= 0xfd55 && startcode <= 0xfd5f) {
615  } else {
616 skip:
617  /* skip packet */
618  avio_skip(s->pb, len);
619  goto redo;
620  }
621  /* no stream found: add a new stream */
622  st = avformat_new_stream(s, NULL);
623  if (!st)
624  goto skip;
625  st->id = startcode;
626  st->codecpar->codec_type = type;
627  st->codecpar->codec_id = codec_id;
630  st->codecpar->channels = 1;
632  st->codecpar->sample_rate = 8000;
633  }
634  st->request_probe = request_probe;
636 
637 found:
638  if (st->discard >= AVDISCARD_ALL)
639  goto skip;
640  if (startcode >= 0xa0 && startcode <= 0xaf) {
641  if (st->codecpar->codec_id == AV_CODEC_ID_MLP) {
642  if (len < 6)
643  goto skip;
644  avio_skip(s->pb, 6);
645  len -=6;
646  }
647  }
648  ret = av_get_packet(s->pb, pkt, len);
649 
650  pkt->pts = pts;
651  pkt->dts = dts;
652  pkt->pos = dummy_pos;
653  pkt->stream_index = st->index;
654 
655  if (s->debug & FF_FDEBUG_TS)
656  av_log(s, AV_LOG_DEBUG, "%d: pts=%0.3f dts=%0.3f size=%d\n",
657  pkt->stream_index, pkt->pts / 90000.0, pkt->dts / 90000.0,
658  pkt->size);
659 
660  return (ret < 0) ? ret : 0;
661 }
662 
663 static int64_t mpegps_read_dts(AVFormatContext *s, int stream_index,
664  int64_t *ppos, int64_t pos_limit)
665 {
666  int len, startcode;
667  int64_t pos, pts, dts;
668 
669  pos = *ppos;
670  if (avio_seek(s->pb, pos, SEEK_SET) < 0)
671  return AV_NOPTS_VALUE;
672 
673  for (;;) {
674  len = mpegps_read_pes_header(s, &pos, &startcode, &pts, &dts);
675  if (len < 0) {
676  if (s->debug & FF_FDEBUG_TS)
677  av_log(s, AV_LOG_DEBUG, "none (ret=%d)\n", len);
678  return AV_NOPTS_VALUE;
679  }
680  if (startcode == s->streams[stream_index]->id &&
681  dts != AV_NOPTS_VALUE) {
682  break;
683  }
684  avio_skip(s->pb, len);
685  }
686  if (s->debug & FF_FDEBUG_TS)
687  av_log(s, AV_LOG_DEBUG, "pos=0x%"PRIx64" dts=0x%"PRIx64" %0.3f\n",
688  pos, dts, dts / 90000.0);
689  *ppos = pos;
690  return dts;
691 }
692 
694  .name = "mpeg",
695  .long_name = NULL_IF_CONFIG_SMALL("MPEG-PS (MPEG-2 Program Stream)"),
696  .priv_data_size = sizeof(MpegDemuxContext),
700  .read_timestamp = mpegps_read_dts,
702 };
703 
704 #if CONFIG_VOBSUB_DEMUXER
705 
706 #define REF_STRING "# VobSub index file,"
707 #define MAX_LINE_SIZE 2048
708 
709 static int vobsub_probe(const AVProbeData *p)
710 {
711  if (!strncmp(p->buf, REF_STRING, sizeof(REF_STRING) - 1))
712  return AVPROBE_SCORE_MAX;
713  return 0;
714 }
715 
716 static int vobsub_read_header(AVFormatContext *s)
717 {
718  int i, ret = 0, header_parsed = 0, langidx = 0;
719  MpegDemuxContext *vobsub = s->priv_data;
720  size_t fname_len;
721  char *header_str;
722  AVBPrint header;
723  int64_t delay = 0;
724  AVStream *st = NULL;
725  int stream_id = -1;
726  char id[64] = {0};
727  char alt[MAX_LINE_SIZE] = {0};
729 
730  if (!vobsub->sub_name) {
731  char *ext;
732  vobsub->sub_name = av_strdup(s->url);
733  if (!vobsub->sub_name) {
734  ret = AVERROR(ENOMEM);
735  goto end;
736  }
737 
738  fname_len = strlen(vobsub->sub_name);
739  ext = vobsub->sub_name - 3 + fname_len;
740  if (fname_len < 4 || *(ext - 1) != '.') {
741  av_log(s, AV_LOG_ERROR, "The input index filename is too short "
742  "to guess the associated .SUB file\n");
744  goto end;
745  }
746  memcpy(ext, !strncmp(ext, "IDX", 3) ? "SUB" : "sub", 3);
747  av_log(s, AV_LOG_VERBOSE, "IDX/SUB: %s -> %s\n", s->url, vobsub->sub_name);
748  }
749 
750  if (!(iformat = av_find_input_format("mpeg"))) {
752  goto end;
753  }
754 
755  vobsub->sub_ctx = avformat_alloc_context();
756  if (!vobsub->sub_ctx) {
757  ret = AVERROR(ENOMEM);
758  goto end;
759  }
760 
761  if ((ret = ff_copy_whiteblacklists(vobsub->sub_ctx, s)) < 0)
762  goto end;
763 
764  ret = avformat_open_input(&vobsub->sub_ctx, vobsub->sub_name, iformat, NULL);
765  if (ret < 0) {
766  av_log(s, AV_LOG_ERROR, "Unable to open %s as MPEG subtitles\n", vobsub->sub_name);
767  goto end;
768  }
769 
771  while (!avio_feof(s->pb)) {
772  char line[MAX_LINE_SIZE];
773  int len = ff_get_line(s->pb, line, sizeof(line));
774 
775  if (!len)
776  break;
777 
778  line[strcspn(line, "\r\n")] = 0;
779 
780  if (!strncmp(line, "id:", 3)) {
781  if (sscanf(line, "id: %63[^,], index: %u", id, &stream_id) != 2) {
782  av_log(s, AV_LOG_WARNING, "Unable to parse index line '%s', "
783  "assuming 'id: und, index: 0'\n", line);
784  strcpy(id, "und");
785  stream_id = 0;
786  }
787 
788  if (stream_id >= FF_ARRAY_ELEMS(vobsub->q)) {
789  av_log(s, AV_LOG_ERROR, "Maximum number of subtitles streams reached\n");
790  ret = AVERROR(EINVAL);
791  goto end;
792  }
793 
794  header_parsed = 1;
795  alt[0] = '\0';
796  /* We do not create the stream immediately to avoid adding empty
797  * streams. See the following timestamp entry. */
798 
799  av_log(s, AV_LOG_DEBUG, "IDX stream[%d] id=%s\n", stream_id, id);
800 
801  } else if (!strncmp(line, "timestamp:", 10)) {
802  AVPacket *sub;
803  int hh, mm, ss, ms;
804  int64_t pos, timestamp;
805  const char *p = line + 10;
806 
807  if (stream_id == -1) {
808  av_log(s, AV_LOG_ERROR, "Timestamp declared before any stream\n");
810  goto end;
811  }
812 
813  if (!st || st->id != stream_id) {
814  st = avformat_new_stream(s, NULL);
815  if (!st) {
816  ret = AVERROR(ENOMEM);
817  goto end;
818  }
819  st->id = stream_id;
822  avpriv_set_pts_info(st, 64, 1, 1000);
823  av_dict_set(&st->metadata, "language", id, 0);
824  if (alt[0])
825  av_dict_set(&st->metadata, "title", alt, 0);
826  }
827 
828  if (sscanf(p, "%02d:%02d:%02d:%03d, filepos: %"SCNx64,
829  &hh, &mm, &ss, &ms, &pos) != 5) {
830  av_log(s, AV_LOG_ERROR, "Unable to parse timestamp line '%s', "
831  "abort parsing\n", line);
833  goto end;
834  }
835  timestamp = (hh*3600LL + mm*60LL + ss) * 1000LL + ms + delay;
836  timestamp = av_rescale_q(timestamp, av_make_q(1, 1000), st->time_base);
837 
838  sub = ff_subtitles_queue_insert(&vobsub->q[s->nb_streams - 1], "", 0, 0);
839  if (!sub) {
840  ret = AVERROR(ENOMEM);
841  goto end;
842  }
843  sub->pos = pos;
844  sub->pts = timestamp;
845  sub->stream_index = s->nb_streams - 1;
846 
847  } else if (!strncmp(line, "alt:", 4)) {
848  const char *p = line + 4;
849 
850  while (*p == ' ')
851  p++;
852  av_log(s, AV_LOG_DEBUG, "IDX stream[%d] name=%s\n", stream_id, p);
853  av_strlcpy(alt, p, sizeof(alt));
854  header_parsed = 1;
855 
856  } else if (!strncmp(line, "delay:", 6)) {
857  int sign = 1, hh = 0, mm = 0, ss = 0, ms = 0;
858  const char *p = line + 6;
859 
860  while (*p == ' ')
861  p++;
862  if (*p == '-' || *p == '+') {
863  sign = *p == '-' ? -1 : 1;
864  p++;
865  }
866  sscanf(p, "%d:%d:%d:%d", &hh, &mm, &ss, &ms);
867  delay = ((hh*3600LL + mm*60LL + ss) * 1000LL + ms) * sign;
868 
869  } else if (!strncmp(line, "langidx:", 8)) {
870  const char *p = line + 8;
871 
872  if (sscanf(p, "%d", &langidx) != 1)
873  av_log(s, AV_LOG_ERROR, "Invalid langidx specified\n");
874 
875  } else if (!header_parsed) {
876  if (line[0] && line[0] != '#')
877  av_bprintf(&header, "%s\n", line);
878  }
879  }
880 
881  if (langidx < s->nb_streams)
882  s->streams[langidx]->disposition |= AV_DISPOSITION_DEFAULT;
883 
884  for (i = 0; i < s->nb_streams; i++) {
885  vobsub->q[i].sort = SUB_SORT_POS_TS;
886  vobsub->q[i].keep_duplicates = 1;
887  ff_subtitles_queue_finalize(s, &vobsub->q[i]);
888  }
889 
890  if (!av_bprint_is_complete(&header)) {
892  ret = AVERROR(ENOMEM);
893  goto end;
894  }
895  av_bprint_finalize(&header, &header_str);
896  for (i = 0; i < s->nb_streams; i++) {
897  AVStream *sub_st = s->streams[i];
898  sub_st->codecpar->extradata = av_strdup(header_str);
899  sub_st->codecpar->extradata_size = header.len;
900  }
901  av_free(header_str);
902 
903 end:
904  return ret;
905 }
906 
907 static int vobsub_read_packet(AVFormatContext *s, AVPacket *pkt)
908 {
909  MpegDemuxContext *vobsub = s->priv_data;
911  AVIOContext *pb = vobsub->sub_ctx->pb;
912  int ret, psize, total_read = 0, i;
913  AVPacket idx_pkt = { 0 };
914 
915  int64_t min_ts = INT64_MAX;
916  int sid = 0;
917  for (i = 0; i < s->nb_streams; i++) {
918  FFDemuxSubtitlesQueue *tmpq = &vobsub->q[i];
919  int64_t ts;
920  av_assert0(tmpq->nb_subs);
921 
922  if (tmpq->current_sub_idx >= tmpq->nb_subs)
923  continue;
924 
925  ts = tmpq->subs[tmpq->current_sub_idx].pts;
926  if (ts < min_ts) {
927  min_ts = ts;
928  sid = i;
929  }
930  }
931  q = &vobsub->q[sid];
932  ret = ff_subtitles_queue_read_packet(q, &idx_pkt);
933  if (ret < 0)
934  return ret;
935 
936  /* compute maximum packet size using the next packet position. This is
937  * useful when the len in the header is non-sense */
938  if (q->current_sub_idx < q->nb_subs) {
939  psize = q->subs[q->current_sub_idx].pos - idx_pkt.pos;
940  } else {
941  int64_t fsize = avio_size(pb);
942  psize = fsize < 0 ? 0xffff : fsize - idx_pkt.pos;
943  }
944 
945  avio_seek(pb, idx_pkt.pos, SEEK_SET);
946 
948  pkt->size = 0;
949  pkt->data = NULL;
950 
951  do {
952  int n, to_read, startcode;
953  int64_t pts, dts;
954  int64_t old_pos = avio_tell(pb), new_pos;
955  int pkt_size;
956 
957  ret = mpegps_read_pes_header(vobsub->sub_ctx, NULL, &startcode, &pts, &dts);
958  if (ret < 0) {
959  if (pkt->size) // raise packet even if incomplete
960  break;
961  goto fail;
962  }
963  to_read = ret & 0xffff;
964  new_pos = avio_tell(pb);
965  pkt_size = ret + (new_pos - old_pos);
966 
967  /* this prevents reads above the current packet */
968  if (total_read + pkt_size > psize)
969  break;
970  total_read += pkt_size;
971 
972  /* the current chunk doesn't match the stream index (unlikely) */
973  if ((startcode & 0x1f) != s->streams[idx_pkt.stream_index]->id)
974  break;
975 
976  ret = av_grow_packet(pkt, to_read);
977  if (ret < 0)
978  goto fail;
979 
980  n = avio_read(pb, pkt->data + (pkt->size - to_read), to_read);
981  if (n < to_read)
982  pkt->size -= to_read - n;
983  } while (total_read < psize);
984 
985  pkt->pts = pkt->dts = idx_pkt.pts;
986  pkt->pos = idx_pkt.pos;
987  pkt->stream_index = idx_pkt.stream_index;
988 
989  av_packet_unref(&idx_pkt);
990  return 0;
991 
992 fail:
994  av_packet_unref(&idx_pkt);
995  return ret;
996 }
997 
998 static int vobsub_read_seek(AVFormatContext *s, int stream_index,
999  int64_t min_ts, int64_t ts, int64_t max_ts, int flags)
1000 {
1001  MpegDemuxContext *vobsub = s->priv_data;
1002 
1003  /* Rescale requested timestamps based on the first stream (timebase is the
1004  * same for all subtitles stream within a .idx/.sub). Rescaling is done just
1005  * like in avformat_seek_file(). */
1006  if (stream_index == -1 && s->nb_streams != 1) {
1007  int i, ret = 0;
1008  AVRational time_base = s->streams[0]->time_base;
1009  ts = av_rescale_q(ts, AV_TIME_BASE_Q, time_base);
1010  min_ts = av_rescale_rnd(min_ts, time_base.den,
1011  time_base.num * (int64_t)AV_TIME_BASE,
1013  max_ts = av_rescale_rnd(max_ts, time_base.den,
1014  time_base.num * (int64_t)AV_TIME_BASE,
1016  for (i = 0; i < s->nb_streams; i++) {
1017  int r = ff_subtitles_queue_seek(&vobsub->q[i], s, stream_index,
1018  min_ts, ts, max_ts, flags);
1019  if (r < 0)
1020  ret = r;
1021  }
1022  return ret;
1023  }
1024 
1025  if (stream_index == -1) // only 1 stream
1026  stream_index = 0;
1027  return ff_subtitles_queue_seek(&vobsub->q[stream_index], s, stream_index,
1028  min_ts, ts, max_ts, flags);
1029 }
1030 
1031 static int vobsub_read_close(AVFormatContext *s)
1032 {
1033  int i;
1034  MpegDemuxContext *vobsub = s->priv_data;
1035 
1036  for (i = 0; i < s->nb_streams; i++)
1037  ff_subtitles_queue_clean(&vobsub->q[i]);
1038  if (vobsub->sub_ctx)
1039  avformat_close_input(&vobsub->sub_ctx);
1040  return 0;
1041 }
1042 
1043 static const AVOption options[] = {
1044  { "sub_name", "URI for .sub file", offsetof(MpegDemuxContext, sub_name), AV_OPT_TYPE_STRING, { .str = NULL }, 0, 0, AV_OPT_FLAG_DECODING_PARAM },
1045  { NULL }
1046 };
1047 
1048 static const AVClass vobsub_demuxer_class = {
1049  .class_name = "vobsub",
1050  .item_name = av_default_item_name,
1051  .option = options,
1052  .version = LIBAVUTIL_VERSION_INT,
1053 };
1054 
1056  .name = "vobsub",
1057  .long_name = NULL_IF_CONFIG_SMALL("VobSub subtitle format"),
1058  .priv_data_size = sizeof(MpegDemuxContext),
1059  .read_probe = vobsub_probe,
1060  .read_header = vobsub_read_header,
1061  .read_packet = vobsub_read_packet,
1062  .read_seek2 = vobsub_read_seek,
1063  .read_close = vobsub_read_close,
1064  .flags = AVFMT_SHOW_IDS,
1065  .extensions = "idx",
1066  .priv_class = &vobsub_demuxer_class,
1067 };
1068 #endif
av_packet_unref
void av_packet_unref(AVPacket *pkt)
Wipe the packet.
Definition: avpacket.c:599
AVMEDIA_TYPE_SUBTITLE
@ AVMEDIA_TYPE_SUBTITLE
Definition: avutil.h:204
MAX_LINE_SIZE
#define MAX_LINE_SIZE
Definition: vf_lut3d.c:333
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:182
AV_BPRINT_SIZE_UNLIMITED
#define AV_BPRINT_SIZE_UNLIMITED
AVCodecParameters::extradata
uint8_t * extradata
Extra binary data needed for initializing the decoder, codec-dependent.
Definition: avcodec.h:3971
AV_CODEC_ID_AC3
@ AV_CODEC_ID_AC3
Definition: avcodec.h:567
SYSTEM_HEADER_START_CODE
#define SYSTEM_HEADER_START_CODE
Definition: mpeg.h:29
mpegps_read_packet
static int mpegps_read_packet(AVFormatContext *s, AVPacket *pkt)
Definition: mpeg.c:489
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
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
codec_id
enum AVCodecID codec_id
Definition: qsv.c:72
av_bprint_finalize
int av_bprint_finalize(AVBPrint *buf, char **ret_str)
Finalize a print buffer.
Definition: bprint.c:235
FF_FDEBUG_TS
#define FF_FDEBUG_TS
Definition: avformat.h:1626
FFERROR_REDO
#define FFERROR_REDO
Returned by demuxers to indicate that data was consumed but discarded (ignored streams or junk data).
Definition: internal.h:657
STREAM_TYPE_AUDIO_AAC
#define STREAM_TYPE_AUDIO_AAC
Definition: mpeg.h:55
ff_parse_pes_pts
static int64_t ff_parse_pes_pts(const uint8_t *buf)
Parse MPEG-PES five-byte timestamp.
Definition: mpeg.h:68
av_bprint_init
void av_bprint_init(AVBPrint *buf, unsigned size_init, unsigned size_max)
Definition: bprint.c:69
n
int n
Definition: avisynth_c.h:760
AVERROR_EOF
#define AVERROR_EOF
End of file.
Definition: error.h:55
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_CH_LAYOUT_MONO
#define AV_CH_LAYOUT_MONO
Definition: channel_layout.h:85
FFDemuxSubtitlesQueue::nb_subs
int nb_subs
number of subtitles packets
Definition: subtitles.h:104
AV_TIME_BASE_Q
#define AV_TIME_BASE_Q
Internal time base represented as fractional value.
Definition: avutil.h:260
av_grow_packet
int av_grow_packet(AVPacket *pkt, int grow_by)
Increase packet size, correctly zeroing padding.
Definition: avpacket.c:109
AV_DISPOSITION_DEFAULT
#define AV_DISPOSITION_DEFAULT
Definition: avformat.h:815
AV_CODEC_ID_MPEG4
@ AV_CODEC_ID_MPEG4
Definition: avcodec.h:230
end
static av_cold int end(AVCodecContext *avctx)
Definition: avrndec.c:90
STREAM_TYPE_AUDIO_MPEG1
#define STREAM_TYPE_AUDIO_MPEG1
Definition: mpeg.h:51
AVPacket::data
uint8_t * data
Definition: avcodec.h:1477
AVOption
AVOption.
Definition: opt.h:246
find_next_start_code
static int find_next_start_code(AVIOContext *pb, int *size_ptr, int32_t *header_state)
Definition: mpeg.c:174
AV_LOG_VERBOSE
#define AV_LOG_VERBOSE
Detailed information.
Definition: log.h:192
AUDIO_ID
#define AUDIO_ID
Definition: mpeg.h:41
AVProbeData::buf_size
int buf_size
Size of buf except extra allocated bytes.
Definition: avformat.h:449
avio_size
int64_t avio_size(AVIOContext *s)
Get the filesize.
Definition: aviobuf.c:336
AV_CODEC_ID_TRUEHD
@ AV_CODEC_ID_TRUEHD
Definition: avcodec.h:608
MpegDemuxContext::dvd
int dvd
Definition: mpeg.c:130
av_malloc
#define av_malloc(s)
Definition: tableprint_vlc.h:31
STREAM_TYPE_AUDIO_MPEG2
#define STREAM_TYPE_AUDIO_MPEG2
Definition: mpeg.h:52
ff_const59
#define ff_const59
The ff_const59 define is not part of the public API and will be removed without further warning.
Definition: avformat.h:540
FFDemuxSubtitlesQueue::current_sub_idx
int current_sub_idx
current position for the read packet callback
Definition: subtitles.h:106
AVINDEX_KEYFRAME
#define AVINDEX_KEYFRAME
Definition: avformat.h:808
AVPROBE_SCORE_MAX
#define AVPROBE_SCORE_MAX
maximum score
Definition: avformat.h:458
avformat_close_input
void avformat_close_input(AVFormatContext **s)
Close an opened input AVFormatContext.
Definition: utils.c:4452
AVCodecParameters::channels
int channels
Audio only.
Definition: avcodec.h:4063
fail
#define fail()
Definition: checkasm.h:120
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
read_close
static av_cold int read_close(AVFormatContext *ctx)
Definition: libcdio.c:145
avio_tell
static av_always_inline int64_t avio_tell(AVIOContext *s)
ftell() equivalent for AVIOContext.
Definition: avio.h:557
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
pts
static int64_t pts
Definition: transcode_aac.c:647
AV_ROUND_UP
@ AV_ROUND_UP
Round toward +infinity.
Definition: mathematics.h:83
ff_mpegps_demuxer
AVInputFormat ff_mpegps_demuxer
Definition: mpeg.c:693
AV_CODEC_ID_MP3
@ AV_CODEC_ID_MP3
preferred ID for decoding MPEG audio layer 1, 2 or 3
Definition: avcodec.h:565
ss
#define ss(width, name, subs,...)
Definition: cbs_vp9.c:261
AVRational::num
int num
Numerator.
Definition: rational.h:59
ff_subtitles_queue_seek
int ff_subtitles_queue_seek(FFDemuxSubtitlesQueue *q, AVFormatContext *s, int stream_index, int64_t min_ts, int64_t ts, int64_t max_ts, int flags)
Update current_sub_idx to emulate a seek.
Definition: subtitles.c:249
avassert.h
avio_rb32
unsigned int avio_rb32(AVIOContext *s)
Definition: aviobuf.c:800
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:176
state
static struct @313 state
buf
void * buf
Definition: avisynth_c.h:766
PROGRAM_STREAM_MAP
#define PROGRAM_STREAM_MAP
Definition: mpeg.h:36
AVInputFormat
Definition: avformat.h:640
STREAM_TYPE_AUDIO_AC3
#define STREAM_TYPE_AUDIO_AC3
Definition: mpeg.h:61
STREAM_TYPE_VIDEO_MPEG4
#define STREAM_TYPE_VIDEO_MPEG4
Definition: mpeg.h:56
s
#define s(width, name)
Definition: cbs_vp9.c:257
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
AV_CODEC_ID_MP2
@ AV_CODEC_ID_MP2
Definition: avcodec.h:564
get_pts
static int64_t get_pts(AVIOContext *pb, int c)
Definition: mpeg.c:161
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
nb_streams
static int nb_streams
Definition: ffprobe.c:280
av_rescale_q
int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq)
Rescale a 64-bit integer by 2 rational numbers.
Definition: mathematics.c:142
AV_CODEC_ID_PCM_MULAW
@ AV_CODEC_ID_PCM_MULAW
Definition: avcodec.h:469
AV_CODEC_ID_PCM_DVD
@ AV_CODEC_ID_PCM_DVD
Definition: avcodec.h:482
AVMEDIA_TYPE_DATA
@ AVMEDIA_TYPE_DATA
Opaque data information usually continuous.
Definition: avutil.h:203
STREAM_TYPE_VIDEO_MPEG1
#define STREAM_TYPE_VIDEO_MPEG1
Definition: mpeg.h:49
fsize
static int64_t fsize(FILE *f)
Definition: audiomatch.c:28
ff_subtitles_queue_read_packet
int ff_subtitles_queue_read_packet(FFDemuxSubtitlesQueue *q, AVPacket *pkt)
Generic read_packet() callback for subtitles demuxers using this queue system.
Definition: subtitles.c:212
AV_CODEC_ID_H264
@ AV_CODEC_ID_H264
Definition: avcodec.h:245
int32_t
int32_t
Definition: audio_convert.c:194
AV_CODEC_ID_DVD_NAV
@ AV_CODEC_ID_DVD_NAV
Definition: avcodec.h:696
if
if(ret)
Definition: filter_design.txt:179
AVERROR_DEMUXER_NOT_FOUND
#define AVERROR_DEMUXER_NOT_FOUND
Demuxer not found.
Definition: error.h:53
SUB_SORT_POS_TS
@ SUB_SORT_POS_TS
sort by position, then timestamps
Definition: subtitles.h:31
AVDISCARD_ALL
@ AVDISCARD_ALL
discard all
Definition: avcodec.h:811
AVFormatContext
Format I/O context.
Definition: avformat.h:1342
AV_CODEC_ID_PCM_ALAW
@ AV_CODEC_ID_PCM_ALAW
Definition: avcodec.h:470
internal.h
mpegps_read_header
static int mpegps_read_header(AVFormatContext *s)
Definition: mpeg.c:140
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
AVStream::time_base
AVRational time_base
This is the fundamental unit of time (in seconds) in terms of which frame timestamps are represented.
Definition: avformat.h:899
NULL
#define NULL
Definition: coverity.c:32
read_probe
static int read_probe(const AVProbeData *pd)
Definition: jvdec.c:55
AVFMTCTX_NOHEADER
#define AVFMTCTX_NOHEADER
signal that no header is present (streams are added dynamically)
Definition: avformat.h:1291
check_pes
static int check_pes(const uint8_t *p, const uint8_t *end)
Definition: mpeg.c:40
AVRational
Rational number (pair of numerator and denominator).
Definition: rational.h:58
AV_CODEC_ID_DVD_SUBTITLE
@ AV_CODEC_ID_DVD_SUBTITLE
Definition: avcodec.h:658
av_default_item_name
const char * av_default_item_name(void *ptr)
Return the context name.
Definition: log.c:191
AVProbeData
This structure contains the data a format has to probe a file.
Definition: avformat.h:446
AVStream::metadata
AVDictionary * metadata
Definition: avformat.h:934
PACK_START_CODE
#define PACK_START_CODE
Definition: mpeg.h:28
ff_subtitles_queue_insert
AVPacket * ff_subtitles_queue_insert(FFDemuxSubtitlesQueue *q, const uint8_t *event, size_t len, int merge)
Insert a new subtitle event.
Definition: subtitles.c:111
MpegDemuxContext::sofdec
int sofdec
Definition: mpeg.c:129
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
AVPROBE_SCORE_EXTENSION
#define AVPROBE_SCORE_EXTENSION
score for file extension
Definition: avformat.h:456
AVCodecParameters::sample_rate
int sample_rate
Audio only.
Definition: avcodec.h:4067
av_bprint_is_complete
static int av_bprint_is_complete(const AVBPrint *buf)
Test if the print buffer is complete (not truncated).
Definition: bprint.h:185
AVCodecID
AVCodecID
Identify the syntax and semantics of the bitstream.
Definition: avcodec.h:215
AVCodecParameters::extradata_size
int extradata_size
Size of the extradata content in bytes.
Definition: avcodec.h:3975
AV_CODEC_ID_AAC
@ AV_CODEC_ID_AAC
Definition: avcodec.h:566
av_rescale_rnd
int64_t av_rescale_rnd(int64_t a, int64_t b, int64_t c, enum AVRounding rnd)
Rescale a 64-bit integer with specified rounding.
Definition: mathematics.c:58
options
const OptionDef options[]
AVIOContext
Bytestream IO Context.
Definition: avio.h:161
MpegDemuxContext::psm_es_type
unsigned char psm_es_type[256]
Definition: mpeg.c:128
AVMediaType
AVMediaType
Definition: avutil.h:199
AV_CODEC_ID_ADPCM_ADX
@ AV_CODEC_ID_ADPCM_ADX
Definition: avcodec.h:511
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
PRIVATE_STREAM_1
#define PRIVATE_STREAM_1
Definition: mpeg.h:37
check_pack_header
static int check_pack_header(const uint8_t *buf)
Definition: mpeg.c:62
avformat_alloc_context
AVFormatContext * avformat_alloc_context(void)
Allocate an AVFormatContext.
Definition: options.c:144
STREAM_TYPE_VIDEO_HEVC
#define STREAM_TYPE_VIDEO_HEVC
Definition: mpeg.h:58
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
ff_copy_whiteblacklists
int ff_copy_whiteblacklists(AVFormatContext *dst, const AVFormatContext *src)
Copies the whilelists from one context to the other.
Definition: utils.c:164
avio_get_str
int avio_get_str(AVIOContext *pb, int maxlen, char *buf, int buflen)
Read a string from pb into buf.
Definition: aviobuf.c:879
size
int size
Definition: twinvq_data.h:11134
av_make_q
static AVRational av_make_q(int num, int den)
Create an AVRational.
Definition: rational.h:71
AV_NOPTS_VALUE
#define AV_NOPTS_VALUE
Undefined timestamp value.
Definition: avutil.h:248
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
MpegDemuxContext::header_state
int32_t header_state
Definition: mpeg.c:127
ff_subtitles_queue_finalize
void ff_subtitles_queue_finalize(void *log_ctx, FFDemuxSubtitlesQueue *q)
Set missing durations, sort subtitles by PTS (and then byte position), and drop duplicated events.
Definition: subtitles.c:194
FFDemuxSubtitlesQueue
Definition: subtitles.h:102
val
const char const char void * val
Definition: avisynth_c.h:863
header
static const uint8_t header[24]
Definition: sdr2.c:67
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
STREAM_TYPE_VIDEO_MPEG2
#define STREAM_TYPE_VIDEO_MPEG2
Definition: mpeg.h:50
ffio_ensure_seekback
int ffio_ensure_seekback(AVIOContext *s, int64_t buf_size)
Ensures that the requested seekback buffer size will be available.
Definition: aviobuf.c:1051
ff_subtitles_queue_clean
void ff_subtitles_queue_clean(FFDemuxSubtitlesQueue *q)
Remove and destroy all the subtitles packets.
Definition: subtitles.c:301
mpeg.h
line
Definition: graph2dot.c:48
MpegDemuxContext::imkh_cctv
int imkh_cctv
Definition: mpeg.c:131
MpegDemuxContext::raw_ac3
int raw_ac3
Definition: mpeg.c:132
PRIVATE_STREAM_2
#define PRIVATE_STREAM_2
Definition: mpeg.h:39
av_find_input_format
ff_const59 AVInputFormat * av_find_input_format(const char *short_name)
Find AVInputFormat based on the short name of the input format.
Definition: format.c:118
bprint.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
avformat_open_input
int avformat_open_input(AVFormatContext **ps, const char *url, ff_const59 AVInputFormat *fmt, AVDictionary **options)
Open an input stream and read the header.
Definition: utils.c:540
AV_TIME_BASE
#define AV_TIME_BASE
Internal time base represented as integer.
Definition: avutil.h:254
FFDemuxSubtitlesQueue::subs
AVPacket * subs
array of subtitles packets
Definition: subtitles.h:103
AV_CODEC_ID_CAVS
@ AV_CODEC_ID_CAVS
Definition: avcodec.h:305
AV_ROUND_DOWN
@ AV_ROUND_DOWN
Round toward -infinity.
Definition: mathematics.h:82
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
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
uint8_t
uint8_t
Definition: audio_convert.c:194
ff_get_line
int ff_get_line(AVIOContext *s, char *buf, int maxlen)
Read a whole line of text from AVIOContext.
Definition: aviobuf.c:808
AV_CODEC_ID_VC1
@ AV_CODEC_ID_VC1
Definition: avcodec.h:288
len
int len
Definition: vorbis_enc_data.h:452
av_get_packet
int av_get_packet(AVIOContext *s, AVPacket *pkt, int size)
Allocate and read the payload of a packet and initialize its fields with default values.
Definition: utils.c:313
AVStream::id
int id
Format-specific stream ID.
Definition: avformat.h:877
ret
ret
Definition: filter_design.txt:187
read_packet
static int read_packet(void *opaque, uint8_t *buf, int buf_size)
Definition: avio_reading.c:42
AVStream
Stream structure.
Definition: avformat.h:870
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
avio_rb16
unsigned int avio_rb16(AVIOContext *s)
Definition: aviobuf.c:785
avformat.h
iformat
static AVInputFormat * iformat
Definition: ffprobe.c:257
av_bprintf
void av_bprintf(AVBPrint *buf, const char *fmt,...)
Definition: bprint.c:94
mpegps_psm_parse
static long mpegps_psm_parse(MpegDemuxContext *m, AVIOContext *pb)
Extract stream types from a program stream map According to ISO/IEC 13818-1 ('MPEG-2 Systems') table ...
Definition: mpeg.c:208
FF_ARRAY_ELEMS
#define FF_ARRAY_ELEMS(a)
Definition: sinewin_tablegen_template.c:38
VIDEO_ID
#define VIDEO_ID
Definition: mpeg.h:42
AVStream::index
int index
stream index in AVFormatContext
Definition: avformat.h:871
STREAM_TYPE_VIDEO_H264
#define STREAM_TYPE_VIDEO_H264
Definition: mpeg.h:57
subtitles.h
ff_vobsub_demuxer
AVInputFormat ff_vobsub_demuxer
PADDING_STREAM
#define PADDING_STREAM
Definition: mpeg.h:38
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
AVRational::den
int den
Denominator.
Definition: rational.h:60
avio_read
int avio_read(AVIOContext *s, unsigned char *buf, int size)
Read size bytes from AVIOContext into buf.
Definition: aviobuf.c:647
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
avio_skip
int64_t avio_skip(AVIOContext *s, int64_t offset)
Skip given number of bytes forward.
Definition: aviobuf.c:331
av_strdup
char * av_strdup(const char *s)
Duplicate a string.
Definition: mem.c:251
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:201
AVFMT_TS_DISCONT
#define AVFMT_TS_DISCONT
Format allows timestamp discontinuities.
Definition: avformat.h:469
av_free
#define av_free(p)
Definition: tableprint_vlc.h:34
AV_ROUND_PASS_MINMAX
@ AV_ROUND_PASS_MINMAX
Flag telling rescaling functions to pass INT64_MIN/MAX through unchanged, avoiding special cases for ...
Definition: mathematics.h:108
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
mpegps_read_pes_header
static int mpegps_read_pes_header(AVFormatContext *s, int64_t *ppos, int *pstart_code, int64_t *ppts, int64_t *pdts)
Definition: mpeg.c:242
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
AVPacket::pos
int64_t pos
byte position in stream, -1 if unknown
Definition: avcodec.h:1497
mpegps_probe
static int mpegps_probe(const AVProbeData *p)
Definition: mpeg.c:67
AVCodecParameters::channel_layout
uint64_t channel_layout
Audio only.
Definition: avcodec.h:4059
AVSTREAM_PARSE_FULL
@ AVSTREAM_PARSE_FULL
full parsing and repack
Definition: avformat.h:791
flags
#define flags(name, subs,...)
Definition: cbs_av1.c:565
av_strlcpy
size_t av_strlcpy(char *dst, const char *src, size_t size)
Copy the string src to dst, but no more than size - 1 bytes, and null-terminate dst.
Definition: avstring.c:83
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:28
AVERROR_INVALIDDATA
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:59
mpegps_read_dts
static int64_t mpegps_read_dts(AVFormatContext *s, int stream_index, int64_t *ppos, int64_t pos_limit)
Definition: mpeg.c:663
MAX_SYNC_SIZE
#define MAX_SYNC_SIZE
Definition: mpeg.c:38
AV_OPT_TYPE_STRING
@ AV_OPT_TYPE_STRING
Definition: opt.h:227
MpegDemuxContext
Definition: mpeg.c:125
AV_CODEC_ID_MPEG2VIDEO
@ AV_CODEC_ID_MPEG2VIDEO
preferred ID for MPEG-1/2 video decoding
Definition: avcodec.h:220
AV_CODEC_ID_MLP
@ AV_CODEC_ID_MLP
Definition: avcodec.h:593
av_init_packet
void av_init_packet(AVPacket *pkt)
Initialize optional fields of a packet with default values.
Definition: avpacket.c:33
avio_feof
int avio_feof(AVIOContext *s)
Similar to feof() but also returns nonzero on read errors.
Definition: aviobuf.c:358