#include "config_components.h"
#include "avformat.h"
#include "demux.h"
#include "internal.h"
#include "rawdec.h"
#include "libavutil/opt.h"
#define RAW_PACKET_SIZE …
int ff_raw_read_partial_packet(AVFormatContext *s, AVPacket *pkt)
{ … }
int ff_raw_audio_read_header(AVFormatContext *s)
{ … }
int ff_raw_video_read_header(AVFormatContext *s)
{ … }
int ff_raw_subtitle_read_header(AVFormatContext *s)
{ … }
static int raw_data_read_header(AVFormatContext *s)
{ … }
#define OFFSET(x) …
#define DEC …
static const AVOption rawvideo_options[] = …;
#undef OFFSET
const AVClass ff_rawvideo_demuxer_class = …;
#define OFFSET(x) …
static const AVOption raw_options[] = …;
const AVClass ff_raw_demuxer_class = …;
#if CONFIG_DATA_DEMUXER
const FFInputFormat ff_data_demuxer = {
.p.name = "data",
.p.long_name = NULL_IF_CONFIG_SMALL("raw data"),
.p.flags = AVFMT_NOTIMESTAMPS,
.p.priv_class = &ff_raw_demuxer_class,
.read_header = raw_data_read_header,
.read_packet = ff_raw_read_partial_packet,
.raw_codec_id = AV_CODEC_ID_NONE,
.priv_data_size = sizeof(FFRawDemuxerContext),\
};
#endif
#if CONFIG_MJPEG_DEMUXER
static int mjpeg_probe(const AVProbeData *p)
{
int i;
int state = -1;
int nb_invalid = 0;
int nb_frames = 0;
for (i = 0; i < p->buf_size - 1; i++) {
int c;
if (p->buf[i] != 0xFF)
continue;
c = p->buf[i+1];
switch (c) {
case 0xD8:
state = 0xD8;
break;
case 0xC0:
case 0xC1:
case 0xC2:
case 0xC3:
case 0xC5:
case 0xC6:
case 0xC7:
case 0xF7:
if (state == 0xD8) {
state = 0xC0;
} else
nb_invalid++;
break;
case 0xDA:
if (state == 0xC0) {
state = 0xDA;
} else
nb_invalid++;
break;
case 0xD9:
if (state == 0xDA) {
state = 0xD9;
nb_frames++;
} else
nb_invalid++;
break;
default:
if ( (c >= 0x02 && c <= 0xBF)
|| c == 0xC8) {
nb_invalid++;
}
}
}
if (nb_invalid*4 + 1 < nb_frames) {
static const char ct_jpeg[] = "\r\nContent-Type: image/jpeg\r\n";
int i;
for (i=0; i<FFMIN(p->buf_size - (int)sizeof(ct_jpeg), 100); i++)
if (!memcmp(p->buf + i, ct_jpeg, sizeof(ct_jpeg) - 1))
return AVPROBE_SCORE_EXTENSION;
if (nb_invalid == 0 && nb_frames > 2)
return AVPROBE_SCORE_EXTENSION / 2;
return AVPROBE_SCORE_EXTENSION / 4;
}
if (!nb_invalid && nb_frames)
return AVPROBE_SCORE_EXTENSION / 4;
return 0;
}
FF_DEF_RAWVIDEO_DEMUXER2(mjpeg, "raw MJPEG video", mjpeg_probe, "mjpg,mjpeg,mpo", AV_CODEC_ID_MJPEG, AVFMT_GENERIC_INDEX|AVFMT_NOTIMESTAMPS)
#endif