diff options
Diffstat (limited to 'ffmpeg/libavformat/oggparsetheora.c')
| -rw-r--r-- | ffmpeg/libavformat/oggparsetheora.c | 138 |
1 files changed, 73 insertions, 65 deletions
diff --git a/ffmpeg/libavformat/oggparsetheora.c b/ffmpeg/libavformat/oggparsetheora.c index 6877d1e..59df17e 100644 --- a/ffmpeg/libavformat/oggparsetheora.c +++ b/ffmpeg/libavformat/oggparsetheora.c @@ -1,26 +1,26 @@ /** - Copyright (C) 2005 Matthieu CASTET, Alex Beregszaszi - - Permission is hereby granted, free of charge, to any person - obtaining a copy of this software and associated documentation - files (the "Software"), to deal in the Software without - restriction, including without limitation the rights to use, copy, - modify, merge, publish, distribute, sublicense, and/or sell copies - of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. -**/ + * Copyright (C) 2005 Matthieu CASTET, Alex Beregszaszi + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + **/ #include <stdlib.h> #include "libavutil/bswap.h" @@ -29,64 +29,67 @@ #include "internal.h" #include "oggdec.h" -struct theora_params { +typedef struct TheoraParams { int gpshift; int gpmask; unsigned version; -}; +} TheoraParams; -static int -theora_header (AVFormatContext * s, int idx) +static int theora_header(AVFormatContext *s, int idx) { - struct ogg *ogg = s->priv_data; + struct ogg *ogg = s->priv_data; struct ogg_stream *os = ogg->streams + idx; - AVStream *st = s->streams[idx]; - struct theora_params *thp = os->private; - int cds = st->codec->extradata_size + os->psize + 2; + AVStream *st = s->streams[idx]; + TheoraParams *thp = os->private; + int cds = st->codec->extradata_size + os->psize + 2; + int err; uint8_t *cdp; - if(!(os->buf[os->pstart] & 0x80)) + if (!(os->buf[os->pstart] & 0x80)) return 0; - if(!thp){ + if (!thp) { thp = av_mallocz(sizeof(*thp)); + if (!thp) + return AVERROR(ENOMEM); os->private = thp; } switch (os->buf[os->pstart]) { case 0x80: { GetBitContext gb; - int width, height; AVRational timebase; - init_get_bits(&gb, os->buf + os->pstart, os->psize*8); + init_get_bits(&gb, os->buf + os->pstart, os->psize * 8); - skip_bits_long(&gb, 7*8); /* 0x80"theora" */ + /* 0x80"theora" */ + skip_bits_long(&gb, 7 * 8); thp->version = get_bits_long(&gb, 24); - if (thp->version < 0x030100) - { + if (thp->version < 0x030100) { av_log(s, AV_LOG_ERROR, - "Too old or unsupported Theora (%x)\n", thp->version); - return -1; + "Too old or unsupported Theora (%x)\n", thp->version); + return AVERROR(ENOSYS); } - width = get_bits(&gb, 16) << 4; - height = get_bits(&gb, 16) << 4; - avcodec_set_dimensions(st->codec, width, height); + st->codec->width = get_bits(&gb, 16) << 4; + st->codec->height = get_bits(&gb, 16) << 4; if (thp->version >= 0x030400) skip_bits(&gb, 100); if (thp->version >= 0x030200) { - width = get_bits_long(&gb, 24); - height = get_bits_long(&gb, 24); - if ( width <= st->codec->width && width > st->codec->width-16 - && height <= st->codec->height && height > st->codec->height-16) - avcodec_set_dimensions(st->codec, width, height); + int width = get_bits_long(&gb, 24); + int height = get_bits_long(&gb, 24); + if (width <= st->codec->width && width > st->codec->width - 16 && + height <= st->codec->height && height > st->codec->height - 16) { + st->codec->width = width; + st->codec->height = height; + } skip_bits(&gb, 16); } + timebase.den = get_bits_long(&gb, 32); timebase.num = get_bits_long(&gb, 32); if (!(timebase.num > 0 && timebase.den > 0)) { @@ -105,41 +108,46 @@ theora_header (AVFormatContext * s, int idx) skip_bits(&gb, 2); thp->gpshift = get_bits(&gb, 5); - thp->gpmask = (1 << thp->gpshift) - 1; + thp->gpmask = (1 << thp->gpshift) - 1; st->codec->codec_type = AVMEDIA_TYPE_VIDEO; - st->codec->codec_id = AV_CODEC_ID_THEORA; - st->need_parsing = AVSTREAM_PARSE_HEADERS; + st->codec->codec_id = AV_CODEC_ID_THEORA; + st->need_parsing = AVSTREAM_PARSE_HEADERS; } break; case 0x81: ff_vorbis_comment(s, &st->metadata, os->buf + os->pstart + 7, os->psize - 7); case 0x82: if (!thp->version) - return -1; + return AVERROR_INVALIDDATA; break; default: av_log(s, AV_LOG_ERROR, "Unknown header type %X\n", os->buf[os->pstart]); - return -1; + return AVERROR_INVALIDDATA; + } + + if ((err = av_reallocp(&st->codec->extradata, + cds + FF_INPUT_BUFFER_PADDING_SIZE)) < 0) { + st->codec->extradata_size = 0; + return err; } + memset(st->codec->extradata + cds, 0, FF_INPUT_BUFFER_PADDING_SIZE); - st->codec->extradata = av_realloc (st->codec->extradata, - cds + FF_INPUT_BUFFER_PADDING_SIZE); - cdp = st->codec->extradata + st->codec->extradata_size; + cdp = st->codec->extradata + st->codec->extradata_size; *cdp++ = os->psize >> 8; *cdp++ = os->psize & 0xff; - memcpy (cdp, os->buf + os->pstart, os->psize); + memcpy(cdp, os->buf + os->pstart, os->psize); st->codec->extradata_size = cds; return 1; } -static uint64_t -theora_gptopts(AVFormatContext *ctx, int idx, uint64_t gp, int64_t *dts) +static uint64_t theora_gptopts(AVFormatContext *ctx, int idx, uint64_t gp, + int64_t *dts) { - struct ogg *ogg = ctx->priv_data; + struct ogg *ogg = ctx->priv_data; struct ogg_stream *os = ogg->streams + idx; - struct theora_params *thp = os->private; + TheoraParams *thp = os->private; uint64_t iframe, pframe; if (!thp) @@ -151,7 +159,7 @@ theora_gptopts(AVFormatContext *ctx, int idx, uint64_t gp, int64_t *dts) if (thp->version < 0x030201) iframe++; - if(!pframe) + if (!pframe) os->pflags |= AV_PKT_FLAG_KEY; if (dts) @@ -197,10 +205,10 @@ static int theora_packet(AVFormatContext *s, int idx) } const struct ogg_codec ff_theora_codec = { - .magic = "\200theora", + .magic = "\200theora", .magicsize = 7, - .header = theora_header, - .packet = theora_packet, - .gptopts = theora_gptopts, + .header = theora_header, + .packet = theora_packet, + .gptopts = theora_gptopts, .nb_header = 3, }; |
