annotate oggparsetheora.c @ 4723:a2390c6a35e6 libavformat

Fix index generation in the way that it was supposed to be used. See the discussion in the ML thread "[PATCH] rmdec.c: merge old/new packet reading code". Over time, this code broke somewhat, e.g. seq was never actually written into (and was thus always 1, therefore the seq condition was always true), whereas it was supposed to be set to the sequence number of the video slice in case the video frame is divided over multiple RM packets (slices). The problem of this is that packets other than those containing the beginning of a video frame would be indexed as well. Secondly, flags&2 is supposed to be true for video keyframes and for these audio packets containing the start of a block. For some codecs (e.g. AAC), that is every single packet, whereas for others (e.g. cook), that is the packet containing the first of a series of scrambled packets that are to be descrambled together. Indexing any of the following would lead to incomplete and thus useless frames. Problem here is that flags would be reset to 2 to indicate that the first packet is ready to be returned, and in addition if no data was left to be returned (which is always true for the first packet), then we wouldn't actually write the index entry anyway. All in all, the idea was good and it probably worked at some point, but that is long ago. This patch should at the very least make it likely for this code to be executed again at the right times, i.e. the way it was originally intended to be used.
author rbultje
date Sun, 15 Mar 2009 20:14:25 +0000
parents b2a3ed76122e
children 304a0ea063f0
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
4016
6cd006bc2de9 OGG: untypedef demuxer structs
mru
parents: 3965
diff changeset
31 struct theora_params {
755
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;
4017
b2a3ed76122e OGG: correct PTS with old theora streams
mru
parents: 4016
diff changeset
34 unsigned version;
4016
6cd006bc2de9 OGG: untypedef demuxer structs
mru
parents: 3965
diff changeset
35 };
755
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
36
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
37 static int
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
38 theora_header (AVFormatContext * s, int idx)
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
39 {
4016
6cd006bc2de9 OGG: untypedef demuxer structs
mru
parents: 3965
diff changeset
40 struct ogg *ogg = s->priv_data;
6cd006bc2de9 OGG: untypedef demuxer structs
mru
parents: 3965
diff changeset
41 struct ogg_stream *os = ogg->streams + idx;
755
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
42 AVStream *st = s->streams[idx];
4016
6cd006bc2de9 OGG: untypedef demuxer structs
mru
parents: 3965
diff changeset
43 struct theora_params *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
44 int cds = st->codec->extradata_size + os->psize + 2;
755
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
45 uint8_t *cdp;
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
46
758
7bbe565d50db check theora version
mru
parents: 755
diff changeset
47 if(!(os->buf[os->pstart] & 0x80))
755
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
48 return 0;
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
49
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
50 if(!thp){
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
51 thp = av_mallocz(sizeof(*thp));
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
52 os->private = thp;
755
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
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
55 if (os->buf[os->pstart] == 0x80) {
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
56 GetBitContext gb;
2073
59c2badf702a fix display of theora videos with visible size smaller than encoded size
aurel
parents: 1178
diff changeset
57 int width, height;
970
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
4017
b2a3ed76122e OGG: correct PTS with old theora streams
mru
parents: 4016
diff changeset
63 thp->version = get_bits_long(&gb, 24);
b2a3ed76122e OGG: correct PTS with old theora streams
mru
parents: 4016
diff changeset
64 if (thp->version < 0x030100)
970
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,
4017
b2a3ed76122e OGG: correct PTS with old theora streams
mru
parents: 4016
diff changeset
67 "Too old or unsupported Theora (%x)\n", thp->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
4017
b2a3ed76122e OGG: correct PTS with old theora streams
mru
parents: 4016
diff changeset
75 if (thp->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
4017
b2a3ed76122e OGG: correct PTS with old theora streams
mru
parents: 4016
diff changeset
78 if (thp->version >= 0x030200) {
3965
adbe373e6e79 Cosmetics: indentation
conrad
parents: 3964
diff changeset
79 width = get_bits_long(&gb, 24);
adbe373e6e79 Cosmetics: indentation
conrad
parents: 3964
diff changeset
80 height = get_bits_long(&gb, 24);
adbe373e6e79 Cosmetics: indentation
conrad
parents: 3964
diff changeset
81 if ( width <= st->codec->width && width > st->codec->width-16
adbe373e6e79 Cosmetics: indentation
conrad
parents: 3964
diff changeset
82 && height <= st->codec->height && height > st->codec->height-16)
adbe373e6e79 Cosmetics: indentation
conrad
parents: 3964
diff changeset
83 avcodec_set_dimensions(st->codec, width, height);
2073
59c2badf702a fix display of theora videos with visible size smaller than encoded size
aurel
parents: 1178
diff changeset
84
59c2badf702a fix display of theora videos with visible size smaller than encoded size
aurel
parents: 1178
diff changeset
85 skip_bits(&gb, 16);
3964
66a7b9ab9e09 Visible width/height fields were added in Theora 3.2
conrad
parents: 3770
diff changeset
86 }
2168
d095666dedf3 use get_bits_long() where needed
mru
parents: 2073
diff changeset
87 st->codec->time_base.den = get_bits_long(&gb, 32);
d095666dedf3 use get_bits_long() where needed
mru
parents: 2073
diff changeset
88 st->codec->time_base.num = get_bits_long(&gb, 32);
1077
91677ac6fb19 set stream time_base properly
mru
parents: 970
diff changeset
89 st->time_base = st->codec->time_base;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
90
3759
27537074f2a9 convert every muxer/demuxer to write/read sample_aspect_ratio from/to
aurel
parents: 3286
diff changeset
91 st->sample_aspect_ratio.num = get_bits_long(&gb, 24);
27537074f2a9 convert every muxer/demuxer to write/read sample_aspect_ratio from/to
aurel
parents: 3286
diff changeset
92 st->sample_aspect_ratio.den = get_bits_long(&gb, 24);
755
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
93
4017
b2a3ed76122e OGG: correct PTS with old theora streams
mru
parents: 4016
diff changeset
94 if (thp->version >= 0x030200)
970
2266681a4a52 support correct ptses on other than version 3.2.0 aswell
alex
parents: 887
diff changeset
95 skip_bits(&gb, 38);
4017
b2a3ed76122e OGG: correct PTS with old theora streams
mru
parents: 4016
diff changeset
96 if (thp->version >= 0x304000)
970
2266681a4a52 support correct ptses on other than version 3.2.0 aswell
alex
parents: 887
diff changeset
97 skip_bits(&gb, 2);
2266681a4a52 support correct ptses on other than version 3.2.0 aswell
alex
parents: 887
diff changeset
98
755
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
99 thp->gpshift = get_bits(&gb, 5);
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
100 thp->gpmask = (1 << thp->gpshift) - 1;
755
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
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->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
103 st->codec->codec_id = CODEC_ID_THEORA;
755
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
104
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
105 } else if (os->buf[os->pstart] == 0x83) {
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
106 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
107 }
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
108
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 758
diff changeset
109 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
110 cdp = st->codec->extradata + st->codec->extradata_size;
755
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
111 *cdp++ = os->psize >> 8;
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
112 *cdp++ = os->psize & 0xff;
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
113 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
114 st->codec->extradata_size = cds;
755
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
115
758
7bbe565d50db check theora version
mru
parents: 755
diff changeset
116 return 1;
755
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
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
119 static uint64_t
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
120 theora_gptopts(AVFormatContext *ctx, int idx, uint64_t gp)
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
121 {
4016
6cd006bc2de9 OGG: untypedef demuxer structs
mru
parents: 3965
diff changeset
122 struct ogg *ogg = ctx->priv_data;
6cd006bc2de9 OGG: untypedef demuxer structs
mru
parents: 3965
diff changeset
123 struct ogg_stream *os = ogg->streams + idx;
6cd006bc2de9 OGG: untypedef demuxer structs
mru
parents: 3965
diff changeset
124 struct theora_params *thp = os->private;
755
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
125 uint64_t iframe = gp >> thp->gpshift;
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
126 uint64_t pframe = gp & thp->gpmask;
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
127
4017
b2a3ed76122e OGG: correct PTS with old theora streams
mru
parents: 4016
diff changeset
128 if (thp->version < 0x030201)
b2a3ed76122e OGG: correct PTS with old theora streams
mru
parents: 4016
diff changeset
129 iframe++;
b2a3ed76122e OGG: correct PTS with old theora streams
mru
parents: 4016
diff changeset
130
2732
2b101e9d25c0 set PKT_FLAG_KEY for Theora and OGM streams
mru
parents: 2714
diff changeset
131 if(!pframe)
2b101e9d25c0 set PKT_FLAG_KEY for Theora and OGM streams
mru
parents: 2714
diff changeset
132 os->pflags |= PKT_FLAG_KEY;
2b101e9d25c0 set PKT_FLAG_KEY for Theora and OGM streams
mru
parents: 2714
diff changeset
133
1077
91677ac6fb19 set stream time_base properly
mru
parents: 970
diff changeset
134 return iframe + pframe;
755
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
135 }
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
136
4016
6cd006bc2de9 OGG: untypedef demuxer structs
mru
parents: 3965
diff changeset
137 const struct ogg_codec ff_theora_codec = {
755
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
138 .magic = "\200theora",
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
139 .magicsize = 7,
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
140 .header = theora_header,
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
141 .gptopts = theora_gptopts
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
142 };