-----Original Message-----
From: Libav-user [mailto:[email protected]] On Behalf Of Carl Eugen 
Hoyos
Sent: Montag, 29. August 2016 12:17
To: This list is about using libavcodec, libavformat, libavutil, libavdevice 
and libavfilter.
Subject: Re: [Libav-user] Writing 16bit greyscale videos

2016-08-29 10:59 GMT+02:00 Masneri, Stefano <[email protected]>:
I have a small class that creates an h264 video from a set of input images.
I have some problems trying to write 16 bit input images: Conversion
to yuv420p format loses 8 bit of precision, and apparently x264 does
not support encoding 16 bit greyscale data.

H.264 does not support more than 14bit, x264 does not support more than 10bit 
input.

Do you know of a codec that supports encoding a video using
AV_PIX_FMT_GRAY16BE pixel format (or anything similar)?

jpegls, png, tiff, dpx, sgi, ffvhuff, ffv1 (all lossless) Jpeg2000, but FFmpeg 
needs the external library libopenjpeg for encoding
gray16 (lossy or lossless)

Carl Eugen

Thanks Carl. I am able to create the video with 16 bit greyscale images, but 
when I try watching the video in VLC I only see a green image. Reading the 
frames one by one (with a simple class which uses FFmpeg) I see a strange 
behaviour: every second column of the video is zero, while the other are 
exactly as the input fed to the class that created the video. I guess there is 
somewhere a problem switching from uint16 to uint8, but I cannot figure it out. 
Any hints?

Here's the output of ffprobe
D:\Code\VisualStudio\FFmpegApps\Win\VideoWriterApp>ffprobe -i test16bit.avi
ffprobe version 2.8.6 Copyright (c) 2007-2016 the FFmpeg developers
  built with gcc 5.3.0 (GCC)
  configuration: --disable-static --enable-shared --enable-gpl 
--enable-version3 --disable-w32threads --enable-avisynth --enable-bzlib 
--enable-fontconfig --ena
ble-frei0r --enable-gnutls --enable-iconv --enable-libass --enable-libbluray 
--enable-libbs2b --enable-libcaca --enable-libdcadec --enable-libfreetype 
--enable-
libgme --enable-libgsm --enable-libilbc --enable-libmodplug --enable-libmp3lame 
--enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg 
--enable-libopus --enable-librtmp --enable-libschroedinger --enable-libsoxr 
--enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab 
--enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis 
--enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 
--enable-libx265 --enable-libxavs --enable-libxvid --enable-lzma 
--enable-decklink --enable-zlib
  libavutil      54. 31.100 / 54. 31.100
  libavcodec     56. 60.100 / 56. 60.100
  libavformat    56. 40.101 / 56. 40.101
  libavdevice    56.  4.100 / 56.  4.100
  libavfilter     5. 40.101 /  5. 40.101
  libswscale      3.  1.101 /  3.  1.101
  libswresample   1.  2.101 /  1.  2.101
  libpostproc    53.  3.100 / 53.  3.100
Input #0, avi, from 'test16bit.avi':
  Metadata:
    encoder         : Lavf56.40.101
  Duration: 00:00:40.00, start: 0.000000, bitrate: 854 kb/s
    Stream #0:0: Video: ffv1 (FFV1 / 0x31564646), gray16le, 720x576, 849 kb/s, 
25 fps, 25 tbr, 25 tbn, 25 tbc


Stefano, did you check if your dataset really spans all 16 bits? if not, you might be lucky. otherwise 16-to-8-bit quantisation might do the trick, but is outside the scope of ffmpeg AFAIK. one thing I also haven't tried is copying gray16 into yuv444 and let h264 swallow it. the idea is to split the 16-bit in 2 compartments. and fill Y and U only (the empty V channel gives 8bit overhead). x265 might one day support 16-bits maturely, but is not really competitive yet in terms of ingest bandwidth with x264 ... at least from my studies (compression ration is already well ahead of x264). HEVC yields native grey16 support as far as the standard goes.

Best,
Peter
_______________________________________________
Libav-user mailing list
[email protected]
http://ffmpeg.org/mailman/listinfo/libav-user

Reply via email to