Main Page
Related Pages
Modules
Data Structures
Files
Examples
File List
Globals
libavformat
rsodec.c
Go to the documentation of this file.
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 Libav.
7
*
8
* Libav 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
* Libav 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 Libav; 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 "
pcm.h
"
27
#include "
riff.h
"
28
#include "
rso.h
"
29
30
static
int
rso_read_header
(
AVFormatContext
*s,
AVFormatParameters
*ap)
31
{
32
AVIOContext
*pb = s->
pb
;
33
int
id
, rate,
bps
;
34
unsigned
int
size
;
35
enum
CodecID
codec;
36
AVStream
*st;
37
38
id
=
avio_rb16
(pb);
39
size =
avio_rb16
(pb);
40
rate =
avio_rb16
(pb);
41
avio_rb16
(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 =
avformat_new_stream
(s,
NULL
);
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
avpriv_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
ff_rso_demuxer
= {
92
.
name
=
"rso"
,
93
.long_name =
NULL_IF_CONFIG_SMALL
(
"Lego Mindstorms RSO format"
),
94
.extensions =
"rso"
,
95
.read_header =
rso_read_header
,
96
.read_packet =
rso_read_packet
,
97
.read_seek =
pcm_read_seek
,
98
.codec_tag = (
const
AVCodecTag
*
const
[]){
ff_codec_rso_tags
, 0},
99
};