幽门螺旋杆菌的症状是什么| 经常催吐有什么危害| 吃什么才能减肥| 24小时动态脑电图能查出什么| 头疼流鼻血是什么原因| 晚上看见蛇预示着什么| 情人节送什么礼物好| 去乙酰毛花苷又叫什么| 命悬一线的意思是什么| 央行放水是什么意思| 奇花异草的异什么意思| 荔枝适合什么地方种植| o型血溶血是什么意思| 银饰发黑是什么原因| 岁寒三友是指什么| 全身而退是什么意思| 9像什么| 金生水什么意思| 鼻塞吃什么药| 氩弧焊对身体有什么危害| 干贝是什么东西| 一个大一个多念什么| 什么是酮体| 孩子改姓需要什么手续| 猴子吃什么食物| 胃食管反流用什么药| 宝宝病毒性感冒吃什么药效果好| 下巴老是长痘痘是什么原因| apl医学上是什么意思| 晚上吃什么水果好| 孕酮低对胎儿有什么影响| 吐槽什么意思| 谍影重重4为什么换主角| 人的五官指什么| 什么是跨性别者| 梦见洗澡是什么预兆| 7月15是什么星座的| 手背肿胀是什么原因| 香膏是什么| 胡萝卜什么颜色| 胃穿孔是什么原因引起的| 尿路感染不能吃什么东西| 718什么星座| 夏天水肿的原因是什么| lemon是什么意思| cpc是什么| 健康的舌苔是什么样的| 公务员五行属什么| 童心未泯是什么意思| 猫吐是什么原因| 轧戏是什么意思| 冥想什么意思| hrd是什么| 发蜡和发泥有什么区别| 叶凡为什么找石昊求救| 为什么一热就头疼| 县人武部政委什么级别| 月经少吃什么好排血多| 儿童乘坐飞机需要什么证件| 普洱在云南什么位置| 谷氨酰转肽酶高什么原因| 武汉有什么好玩的地方| 鸡五行属什么| 壬寅年五行属什么| 眼睛视力模糊用什么眼药水| 天数是什么意思| 边际贡献是什么意思| 手上长水泡是什么原因| 玫瑰金是什么颜色| 一直不来月经是什么原因| 空调买什么牌子好| 岳飞为什么必须死| 兔子跟什么生肖最配对| 77年什么命| 会所是什么意思| 糜烂性胃炎吃什么药好| 什么是三伏贴| 突然眼睛充血是什么原因引起的| 7月初二是什么星座| qq会员有什么用| 学名是什么意思| 一的五行属性是什么| 猫咪弓背是什么原因| 什么不及| 例假提前来是什么原因| sd什么意思| 芋头是什么季节的| 在水一方什么意思| 晚餐吃什么| 风湿性心脏病是什么原因引起的| 罚的部首是什么| 保护心脏吃什么最好| 尿酸吃什么药最有效果| 红糖水什么时候喝最好| 女人小便带血是什么原因引起的| 陆家嘴为什么叫陆家嘴| 丝瓜有什么营养| 血压高是什么原因引起的| 肝内脂质沉积是什么意思| cuff是什么意思| 回奶吃什么| 注意力不集中是什么原因| exr是什么牌子| 腿肿脚肿是什么原因引起的| 舌头热灼是什么原因| 香蕉吃多了有什么坏处| 孕晚期羊水多了对宝宝有什么影响| 不寐病是什么意思| 手肿是什么病的前兆| 辄是什么意思| 发糕是什么做的| 提莫是什么意思| ra是什么意思| 经常喝饮料有什么危害| 分泌物豆腐渣状是什么原因| 纳少是什么意思| 文爱是什么意思| 软水是什么水| 拉尿有泡沫是什么原因| 眼睛出血是什么原因| 测测你天生靠什么吃饭| rem是什么意思| 榴莲是什么味道| 乳酸阈值是什么意思| 摇呼啦圈有什么好处| 梦见好多死鱼是什么意思| 高反吃什么药| 腰部酸胀是什么原因| 范字五行属什么| 得了阴虱用什么药能除根| 中元节与什么生肖有关| 警察两杠三星是什么级别| 气管炎用什么药| 西瓜不可以和什么同食| 胃在什么地方| 酸奶有什么好处| 是谁送你来到我身边是什么歌| 牛的本命佛是什么佛| 手脚麻木挂什么科| 桑寄生是什么| 时间短吃什么药| 吃什么治白头发| 桃子吃多了有什么坏处| 内窗是什么意思| 什么啤酒度数高| 白咖啡是什么| 眼皮红肿是什么原因引起的| 腰椎挂什么科室| 14岁属什么| 高血压吃什么降压药| 李子什么颜色| gpt是什么意思| 去势是什么意思| 胸前有痣代表什么意思| 什么汗滴| 什么专业好找工作| 他达拉非是什么药| 泌尿科看什么病| 备孕前准备吃什么叶酸| 什么时候开始| 肚脐右边疼是什么原因| 1985年属牛是什么命| 喝什么排湿气| 全可以加什么偏旁| 说话不清楚是什么原因导致的| 秃鹫是什么动物| 王景读什么| 手脚浮肿是什么原因| 瑶五行属什么| 国家电网是什么编制| 打生长激素有什么副作用| ch4是什么气体| 阁老相当于现在什么官| 辣椒代表什么生肖| 女性尿频挂什么科| 螃蟹的什么部位不能吃| 8月20号什么星座| 肾疼是什么症状| 臆想症是什么病| 暴力倾向的人有什么表现| 嗪读什么| 6月29日是什么星座| 大荔冬枣什么时候成熟| cpi下降意味着什么| 生不如死是什么意思| 4月7日什么星座| 路程等于什么| 门槛是什么意思| 阴湿是什么意思| 隐形眼镜护理液可以用什么代替| 男人时间短吃什么药好| 游走性疼痛挂什么科| 什么花走着开| 肠梗阻是什么症状| 矿油是什么| 潮起潮落是什么意思| 漪字五行属什么| 1945年属什么| 卖关子是什么意思| 伯母是什么意思| 原则性问题是什么意思| 恐龙的祖先是什么| 什么的宝石| 泌尿科主要看什么病| 什么是基因突变| 妈妈是什么意思呢| 子宫前位后位有什么区别| 妇科做活检是什么意思| 小山羊是什么病| 三顾茅庐的顾是什么意思| 茹什么饮什么| 失眠吃什么中成药效果最好| 公务员什么时候退休| beyond是什么意思| 中将相当于什么级别| 小腿酸痛什么原因| 雷锋代表什么生肖| 什么药能治阳痿早泄| 阴道内壁是什么样的| 魔芋是什么| 刚开始怀孕会有什么症状| 属蛇的贵人是什么属相| nsaid是什么药| 抱窝是什么意思| 浑什么意思| 荨麻疹吃什么药好得快| 感染了hpv有什么症状| 高血糖能吃什么| 红薯是什么季节的| 10月出生是什么星座| 两弹一星是什么| 柏拉图爱情是什么意思| 舌苔黄厚是什么原因| bc什么意思| 孕妇鼻子出血是什么原因| 用什么泡脚可以活血化瘀疏通经络| 小脑萎缩吃什么药效果最好| 活水是什么意思| 油条吃多了有什么危害| 胃反酸水是什么原因| 九条鱼代表什么意思| 合肥有什么好玩的地方| 艳羡是什么意思| 漂头发是什么意思| 扒是什么意思| 维酶素片搭配什么药治萎缩性胃炎| 肠易激综合征中医叫什么| 缺钾最明显的症状是什么| 两个人一个且念什么| 男人遗精是什么原因造成的| 脑宁又叫什么名字| 吃花生米有什么好处| 姨妈期吃什么| 性激素六项是什么| 恒牙是什么牙| 盛世的意思是什么| 心脏早搏是什么原因造成的| 唐筛是检查什么的| 苹果为什么叫苹果| 派出所所长什么级别| 什么茶可以减肥| egfr医学上是什么意思| 麒麟长什么样| 七年是什么婚| 百度

