annotate oggparsetheora.c @ 755:27449ee55201 libavformat

support theora in ogg, plus required ogg core changes
author mru
date Wed, 11 May 2005 16:38:34 +0000
parents
children 7bbe565d50db
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 /**
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
2 Copyright (C) 2005 Matthieu CASTET
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;
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
43 int cds = st->codec.extradata_size + os->psize + 2;
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
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
46 if (os->seq > 2)
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){
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
50 thp = av_mallocz(sizeof(*thp));
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
51 os->private = thp;
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;
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
56 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
57
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
58 skip_bits(&gb, 7*8); /* 0x80"theora" */
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
59 skip_bits(&gb, 3*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 st->codec.width = get_bits(&gb, 16) << 4;
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
62 st->codec.height = get_bits(&gb, 16) << 4;
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
63
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
64 skip_bits(&gb, 64);
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
65 st->codec.time_base.den = get_bits(&gb, 32);
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
66 st->codec.time_base.num = get_bits(&gb, 32);
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
67
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
68 st->codec.sample_aspect_ratio.num = get_bits(&gb, 24);
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
69 st->codec.sample_aspect_ratio.den = get_bits(&gb, 24);
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
70
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
71 skip_bits(&gb, 38);
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
72 thp->gpshift = get_bits(&gb, 5);
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
73 thp->gpmask = (1 << thp->gpshift) - 1;
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
74
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
75 st->codec.codec_type = CODEC_TYPE_VIDEO;
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
76 st->codec.codec_id = CODEC_ID_THEORA;
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
77
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
78 } else if (os->buf[os->pstart] == 0x83) {
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
79 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
80 }
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
81
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
82 st->codec.extradata = av_realloc (st->codec.extradata, cds);
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
83 cdp = st->codec.extradata + st->codec.extradata_size;
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
84 *cdp++ = os->psize >> 8;
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
85 *cdp++ = os->psize & 0xff;
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
86 memcpy (cdp, os->buf + os->pstart, os->psize);
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
87 st->codec.extradata_size = cds;
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
88
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
89
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
90 return os->seq < 3;
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
91 }
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
92
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
93 static uint64_t
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
94 theora_gptopts(AVFormatContext *ctx, int idx, uint64_t gp)
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
95 {
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
96 AVStream *st = ctx->streams[idx];
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
97 ogg_t *ogg = ctx->priv_data;
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
98 ogg_stream_t *os = ogg->streams + idx;
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
99 theora_params_t *thp = os->private;
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
100 uint64_t iframe = gp >> thp->gpshift;
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
101 uint64_t pframe = gp & thp->gpmask;
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
102
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
103 return (iframe + pframe) * AV_TIME_BASE * st->codec.time_base.num /
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
104 st->codec.time_base.den;
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
105 }
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 ogg_codec_t theora_codec = {
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
108 .magic = "\200theora",
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
109 .magicsize = 7,
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
110 .header = theora_header,
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
111 .gptopts = theora_gptopts
27449ee55201 support theora in ogg, plus required ogg core changes
mru
parents:
diff changeset
112 };