diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2011-04-25 02:47:47 +0200 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2011-04-25 03:49:47 +0200 |
commit | 2ebd47841f16d1d521d7dd9b5ae0b8015443b690 (patch) | |
tree | 5e32bef0eda02346d15fa212326806ab58e9103b /libavformat/oggparsecelt.c | |
parent | 9d7244c4c60d9f85f58b3770065a394c71fdce3f (diff) | |
parent | 989fb05fe344d9666db858e0577c44969625184e (diff) | |
download | ffmpeg-2ebd47841f16d1d521d7dd9b5ae0b8015443b690.tar.gz |
Merge branch 'master' into oldabi
* master: (172 commits)
Check mmap() return against correct value Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
vorbisdec: Employ proper printf format specifiers for uint_fast32_t.
Support fourcc MMJP.
Support fourcc XVIX.
Support fourcc M263.
Support fourcc auv2.
Fix indentation.
Support PARSER_FLAG_COMPLETE_FRAMES for h261 and h263 parsers.
ffplay: avoid SIGFPE exception in SDL_DisplayYUVOverlay
avi: try to synchronize the points in time of the starts of streams after seeking. Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Add flag to force demuxers to sort more strictly by dts. This enables non interleaved AVI mode for example. Players that are picky on strict interleaving can set this. Patches to only switch to non intereaved AVI mode when the index is not strictly correctly interleaved are welcome. Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
applehttp: Don't export variant_bitrate if it isn't known
crypto: Use av_freep instead of av_free
CrystalHD: Add AVOption to configure hardware downscaling.
Check for malloc failures in fraps decoder.
Use av_fast_malloc instead of av_realloc in fraps decoder.
general.texi: document libcelt decoder.
Fix some passing argument from incompatible pointer type warnings. Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
configure: Add missing libm library dependencies to .pc files.
oggdec: reindent after 8f3eebd6
...
Conflicts:
libavcodec/version.h
Merged-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavformat/oggparsecelt.c')
-rw-r--r-- | libavformat/oggparsecelt.c | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/libavformat/oggparsecelt.c b/libavformat/oggparsecelt.c new file mode 100644 index 0000000000..bbb695f438 --- /dev/null +++ b/libavformat/oggparsecelt.c @@ -0,0 +1,98 @@ +/* + * Xiph CELT / Opus parser for Ogg + * Copyright (c) 2011 Nicolas George + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include <string.h> +#include "avformat.h" +#include "oggdec.h" +#include "libavutil/intreadwrite.h" + +struct oggcelt_private { + int extra_headers_left; +}; + +static int celt_header(AVFormatContext *s, int idx) +{ + struct ogg *ogg = s->priv_data; + struct ogg_stream *os = ogg->streams + idx; + AVStream *st = s->streams[idx]; + struct oggcelt_private *priv = os->private; + uint8_t *p = os->buf + os->pstart; + + if (os->psize == 60 && + !memcmp(p, ff_celt_codec.magic, ff_celt_codec.magicsize)) { + + /* Main header */ + + uint32_t version, header_size, sample_rate, nb_channels, frame_size; + uint32_t overlap, bytes_per_packet, extra_headers; + uint8_t *extradata; + + extradata = av_malloc(2 * sizeof(uint32_t) + + FF_INPUT_BUFFER_PADDING_SIZE); + priv = av_malloc(sizeof(struct oggcelt_private)); + if (!extradata || !priv) { + av_free(extradata); + av_free(priv); + return AVERROR(ENOMEM); + } + version = AV_RL32(p + 28); + header_size = AV_RL32(p + 32); /* unused */ + sample_rate = AV_RL32(p + 36); + nb_channels = AV_RL32(p + 40); + frame_size = AV_RL32(p + 44); + overlap = AV_RL32(p + 48); + bytes_per_packet = AV_RL32(p + 52); /* unused */ + extra_headers = AV_RL32(p + 56); + st->codec->codec_type = AVMEDIA_TYPE_AUDIO; + st->codec->codec_id = CODEC_ID_CELT; + st->codec->sample_rate = sample_rate; + st->codec->channels = nb_channels; + st->codec->frame_size = frame_size; + st->codec->sample_fmt = AV_SAMPLE_FMT_S16; + av_set_pts_info(st, 64, 1, sample_rate); + priv->extra_headers_left = 1 + extra_headers; + av_free(os->private); + os->private = priv; + AV_WL32(extradata + 0, overlap); + AV_WL32(extradata + 4, version); + av_free(st->codec->extradata); + st->codec->extradata = extradata; + st->codec->extradata_size = 2 * sizeof(uint32_t); + return 1; + + } else if(priv && priv->extra_headers_left) { + + /* Extra headers (vorbiscomment) */ + + ff_vorbis_comment(s, &st->metadata, p, os->psize); + priv->extra_headers_left--; + return 1; + + } else { + return 0; + } +} + +const struct ogg_codec ff_celt_codec = { + .magic = "CELT ", + .magicsize = 8, + .header = celt_header, +}; |