韩愈是什么朝代的| 欧珀莱属于什么档次| r13是什么牌子| 牛奶不能和什么东西一起吃| 大盘是什么意思| 尿维生素c弱阳性是什么意思| 水满则溢月盈则亏是什么意思| 命宫是什么意思| 去迪拜打工需要什么条件| 七寸是什么意思| 乔治白属于什么档次| 腱鞘炎是什么| 口唇发绀是什么意思| 1月17号是什么星座| 穷凶极恶是什么生肖| 血压低有什么危险| 睡觉起来口苦是什么原因| cache什么意思| aml是什么病| 暂住证办理需要什么材料| 遣返是什么意思| 兰蔻适合什么年龄的人用| 梦到生女儿是什么意思| 情人节送什么花| 78岁属什么| 海龙是什么| 嘴咸是什么原因| 统招是什么意思| 脚痒是什么原因| 保妇康栓是治疗什么的| 什么叫自然拼读| 满足是什么意思| 殊胜是什么意思| 阿根廷讲什么语言| 319是什么意思| 敌敌畏中毒用什么洗胃| 8000年前是什么朝代| 入睡困难吃什么药效果最好| 生地麦冬汤有什么功效| 八月二十六是什么星座| 血热是什么症状| charging是什么意思| 乳腺病是什么意思| 什么地端详| 血糖高吃什么水果| 肝损伤是怎么回事什么是肝损伤| 肾构错瘤要注意什么| sancanal是什么牌子| 反流性食管炎吃什么中成药最好| adl是什么意思| 大面积杀跳蚤用什么药| 专员是什么级别| zzegna是什么牌子价格| 立春是什么时候| 什么食物含钾高| 什么故事| 益生菌什么牌子的好| sp什么意思| 独一味是什么药| 口若悬河什么意思| 不管事是什么意思| 男人头发硬说明什么| 中午12点是什么时辰| 剁椒能做什么菜| 世界上最大的鱼是什么| 菠萝什么季节成熟| 什么是太岁| 好不热闹是什么意思| 突然晕倒是什么原因造成的| 繁衍的衍是什么意思| 腿上有青筋是什么原因| 煮花生放什么调料| 气炎念什么| 月球表面的坑叫什么| 为什么叫白俄罗斯| 中午吃什么好| 属蛇的人适合佩戴什么| 马上是什么意思| 背靠背协议是什么意思| 在五行中属什么| 婧字五行属什么| 肠子粘连有什么办法解决| 什么的歌声填词语| 舌苔少是什么原因| 砥砺前行什么意思| 妈妈的奶奶应该叫什么| 孔雀女是什么意思| 肝郁气滞血瘀吃什么药| 黄龙玉产地在什么地方| 闲鱼卖出的东西钱什么时候到账| 餐标是什么意思| 明哲保身是什么生肖| 梦见浇花是什么意思| 吃什么可以补肾| 吕布属什么生肖| 吃什么东西涨奶最快| 怀孕二十天有什么反应| 间接胆红素是什么| 瑕疵是什么意思| 农历正月初一是什么节日| 咀嚼什么意思| seiko手表是什么牌子| 刘华强是什么电视剧| 宫腔内异常回声是什么意思| 夜晚睡不着觉什么原因| 头皮脂溢性皮炎用什么洗发水| 暂住证和居住证有什么区别| 对数是什么| 品牌是什么意思| 腋窝疼痛挂什么科| 额头有痣代表什么| 促黄体生成素低说明什么| 张若昀原名叫什么| 女人左下巴有痣代表什么| 愿闻其详什么意思| 外交部长是什么级别| 三板斧是什么意思| 惶恐是什么意思| 苍鹰是什么意思| 穿拖鞋脚臭是什么原因| 汉武帝叫什么| 诸多是什么意思| 脚肿挂什么科室| 淋巴细胞升高说明什么| 圣诞节的礼物什么时候送| 什么叫丹凤眼| 早上喝一杯温开水有什么好处| 脚肿什么原因| 绅士什么意思| 羊宝是什么东西| 手上起倒刺是缺什么| 皮肤过敏有什么妙招| 银杏树叶像什么| 为什么一直打嗝| 肺和大肠相表里是什么意思| 双向情感障碍是什么病| 间歇脉多见于什么病| 93年属什么今年多大| 哥哥的孩子叫我什么| 黑瞎子是什么动物| 艾拉是什么药这么贵| 银子有什么功效与作用| 什么时间入伏| 得逞是什么意思| 萎缩性胃炎吃什么药效果好| 中成药是什么| 睡觉时头晕是什么原因| cns是什么意思| 米杏色是什么颜色| 经期吃什么让血量增加| 胃火旺吃什么| 太阳一晒脸就红是什么原因| 日前是什么意思| 吃天麻对身体有什么好处| 略施小计是什么动物| 苍苍什么| 狗肉和什么一起炖最佳| eos是什么意思| 副乡长是什么级别| 唐氏筛查和无创有什么区别| 每天泡脚对身体有什么好处| 梦见老公怀孕什么预兆| 生理盐水是什么东西| 河豚吃什么食物| air是什么牌子的鞋| 一般事故隐患是指什么| 几年是什么年| bh是什么意思| 成人改名字需要什么手续| 32属什么生肖| 沙和尚的武器叫什么| 农历六月十四是什么日子| 胸闷气短吃什么特效药| 慢性肠胃炎吃什么药| 肺肾两虚吃什么中成药| 白塞氏病是什么病| 眼睛屈光不正什么意思| 物以类聚什么意思| 脚底板发黄是什么原因| 白球比偏低是什么意思| 宫腔粘连是什么意思| 炒菜什么时候放调料| 什么牌助听器好| 甘油三酯高是什么原因造成的| 水变成冰为什么体积变大| 什么食用油最好最健康| 什么的羊群| 二婚是什么意思| b超和彩超有什么区别| cpu什么意思| 寿司醋可以用什么代替| 降龙十八掌最后一掌叫什么| 检查耳朵挂什么科| 什么是c字裤| 发烧能吃什么水果| 衣原体支原体感染有什么症状| 悬脉是什么意思| 平安夜什么时候吃苹果| 道听途说是什么意思| 一失足成千古恨是什么意思| 怕吹空调是什么原因| 腋窝爱出汗是什么原因| 吃蒲公英有什么好处| 吃鸡蛋补什么| 生态皮是什么材质| 金钱草长什么样子图片| 埋头苦干是什么生肖| 三心二意是指什么生肖| 敌敌畏中毒用什么洗胃| 吃黑木耳有什么好处| 嗳气吃什么药最有效| 肾囊肿是什么原因引起的| s和m是什么意思啊| 彩超和ct有什么区别| 90年属什么的生肖| 举牌什么意思| 慢性非萎缩性胃炎吃什么药效果好| 不由自主的摇头是什么病| 舌头边上有锯齿状是什么原因| 雷贝拉唑钠肠溶片什么时候吃| 蓝玫瑰代表什么| 早上起来头晕是什么原因| 秦始皇什么星座| 胖大海是什么东西| bench是什么牌子| 提高免疫力吃什么| 1和0是什么意思| 波涛澎湃是什么意思| 鱼油什么人不能吃| 吃什么会变黑| 96年属什么命| 什么是僵尸肉| 首长是什么意思| 尿素氮肌酐比值偏高是什么原因| 拉红尿是什么原因| 空调开除湿有什么作用| 女人梦见老鼠什么征兆| 什么样的包皮需要做手术| 脑梗吃什么| 巨石强森是什么人种| 毛囊炎长什么样| 塔罗牌是什么意思| 脑梗吃什么药| 俄罗斯信仰什么教| 下肢静脉血栓吃什么药| 护身符是什么意思| 屎黄色是什么颜色| 腺样体肥大是什么症状| 便秘吃什么药效果好| 大哥是什么生肖| 揩是什么意思| 经期不能吃什么水果| 舌裂纹是什么原因| 面部痉挛是什么原因引起的| 忠贞不渝是什么意思| 官星是什么意思| 风疹吃什么药好得快| 缩量十字星意味着什么| 孩子容易出汗是什么原因| 乙肝表面抗原阴性是什么意思| 什么是潮汐车道| 餐中服用是什么意思| 长春有什么好吃的| 舌头痒痒的是什么原因| 百度

