[FFmpeg-trac] #7095(undetermined:new): -lavfi psnr gives wrong result
FFmpeg
trac at avcodec.org
Tue Mar 20 16:47:20 EET 2018
#7095: -lavfi psnr gives wrong result
-------------------------------------+-------------------------------------
Reporter: rbultje | Owner:
Type: defect | Status: new
Priority: normal | Component:
Version: | undetermined
unspecified | Keywords:
Blocked By: | Blocking:
Reproduced by developer: 0 | Analyzed by developer: 0
-------------------------------------+-------------------------------------
Summary of the bug: when using the PSNR lavfilter to measure PSNR, the
output is not consistent between releases. In some cases, the result is
fundamentally broken.
How to reproduce:
{{{
% ffmpeg -i x.ivf -v error -vsync 0 -vframes 3 /tmp/compressed.yuv
% ffmpeg -i ~/Movies/nflx360p/Aerial.ffv1.mkv -v error -vsync 0 -vframes 3
/tmp/aerial.yuv
% ffmpeg -video_size 640x360 -i /tmp/compressed.yuv -video_size 640x360 -i
/tmp/aerial.yuv -lavfi '[0:v][1:v]psnr' -v info -nostats -f null -
ffmpeg version 3.4.2 Copyright (c) 2000-2018 the FFmpeg developers
built with Apple LLVM version 9.0.0 (clang-900.0.38)
configuration: --prefix=/opt/local --enable-swscale --enable-avfilter
--enable-avresample --enable-libmp3lame --enable-libvorbis --enable-
libopus --enable-librsvg --enable-libtheora --enable-libopenjpeg --enable-
libmodplug --enable-libvpx --enable-libsoxr --enable-libspeex --enable-
libass --enable-libbluray --enable-lzma --enable-gnutls --enable-
fontconfig --enable-libfreetype --enable-libfribidi --disable-jack
--disable-libopencore-amrnb --disable-libopencore-amrwb --disable-
indev=jack --enable-opencl --disable-outdev=xv --enable-audiotoolbox
--enable-videotoolbox --enable-sdl2 --mandir=/opt/local/share/man
--enable-shared --enable-pthreads --cc=/usr/bin/clang --arch=x86_64
--enable-x86asm --enable-libx265 --enable-gpl --enable-postproc --enable-
libx264 --enable-libxvid
libavutil 55. 78.100 / 55. 78.100
libavcodec 57.107.100 / 57.107.100
libavformat 57. 83.100 / 57. 83.100
libavdevice 57. 10.100 / 57. 10.100
libavfilter 6.107.100 / 6.107.100
libavresample 3. 7. 0 / 3. 7. 0
libswscale 4. 8.100 / 4. 8.100
libswresample 2. 9.100 / 2. 9.100
libpostproc 54. 7.100 / 54. 7.100
[rawvideo @ 0x7f8205800000] Estimating duration from bitrate, this may be
inaccurate
Input #0, rawvideo, from '/tmp/compressed.yuv':
Duration: 00:00:00.12, start: 0.000000, bitrate: 69120 kb/s
Stream #0:0: Video: rawvideo (I420 / 0x30323449), yuv420p, 640x360,
69120 kb/s, 25 tbr, 25 tbn, 25 tbc
[rawvideo @ 0x7f8205811c00] Estimating duration from bitrate, this may be
inaccurate
Input #1, rawvideo, from '/tmp/aerial.yuv':
Duration: 00:00:00.12, start: 0.000000, bitrate: 69120 kb/s
Stream #1:0: Video: rawvideo (I420 / 0x30323449), yuv420p, 640x360,
69120 kb/s, 25 tbr, 25 tbn, 25 tbc
Stream mapping:
Stream #0:0 (rawvideo) -> psnr:main
Stream #1:0 (rawvideo) -> psnr:reference
psnr -> Stream #0:0 (wrapped_avframe)
Press [q] to stop, [?] for help
Output #0, null, to 'pipe:':
Metadata:
encoder : Lavf57.83.100
Stream #0:0: Video: wrapped_avframe, yuv420p, 640x360, q=2-31, 200
kb/s, 25 fps, 25 tbn, 25 tbc (default)
Metadata:
encoder : Lavc57.107.100 wrapped_avframe
frame= 3 fps=0.0 q=-0.0 Lsize=N/A time=00:00:00.12 bitrate=N/A
speed=70.2x
video:2kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB
muxing overhead: unknown
[Parsed_psnr_0 @ 0x7f8204f03980] PSNR y:40.022550 u:42.672859 v:44.018973
average:40.865346 min:40.316870 max:41.634475
}}}
I'm assuming this is the correct PSNR value. Now let's do the files
directly:
{{{
% ffmpeg -i x.ivf -i ~/Movies/nflx360p/Aerial.ffv1.mkv -lavfi
'[0:v][1:v]psnr' -v info -nostats -f null -
ffmpeg version 3.4.2 Copyright (c) 2000-2018 the FFmpeg developers
built with Apple LLVM version 9.0.0 (clang-900.0.38)
configuration: --prefix=/opt/local --enable-swscale --enable-avfilter
--enable-avresample --enable-libmp3lame --enable-libvorbis --enable-
libopus --enable-librsvg --enable-libtheora --enable-libopenjpeg --enable-
libmodplug --enable-libvpx --enable-libsoxr --enable-libspeex --enable-
libass --enable-libbluray --enable-lzma --enable-gnutls --enable-
fontconfig --enable-libfreetype --enable-libfribidi --disable-jack
--disable-libopencore-amrnb --disable-libopencore-amrwb --disable-
indev=jack --enable-opencl --disable-outdev=xv --enable-audiotoolbox
--enable-videotoolbox --enable-sdl2 --mandir=/opt/local/share/man
--enable-shared --enable-pthreads --cc=/usr/bin/clang --arch=x86_64
--enable-x86asm --enable-libx265 --enable-gpl --enable-postproc --enable-
libx264 --enable-libxvid
libavutil 55. 78.100 / 55. 78.100
libavcodec 57.107.100 / 57.107.100
libavformat 57. 83.100 / 57. 83.100
libavdevice 57. 10.100 / 57. 10.100
libavfilter 6.107.100 / 6.107.100
libavresample 3. 7. 0 / 3. 7. 0
libswscale 4. 8.100 / 4. 8.100
libswresample 2. 9.100 / 2. 9.100
libpostproc 54. 7.100 / 54. 7.100
Input #0, ivf, from 'x.ivf':
Duration: 00:00:00.17, start: 0.000000, bitrate: 3007 kb/s
Stream #0:0: Video: vp9 (Profile 0) (VP90 / 0x30395056), yuv420p(tv),
640x360, 30 tbr, 30 tbn, 30 tbc
Input #1, matroska,webm, from
'/Users/ronaldbultje/Movies/nflx360p/Aerial.ffv1.mkv':
Metadata:
ENCODER : Lavf57.23.100
Duration: 00:00:20.00, start: 0.000000, bitrate: 40448 kb/s
Stream #1:0: Video: ffv1 (FFV1 / 0x31564646), yuv420p, 640x360, SAR
1:1 DAR 16:9, 30 fps, 30 tbr, 1k tbn, 1k tbc (default)
Metadata:
ENCODER : Lavc57.22.100 ffv1
DURATION : 00:00:20.000000000
Stream mapping:
Stream #0:0 (vp9) -> psnr:main
Stream #1:0 (ffv1) -> psnr:reference
psnr -> Stream #0:0 (wrapped_avframe)
Press [q] to stop, [?] for help
Output #0, null, to 'pipe:':
Metadata:
encoder : Lavf57.83.100
Stream #0:0: Video: wrapped_avframe, yuv420p, 640x360, q=2-31, 200
kb/s, 30 fps, 30 tbn, 30 tbc (default)
Metadata:
encoder : Lavc57.107.100 wrapped_avframe
frame= 600 fps=297 q=-0.0 Lsize=N/A time=00:00:20.00 bitrate=N/A
speed=9.89x
video:309kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB
muxing overhead: unknown
[Parsed_psnr_0 @ 0x7ff4bbd03220] PSNR y:15.673549 u:28.453958 v:31.570819
average:17.350123 min:14.220084 max:41.634475
}}}
That PSNR value is not correct at all. -vframes 3 changes the result, but
does not resolve the issue entirely:
{{{
% ffmpeg -i x.ivf -i ~/Movies/nflx360p/Aerial.ffv1.mkv -lavfi
'[0:v][1:v]psnr' -v info -nostats -f null -vframes 3 -
ffmpeg version 3.4.2 Copyright (c) 2000-2018 the FFmpeg developers
built with Apple LLVM version 9.0.0 (clang-900.0.38)
configuration: --prefix=/opt/local --enable-swscale --enable-avfilter
--enable-avresample --enable-libmp3lame --enable-libvorbis --enable-
libopus --enable-librsvg --enable-libtheora --enable-libopenjpeg --enable-
libmodplug --enable-libvpx --enable-libsoxr --enable-libspeex --enable-
libass --enable-libbluray --enable-lzma --enable-gnutls --enable-
fontconfig --enable-libfreetype --enable-libfribidi --disable-jack
--disable-libopencore-amrnb --disable-libopencore-amrwb --disable-
indev=jack --enable-opencl --disable-outdev=xv --enable-audiotoolbox
--enable-videotoolbox --enable-sdl2 --mandir=/opt/local/share/man
--enable-shared --enable-pthreads --cc=/usr/bin/clang --arch=x86_64
--enable-x86asm --enable-libx265 --enable-gpl --enable-postproc --enable-
libx264 --enable-libxvid
libavutil 55. 78.100 / 55. 78.100
libavcodec 57.107.100 / 57.107.100
libavformat 57. 83.100 / 57. 83.100
libavdevice 57. 10.100 / 57. 10.100
libavfilter 6.107.100 / 6.107.100
libavresample 3. 7. 0 / 3. 7. 0
libswscale 4. 8.100 / 4. 8.100
libswresample 2. 9.100 / 2. 9.100
libpostproc 54. 7.100 / 54. 7.100
Input #0, ivf, from 'x.ivf':
Duration: 00:00:00.17, start: 0.000000, bitrate: 3007 kb/s
Stream #0:0: Video: vp9 (Profile 0) (VP90 / 0x30395056), yuv420p(tv),
640x360, 30 tbr, 30 tbn, 30 tbc
Input #1, matroska,webm, from
'/Users/ronaldbultje/Movies/nflx360p/Aerial.ffv1.mkv':
Metadata:
ENCODER : Lavf57.23.100
Duration: 00:00:20.00, start: 0.000000, bitrate: 40448 kb/s
Stream #1:0: Video: ffv1 (FFV1 / 0x31564646), yuv420p, 640x360, SAR
1:1 DAR 16:9, 30 fps, 30 tbr, 1k tbn, 1k tbc (default)
Metadata:
ENCODER : Lavc57.22.100 ffv1
DURATION : 00:00:20.000000000
Stream mapping:
Stream #0:0 (vp9) -> psnr:main
Stream #1:0 (ffv1) -> psnr:reference
psnr -> Stream #0:0 (wrapped_avframe)
Press [q] to stop, [?] for help
Output #0, null, to 'pipe:':
Metadata:
encoder : Lavf57.83.100
Stream #0:0: Video: wrapped_avframe, yuv420p, 640x360, q=2-31, 200
kb/s, 30 fps, 30 tbn, 30 tbc (default)
Metadata:
encoder : Lavc57.107.100 wrapped_avframe
frame= 3 fps=0.0 q=-0.0 Lsize=N/A time=00:00:00.10 bitrate=N/A
speed=2.45x
video:2kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB
muxing overhead: unknown
[Parsed_psnr_0 @ 0x7ff69c100aa0] PSNR y:39.805490 u:42.630894 v:43.989575
average:40.682090 min:40.079826 max:41.634475
}}}
This is reproduceable with git master as well as 3.4.2. It does not occur
with 3.2.2. Using the setpts filter with 'N*TB' as argument resolves a
small subset of the issues but not completely.
--
Ticket URL: <https://trac.ffmpeg.org/ticket/7095>
FFmpeg <https://ffmpeg.org>
FFmpeg issue tracker
More information about the FFmpeg-trac
mailing list