Opened 19 months ago

#9943 new enhancement

avformat/mpjpeg: should be more lenient when server fails to produce first boundary

Reported by: Ratchanan Srirattanamet Owned by:
Priority: normal Component: avformat
Version: unspecified Keywords:
Cc: Blocked By:
Blocking: Reproduced by developer: no
Analyzed by developer: no

Description

Summary of the bug: Some old cameras (e.g. D-Link DCS-5020L) produce a non-compliant multipart/x-mixed-replace stream which doesn't start with the boundary. This trips the mpjpeg parser with Invalid data found when processing input error. Since this format is autodetected, it should be able to handle this case.

Specifying -f mjpeg works around this issue. However, many library users don't allow specifying format directly, thus the workaround can't be applied there.

Attached picture is the first parts of the camera's response, captured from Wireshark. I want to just provide you the Wireshark dump, but I would have to find a way to redact e.g. my credentials from it.

Reproducible on ffmpeg 4.4.2 and John Van Sickle's static Linux build built on 2022-09-10.

How to reproduce:

$ ./ffprobe -report -v 9 -loglevel 99 -i http://<redacted>/mjpeg.cgi
ffprobe started on 2022-09-26 at 14:37:10
Report written to "ffprobe-20220926-143710.log"
Log level: 99
Command line:
./ffprobe -report -v 9 -loglevel 99 -i "http://<redacted>/mjpeg.cgi"
ffprobe version N-63101-gc92edd969a-static https://johnvansickle.com/ffmpeg/  Copyright (c) 2007-2022 the FFmpeg developers
  built with gcc 8 (Debian 8.3.0-6)
  configuration: --enable-gpl --enable-version3 --enable-static --disable-debug --disable-ffplay --disable-indev=sndio --disable-outdev=sndio --cc=gcc --enable-fontconfig --enable-frei0r --enable-gnutls --enable-gmp --enable-libgme --enable-gray --enable-libaom --enable-libfribidi --enable-libass --enable-libvmaf --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-librubberband --enable-libsoxr --enable-libspeex --enable-libsrt --enable-libvorbis --enable-libopus --enable-libtheora --enable-libvidstab --enable-libvo-amrwbenc --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libdav1d --enable-libxvid --enable-libzvbi --enable-libzimg
  libavutil      57. 36.101 / 57. 36.101
  libavcodec     59. 42.104 / 59. 42.104
  libavformat    59. 30.101 / 59. 30.101
  libavdevice    59.  8.101 / 59.  8.101
  libavfilter     8. 48.100 /  8. 48.100
  libswscale      6.  8.108 /  6.  8.108
  libswresample   4.  9.100 /  4.  9.100
  libpostproc    56.  7.100 / 56.  7.100
[NULL @ 0x69644c0] Opening 'http://<redacted>/mjpeg.cgi' for reading
[http @ 0x6964d00] Setting default whitelist 'http,https,tls,rtp,tcp,udp,crypto,httpproxy,data'
[tcp @ 0x6967c00] Original list of addresses:
[tcp @ 0x6967c00] Address <redacted> port 80
[tcp @ 0x6967c00] Interleaved list of addresses:
[tcp @ 0x6967c00] Address <redacted> port 80
[tcp @ 0x6967c00] Starting connection attempt to <redacted> port 80
[tcp @ 0x6967c00] Successfully connected to <redacted> port 80
[http @ 0x6964d00] request: GET /mjpeg.cgi HTTP/1.1
User-Agent: Lavf/59.30.101
Accept: */*
Range: bytes=0-
Connection: close
Host: <redacted>
Icy-MetaData: 1


[http @ 0x6964d00] header='HTTP/1.0 401 Authorization Required'
[http @ 0x6964d00] http_code=401
[http @ 0x6964d00] header='Server: alphapd/2.1.8'
[http @ 0x6964d00] header='Date: Mon Sep 26 14:37:10 2022'
[http @ 0x6964d00] header='Pragma: no-cache'
[http @ 0x6964d00] header='Cache-Control: no-cache'
[http @ 0x6964d00] header='Content-type: text/html'
[http @ 0x6964d00] header='Content-length: 103'
[http @ 0x6964d00] header='WWW-Authenticate: Basic realm="NIPCA"'
[http @ 0x6964d00] header=''
[tcp @ 0x6968200] Original list of addresses:
[tcp @ 0x6968200] Address <redacted> port 80
[tcp @ 0x6968200] Interleaved list of addresses:
[tcp @ 0x6968200] Address <redacted> port 80
[tcp @ 0x6968200] Starting connection attempt to <redacted> port 80
[tcp @ 0x6968200] Successfully connected to <redacted> port 80
[http @ 0x6964d00] request: GET /mjpeg.cgi HTTP/1.1
User-Agent: Lavf/59.30.101
Accept: */*
Range: bytes=0-
Connection: close
Host: <redacted>
Icy-MetaData: 1
Authorization: Basic <redacted>


[http @ 0x6964d00] header='HTTP/1.0 200 OK'
[http @ 0x6964d00] http_code=200
[http @ 0x6964d00] header='Server: alphapd/2.1.8'
[http @ 0x6964d00] header='Date: Mon Sep 26 14:37:10 2022'
[http @ 0x6964d00] header='Pragma: no-cache'
[http @ 0x6964d00] header='Cache-Control: no-cache'
[http @ 0x6964d00] header='Content-Type: multipart/x-mixed-replace;boundary=--video boundary--'
[http @ 0x6964d00] header=''
Probing mpjpeg score:0 increased to 75 due to MIME type
[mpjpeg @ 0x69644c0] Format mpjpeg probed with size=2048 and score=75
[AVIOContext @ 0x6978780] Statistics: 3000 bytes read, 0 seeks
http://<redacted>/mjpeg.cgi: Invalid data found when processing input

Attachments (1)

ภาพหน้าจอจากเมื่อ 2022-09-26 02-49-43.png (82.0 KB ) - added by Ratchanan Srirattanamet 19 months ago.
Screenshot from Wireshark showing the start of non-compliant stream

Download all attachments as: .zip

Change History (1)

by Ratchanan Srirattanamet, 19 months ago

Screenshot from Wireshark showing the start of non-compliant stream

Note: See TracTickets for help on using tickets.