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

Zalewa PL zalewapl at gmail.com
Fri Mar 9 21:43:48 CET 2012


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.
---
  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;
-- 
1.7.5.4


More information about the ffmpeg-devel mailing list