diff --git a/libavformat/raw.c b/libavformat/raw.c index 68b8e01228..41a6546915 100644 --- a/libavformat/raw.c +++ b/libavformat/raw.c @@ -1,6 +1,7 @@ /* * RAW encoder and decoder * Copyright (c) 2001 Fabrice Bellard. + * Copyright (c) 2005 Alex Beregszaszi * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -120,6 +121,42 @@ static int raw_read_partial_packet(AVFormatContext *s, AVPacket *pkt) return ret; } +// http://www.artificis.hu/files/texts/ingenient.txt +static int ingenient_read_packet(AVFormatContext *s, AVPacket *pkt) +{ + int ret, size, w, h, unk1, unk2; + + if (get_le32(&s->pb) != MKTAG('M', 'J', 'P', 'G')) + return AVERROR_IO; // FIXME + + size = get_le32(&s->pb); + + w = get_le16(&s->pb); + h = get_le16(&s->pb); + + url_fskip(&s->pb, 8); // zero + size (padded?) + url_fskip(&s->pb, 2); + unk1 = get_le16(&s->pb); + unk2 = get_le16(&s->pb); + url_fskip(&s->pb, 22); // ascii timestamp + + av_log(NULL, AV_LOG_DEBUG, "Ingenient packet: size=%d, width=%d, height=%d, unk1=%d unk2=%d\n", + size, w, h, unk1, unk2); + + if (av_new_packet(pkt, size) < 0) + return AVERROR_IO; + + pkt->pos = url_ftell(&s->pb); + pkt->stream_index = 0; + ret = get_buffer(&s->pb, pkt->data, size); + if (ret <= 0) { + av_free_packet(pkt); + return AVERROR_IO; + } + pkt->size = ret; + return ret; +} + static int raw_read_close(AVFormatContext *s) { return 0; @@ -309,7 +346,7 @@ static int h261_probe(AVProbeData *p) AVInputFormat shorten_iformat = { "shn", - "raw shn", + "raw shorten", 0, NULL, shorten_read_header, @@ -516,6 +553,18 @@ AVInputFormat mjpeg_iformat = { .value = CODEC_ID_MJPEG, }; +AVInputFormat ingenient_iformat = { + "ingenient", + "Ingenient MJPEG", + 0, + NULL, + video_read_header, + ingenient_read_packet, + raw_read_close, + .extensions = "cgi", // FIXME + .value = CODEC_ID_MJPEG, +}; + #ifdef CONFIG_MUXERS AVOutputFormat mjpeg_oformat = { "mjpeg", @@ -714,6 +763,8 @@ int raw_init(void) av_register_input_format(&mjpeg_iformat); av_register_output_format(&mjpeg_oformat); + + av_register_input_format(&ingenient_iformat); av_register_input_format(&pcm_s16le_iformat); av_register_output_format(&pcm_s16le_oformat);