summaryrefslogtreecommitdiff
path: root/libavformat/oggenc.c
diff options
context:
space:
mode:
authorBaptiste Coudurier <baptiste.coudurier@gmail.com>2010-05-24 23:37:33 +0000
committerBaptiste Coudurier <baptiste.coudurier@gmail.com>2010-05-24 23:37:33 +0000
commitce2a9bc3c86e6e0bfa9bf058bc8157acda88aea0 (patch)
tree5c5a1cbfc0c0502eb844d658d02fc20b86c466ce /libavformat/oggenc.c
parenta24039861d92cc10bf09f2c64daabf4894a6fc0b (diff)
In ogg muxer, use random serial number of each ogg streams
Originally committed as revision 23302 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavformat/oggenc.c')
-rw-r--r--libavformat/oggenc.c19
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,