* commit 'd1f05dd18375f2f8e68372edee11436927e43ba8': ogg: calculate the start position once all the headers are parsed Conflicts: libavformat/oggdec.c libavformat/oggparseskeleton.c Merged-by: Michael Niedermayer <michaelni@gmx.at>tags/n1.0
@@ -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) | |||||
} 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 { | |||||
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 { | |||||
#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) | |||||
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) | |||||
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) { | |||||
int64_t pts = ogg_gptopts(s, target_idx, start_granule, NULL); | |||||
if (pts == AV_NOPTS_VALUE) | |||||
return -1; | |||||
ogg->streams[target_idx].lastpts = | |||||
s->streams[target_idx]->start_time = pts; | |||||
if (os->start_granule != OGG_NOGRANULE_VALUE) { | |||||
av_log_missing_feature(s, "multiple fisbone for the " | |||||
"same stream\n", 0); | |||||
return 1; | |||||
} | |||||
if (target_idx >= 0 && start_granule != OGG_NOGRANULE_VALUE) { | |||||
os->start_granule = start_granule; | |||||
} | } | ||||
} | } | ||||