上海有什么好玩的


Directory: ../../../ffmpeg/
File: src/libavfilter/vf_spp.c
Date: 2025-08-04 00:43:16
Exec Total Coverage
Lines: 151 207 72.9%
Functions: 9 13 69.2%
Branches: 71 141 50.4%

Line Branch Exec Source
1 /*
2 * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at>
3 * Copyright (c) 2013 Clément B?sch <u pkh me>
4 *
5 * This file is part of FFmpeg.
6 *
7 * FFmpeg is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 *
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License along
18 * with FFmpeg; if not, write to the Free Software Foundation, Inc.,
19 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20 */
21
22 /**
23 * @file
24 * Simple post processing filter
25 *
26 * This implementation is based on an algorithm described in
27 * "Aria Nosratinia Embedded Post-Processing for
28 * Enhancement of Compressed Images (1999)"
29 *
30 * Originally written by Michael Niedermayer for the MPlayer project, and
31 * ported by Clément B?sch for FFmpeg.
32 */
33
34 #include "libavutil/emms.h"
35 #include "libavutil/imgutils.h"
36 #include "libavutil/mem.h"
37 #include "libavutil/mem_internal.h"
38 #include "libavutil/opt.h"
39 #include "libavutil/pixdesc.h"
40
41 #include "filters.h"
42 #include "qp_table.h"
43 #include "vf_spp.h"
44 #include "video.h"
45
46 enum mode {
47 MODE_HARD,
48 MODE_SOFT,
49 NB_MODES
50 };
51
52 static const AVClass *child_class_iterate(void **iter)
53 {
54 const AVClass *c = *iter ? NULL : avcodec_dct_get_class();
55 *iter = (void*)(uintptr_t)c;
56 return c;
57 }
58
59 4 static void *child_next(void *obj, void *prev)
60 {
61 4 SPPContext *s = obj;
62
1/2
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
4 return prev ? NULL : s->dct;
63 }
64
65 #define OFFSET(x) offsetof(SPPContext, x)
66 #define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM
67 #define TFLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_RUNTIME_PARAM
68 static const AVOption spp_options[] = {
69 { "quality", "set quality", OFFSET(log2_count), AV_OPT_TYPE_INT, {.i64 = 3}, 0, MAX_LEVEL, TFLAGS },
70 { "qp", "force a constant quantizer parameter", OFFSET(qp), AV_OPT_TYPE_INT, {.i64 = 0}, 0, 63, FLAGS },
71 { "mode", "set thresholding mode", OFFSET(mode), AV_OPT_TYPE_INT, {.i64 = MODE_HARD}, 0, NB_MODES - 1, FLAGS, .unit = "mode" },
72 { "hard", "hard thresholding", 0, AV_OPT_TYPE_CONST, {.i64 = MODE_HARD}, INT_MIN, INT_MAX, FLAGS, .unit = "mode" },
73 { "soft", "soft thresholding", 0, AV_OPT_TYPE_CONST, {.i64 = MODE_SOFT}, INT_MIN, INT_MAX, FLAGS, .unit = "mode" },
74 { "use_bframe_qp", "use B-frames' QP", OFFSET(use_bframe_qp), AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, FLAGS },
75 { NULL }
76 };
77
78 static const AVClass spp_class = {
79 .class_name = "spp",
80 .item_name = av_default_item_name,
81 .option = spp_options,
82 .version = LIBAVUTIL_VERSION_INT,
83 .category = AV_CLASS_CATEGORY_FILTER,
84 .child_class_iterate = child_class_iterate,
85 .child_next = child_next,
86 };
87
88 // XXX: share between filters?
89 DECLARE_ALIGNED(8, static const uint8_t, ldither)[8][8] = {
90 { 0, 48, 12, 60, 3, 51, 15, 63 },
91 { 32, 16, 44, 28, 35, 19, 47, 31 },
92 { 8, 56, 4, 52, 11, 59, 7, 55 },
93 { 40, 24, 36, 20, 43, 27, 39, 23 },
94 { 2, 50, 14, 62, 1, 49, 13, 61 },
95 { 34, 18, 46, 30, 33, 17, 45, 29 },
96 { 10, 58, 6, 54, 9, 57, 5, 53 },
97 { 42, 26, 38, 22, 41, 25, 37, 21 },
98 };
99
100 static const uint8_t offset[128][2] = {
101 {0,0}, // unused
102 {0,0},
103 {0,0}, {4,4}, // quality = 1
104 {0,0}, {2,2}, {6,4}, {4,6}, // quality = 2
105 {0,0}, {5,1}, {2,2}, {7,3}, {4,4}, {1,5}, {6,6}, {3,7}, // quality = 3
106
107 {0,0}, {4,0}, {1,1}, {5,1}, {3,2}, {7,2}, {2,3}, {6,3}, // quality = 4
108 {0,4}, {4,4}, {1,5}, {5,5}, {3,6}, {7,6}, {2,7}, {6,7},
109
110 {0,0}, {0,2}, {0,4}, {0,6}, {1,1}, {1,3}, {1,5}, {1,7}, // quality = 5
111 {2,0}, {2,2}, {2,4}, {2,6}, {3,1}, {3,3}, {3,5}, {3,7},
112 {4,0}, {4,2}, {4,4}, {4,6}, {5,1}, {5,3}, {5,5}, {5,7},
113 {6,0}, {6,2}, {6,4}, {6,6}, {7,1}, {7,3}, {7,5}, {7,7},
114
115 {0,0}, {4,4}, {0,4}, {4,0}, {2,2}, {6,6}, {2,6}, {6,2}, // quality = 6
116 {0,2}, {4,6}, {0,6}, {4,2}, {2,0}, {6,4}, {2,4}, {6,0},
117 {1,1}, {5,5}, {1,5}, {5,1}, {3,3}, {7,7}, {3,7}, {7,3},
118 {1,3}, {5,7}, {1,7}, {5,3}, {3,1}, {7,5}, {3,5}, {7,1},
119 {0,1}, {4,5}, {0,5}, {4,1}, {2,3}, {6,7}, {2,7}, {6,3},
120 {0,3}, {4,7}, {0,7}, {4,3}, {2,1}, {6,5}, {2,5}, {6,1},
121 {1,0}, {5,4}, {1,4}, {5,0}, {3,2}, {7,6}, {3,6}, {7,2},
122 {1,2}, {5,6}, {1,6}, {5,2}, {3,0}, {7,4}, {3,4}, {7,0},
123 };
124
125 121872 static void hardthresh_c(int16_t dst[64], const int16_t src[64],
126 int qp, const uint8_t *permutation)
127 {
128 int i;
129 121872 int bias = 0; // FIXME
130
131 121872 unsigned threshold1 = qp * ((1<<4) - bias) - 1;
132 121872 unsigned threshold2 = threshold1 << 1;
133
134 121872 memset(dst, 0, 64 * sizeof(dst[0]));
135 121872 dst[0] = (src[0] + 4) >> 3;
136
137
2/2
✓ Branch 0 taken 7677936 times.
✓ Branch 1 taken 121872 times.
7799808 for (i = 1; i < 64; i++) {
138 7677936 int level = src[i];
139
2/2
✓ Branch 0 taken 3400251 times.
✓ Branch 1 taken 4277685 times.
7677936 if (((unsigned)(level + threshold1)) > threshold2) {
140 3400251 const int j = permutation[i];
141 3400251 dst[j] = (level + 4) >> 3;
142 }
143 }
144 121872 }
145
146 static void softthresh_c(int16_t dst[64], const int16_t src[64],
147 int qp, const uint8_t *permutation)
148 {
149 int i;
150 int bias = 0; //FIXME
151
152 unsigned threshold1 = qp * ((1<<4) - bias) - 1;
153 unsigned threshold2 = threshold1 << 1;
154
155 memset(dst, 0, 64 * sizeof(dst[0]));
156 dst[0] = (src[0] + 4) >> 3;
157
158 for (i = 1; i < 64; i++) {
159 int level = src[i];
160 if (((unsigned)(level + threshold1)) > threshold2) {
161 const int j = permutation[i];
162 if (level > 0) dst[j] = (level - threshold1 + 4) >> 3;
163 else dst[j] = (level + threshold1 + 4) >> 3;
164 }
165 }
166 }
167
168 432 static void store_slice_c(uint8_t *dst, const int16_t *src,
169 int dst_linesize, int src_linesize,
170 int width, int height, int log2_scale,
171 const uint8_t dither[8][8])
172 {
173 int y, x;
174
175 #define STORE(pos) do { \
176 temp = (src[x + y*src_linesize + pos] * (1 << log2_scale) + d[pos]) >> 6;\
177 if (temp & 0x100) \
178 temp = ~(temp >> 31); \
179 dst[x + y*dst_linesize + pos] = temp; \
180 } while (0)
181
182
2/2
✓ Branch 0 taken 3456 times.
✓ Branch 1 taken 432 times.
3888 for (y = 0; y < height; y++) {
183 3456 const uint8_t *d = dither[y];
184
2/2
✓ Branch 0 taken 114048 times.
✓ Branch 1 taken 3456 times.
117504 for (x = 0; x < width; x += 8) {
185 int temp;
186
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 114048 times.
114048 STORE(0);
187
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 114046 times.
114048 STORE(1);
188
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 114048 times.
114048 STORE(2);
189
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 114048 times.
114048 STORE(3);
190
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 114048 times.
114048 STORE(4);
191
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 114048 times.
114048 STORE(5);
192
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 114047 times.
114048 STORE(6);
193
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 114048 times.
114048 STORE(7);
194 }
195 }
196 432 }
197
198 static void store_slice16_c(uint16_t *dst, const int16_t *src,
199 int dst_linesize, int src_linesize,
200 int width, int height, int log2_scale,
201 const uint8_t dither[8][8], int depth)
202 {
203 int y, x;
204 unsigned int mask = -1<<depth;
205
206 #define STORE16(pos) do { \
207 temp = (src[x + y*src_linesize + pos] * (1 << log2_scale) + (d[pos]>>1)) >> 5; \
208 if (temp & mask ) \
209 temp = ~(temp >> 31); \
210 dst[x + y*dst_linesize + pos] = temp; \
211 } while (0)
212
213 for (y = 0; y < height; y++) {
214 const uint8_t *d = dither[y];
215 for (x = 0; x < width; x += 8) {
216 int temp;
217 STORE16(0);
218 STORE16(1);
219 STORE16(2);
220 STORE16(3);
221 STORE16(4);
222 STORE16(5);
223 STORE16(6);
224 STORE16(7);
225 }
226 }
227 }
228
229 121872 static inline void add_block(uint16_t *dst, int linesize, const int16_t block[64])
230 {
231 int y;
232
233
2/2
✓ Branch 0 taken 974976 times.
✓ Branch 1 taken 121872 times.
1096848 for (y = 0; y < 8; y++) {
234 974976 dst[0 + y*linesize] += block[0 + y*8];
235 974976 dst[1 + y*linesize] += block[1 + y*8];
236 974976 dst[2 + y*linesize] += block[2 + y*8];
237 974976 dst[3 + y*linesize] += block[3 + y*8];
238 974976 dst[4 + y*linesize] += block[4 + y*8];
239 974976 dst[5 + y*linesize] += block[5 + y*8];
240 974976 dst[6 + y*linesize] += block[6 + y*8];
241 974976 dst[7 + y*linesize] += block[7 + y*8];
242 }
243 121872 }
244
245 18 static void filter(SPPContext *p, uint8_t *dst, uint8_t *src,
246 int dst_linesize, int src_linesize, int width, int height,
247 const uint8_t *qp_table, int qp_stride, int is_luma, int depth)
248 {
249 int x, y, i;
250 18 const int count = 1 << p->log2_count;
251
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 12 times.
18 const int linesize = is_luma ? p->temp_linesize : FFALIGN(width+16, 16);
252 DECLARE_ALIGNED(16, uint64_t, block_align)[32];
253 18 int16_t *block = (int16_t *)block_align;
254 18 int16_t *block2 = (int16_t *)(block_align + 16);
255 18 uint16_t *psrc16 = (uint16_t*)p->src;
256 18 const int sample_bytes = (depth+7) / 8;
257
258
2/2
✓ Branch 0 taken 3456 times.
✓ Branch 1 taken 18 times.
3474 for (y = 0; y < height; y++) {
259 3456 int index = 8 + 8*linesize + y*linesize;
260 3456 memcpy(p->src + index*sample_bytes, src + y*src_linesize, width*sample_bytes);
261
1/2
✓ Branch 0 taken 3456 times.
✗ Branch 1 not taken.
3456 if (sample_bytes == 1) {
262
2/2
✓ Branch 0 taken 27648 times.
✓ Branch 1 taken 3456 times.
31104 for (x = 0; x < 8; x++) {
263 27648 p->src[index - x - 1] = p->src[index + x ];
264 27648 p->src[index + width + x ] = p->src[index + width - x - 1];
265 }
266 } else {
267 for (x = 0; x < 8; x++) {
268 psrc16[index - x - 1] = psrc16[index + x ];
269 psrc16[index + width + x ] = psrc16[index + width - x - 1];
270 }
271 }
272 }
273
2/2
✓ Branch 0 taken 144 times.
✓ Branch 1 taken 18 times.
162 for (y = 0; y < 8; y++) {
274 144 memcpy(p->src + ( 7-y)*linesize * sample_bytes, p->src + ( y+8)*linesize * sample_bytes, linesize * sample_bytes);
275 144 memcpy(p->src + (height+8+y)*linesize * sample_bytes, p->src + (height-y+7)*linesize * sample_bytes, linesize * sample_bytes);
276 }
277
278
2/2
✓ Branch 0 taken 450 times.
✓ Branch 1 taken 18 times.
468 for (y = 0; y < height + 8; y += 8) {
279 450 memset(p->temp + (8 + y) * linesize, 0, 8 * linesize * sizeof(*p->temp));
280
2/2
✓ Branch 0 taken 15234 times.
✓ Branch 1 taken 450 times.
15684 for (x = 0; x < width + 8; x += 8) {
281 int qp;
282
283
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 15234 times.
15234 if (p->qp) {
284 qp = p->qp;
285 } else{
286 15234 const int qps = 3 + is_luma;
287
4/4
✓ Branch 0 taken 450 times.
✓ Branch 1 taken 14784 times.
✓ Branch 2 taken 546 times.
✓ Branch 3 taken 14688 times.
15234 qp = qp_table[(FFMIN(x, width - 1) >> qps) + (FFMIN(y, height - 1) >> qps) * qp_stride];
288
1/2
✓ Branch 1 taken 15234 times.
✗ Branch 2 not taken.
15234 qp = FFMAX(1, ff_norm_qscale(qp, p->qscale_type));
289 }
290
2/2
✓ Branch 0 taken 121872 times.
✓ Branch 1 taken 15234 times.
137106 for (i = 0; i < count; i++) {
291 121872 const int x1 = x + offset[i + count][0];
292 121872 const int y1 = y + offset[i + count][1];
293 121872 const int index = x1 + y1*linesize;
294 121872 p->dct->get_pixels_unaligned(block, p->src + sample_bytes*index, sample_bytes*linesize);
295 121872 p->dct->fdct(block);
296 121872 p->requantize(block2, block, qp, p->dct->idct_permutation);
297 121872 p->dct->idct(block2);
298 121872 add_block(p->temp + index, linesize, block2);
299 }
300 }
301
2/2
✓ Branch 0 taken 432 times.
✓ Branch 1 taken 18 times.
450 if (y) {
302
1/2
✓ Branch 0 taken 432 times.
✗ Branch 1 not taken.
432 if (sample_bytes == 1) {
303 432 p->store_slice(dst + (y - 8) * dst_linesize, p->temp + 8 + y*linesize,
304 dst_linesize, linesize, width,
305 432 FFMIN(8, height + 8 - y), MAX_LEVEL - p->log2_count,
306 ldither);
307 } else {
308 store_slice16_c((uint16_t*)(dst + (y - 8) * dst_linesize), p->temp + 8 + y*linesize,
309 dst_linesize/2, linesize, width,
310 FFMIN(8, height + 8 - y), MAX_LEVEL - p->log2_count,
311 ldither, depth);
312 }
313 }
314 }
315 18 }
316
317 static const enum AVPixelFormat pix_fmts[] = {
318 AV_PIX_FMT_YUV444P, AV_PIX_FMT_YUV422P,
319 AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUV411P,
320 AV_PIX_FMT_YUV410P, AV_PIX_FMT_YUV440P,
321 AV_PIX_FMT_YUVJ444P, AV_PIX_FMT_YUVJ422P,
322 AV_PIX_FMT_YUVJ420P, AV_PIX_FMT_YUVJ440P,
323 AV_PIX_FMT_YUV444P10, AV_PIX_FMT_YUV422P10,
324 AV_PIX_FMT_YUV420P10,
325 AV_PIX_FMT_YUV444P9, AV_PIX_FMT_YUV422P9,
326 AV_PIX_FMT_YUV420P9,
327 AV_PIX_FMT_GRAY8,
328 AV_PIX_FMT_GBRP,
329 AV_PIX_FMT_GBRP9,
330 AV_PIX_FMT_GBRP10,
331 AV_PIX_FMT_NONE
332 };
333
334 1 static int config_input(AVFilterLink *inlink)
335 {
336 1 SPPContext *s = inlink->dst->priv;
337 1 const int h = FFALIGN(inlink->h + 16, 16);
338 1 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(inlink->format);
339 1 const int bps = desc->comp[0].depth;
340
341 1 s->store_slice = store_slice_c;
342
1/3
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
1 switch (s->mode) {
343 1 case MODE_HARD: s->requantize = hardthresh_c; break;
344 case MODE_SOFT: s->requantize = softthresh_c; break;
345 }
346
347 1 av_opt_set_int(s->dct, "bits_per_sample", bps, 0);
348 1 avcodec_dct_init(s->dct);
349
350 #if ARCH_X86
351 1 ff_spp_init_x86(s);
352 #endif
353
354 1 s->hsub = desc->log2_chroma_w;
355 1 s->vsub = desc->log2_chroma_h;
356 1 s->temp_linesize = FFALIGN(inlink->w + 16, 16);
357 1 s->temp = av_malloc_array(s->temp_linesize, h * sizeof(*s->temp));
358 1 s->src = av_malloc_array(s->temp_linesize, h * sizeof(*s->src) * 2);
359
360
2/4
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
1 if (!s->temp || !s->src)
361 return AVERROR(ENOMEM);
362 1 return 0;
363 }
364
365 6 static int filter_frame(AVFilterLink *inlink, AVFrame *in)
366 {
367 6 AVFilterContext *ctx = inlink->dst;
368 6 SPPContext *s = ctx->priv;
369 6 AVFilterLink *outlink = ctx->outputs[0];
370 6 AVFrame *out = in;
371 6 int qp_stride = 0;
372 6 int8_t *qp_table = NULL;
373 6 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(inlink->format);
374 6 const int depth = desc->comp[0].depth;
375 6 int ret = 0;
376
377 /* if we are not in a constant user quantizer mode and we don't want to use
378 * the quantizers from the B-frames (B-frames often have a higher QP), we
379 * need to save the qp table from the last non B-frame; this is what the
380 * following code block does */
381
4/6
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 6 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 4 times.
6 if (!s->qp && (s->use_bframe_qp || in->pict_type != AV_PICTURE_TYPE_B)) {
382 2 ret = ff_qp_table_extract(in, &qp_table, &qp_stride, NULL, &s->qscale_type);
383
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
2 if (ret < 0) {
384 av_frame_free(&in);
385 return ret;
386 }
387
388
2/4
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
2 if (!s->use_bframe_qp && in->pict_type != AV_PICTURE_TYPE_B) {
389 2 av_freep(&s->non_b_qp_table);
390 2 s->non_b_qp_table = qp_table;
391 2 s->non_b_qp_stride = qp_stride;
392 }
393 }
394
395
2/4
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 6 times.
✗ Branch 3 not taken.
6 if (s->log2_count && !ctx->is_disabled) {
396
2/4
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 6 times.
✗ Branch 3 not taken.
6 if (!s->use_bframe_qp && s->non_b_qp_table) {
397 6 qp_table = s->non_b_qp_table;
398 6 qp_stride = s->non_b_qp_stride;
399 }
400
401
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
6 if (qp_table || s->qp) {
402 6 const int cw = AV_CEIL_RSHIFT(inlink->w, s->hsub);
403 6 const int ch = AV_CEIL_RSHIFT(inlink->h, s->vsub);
404
405 /* get a new frame if in-place is not possible or if the dimensions
406 * are not multiple of 8 */
407
4/6
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 5 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 5 times.
6 if (!av_frame_is_writable(in) || (inlink->w & 7) || (inlink->h & 7)) {
408 1 const int aligned_w = FFALIGN(inlink->w, 8);
409 1 const int aligned_h = FFALIGN(inlink->h, 8);
410
411 1 out = ff_get_video_buffer(outlink, aligned_w, aligned_h);
412
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
1 if (!out) {
413 av_frame_free(&in);
414 ret = AVERROR(ENOMEM);
415 goto finish;
416 }
417 1 av_frame_copy_props(out, in);
418 1 out->width = in->width;
419 1 out->height = in->height;
420 }
421
422 6 filter(s, out->data[0], in->data[0], out->linesize[0], in->linesize[0], inlink->w, inlink->h, qp_table, qp_stride, 1, depth);
423
424
1/2
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
6 if (out->data[2]) {
425 6 filter(s, out->data[1], in->data[1], out->linesize[1], in->linesize[1], cw, ch, qp_table, qp_stride, 0, depth);
426 6 filter(s, out->data[2], in->data[2], out->linesize[2], in->linesize[2], cw, ch, qp_table, qp_stride, 0, depth);
427 }
428 6 emms_c();
429 }
430 }
431
432
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 5 times.
6 if (in != out) {
433
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
1 if (in->data[3])
434 av_image_copy_plane(out->data[3], out->linesize[3],
435 in ->data[3], in ->linesize[3],
436 inlink->w, inlink->h);
437 1 av_frame_free(&in);
438 }
439 6 ret = ff_filter_frame(outlink, out);
440 6 finish:
441
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
6 if (qp_table != s->non_b_qp_table)
442 av_freep(&qp_table);
443 6 return ret;
444 }
445
446 static int process_command(AVFilterContext *ctx, const char *cmd, const char *args,
447 char *res, int res_len, int flags)
448 {
449 SPPContext *s = ctx->priv;
450
451 if (!strcmp(cmd, "level") || !strcmp(cmd, "quality")) {
452 if (!strcmp(args, "max"))
453 s->log2_count = MAX_LEVEL;
454 else
455 s->log2_count = av_clip(strtol(args, NULL, 10), 0, MAX_LEVEL);
456 return 0;
457 }
458 return AVERROR(ENOSYS);
459 }
460
461 2 static av_cold int preinit(AVFilterContext *ctx)
462 {
463 2 SPPContext *s = ctx->priv;
464
465 2 s->dct = avcodec_dct_alloc();
466
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
2 if (!s->dct)
467 return AVERROR(ENOMEM);
468
469 2 return 0;
470 }
471
472 2 static av_cold void uninit(AVFilterContext *ctx)
473 {
474 2 SPPContext *s = ctx->priv;
475
476 2 av_freep(&s->temp);
477 2 av_freep(&s->src);
478 2 av_freep(&s->dct);
479 2 av_freep(&s->non_b_qp_table);
480 2 }
481
482 static const AVFilterPad spp_inputs[] = {
483 {
484 .name = "default",
485 .type = AVMEDIA_TYPE_VIDEO,
486 .config_props = config_input,
487 .filter_frame = filter_frame,
488 },
489 };
490
491 const FFFilter ff_vf_spp = {
492 .p.name = "spp",
493 .p.description = NULL_IF_CONFIG_SMALL("Apply a simple post processing filter."),
494 .p.priv_class = &spp_class,
495 .p.flags = AVFILTER_FLAG_SUPPORT_TIMELINE_INTERNAL,
496 .priv_size = sizeof(SPPContext),
497 .preinit = preinit,
498 .uninit = uninit,
499 FILTER_INPUTS(spp_inputs),
500 FILTER_OUTPUTS(ff_video_default_filterpad),
501 FILTER_PIXFMTS_ARRAY(pix_fmts),
502 .process_command = process_command,
503 };
504

有什么意思 替班是什么意思 消防队属于什么编制 舌苔发白是什么症状 经理是什么级别
黥面是什么意思 爱有什么用 喜欢放屁是什么原因 om什么意思 什么是疤痕增生
嘴巴发苦是什么原因 舌头痒是什么原因 小孩子打呼噜是什么原因 肾虚吃什么食物好 痛风不能吃什么
发烧不退烧是什么原因 南方的粽子一般是什么口味 小便无力吃什么药 手指关节肿胀是什么原因 97年属什么生肖
一什么种子hcv7jop9ns4r.cn 拉稀肚子疼吃什么药travellingsim.com 带环了月经推迟不来什么原因hcv8jop8ns1r.cn 黄牌是什么意思hcv8jop0ns0r.cn 左手发麻是什么原因hcv7jop5ns0r.cn
小麦什么时候播种hcv8jop5ns9r.cn 疤痕增生是什么引起的hcv8jop0ns5r.cn 软件开发属于什么行业hcv8jop8ns8r.cn 甲钴胺片主要治什么病hcv8jop0ns3r.cn 晚上睡觉脚抽筋是什么原因引起的hcv7jop6ns2r.cn
水猴子是什么动物hcv8jop8ns8r.cn 甲木命是什么意思hcv8jop5ns2r.cn 双是什么意思hcv8jop0ns6r.cn 小孩嘴唇发红是什么原因hcv8jop4ns0r.cn 男人山根有痣代表什么inbungee.com
什么散步填词语hcv7jop6ns9r.cn 四五月份是什么星座xinjiangjialails.com 断掌什么意思clwhiglsz.com 魄力是什么意思hcv8jop4ns3r.cn 西安有什么好吃的特产imcecn.com
百度