1/* 2 * Multipart JPEG format 3 * Copyright (c) 2000, 2001, 2002, 2003 Fabrice Bellard 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#include "avformat.h" 22 23/* Multipart JPEG */ 24 25#define BOUNDARY_TAG "ffserver" 26 27static int mpjpeg_write_header(AVFormatContext *s) 28{ 29 uint8_t buf1[256]; 30 31 snprintf(buf1, sizeof(buf1), "--%s\r\n", BOUNDARY_TAG); 32 avio_write(s->pb, buf1, strlen(buf1)); 33 avio_flush(s->pb); 34 return 0; 35} 36 37static int mpjpeg_write_packet(AVFormatContext *s, AVPacket *pkt) 38{ 39 uint8_t buf1[256]; 40 41 snprintf(buf1, sizeof(buf1), "Content-type: image/jpeg\r\n"); 42 avio_write(s->pb, buf1, strlen(buf1)); 43 44 snprintf(buf1, sizeof(buf1), "Content-length: %d\r\n\r\n", pkt->size); 45 avio_write(s->pb, buf1, strlen(buf1)); 46 avio_write(s->pb, pkt->data, pkt->size); 47 48 snprintf(buf1, sizeof(buf1), "\r\n--%s\r\n", BOUNDARY_TAG); 49 avio_write(s->pb, buf1, strlen(buf1)); 50 return 0; 51} 52 53static int mpjpeg_write_trailer(AVFormatContext *s) 54{ 55 return 0; 56} 57 58AVOutputFormat ff_mpjpeg_muxer = { 59 .name = "mpjpeg", 60 .long_name = NULL_IF_CONFIG_SMALL("MIME multipart JPEG"), 61 .mime_type = "multipart/x-mixed-replace;boundary=" BOUNDARY_TAG, 62 .extensions = "mjpg", 63 .audio_codec = AV_CODEC_ID_NONE, 64 .video_codec = AV_CODEC_ID_MJPEG, 65 .write_header = mpjpeg_write_header, 66 .write_packet = mpjpeg_write_packet, 67 .write_trailer = mpjpeg_write_trailer, 68 .flags = AVFMT_NOTIMESTAMPS, 69}; 70