爱奇艺游戏再携天象互动 《醉玲珑》或成下一影游标杆


Directory: ../../../ffmpeg/
File: src/libavfilter/vf_psnr.c
Date: 2025-08-04 11:35:17
Exec Total Coverage
Lines: 152 205 74.1%
Functions: 11 12 91.7%
Branches: 61 118 51.7%

Line Branch Exec Source
1 /*
2 * Copyright (c) 2011 Roger Pau Monné <roger.pau@entel.upc.edu>
3 * Copyright (c) 2011 Stefano Sabatini
4 * Copyright (c) 2013 Paul B Mahol
5 *
6 * This file is part of FFmpeg.
7 *
8 * FFmpeg is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
12 *
13 * FFmpeg is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
17 *
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with FFmpeg; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21 */
22
23 /**
24 * @file
25 * Calculate the PSNR between two input videos.
26 */
27
28 #include "libavutil/avstring.h"
29 #include "libavutil/file_open.h"
30 #include "libavutil/mem.h"
31 #include "libavutil/opt.h"
32 #include "libavutil/pixdesc.h"
33 #include "avfilter.h"
34 #include "drawutils.h"
35 #include "filters.h"
36 #include "framesync.h"
37 #include "psnr.h"
38
39 typedef struct PSNRContext {
40 const AVClass *class;
41 FFFrameSync fs;
42 double mse, min_mse, max_mse, mse_comp[4];
43 uint64_t nb_frames;
44 FILE *stats_file;
45 char *stats_file_str;
46 int stats_version;
47 int stats_header_written;
48 int stats_add_max;
49 int max[4], average_max;
50 int is_rgb;
51 uint8_t rgba_map[4];
52 char comps[4];
53 int nb_components;
54 int nb_threads;
55 int planewidth[4];
56 int planeheight[4];
57 double planeweight[4];
58 uint64_t **score;
59 PSNRDSPContext dsp;
60 } PSNRContext;
61
62 #define OFFSET(x) offsetof(PSNRContext, x)
63 #define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM
64
65 static const AVOption psnr_options[] = {
66 {"stats_file", "Set file where to store per-frame difference information", OFFSET(stats_file_str), AV_OPT_TYPE_STRING, {.str=NULL}, 0, 0, FLAGS },
67 {"f", "Set file where to store per-frame difference information", OFFSET(stats_file_str), AV_OPT_TYPE_STRING, {.str=NULL}, 0, 0, FLAGS },
68 {"stats_version", "Set the format version for the stats file.", OFFSET(stats_version), AV_OPT_TYPE_INT, {.i64=1}, 1, 2, FLAGS },
69 {"output_max", "Add raw stats (max values) to the output log.", OFFSET(stats_add_max), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS},
70 { NULL }
71 };
72
73
0/2
✗ Branch 0 not taken.
✗ Branch 1 not taken.
24 FRAMESYNC_DEFINE_CLASS(psnr, PSNRContext, fs);
74
75 98 static inline unsigned pow_2(unsigned base)
76 {
77 98 return base*base;
78 }
79
80 98 static inline double get_psnr(double mse, uint64_t nb_frames, int max)
81 {
82 98 return 10.0 * log10(pow_2(max) / (mse / nb_frames));
83 }
84
85 typedef struct ThreadData {
86 const uint8_t *main_data[4];
87 const uint8_t *ref_data[4];
88 int main_linesize[4];
89 int ref_linesize[4];
90 int planewidth[4];
91 int planeheight[4];
92 uint64_t **score;
93 int nb_components;
94 PSNRDSPContext *dsp;
95 } ThreadData;
96
97 static
98 126 int compute_images_mse(AVFilterContext *ctx, void *arg,
99 int jobnr, int nb_jobs)
100 {
101 126 ThreadData *td = arg;
102 126 uint64_t *score = td->score[jobnr];
103
104
2/2
✓ Branch 0 taken 405 times.
✓ Branch 1 taken 126 times.
531 for (int c = 0; c < td->nb_components; c++) {
105 405 const int outw = td->planewidth[c];
106 405 const int outh = td->planeheight[c];
107 405 const int slice_start = (outh * jobnr) / nb_jobs;
108 405 const int slice_end = (outh * (jobnr+1)) / nb_jobs;
109 405 const int ref_linesize = td->ref_linesize[c];
110 405 const int main_linesize = td->main_linesize[c];
111 405 const uint8_t *main_line = td->main_data[c] + main_linesize * slice_start;
112 405 const uint8_t *ref_line = td->ref_data[c] + ref_linesize * slice_start;
113 405 uint64_t m = 0;
114
2/2
✓ Branch 0 taken 7920 times.
✓ Branch 1 taken 405 times.
8325 for (int i = slice_start; i < slice_end; i++) {
115 7920 m += td->dsp->sse_line(main_line, ref_line, outw);
116 7920 ref_line += ref_linesize;
117 7920 main_line += main_linesize;
118 }
119 405 score[c] = m;
120 }
121
122 126 return 0;
123 }
124
125 118 static void set_meta(AVDictionary **metadata, const char *key, char comp, float d)
126 {
127 char value[128];
128 118 snprintf(value, sizeof(value), "%f", d);
129
2/2
✓ Branch 0 taken 90 times.
✓ Branch 1 taken 28 times.
118 if (comp) {
130 char key2[128];
131 90 snprintf(key2, sizeof(key2), "%s%c", key, comp);
132 90 av_dict_set(metadata, key2, value, 0);
133 } else {
134 28 av_dict_set(metadata, key, value, 0);
135 }
136 118 }
137
138 14 static int do_psnr(FFFrameSync *fs)
139 {
140 14 AVFilterContext *ctx = fs->parent;
141 14 PSNRContext *s = ctx->priv;
142 AVFrame *master, *ref;
143 14 double comp_mse[4], mse = 0.;
144 14 uint64_t comp_sum[4] = { 0 };
145 AVDictionary **metadata;
146 ThreadData td;
147 int ret;
148
149 14 ret = ff_framesync_dualinput_get(fs, &master, &ref);
150
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 14 times.
14 if (ret < 0)
151 return ret;
152
2/4
✓ Branch 0 taken 14 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 14 times.
14 if (ctx->is_disabled || !ref)
153 return ff_filter_frame(ctx->outputs[0], master);
154 14 metadata = &master->metadata;
155
156 14 td.nb_components = s->nb_components;
157 14 td.dsp = &s->dsp;
158 14 td.score = s->score;
159
2/2
✓ Branch 0 taken 45 times.
✓ Branch 1 taken 14 times.
59 for (int c = 0; c < s->nb_components; c++) {
160 45 td.main_data[c] = master->data[c];
161 45 td.ref_data[c] = ref->data[c];
162 45 td.main_linesize[c] = master->linesize[c];
163 45 td.ref_linesize[c] = ref->linesize[c];
164 45 td.planewidth[c] = s->planewidth[c];
165 45 td.planeheight[c] = s->planeheight[c];
166 }
167
168
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 14 times.
14 if (master->color_range != ref->color_range) {
169 av_log(ctx, AV_LOG_WARNING, "master and reference "
170 "frames use different color ranges (%s != %s)\n",
171 av_color_range_name(master->color_range),
172 av_color_range_name(ref->color_range));
173 }
174
175 14 ff_filter_execute(ctx, compute_images_mse, &td, NULL,
176 14 FFMIN(s->planeheight[1], s->nb_threads));
177
178
2/2
✓ Branch 0 taken 126 times.
✓ Branch 1 taken 14 times.
140 for (int j = 0; j < s->nb_threads; j++) {
179
2/2
✓ Branch 0 taken 405 times.
✓ Branch 1 taken 126 times.
531 for (int c = 0; c < s->nb_components; c++)
180 405 comp_sum[c] += s->score[j][c];
181 }
182
183
2/2
✓ Branch 0 taken 45 times.
✓ Branch 1 taken 14 times.
59 for (int c = 0; c < s->nb_components; c++)
184 45 comp_mse[c] = comp_sum[c] / ((double)s->planewidth[c] * s->planeheight[c]);
185
186
2/2
✓ Branch 0 taken 45 times.
✓ Branch 1 taken 14 times.
59 for (int c = 0; c < s->nb_components; c++)
187 45 mse += comp_mse[c] * s->planeweight[c];
188
189
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 8 times.
14 s->min_mse = FFMIN(s->min_mse, mse);
190
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 14 times.
14 s->max_mse = FFMAX(s->max_mse, mse);
191
192 14 s->mse += mse;
193
194
2/2
✓ Branch 0 taken 45 times.
✓ Branch 1 taken 14 times.
59 for (int j = 0; j < s->nb_components; j++)
195 45 s->mse_comp[j] += comp_mse[j];
196 14 s->nb_frames++;
197
198
2/2
✓ Branch 0 taken 45 times.
✓ Branch 1 taken 14 times.
59 for (int j = 0; j < s->nb_components; j++) {
199
2/2
✓ Branch 0 taken 30 times.
✓ Branch 1 taken 15 times.
45 int c = s->is_rgb ? s->rgba_map[j] : j;
200 45 set_meta(metadata, "lavfi.psnr.mse.", s->comps[j], comp_mse[c]);
201 45 set_meta(metadata, "lavfi.psnr.psnr.", s->comps[j], get_psnr(comp_mse[c], 1, s->max[c]));
202 }
203 14 set_meta(metadata, "lavfi.psnr.mse_avg", 0, mse);
204 14 set_meta(metadata, "lavfi.psnr.psnr_avg", 0, get_psnr(mse, 1, s->average_max));
205
206
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 14 times.
14 if (s->stats_file) {
207 if (s->stats_version == 2 && !s->stats_header_written) {
208 fprintf(s->stats_file, "psnr_log_version:2 fields:n");
209 fprintf(s->stats_file, ",mse_avg");
210 for (int j = 0; j < s->nb_components; j++) {
211 fprintf(s->stats_file, ",mse_%c", s->comps[j]);
212 }
213 fprintf(s->stats_file, ",psnr_avg");
214 for (int j = 0; j < s->nb_components; j++) {
215 fprintf(s->stats_file, ",psnr_%c", s->comps[j]);
216 }
217 if (s->stats_add_max) {
218 fprintf(s->stats_file, ",max_avg");
219 for (int j = 0; j < s->nb_components; j++) {
220 fprintf(s->stats_file, ",max_%c", s->comps[j]);
221 }
222 }
223 fprintf(s->stats_file, "\n");
224 s->stats_header_written = 1;
225 }
226 fprintf(s->stats_file, "n:%"PRId64" mse_avg:%0.2f ", s->nb_frames, mse);
227 for (int j = 0; j < s->nb_components; j++) {
228 int c = s->is_rgb ? s->rgba_map[j] : j;
229 fprintf(s->stats_file, "mse_%c:%0.2f ", s->comps[j], comp_mse[c]);
230 }
231 fprintf(s->stats_file, "psnr_avg:%0.2f ", get_psnr(mse, 1, s->average_max));
232 for (int j = 0; j < s->nb_components; j++) {
233 int c = s->is_rgb ? s->rgba_map[j] : j;
234 fprintf(s->stats_file, "psnr_%c:%0.2f ", s->comps[j],
235 get_psnr(comp_mse[c], 1, s->max[c]));
236 }
237 if (s->stats_version == 2 && s->stats_add_max) {
238 fprintf(s->stats_file, "max_avg:%d ", s->average_max);
239 for (int j = 0; j < s->nb_components; j++) {
240 int c = s->is_rgb ? s->rgba_map[j] : j;
241 fprintf(s->stats_file, "max_%c:%d ", s->comps[j], s->max[c]);
242 }
243 }
244 fprintf(s->stats_file, "\n");
245 }
246
247 14 return ff_filter_frame(ctx->outputs[0], master);
248 }
249
250 12 static av_cold int init(AVFilterContext *ctx)
251 {
252 12 PSNRContext *s = ctx->priv;
253
254 12 s->min_mse = +INFINITY;
255 12 s->max_mse = -INFINITY;
256
257
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 12 times.
12 if (s->stats_file_str) {
258 if (s->stats_version < 2 && s->stats_add_max) {
259 av_log(ctx, AV_LOG_ERROR,
260 "stats_add_max was specified but stats_version < 2.\n" );
261 return AVERROR(EINVAL);
262 }
263 if (!strcmp(s->stats_file_str, "-")) {
264 s->stats_file = stdout;
265 } else {
266 s->stats_file = avpriv_fopen_utf8(s->stats_file_str, "w");
267 if (!s->stats_file) {
268 int err = AVERROR(errno);
269 av_log(ctx, AV_LOG_ERROR, "Could not open stats file %s: %s\n",
270 s->stats_file_str, av_err2str(err));
271 return err;
272 }
273 }
274 }
275
276 12 s->fs.on_event = do_psnr;
277 12 return 0;
278 }
279
280 static const enum AVPixelFormat pix_fmts[] = {
281 AV_PIX_FMT_GRAY8, AV_PIX_FMT_GRAY9, AV_PIX_FMT_GRAY10, AV_PIX_FMT_GRAY12, AV_PIX_FMT_GRAY14, AV_PIX_FMT_GRAY16,
282 #define PF_NOALPHA(suf) AV_PIX_FMT_YUV420##suf, AV_PIX_FMT_YUV422##suf, AV_PIX_FMT_YUV444##suf
283 #define PF_ALPHA(suf) AV_PIX_FMT_YUVA420##suf, AV_PIX_FMT_YUVA422##suf, AV_PIX_FMT_YUVA444##suf
284 #define PF(suf) PF_NOALPHA(suf), PF_ALPHA(suf)
285 PF(P), PF(P9), PF(P10), PF_NOALPHA(P12), PF_NOALPHA(P14), PF(P16),
286 AV_PIX_FMT_YUV440P, AV_PIX_FMT_YUV411P, AV_PIX_FMT_YUV410P,
287 AV_PIX_FMT_YUVJ411P, AV_PIX_FMT_YUVJ420P, AV_PIX_FMT_YUVJ422P,
288 AV_PIX_FMT_YUVJ440P, AV_PIX_FMT_YUVJ444P,
289 AV_PIX_FMT_GBRP, AV_PIX_FMT_GBRP9, AV_PIX_FMT_GBRP10,
290 AV_PIX_FMT_GBRP12, AV_PIX_FMT_GBRP14, AV_PIX_FMT_GBRP16,
291 AV_PIX_FMT_GBRAP, AV_PIX_FMT_GBRAP10, AV_PIX_FMT_GBRAP12, AV_PIX_FMT_GBRAP16,
292 AV_PIX_FMT_NONE
293 };
294
295 6 static int config_input_ref(AVFilterLink *inlink)
296 {
297 6 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(inlink->format);
298 6 AVFilterContext *ctx = inlink->dst;
299 6 PSNRContext *s = ctx->priv;
300 double average_max;
301 unsigned sum;
302 int j;
303
304 6 s->nb_threads = ff_filter_get_nb_threads(ctx);
305 6 s->nb_components = desc->nb_components;
306
1/2
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
6 if (ctx->inputs[0]->w != ctx->inputs[1]->w ||
307
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
6 ctx->inputs[0]->h != ctx->inputs[1]->h) {
308 av_log(ctx, AV_LOG_ERROR, "Width and height of input videos must be same.\n");
309 return AVERROR(EINVAL);
310 }
311
312 6 s->max[0] = (1 << desc->comp[0].depth) - 1;
313 6 s->max[1] = (1 << desc->comp[1].depth) - 1;
314 6 s->max[2] = (1 << desc->comp[2].depth) - 1;
315 6 s->max[3] = (1 << desc->comp[3].depth) - 1;
316
317 6 s->is_rgb = ff_fill_rgba_map(s->rgba_map, inlink->format) >= 0;
318
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 1 times.
6 s->comps[0] = s->is_rgb ? 'r' : 'y' ;
319
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 1 times.
6 s->comps[1] = s->is_rgb ? 'g' : 'u' ;
320
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 1 times.
6 s->comps[2] = s->is_rgb ? 'b' : 'v' ;
321 6 s->comps[3] = 'a';
322
323 6 s->planeheight[1] = s->planeheight[2] = AV_CEIL_RSHIFT(inlink->h, desc->log2_chroma_h);
324 6 s->planeheight[0] = s->planeheight[3] = inlink->h;
325 6 s->planewidth[1] = s->planewidth[2] = AV_CEIL_RSHIFT(inlink->w, desc->log2_chroma_w);
326 6 s->planewidth[0] = s->planewidth[3] = inlink->w;
327 6 sum = 0;
328
2/2
✓ Branch 0 taken 21 times.
✓ Branch 1 taken 6 times.
27 for (j = 0; j < s->nb_components; j++)
329 21 sum += s->planeheight[j] * s->planewidth[j];
330 6 average_max = 0;
331
2/2
✓ Branch 0 taken 21 times.
✓ Branch 1 taken 6 times.
27 for (j = 0; j < s->nb_components; j++) {
332 21 s->planeweight[j] = (double) s->planeheight[j] * s->planewidth[j] / sum;
333 21 average_max += s->max[j] * s->planeweight[j];
334 }
335 6 s->average_max = lrint(average_max);
336
337 6 ff_psnr_init(&s->dsp, desc->comp[0].depth);
338
339 6 s->score = av_calloc(s->nb_threads, sizeof(*s->score));
340
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
6 if (!s->score)
341 return AVERROR(ENOMEM);
342
343
2/2
✓ Branch 0 taken 54 times.
✓ Branch 1 taken 6 times.
60 for (int t = 0; t < s->nb_threads; t++) {
344 54 s->score[t] = av_calloc(s->nb_components, sizeof(*s->score[0]));
345
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 54 times.
54 if (!s->score[t])
346 return AVERROR(ENOMEM);
347 }
348
349 6 return 0;
350 }
351
352 6 static int config_output(AVFilterLink *outlink)
353 {
354 6 AVFilterContext *ctx = outlink->src;
355 6 PSNRContext *s = ctx->priv;
356 6 AVFilterLink *mainlink = ctx->inputs[0];
357 6 FilterLink *il = ff_filter_link(mainlink);
358 6 FilterLink *ol = ff_filter_link(outlink);
359 int ret;
360
361 6 ret = ff_framesync_init_dualinput(&s->fs, ctx);
362
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
6 if (ret < 0)
363 return ret;
364 6 outlink->w = mainlink->w;
365 6 outlink->h = mainlink->h;
366 6 outlink->time_base = mainlink->time_base;
367 6 outlink->sample_aspect_ratio = mainlink->sample_aspect_ratio;
368 6 ol->frame_rate = il->frame_rate;
369
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 6 times.
6 if ((ret = ff_framesync_configure(&s->fs)) < 0)
370 return ret;
371
372 6 outlink->time_base = s->fs.time_base;
373
374
2/4
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 times.
12 if (av_cmp_q(mainlink->time_base, outlink->time_base) ||
375 6 av_cmp_q(ctx->inputs[1]->time_base, outlink->time_base))
376 av_log(ctx, AV_LOG_WARNING, "not matching timebases found between first input: %d/%d and second input %d/%d, results may be incorrect!\n",
377 mainlink->time_base.num, mainlink->time_base.den,
378 ctx->inputs[1]->time_base.num, ctx->inputs[1]->time_base.den);
379
380 6 return 0;
381 }
382
383 58 static int activate(AVFilterContext *ctx)
384 {
385 58 PSNRContext *s = ctx->priv;
386 58 return ff_framesync_activate(&s->fs);
387 }
388
389 12 static av_cold void uninit(AVFilterContext *ctx)
390 {
391 12 PSNRContext *s = ctx->priv;
392
393
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 6 times.
12 if (s->nb_frames > 0) {
394 int j;
395 char buf[256];
396
397 6 buf[0] = 0;
398
2/2
✓ Branch 0 taken 21 times.
✓ Branch 1 taken 6 times.
27 for (j = 0; j < s->nb_components; j++) {
399
2/2
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 3 times.
21 int c = s->is_rgb ? s->rgba_map[j] : j;
400 21 av_strlcatf(buf, sizeof(buf), " %c:%f", s->comps[j],
401 get_psnr(s->mse_comp[c], s->nb_frames, s->max[c]));
402 }
403 6 av_log(ctx, AV_LOG_INFO, "PSNR%s average:%f min:%f max:%f\n",
404 buf,
405 get_psnr(s->mse, s->nb_frames, s->average_max),
406 get_psnr(s->max_mse, 1, s->average_max),
407 get_psnr(s->min_mse, 1, s->average_max));
408 }
409
410 12 ff_framesync_uninit(&s->fs);
411
3/4
✓ Branch 0 taken 54 times.
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 54 times.
✗ Branch 3 not taken.
66 for (int t = 0; t < s->nb_threads && s->score; t++)
412 54 av_freep(&s->score[t]);
413 12 av_freep(&s->score);
414
415
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
12 if (s->stats_file && s->stats_file != stdout)
416 fclose(s->stats_file);
417 12 }
418
419 static const AVFilterPad psnr_inputs[] = {
420 {
421 .name = "main",
422 .type = AVMEDIA_TYPE_VIDEO,
423 },{
424 .name = "reference",
425 .type = AVMEDIA_TYPE_VIDEO,
426 .config_props = config_input_ref,
427 },
428 };
429
430 static const AVFilterPad psnr_outputs[] = {
431 {
432 .name = "default",
433 .type = AVMEDIA_TYPE_VIDEO,
434 .config_props = config_output,
435 },
436 };
437
438 const FFFilter ff_vf_psnr = {
439 .p.name = "psnr",
440 .p.description = NULL_IF_CONFIG_SMALL("Calculate the PSNR between two video streams."),
441 .p.priv_class = &psnr_class,
442 .p.flags = AVFILTER_FLAG_SUPPORT_TIMELINE_INTERNAL |
443 AVFILTER_FLAG_SLICE_THREADS |
444 AVFILTER_FLAG_METADATA_ONLY,
445 .preinit = psnr_framesync_preinit,
446 .init = init,
447 .uninit = uninit,
448 .activate = activate,
449 .priv_size = sizeof(PSNRContext),
450 FILTER_INPUTS(psnr_inputs),
451 FILTER_OUTPUTS(psnr_outputs),
452 FILTER_PIXFMTS_ARRAY(pix_fmts),
453 };
454

叙字五行属什么 尿素是什么肥 517是什么星座 雪白的什么 矿物油是什么油
宫颈欠光滑是什么意思 右肋骨下方隐隐疼痛是什么原因 喝茶失眠是什么原因 女人喜欢什么样的男人 梦见鳄鱼是什么意思
做活检是什么意思 ala是什么氨基酸 大水冲了龙王庙什么意思 蛇缠腰是什么病怎么治 陌上花开可缓缓归矣什么意思
摩羯座女和什么星座最配 源源不断是什么意思 蚊虫叮咬红肿用什么药 梦见和妈妈吵架是什么意思 高沫是什么茶
1994年属什么生肖hcv8jop3ns8r.cn 八大碗都有什么菜hcv8jop9ns7r.cn 动物的耳朵有什么作用hcv9jop6ns7r.cn hvp是什么hcv8jop3ns8r.cn 凌波仙子是什么花hcv7jop5ns4r.cn
排骨炖什么hcv8jop3ns8r.cn 两肺散在小结节是什么意思hcv8jop2ns5r.cn 什么是根管治疗牙齿hcv9jop5ns2r.cn 手抖吃什么药最好hcv7jop5ns5r.cn 海南有什么水果hcv8jop1ns3r.cn
甲亢是什么引起的hcv8jop6ns7r.cn 什么的苹果hcv7jop4ns8r.cn 鳄鱼为什么流眼泪hcv7jop9ns7r.cn k是什么单位ff14chat.com 小的五行属什么hcv8jop4ns7r.cn
邪火是什么意思inbungee.com 双脚冰凉是什么原因hcv8jop2ns7r.cn 梦见白萝卜是什么意思jiuxinfghf.com 三岁打什么疫苗hcv8jop5ns4r.cn 梦见穿裤子是什么意思hcv9jop3ns6r.cn
百度