FFmpeg: libavformat/mpjpegdec.c Source File
Go to the documentation of this file. 1 /*
2 * Multipart JPEG format
3 * Copyright (c) 2015 Luca Barbato
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
25
30
38
40 {
41 char *end;
42
44 return;
45
48 *(--end) = '0円';
49 }
50
52 {
54
57
60
62 return 0;
63 }
64
66 {
68 int foundData = 0;
69
72
73 while (*
p !=
'0円' && *
p !=
':') {
75 foundData = 1;
76 }
78 }
81
85
87
90
93
94 return 0;
95 }
96
99 const char* expected_boundary,
100 void *log_ctx);
101
103 {
107 return 0;
108 }
109
111 {
115
116 if (
p->buf_size < 2 ||
p->buf[0] !=
'-' ||
p->buf[1] !=
'-')
117 return 0;
118
120
122
124 }
125
127 {
129 char boundary[70 + 2 + 1] = {0};
132
133 do {
137 } while (!boundary[0]);
138
139 if (strncmp(boundary, "--", 2))
141
143 if (!st)
145
148
150
152
153 return 0;
154 }
155
157 {
159
160 if (
val == LONG_MIN ||
val == LONG_MAX)
165 }
166
169 const char* expected_boundary,
170 void *log_ctx)
171 {
173 int found_content_type = 0;
175
177
178 // get the CRLF as empty string
182
183 /* some implementation do not provide the required
184 * initial CRLF (see rfc1341 7.2.1)
185 */
190 }
191
193 if (log_ctx)
196 "Expected boundary '%s' not found, instead found a line of %"SIZE_SPECIFIER " bytes\n",
197 expected_boundary,
199
201 }
202
205
209 break;
211 }
212
214 break;
215
220 break;
221
224 if (log_ctx)
226 "Unexpected %s : %s\n",
229 } else
230 found_content_type = 1;
234 if (log_ctx)
236 "Invalid Content-Length value : %s\n",
238 }
239 }
240
242 }
243
245 {
246 uint8_t *mime_type =
NULL;
247 const char *start;
248 const char *end;
251
252 /* get MIME type, and skip to the first parameter */
254 start = mime_type;
255 while (start !=
NULL && *start !=
'0円') {
256 start = strchr(start, ';');
257 if (!start)
258 break;
259
260 start = start+1;
261
263 start++;
264
266 end = strchr(start, ';');
267 if (end)
268 len = end - start - 1;
269 else
271
272 /* some endpoints may enclose the boundary
273 in Content-Type in quotes */
274 if (
len>2 && *start ==
'"' && start[
len-1] ==
'"' ) {
275 start++;
277 }
279 break;
280 }
281 }
282
284 return res;
285 }
286
288 {
291
294 uint8_t* boundary =
NULL;
297 }
298 if (boundary !=
NULL) {
302 } else {
305 }
310 }
312 }
313
317
319 /* size has been provided to us in MIME header */
321 } else {
322 /* no size was given -- we read until the next boundary or end-of-file */
324
326
328
331 /* scan the new data */
332 char *start;
333
336 do {
338 // got the boundary! rewind the stream
342 }
344 start++;
348 }
349
350 /* error or EOF occurred */
353 }
354 }
355
357 }
358
359 #define OFFSET(x) offsetof(MPJPEGDemuxContext, x)
360 #define DEC AV_OPT_FLAG_DECODING_PARAM
362 {
"strict_mime_boundary",
"require MIME boundaries match",
OFFSET(strict_mime_boundary),
AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1,
DEC },
364 };
365
371 };
372
376 .p.mime_type = "multipart/x-mixed-replace",
377 .p.extensions = "mjpg",
385 };
#define AV_OPT_SEARCH_CHILDREN
Search in possible children of the given object first.
#define AV_LOG_WARNING
Something somehow does not look correct.
Filter the word "frame" indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
enum AVMediaType codec_type
General type of the encoded data.
AVStream * avformat_new_stream(AVFormatContext *s, const struct AVCodec *c)
Add a new stream to a media file.
#define AVERROR_EOF
End of file.
char * av_asprintf(const char *fmt,...)
int av_strcasecmp(const char *a, const char *b)
Locale-independent case-insensitive compare.
static av_const int av_isspace(int c)
Locale-independent conversion of ASCII isspace.
int error
contains the error code or 0 if no error happened
void ffio_init_read_context(FFIOContext *s, const uint8_t *buffer, int buffer_size)
Wrap a buffer in an AVIOContext for reading.
static av_cold int read_close(AVFormatContext *ctx)
static av_always_inline int64_t avio_tell(AVIOContext *s)
ftell() equivalent for AVIOContext.
static double val(void *priv, double ch)
static int get_line(AVIOContext *pb, char *line, int line_size)
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
static int read_packet(void *opaque, uint8_t *buf, int buf_size)
static char * mpjpeg_get_boundary(AVIOContext *pb)
static void trim_right(char *p)
static int read_chunk(AVFormatContext *s)
int av_stristart(const char *str, const char *pfx, const char **ptr)
Return non-zero if pfx is a prefix of str independent of case.
static int parse_multipart_header(AVIOContext *pb, int *size, const char *expected_boundary, void *log_ctx)
AVCodecParameters * codecpar
Codec parameters associated with this stream.
#define LIBAVUTIL_VERSION_INT
Describe the class of an AVClass context structure.
const char * av_default_item_name(void *ptr)
Return the context name.
This structure contains the data a format has to probe a file.
const FFInputFormat ff_mpjpeg_demuxer
static const AVClass mpjpeg_demuxer_class
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
int ffio_ensure_seekback(AVIOContext *s, int64_t buf_size)
Ensures that the requested seekback buffer size will be available.
static int mpjpeg_read_probe(const AVProbeData *p)
static int mpjpeg_read_close(AVFormatContext *s)
static int mpjpeg_read_packet(AVFormatContext *s, AVPacket *pkt)
static int read_header(FFV1Context *f, RangeCoder *c)
static const AVOption mpjpeg_options[]
int av_strstart(const char *str, const char *pfx, const char **ptr)
Return non-zero if pfx is a prefix of str.
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf default value
int ff_get_line(AVIOContext *s, char *buf, int maxlen)
Read a whole line of text from AVIOContext.
static int split_tag_value(char **tag, char **value, char *line)
static int parse_content_length(const char *value)
int64_t avio_seek(AVIOContext *s, int64_t offset, int whence)
fseek() equivalent for AVIOContext.
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
int eof_reached
true if was unable to read due to error or eof
IDirect3DDxgiInterfaceAccess _COM_Outptr_ void ** p
static int mpjpeg_read_header(AVFormatContext *s)
char * av_strdup(const char *s)
Duplicate a string.
static int read_probe(const AVProbeData *p)
enum AVCodecID codec_id
Specific type of the encoded data (the codec used).
This structure stores compressed data.
@ AV_OPT_TYPE_BOOL
Underlying C type is int.
int64_t pos
byte position in stream, -1 if unknown
int av_opt_get(void *obj, const char *name, int search_flags, uint8_t **out_val)
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
char * av_strndup(const char *s, size_t len)
Duplicate a substring of a string.
The official guide to swscale for confused that consecutive non overlapping rectangles of slice_bottom special converter These generally are unscaled converters of common like for each output line the vertical scaler pulls lines from a ring buffer When the ring buffer does not contain the wanted line
Generated on Wed Nov 19 2025 19:23:18 for FFmpeg by
doxygen
1.8.17