Commit 0842e32f authored by Michael Niedermayer's avatar Michael Niedermayer

Merge commit 'd1f05dd1'

* commit 'd1f05dd1':
  ogg: calculate the start position once all the headers are parsed

Conflicts:
	libavformat/oggdec.c
	libavformat/oggparseskeleton.c
Merged-by: 's avatarMichael Niedermayer <michaelni@gmx.at>
parents 4c273eb6 d1f05dd1
...@@ -223,6 +223,7 @@ static int ogg_new_stream(AVFormatContext *s, uint32_t serial) ...@@ -223,6 +223,7 @@ static int ogg_new_stream(AVFormatContext *s, uint32_t serial)
os->bufsize = DECODER_BUFFER_SIZE; os->bufsize = DECODER_BUFFER_SIZE;
os->buf = av_malloc(os->bufsize + FF_INPUT_BUFFER_PADDING_SIZE); os->buf = av_malloc(os->bufsize + FF_INPUT_BUFFER_PADDING_SIZE);
os->header = -1; os->header = -1;
os->start_granule = OGG_NOGRANULE_VALUE;
if (!os->buf) if (!os->buf)
return AVERROR(ENOMEM); return AVERROR(ENOMEM);
...@@ -609,6 +610,9 @@ static int ogg_read_header(AVFormatContext *s) ...@@ -609,6 +610,9 @@ static int ogg_read_header(AVFormatContext *s)
} else if (os->codec && os->nb_header < os->codec->nb_header) { } else if (os->codec && os->nb_header < os->codec->nb_header) {
av_log(s, AV_LOG_WARNING, "Number of headers (%d) mismatch for stream %d\n", os->nb_header, i); av_log(s, AV_LOG_WARNING, "Number of headers (%d) mismatch for stream %d\n", os->nb_header, i);
} }
if (os->start_granule != OGG_NOGRANULE_VALUE)
os->lastpts = s->streams[i]->start_time =
ogg_gptopts(s, i, os->start_granule, NULL);
} }
//linear granulepos seek from end //linear granulepos seek from end
......
...@@ -67,6 +67,7 @@ struct ogg_stream { ...@@ -67,6 +67,7 @@ struct ogg_stream {
unsigned int pduration; unsigned int pduration;
uint32_t serial; uint32_t serial;
uint64_t granule; uint64_t granule;
uint64_t start_granule;
int64_t lastpts; int64_t lastpts;
int64_t lastdts; int64_t lastdts;
int64_t sync_pos; ///< file offset of the first page needed to reconstruct the current packet int64_t sync_pos; ///< file offset of the first page needed to reconstruct the current packet
...@@ -105,6 +106,8 @@ struct ogg { ...@@ -105,6 +106,8 @@ struct ogg {
#define OGG_FLAG_BOS 2 #define OGG_FLAG_BOS 2
#define OGG_FLAG_EOS 4 #define OGG_FLAG_EOS 4
#define OGG_NOGRANULE_VALUE -1ull
extern const struct ogg_codec ff_celt_codec; extern const struct ogg_codec ff_celt_codec;
extern const struct ogg_codec ff_dirac_codec; extern const struct ogg_codec ff_dirac_codec;
extern const struct ogg_codec ff_flac_codec; extern const struct ogg_codec ff_flac_codec;
......
...@@ -30,7 +30,8 @@ static int skeleton_header(AVFormatContext *s, int idx) ...@@ -30,7 +30,8 @@ static int skeleton_header(AVFormatContext *s, int idx)
AVStream *st = s->streams[idx]; AVStream *st = s->streams[idx];
uint8_t *buf = os->buf + os->pstart; uint8_t *buf = os->buf + os->pstart;
int version_major, version_minor; int version_major, version_minor;
int64_t start_num, start_den, start_granule; int64_t start_num, start_den;
uint64_t start_granule;
int target_idx, start_time; int target_idx, start_time;
strcpy(st->codec->codec_name, "skeleton"); strcpy(st->codec->codec_name, "skeleton");
...@@ -73,12 +74,13 @@ static int skeleton_header(AVFormatContext *s, int idx) ...@@ -73,12 +74,13 @@ static int skeleton_header(AVFormatContext *s, int idx)
target_idx = ogg_find_stream(ogg, AV_RL32(buf+12)); target_idx = ogg_find_stream(ogg, AV_RL32(buf+12));
start_granule = AV_RL64(buf+36); start_granule = AV_RL64(buf+36);
if (target_idx >= 0 && start_granule != -1) { if (os->start_granule != OGG_NOGRANULE_VALUE) {
int64_t pts = ogg_gptopts(s, target_idx, start_granule, NULL); av_log_missing_feature(s, "multiple fisbone for the "
if (pts == AV_NOPTS_VALUE) "same stream\n", 0);
return -1; return 1;
ogg->streams[target_idx].lastpts = }
s->streams[target_idx]->start_time = pts; if (target_idx >= 0 && start_granule != OGG_NOGRANULE_VALUE) {
os->start_granule = start_granule;
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment