[FFmpeg-trac] #6355(avfilter:new): Unexpected values for psnr_avg
FFmpeg
trac at avcodec.org
Tue Apr 25 18:09:31 EEST 2017
#6355: Unexpected values for psnr_avg
----------------------------------+----------------------------------
Reporter: aitkenap | Type: defect
Status: new | Priority: normal
Component: avfilter | Version: 3.0.7
Keywords: psnr | Blocked By:
Blocking: | Reproduced by developer: 0
Analyzed by developer: 0 |
----------------------------------+----------------------------------
Summary of the bug:
I am getting unexpected results when calculating PSNR averaged over y/u/v
channels.
Here is an example command and output:
{{{
%$ ffmpeg -i file1.mp4 -i file2.mp4 -lavfi [0][1]psnr=- -f null -
ffmpeg version 3.0 Copyright (c) 2000-2016 the FFmpeg developers
built with gcc 4.9.2 (GCC) 20150212 (Red Hat 4.9.2-6)
configuration: --prefix=/home/magicpony/conda/envs/devenv --pkg-config-
flags=--static --extra-cflags=-I/home/magicpony/conda/envs/devenv/include
--extra-ldflags=-L/home/magicpony/conda/envs/devenv/lib
--bindir=/home/magicpony/conda/envs/devenv/bin --enable-shared --enable-
gpl --enable-libx264 --enable-nonfree --disable-outdev=sdl
libavutil 55. 17.103 / 55. 17.103
libavcodec 57. 24.102 / 57. 24.102
libavformat 57. 25.100 / 57. 25.100
libavdevice 57. 0.101 / 57. 0.101
libavfilter 6. 31.100 / 6. 31.100
libswscale 4. 0.100 / 4. 0.100
libswresample 2. 0.101 / 2. 0.101
libpostproc 54. 0.100 / 54. 0.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'file1.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf57.25.100
Duration: 00:00:01.08, start: 0.000000, bitrate: 58 kb/s
Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p,
72x40, 47 kb/s, 60 fps, 60 tbr, 15360 tbn, 120 tbc (default)
Metadata:
handler_name : VideoHandler
Input #1, mov,mp4,m4a,3gp,3g2,mj2, from 'file2.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf57.25.100
Duration: 00:00:01.08, start: 0.000000, bitrate: 29 kb/s
Stream #1:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p,
72x40, 18 kb/s, 60 fps, 60 tbr, 15360 tbn, 120 tbc (default)
Metadata:
handler_name : VideoHandler
Output #0, null, to 'pipe:':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf57.25.100
Stream #0:0: Video: wrapped_avframe, yuv420p, 72x40, q=2-31, 200 kb/s,
60 fps, 60 tbn, 60 tbc (default)
Metadata:
encoder : Lavc57.24.102 wrapped_avframe
Stream mapping:
Stream #0:0 (h264) -> psnr:main
Stream #1:0 (h264) -> psnr:reference
psnr -> Stream #0:0 (wrapped_avframe)
Press [q] to stop, [?] for help
n:1 mse_avg:38.32 mse_y:48.93 mse_u:17.59 mse_v:16.61 psnr_avg:32.26
psnr_y:31.24 psnr_u:35.68 psnr_v:35.93
n:2 mse_avg:38.96 mse_y:49.93 mse_u:17.37 mse_v:16.69 psnr_avg:32.19
psnr_y:31.15 psnr_u:35.73 psnr_v:35.91
n:3 mse_avg:39.60 mse_y:50.70 mse_u:18.25 mse_v:16.57 psnr_avg:32.12
psnr_y:31.08 psnr_u:35.52 psnr_v:35.94
n:4 mse_avg:42.54 mse_y:54.43 mse_u:21.36 mse_v:16.20 psnr_avg:31.81
psnr_y:30.77 psnr_u:34.83 psnr_v:36.04
n:5 mse_avg:42.39 mse_y:53.49 mse_u:23.95 mse_v:16.43 psnr_avg:31.82
psnr_y:30.85 psnr_u:34.34 psnr_v:35.97
n:6 mse_avg:41.52 mse_y:52.04 mse_u:23.47 mse_v:17.51 psnr_avg:31.91
psnr_y:30.97 psnr_u:34.43 psnr_v:35.70
n:7 mse_avg:41.34 mse_y:51.78 mse_u:23.24 mse_v:17.68 psnr_avg:31.93
psnr_y:30.99 psnr_u:34.47 psnr_v:35.66
n:8 mse_avg:41.47 mse_y:51.05 mse_u:22.21 mse_v:22.44 psnr_avg:31.92
psnr_y:31.05 psnr_u:34.67 psnr_v:34.62
n:9 mse_avg:41.57 mse_y:52.33 mse_u:20.64 mse_v:19.44 psnr_avg:31.91
psnr_y:30.94 psnr_u:34.98 psnr_v:35.24
n:10 mse_avg:41.85 mse_y:52.68 mse_u:20.77 mse_v:19.57 psnr_avg:31.88
psnr_y:30.91 psnr_u:34.96 psnr_v:35.22
n:11 mse_avg:46.06 mse_y:57.39 mse_u:22.14 mse_v:24.69 psnr_avg:31.46
psnr_y:30.54 psnr_u:34.68 psnr_v:34.21
n:12 mse_avg:46.54 mse_y:58.07 mse_u:21.37 mse_v:25.60 psnr_avg:31.42
psnr_y:30.49 psnr_u:34.83 psnr_v:34.05
n:13 mse_avg:45.89 mse_y:57.19 mse_u:20.76 mse_v:25.83 psnr_avg:31.48
psnr_y:30.56 psnr_u:34.96 psnr_v:34.01
n:14 mse_avg:46.45 mse_y:58.36 mse_u:20.89 mse_v:24.35 psnr_avg:31.43
psnr_y:30.47 psnr_u:34.93 psnr_v:34.27
n:15 mse_avg:48.32 mse_y:61.12 mse_u:21.01 mse_v:24.44 psnr_avg:31.26
psnr_y:30.27 psnr_u:34.91 psnr_v:34.25
n:16 mse_avg:56.38 mse_y:72.63 mse_u:22.19 mse_v:25.56 psnr_avg:30.59
psnr_y:29.52 psnr_u:34.67 psnr_v:34.06
n:17 mse_avg:49.70 mse_y:62.66 mse_u:22.74 mse_v:24.85 psnr_avg:31.13
psnr_y:30.16 psnr_u:34.56 psnr_v:34.18
n:18 mse_avg:50.21 mse_y:63.30 mse_u:23.00 mse_v:25.05 psnr_avg:31.09
psnr_y:30.12 psnr_u:34.51 psnr_v:34.14
n:19 mse_avg:49.64 mse_y:62.56 mse_u:22.62 mse_v:24.98 psnr_avg:31.14
psnr_y:30.17 psnr_u:34.59 psnr_v:34.15
n:20 mse_avg:63.29 mse_y:84.05 mse_u:18.86 mse_v:24.66 psnr_avg:30.08
psnr_y:28.89 psnr_u:35.38 psnr_v:34.21
n:21 mse_avg:64.54 mse_y:86.10 mse_u:18.43 mse_v:24.42 psnr_avg:30.00
psnr_y:28.78 psnr_u:35.48 psnr_v:34.25
n:22 mse_avg:51.93 mse_y:67.39 mse_u:18.00 mse_v:24.04 psnr_avg:30.94
psnr_y:29.84 psnr_u:35.58 psnr_v:34.32
n:23 mse_avg:49.89 mse_y:64.10 mse_u:18.12 mse_v:24.86 psnr_avg:31.12
psnr_y:30.06 psnr_u:35.55 psnr_v:34.18
n:24 mse_avg:50.07 mse_y:64.33 mse_u:18.06 mse_v:25.02 psnr_avg:31.10
psnr_y:30.05 psnr_u:35.56 psnr_v:34.15
n:25 mse_avg:46.23 mse_y:57.80 mse_u:20.46 mse_v:25.74 psnr_avg:31.45
psnr_y:30.51 psnr_u:35.02 psnr_v:34.02
n:26 mse_avg:46.36 mse_y:57.88 mse_u:20.58 mse_v:26.06 psnr_avg:31.44
psnr_y:30.51 psnr_u:35.00 psnr_v:33.97
n:27 mse_avg:44.16 mse_y:54.84 mse_u:20.09 mse_v:25.53 psnr_avg:31.65
psnr_y:30.74 psnr_u:35.10 psnr_v:34.06
n:28 mse_avg:45.24 mse_y:56.58 mse_u:19.87 mse_v:25.22 psnr_avg:31.54
psnr_y:30.60 psnr_u:35.15 psnr_v:34.11
n:29 mse_avg:44.93 mse_y:56.11 mse_u:19.82 mse_v:25.28 psnr_avg:31.57
psnr_y:30.64 psnr_u:35.16 psnr_v:34.10
n:30 mse_avg:43.50 mse_y:54.04 mse_u:19.80 mse_v:25.04 psnr_avg:31.71
psnr_y:30.80 psnr_u:35.16 psnr_v:34.14
n:31 mse_avg:46.52 mse_y:58.66 mse_u:19.71 mse_v:24.77 psnr_avg:31.42
psnr_y:30.45 psnr_u:35.18 psnr_v:34.19
n:32 mse_avg:45.07 mse_y:56.47 mse_u:19.74 mse_v:24.82 psnr_avg:31.56
psnr_y:30.61 psnr_u:35.18 psnr_v:34.18
n:33 mse_avg:46.37 mse_y:58.40 mse_u:19.74 mse_v:24.89 psnr_avg:31.43
psnr_y:30.47 psnr_u:35.18 psnr_v:34.17
n:34 mse_avg:47.50 mse_y:60.11 mse_u:19.80 mse_v:24.76 psnr_avg:31.33
psnr_y:30.34 psnr_u:35.17 psnr_v:34.19
n:35 mse_avg:48.00 mse_y:60.38 mse_u:19.57 mse_v:26.89 psnr_avg:31.28
psnr_y:30.32 psnr_u:35.22 psnr_v:33.84
n:36 mse_avg:47.84 mse_y:60.30 mse_u:19.42 mse_v:26.41 psnr_avg:31.30
psnr_y:30.33 psnr_u:35.25 psnr_v:33.91
n:37 mse_avg:48.59 mse_y:61.27 mse_u:20.07 mse_v:26.41 psnr_avg:31.23
psnr_y:30.26 psnr_u:35.10 psnr_v:33.91
n:38 mse_avg:45.37 mse_y:56.44 mse_u:20.23 mse_v:26.28 psnr_avg:31.53
psnr_y:30.62 psnr_u:35.07 psnr_v:33.93
n:39 mse_avg:45.88 mse_y:57.21 mse_u:20.52 mse_v:25.92 psnr_avg:31.48
psnr_y:30.56 psnr_u:35.01 psnr_v:33.99
n:40 mse_avg:46.42 mse_y:57.79 mse_u:20.59 mse_v:26.78 psnr_avg:31.43
psnr_y:30.51 psnr_u:34.99 psnr_v:33.85
n:41 mse_avg:47.47 mse_y:59.26 mse_u:20.78 mse_v:26.97 psnr_avg:31.33
psnr_y:30.40 psnr_u:34.95 psnr_v:33.82
n:42 mse_avg:47.39 mse_y:59.66 mse_u:20.56 mse_v:25.13 psnr_avg:31.34
psnr_y:30.37 psnr_u:35.00 psnr_v:34.13
n:43 mse_avg:46.33 mse_y:58.17 mse_u:20.25 mse_v:25.04 psnr_avg:31.44
psnr_y:30.48 psnr_u:35.07 psnr_v:34.15
n:44 mse_avg:47.26 mse_y:59.92 mse_u:19.28 mse_v:24.61 psnr_avg:31.35
psnr_y:30.35 psnr_u:35.28 psnr_v:34.22
n:45 mse_avg:48.36 mse_y:61.61 mse_u:19.21 mse_v:24.52 psnr_avg:31.25
psnr_y:30.23 psnr_u:35.30 psnr_v:34.23
n:46 mse_avg:46.64 mse_y:59.00 mse_u:19.27 mse_v:24.55 psnr_avg:31.41
psnr_y:30.42 psnr_u:35.28 psnr_v:34.23
n:47 mse_avg:48.19 mse_y:61.28 mse_u:19.64 mse_v:24.41 psnr_avg:31.27
psnr_y:30.26 psnr_u:35.20 psnr_v:34.25
n:48 mse_avg:47.85 mse_y:60.78 mse_u:19.69 mse_v:24.29 psnr_avg:31.30
psnr_y:30.29 psnr_u:35.19 psnr_v:34.28
n:49 mse_avg:49.75 mse_y:63.24 mse_u:20.13 mse_v:25.41 psnr_avg:31.13
psnr_y:30.12 psnr_u:35.09 psnr_v:34.08
n:50 mse_avg:47.73 mse_y:60.78 mse_u:19.82 mse_v:23.45 psnr_avg:31.31
psnr_y:30.29 psnr_u:35.16 psnr_v:34.43
n:51 mse_avg:48.13 mse_y:61.52 mse_u:19.66 mse_v:23.05 psnr_avg:31.27
psnr_y:30.24 psnr_u:35.20 psnr_v:34.50
n:52 mse_avg:49.32 mse_y:63.32 mse_u:19.69 mse_v:22.94 psnr_avg:31.17
psnr_y:30.12 psnr_u:35.19 psnr_v:34.52
n:53 mse_avg:48.80 mse_y:62.54 mse_u:19.55 mse_v:23.12 psnr_avg:31.21
psnr_y:30.17 psnr_u:35.22 psnr_v:34.49
n:54 mse_avg:49.02 mse_y:62.86 mse_u:19.47 mse_v:23.20 psnr_avg:31.19
psnr_y:30.15 psnr_u:35.24 psnr_v:34.48
n:55 mse_avg:50.93 mse_y:65.70 mse_u:19.58 mse_v:23.20 psnr_avg:31.03
psnr_y:29.96 psnr_u:35.21 psnr_v:34.48
n:56 mse_avg:51.58 mse_y:66.72 mse_u:19.55 mse_v:23.04 psnr_avg:30.97
psnr_y:29.89 psnr_u:35.22 psnr_v:34.51
n:57 mse_avg:51.76 mse_y:66.72 mse_u:19.58 mse_v:24.08 psnr_avg:30.96
psnr_y:29.89 psnr_u:35.21 psnr_v:34.31
n:58 mse_avg:49.88 mse_y:64.00 mse_u:19.39 mse_v:23.91 psnr_avg:31.12
psnr_y:30.07 psnr_u:35.25 psnr_v:34.35
n:59 mse_avg:50.61 mse_y:65.24 mse_u:19.12 mse_v:23.58 psnr_avg:31.05
psnr_y:29.99 psnr_u:35.32 psnr_v:34.41
n:60 mse_avg:52.26 mse_y:67.67 mse_u:19.11 mse_v:23.76 psnr_avg:30.92
psnr_y:29.83 psnr_u:35.32 psnr_v:34.37
n:61 mse_avg:54.16 mse_y:70.39 mse_u:19.00 mse_v:24.42 psnr_avg:30.76
psnr_y:29.66 psnr_u:35.34 psnr_v:34.25
n:62 mse_avg:54.16 mse_y:70.39 mse_u:19.00 mse_v:24.42 psnr_avg:30.76
psnr_y:29.66 psnr_u:35.34 psnr_v:34.25
n:63 mse_avg:54.16 mse_y:70.39 mse_u:19.00 mse_v:24.42 psnr_avg:30.76
psnr_y:29.66 psnr_u:35.34 psnr_v:34.25
n:64 mse_avg:55.99 mse_y:73.26 mse_u:18.67 mse_v:24.21 psnr_avg:30.62
psnr_y:29.48 psnr_u:35.42 psnr_v:34.29
n:65 mse_avg:56.02 mse_y:73.30 mse_u:18.73 mse_v:24.20 psnr_avg:30.61
psnr_y:29.48 psnr_u:35.40 psnr_v:34.29
frame= 65 fps=0.0 q=-0.0 Lsize=N/A time=00:00:01.08 bitrate=N/A
speed=22.2x
video:30kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB
muxing overhead: unknown
[Parsed_psnr_0 @ 0x1233900] PSNR y:30.273564 u:35.104567 v:34.378487
average:31.283939 min:29.998335 max:32.262509
}}}
Taking the first frame as an example, I would expect `psnr_avg` to be:
`10 * log10(average_max^2 / mse_avg) = 10 * log10 * (255^2 / 38.32) =
32.30 `
However, this is reported as `32.26` by ffmpeg. If I instead use
`average_max = 254` in the above calculation, I get `32.26`.
I believe `255` is the correct value for `average_max`, but it looks like
it may be calculated incorrectly for some pixel formats due to rounding
errors - it is calculated
[https://ffmpeg.org/doxygen/3.0/vf__psnr_8c_source.html#l00278 here]. For
yuv420p pixel format, I would expect the values of `planeweight` to be
`[4/6, 1/6, 1/6]` and `max` to be `[255, 255, 255]`. I would therefore
expect `average_max` to be given by:
`average_max = (4/6 * 255) + (1/6 * 255) + (1/6 * 255) = 170.0 + 42.5 +
42.5 = 255.0`
However, since `average_max` is of type `int`
([https://ffmpeg.org/doxygen/3.0/vf__psnr_8c_source.html#l00046 defined
here]), this looks as though it would actually become:
`average_max = (4/6 * 255) + (1/6 * 255) + (1/6 * 255) = 170 + 42 + 42 =
254`
I believe this would explain the discrepancy and changing the type of
`average_max` to `double` should fix it.
--
Ticket URL: <https://trac.ffmpeg.org/ticket/6355>
FFmpeg <https://ffmpeg.org>
FFmpeg issue tracker
More information about the FFmpeg-trac
mailing list