Merge commit 'eb89e1b98d3676aac1287d97c633b527c1ff4ea4' into release/1.1

* commit 'eb89e1b98d3676aac1287d97c633b527c1ff4ea4':
  oggdec: add support for Opus in Ogg demuxing

Conflicts:
	libavformat/oggparseopus.c
	libavformat/version.h

Merged-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
Michael Niedermayer
2014-05-04 22:47:41 +02:00

View File

@@ -48,6 +48,7 @@ static int opus_header(AVFormatContext *avf, int idx)
if (!priv) if (!priv)
return AVERROR(ENOMEM); return AVERROR(ENOMEM);
} }
if (os->flags & OGG_FLAG_BOS) { if (os->flags & OGG_FLAG_BOS) {
if (os->psize < OPUS_HEAD_SIZE || (AV_RL8(packet + 8) & 0xF0) != 0) if (os->psize < OPUS_HEAD_SIZE || (AV_RL8(packet + 8) & 0xF0) != 0)
return AVERROR_INVALIDDATA; return AVERROR_INVALIDDATA;
@@ -62,6 +63,7 @@ static int opus_header(AVFormatContext *avf, int idx)
extradata = av_malloc(os->psize + FF_INPUT_BUFFER_PADDING_SIZE); extradata = av_malloc(os->psize + FF_INPUT_BUFFER_PADDING_SIZE);
if (!extradata) if (!extradata)
return AVERROR(ENOMEM); return AVERROR(ENOMEM);
memcpy(extradata, packet, os->psize); memcpy(extradata, packet, os->psize);
st->codec->extradata = extradata; st->codec->extradata = extradata;
st->codec->extradata_size = os->psize; st->codec->extradata_size = os->psize;
@@ -79,6 +81,7 @@ static int opus_header(AVFormatContext *avf, int idx)
priv->need_comments--; priv->need_comments--;
return 1; return 1;
} }
return 0; return 0;
} }
@@ -93,6 +96,7 @@ static int opus_packet(AVFormatContext *avf, int idx)
if (!os->psize) if (!os->psize)
return AVERROR_INVALIDDATA; return AVERROR_INVALIDDATA;
toc = *packet; toc = *packet;
toc_config = toc >> 3; toc_config = toc >> 3;
toc_count = toc & 3; toc_count = toc & 3;
@@ -106,12 +110,14 @@ static int opus_packet(AVFormatContext *avf, int idx)
} else if (toc_count) { } else if (toc_count) {
nb_frames = 2; nb_frames = 2;
} }
os->pduration = frame_size * nb_frames; os->pduration = frame_size * nb_frames;
if (os->lastpts != AV_NOPTS_VALUE) { if (os->lastpts != AV_NOPTS_VALUE) {
if (st->start_time == AV_NOPTS_VALUE) if (st->start_time == AV_NOPTS_VALUE)
st->start_time = os->lastpts; st->start_time = os->lastpts;
priv->cur_dts = os->lastdts = os->lastpts -= priv->pre_skip; priv->cur_dts = os->lastdts = os->lastpts -= priv->pre_skip;
} }
priv->cur_dts += os->pduration; priv->cur_dts += os->pduration;
if ((os->flags & OGG_FLAG_EOS)) { if ((os->flags & OGG_FLAG_EOS)) {
int64_t skip = priv->cur_dts - os->granule + priv->pre_skip; int64_t skip = priv->cur_dts - os->granule + priv->pre_skip;
@@ -123,6 +129,7 @@ static int opus_packet(AVFormatContext *avf, int idx)
os->pduration); os->pduration);
} }
} }
return 0; return 0;
} }