annotate oggparsetheora.c @ 3754:8d267b43eaba libavformat

Move malloc() down until after all initializations, so that the resource is only allocated if initialization worked. This means that on failure, we don't have to deallocate it.
author rbultje
date Sat, 23 Aug 2008 18:46:30 +0000
parents 6f61c3b36632
children 27537074f2a9
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>
3286
6f61c3b36632 Use full path for #includes from another directory.
diego
parents: 2732
diff changeset
26 #include "libavutil/bswap.h"
6f61c3b36632 Use full path for #includes from another directory.
diego
parents: 2732
diff changeset
27 #include "libavcodec/bitstream.h"
755
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
28 #include "avformat.h"
2714
b22ba392ac21 Rename ogg2.[ch] to oggdec.[ch].
diego
parents: 2222
diff changeset
29 #include "oggdec.h"
755
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
2222
3427d0c63a32 Use AV_RB* macros where appropriate.
diego
parents: 2168
diff changeset
63 version = get_bits_long(&gb, 24);
970
2266681a4a52 support correct ptses on other than version 3.2.0 aswell
alex
parents: 887
diff changeset
64 if (version < 0x030100)
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 av_log(s, AV_LOG_ERROR,
2266681a4a52 support correct ptses on other than version 3.2.0 aswell
alex
parents: 887
diff changeset
67 "Too old or unsupported Theora (%x)\n", version);
758
7bbe565d50db check theora version
mru
parents: 755
diff changeset
68 return -1;
970
2266681a4a52 support correct ptses on other than version 3.2.0 aswell
alex
parents: 887
diff changeset
69 }
758
7bbe565d50db check theora version
mru
parents: 755
diff changeset
70
2073
59c2badf702a fix display of theora videos with visible size smaller than encoded size
aurel
parents: 1178
diff changeset
71 width = get_bits(&gb, 16) << 4;
59c2badf702a fix display of theora videos with visible size smaller than encoded size
aurel
parents: 1178
diff changeset
72 height = get_bits(&gb, 16) << 4;
59c2badf702a fix display of theora videos with visible size smaller than encoded size
aurel
parents: 1178
diff changeset
73 avcodec_set_dimensions(st->codec, width, height);
755
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
74
970
2266681a4a52 support correct ptses on other than version 3.2.0 aswell
alex
parents: 887
diff changeset
75 if (version >= 0x030400)
2073
59c2badf702a fix display of theora videos with visible size smaller than encoded size
aurel
parents: 1178
diff changeset
76 skip_bits(&gb, 100);
59c2badf702a fix display of theora videos with visible size smaller than encoded size
aurel
parents: 1178
diff changeset
77
59c2badf702a fix display of theora videos with visible size smaller than encoded size
aurel
parents: 1178
diff changeset
78 width = get_bits_long(&gb, 24);
59c2badf702a fix display of theora videos with visible size smaller than encoded size
aurel
parents: 1178
diff changeset
79 height = get_bits_long(&gb, 24);
59c2badf702a fix display of theora videos with visible size smaller than encoded size
aurel
parents: 1178
diff changeset
80 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
81 && 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
82 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
83
59c2badf702a fix display of theora videos with visible size smaller than encoded size
aurel
parents: 1178
diff changeset
84 if (version >= 0x030200)
59c2badf702a fix display of theora videos with visible size smaller than encoded size
aurel
parents: 1178
diff changeset
85 skip_bits(&gb, 16);
2168
d095666dedf3 use get_bits_long() where needed
mru
parents: 2073
diff changeset
86 st->codec->time_base.den = get_bits_long(&gb, 32);
d095666dedf3 use get_bits_long() where needed
mru
parents: 2073
diff changeset
87 st->codec->time_base.num = get_bits_long(&gb, 32);
1077
91677ac6fb19 set stream time_base properly
mru
parents: 970
diff changeset
88 st->time_base = st->codec->time_base;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
89
2168
d095666dedf3 use get_bits_long() where needed
mru
parents: 2073
diff changeset
90 st->codec->sample_aspect_ratio.num = get_bits_long(&gb, 24);
d095666dedf3 use get_bits_long() where needed
mru
parents: 2073
diff changeset
91 st->codec->sample_aspect_ratio.den = get_bits_long(&gb, 24);
755
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
92
970
2266681a4a52 support correct ptses on other than version 3.2.0 aswell
alex
parents: 887
diff changeset
93 if (version >= 0x030200)
2266681a4a52 support correct ptses on other than version 3.2.0 aswell
alex
parents: 887
diff changeset
94 skip_bits(&gb, 38);
2266681a4a52 support correct ptses on other than version 3.2.0 aswell
alex
parents: 887
diff changeset
95 if (version >= 0x304000)
2266681a4a52 support correct ptses on other than version 3.2.0 aswell
alex
parents: 887
diff changeset
96 skip_bits(&gb, 2);
2266681a4a52 support correct ptses on other than version 3.2.0 aswell
alex
parents: 887
diff changeset
97
755
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
98 thp->gpshift = get_bits(&gb, 5);
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
99 thp->gpmask = (1 << thp->gpshift) - 1;
755
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
100
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 758
diff changeset
101 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
102 st->codec->codec_id = CODEC_ID_THEORA;
755
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
103
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
104 } else if (os->buf[os->pstart] == 0x83) {
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
105 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
106 }
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
107
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 758
diff changeset
108 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
109 cdp = st->codec->extradata + st->codec->extradata_size;
755
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
110 *cdp++ = os->psize >> 8;
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
111 *cdp++ = os->psize & 0xff;
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
112 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
113 st->codec->extradata_size = cds;
755
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
114
758
7bbe565d50db check theora version
mru
parents: 755
diff changeset
115 return 1;
755
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
116 }
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
117
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
118 static uint64_t
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
119 theora_gptopts(AVFormatContext *ctx, int idx, uint64_t gp)
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 ogg_t *ogg = ctx->priv_data;
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
122 ogg_stream_t *os = ogg->streams + idx;
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
123 theora_params_t *thp = os->private;
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
124 uint64_t iframe = gp >> thp->gpshift;
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
125 uint64_t pframe = gp & thp->gpmask;
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
126
2732
2b101e9d25c0 set PKT_FLAG_KEY for Theora and OGM streams
mru
parents: 2714
diff changeset
127 if(!pframe)
2b101e9d25c0 set PKT_FLAG_KEY for Theora and OGM streams
mru
parents: 2714
diff changeset
128 os->pflags |= PKT_FLAG_KEY;
2b101e9d25c0 set PKT_FLAG_KEY for Theora and OGM streams
mru
parents: 2714
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 };