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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
755
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
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
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
3
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
4 Permission is hereby granted, free of charge, to any person
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
5 obtaining a copy of this software and associated documentation
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
6 files (the "Software"), to deal in the Software without
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
7 restriction, including without limitation the rights to use, copy,
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
8 modify, merge, publish, distribute, sublicense, and/or sell copies
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
9 of the Software, and to permit persons to whom the Software is
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
10 furnished to do so, subject to the following conditions:
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
11
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
12 The above copyright notice and this permission notice shall be
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
13 included in all copies or substantial portions of the Software.
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
14
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
15 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
16 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
17 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
18 NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
19 HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
20 WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
21 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
22 DEALINGS IN THE SOFTWARE.
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
23 **/
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
24
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
25 #include <stdlib.h>
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
26 #include "avformat.h"
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
27 #include "bitstream.h"
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
28 #include "bswap.h"
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
29 #include "ogg2.h"
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
30
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
31 typedef struct theora_params {
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
32 int gpshift;
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
33 int gpmask;
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
34 } theora_params_t;
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
35
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
36 static int
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
37 theora_header (AVFormatContext * s, int idx)
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
38 {
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
39 ogg_t *ogg = s->priv_data;
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
40 ogg_stream_t *os = ogg->streams + idx;
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
41 AVStream *st = s->streams[idx];
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
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
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
44 uint8_t *cdp;
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
45
758
7bbe565d50db check theora version
mru
parents: 755
diff changeset
46 if(!(os->buf[os->pstart] & 0x80))
755
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
47 return 0;
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
48
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
49 if(!thp){
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
50 thp = av_mallocz(sizeof(*thp));
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
51 os->private = thp;
755
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
52 }
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
53
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
54 if (os->buf[os->pstart] == 0x80) {
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
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
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
59 init_get_bits(&gb, os->buf + os->pstart, os->psize*8);
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
60
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
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
7bbe565d50db check theora version
mru
parents: 755
diff changeset
71 return -1;
970
2266681a4a52 support correct ptses on other than version 3.2.0 aswell
alex
parents: 887
diff changeset
72 }
758
7bbe565d50db check theora version
mru
parents: 755
diff changeset
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
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
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
91677ac6fb19 set stream time_base properly
mru
parents: 970
diff changeset
91 st->time_base = st->codec->time_base;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
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
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
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
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
101 thp->gpshift = get_bits(&gb, 5);
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
102 thp->gpmask = (1 << thp->gpshift) - 1;
755
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
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
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
106
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
107 } else if (os->buf[os->pstart] == 0x83) {
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
108 vorbis_comment (s, os->buf + os->pstart + 7, os->psize - 8);
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
109 }
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
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
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
113 *cdp++ = os->psize >> 8;
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
114 *cdp++ = os->psize & 0xff;
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
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
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
117
758
7bbe565d50db check theora version
mru
parents: 755
diff changeset
118 return 1;
755
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
119 }
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
120
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
121 static uint64_t
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
122 theora_gptopts(AVFormatContext *ctx, int idx, uint64_t gp)
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
123 {
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
124 ogg_t *ogg = ctx->priv_data;
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
125 ogg_stream_t *os = ogg->streams + idx;
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
126 theora_params_t *thp = os->private;
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
127 uint64_t iframe = gp >> thp->gpshift;
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
128 uint64_t pframe = gp & thp->gpmask;
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
129
1077
91677ac6fb19 set stream time_base properly
mru
parents: 970
diff changeset
130 return iframe + pframe;
755
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
131 }
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
132
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
133 ogg_codec_t theora_codec = {
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
134 .magic = "\200theora",
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
135 .magicsize = 7,
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
136 .header = theora_header,
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
137 .gptopts = theora_gptopts
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
138 };