3 * Copyright (c) 2012 Paul B Mahol
5 * This file is part of FFmpeg.
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.
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.
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
22 #include "libavutil/intreadwrite.h"
26 static int lvf_probe(AVProbeData
*p
)
28 if (AV_RL32(p
->buf
) != MKTAG('L', 'V', 'F', 'F'))
31 if (!AV_RL32(p
->buf
+ 16) || AV_RL32(p
->buf
+ 16) > 256)
32 return AVPROBE_SCORE_MAX
/ 8;
34 return AVPROBE_SCORE_EXTENSION
;
37 static int lvf_read_header(AVFormatContext
*s
)
41 unsigned size
, nb_streams
, id
;
44 nb_streams
= avio_rl32(s
->pb
);
46 return AVERROR_INVALIDDATA
;
48 avpriv_request_sample(s
, "%d streams", nb_streams
);
49 return AVERROR_PATCHWELCOME
;
52 avio_skip(s
->pb
, 1012);
54 while (!avio_feof(s
->pb
)) {
55 id
= avio_rl32(s
->pb
);
56 size
= avio_rl32(s
->pb
);
57 next_offset
= avio_tell(s
->pb
) + size
;
60 case MKTAG('0', '0', 'f', 'm'):
61 st
= avformat_new_stream(s
, 0);
63 return AVERROR(ENOMEM
);
65 st
->codec
->codec_type
= AVMEDIA_TYPE_VIDEO
;
67 st
->codec
->width
= avio_rl32(s
->pb
);
68 st
->codec
->height
= avio_rl32(s
->pb
);
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);
75 case MKTAG('0', '1', 'f', 'm'):
76 st
= avformat_new_stream(s
, 0);
78 return AVERROR(ENOMEM
);
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
);
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);
91 avio_seek(s
->pb
, 2048 + 8, SEEK_SET
);
94 avpriv_request_sample(s
, "id %d", id
);
95 return AVERROR_PATCHWELCOME
;
98 avio_seek(s
->pb
, next_offset
, SEEK_SET
);
104 static int lvf_read_packet(AVFormatContext
*s
, AVPacket
*pkt
)
106 unsigned size
, flags
, timestamp
, id
;
108 int ret
, is_video
= 0;
110 pos
= avio_tell(s
->pb
);
111 while (!avio_feof(s
->pb
)) {
112 id
= avio_rl32(s
->pb
);
113 size
= avio_rl32(s
->pb
);
115 if (size
== 0xFFFFFFFFu
)
119 case MKTAG('0', '0', 'd', 'c'):
121 case MKTAG('0', '1', 'w', 'b'):
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
;
134 ret
= avio_skip(s
->pb
, size
);
144 AVInputFormat ff_lvf_demuxer
= {
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
,
151 .flags
= AVFMT_GENERIC_INDEX
,