[FFmpeg-user] h264_videotoolbox encoder

Alfred E. Heggestad alfred.heggestad at gmail.com
Fri Nov 9 23:18:59 EET 2018


Hi,


I would like to provide some feedback regarding the
h264_videotoolbox encoder.


Version info first:

$ ffmpeg -version
ffmpeg version 4.1 Copyright (c) 2000-2018 the FFmpeg developers
built with Apple LLVM version 8.1.0 (clang-802.0.38)
configuration: --prefix=/usr/local/Cellar/ffmpeg/4.1 --enable-shared 
--enable-pthreads --enable-version3 --enable-hardcoded-tables 
--enable-avresample --cc=clang --host-cflags= --host-ldflags= 
--enable-ffplay --enable-gpl --enable-libmp3lame --enable-libopus 
--enable-libsnappy --enable-libtheora --enable-libvorbis --enable-libvpx 
--enable-libx264 --enable-libx265 --enable-libxvid --enable-lzma 
--enable-libfdk-aac --enable-opencl --enable-videotoolbox --enable-nonfree
libavutil      56. 22.100 / 56. 22.100
libavcodec     58. 35.100 / 58. 35.100
libavformat    58. 20.100 / 58. 20.100
libavdevice    58.  5.100 / 58.  5.100
libavfilter     7. 40.101 /  7. 40.101
libavresample   4.  0.  0 /  4.  0.  0
libswscale      5.  3.100 /  5.  3.100
libswresample   3.  3.100 /  3.  3.100
libpostproc    55.  3.100 / 55.  3.100


Hardware:

my machine is Macbook Pro with OSX 10.13.6
CPU: 2,3 GHz Intel Core i7
GPU: NVIDIA GeForce GT 750M 2048 MB and Intel Iris Pro 1536 MB



I tried to use the "h264_videotoolbox" encoder both from
an application and from the command line, but it always failed
with the error code "-12915". I verified that my GPU have
support for H.264 encoder hardware acceleration. So I was
a bit puzzled.


I tried different resolutions, and it suddenly started to work!


Here are some resolutions that I tested:

    320 x  240    Not working
    640 ×  480    Working
   1280 ×  720    Working
   1920 × 1080    Working



my assumption now is that there is a limitation regarding
supported resolutions in the Nvidia GPU. please correct me if
I am wrong. it appears that the limitation is in the VideoToolbox
framework, and not in libavcodec (I have tested using the
VideoToolbox API directly with the same results).



This email is mainly for information, in case other people
are trying to use the same h264_videotoolbox encoder.


The application using libavcodec is a SIP client
with video, please take a look if you want:

   https://github.com/alfredh/baresip/tree/master/modules/avcodec


(Btw, my objective is to use HW-accelerated video codecs
  for real-time video streaming)


Below are output from 2 ffmpeg sessions; one working
and one non-working:


#
# Not working
#

$ ffmpeg -y -i ik.mkv -c:v h264_videotoolbox output.mp4
ffmpeg version 4.1 Copyright (c) 2000-2018 the FFmpeg developers
   built with Apple LLVM version 8.1.0 (clang-802.0.38)
   configuration: --prefix=/usr/local/Cellar/ffmpeg/4.1 --enable-shared 
--enable-pthreads --enable-version3 --enable-hardcoded-tables 
--enable-avresample --cc=clang --host-cflags= --host-ldflags= 
--enable-ffplay --enable-gpl --enable-libmp3lame --enable-libopus 
--enable-libsnappy --enable-libtheora --enable-libvorbis --enable-libvpx 
--enable-libx264 --enable-libx265 --enable-libxvid --enable-lzma 
--enable-libfdk-aac --enable-opencl --enable-videotoolbox --enable-nonfree
   libavutil      56. 22.100 / 56. 22.100
   libavcodec     58. 35.100 / 58. 35.100
   libavformat    58. 20.100 / 58. 20.100
   libavdevice    58.  5.100 / 58.  5.100
   libavfilter     7. 40.101 /  7. 40.101
   libavresample   4.  0.  0 /  4.  0.  0
   libswscale      5.  3.100 /  5.  3.100
   libswresample   3.  3.100 /  3.  3.100
   libpostproc    55.  3.100 / 55.  3.100
Input #0, matroska,webm, from 'ik.mkv':
   Metadata:
     COMPATIBLE_BRANDS: iso6avc1mp41
     MAJOR_BRAND     : dash
     MINOR_VERSION   : 0
     ENCODER         : Lavf58.12.100
   Duration: 00:08:40.42, start: -0.007000, bitrate: 354 kb/s
     Stream #0:0: Video: h264 (Main), yuv420p(progressive), 338x240, 25 
