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