FFmpeg
Main Page
Related Pages
Modules
Data Structures
Files
Examples
File List
Globals
All
Data Structures
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
libavformat
lvfdec.c
Go to the documentation of this file.
1
/*
2
* LVF demuxer
3
* Copyright (c) 2012 Paul B Mahol
4
*
5
* This file is part of FFmpeg.
6
*
7
* FFmpeg is free software; you can redistribute it and/or
8
* modify it under the terms of the GNU Lesser General Public
9
* License as published by the Free Software Foundation; either
10
* version 2.1 of the License, or (at your option) any later version.
11
*
12
* FFmpeg is distributed in the hope that it will be useful,
13
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15
* Lesser General Public License for more details.
16
*
17
* You should have received a copy of the GNU Lesser General Public
18
* License along with FFmpeg; if not, write to the Free Software
19
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20
*/
21
22
#include "
libavutil/intreadwrite.h
"
23
#include "
avformat.h
"
24
#include "
riff.h
"
25
26
static
int
lvf_probe
(
AVProbeData
*p)
27
{
28
if
(
AV_RL32
(p->
buf
) ==
MKTAG
(
'L'
,
'V'
,
'F'
,
'F'
))
29
return
AVPROBE_SCORE_MAX
/ 2;
30
return
0;
31
}
32
33
static
int
lvf_read_header
(
AVFormatContext
*s)
34
{
35
AVStream
*st;
36
int64_t next_offset;
37
unsigned
size
, nb_streams,
id
;
38
39
avio_skip
(s->
pb
, 16);
40
nb_streams =
avio_rl32
(s->
pb
);
41
if
(!nb_streams)
42
return
AVERROR_INVALIDDATA
;
43
if
(nb_streams > 2) {
44
av_log_ask_for_sample
(s,
"too many streams\n"
);
45
return
AVERROR_PATCHWELCOME
;
46
}
47
48
avio_skip
(s->
pb
, 1012);
49
50
while
(!
url_feof
(s->
pb
)) {
51
id
=
avio_rl32
(s->
pb
);
52
size =
avio_rl32
(s->
pb
);
53
next_offset =
avio_tell
(s->
pb
) +
size
;
54
55
switch
(
id
) {
56
case
MKTAG
(
'0'
,
'0'
,
'f'
,
'm'
):
57
st =
avformat_new_stream
(s, 0);
58
if
(!st)
59
return
AVERROR
(ENOMEM);
60
61
st->
codec
->
codec_type
=
AVMEDIA_TYPE_VIDEO
;
62
avio_skip
(s->
pb
, 4);
63
st->
codec
->
width
=
avio_rl32
(s->
pb
);
64
st->
codec
->
height
=
avio_rl32
(s->
pb
);
65
avio_skip
(s->
pb
, 4);
66
st->
codec
->
codec_tag
=
avio_rl32
(s->
pb
);
67
st->
codec
->
codec_id
=
ff_codec_get_id
(
ff_codec_bmp_tags
,
68
st->
codec
->
codec_tag
);
69
avpriv_set_pts_info
(st, 32, 1, 1000);
70
break
;
71
case
MKTAG
(
'0'
,
'1'
,
'f'
,
'm'
):
72
st =
avformat_new_stream
(s, 0);
73
if
(!st)
74
return
AVERROR
(ENOMEM);
75
76
st->
codec
->
codec_type
=
AVMEDIA_TYPE_AUDIO
;
77
st->
codec
->
codec_tag
=
avio_rl16
(s->
pb
);
78
st->
codec
->
channels
=
avio_rl16
(s->
pb
);
79
st->
codec
->
sample_rate
=
avio_rl16
(s->
pb
);
80
avio_skip
(s->
pb
, 8);
81
st->
codec
->
bits_per_coded_sample
=
avio_r8
(s->
pb
);
82
st->
codec
->
codec_id
=
ff_codec_get_id
(
ff_codec_wav_tags
,
83
st->
codec
->
codec_tag
);
84
avpriv_set_pts_info
(st, 32, 1, 1000);
85
break
;
86
case
0:
87
avio_seek
(s->
pb
, 2048 + 8, SEEK_SET);
88
return
0;
89
default
:
90
av_log_ask_for_sample
(s,
"unknown id\n"
);
91
return
AVERROR_PATCHWELCOME
;
92
}
93
94
avio_seek
(s->
pb
, next_offset, SEEK_SET);
95
}
96
97
return
AVERROR_EOF
;
98
}
99
100
static
int
lvf_read_packet
(
AVFormatContext
*s,
AVPacket
*
pkt
)
101
{
102
unsigned
size
,
flags
, timestamp,
id
;
103
int64_t pos;
104
int
ret, is_video = 0;
105
106
pos =
avio_tell
(s->
pb
);
107
while
(!
url_feof
(s->
pb
)) {
108
id
=
avio_rl32
(s->
pb
);
109
size =
avio_rl32
(s->
pb
);
110
111
if
(size == 0xFFFFFFFFu)
112
return
AVERROR_EOF
;
113
114
switch
(
id
) {
115
case
MKTAG
(
'0'
,
'0'
,
'd'
,
'c'
):
116
is_video = 1;
117
case
MKTAG
(
'0'
,
'1'
,
'w'
,
'b'
):
118
if
(size < 8)
119
return
AVERROR_INVALIDDATA
;
120
timestamp =
avio_rl32
(s->
pb
);
121
flags =
avio_rl32
(s->
pb
);
122
ret =
av_get_packet
(s->
pb
, pkt, size - 8);
123
if
(flags & (1 << 12))
124
pkt->
flags
|=
AV_PKT_FLAG_KEY
;
125
pkt->
stream_index
= is_video ? 0 : 1;
126
pkt->
pts
= timestamp;
127
pkt->
pos
= pos;
128
return
ret;
129
default
:
130
ret =
avio_skip
(s->
pb
, size);
131
}
132
133
if
(ret < 0)
134
return
ret;
135
}
136
137
return
AVERROR_EOF
;
138
}
139
140
AVInputFormat
ff_lvf_demuxer
= {
141
.
name
=
"lvf"
,
142
.long_name =
NULL_IF_CONFIG_SMALL
(
"LVF"
),
143
.read_probe =
lvf_probe
,
144
.read_header =
lvf_read_header
,
145
.read_packet =
lvf_read_packet
,
146
.extensions =
"lvf"
,
147
.flags =
AVFMT_GENERIC_INDEX
,
148
};
Generated on Sat May 25 2013 04:01:17 for FFmpeg by
1.8.2