annotate oma.c @ 3902:5f9bec099c69 libavformat

Add dynamic payload handlers to rdt.c. These follow the same API as the ones in rtpdec.c, so that they can be shared and used in the same way in rtsp.c. The handlers, since they are specific for RDT, are registered in rdt.c and a new registration function is thus called from allformats.c. The dynamic payload handler also implements RDT-specific SDP-line parsing for OpaqueData and StartTime, which are specific for RDT and needed for proper playback. OpaqueData contains one or a list ("MLTI") of "MDPR" chunks that can be parsed by the rmdec.c function ff_rm_read_mdpr_codecdata(). To use this function, we create a new rdt_demuxer, which has the same private data as the rm_demuxer. The resulting AVFormatContext created with _open_stream() can thus be used to call functions in the RM demuxer. See discussion in "Realmedia patch" thread on ML.
author rbultje
date Sun, 07 Sep 2008 01:21:24 +0000
parents 93d4898d9b6e
children 49c1d3b27727
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3439
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
1 /*
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
2 * Sony OpenMG (OMA) demuxer
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
3 *
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
4 * Copyright (c) 2008 Maxim Poliakovski
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
5 * 2008 Benjamin Larsson
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
6 *
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
7 * This file is part of FFmpeg.
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
8 *
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
9 * FFmpeg is free software; you can redistribute it and/or
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
10 * modify it under the terms of the GNU Lesser General Public
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
11 * License as published by the Free Software Foundation; either
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
12 * version 2.1 of the License, or (at your option) any later version.
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
13 *
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
14 * FFmpeg is distributed in the hope that it will be useful,
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
17 * Lesser General Public License for more details.
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
18 *
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
19 * You should have received a copy of the GNU Lesser General Public
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
20 * License along with FFmpeg; if not, write to the Free Software
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
22 */
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
23
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
24 /**
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
25 * @file oma.c
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
26 * This is a demuxer for Sony OpenMG Music files
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
27 *
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
28 * Known file extensions: ".oma", "aa3"
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
29 * The format of such files consists of three parts:
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
30 * - "ea3" header carrying overall info and metadata.
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
31 * - "EA3" header is a Sony-specific header containing information about
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
32 * the OpenMG file: codec type (usually ATRAC, can also be MP3 or WMA),
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
33 * codec specific info (packet size, sample rate, channels and so on)
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
34 * and DRM related info (file encryption, content id).
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
35 * - Sound data organized in packets follow the EA3 header
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
36 * (can be encrypted using the Sony DRM!).
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
37 *
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
38 * LIMITATIONS: This version supports only plain (unencrypted) OMA files.
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
39 * If any DRM-protected (encrypted) file is encountered you will get the
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
40 * corresponding error message. Try to remove the encryption using any
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
41 * Sony software (for example SonicStage).
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
42 * CODEC SUPPORT: Only ATRAC3 codec is currently supported!
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
43 */
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
44
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
45 #include "avformat.h"
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
46 #include "libavutil/intreadwrite.h"
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
47 #include "raw.h"
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
48 #include "riff.h"
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
49
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
50 #define EA3_HEADER_SIZE 96
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
51
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
52 enum {
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
53 OMA_CODECID_ATRAC3 = 0,
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
54 OMA_CODECID_ATRAC3P = 1,
3505
ad7e9ad3c19a Add more codec IDs and tags.
banan
parents: 3439
diff changeset
55 OMA_CODECID_MP3 = 3,
ad7e9ad3c19a Add more codec IDs and tags.
banan
parents: 3439
diff changeset
56 OMA_CODECID_LPCM = 4,
ad7e9ad3c19a Add more codec IDs and tags.
banan
parents: 3439
diff changeset
57 OMA_CODECID_WMA = 5,
3439
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
58 };
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
59
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
60 static const AVCodecTag codec_oma_tags[] = {
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
61 { CODEC_ID_ATRAC3, OMA_CODECID_ATRAC3 },
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
62 { CODEC_ID_ATRAC3P, OMA_CODECID_ATRAC3P },
3505
ad7e9ad3c19a Add more codec IDs and tags.
banan
parents: 3439
diff changeset
63 { CODEC_ID_MP3, OMA_CODECID_MP3 },
3439
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
64 };
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
65
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
66 static int oma_read_header(AVFormatContext *s,
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
67 AVFormatParameters *ap)
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
68 {
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
69 static const uint16_t srate_tab[6] = {320,441,480,882,960,0};
3506
795b0af34f5c Rearrange parameter logic
banan
parents: 3505
diff changeset
70 int ret, ea3_taglen, EA3_pos, framesize, jsflag, samplerate;
3439
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
71 uint32_t codec_params;
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
72 int16_t eid;
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
73 uint8_t buf[EA3_HEADER_SIZE];
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
74 uint8_t *edata;
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
75 AVStream *st;
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
76
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
77 ret = get_buffer(s->pb, buf, 10);
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
78 if (ret != 10)
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
79 return -1;
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
80
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
81 ea3_taglen = ((buf[6] & 0x7f) << 21) | ((buf[7] & 0x7f) << 14) | ((buf[8] & 0x7f) << 7) | (buf[9] & 0x7f);
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
82
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
83 EA3_pos = ea3_taglen + 10;
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
84 if (buf[5] & 0x10)
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
85 EA3_pos += 10;
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
86
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
87 url_fseek(s->pb, EA3_pos, SEEK_SET);
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
88 ret = get_buffer(s->pb, buf, EA3_HEADER_SIZE);
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
89 if (ret != EA3_HEADER_SIZE)
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
90 return -1;
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
91
3769
93d4898d9b6e Mark several libavformat arrays const
reimar
parents: 3766
diff changeset
92 if (memcmp(buf, (const uint8_t[]){'E', 'A', '3'},3) || buf[4] != 0 || buf[5] != EA3_HEADER_SIZE) {
3439
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
93 av_log(s, AV_LOG_ERROR, "Couldn't find the EA3 header !\n");
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
94 return -1;
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
95 }
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
96
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
97 eid = AV_RB16(&buf[6]);
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
98 if (eid != -1 && eid != -128) {
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
99 av_log(s, AV_LOG_ERROR, "Encrypted file! Eid: %d\n", eid);
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
100 return -1;
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
101 }
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
102
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
103 codec_params = AV_RB24(&buf[33]);
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
104
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
105 st = av_new_stream(s, 0);
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
106 if (!st)
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
107 return AVERROR(ENOMEM);
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
108
3506
795b0af34f5c Rearrange parameter logic
banan
parents: 3505
diff changeset
109 st->start_time = 0;
795b0af34f5c Rearrange parameter logic
banan
parents: 3505
diff changeset
110 st->codec->codec_type = CODEC_TYPE_AUDIO;
795b0af34f5c Rearrange parameter logic
banan
parents: 3505
diff changeset
111 st->codec->codec_tag = buf[32];
795b0af34f5c Rearrange parameter logic
banan
parents: 3505
diff changeset
112 st->codec->codec_id = codec_get_id(codec_oma_tags, st->codec->codec_tag);
795b0af34f5c Rearrange parameter logic
banan
parents: 3505
diff changeset
113
3439
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
114 switch (buf[32]) {
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
115 case OMA_CODECID_ATRAC3:
3506
795b0af34f5c Rearrange parameter logic
banan
parents: 3505
diff changeset
116 samplerate = srate_tab[(codec_params >> 13) & 7]*100;
3439
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
117 if (samplerate != 44100)
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
118 av_log(s, AV_LOG_ERROR, "Unsupported sample rate, send sample file to developers: %d\n", samplerate);
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
119
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
120 framesize = (codec_params & 0x3FF) * 8;
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
121 jsflag = (codec_params >> 17) & 1; /* get stereo coding mode, 1 for joint-stereo */
3506
795b0af34f5c Rearrange parameter logic
banan
parents: 3505
diff changeset
122 st->codec->channels = 2;
795b0af34f5c Rearrange parameter logic
banan
parents: 3505
diff changeset
123 st->codec->sample_rate = samplerate;
795b0af34f5c Rearrange parameter logic
banan
parents: 3505
diff changeset
124 st->codec->bit_rate = st->codec->sample_rate * framesize * 8 / 1024;
3439
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
125
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
126 /* fake the atrac3 extradata (wav format, makes stream copy to wav work) */
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
127 st->codec->extradata_size = 14;
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
128 edata = av_mallocz(14 + FF_INPUT_BUFFER_PADDING_SIZE);
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
129 if (!edata)
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
130 return AVERROR(ENOMEM);
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
131
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
132 st->codec->extradata = edata;
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
133 AV_WL16(&edata[0], 1); // always 1
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
134 AV_WL32(&edata[2], samplerate); // samples rate
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
135 AV_WL16(&edata[6], jsflag); // coding mode
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
136 AV_WL16(&edata[8], jsflag); // coding mode
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
137 AV_WL16(&edata[10], 1); // always 1
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
138 // AV_WL16(&edata[12], 0); // always 0
3506
795b0af34f5c Rearrange parameter logic
banan
parents: 3505
diff changeset
139
795b0af34f5c Rearrange parameter logic
banan
parents: 3505
diff changeset
140 av_set_pts_info(st, 64, 1, st->codec->sample_rate);
3439
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
141 break;
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
142 case OMA_CODECID_ATRAC3P:
3506
795b0af34f5c Rearrange parameter logic
banan
parents: 3505
diff changeset
143 st->codec->channels = (codec_params >> 10) & 7;
3439
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
144 framesize = ((codec_params & 0x3FF) * 8) + 8;
3506
795b0af34f5c Rearrange parameter logic
banan
parents: 3505
diff changeset
145 st->codec->sample_rate = srate_tab[(codec_params >> 13) & 7]*100;
795b0af34f5c Rearrange parameter logic
banan
parents: 3505
diff changeset
146 st->codec->bit_rate = st->codec->sample_rate * framesize * 8 / 1024;
795b0af34f5c Rearrange parameter logic
banan
parents: 3505
diff changeset
147 av_set_pts_info(st, 64, 1, st->codec->sample_rate);
3439
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
148 av_log(s, AV_LOG_ERROR, "Unsupported codec ATRAC3+!\n");
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
149 break;
3507
3c1206ad5d64 Add support for mp3 contained in oma
banan
parents: 3506
diff changeset
150 case OMA_CODECID_MP3:
3c1206ad5d64 Add support for mp3 contained in oma
banan
parents: 3506
diff changeset
151 st->need_parsing = AVSTREAM_PARSE_FULL;
3c1206ad5d64 Add support for mp3 contained in oma
banan
parents: 3506
diff changeset
152 framesize = 1024;
3c1206ad5d64 Add support for mp3 contained in oma
banan
parents: 3506
diff changeset
153 break;
3439
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
154 default:
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
155 av_log(s, AV_LOG_ERROR, "Unsupported codec %d!\n",buf[32]);
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
156 return -1;
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
157 break;
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
158 }
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
159
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
160 st->codec->block_align = framesize;
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
161 url_fseek(s->pb, EA3_pos + EA3_HEADER_SIZE, SEEK_SET);
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
162
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
163 return 0;
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
164 }
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
165
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
166
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
167 static int oma_read_packet(AVFormatContext *s, AVPacket *pkt)
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
168 {
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
169 int ret = av_get_packet(s->pb, pkt, s->streams[0]->codec->block_align);
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
170
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
171 pkt->stream_index = 0;
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
172 if (ret <= 0)
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
173 return AVERROR(EIO);
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
174
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
175 return ret;
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
176 }
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
177
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
178 static int oma_read_probe(AVProbeData *p)
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
179 {
3769
93d4898d9b6e Mark several libavformat arrays const
reimar
parents: 3766
diff changeset
180 if (!memcmp(p->buf, (const uint8_t[]){'e', 'a', '3', 3, 0},5))
3439
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
181 return AVPROBE_SCORE_MAX;
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
182 else
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
183 return 0;
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
184 }
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
185
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
186
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
187 AVInputFormat oma_demuxer = {
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
188 "oma",
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
189 NULL_IF_CONFIG_SMALL("Sony OpenMG audio"),
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
190 0,
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
191 oma_read_probe,
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
192 oma_read_header,
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
193 oma_read_packet,
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
194 0,
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
195 pcm_read_seek,
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
196 .flags= AVFMT_GENERIC_INDEX,
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
197 .extensions = "oma,aa3",
3766
f062deeedb8d Change codec_tag type from const struct AVCodecTag ** to const struct AVCodecTag * const *
reimar
parents: 3507
diff changeset
198 .codec_tag= (const AVCodecTag* const []){codec_oma_tags, 0},
3439
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
199 };
0dfc37ba9453 Oma demuxer
banan
parents:
diff changeset
200