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
dfa.c
Go to the documentation of this file.
1
/*
2
* Chronomaster DFA Format Demuxer
3
* Copyright (c) 2011 Konstantin Shishkov
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 <inttypes.h>
23
24
#include "
libavutil/intreadwrite.h
"
25
#include "
avformat.h
"
26
#include "
internal.h
"
27
28
static
int
dfa_probe
(
AVProbeData
*p)
29
{
30
if
(p->
buf_size
< 4 ||
AV_RL32
(p->
buf
) !=
MKTAG
(
'D'
,
'F'
,
'I'
,
'A'
))
31
return
0;
32
33
if
(
AV_RL32
(p->
buf
+ 16) != 0x80)
34
return
AVPROBE_SCORE_MAX
/ 4;
35
36
return
AVPROBE_SCORE_MAX
;
37
}
38
39
static
int
dfa_read_header
(
AVFormatContext
*
s
)
40
{
41
AVIOContext
*pb = s->
pb
;
42
AVStream
*st;
43
int
frames;
44
int
version
;
45
uint32_t mspf;
46
47
if
(
avio_rl32
(pb) !=
MKTAG
(
'D'
,
'F'
,
'I'
,
'A'
)) {
48
av_log
(s,
AV_LOG_ERROR
,
"Invalid magic for DFA\n"
);
49
return
AVERROR_INVALIDDATA
;
50
}
51
52
version =
avio_rl16
(pb);
53
frames =
avio_rl16
(pb);
54
55
st =
avformat_new_stream
(s,
NULL
);
56
if
(!st)
57
return
AVERROR
(ENOMEM);
58
59
st->
codec
->
codec_type
=
AVMEDIA_TYPE_VIDEO
;
60
st->
codec
->
codec_id
=
AV_CODEC_ID_DFA
;
61
st->
codec
->
width
=
avio_rl16
(pb);
62
st->
codec
->
height
=
avio_rl16
(pb);
63
mspf =
avio_rl32
(pb);
64
if
(!mspf) {
65
av_log
(s,
AV_LOG_WARNING
,
"Zero FPS reported, defaulting to 10\n"
);
66
mspf = 100;
67
}
68
avpriv_set_pts_info
(st, 24, mspf, 1000);
69
avio_skip
(pb, 128 - 16);
// padding
70
st->
duration
= frames;
71
72
if
(
ff_alloc_extradata
(st->
codec
, 2))
73
return
AVERROR
(ENOMEM);
74
AV_WL16
(st->
codec
->
extradata
, version);
75
if
(version == 0x100)
76
st->
sample_aspect_ratio
= (
AVRational
){2, 1};
77
78
return
0;
79
}
80
81
static
int
dfa_read_packet
(
AVFormatContext
*
s
,
AVPacket
*
pkt
)
82
{
83
AVIOContext
*pb = s->
pb
;
84
uint32_t
frame_size
;
85
int
ret
, first = 1;
86
87
if
(
avio_feof
(pb))
88
return
AVERROR_EOF
;
89
90
if
(
av_get_packet
(pb, pkt, 12) != 12)
91
return
AVERROR
(EIO);
92
while
(!
avio_feof
(pb)) {
93
if
(!first) {
94
ret =
av_append_packet
(pb, pkt, 12);
95
if
(ret < 0) {
96
av_free_packet
(pkt);
97
return
ret
;
98
}
99
}
else
100
first = 0;
101
frame_size =
AV_RL32
(pkt->
data
+ pkt->
size
- 8);
102
if
(frame_size > INT_MAX - 4) {
103
av_log
(s,
AV_LOG_ERROR
,
"Too large chunk size: %"
PRIu32
"\n"
, frame_size);
104
return
AVERROR
(EIO);
105
}
106
if
(
AV_RL32
(pkt->
data
+ pkt->
size
- 12) ==
MKTAG
(
'E'
,
'O'
,
'F'
,
'R'
)) {
107
if
(frame_size) {
108
av_log
(s,
AV_LOG_WARNING
,
109
"skipping %"
PRIu32
" bytes of end-of-frame marker chunk\n"
,
110
frame_size);
111
avio_skip
(pb, frame_size);
112
}
113
return
0;
114
}
115
ret =
av_append_packet
(pb, pkt, frame_size);
116
if
(ret < 0) {
117
av_free_packet
(pkt);
118
return
ret
;
119
}
120
}
121
122
return
0;
123
}
124
125
AVInputFormat
ff_dfa_demuxer
= {
126
.
name
=
"dfa"
,
127
.long_name =
NULL_IF_CONFIG_SMALL
(
"Chronomaster DFA"
),
128
.read_probe =
dfa_probe
,
129
.read_header =
dfa_read_header
,
130
.read_packet =
dfa_read_packet
,
131
.flags =
AVFMT_GENERIC_INDEX
,
132
};
Generated on Sun Mar 8 2015 02:34:50 for FFmpeg by
1.8.2