FFmpeg
oggdec.c
Go to the documentation of this file.
1 /*
2  * Ogg bitstream support
3  * Luca Barbato <lu_zero@gentoo.org>
4  * Based on tcvp implementation
5  */
6 
7 /*
8  Copyright (C) 2005 Michael Ahlberg, Måns Rullgård
9 
10  Permission is hereby granted, free of charge, to any person
11  obtaining a copy of this software and associated documentation
12  files (the "Software"), to deal in the Software without
13  restriction, including without limitation the rights to use, copy,
14  modify, merge, publish, distribute, sublicense, and/or sell copies
15  of the Software, and to permit persons to whom the Software is
16  furnished to do so, subject to the following conditions:
17 
18  The above copyright notice and this permission notice shall be
19  included in all copies or substantial portions of the Software.
20 
21  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
22  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
23  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
24  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
25  HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
26  WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
27  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
28  DEALINGS IN THE SOFTWARE.
29  */
30 
31 #include <stdio.h>
32 #include "libavutil/avassert.h"
33 #include "libavutil/intreadwrite.h"
34 #include "libavutil/mem.h"
35 #include "avio_internal.h"
36 #include "demux.h"
37 #include "oggdec.h"
38 #include "avformat.h"
39 #include "internal.h"
40 
41 #define MAX_PAGE_SIZE 65307
42 #define DECODER_BUFFER_SIZE MAX_PAGE_SIZE
43 
44 static const struct ogg_codec * const ogg_codecs[] = {
53  &ff_vp8_codec,
60  NULL
61 };
62 
63 static int64_t ogg_calc_pts(AVFormatContext *s, int idx, int64_t *dts);
64 static int ogg_new_stream(AVFormatContext *s, uint32_t serial);
65 static int ogg_restore(AVFormatContext *s);
66 
67 static void free_stream(AVFormatContext *s, int i)
68 {
69  struct ogg *ogg = s->priv_data;
70  struct ogg_stream *stream = &ogg->streams[i];
71 
72  av_freep(&stream->buf);
73  if (stream->codec &&
74  stream->codec->cleanup) {
75  stream->codec->cleanup(s, i);
76  }
77 
78  av_freep(&stream->private);
79  av_freep(&stream->new_metadata);
80  av_freep(&stream->new_extradata);
81 }
82 
83 //FIXME We could avoid some structure duplication
85 {
86  struct ogg *ogg = s->priv_data;
87  struct ogg_state *ost =
88  av_malloc(sizeof(*ost) + (ogg->nstreams - 1) * sizeof(*ogg->streams));
89  int i;
90  int ret = 0;
91 
92  if (!ost)
93  return AVERROR(ENOMEM);
94 
95  ost->pos = avio_tell(s->pb);
96  ost->curidx = ogg->curidx;
97  ost->next = ogg->state;
98  ost->nstreams = ogg->nstreams;
99  memcpy(ost->streams, ogg->streams, ogg->nstreams * sizeof(*ogg->streams));
100 
101  for (i = 0; i < ogg->nstreams; i++) {
102  struct ogg_stream *os = ogg->streams + i;
104  if (os->buf)
105  memcpy(os->buf, ost->streams[i].buf, os->bufpos);
106  else
107  ret = AVERROR(ENOMEM);
108  os->new_metadata = NULL;
109  os->new_metadata_size = 0;
110  os->new_extradata = NULL;
111  os->new_extradata_size = 0;
112  }
113 
114  ogg->state = ost;
115 
116  if (ret < 0)
117  ogg_restore(s);
118 
119  return ret;
120 }
121 
123 {
124  struct ogg *ogg = s->priv_data;
125  AVIOContext *bc = s->pb;
126  struct ogg_state *ost = ogg->state;
127  int i, err;
128 
129  if (!ost)
130  return 0;
131 
132  ogg->state = ost->next;
133 
134  for (i = 0; i < ogg->nstreams; i++) {
135  struct ogg_stream *stream = &ogg->streams[i];
136  av_freep(&stream->buf);
137  av_freep(&stream->new_metadata);
138  av_freep(&stream->new_extradata);
139 
140  if (i >= ost->nstreams || !ost->streams[i].private) {
141  free_stream(s, i);
142  }
143  }
144 
145  avio_seek(bc, ost->pos, SEEK_SET);
146  ogg->page_pos = -1;
147  ogg->curidx = ost->curidx;
148  ogg->nstreams = ost->nstreams;
149  if ((err = av_reallocp_array(&ogg->streams, ogg->nstreams,
150  sizeof(*ogg->streams))) < 0) {
151  ogg->nstreams = 0;
152  return err;
153  } else
154  memcpy(ogg->streams, ost->streams,
155  ost->nstreams * sizeof(*ogg->streams));
156 
157  av_free(ost);
158 
159  return 0;
160 }
161 
163 {
164  struct ogg *ogg = s->priv_data;
165  int i;
166  int64_t start_pos = avio_tell(s->pb);
167 
168  for (i = 0; i < ogg->nstreams; i++) {
169  struct ogg_stream *os = ogg->streams + i;
170  os->bufpos = 0;
171  os->pstart = 0;
172  os->psize = 0;
173  os->granule = -1;
174  os->lastpts = AV_NOPTS_VALUE;
175  os->lastdts = AV_NOPTS_VALUE;
176  os->sync_pos = -1;
177  os->page_pos = 0;
178  os->nsegs = 0;
179  os->segp = 0;
180  os->incomplete = 0;
181  os->got_data = 0;
182  if (start_pos <= ffformatcontext(s)->data_offset) {
183  os->lastpts = 0;
184  }
185  os->start_trimming = 0;
186  os->end_trimming = 0;
187  av_freep(&os->new_metadata);
188  os->new_metadata_size = 0;
189  av_freep(&os->new_extradata);
190  os->new_extradata_size = 0;
191  }
192 
193  ogg->page_pos = -1;
194  ogg->curidx = -1;
195 
196  return 0;
197 }
198 
199 static const struct ogg_codec *ogg_find_codec(uint8_t *buf, int size)
200 {
201  int i;
202 
203  for (i = 0; ogg_codecs[i]; i++)
204  if (size >= ogg_codecs[i]->magicsize &&
205  !memcmp(buf, ogg_codecs[i]->magic, ogg_codecs[i]->magicsize))
206  return ogg_codecs[i];
207 
208  return NULL;
209 }
210 
211 /**
212  * Replace the current stream with a new one. This is a typical webradio
213  * situation where a new audio stream spawn (identified with a new serial) and
214  * must replace the previous one (track switch).
215  */
216 static int ogg_replace_stream(AVFormatContext *s, uint32_t serial, char *magic, int page_size,
217  int probing)
218 {
219  struct ogg *ogg = s->priv_data;
220  struct ogg_stream *os;
221  const struct ogg_codec *codec;
222  int i = 0;
223 
224  if (ogg->nstreams != 1) {
225  avpriv_report_missing_feature(s, "Changing stream parameters in multistream ogg");
226  return AVERROR_PATCHWELCOME;
227  }
228 
229  /* Check for codecs */
230  codec = ogg_find_codec(magic, page_size);
231  if (!codec && !probing) {
232  av_log(s, AV_LOG_ERROR, "Cannot identify new stream\n");
233  return AVERROR_INVALIDDATA;
234  }
235 
236  os = &ogg->streams[0];
237  if (os->codec != codec)
238  return AVERROR(EINVAL);
239 
240  os->serial = serial;
241  os->codec = codec;
242  os->serial = serial;
243  os->lastpts = 0;
244  os->lastdts = 0;
245  os->flags = 0;
246  os->start_trimming = 0;
247  os->end_trimming = 0;
248  os->replace = 1;
249 
250  return i;
251 }
252 
253 static int ogg_new_stream(AVFormatContext *s, uint32_t serial)
254 {
255  struct ogg *ogg = s->priv_data;
256  int idx = ogg->nstreams;
257  AVStream *st;
258  struct ogg_stream *os;
259 
260  if (ogg->state) {
261  av_log(s, AV_LOG_ERROR, "New streams are not supposed to be added "
262  "in between Ogg context save/restore operations.\n");
263  return AVERROR_BUG;
264  }
265 
266  /* Allocate and init a new Ogg Stream */
267  if (!(os = av_realloc_array(ogg->streams, ogg->nstreams + 1,
268  sizeof(*ogg->streams))))
269  return AVERROR(ENOMEM);
270  ogg->streams = os;
271  os = ogg->streams + idx;
272  memset(os, 0, sizeof(*os));
273  os->serial = serial;
276  os->header = -1;
278  if (!os->buf)
279  return AVERROR(ENOMEM);
280 
281  /* Create the associated AVStream */
282  st = avformat_new_stream(s, NULL);
283  if (!st) {
284  av_freep(&os->buf);
285  return AVERROR(ENOMEM);
286  }
287  st->id = idx;
288  avpriv_set_pts_info(st, 64, 1, 1000000);
289 
290  ogg->nstreams++;
291  return idx;
292 }
293 
294 static int data_packets_seen(const struct ogg *ogg)
295 {
296  int i;
297 
298  for (i = 0; i < ogg->nstreams; i++)
299  if (ogg->streams[i].got_data)
300  return 1;
301  return 0;
302 }
303 
304 static int buf_realloc(struct ogg_stream *os, int size)
305 {
306  /* Even if invalid guarantee there's enough memory to read the page */
307  if (os->bufsize - os->bufpos < size) {
308  uint8_t *nb = av_realloc(os->buf, 2*os->bufsize + AV_INPUT_BUFFER_PADDING_SIZE);
309  if (!nb)
310  return AVERROR(ENOMEM);
311  os->buf = nb;
312  os->bufsize *= 2;
313  }
314 
315  return 0;
316 }
317 
318 static int ogg_read_page(AVFormatContext *s, int *sid, int probing)
319 {
320  AVIOContext *bc = s->pb;
321  struct ogg *ogg = s->priv_data;
322  struct ogg_stream *os;
323  int ret, i = 0;
324  int flags, nsegs;
325  uint64_t gp;
326  uint32_t serial;
327  uint32_t crc, crc_tmp;
328  int size = 0, idx;
330  int64_t start_pos;
331  uint8_t sync[4];
332  uint8_t segments[255];
333  uint8_t *readout_buf;
334  int sp = 0;
335 
336  ret = avio_read(bc, sync, 4);
337  if (ret < 4)
338  return ret < 0 ? ret : AVERROR_EOF;
339 
340  do {
341  int c;
342 
343  if (sync[sp & 3] == 'O' &&
344  sync[(sp + 1) & 3] == 'g' &&
345  sync[(sp + 2) & 3] == 'g' && sync[(sp + 3) & 3] == 'S')
346  break;
347 
348  if(!i && (bc->seekable & AVIO_SEEKABLE_NORMAL) && ogg->page_pos > 0) {
349  memset(sync, 0, 4);
350  avio_seek(bc, ogg->page_pos+4, SEEK_SET);
351  ogg->page_pos = -1;
352  }
353 
354  c = avio_r8(bc);
355 
356  if (avio_feof(bc))
357  return AVERROR_EOF;
358 
359  sync[sp++ & 3] = c;
360  } while (i++ < MAX_PAGE_SIZE);
361 
362  if (i >= MAX_PAGE_SIZE) {
363  av_log(s, AV_LOG_INFO, "cannot find sync word\n");
364  return AVERROR_INVALIDDATA;
365  }
366 
367  /* 0x4fa9b05f = av_crc(AV_CRC_32_IEEE, 0x0, "OggS", 4) */
368  ffio_init_checksum(bc, ff_crc04C11DB7_update, 0x4fa9b05f);
369 
370  /* To rewind if checksum is bad/check magic on switches - this is the max packet size */
372  if (ret < 0)
373  return ret;
374  start_pos = avio_tell(bc);
375 
376  version = avio_r8(bc);
377  flags = avio_r8(bc);
378  gp = avio_rl64(bc);
379  serial = avio_rl32(bc);
380  avio_rl32(bc); /* seq */
381 
382  crc_tmp = ffio_get_checksum(bc);
383  crc = avio_rb32(bc);
384  crc_tmp = ff_crc04C11DB7_update(crc_tmp, (uint8_t[4]){0}, 4);
386 
387  nsegs = avio_r8(bc);
388  page_pos = avio_tell(bc) - 27;
389 
390  ret = avio_read(bc, segments, nsegs);
391  if (ret < nsegs)
392  return ret < 0 ? ret : AVERROR_EOF;
393 
394  for (i = 0; i < nsegs; i++)
395  size += segments[i];
396 
397  idx = ogg_find_stream(ogg, serial);
398  if (idx >= 0) {
399  os = ogg->streams + idx;
400 
401  ret = buf_realloc(os, size);
402  if (ret < 0)
403  return ret;
404 
405  readout_buf = os->buf + os->bufpos;
406  } else {
407  readout_buf = av_malloc(size);
408  }
409 
410  ret = avio_read(bc, readout_buf, size);
411  if (ret < size) {
412  if (idx < 0)
413  av_free(readout_buf);
414  return ret < 0 ? ret : AVERROR_EOF;
415  }
416 
417  if (crc ^ ffio_get_checksum(bc)) {
418  av_log(s, AV_LOG_ERROR, "CRC mismatch!\n");
419  if (idx < 0)
420  av_free(readout_buf);
421  avio_seek(bc, start_pos, SEEK_SET);
422  *sid = -1;
423  return 0;
424  }
425 
426  /* Since we're almost sure its a valid packet, checking the version after
427  * the checksum lets the demuxer be more tolerant */
428  if (version) {
429  av_log(s, AV_LOG_ERROR, "Invalid Ogg vers!\n");
430  if (idx < 0)
431  av_free(readout_buf);
432  avio_seek(bc, start_pos, SEEK_SET);
433  *sid = -1;
434  return 0;
435  }
436 
437  /* CRC is correct so we can be 99% sure there's an actual change here */
438  if (idx < 0) {
439  if (data_packets_seen(ogg))
440  idx = ogg_replace_stream(s, serial, readout_buf, size, probing);
441  else
442  idx = ogg_new_stream(s, serial);
443 
444  if (idx < 0) {
445  av_log(s, AV_LOG_ERROR, "failed to create or replace stream\n");
446  av_free(readout_buf);
447  return idx;
448  }
449 
450  os = ogg->streams + idx;
451 
452  ret = buf_realloc(os, size);
453  if (ret < 0) {
454  av_free(readout_buf);
455  return ret;
456  }
457 
458  memcpy(os->buf + os->bufpos, readout_buf, size);
459  av_free(readout_buf);
460  }
461 
462  ogg->page_pos = page_pos;
463  os->page_pos = page_pos;
464  os->nsegs = nsegs;
465  os->segp = 0;
466  os->got_data = !(flags & OGG_FLAG_BOS);
467  os->bufpos += size;
468  os->granule = gp;
469  os->flags = flags;
470  memcpy(os->segments, segments, nsegs);
471  memset(os->buf + os->bufpos, 0, AV_INPUT_BUFFER_PADDING_SIZE);
472 
473  if (flags & OGG_FLAG_CONT || os->incomplete) {
474  if (!os->psize) {
475  // If this is the very first segment we started
476  // playback in the middle of a continuation packet.
477  // Discard it since we missed the start of it.
478  while (os->segp < os->nsegs) {
479  int seg = os->segments[os->segp++];
480  os->pstart += seg;
481  if (seg < 255)
482  break;
483  }
484  os->sync_pos = os->page_pos;
485  }
486  } else {
487  os->psize = 0;
488  os->sync_pos = os->page_pos;
489  }
490 
491  /* This function is always called with sid != NULL */
492  *sid = idx;
493 
494  return 0;
495 }
496 
497 /**
498  * @brief find the next Ogg packet
499  * @param *sid is set to the stream for the packet or -1 if there is
500  * no matching stream, in that case assume all other return
501  * values to be uninitialized.
502  * @return negative value on error or EOF.
503  */
504 static int ogg_packet(AVFormatContext *s, int *sid, int *dstart, int *dsize,
505  int64_t *fpos)
506 {
507  FFFormatContext *const si = ffformatcontext(s);
508  struct ogg *ogg = s->priv_data;
509  int idx, i, ret;
510  struct ogg_stream *os;
511  int complete = 0;
512  int segp = 0, psize = 0;
513 
514  av_log(s, AV_LOG_TRACE, "ogg_packet: curidx=%i\n", ogg->curidx);
515  if (sid)
516  *sid = -1;
517 
518  do {
519  idx = ogg->curidx;
520 
521  while (idx < 0) {
522  ret = ogg_read_page(s, &idx, 0);
523  if (ret < 0)
524  return ret;
525  }
526 
527  os = ogg->streams + idx;
528 
529  av_log(s, AV_LOG_TRACE, "ogg_packet: idx=%d pstart=%d psize=%d segp=%d nsegs=%d\n",
530  idx, os->pstart, os->psize, os->segp, os->nsegs);
531 
532  if (!os->codec) {
533  if (os->header < 0) {
534  os->codec = ogg_find_codec(os->buf, os->bufpos);
535  if (!os->codec) {
536  av_log(s, AV_LOG_WARNING, "Codec not found\n");
537  os->header = 0;
538  return 0;
539  }
540  } else {
541  return 0;
542  }
543  }
544 
545  segp = os->segp;
546  psize = os->psize;
547 
548  while (os->segp < os->nsegs) {
549  int ss = os->segments[os->segp++];
550  os->psize += ss;
551  if (ss < 255) {
552  complete = 1;
553  break;
554  }
555  }
556 
557  if (!complete && os->segp == os->nsegs) {
558  ogg->curidx = -1;
559  // Do not set incomplete for empty packets.
560  // Together with the code in ogg_read_page
561  // that discards all continuation of empty packets
562  // we would get an infinite loop.
563  os->incomplete = !!os->psize;
564  }
565  } while (!complete);
566 
567 
568  if (os->granule == -1)
570  "Page at %"PRId64" is missing granule\n",
571  os->page_pos);
572 
573  ogg->curidx = idx;
574  os->incomplete = 0;
575 
576  if (os->header) {
577  if ((ret = os->codec->header(s, idx)) < 0) {
578  av_log(s, AV_LOG_ERROR, "Header processing failed: %s\n", av_err2str(ret));
579  return ret;
580  }
581  os->header = ret;
582  if (!os->header) {
583  os->segp = segp;
584  os->psize = psize;
585 
586  // We have reached the first non-header packet in this stream.
587  // Unfortunately more header packets may still follow for others,
588  // but if we continue with header parsing we may lose data packets.
589  ogg->headers = 1;
590 
591  // Update the header state for all streams and
592  // compute the data_offset.
593  if (!si->data_offset)
594  si->data_offset = os->sync_pos;
595 
596  for (i = 0; i < ogg->nstreams; i++) {
597  struct ogg_stream *cur_os = ogg->streams + i;
598 
599  // if we have a partial non-header packet, its start is
600  // obviously at or after the data start
601  if (cur_os->incomplete)
602  si->data_offset = FFMIN(si->data_offset, cur_os->sync_pos);
603  }
604  } else {
605  os->nb_header++;
606  os->pstart += os->psize;
607  os->psize = 0;
608  }
609  } else {
610  os->pflags = 0;
611  os->pduration = 0;
612 
613  ret = 0;
614  if (os->codec && os->codec->packet) {
615  if ((ret = os->codec->packet(s, idx)) < 0) {
616  av_log(s, AV_LOG_ERROR, "Packet processing failed: %s\n", av_err2str(ret));
617  return ret;
618  }
619  }
620 
621  if (!ret) {
622  if (sid)
623  *sid = idx;
624  if (dstart)
625  *dstart = os->pstart;
626  if (dsize)
627  *dsize = os->psize;
628  if (fpos)
629  *fpos = os->sync_pos;
630  }
631 
632  os->pstart += os->psize;
633  os->psize = 0;
634  if(os->pstart == os->bufpos)
635  os->bufpos = os->pstart = 0;
636  os->sync_pos = os->page_pos;
637  }
638 
639  // determine whether there are more complete packets in this page
640  // if not, the page's granule will apply to this packet
641  os->page_end = 1;
642  for (i = os->segp; i < os->nsegs; i++)
643  if (os->segments[i] < 255) {
644  os->page_end = 0;
645  break;
646  }
647 
648  if (os->segp == os->nsegs)
649  ogg->curidx = -1;
650 
651  return 0;
652 }
653 
655 {
656  struct ogg *ogg = s->priv_data;
657  int i, ret;
658  int64_t size, end;
659  int streams_left=0;
660 
661  if (!(s->pb->seekable & AVIO_SEEKABLE_NORMAL))
662  return 0;
663 
664 // already set
665  if (s->duration != AV_NOPTS_VALUE)
666  return 0;
667 
668  size = avio_size(s->pb);
669  if (size < 0)
670  return 0;
671  end = size > MAX_PAGE_SIZE ? size - MAX_PAGE_SIZE : 0;
672 
673  ret = ogg_save(s);
674  if (ret < 0)
675  return ret;
676  avio_seek(s->pb, end, SEEK_SET);
677  ogg->page_pos = -1;
678 
679  while (!ogg_read_page(s, &i, 1)) {
680  if (i >= 0 && ogg->streams[i].granule != -1 && ogg->streams[i].granule != 0 &&
681  ogg->streams[i].codec) {
682  s->streams[i]->duration =
684  if (s->streams[i]->start_time != AV_NOPTS_VALUE) {
685  s->streams[i]->duration -= s->streams[i]->start_time;
686  streams_left-= (ogg->streams[i].got_start==-1);
687  ogg->streams[i].got_start= 1;
688  } else if(!ogg->streams[i].got_start) {
689  ogg->streams[i].got_start= -1;
690  streams_left++;
691  }
692  }
693  }
694 
695  ogg_restore(s);
696 
697  ret = ogg_save(s);
698  if (ret < 0)
699  return ret;
700 
701  avio_seek (s->pb, ffformatcontext(s)->data_offset, SEEK_SET);
702  ogg_reset(s);
703  while (streams_left > 0 && !ogg_packet(s, &i, NULL, NULL, NULL)) {
704  int64_t pts;
705  if (i < 0) continue;
706  pts = ogg_calc_pts(s, i, NULL);
707  if (s->streams[i]->duration == AV_NOPTS_VALUE)
708  continue;
709  if (pts != AV_NOPTS_VALUE && s->streams[i]->start_time == AV_NOPTS_VALUE && !ogg->streams[i].got_start) {
710  s->streams[i]->duration -= pts;
711  ogg->streams[i].got_start= 1;
712  streams_left--;
713  }else if(s->streams[i]->start_time != AV_NOPTS_VALUE && !ogg->streams[i].got_start) {
714  ogg->streams[i].got_start= 1;
715  streams_left--;
716  }
717  }
718  ogg_restore (s);
719 
720  return 0;
721 }
722 
724 {
725  struct ogg *ogg = s->priv_data;
726  int i;
727 
728  for (i = 0; i < ogg->nstreams; i++) {
729  free_stream(s, i);
730  }
731 
732  ogg->nstreams = 0;
733 
734  av_freep(&ogg->streams);
735  return 0;
736 }
737 
739 {
740  struct ogg *ogg = s->priv_data;
741  int ret, i;
742 
743  ogg->curidx = -1;
744 
745  //linear headers seek from start
746  do {
747  ret = ogg_packet(s, NULL, NULL, NULL, NULL);
748  if (ret < 0)
749  return ret;
750  } while (!ogg->headers);
751  av_log(s, AV_LOG_TRACE, "found headers\n");
752 
753  for (i = 0; i < ogg->nstreams; i++) {
754  struct ogg_stream *os = ogg->streams + i;
755 
756  if (ogg->streams[i].header < 0) {
757  av_log(s, AV_LOG_ERROR, "Header parsing failed for stream %d\n", i);
758  ogg->streams[i].codec = NULL;
760  } else if (os->codec && os->nb_header < os->codec->nb_header) {
762  "Headers mismatch for stream %d: "
763  "expected %d received %d.\n",
764  i, os->codec->nb_header, os->nb_header);
765  if (s->error_recognition & AV_EF_EXPLODE)
766  return AVERROR_INVALIDDATA;
767  }
769  os->lastpts = s->streams[i]->start_time =
770  ogg_gptopts(s, i, os->start_granule, NULL);
771  }
772 
773  //linear granulepos seek from end
774  ret = ogg_get_length(s);
775  if (ret < 0)
776  return ret;
777 
778  return 0;
779 }
780 
782 {
783  struct ogg *ogg = s->priv_data;
784  struct ogg_stream *os = ogg->streams + idx;
786 
787  if (dts)
788  *dts = AV_NOPTS_VALUE;
789 
790  if (os->lastpts != AV_NOPTS_VALUE) {
791  pts = os->lastpts;
792  os->lastpts = AV_NOPTS_VALUE;
793  }
794  if (os->lastdts != AV_NOPTS_VALUE) {
795  if (dts)
796  *dts = os->lastdts;
797  os->lastdts = AV_NOPTS_VALUE;
798  }
799  if (os->page_end) {
800  if (os->granule != -1LL) {
801  if (os->codec && os->codec->granule_is_start)
802  pts = ogg_gptopts(s, idx, os->granule, dts);
803  else
804  os->lastpts = ogg_gptopts(s, idx, os->granule, &os->lastdts);
805  os->granule = -1LL;
806  }
807  }
808  return pts;
809 }
810 
811 static void ogg_validate_keyframe(AVFormatContext *s, int idx, int pstart, int psize)
812 {
813  struct ogg *ogg = s->priv_data;
814  struct ogg_stream *os = ogg->streams + idx;
815  int invalid = 0;
816  if (psize) {
817  switch (s->streams[idx]->codecpar->codec_id) {
818  case AV_CODEC_ID_THEORA:
819  invalid = !!(os->pflags & AV_PKT_FLAG_KEY) != !(os->buf[pstart] & 0x40);
820  break;
821  case AV_CODEC_ID_VP8:
822  invalid = !!(os->pflags & AV_PKT_FLAG_KEY) != !(os->buf[pstart] & 1);
823  }
824  if (invalid) {
825  os->pflags ^= AV_PKT_FLAG_KEY;
826  av_log(s, AV_LOG_WARNING, "Broken file, %skeyframe not correctly marked.\n",
827  (os->pflags & AV_PKT_FLAG_KEY) ? "" : "non-");
828  }
829  }
830 }
831 
833 {
834  struct ogg *ogg;
835  struct ogg_stream *os;
836  int idx, ret;
837  int pstart, psize;
838  int64_t fpos, pts, dts;
839 
840  if (s->io_repositioned) {
841  ogg_reset(s);
842  s->io_repositioned = 0;
843  }
844 
845  //Get an ogg packet
846 retry:
847  do {
848  ret = ogg_packet(s, &idx, &pstart, &psize, &fpos);
849  if (ret < 0)
850  return ret;
851  } while (idx < 0 || !s->streams[idx]);
852 
853  ogg = s->priv_data;
854  os = ogg->streams + idx;
855 
856  // pflags might not be set until after this
857  pts = ogg_calc_pts(s, idx, &dts);
859 
860  if (os->keyframe_seek && !(os->pflags & AV_PKT_FLAG_KEY))
861  goto retry;
862  os->keyframe_seek = 0;
863 
864  //Alloc a pkt
866  if (ret < 0)
867  return ret;
868  pkt->stream_index = idx;
869  memcpy(pkt->data, os->buf + pstart, psize);
870 
871  pkt->pts = pts;
872  pkt->dts = dts;
873  pkt->flags = os->pflags;
874  pkt->duration = os->pduration;
875  pkt->pos = fpos;
876 
877  if (os->start_trimming || os->end_trimming) {
878  uint8_t *side_data = av_packet_new_side_data(pkt,
880  10);
881  if(!side_data)
882  return AVERROR(ENOMEM);
883  AV_WL32(side_data + 0, os->start_trimming);
884  AV_WL32(side_data + 4, os->end_trimming);
885  os->start_trimming = 0;
886  os->end_trimming = 0;
887  }
888 
889  if (os->replace) {
890  os->replace = 0;
891  pkt->dts = pkt->pts = AV_NOPTS_VALUE;
892  }
893 
894  if (os->new_metadata) {
897  if (ret < 0)
898  return ret;
899 
900  os->new_metadata = NULL;
901  os->new_metadata_size = 0;
902  }
903 
904  if (os->new_extradata) {
907  if (ret < 0)
908  return ret;
909 
910  os->new_extradata = NULL;
911  os->new_extradata_size = 0;
912  }
913 
914  return psize;
915 }
916 
917 static int64_t ogg_read_timestamp(AVFormatContext *s, int stream_index,
918  int64_t *pos_arg, int64_t pos_limit)
919 {
920  struct ogg *ogg = s->priv_data;
921  AVIOContext *bc = s->pb;
923  int64_t keypos = -1;
924  int i;
925  int pstart, psize;
926  avio_seek(bc, *pos_arg, SEEK_SET);
927  ogg_reset(s);
928 
929  while ( avio_tell(bc) <= pos_limit
930  && !ogg_packet(s, &i, &pstart, &psize, pos_arg)) {
931  if (i == stream_index) {
932  struct ogg_stream *os = ogg->streams + stream_index;
933  // Do not trust the last timestamps of an ogm video
934  if ( (os->flags & OGG_FLAG_EOS)
935  && !(os->flags & OGG_FLAG_BOS)
936  && os->codec == &ff_ogm_video_codec)
937  continue;
938  pts = ogg_calc_pts(s, i, NULL);
940  if (os->pflags & AV_PKT_FLAG_KEY) {
941  keypos = *pos_arg;
942  } else if (os->keyframe_seek) {
943  // if we had a previous keyframe but no pts for it,
944  // return that keyframe with this pts value.
945  if (keypos >= 0)
946  *pos_arg = keypos;
947  else
949  }
950  }
951  if (pts != AV_NOPTS_VALUE)
952  break;
953  }
954  ogg_reset(s);
955  return pts;
956 }
957 
958 static int ogg_read_seek(AVFormatContext *s, int stream_index,
959  int64_t timestamp, int flags)
960 {
961  struct ogg *ogg = s->priv_data;
962  struct ogg_stream *os = ogg->streams + stream_index;
963  int ret;
964 
965  av_assert0(stream_index < ogg->nstreams);
966  // Ensure everything is reset even when seeking via
967  // the generated index.
968  ogg_reset(s);
969 
970  // Try seeking to a keyframe first. If this fails (very possible),
971  // av_seek_frame will fall back to ignoring keyframes
972  if (s->streams[stream_index]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO
973  && !(flags & AVSEEK_FLAG_ANY))
974  os->keyframe_seek = 1;
975 
976  ret = ff_seek_frame_binary(s, stream_index, timestamp, flags);
977  ogg_reset(s);
978  os = ogg->streams + stream_index;
979  if (ret < 0)
980  os->keyframe_seek = 0;
981  return ret;
982 }
983 
984 static int ogg_probe(const AVProbeData *p)
985 {
986  if (!memcmp("OggS", p->buf, 5) && p->buf[5] <= 0x7)
987  return AVPROBE_SCORE_MAX;
988  return 0;
989 }
990 
992  .p.name = "ogg",
993  .p.long_name = NULL_IF_CONFIG_SMALL("Ogg"),
994  .p.extensions = "ogg",
996  .priv_data_size = sizeof(struct ogg),
997  .flags_internal = FF_INFMT_FLAG_INIT_CLEANUP,
998  .read_probe = ogg_probe,
999  .read_header = ogg_read_header,
1000  .read_packet = ogg_read_packet,
1001  .read_close = ogg_read_close,
1002  .read_seek = ogg_read_seek,
1003  .read_timestamp = ogg_read_timestamp,
1004 };
ff_old_flac_codec
const struct ogg_codec ff_old_flac_codec
Definition: oggparseflac.c:167
flags
const SwsFlags flags[]
Definition: swscale.c:61
ff_ogm_text_codec
const struct ogg_codec ff_ogm_text_codec
Definition: oggparseogm.c:213
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:216
ff_seek_frame_binary
int ff_seek_frame_binary(AVFormatContext *s, int stream_index, int64_t target_ts, int flags)
Perform a binary search using av_index_search_timestamp() and FFInputFormat.read_timestamp().
Definition: seek.c:290
ogg_stream::segp
int segp
Definition: oggdec.h:85
AV_EF_EXPLODE
#define AV_EF_EXPLODE
abort decoding on minor error detection
Definition: defs.h:51
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
ogg_stream::lastpts
int64_t lastpts
Definition: oggdec.h:78
ff_ogm_audio_codec
const struct ogg_codec ff_ogm_audio_codec
Definition: oggparseogm.c:204
AV_WL32
#define AV_WL32(p, v)
Definition: intreadwrite.h:422
ogg_codec::magicsize
uint8_t magicsize
Definition: oggdec.h:32
ogg_validate_keyframe
static void ogg_validate_keyframe(AVFormatContext *s, int idx, int pstart, int psize)
Definition: oggdec.c:811
ffformatcontext
static av_always_inline FFFormatContext * ffformatcontext(AVFormatContext *s)
Definition: internal.h:123
avformat_new_stream
AVStream * avformat_new_stream(AVFormatContext *s, const struct AVCodec *c)
Add a new stream to a media file.
AV_PKT_DATA_NEW_EXTRADATA
@ AV_PKT_DATA_NEW_EXTRADATA
The AV_PKT_DATA_NEW_EXTRADATA is used to notify the codec or the format that the extradata buffer was...
Definition: packet.h:56
AVERROR_EOF
#define AVERROR_EOF
End of file.
Definition: error.h:57
ogg_stream::bufpos
unsigned int bufpos
Definition: oggdec.h:70
int64_t
long long int64_t
Definition: coverity.c:34
ff_vp8_codec
const struct ogg_codec ff_vp8_codec
Definition: oggparsevp8.c:139
ogg_stream::got_start
int got_start
Definition: oggdec.h:90
ff_old_dirac_codec
const struct ogg_codec ff_old_dirac_codec
Definition: oggparsedirac.c:126
AVPacket::data
uint8_t * data
Definition: packet.h:588
ogg_stream::granule
uint64_t granule
Definition: oggdec.h:76
ogg_stream::start_trimming
int start_trimming
set the number of packets to drop from the start
Definition: oggdec.h:93
ogg_read_header
static int ogg_read_header(AVFormatContext *s)
Definition: oggdec.c:738
ogg_new_stream
static int ogg_new_stream(AVFormatContext *s, uint32_t serial)
Definition: oggdec.c:253
AVPacket::duration
int64_t duration
Duration of this packet in AVStream->time_base units, 0 if unknown.
Definition: packet.h:606
ogg_stream::nb_header
int nb_header
set to the number of parsed headers
Definition: oggdec.h:92
ogg_stream::buf
uint8_t * buf
Definition: oggdec.h:68
ogg_stream::nsegs
int nsegs
Definition: oggdec.h:85
ogg_reset
static int ogg_reset(AVFormatContext *s)
Definition: oggdec.c:162
AVFMT_NOBINSEARCH
#define AVFMT_NOBINSEARCH
Format does not allow to fall back on binary search via read_timestamp.
Definition: avformat.h:484
ogg
Definition: oggdec.h:111
avio_size
int64_t avio_size(AVIOContext *s)
Get the filesize.
Definition: aviobuf.c:326
ost
static AVStream * ost
Definition: vaapi_transcode.c:42
ff_vorbis_codec
const struct ogg_codec ff_vorbis_codec
Definition: oggparsevorbis.c:613
AV_PKT_FLAG_KEY
#define AV_PKT_FLAG_KEY
The packet contains a keyframe.
Definition: packet.h:643
ffio_get_checksum
unsigned long ffio_get_checksum(AVIOContext *s)
Definition: aviobuf.c:586
ff_flac_codec
const struct ogg_codec ff_flac_codec
Definition: oggparseflac.c:159
ogg_stream::new_extradata_size
size_t new_extradata_size
Definition: oggdec.h:99
ff_ogg_demuxer
const FFInputFormat ff_ogg_demuxer
Definition: oggdec.c:991
AVPROBE_SCORE_MAX
#define AVPROBE_SCORE_MAX
maximum score
Definition: avformat.h:463
ogg_codec::packet
int(* packet)(AVFormatContext *, int)
Attempt to process a packet as a data packet.
Definition: oggdec.h:48
DECODER_BUFFER_SIZE
#define DECODER_BUFFER_SIZE
Definition: oggdec.c:42
avpriv_set_pts_info
void avpriv_set_pts_info(AVStream *st, int pts_wrap_bits, unsigned int pts_num, unsigned int pts_den)
Set the time base and wrapping info for a given stream.
Definition: avformat.c:780
ogg_gptopts
static uint64_t ogg_gptopts(AVFormatContext *s, int i, uint64_t gp, int64_t *dts)
Definition: oggdec.h:191
ogg_stream::serial
uint32_t serial
Definition: oggdec.h:75
av_packet_add_side_data
int av_packet_add_side_data(AVPacket *pkt, enum AVPacketSideDataType type, uint8_t *data, size_t size)
Wrap an existing array as a packet side data.
Definition: packet.c:197
AVSEEK_FLAG_ANY
#define AVSEEK_FLAG_ANY
seek to any frame, even non-keyframes
Definition: avformat.h:2476
ogg_stream::lastdts
int64_t lastdts
Definition: oggdec.h:79
avio_tell
static av_always_inline int64_t avio_tell(AVIOContext *s)
ftell() equivalent for AVIOContext.
Definition: avio.h:494
AVFMT_GENERIC_INDEX
#define AVFMT_GENERIC_INDEX
Use generic index building code.
Definition: avformat.h:479
ogg::headers
int headers
Definition: oggdec.h:114
pts
static int64_t pts
Definition: transcode_aac.c:644
ss
#define ss(width, name, subs,...)
Definition: cbs_vp9.c:202
ogg_packet
static int ogg_packet(AVFormatContext *s, int *sid, int *dstart, int *dsize, int64_t *fpos)
find the next Ogg packet
Definition: oggdec.c:504
free_stream
static void free_stream(AVFormatContext *s, int i)
Definition: oggdec.c:67
avassert.h
ogg_stream::pstart
unsigned int pstart
Definition: oggdec.h:71
avio_rb32
unsigned int avio_rb32(AVIOContext *s)
Definition: aviobuf.c:764
AV_LOG_TRACE
#define AV_LOG_TRACE
Extremely verbose debugging, useful for libav* development.
Definition: log.h:236
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:210
intreadwrite.h
s
#define s(width, name)
Definition: cbs_vp9.c:198
av_new_packet
int av_new_packet(AVPacket *pkt, int size)
Allocate the payload of a packet and initialize its fields with default values.
Definition: packet.c:98
OGG_NOGRANULE_VALUE
#define OGG_NOGRANULE_VALUE
Definition: oggdec.h:124
av_realloc_array
void * av_realloc_array(void *ptr, size_t nmemb, size_t size)
Definition: mem.c:217
AVInputFormat::name
const char * name
A comma separated list of short names for the format.
Definition: avformat.h:549
ogg_stream::got_data
int got_data
1 if the stream got some data (non-initial packets), 0 otherwise
Definition: oggdec.h:91
av_assert0
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:42
ogg_stream::page_end
int page_end
current packet is the last one completed in the page
Definition: oggdec.h:88
FFFormatContext::data_offset
int64_t data_offset
offset of the first packet
Definition: internal.h:89
ogg::curidx
int curidx
Definition: oggdec.h:115
ogg_stream::new_metadata
uint8_t * new_metadata
Definition: oggdec.h:96
av_mallocz
#define av_mallocz(s)
Definition: tableprint_vlc.h:31
FFFormatContext
Definition: internal.h:64
FF_INFMT_FLAG_INIT_CLEANUP
#define FF_INFMT_FLAG_INIT_CLEANUP
For an FFInputFormat with this flag set read_close() needs to be called by the caller upon read_heade...
Definition: demux.h:35
ogg_stream::page_pos
int64_t page_pos
file offset of the current page
Definition: oggdec.h:81
AVFormatContext
Format I/O context.
Definition: avformat.h:1264
ogg_stream::replace
int replace
Definition: oggdec.h:95
ogg_codec::header
int(* header)(AVFormatContext *, int)
Attempt to process a packet as a header.
Definition: oggdec.h:40
internal.h
NULL
#define NULL
Definition: coverity.c:32
ogg_replace_stream
static int ogg_replace_stream(AVFormatContext *s, uint32_t serial, char *magic, int page_size, int probing)
Replace the current stream with a new one.
Definition: oggdec.c:216
AVERROR_PATCHWELCOME
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
Definition: error.h:64
ff_ogm_old_codec
const struct ogg_codec ff_ogm_old_codec
Definition: oggparseogm.c:222
ogg_stream::flags
int flags
Definition: oggdec.h:82
AVProbeData
This structure contains the data a format has to probe a file.
Definition: avformat.h:451
ogg_read_seek
static int ogg_read_seek(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
Definition: oggdec.c:958
ogg::page_pos
int64_t page_pos
file offset of the current page
Definition: oggdec.h:116
ogg::streams
struct ogg_stream * streams
Definition: oggdec.h:112
ogg_save
static int ogg_save(AVFormatContext *s)
Definition: oggdec.c:84
ogg_get_length
static int ogg_get_length(AVFormatContext *s)
Definition: oggdec.c:654
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
avio_rl32
unsigned int avio_rl32(AVIOContext *s)
Definition: aviobuf.c:733
AVIOContext
Bytestream IO Context.
Definition: avio.h:160
NULL_IF_CONFIG_SMALL
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
Definition: internal.h:94
buf_realloc
static int buf_realloc(struct ogg_stream *os, int size)
Definition: oggdec.c:304
AVIOContext::seekable
int seekable
A combination of AVIO_SEEKABLE_ flags or 0 when the stream is not seekable.
Definition: avio.h:261
ogg_read_close
static int ogg_read_close(AVFormatContext *s)
Definition: oggdec.c:723
av_err2str
#define av_err2str(errnum)
Convenience macro, the return value should be used only directly in function arguments but never stan...
Definition: error.h:122
ogg_stream::private
void * private
Definition: oggdec.h:100
ogg_stream::keyframe_seek
int keyframe_seek
Definition: oggdec.h:89
size
int size
Definition: twinvq_data.h:10344
AV_NOPTS_VALUE
#define AV_NOPTS_VALUE
Undefined timestamp value.
Definition: avutil.h:247
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.
data_packets_seen
static int data_packets_seen(const struct ogg *ogg)
Definition: oggdec.c:294
ffio_init_checksum
void ffio_init_checksum(AVIOContext *s, unsigned long(*update_checksum)(unsigned long c, const uint8_t *p, unsigned int len), unsigned long checksum)
Definition: aviobuf.c:594
FFInputFormat::p
AVInputFormat p
The public AVInputFormat.
Definition: demux.h:70
AVPacket::dts
int64_t dts
Decompression timestamp in AVStream->time_base units; the time at which the packet is decompressed.
Definition: packet.h:587
avio_r8
int avio_r8(AVIOContext *s)
Definition: aviobuf.c:606
av_reallocp_array
int av_reallocp_array(void *ptr, size_t nmemb, size_t size)
Allocate, reallocate an array through a pointer to a pointer.
Definition: mem.c:225
ffio_ensure_seekback
int ffio_ensure_seekback(AVIOContext *s, int64_t buf_size)
Ensures that the requested seekback buffer size will be available.
Definition: aviobuf.c:1026
AVPacket::flags
int flags
A combination of AV_PKT_FLAG values.
Definition: packet.h:594
ogg::state
struct ogg_state * state
Definition: oggdec.h:117
version
version
Definition: libkvazaar.c:313
ff_crc04C11DB7_update
unsigned long ff_crc04C11DB7_update(unsigned long checksum, const uint8_t *buf, unsigned int len)
Definition: aviobuf.c:568
AV_LOG_INFO
#define AV_LOG_INFO
Standard information.
Definition: log.h:221
AV_PKT_DATA_STRINGS_METADATA
@ AV_PKT_DATA_STRINGS_METADATA
A list of zero terminated key/value strings.
Definition: packet.h:169
MAX_PAGE_SIZE
#define MAX_PAGE_SIZE
Definition: oggdec.c:41
ogg_stream::pflags
unsigned int pflags
Definition: oggdec.h:73
ogg::nstreams
int nstreams
Definition: oggdec.h:113
ogg_stream::sync_pos
int64_t sync_pos
file offset of the first page needed to reconstruct the current packet
Definition: oggdec.h:80
ogg_stream::incomplete
int incomplete
whether we're expecting a continuation in the next page
Definition: oggdec.h:87
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:256
AVPacket::pts
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
Definition: packet.h:581
ogg_stream
Definition: oggdec.h:67
avio_internal.h
AV_CODEC_ID_THEORA
@ AV_CODEC_ID_THEORA
Definition: codec_id.h:82
ff_ogm_video_codec
const struct ogg_codec ff_ogm_video_codec
Definition: oggparseogm.c:195
OGG_FLAG_CONT
#define OGG_FLAG_CONT
Definition: oggdec.h:120
ff_skeleton_codec
const struct ogg_codec ff_skeleton_codec
Definition: oggparseskeleton.c:96
FFMIN
#define FFMIN(a, b)
Definition: macros.h:49
demux.h
ogg_codecs
static const struct ogg_codec *const ogg_codecs[]
Definition: oggdec.c:44
ogg_stream::header
int header
Definition: oggdec.h:84
ogg_read_timestamp
static int64_t ogg_read_timestamp(AVFormatContext *s, int stream_index, int64_t *pos_arg, int64_t pos_limit)
Definition: oggdec.c:917
AVStream::id
int id
Format-specific stream ID.
Definition: avformat.h:756
ret
ret
Definition: filter_design.txt:187
AVStream
Stream structure.
Definition: avformat.h:744
avio_seek
int64_t avio_seek(AVIOContext *s, int64_t offset, int whence)
fseek() equivalent for AVIOContext.
Definition: aviobuf.c:236
av_malloc
void * av_malloc(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
Definition: mem.c:98
avformat.h
ogg_find_codec
static const struct ogg_codec * ogg_find_codec(uint8_t *buf, int size)
Definition: oggdec.c:199
AV_INPUT_BUFFER_PADDING_SIZE
#define AV_INPUT_BUFFER_PADDING_SIZE
Definition: defs.h:40
ogg_find_stream
static int ogg_find_stream(struct ogg *ogg, int serial)
Definition: oggdec.h:179
ogg_codec::cleanup
void(* cleanup)(AVFormatContext *s, int idx)
Definition: oggdec.h:64
oggdec.h
AVIO_SEEKABLE_NORMAL
#define AVIO_SEEKABLE_NORMAL
Seeking works like for a local file.
Definition: avio.h:41
av_packet_new_side_data
uint8_t * av_packet_new_side_data(AVPacket *pkt, enum AVPacketSideDataType type, size_t size)
Allocate new information of a packet.
Definition: packet.c:231
ogg_restore
static int ogg_restore(AVFormatContext *s)
Definition: oggdec.c:122
avio_read
int avio_read(AVIOContext *s, unsigned char *buf, int size)
Read size bytes from AVIOContext into buf.
Definition: aviobuf.c:615
ogg_stream::start_granule
uint64_t start_granule
Definition: oggdec.h:77
AV_PKT_DATA_SKIP_SAMPLES
@ AV_PKT_DATA_SKIP_SAMPLES
Recommends skipping the specified number of samples.
Definition: packet.h:153
ogg_read_packet
static int ogg_read_packet(AVFormatContext *s, AVPacket *pkt)
Definition: oggdec.c:832
Windows::Graphics::DirectX::Direct3D11::p
IDirect3DDxgiInterfaceAccess _COM_Outptr_ void ** p
Definition: vsrc_gfxcapture_winrt.hpp:53
AVPacket::stream_index
int stream_index
Definition: packet.h:590
ogg_stream::new_metadata_size
size_t new_metadata_size
Definition: oggdec.h:97
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:200
ogg_codec::nb_header
int nb_header
Number of expected headers.
Definition: oggdec.h:63
ogg_stream::segments
uint8_t segments[255]
Definition: oggdec.h:86
AVFMT_TS_DISCONT
#define AVFMT_TS_DISCONT
Format allows timestamp discontinuities.
Definition: avformat.h:480
mem.h
OGG_FLAG_EOS
#define OGG_FLAG_EOS
Definition: oggdec.h:122
ogg_state
Definition: oggdec.h:103
ogg_calc_pts
static int64_t ogg_calc_pts(AVFormatContext *s, int idx, int64_t *dts)
Definition: oggdec.c:781
av_free
#define av_free(p)
Definition: tableprint_vlc.h:34
ff_celt_codec
const struct ogg_codec ff_celt_codec
Definition: oggparsecelt.c:93
ogg_probe
static int ogg_probe(const AVProbeData *p)
Definition: oggdec.c:984
AVPacket
This structure stores compressed data.
Definition: packet.h:565
ogg_stream::new_extradata
uint8_t * new_extradata
Definition: oggdec.h:98
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:35
ogg_stream::psize
unsigned int psize
Definition: oggdec.h:72
OGG_FLAG_BOS
#define OGG_FLAG_BOS
Definition: oggdec.h:121
AVPacket::pos
int64_t pos
byte position in stream, -1 if unknown
Definition: packet.h:608
FFInputFormat
Definition: demux.h:66
avio_rl64
uint64_t avio_rl64(AVIOContext *s)
Definition: aviobuf.c:741
ogg_codec
Copyright (C) 2005 Michael Ahlberg, Måns Rullgård.
Definition: oggdec.h:30
AV_CODEC_ID_VP8
@ AV_CODEC_ID_VP8
Definition: codec_id.h:192
AVERROR_BUG
#define AVERROR_BUG
Internal bug, also see AVERROR_BUG2.
Definition: error.h:52
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
ogg_read_page
static int ogg_read_page(AVFormatContext *s, int *sid, int probing)
Definition: oggdec.c:318
AVERROR_INVALIDDATA
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:61
ogg_codec::magic
const int8_t * magic
Definition: oggdec.h:31
pkt
static AVPacket * pkt
Definition: demux_decode.c:55
ogg_stream::end_trimming
int end_trimming
set the number of packets to drop from the end
Definition: oggdec.h:94
ff_dirac_codec
const struct ogg_codec ff_dirac_codec
Definition: oggparsedirac.c:117
ff_speex_codec
const struct ogg_codec ff_speex_codec
Definition: oggparsespeex.c:144
ogg_codec::granule_is_start
int granule_is_start
1 if granule is the start time of the associated packet.
Definition: oggdec.h:59
ogg_stream::pduration
unsigned int pduration
Definition: oggdec.h:74
ff_theora_codec
const struct ogg_codec ff_theora_codec
Definition: oggparsetheora.c:211
av_realloc
void * av_realloc(void *ptr, size_t size)
Allocate, reallocate, or free a block of memory.
Definition: mem.c:155
ogg_stream::codec
const struct ogg_codec * codec
Definition: oggdec.h:83
ff_opus_codec
const struct ogg_codec ff_opus_codec
Definition: oggparseopus.c:220
ogg_stream::bufsize
unsigned int bufsize
Definition: oggdec.h:69
avio_feof
int avio_feof(AVIOContext *s)
Similar to feof() but also returns nonzero on read errors.
Definition: aviobuf.c:349