[FFmpeg-user] new error

Moritz Barsnick barsnick at gmx.net
Wed Aug 10 17:08:01 EEST 2016


On Tue, Aug 09, 2016 at 19:47:21 +0200, juan carlos Rebate wrote:

Can we take this discussion away from all the debate, and get
technical? Juan Carlos asked:

> ffmpeg -i video.avi mime_type video/mp4 -listen 1 http://ip:80
[and yes, he forgot to quote the missing dash]

So I attempted:
$ ffmpeg -f lavfi -i testsrc=d=1 -c:v libx264 -mime_type application/foobar -listen 1 -f flv http://127.0.0.1:8999
ffmpeg version N-81308-g369ed11 Copyright (c) 2000-2016 the FFmpeg developers
  built with icc (ICC) 14.0.3 20140422
  configuration: --prefix=/usr/new/tools/video/install/ffmpeg/2016-08-09 --cc=icc --cxx=icpc --enable-gpl --enable-version3 --enable-nonfree --disable-shared --enable-gnutls --enable-libcdio --enable-libfreetype --enable-libx264 --enable-libvpx --enable-libmp3lame --enable-openal --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libtwolame --enable-libopenjpeg --enable-librtmp --enable-libass --enable-libv4l2 --enable-libvidstab --enable-libfdk-aac --enable-libsmbclient --enable-libzvbi --enable-libtesseract --enable-libzmq
  libavutil      55. 28.100 / 55. 28.100
  libavcodec     57. 51.100 / 57. 51.100
  libavformat    57. 46.100 / 57. 46.100
  libavdevice    57.  0.102 / 57.  0.102
  libavfilter     6. 50.100 /  6. 50.100
  libswscale      4.  1.100 /  4.  1.100
  libswresample   2.  1.100 /  2.  1.100
  libpostproc    54.  0.100 / 54.  0.100
Input #0, lavfi, from 'testsrc=d=1':
  Duration: N/A, start: 0.000000, bitrate: N/A
    Stream #0:0: Video: rawvideo (RGB[24] / 0x18424752), rgb24, 320x240 [SAR 1:1 DAR 4:3], 25 tbr, 25 tbn, 25 tbc
[http @ 0xbce0dc0] Error setting option mime_type to value application/foobar.
http://127.0.0.1:8999: Invalid argument

If I omit "-mime_type application/foobar", the http protocol works as
expected.

The error message does come from the http protocol (format?) as can be
seen from the context ("[http @ ...]"). The message text comes from the
generic option parser.

I believe the cause is that the "mime_type" option is flagged
"AV_OPT_FLAG_READONLY" - actually the only such option within all of
ffmpeg.

libavformat/http.c:137:
    { "mime_type", "export the MIME type", OFFSET(mime_type), AV_OPT_TYPE_STRING, { .str = NULL }, 0, 0, AV_OPT_FLAG_EXPORT | AV_OPT_FLAG_READONLY },

Such an option is described as such:
 * The option may not be set through the AVOptions API, only read.

Removing the "AV_OPT_FLAG_READONLY" flag in http.c does allow the
option to be given on the command line without error, but the http
protocol doesn't do anything with it. It is indeed a read-only option.

The documentation says:
mime_type
    Export the MIME type.

But I think it's only designed for the http demuxer protocol, and it's
not useful for the command line, because it takes a string argument,
but you're not actually allowed to set it. So the documentation must be
misleading here.

And yes, I do understand that the mime_type is not the Content-Type.
It's probably an extracted interpretation of the Content-Type on the
HTTP receiving end, I guess. But the documentation is misleading anyway.

I looked at the alternatives:

headers
    Set custom HTTP headers, can override built in default headers. The value must be a string encoding the headers.

This does not work for the listen mode. That may be a bug.

content_type
    Set a specific content type for the POST messages.

This does not work for the listen mode (and it obviously isn't
documented to do so).

So, I don't currently see any way to set the Content-Type header for
listen mode, apart from expanding the code. My really easy suggestion
for a code change to support this:

--- ./libavformat/http.c.orig   2016-06-17 19:20:02.000000000 +0200
+++ ./libavformat/http.c        2016-08-10 15:50:17.000000000 +0200
@@ -355,7 +355,7 @@
     case 200:
         reply_code = 200;
         reply_text = "OK";
-        content_type = "application/octet-stream";
+        content_type = s->content_type ? s->content_type : "application/octet-stream";
         break;
     case AVERROR_HTTP_SERVER_ERROR:
     case 500:

(Works for me(TM).)
I might put this (plus a doc change) up for review on ffmpeg-devel,
unless someone quickly tells me it's nonsense. ;-)

Moritz

P.S.: I'm not sure whether changing the Content-Type was juan carlos's
      intention, he always forgets to write precisely what he wanted to
      achieve. Let's just pretent it was *my* intention now.


More information about the ffmpeg-user mailing list