diff options
author | Baptiste Coudurier <baptiste.coudurier@gmail.com> | 2010-05-24 23:37:33 +0000 |
---|---|---|
committer | Baptiste Coudurier <baptiste.coudurier@gmail.com> | 2010-05-24 23:37:33 +0000 |
commit | ce2a9bc3c86e6e0bfa9bf058bc8157acda88aea0 (patch) | |
tree | 5c5a1cbfc0c0502eb844d658d02fc20b86c466ce | |
parent | a24039861d92cc10bf09f2c64daabf4894a6fc0b (diff) | |
download | ffmpeg-ce2a9bc3c86e6e0bfa9bf058bc8157acda88aea0.tar.gz |
In ogg muxer, use random serial number of each ogg streams
Originally committed as revision 23302 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r-- | libavformat/oggenc.c | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/libavformat/oggenc.c b/libavformat/oggenc.c index 297d90b586..c35b497496 100644 --- a/libavformat/oggenc.c +++ b/libavformat/oggenc.c @@ -20,6 +20,7 @@ */ #include "libavutil/crc.h" +#include "libavutil/random_seed.h" #include "libavcodec/xiph.h" #include "libavcodec/bytestream.h" #include "libavcodec/flac.h" @@ -50,6 +51,7 @@ typedef struct { int eos; unsigned page_count; ///< number of page buffered OGGPage page; ///< current page + unsigned serial_num; ///< serial number } OGGStreamContext; typedef struct OGGPageList { @@ -80,7 +82,7 @@ static void ogg_write_page(AVFormatContext *s, OGGPage *page, int extra_flags) put_byte(s->pb, 0); put_byte(s->pb, page->flags | extra_flags); put_le64(s->pb, page->granule); - put_le32(s->pb, page->stream_index); + put_le32(s->pb, oggstream->serial_num); put_le32(s->pb, oggstream->page_counter++); crc_offset = url_ftell(s->pb); put_le32(s->pb, 0); // crc @@ -280,8 +282,11 @@ static int ogg_write_header(AVFormatContext *s) { OGGStreamContext *oggstream; int i, j; + for (i = 0; i < s->nb_streams; i++) { AVStream *st = s->streams[i]; + unsigned serial_num = i; + if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) av_set_pts_info(st, 64, 1, st->codec->sample_rate); else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) @@ -300,6 +305,18 @@ static int ogg_write_header(AVFormatContext *s) } oggstream = av_mallocz(sizeof(*oggstream)); oggstream->page.stream_index = i; + + if (!(st->codec->flags & CODEC_FLAG_BITEXACT)) + do { + serial_num = av_get_random_seed(); + for (j = 0; j < i; j++) { + OGGStreamContext *sc = s->streams[j]->priv_data; + if (serial_num == sc->serial_num) + break; + } + } while (j < i); + oggstream->serial_num = serial_num; + st->priv_data = oggstream; if (st->codec->codec_id == CODEC_ID_FLAC) { int err = ogg_build_flac_headers(st->codec, oggstream, |