fps, 25 tbr, 1k tbn, 50 tbc (default)
     Metadata:
       HANDLER_NAME    : VideoHandler
       DURATION        : 00:08:40.360000000
     Stream #0:1(eng): Audio: opus, 48000 Hz, stereo, fltp (default)
     Metadata:
       DURATION        : 00:08:40.421000000
Stream mapping:
   Stream #0:0 -> #0:0 (h264 (native) -> h264 (h264_videotoolbox))
   Stream #0:1 -> #0:1 (opus (native) -> aac (native))
Press [q] to stop, [?] for help
[h264_videotoolbox @ 0x7fe239009600] Error: cannot create compression 
session: -12915
[h264_videotoolbox @ 0x7fe239009600] Try -allow_sw 1. The hardware 
encoder may be busy, or not supported.
Error initializing output stream 0:0 -- Error while opening encoder for 
output stream #0:0 - maybe incorrect parameters such as bit_rate, rate, 
width or height
[aac @ 0x7fe23900a800] Qavg: 65536.000
[aac @ 0x7fe23900a800] 2 frames left in the queue on closing
Conversion failed!




#
# Working
#

$ ffmpeg -y -i TextInMotion-VideoSample-720p.mp4 -c:v h264_videotoolbox 
output.mp4
ffmpeg version 4.1 Copyright (c) 2000-2018 the FFmpeg developers
   built with Apple LLVM version 8.1.0 (clang-802.0.38)
   configuration: --prefix=/usr/local/Cellar/ffmpeg/4.1 --enable-shared 
--enable-pthreads --enable-version3 --enable-hardcoded-tables 
--enable-avresample --cc=clang --host-cflags= --host-ldflags= 
--enable-ffplay --enable-gpl --enable-libmp3lame --enable-libopus 
--enable-libsnappy --enable-libtheora --enable-libvorbis --enable-libvpx 
--enable-libx264 --enable-libx265 --enable-libxvid --enable-lzma 
--enable-libfdk-aac --enable-opencl --enable-videotoolbox --enable-nonfree
   libavutil      56. 22.100 / 56. 22.100
   libavcodec     58. 35.100 / 58. 35.100
   libavformat    58. 20.100 / 58. 20.100
   libavdevice    58.  5.100 / 58.  5.100
   libavfilter     7. 40.101 /  7. 40.101
   libavresample   4.  0.  0 /  4.  0.  0
   libswscale      5.  3.100 /  5.  3.100
   libswresample   3.  3.100 /  3.  3.100
   libpostproc    55.  3.100 / 55.  3.100
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x7fc868803000] stream 0, timescale not set
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'TextInMotion-VideoSample-720p.mp4':
   Metadata:
     major_brand     : isom
     minor_version   : 512
     compatible_brands: isomiso2avc1mp41
     encoder         : Lavf57.25.100
   Duration: 00:00:30.23, start: 0.000000, bitrate: 3701 kb/s
     Stream #0:0(eng): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, 
stereo, fltp, 128 kb/s (default)
     Metadata:
       handler_name    : SoundHandler
     Stream #0:1(eng): Video: h264 (Main) (avc1 / 0x31637661), yuv420p, 
1280x720 [SAR 1:1 DAR 16:9], 3509 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 
tbc (default)
     Metadata:
       handler_name    : VideoHandler
     Stream #0:2: Video: mjpeg, yuvj444p(pc, bt470bg/unknown/unknown), 
1920x1080 [SAR 72:72 DAR 16:9], 90k tbr, 90k tbn, 90k tbc
Stream mapping:
   Stream #0:1 -> #0:0 (h264 (native) -> h264 (h264_videotoolbox))
   Stream #0:0 -> #0:1 (aac (native) -> aac (native))
Press [q] to stop, [?] for help
[h264_videotoolbox @ 0x7fc86885b200] Color range not set for yuv420p. 
Using MPEG range.
Output #0, mp4, to 'output.mp4':
   Metadata:
     major_brand     : isom
     minor_version   : 512
     compatible_brands: isomiso2avc1mp41
     encoder         : Lavf58.20.100
     Stream #0:0(eng): Video: h264 (h264_videotoolbox) (avc1 / 
0x31637661), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], q=2-31, 200 kb/s, 25 
fps, 12800 tbn, 25 tbc (default)
     Metadata:
       handler_name    : VideoHandler
       encoder         : Lavc58.35.100 h264_videotoolbox
     Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, 
stereo, fltp, 128 kb/s (default)
     Metadata:
       handler_name    : SoundHandler
       encoder         : Lavc58.35.100 aac
frame=  751 fps=497 q=-0.0 Lsize=    2824kB time=00:00:30.20 bitrate= 
765.8kbits/s speed=  20x
video:2795kB audio:8kB subtitle:0kB other streams:0kB global headers:0kB 
muxing overhead: 0.726365%
[aac @ 0x7fc86885c400] Qavg: 65536.000








---


Alfred


More information about the ffmpeg-user mailing list