[FFmpeg-cvslog] mpjpeg: video streaming will no longer break and stop on Firefox

Zalewa PL git at videolan.org
Sat Mar 10 18:58:53 CET 2012


ffmpeg | branch: master | Zalewa PL <zalewapl at gmail.com> | Sat Mar 10 18:32:02 2012 +0100| [0d2f4eedc8a46892471c51cbc7a78cd9a489771a] | committer: Michael Niedermayer

mpjpeg: video streaming will no longer break and stop on Firefox

mpjpeg video streamings would break and stop on Firefox after 1 - 30
seconds.
In order to fix this, two changes were made:
1. Replaced all occurrences of '\n' character in mjpeg metadata
   with occurences of "\r\n".
2. Added "Content-length: <packet-size>" metadata entry for each
   sent frame.

The change has been tested on Google Chrome 17.0.963.78 and Firefox 10.0.2
on lubuntu 11.10 and the streaming seems to work fine now.

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=0d2f4eedc8a46892471c51cbc7a78cd9a489771a
---

 libavformat/mpjpeg.c |    9 ++++++---
 1 files changed, 6 insertions(+), 3 deletions(-)

diff --git a/libavformat/mpjpeg.c b/libavformat/mpjpeg.c
index 46a98b3..dce53ce 100644
--- a/libavformat/mpjpeg.c
+++ b/libavformat/mpjpeg.c
@@ -28,7 +28,7 @@ static int mpjpeg_write_header(AVFormatContext *s)
 {
     uint8_t buf1[256];
 
-    snprintf(buf1, sizeof(buf1), "--%s\n", BOUNDARY_TAG);
+    snprintf(buf1, sizeof(buf1), "--%s\r\n", BOUNDARY_TAG);
     avio_write(s->pb, buf1, strlen(buf1));
     avio_flush(s->pb);
     return 0;
@@ -38,11 +38,14 @@ static int mpjpeg_write_packet(AVFormatContext *s, AVPacket *pkt)
 {
     uint8_t buf1[256];
 
-    snprintf(buf1, sizeof(buf1), "Content-type: image/jpeg\n\n");
+    snprintf(buf1, sizeof(buf1), "Content-type: image/jpeg\r\n");
+    avio_write(s->pb, buf1, strlen(buf1));
+
+    snprintf(buf1, sizeof(buf1), "Content-length: %d\r\n\r\n", pkt->size);
     avio_write(s->pb, buf1, strlen(buf1));
     avio_write(s->pb, pkt->data, pkt->size);
 
-    snprintf(buf1, sizeof(buf1), "\n--%s\n", BOUNDARY_TAG);
+    snprintf(buf1, sizeof(buf1), "\r\n--%s\r\n", BOUNDARY_TAG);
     avio_write(s->pb, buf1, strlen(buf1));
     avio_flush(s->pb);
     return 0;



More information about the ffmpeg-cvslog mailing list