FFmpeg
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
Examples
File List
Globals
•
All
Data Structures
Namespaces
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
0;
30
31
if
(!
AV_RL32
(p->
buf
+ 16) ||
AV_RL32
(p->
buf
+ 16) > 256)
32
return
AVPROBE_SCORE_MAX
/ 8;
33
34
return
AVPROBE_SCORE_EXTENSION
;
35
}
36
37
static
int
lvf_read_header
(
AVFormatContext
*
s
)
38
{
39
AVStream
*st;
40
int64_t next_offset;
41
unsigned
size
, nb_streams,
id
;
42
43
avio_skip
(s->
pb
, 16);
44
nb_streams =
avio_rl32
(s->
pb
);
45
if
(!nb_streams)
46
return
AVERROR_INVALIDDATA
;
47
if
(nb_streams > 2) {
48
avpriv_request_sample
(s,
"%d streams"
, nb_streams);
49
return
AVERROR_PATCHWELCOME
;
50
}
51
52
avio_skip
(s->
pb
, 1012);
53
54
while
(!
url_feof
(s->
pb
)) {
55
id
=
avio_rl32
(s->
pb
);
56
size =
avio_rl32
(s->
pb
);
57
next_offset =
avio_tell
(s->
pb
) +
size
;
58
59
switch
(
id
) {
60
case
MKTAG
(
'0'
,
'0'
,
'f'
,
'm'
):
61
st =
avformat_new_stream
(s, 0);
62
if
(!st)
63
return
AVERROR
(ENOMEM);
64
65
st->
codec
->
codec_type
=
AVMEDIA_TYPE_VIDEO
;
66
avio_skip
(s->
pb
, 4);
67
st->
codec
->
width
=
avio_rl32
(s->
pb
);
68
st->
codec
->
height
=
avio_rl32
(s->
pb
);
69
avio_skip
(s->
pb
, 4);
70
st->
codec
->
codec_tag
=
avio_rl32
(s->
pb
);
71
st->
codec
->
codec_id
=
ff_codec_get_id
(
ff_codec_bmp_tags
,
72
st->
codec
->
codec_tag
);
73
avpriv_set_pts_info
(st, 32, 1, 1000);
74
break
;
75
case
MKTAG
(
'0'
,
'1'
,
'f'
,
'm'
):
76
st =
avformat_new_stream
(s, 0);
77
if
(!st)
78
return
AVERROR
(ENOMEM);
79
80
st->
codec
->
codec_type
=
AVMEDIA_TYPE_AUDIO
;
81
st->
codec
->
codec_tag
=
avio_rl16
(s->
pb
);
82
st->
codec
->
channels
=
avio_rl16
(s->
pb
);
83
st->
codec
->
sample_rate
=
avio_rl16
(s->
pb
);
84
avio_skip
(s->
pb
, 8);
85
st->
codec
->
bits_per_coded_sample
=
avio_r8
(s->
pb
);
86
st->
codec
->
codec_id
=
ff_codec_get_id
(
ff_codec_wav_tags
,
87
st->
codec
->
codec_tag
);
88
avpriv_set_pts_info
(st, 32, 1, 1000);
89
break
;
90
case
0:
91
avio_seek
(s->
pb
, 2048 + 8, SEEK_SET);
92
return
0;
93
default
:
94
avpriv_request_sample
(s,
"id %d"
,
id
);
95
return
AVERROR_PATCHWELCOME
;
96
}
97
98
avio_seek
(s->
pb
, next_offset, SEEK_SET);
99
}
100
101
return
AVERROR_EOF
;
102
}
103
104
static
int
lvf_read_packet
(
AVFormatContext
*
s
,
AVPacket
*
pkt
)
105
{
106
unsigned
size
,
flags
, timestamp,
id
;
107
int64_t pos;
108
int
ret
, is_video = 0;
109
110
pos =
avio_tell
(s->
pb
);
111
while
(!
url_feof
(s->
pb
)) {
112
id
=
avio_rl32
(s->
pb
);
113
size =
avio_rl32
(s->
pb
);
114
115
if
(size == 0xFFFFFFFFu)
116
return
AVERROR_EOF
;
117
118
switch
(
id
) {
119
case
MKTAG
(
'0'
,
'0'
,
'd'
,
'c'
):
120
is_video = 1;
121
case
MKTAG
(
'0'
,
'1'
,
'w'
,
'b'
):
122
if
(size < 8)
123
return
AVERROR_INVALIDDATA
;
124
timestamp =
avio_rl32
(s->
pb
);
125
flags =
avio_rl32
(s->
pb
);
126
ret =
av_get_packet
(s->
pb
, pkt, size - 8);
127
if
(flags & (1 << 12))
128
pkt->
flags
|=
AV_PKT_FLAG_KEY
;
129
pkt->
stream_index
= is_video ? 0 : 1;
130
pkt->
pts
= timestamp;
131
pkt->
pos
= pos;
132
return
ret
;
133
default
:
134
ret =
avio_skip
(s->
pb
, size);
135
}
136
137
if
(ret < 0)
138
return
ret
;
139
}
140
141
return
AVERROR_EOF
;
142
}
143
144
AVInputFormat
ff_lvf_demuxer
= {
145
.
name
=
"lvf"
,
146
.long_name =
NULL_IF_CONFIG_SMALL
(
"LVF"
),
147
.read_probe =
lvf_probe
,
148
.read_header =
lvf_read_header
,
149
.read_packet =
lvf_read_packet
,
150
.extensions =
"lvf"
,
151
.flags =
AVFMT_GENERIC_INDEX
,
152
};
Generated on Sun Mar 23 2014 23:50:11 for FFmpeg by
1.8.2