Mercurial > libavformat.hg
annotate oggparsetheora.c @ 2136:b53a19eed95d libavformat
remove duplicate PAT scaning code and actual PAT scan
also disabling the nonsense 3yr old rawts change (it would after the
above chage totally break the demuxer if its left enabled)
author | michael |
---|---|
date | Mon, 04 Jun 2007 14:44:52 +0000 |
parents | 59c2badf702a |
children | d095666dedf3 |
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; | |
2073
59c2badf702a
fix display of theora videos with visible size smaller than encoded size
aurel
parents:
1178
diff
changeset
|
56 int width, height; |
970
2266681a4a52
support correct ptses on other than version 3.2.0 aswell
alex
parents:
887
diff
changeset
|
57 int version; |
2266681a4a52
support correct ptses on other than version 3.2.0 aswell
alex
parents:
887
diff
changeset
|
58 |
755 | 59 init_get_bits(&gb, os->buf + os->pstart, os->psize*8); |
60 | |
61 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
|
62 |
2266681a4a52
support correct ptses on other than version 3.2.0 aswell
alex
parents:
887
diff
changeset
|
63 version = get_bits(&gb, 8) << 16; |
2266681a4a52
support correct ptses on other than version 3.2.0 aswell
alex
parents:
887
diff
changeset
|
64 version |= get_bits(&gb, 8) << 8; |
2266681a4a52
support correct ptses on other than version 3.2.0 aswell
alex
parents:
887
diff
changeset
|
65 version |= get_bits(&gb, 8); |
2266681a4a52
support correct ptses on other than version 3.2.0 aswell
alex
parents:
887
diff
changeset
|
66 |
2266681a4a52
support correct ptses on other than version 3.2.0 aswell
alex
parents:
887
diff
changeset
|
67 if (version < 0x030100) |
2266681a4a52
support correct ptses on other than version 3.2.0 aswell
alex
parents:
887
diff
changeset
|
68 { |
2266681a4a52
support correct ptses on other than version 3.2.0 aswell
alex
parents:
887
diff
changeset
|
69 av_log(s, AV_LOG_ERROR, |
2266681a4a52
support correct ptses on other than version 3.2.0 aswell
alex
parents:
887
diff
changeset
|
70 "Too old or unsupported Theora (%x)\n", version); |
758 | 71 return -1; |
970
2266681a4a52
support correct ptses on other than version 3.2.0 aswell
alex
parents:
887
diff
changeset
|
72 } |
758 | 73 |
2073
59c2badf702a
fix display of theora videos with visible size smaller than encoded size
aurel
parents:
1178
diff
changeset
|
74 width = get_bits(&gb, 16) << 4; |
59c2badf702a
fix display of theora videos with visible size smaller than encoded size
aurel
parents:
1178
diff
changeset
|
75 height = get_bits(&gb, 16) << 4; |
59c2badf702a
fix display of theora videos with visible size smaller than encoded size
aurel
parents:
1178
diff
changeset
|
76 avcodec_set_dimensions(st->codec, width, height); |
755 | 77 |
970
2266681a4a52
support correct ptses on other than version 3.2.0 aswell
alex
parents:
887
diff
changeset
|
78 if (version >= 0x030400) |
2073
59c2badf702a
fix display of theora videos with visible size smaller than encoded size
aurel
parents:
1178
diff
changeset
|
79 skip_bits(&gb, 100); |
59c2badf702a
fix display of theora videos with visible size smaller than encoded size
aurel
parents:
1178
diff
changeset
|
80 |
59c2badf702a
fix display of theora videos with visible size smaller than encoded size
aurel
parents:
1178
diff
changeset
|
81 width = get_bits_long(&gb, 24); |
59c2badf702a
fix display of theora videos with visible size smaller than encoded size
aurel
parents:
1178
diff
changeset
|
82 height = get_bits_long(&gb, 24); |
59c2badf702a
fix display of theora videos with visible size smaller than encoded size
aurel
parents:
1178
diff
changeset
|
83 if ( width <= st->codec->width && width > st->codec->width-16 |
59c2badf702a
fix display of theora videos with visible size smaller than encoded size
aurel
parents:
1178
diff
changeset
|
84 && height <= st->codec->height && height > st->codec->height-16) |
59c2badf702a
fix display of theora videos with visible size smaller than encoded size
aurel
parents:
1178
diff
changeset
|
85 avcodec_set_dimensions(st->codec, width, height); |
59c2badf702a
fix display of theora videos with visible size smaller than encoded size
aurel
parents:
1178
diff
changeset
|
86 |
59c2badf702a
fix display of theora videos with visible size smaller than encoded size
aurel
parents:
1178
diff
changeset
|
87 if (version >= 0x030200) |
59c2badf702a
fix display of theora videos with visible size smaller than encoded size
aurel
parents:
1178
diff
changeset
|
88 skip_bits(&gb, 16); |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
758
diff
changeset
|
89 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
|
90 st->codec->time_base.num = get_bits(&gb, 32); |
1077 | 91 st->time_base = st->codec->time_base; |
885 | 92 |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
758
diff
changeset
|
93 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
|
94 st->codec->sample_aspect_ratio.den = get_bits(&gb, 24); |
755 | 95 |
970
2266681a4a52
support correct ptses on other than version 3.2.0 aswell
alex
parents:
887
diff
changeset
|
96 if (version >= 0x030200) |
2266681a4a52
support correct ptses on other than version 3.2.0 aswell
alex
parents:
887
diff
changeset
|
97 skip_bits(&gb, 38); |
2266681a4a52
support correct ptses on other than version 3.2.0 aswell
alex
parents:
887
diff
changeset
|
98 if (version >= 0x304000) |
2266681a4a52
support correct ptses on other than version 3.2.0 aswell
alex
parents:
887
diff
changeset
|
99 skip_bits(&gb, 2); |
2266681a4a52
support correct ptses on other than version 3.2.0 aswell
alex
parents:
887
diff
changeset
|
100 |
755 | 101 thp->gpshift = get_bits(&gb, 5); |
887 | 102 thp->gpmask = (1 << thp->gpshift) - 1; |
755 | 103 |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
758
diff
changeset
|
104 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
|
105 st->codec->codec_id = CODEC_ID_THEORA; |
755 | 106 |
107 } else if (os->buf[os->pstart] == 0x83) { | |
108 vorbis_comment (s, os->buf + os->pstart + 7, os->psize - 8); | |
109 } | |
110 | |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
758
diff
changeset
|
111 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
|
112 cdp = st->codec->extradata + st->codec->extradata_size; |
755 | 113 *cdp++ = os->psize >> 8; |
114 *cdp++ = os->psize & 0xff; | |
115 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
|
116 st->codec->extradata_size = cds; |
755 | 117 |
758 | 118 return 1; |
755 | 119 } |
120 | |
121 static uint64_t | |
122 theora_gptopts(AVFormatContext *ctx, int idx, uint64_t gp) | |
123 { | |
124 ogg_t *ogg = ctx->priv_data; | |
125 ogg_stream_t *os = ogg->streams + idx; | |
126 theora_params_t *thp = os->private; | |
127 uint64_t iframe = gp >> thp->gpshift; | |
128 uint64_t pframe = gp & thp->gpmask; | |
129 | |
1077 | 130 return iframe + pframe; |
755 | 131 } |
132 | |
133 ogg_codec_t theora_codec = { | |
134 .magic = "\200theora", | |
135 .magicsize = 7, | |
136 .header = theora_header, | |
137 .gptopts = theora_gptopts | |
138 }; |