6063
|
1 /*
|
|
2 * Copyright (c) 2010 David Conrad
|
|
3 *
|
|
4 * This file is part of FFmpeg.
|
|
5 *
|
|
6 * FFmpeg is free software; you can redistribute it and/or
|
|
7 * modify it under the terms of the GNU Lesser General Public
|
|
8 * License as published by the Free Software Foundation; either
|
|
9 * version 2.1 of the License, or (at your option) any later version.
|
|
10 *
|
|
11 * FFmpeg is distributed in the hope that it will be useful,
|
|
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
14 * Lesser General Public License for more details.
|
|
15 *
|
|
16 * You should have received a copy of the GNU Lesser General Public
|
|
17 * License along with FFmpeg; if not, write to the Free Software
|
|
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
19 */
|
|
20
|
|
21 #include "avformat.h"
|
|
22 #include "riff.h"
|
|
23 #include "libavutil/intreadwrite.h"
|
|
24
|
|
25 static int probe(AVProbeData *p)
|
|
26 {
|
|
27 if (AV_RL32(p->buf) == MKTAG('D','K','I','F')
|
|
28 && !AV_RL16(p->buf+4) && AV_RL16(p->buf+6) == 32)
|
|
29 return AVPROBE_SCORE_MAX-2;
|
|
30
|
|
31 return 0;
|
|
32 }
|
|
33
|
|
34 static int read_header(AVFormatContext *s, AVFormatParameters *ap)
|
|
35 {
|
|
36 AVStream *st;
|
|
37 AVRational time_base;
|
|
38
|
|
39 get_le32(s->pb); // DKIF
|
|
40 get_le16(s->pb); // version
|
|
41 get_le16(s->pb); // header size
|
|
42
|
|
43 st = av_new_stream(s, 0);
|
|
44 if (!st)
|
|
45 return AVERROR(ENOMEM);
|
|
46
|
|
47
|
|
48 st->codec->codec_type = AVMEDIA_TYPE_VIDEO;
|
|
49 st->codec->codec_tag = get_le32(s->pb);
|
|
50 st->codec->codec_id = ff_codec_get_id(ff_codec_bmp_tags, st->codec->codec_tag);
|
|
51 st->codec->width = get_le16(s->pb);
|
|
52 st->codec->height = get_le16(s->pb);
|
|
53 time_base.den = get_le32(s->pb);
|
|
54 time_base.num = get_le32(s->pb);
|
|
55 st->duration = get_le64(s->pb);
|
|
56
|
|
57 st->need_parsing = AVSTREAM_PARSE_HEADERS;
|
|
58
|
|
59 if (!time_base.den || !time_base.num) {
|
|
60 av_log(s, AV_LOG_ERROR, "Invalid frame rate\n");
|
|
61 return AVERROR_INVALIDDATA;
|
|
62 }
|
|
63
|
|
64 av_set_pts_info(st, 64, time_base.num, time_base.den);
|
|
65
|
|
66 return 0;
|
|
67 }
|
|
68
|
|
69 static int read_packet(AVFormatContext *s, AVPacket *pkt)
|
|
70 {
|
|
71 int ret, size = get_le32(s->pb);
|
|
72 int64_t pts = get_le64(s->pb);
|
|
73
|
|
74 ret = av_get_packet(s->pb, pkt, size);
|
|
75 pkt->stream_index = 0;
|
|
76 pkt->pts = pts;
|
|
77 pkt->pos -= 12;
|
|
78
|
|
79 return ret;
|
|
80 }
|
|
81
|
|
82 AVInputFormat ivf_demuxer = {
|
|
83 "ivf",
|
|
84 NULL_IF_CONFIG_SMALL("On2 IVF"),
|
|
85 0,
|
|
86 probe,
|
|
87 read_header,
|
|
88 read_packet,
|
|
89 .flags= AVFMT_GENERIC_INDEX,
|
|
90 .codec_tag = (const AVCodecTag*[]){ff_codec_bmp_tags, 0},
|
|
91 };
|