Mercurial > libavformat.hg
annotate oggparsetheora.c @ 1116:22a86dfd052d libavformat
Fix typo
| author | lucabe |
|---|---|
| date | Thu, 15 Jun 2006 07:36:57 +0000 |
| parents | 91677ac6fb19 |
| children | 1516dadb3bc1 |
| rev | line source |
|---|---|
| 755 | 1 /** |
|
970
2266681a4a52
support correct ptses on other than version 3.2.0 aswell
alex
parents:
887
diff
changeset
|
2 Copyright (C) 2005 Matthieu CASTET, Alex Beregszaszi |
| 755 | 3 |
| 4 Permission is hereby granted, free of charge, to any person | |
| 5 obtaining a copy of this software and associated documentation | |
| 6 files (the "Software"), to deal in the Software without | |
| 7 restriction, including without limitation the rights to use, copy, | |
| 8 modify, merge, publish, distribute, sublicense, and/or sell copies | |
| 9 of the Software, and to permit persons to whom the Software is | |
| 10 furnished to do so, subject to the following conditions: | |
| 11 | |
| 12 The above copyright notice and this permission notice shall be | |
| 13 included in all copies or substantial portions of the Software. | |
| 14 | |
| 15 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | |
| 16 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | |
| 17 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | |
| 18 NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT | |
| 19 HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, | |
| 20 WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |
| 21 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | |
| 22 DEALINGS IN THE SOFTWARE. | |
| 23 **/ | |
| 24 | |
| 25 #include <stdlib.h> | |
| 26 #include "avformat.h" | |
| 27 #include "bitstream.h" | |
| 28 #include "bswap.h" | |
| 29 #include "ogg2.h" | |
| 30 | |
| 31 typedef struct theora_params { | |
| 32 int gpshift; | |
| 33 int gpmask; | |
| 34 } theora_params_t; | |
| 35 | |
| 36 static int | |
| 37 theora_header (AVFormatContext * s, int idx) | |
| 38 { | |
| 39 ogg_t *ogg = s->priv_data; | |
| 40 ogg_stream_t *os = ogg->streams + idx; | |
| 41 AVStream *st = s->streams[idx]; | |
| 42 theora_params_t *thp = os->private; | |
|
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
758
diff
changeset
|
43 int cds = st->codec->extradata_size + os->psize + 2; |
| 755 | 44 uint8_t *cdp; |
| 45 | |
| 758 | 46 if(!(os->buf[os->pstart] & 0x80)) |
| 755 | 47 return 0; |
| 48 | |
| 49 if(!thp){ | |
| 887 | 50 thp = av_mallocz(sizeof(*thp)); |
| 51 os->private = thp; | |
| 755 | 52 } |
| 53 | |
| 54 if (os->buf[os->pstart] == 0x80) { | |
| 55 GetBitContext gb; | |
|
970
2266681a4a52
support correct ptses on other than version 3.2.0 aswell
alex
parents:
887
diff
changeset
|
56 int version; |
|
2266681a4a52
support correct ptses on other than version 3.2.0 aswell
alex
parents:
887
diff
changeset
|
57 |
| 755 | 58 init_get_bits(&gb, os->buf + os->pstart, os->psize*8); |
| 59 | |
| 60 skip_bits(&gb, 7*8); /* 0x80"theora" */ | |
|
970
2266681a4a52
support correct ptses on other than version 3.2.0 aswell
alex
parents:
887
diff
changeset
|
61 |
|
2266681a4a52
support correct ptses on other than version 3.2.0 aswell
alex
parents:
887
diff
changeset
|
62 version = get_bits(&gb, 8) << 16; |
|
2266681a4a52
support correct ptses on other than version 3.2.0 aswell
alex
parents:
887
diff
changeset
|
63 version |= get_bits(&gb, 8) << 8; |
|
2266681a4a52
support correct ptses on other than version 3.2.0 aswell
alex
parents:
887
diff
changeset
|
64 version |= get_bits(&gb, 8); |
|
2266681a4a52
support correct ptses on other than version 3.2.0 aswell
alex
parents:
887
diff
changeset
|
65 |
|
2266681a4a52
support correct ptses on other than version 3.2.0 aswell
alex
parents:
887
diff
changeset
|
66 if (version < 0x030100) |
|
2266681a4a52
support correct ptses on other than version 3.2.0 aswell
alex
parents:
887
diff
changeset
|
67 { |
|
2266681a4a52
support correct ptses on other than version 3.2.0 aswell
alex
parents:
887
diff
changeset
|
68 av_log(s, AV_LOG_ERROR, |
|
2266681a4a52
support correct ptses on other than version 3.2.0 aswell
alex
parents:
887
diff
changeset
|
69 "Too old or unsupported Theora (%x)\n", version); |
| 758 | 70 return -1; |
|
970
2266681a4a52
support correct ptses on other than version 3.2.0 aswell
alex
parents:
887
diff
changeset
|
71 } |
| 758 | 72 |
|
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
758
diff
changeset
|
73 st->codec->width = get_bits(&gb, 16) << 4; |
|
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
758
diff
changeset
|
74 st->codec->height = get_bits(&gb, 16) << 4; |
| 755 | 75 |
|
970
2266681a4a52
support correct ptses on other than version 3.2.0 aswell
alex
parents:
887
diff
changeset
|
76 if (version >= 0x030400) |
|
2266681a4a52
support correct ptses on other than version 3.2.0 aswell
alex
parents:
887
diff
changeset
|
77 skip_bits(&gb, 164); |
|
2266681a4a52
support correct ptses on other than version 3.2.0 aswell
alex
parents:
887
diff
changeset
|
78 else |
|
2266681a4a52
support correct ptses on other than version 3.2.0 aswell
alex
parents:
887
diff
changeset
|
79 skip_bits(&gb, 64); |
|
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
758
diff
changeset
|
80 st->codec->time_base.den = get_bits(&gb, 32); |
|
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
758
diff
changeset
|
81 st->codec->time_base.num = get_bits(&gb, 32); |
| 1077 | 82 st->time_base = st->codec->time_base; |
| 885 | 83 |
|
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
758
diff
changeset
|
84 st->codec->sample_aspect_ratio.num = get_bits(&gb, 24); |
|
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
758
diff
changeset
|
85 st->codec->sample_aspect_ratio.den = get_bits(&gb, 24); |
| 755 | 86 |
|
970
2266681a4a52
support correct ptses on other than version 3.2.0 aswell
alex
parents:
887
diff
changeset
|
87 if (version >= 0x030200) |
|
2266681a4a52
support correct ptses on other than version 3.2.0 aswell
alex
parents:
887
diff
changeset
|
88 skip_bits(&gb, 38); |
|
2266681a4a52
support correct ptses on other than version 3.2.0 aswell
alex
parents:
887
diff
changeset
|
89 if (version >= 0x304000) |
|
2266681a4a52
support correct ptses on other than version 3.2.0 aswell
alex
parents:
887
diff
changeset
|
90 skip_bits(&gb, 2); |
|
2266681a4a52
support correct ptses on other than version 3.2.0 aswell
alex
parents:
887
diff
changeset
|
91 |
| 755 | 92 thp->gpshift = get_bits(&gb, 5); |
| 887 | 93 thp->gpmask = (1 << thp->gpshift) - 1; |
| 755 | 94 |
|
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
758
diff
changeset
|
95 st->codec->codec_type = CODEC_TYPE_VIDEO; |
|
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
758
diff
changeset
|
96 st->codec->codec_id = CODEC_ID_THEORA; |
| 755 | 97 |
| 98 } else if (os->buf[os->pstart] == 0x83) { | |
| 99 vorbis_comment (s, os->buf + os->pstart + 7, os->psize - 8); | |
| 100 } | |
| 101 | |
|
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
758
diff
changeset
|
102 st->codec->extradata = av_realloc (st->codec->extradata, cds); |
|
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
758
diff
changeset
|
103 cdp = st->codec->extradata + st->codec->extradata_size; |
| 755 | 104 *cdp++ = os->psize >> 8; |
| 105 *cdp++ = os->psize & 0xff; | |
| 106 memcpy (cdp, os->buf + os->pstart, os->psize); | |
|
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
758
diff
changeset
|
107 st->codec->extradata_size = cds; |
| 755 | 108 |
| 758 | 109 return 1; |
| 755 | 110 } |
| 111 | |
| 112 static uint64_t | |
| 113 theora_gptopts(AVFormatContext *ctx, int idx, uint64_t gp) | |
| 114 { | |
| 115 ogg_t *ogg = ctx->priv_data; | |
| 116 ogg_stream_t *os = ogg->streams + idx; | |
| 117 theora_params_t *thp = os->private; | |
| 118 uint64_t iframe = gp >> thp->gpshift; | |
| 119 uint64_t pframe = gp & thp->gpmask; | |
| 120 | |
| 1077 | 121 return iframe + pframe; |
| 755 | 122 } |
| 123 | |
| 124 ogg_codec_t theora_codec = { | |
| 125 .magic = "\200theora", | |
| 126 .magicsize = 7, | |
| 127 .header = theora_header, | |
| 128 .gptopts = theora_gptopts | |
| 129 }; |
