aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2014-05-04 22:47:41 +0200
committerMichael Niedermayer <michaelni@gmx.at>2014-05-04 22:47:41 +0200
commit9ae26ef9c3442b9c2cfa2c0f1bc346febd9a9499 (patch)
tree32277f5f9b1d144aaf542b6d571f01a4ce2d500b
parentb9be91c03d274be5fa3fcd860ba37bb2fbeca429 (diff)
parenteb89e1b98d3676aac1287d97c633b527c1ff4ea4 (diff)
downloadffmpeg-9ae26ef9c3442b9c2cfa2c0f1bc346febd9a9499.tar.gz
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>
-rw-r--r--libavformat/oggparseopus.c51
1 files changed, 29 insertions, 22 deletions
diff --git a/libavformat/oggparseopus.c b/libavformat/oggparseopus.c
index 0e8f1ca5bb..c24a062c92 100644
--- a/libavformat/oggparseopus.c
+++ b/libavformat/oggparseopus.c
@@ -36,11 +36,11 @@ struct oggopus_private {
static int opus_header(AVFormatContext *avf, int idx)
{
- struct ogg *ogg = avf->priv_data;
- struct ogg_stream *os = &ogg->streams[idx];
- AVStream *st = avf->streams[idx];
+ struct ogg *ogg = avf->priv_data;
+ struct ogg_stream *os = &ogg->streams[idx];
+ AVStream *st = avf->streams[idx];
struct oggopus_private *priv = os->private;
- uint8_t *packet = os->buf + os->pstart;
+ uint8_t *packet = os->buf + os->pstart;
uint8_t *extradata;
if (!priv) {
@@ -48,22 +48,24 @@ static int opus_header(AVFormatContext *avf, int idx)
if (!priv)
return AVERROR(ENOMEM);
}
+
if (os->flags & OGG_FLAG_BOS) {
if (os->psize < OPUS_HEAD_SIZE || (AV_RL8(packet + 8) & 0xF0) != 0)
return AVERROR_INVALIDDATA;
- st->codec->codec_type = AVMEDIA_TYPE_AUDIO;
- st->codec->codec_id = AV_CODEC_ID_OPUS;
- st->codec->channels = AV_RL8 (packet + 9);
- priv->pre_skip = AV_RL16(packet + 10);
- /*orig_sample_rate = AV_RL32(packet + 12);*/
- /*gain = AV_RL16(packet + 16);*/
- /*channel_map = AV_RL8 (packet + 18);*/
+ st->codec->codec_type = AVMEDIA_TYPE_AUDIO;
+ st->codec->codec_id = AV_CODEC_ID_OPUS;
+ st->codec->channels = AV_RL8 (packet + 9);
+ priv->pre_skip = AV_RL16(packet + 10);
+ /*orig_sample_rate = AV_RL32(packet + 12);*/
+ /*gain = AV_RL16(packet + 16);*/
+ /*channel_map = AV_RL8 (packet + 18);*/
extradata = av_malloc(os->psize + FF_INPUT_BUFFER_PADDING_SIZE);
if (!extradata)
return AVERROR(ENOMEM);
+
memcpy(extradata, packet, os->psize);
- st->codec->extradata = extradata;
+ st->codec->extradata = extradata;
st->codec->extradata_size = os->psize;
st->codec->sample_rate = 48000;
@@ -79,21 +81,23 @@ static int opus_header(AVFormatContext *avf, int idx)
priv->need_comments--;
return 1;
}
+
return 0;
}
static int opus_packet(AVFormatContext *avf, int idx)
{
- struct ogg *ogg = avf->priv_data;
- struct ogg_stream *os = &ogg->streams[idx];
- AVStream *st = avf->streams[idx];
+ struct ogg *ogg = avf->priv_data;
+ struct ogg_stream *os = &ogg->streams[idx];
+ AVStream *st = avf->streams[idx];
struct oggopus_private *priv = os->private;
- uint8_t *packet = os->buf + os->pstart;
+ uint8_t *packet = os->buf + os->pstart;
unsigned toc, toc_config, toc_count, frame_size, nb_frames = 1;
if (!os->psize)
return AVERROR_INVALIDDATA;
- toc = *packet;
+
+ toc = *packet;
toc_config = toc >> 3;
toc_count = toc & 3;
frame_size = toc_config < 12 ? FFMAX(480, 960 * (toc_config & 3)) :
@@ -106,12 +110,14 @@ static int opus_packet(AVFormatContext *avf, int idx)
} else if (toc_count) {
nb_frames = 2;
}
+
os->pduration = frame_size * nb_frames;
if (os->lastpts != AV_NOPTS_VALUE) {
if (st->start_time == AV_NOPTS_VALUE)
st->start_time = os->lastpts;
priv->cur_dts = os->lastdts = os->lastpts -= priv->pre_skip;
}
+
priv->cur_dts += os->pduration;
if ((os->flags & OGG_FLAG_EOS)) {
int64_t skip = priv->cur_dts - os->granule + priv->pre_skip;
@@ -123,13 +129,14 @@ static int opus_packet(AVFormatContext *avf, int idx)
os->pduration);
}
}
+
return 0;
}
const struct ogg_codec ff_opus_codec = {
- .name = "Opus",
- .magic = "OpusHead",
- .magicsize = 8,
- .header = opus_header,
- .packet = opus_packet,
+ .name = "Opus",
+ .magic = "OpusHead",
+ .magicsize = 8,
+ .header = opus_header,
+ .packet = opus_packet,
};