2 * Ogg bitstream support
3 * Luca Barbato <lu_zero@gentoo.org>
4 * Based on tcvp implementation
8 Copyright (C) 2005 Michael Ahlberg, Måns Rullgård
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:
18 The above copyright notice and this permission notice shall be
19 included in all copies or substantial portions of the Software.
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.
32 #include "libavutil/avassert.h"
33 #include "libavutil/intreadwrite.h"
34 #include "avio_internal.h"
38 #include "vorbiscomment.h"
40 #define MAX_PAGE_SIZE 65307
41 #define DECODER_BUFFER_SIZE MAX_PAGE_SIZE
43 static const struct ogg_codec * const ogg_codecs[] = {
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);
67 static void free_stream(AVFormatContext *s, int i)
69 struct ogg *ogg = s->priv_data;
70 struct ogg_stream *stream = &ogg->streams[i];
72 av_freep(&stream->buf);
74 stream->codec->cleanup) {
75 stream->codec->cleanup(s, i);
78 av_freep(&stream->private);
79 av_freep(&stream->new_metadata);
82 //FIXME We could avoid some structure duplication
83 static int ogg_save(AVFormatContext *s)
85 struct ogg *ogg = s->priv_data;
86 struct ogg_state *ost =
87 av_malloc(sizeof(*ost) + (ogg->nstreams - 1) * sizeof(*ogg->streams));
92 return AVERROR(ENOMEM);
94 ost->pos = avio_tell(s->pb);
95 ost->curidx = ogg->curidx;
96 ost->next = ogg->state;
97 ost->nstreams = ogg->nstreams;
98 memcpy(ost->streams, ogg->streams, ogg->nstreams * sizeof(*ogg->streams));
100 for (i = 0; i < ogg->nstreams; i++) {
101 struct ogg_stream *os = ogg->streams + i;
102 os->buf = av_mallocz(os->bufsize + AV_INPUT_BUFFER_PADDING_SIZE);
104 memcpy(os->buf, ost->streams[i].buf, os->bufpos);
106 ret = AVERROR(ENOMEM);
107 os->new_metadata = NULL;
108 os->new_metadata_size = 0;
119 static int ogg_restore(AVFormatContext *s)
121 struct ogg *ogg = s->priv_data;
122 AVIOContext *bc = s->pb;
123 struct ogg_state *ost = ogg->state;
129 ogg->state = ost->next;
131 for (i = 0; i < ogg->nstreams; i++) {
132 struct ogg_stream *stream = &ogg->streams[i];
133 av_freep(&stream->buf);
134 av_freep(&stream->new_metadata);
136 if (i >= ost->nstreams || !ost->streams[i].private) {
141 avio_seek(bc, ost->pos, SEEK_SET);
143 ogg->curidx = ost->curidx;
144 ogg->nstreams = ost->nstreams;
145 if ((err = av_reallocp_array(&ogg->streams, ogg->nstreams,
146 sizeof(*ogg->streams))) < 0) {
150 memcpy(ogg->streams, ost->streams,
151 ost->nstreams * sizeof(*ogg->streams));
158 static int ogg_reset(AVFormatContext *s)
160 struct ogg *ogg = s->priv_data;
162 int64_t start_pos = avio_tell(s->pb);
164 for (i = 0; i < ogg->nstreams; i++) {
165 struct ogg_stream *os = ogg->streams + i;
170 os->lastpts = AV_NOPTS_VALUE;
171 os->lastdts = AV_NOPTS_VALUE;
178 if (start_pos <= s->internal->data_offset) {
181 os->start_trimming = 0;
182 os->end_trimming = 0;
183 av_freep(&os->new_metadata);
184 os->new_metadata_size = 0;
193 static const struct ogg_codec *ogg_find_codec(uint8_t *buf, int size)
197 for (i = 0; ogg_codecs[i]; i++)
198 if (size >= ogg_codecs[i]->magicsize &&
199 !memcmp(buf, ogg_codecs[i]->magic, ogg_codecs[i]->magicsize))
200 return ogg_codecs[i];
206 * Replace the current stream with a new one. This is a typical webradio
207 * situation where a new audio stream spawn (identified with a new serial) and
208 * must replace the previous one (track switch).
210 static int ogg_replace_stream(AVFormatContext *s, uint32_t serial, char *magic,
213 struct ogg *ogg = s->priv_data;
214 struct ogg_stream *os;
215 const struct ogg_codec *codec;
218 if (ogg->nstreams != 1) {
219 avpriv_report_missing_feature(s, "Changing stream parameters in multistream ogg");
220 return AVERROR_PATCHWELCOME;
223 /* Check for codecs */
224 codec = ogg_find_codec(magic, 8);
225 if (!codec && !probing) {
226 av_log(s, AV_LOG_ERROR, "Cannot identify new stream\n");
227 return AVERROR_INVALIDDATA;
230 /* We only have a single stream anyway, so if there's a new stream with
231 * a different codec just replace it */
232 os = &ogg->streams[0];
238 os->start_trimming = 0;
239 os->end_trimming = 0;
241 /* Chained files have extradata as a new packet */
242 if (codec == &ff_opus_codec)
248 static int ogg_new_stream(AVFormatContext *s, uint32_t serial)
250 struct ogg *ogg = s->priv_data;
251 int idx = ogg->nstreams;
253 struct ogg_stream *os;
257 av_log(s, AV_LOG_ERROR, "New streams are not supposed to be added "
258 "in between Ogg context save/restore operations.\n");
262 /* Allocate and init a new Ogg Stream */
263 if (av_size_mult(ogg->nstreams + 1, sizeof(*ogg->streams), &size) < 0 ||
264 !(os = av_realloc(ogg->streams, size)))
265 return AVERROR(ENOMEM);
267 os = ogg->streams + idx;
268 memset(os, 0, sizeof(*os));
270 os->bufsize = DECODER_BUFFER_SIZE;
271 os->buf = av_malloc(os->bufsize + AV_INPUT_BUFFER_PADDING_SIZE);
273 os->start_granule = OGG_NOGRANULE_VALUE;
275 return AVERROR(ENOMEM);
277 /* Create the associated AVStream */
278 st = avformat_new_stream(s, NULL);
281 return AVERROR(ENOMEM);
284 avpriv_set_pts_info(st, 64, 1, 1000000);
290 static int data_packets_seen(const struct ogg *ogg)
294 for (i = 0; i < ogg->nstreams; i++)
295 if (ogg->streams[i].got_data)
300 static int ogg_read_page(AVFormatContext *s, int *sid, int probing)
302 AVIOContext *bc = s->pb;
303 struct ogg *ogg = s->priv_data;
304 struct ogg_stream *os;
309 uint32_t crc, crc_tmp;
311 int64_t version, page_pos;
314 uint8_t segments[255];
315 uint8_t *readout_buf;
318 ret = avio_read(bc, sync, 4);
320 return ret < 0 ? ret : AVERROR_EOF;
325 if (sync[sp & 3] == 'O' &&
326 sync[(sp + 1) & 3] == 'g' &&
327 sync[(sp + 2) & 3] == 'g' && sync[(sp + 3) & 3] == 'S')
330 if(!i && (bc->seekable & AVIO_SEEKABLE_NORMAL) && ogg->page_pos > 0) {
332 avio_seek(bc, ogg->page_pos+4, SEEK_SET);
342 } while (i++ < MAX_PAGE_SIZE);
344 if (i >= MAX_PAGE_SIZE) {
345 av_log(s, AV_LOG_INFO, "cannot find sync word\n");
346 return AVERROR_INVALIDDATA;
349 /* 0x4fa9b05f = av_crc(AV_CRC_32_IEEE, 0x0, "OggS", 4) */
350 ffio_init_checksum(bc, ff_crc04C11DB7_update, 0x4fa9b05f);
352 /* To rewind if checksum is bad/check magic on switches - this is the max packet size */
353 ffio_ensure_seekback(bc, MAX_PAGE_SIZE);
354 start_pos = avio_tell(bc);
356 version = avio_r8(bc);
359 serial = avio_rl32(bc);
360 avio_skip(bc, 4); /* seq */
362 crc_tmp = ffio_get_checksum(bc);
364 crc_tmp = ff_crc04C11DB7_update(crc_tmp, (uint8_t[4]){0}, 4);
365 ffio_init_checksum(bc, ff_crc04C11DB7_update, crc_tmp);
368 page_pos = avio_tell(bc) - 27;
370 ret = avio_read(bc, segments, nsegs);
372 return ret < 0 ? ret : AVERROR_EOF;
374 for (i = 0; i < nsegs; i++)
377 idx = ogg_find_stream(ogg, serial);
379 os = ogg->streams + idx;
381 /* Even if invalid guarantee there's enough memory to read the page */
382 if (os->bufsize - os->bufpos < size) {
383 uint8_t *nb = av_realloc(os->buf, 2*os->bufsize + AV_INPUT_BUFFER_PADDING_SIZE);
385 return AVERROR(ENOMEM);
390 readout_buf = os->buf + os->bufpos;
392 readout_buf = av_malloc(size);
395 ret = avio_read(bc, readout_buf, size);
398 av_free(readout_buf);
399 return ret < 0 ? ret : AVERROR_EOF;
402 if (crc ^ ffio_get_checksum(bc)) {
403 av_log(s, AV_LOG_ERROR, "CRC mismatch!\n");
405 av_free(readout_buf);
406 avio_seek(bc, start_pos, SEEK_SET);
410 /* Since we're almost sure its a valid packet, checking the version after
411 * the checksum lets the demuxer be more tolerant */
413 av_log(s, AV_LOG_ERROR, "Invalid Ogg vers!\n");
415 av_free(readout_buf);
416 avio_seek(bc, start_pos, SEEK_SET);
420 /* CRC is correct so we can be 99% sure there's an actual change here */
422 if (data_packets_seen(ogg))
423 idx = ogg_replace_stream(s, serial, readout_buf, probing);
425 idx = ogg_new_stream(s, serial);
428 av_log(s, AV_LOG_ERROR, "failed to create or replace stream\n");
429 av_free(readout_buf);
433 os = ogg->streams + idx;
435 memcpy(os->buf + os->bufpos, readout_buf, size);
436 av_free(readout_buf);
439 ogg->page_pos = page_pos;
440 os->page_pos = page_pos;
443 os->got_data = !(flags & OGG_FLAG_BOS);
447 memcpy(os->segments, segments, nsegs);
448 memset(os->buf + os->bufpos, 0, AV_INPUT_BUFFER_PADDING_SIZE);
450 if (flags & OGG_FLAG_CONT || os->incomplete) {
452 // If this is the very first segment we started
453 // playback in the middle of a continuation packet.
454 // Discard it since we missed the start of it.
455 while (os->segp < os->nsegs) {
456 int seg = os->segments[os->segp++];
461 os->sync_pos = os->page_pos;
465 os->sync_pos = os->page_pos;
468 /* This function is always called with sid != NULL */
475 * @brief find the next Ogg packet
476 * @param *sid is set to the stream for the packet or -1 if there is
477 * no matching stream, in that case assume all other return
478 * values to be uninitialized.
479 * @return negative value on error or EOF.
481 static int ogg_packet(AVFormatContext *s, int *sid, int *dstart, int *dsize,
484 struct ogg *ogg = s->priv_data;
486 struct ogg_stream *os;
488 int segp = 0, psize = 0;
490 av_log(s, AV_LOG_TRACE, "ogg_packet: curidx=%i\n", ogg->curidx);
498 ret = ogg_read_page(s, &idx, 0);
503 os = ogg->streams + idx;
505 av_log(s, AV_LOG_TRACE, "ogg_packet: idx=%d pstart=%d psize=%d segp=%d nsegs=%d\n",
506 idx, os->pstart, os->psize, os->segp, os->nsegs);
509 if (os->header < 0) {
510 os->codec = ogg_find_codec(os->buf, os->bufpos);
512 av_log(s, AV_LOG_WARNING, "Codec not found\n");
524 while (os->segp < os->nsegs) {
525 int ss = os->segments[os->segp++];
533 if (!complete && os->segp == os->nsegs) {
535 // Do not set incomplete for empty packets.
536 // Together with the code in ogg_read_page
537 // that discards all continuation of empty packets
538 // we would get an infinite loop.
539 os->incomplete = !!os->psize;
544 if (os->granule == -1)
545 av_log(s, AV_LOG_WARNING,
546 "Page at %"PRId64" is missing granule\n",
553 if ((ret = os->codec->header(s, idx)) < 0) {
554 av_log(s, AV_LOG_ERROR, "Header processing failed: %s\n", av_err2str(ret));
562 // We have reached the first non-header packet in this stream.
563 // Unfortunately more header packets may still follow for others,
564 // but if we continue with header parsing we may lose data packets.
567 // Update the header state for all streams and
568 // compute the data_offset.
569 if (!s->internal->data_offset)
570 s->internal->data_offset = os->sync_pos;
572 for (i = 0; i < ogg->nstreams; i++) {
573 struct ogg_stream *cur_os = ogg->streams + i;
575 // if we have a partial non-header packet, its start is
576 // obviously at or after the data start
577 if (cur_os->incomplete)
578 s->internal->data_offset = FFMIN(s->internal->data_offset, cur_os->sync_pos);
582 os->pstart += os->psize;
588 if (os->codec && os->codec->packet) {
589 if ((ret = os->codec->packet(s, idx)) < 0) {
590 av_log(s, AV_LOG_ERROR, "Packet processing failed: %s\n", av_err2str(ret));
597 *dstart = os->pstart;
601 *fpos = os->sync_pos;
602 os->pstart += os->psize;
604 if(os->pstart == os->bufpos)
605 os->bufpos = os->pstart = 0;
606 os->sync_pos = os->page_pos;
609 // determine whether there are more complete packets in this page
610 // if not, the page's granule will apply to this packet
612 for (i = os->segp; i < os->nsegs; i++)
613 if (os->segments[i] < 255) {
618 if (os->segp == os->nsegs)
624 static int ogg_get_length(AVFormatContext *s)
626 struct ogg *ogg = s->priv_data;
631 if (!(s->pb->seekable & AVIO_SEEKABLE_NORMAL))
635 if (s->duration != AV_NOPTS_VALUE)
638 size = avio_size(s->pb);
641 end = size > MAX_PAGE_SIZE ? size - MAX_PAGE_SIZE : 0;
646 avio_seek(s->pb, end, SEEK_SET);
649 while (!ogg_read_page(s, &i, 1)) {
650 if (ogg->streams[i].granule != -1 && ogg->streams[i].granule != 0 &&
651 ogg->streams[i].codec) {
652 s->streams[i]->duration =
653 ogg_gptopts(s, i, ogg->streams[i].granule, NULL);
654 if (s->streams[i]->start_time != AV_NOPTS_VALUE) {
655 s->streams[i]->duration -= s->streams[i]->start_time;
656 streams_left-= (ogg->streams[i].got_start==-1);
657 ogg->streams[i].got_start= 1;
658 } else if(!ogg->streams[i].got_start) {
659 ogg->streams[i].got_start= -1;
671 avio_seek (s->pb, s->internal->data_offset, SEEK_SET);
673 while (streams_left > 0 && !ogg_packet(s, &i, NULL, NULL, NULL)) {
676 pts = ogg_calc_pts(s, i, NULL);
677 if (s->streams[i]->duration == AV_NOPTS_VALUE)
679 if (pts != AV_NOPTS_VALUE && s->streams[i]->start_time == AV_NOPTS_VALUE && !ogg->streams[i].got_start) {
680 s->streams[i]->duration -= pts;
681 ogg->streams[i].got_start= 1;
683 }else if(s->streams[i]->start_time != AV_NOPTS_VALUE && !ogg->streams[i].got_start) {
684 ogg->streams[i].got_start= 1;
693 static int ogg_read_close(AVFormatContext *s)
695 struct ogg *ogg = s->priv_data;
698 for (i = 0; i < ogg->nstreams; i++) {
704 av_freep(&ogg->streams);
708 static int ogg_read_header(AVFormatContext *s)
710 struct ogg *ogg = s->priv_data;
715 //linear headers seek from start
717 ret = ogg_packet(s, NULL, NULL, NULL, NULL);
722 } while (!ogg->headers);
723 av_log(s, AV_LOG_TRACE, "found headers\n");
725 for (i = 0; i < ogg->nstreams; i++) {
726 struct ogg_stream *os = ogg->streams + i;
728 if (ogg->streams[i].header < 0) {
729 av_log(s, AV_LOG_ERROR, "Header parsing failed for stream %d\n", i);
730 ogg->streams[i].codec = NULL;
731 av_freep(&ogg->streams[i].private);
732 } else if (os->codec && os->nb_header < os->codec->nb_header) {
733 av_log(s, AV_LOG_WARNING,
734 "Headers mismatch for stream %d: "
735 "expected %d received %d.\n",
736 i, os->codec->nb_header, os->nb_header);
737 if (s->error_recognition & AV_EF_EXPLODE) {
739 return AVERROR_INVALIDDATA;
742 if (os->start_granule != OGG_NOGRANULE_VALUE)
743 os->lastpts = s->streams[i]->start_time =
744 ogg_gptopts(s, i, os->start_granule, NULL);
747 //linear granulepos seek from end
748 ret = ogg_get_length(s);
757 static int64_t ogg_calc_pts(AVFormatContext *s, int idx, int64_t *dts)
759 struct ogg *ogg = s->priv_data;
760 struct ogg_stream *os = ogg->streams + idx;
761 int64_t pts = AV_NOPTS_VALUE;
764 *dts = AV_NOPTS_VALUE;
766 if (os->lastpts != AV_NOPTS_VALUE) {
768 os->lastpts = AV_NOPTS_VALUE;
770 if (os->lastdts != AV_NOPTS_VALUE) {
773 os->lastdts = AV_NOPTS_VALUE;
776 if (os->granule != -1LL) {
777 if (os->codec && os->codec->granule_is_start)
778 pts = ogg_gptopts(s, idx, os->granule, dts);
780 os->lastpts = ogg_gptopts(s, idx, os->granule, &os->lastdts);
787 static void ogg_validate_keyframe(AVFormatContext *s, int idx, int pstart, int psize)
789 struct ogg *ogg = s->priv_data;
790 struct ogg_stream *os = ogg->streams + idx;
793 switch (s->streams[idx]->codecpar->codec_id) {
794 case AV_CODEC_ID_THEORA:
795 invalid = !!(os->pflags & AV_PKT_FLAG_KEY) != !(os->buf[pstart] & 0x40);
797 case AV_CODEC_ID_VP8:
798 invalid = !!(os->pflags & AV_PKT_FLAG_KEY) != !(os->buf[pstart] & 1);
801 os->pflags ^= AV_PKT_FLAG_KEY;
802 av_log(s, AV_LOG_WARNING, "Broken file, %skeyframe not correctly marked.\n",
803 (os->pflags & AV_PKT_FLAG_KEY) ? "" : "non-");
808 static int ogg_read_packet(AVFormatContext *s, AVPacket *pkt)
811 struct ogg_stream *os;
814 int64_t fpos, pts, dts;
816 if (s->io_repositioned) {
818 s->io_repositioned = 0;
824 ret = ogg_packet(s, &idx, &pstart, &psize, &fpos);
827 } while (idx < 0 || !s->streams[idx]);
830 os = ogg->streams + idx;
832 // pflags might not be set until after this
833 pts = ogg_calc_pts(s, idx, &dts);
834 ogg_validate_keyframe(s, idx, pstart, psize);
836 if (os->keyframe_seek && !(os->pflags & AV_PKT_FLAG_KEY))
838 os->keyframe_seek = 0;
841 ret = av_new_packet(pkt, psize);
844 pkt->stream_index = idx;
845 memcpy(pkt->data, os->buf + pstart, psize);
849 pkt->flags = os->pflags;
850 pkt->duration = os->pduration;
853 if (os->start_trimming || os->end_trimming) {
854 uint8_t *side_data = av_packet_new_side_data(pkt,
855 AV_PKT_DATA_SKIP_SAMPLES,
858 return AVERROR(ENOMEM);
859 AV_WL32(side_data + 0, os->start_trimming);
860 AV_WL32(side_data + 4, os->end_trimming);
861 os->start_trimming = 0;
862 os->end_trimming = 0;
865 if (os->new_metadata) {
866 uint8_t *side_data = av_packet_new_side_data(pkt,
867 AV_PKT_DATA_METADATA_UPDATE,
868 os->new_metadata_size);
870 return AVERROR(ENOMEM);
872 memcpy(side_data, os->new_metadata, os->new_metadata_size);
873 av_freep(&os->new_metadata);
874 os->new_metadata_size = 0;
880 static int64_t ogg_read_timestamp(AVFormatContext *s, int stream_index,
881 int64_t *pos_arg, int64_t pos_limit)
883 struct ogg *ogg = s->priv_data;
884 AVIOContext *bc = s->pb;
885 int64_t pts = AV_NOPTS_VALUE;
889 avio_seek(bc, *pos_arg, SEEK_SET);
892 while ( avio_tell(bc) <= pos_limit
893 && !ogg_packet(s, &i, &pstart, &psize, pos_arg)) {
894 if (i == stream_index) {
895 struct ogg_stream *os = ogg->streams + stream_index;
896 // Do not trust the last timestamps of an ogm video
897 if ( (os->flags & OGG_FLAG_EOS)
898 && !(os->flags & OGG_FLAG_BOS)
899 && os->codec == &ff_ogm_video_codec)
901 pts = ogg_calc_pts(s, i, NULL);
902 ogg_validate_keyframe(s, i, pstart, psize);
903 if (os->pflags & AV_PKT_FLAG_KEY) {
905 } else if (os->keyframe_seek) {
906 // if we had a previous keyframe but no pts for it,
907 // return that keyframe with this pts value.
911 pts = AV_NOPTS_VALUE;
914 if (pts != AV_NOPTS_VALUE)
921 static int ogg_read_seek(AVFormatContext *s, int stream_index,
922 int64_t timestamp, int flags)
924 struct ogg *ogg = s->priv_data;
925 struct ogg_stream *os = ogg->streams + stream_index;
928 av_assert0(stream_index < ogg->nstreams);
929 // Ensure everything is reset even when seeking via
930 // the generated index.
933 // Try seeking to a keyframe first. If this fails (very possible),
934 // av_seek_frame will fall back to ignoring keyframes
935 if (s->streams[stream_index]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO
936 && !(flags & AVSEEK_FLAG_ANY))
937 os->keyframe_seek = 1;
939 ret = ff_seek_frame_binary(s, stream_index, timestamp, flags);
941 os = ogg->streams + stream_index;
943 os->keyframe_seek = 0;
947 static int ogg_probe(const AVProbeData *p)
949 if (!memcmp("OggS", p->buf, 5) && p->buf[5] <= 0x7)
950 return AVPROBE_SCORE_MAX;
954 AVInputFormat ff_ogg_demuxer = {
956 .long_name = NULL_IF_CONFIG_SMALL("Ogg"),
957 .priv_data_size = sizeof(struct ogg),
958 .read_probe = ogg_probe,
959 .read_header = ogg_read_header,
960 .read_packet = ogg_read_packet,
961 .read_close = ogg_read_close,
962 .read_seek = ogg_read_seek,
963 .read_timestamp = ogg_read_timestamp,
965 .flags = AVFMT_GENERIC_INDEX | AVFMT_TS_DISCONT | AVFMT_NOBINSEARCH,