Mercurial > libavformat.hg
comparison rsodec.c @ 6288:ab5b82b7b8e6 libavformat
Lego Mindstorms RSO muxer and demuxer.
Patch by Rafa¸«³l Carr¸«±, rafael d carre a gmail
author | cehoyos |
---|---|
date | Tue, 20 Jul 2010 14:13:24 +0000 |
parents | |
children | 4aaed59641ff |
comparison
equal
deleted
inserted
replaced
6287:3800dce5a40a | 6288:ab5b82b7b8e6 |
---|---|
1 /* | |
2 * RSO demuxer | |
3 * Copyright (c) 2001 Fabrice Bellard (original AU code) | |
4 * Copyright (c) 2010 Rafael Carre | |
5 * | |
6 * This file is part of FFmpeg. | |
7 * | |
8 * FFmpeg is free software; you can redistribute it and/or | |
9 * modify it under the terms of the GNU Lesser General Public | |
10 * License as published by the Free Software Foundation; either | |
11 * version 2.1 of the License, or (at your option) any later version. | |
12 * | |
13 * FFmpeg is distributed in the hope that it will be useful, | |
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
16 * Lesser General Public License for more details. | |
17 * | |
18 * You should have received a copy of the GNU Lesser General Public | |
19 * License along with FFmpeg; if not, write to the Free Software | |
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |
21 */ | |
22 | |
23 #include "libavutil/intreadwrite.h" | |
24 #include "avformat.h" | |
25 #include "internal.h" | |
26 #include "raw.h" | |
27 #include "riff.h" | |
28 #include "rso.h" | |
29 | |
30 static int rso_read_header(AVFormatContext *s, AVFormatParameters *ap) | |
31 { | |
32 ByteIOContext *pb = s->pb; | |
33 int id, rate, bps; | |
34 unsigned int size; | |
35 enum CodecID codec; | |
36 AVStream *st; | |
37 | |
38 id = get_be16(pb); | |
39 size = get_be16(pb); | |
40 rate = get_be16(pb); | |
41 get_be16(pb); /* play mode ? (0x0000 = don't loop) */ | |
42 | |
43 codec = ff_codec_get_id(ff_codec_rso_tags, id); | |
44 | |
45 if (codec == CODEC_ID_ADPCM_IMA_WAV) { | |
46 av_log(s, AV_LOG_ERROR, "ADPCM in RSO not implemented\n"); | |
47 return AVERROR_PATCHWELCOME; | |
48 } | |
49 | |
50 bps = av_get_bits_per_sample(codec); | |
51 if (!bps) { | |
52 av_log_ask_for_sample(s, "could not determine bits per sample\n"); | |
53 return AVERROR_INVALIDDATA; | |
54 } | |
55 | |
56 /* now we are ready: build format streams */ | |
57 st = av_new_stream(s, 0); | |
58 if (!st) | |
59 return AVERROR(ENOMEM); | |
60 | |
61 st->duration = (size * 8) / bps; | |
62 st->codec->codec_type = AVMEDIA_TYPE_AUDIO; | |
63 st->codec->codec_tag = id; | |
64 st->codec->codec_id = codec; | |
65 st->codec->channels = 1; | |
66 st->codec->sample_rate = rate; | |
67 | |
68 av_set_pts_info(st, 64, 1, rate); | |
69 | |
70 return 0; | |
71 } | |
72 | |
73 #define BLOCK_SIZE 1024 /* in samples */ | |
74 | |
75 static int rso_read_packet(AVFormatContext *s, AVPacket *pkt) | |
76 { | |
77 int bps = av_get_bits_per_sample(s->streams[0]->codec->codec_id); | |
78 int ret = av_get_packet(s->pb, pkt, BLOCK_SIZE * bps >> 3); | |
79 | |
80 if (ret < 0) | |
81 return ret; | |
82 | |
83 pkt->stream_index = 0; | |
84 | |
85 /* note: we need to modify the packet size here to handle the last packet */ | |
86 pkt->size = ret; | |
87 | |
88 return 0; | |
89 } | |
90 | |
91 AVInputFormat rso_demuxer = { | |
92 .name = "rso", | |
93 .long_name = NULL_IF_CONFIG_SMALL("Lego Mindstorms RSO format"), | |
94 .extensions = "rso", | |
95 .priv_data_size = 0, | |
96 .read_probe = NULL, /* no magic value in this format */ | |
97 .read_header = rso_read_header, | |
98 .read_packet = rso_read_packet, | |
99 .read_close = NULL, | |
100 .read_seek = pcm_read_seek, | |
101 .codec_tag = (const AVCodecTag* const []){ff_codec_rso_tags, 0}, | |
102 }; |