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
rawdec.c
Go to the documentation of this file.
1
/*
2
* RAW demuxers
3
* Copyright (c) 2001 Fabrice Bellard
4
* Copyright (c) 2005 Alex Beregszaszi
5
*
6
* This file is part of FFmpeg.
7
*
8
* FFmpeg is free software; you can redistribute it and/or
9
* modify it under the terms of the GNU Lesser General Public
10
* License as published by the Free Software Foundation; either
11
* version 2.1 of the License, or (at your option) any later version.
12
*
13
* FFmpeg is distributed in the hope that it will be useful,
14
* but WITHOUT ANY WARRANTY; without even the implied warranty of
15
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16
* Lesser General Public License for more details.
17
*
18
* You should have received a copy of the GNU Lesser General Public
19
* License along with FFmpeg; if not, write to the Free Software
20
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21
*/
22
23
#include "
avformat.h
"
24
#include "
internal.h
"
25
#include "
avio_internal.h
"
26
#include "
rawdec.h
"
27
#include "
libavutil/opt.h
"
28
#include "
libavutil/parseutils.h
"
29
#include "
libavutil/pixdesc.h
"
30
#include "
libavutil/avassert.h
"
31
#include "
libavutil/intreadwrite.h
"
32
33
#define RAW_PACKET_SIZE 1024
34
35
int
ff_raw_read_partial_packet
(
AVFormatContext
*
s
,
AVPacket
*
pkt
)
36
{
37
int
ret
,
size
;
38
39
size =
RAW_PACKET_SIZE
;
40
41
if
(
av_new_packet
(pkt, size) < 0)
42
return
AVERROR
(ENOMEM);
43
44
pkt->
pos
=
avio_tell
(s->
pb
);
45
pkt->
stream_index
= 0;
46
ret =
ffio_read_partial
(s->
pb
, pkt->
data
, size);
47
if
(ret < 0) {
48
av_free_packet
(pkt);
49
return
ret
;
50
}
51
av_shrink_packet
(pkt, ret);
52
return
ret
;
53
}
54
55
int
ff_raw_audio_read_header
(
AVFormatContext
*
s
)
56
{
57
AVStream
*st =
avformat_new_stream
(s, NULL);
58
if
(!st)
59
return
AVERROR
(ENOMEM);
60
st->
codec
->
codec_type
=
AVMEDIA_TYPE_AUDIO
;
61
st->
codec
->
codec_id
= s->
iformat
->
raw_codec_id
;
62
st->
need_parsing
=
AVSTREAM_PARSE_FULL_RAW
;
63
st->
start_time
= 0;
64
/* the parameters will be extracted from the compressed bitstream */
65
66
return
0;
67
}
68
69
/* MPEG-1/H.263 input */
70
int
ff_raw_video_read_header
(
AVFormatContext
*
s
)
71
{
72
AVStream
*st;
73
FFRawVideoDemuxerContext
*
s1
= s->
priv_data
;
74
int
ret
= 0;
75
76
77
st =
avformat_new_stream
(s, NULL);
78
if
(!st) {
79
ret =
AVERROR
(ENOMEM);
80
goto
fail;
81
}
82
83
st->
codec
->
codec_type
=
AVMEDIA_TYPE_VIDEO
;
84
st->
codec
->
codec_id
= s->
iformat
->
raw_codec_id
;
85
st->
need_parsing
=
AVSTREAM_PARSE_FULL_RAW
;
86
87
st->
codec
->
framerate
= s1->
framerate
;
88
st->
codec
->
time_base
=
av_inv_q
(s1->
framerate
);
89
avpriv_set_pts_info
(st, 64, 1, 1200000);
90
91
fail:
92
return
ret
;
93
}
94
95
static
int
ff_raw_data_read_header
(
AVFormatContext
*
s
)
96
{
97
AVStream
*st =
avformat_new_stream
(s, NULL);
98
if
(!st)
99
return
AVERROR
(ENOMEM);
100
st->
codec
->
codec_type
=
AVMEDIA_TYPE_DATA
;
101
st->
codec
->
codec_id
= s->
iformat
->
raw_codec_id
;
102
st->
start_time
= 0;
103
return
0;
104
}
105
106
/* Note: Do not forget to add new entries to the Makefile as well. */
107
108
#define OFFSET(x) offsetof(FFRawVideoDemuxerContext, x)
109
#define DEC AV_OPT_FLAG_DECODING_PARAM
110
const
AVOption
ff_rawvideo_options
[] = {
111
{
"framerate"
,
""
,
OFFSET
(framerate),
AV_OPT_TYPE_VIDEO_RATE
, {.str =
"25"
}, 0, 0,
DEC
},
112
{ NULL },
113
};
114
115
#if CONFIG_DATA_DEMUXER
116
AVInputFormat
ff_data_demuxer = {
117
.
name
=
"data"
,
118
.long_name =
NULL_IF_CONFIG_SMALL
(
"raw data"
),
119
.read_header =
ff_raw_data_read_header
,
120
.read_packet =
ff_raw_read_partial_packet
,
121
.raw_codec_id =
AV_CODEC_ID_NONE
,
122
.flags =
AVFMT_NOTIMESTAMPS
,
123
};
124
#endif
125
126
#if CONFIG_LATM_DEMUXER
127
128
AVInputFormat
ff_latm_demuxer = {
129
.
name
=
"latm"
,
130
.long_name =
NULL_IF_CONFIG_SMALL
(
"raw LOAS/LATM"
),
131
.read_header =
ff_raw_audio_read_header
,
132
.read_packet =
ff_raw_read_partial_packet
,
133
.flags =
AVFMT_GENERIC_INDEX
|
AVFMT_NOTIMESTAMPS
,
134
.extensions =
"latm"
,
135
.raw_codec_id =
AV_CODEC_ID_AAC_LATM
,
136
};
137
#endif
138
139
#if CONFIG_MJPEG_DEMUXER
140
static
int
mjpeg_probe(
AVProbeData
*p)
141
{
142
int
i;
143
int
state
= -1;
144
int
nb_invalid = 0;
145
int
nb_frames = 0;
146
147
for
(i=0; i<p->
buf_size
-2; i++) {
148
int
c
;
149
if
(p->
buf
[i] != 0xFF)
150
continue
;
151
c = p->
buf
[i+1];
152
switch
(c) {
153
case
0xD8:
154
state = 0xD8;
155
break
;
156
case
0xC0:
157
case
0xC1:
158
case
0xC2:
159
case
0xC3:
160
case
0xC5:
161
case
0xC6:
162
case
0xC7:
163
case
0xF7:
164
if
(state == 0xD8) {
165
state = 0xC0;
166
}
else
167
nb_invalid++;
168
break
;
169
case
0xDA:
170
if
(state == 0xC0) {
171
state = 0xDA;
172
}
else
173
nb_invalid++;
174
break
;
175
case
0xD9:
176
if
(state == 0xDA) {
177
state = 0xD9;
178
nb_frames++;
179
}
else
180
nb_invalid++;
181
break
;
182
default
:
183
if
( (c >= 0x02 && c <= 0xBF)
184
|| c == 0xC8) {
185
nb_invalid++;
186
}
187
}
188
}
189
190
if
(nb_invalid*4 + 1 < nb_frames) {
191
static
const
char
ct_jpeg[] =
"\r\nContent-Type: image/jpeg\r\n\r\n"
;
192
int
i;
193
194
for
(i=0; i<
FFMIN
(p->
buf_size
-
sizeof
(ct_jpeg), 100); i++)
195
if
(!memcmp(p->
buf
+ i, ct_jpeg,
sizeof
(ct_jpeg) - 1))
196
return
AVPROBE_SCORE_EXTENSION
;
197
198
if
(nb_invalid == 0 && nb_frames > 2)
199
return
AVPROBE_SCORE_EXTENSION
/ 2;
200
return
AVPROBE_SCORE_EXTENSION
/ 4;
201
}
202
203
return
0;
204
}
205
206
FF_DEF_RAWVIDEO_DEMUXER2
(mjpeg,
"raw MJPEG video"
, mjpeg_probe,
"mjpg,mjpeg,mpo"
,
AV_CODEC_ID_MJPEG
,
AVFMT_GENERIC_INDEX
|
AVFMT_NOTIMESTAMPS
)
207
#endif
208
209
#if CONFIG_MLP_DEMUXER
210
AVInputFormat
ff_mlp_demuxer = {
211
.
name
=
"mlp"
,
212
.long_name =
NULL_IF_CONFIG_SMALL
(
"raw MLP"
),
213
.read_header =
ff_raw_audio_read_header
,
214
.read_packet =
ff_raw_read_partial_packet
,
215
.flags =
AVFMT_GENERIC_INDEX
|
AVFMT_NOTIMESTAMPS
,
216
.extensions =
"mlp"
,
217
.raw_codec_id =
AV_CODEC_ID_MLP
,
218
};
219
#endif
220
221
#if CONFIG_TRUEHD_DEMUXER
222
AVInputFormat
ff_truehd_demuxer = {
223
.
name
=
"truehd"
,
224
.long_name =
NULL_IF_CONFIG_SMALL
(
"raw TrueHD"
),
225
.read_header =
ff_raw_audio_read_header
,
226
.read_packet =
ff_raw_read_partial_packet
,
227
.flags =
AVFMT_GENERIC_INDEX
|
AVFMT_NOTIMESTAMPS
,
228
.extensions =
"thd"
,
229
.raw_codec_id =
AV_CODEC_ID_TRUEHD
,
230
};
231
#endif
232
233
#if CONFIG_SHORTEN_DEMUXER
234
AVInputFormat
ff_shorten_demuxer = {
235
.
name
=
"shn"
,
236
.long_name =
NULL_IF_CONFIG_SMALL
(
"raw Shorten"
),
237
.read_header =
ff_raw_audio_read_header
,
238
.read_packet =
ff_raw_read_partial_packet
,
239
.flags =
AVFMT_NOBINSEARCH
|
AVFMT_NOGENSEARCH
|
AVFMT_NO_BYTE_SEEK
|
AVFMT_NOTIMESTAMPS
,
240
.extensions =
"shn"
,
241
.raw_codec_id =
AV_CODEC_ID_SHORTEN
,
242
};
243
#endif
244
245
#if CONFIG_VC1_DEMUXER
246
FF_DEF_RAWVIDEO_DEMUXER2
(vc1,
"raw VC-1"
, NULL,
"vc1"
,
AV_CODEC_ID_VC1
,
AVFMT_GENERIC_INDEX
|
AVFMT_NOTIMESTAMPS
)
247
#endif
Generated on Fri Dec 5 2014 04:42:01 for FFmpeg by
1.8.2