莽是什么意思| 16什么意思| 2022年是什么生肖年| 8月17号是什么星座| 顶嘴是什么意思| 什么动物吃蚊子| 宝宝什么时候添加辅食最好| 什么环境唱什么歌原唱| kitty什么意思| 0.5是什么意思| wrong什么意思| 身上起疙瘩是什么原因| 今年28岁属什么| 什么叫刑事拘留| 松脂是什么| 为什么男人喜欢女人的胸| 双肺呼吸音粗是什么意思| 一月15号是什么星座| 牙周炎用什么药最好| 说什么情深似海我却不敢当| 身体虚弱打什么营养针| mk包包属于什么档次| 葡萄不能和什么一起吃| 广西有什么特产| 爆表是什么意思| 泥鳅喜欢吃什么| 上环要做什么检查| 庙是什么意思| 大力念什么| 歆是什么意思| 28度穿什么衣服合适| 任性的女孩有什么特点| 武警支队长是什么级别| sage什么颜色| ph值是什么意思| progress什么意思| 三金片治什么病| 擦汗的表情是什么意思| 项羽为什么会失败| 脚筋膜炎什么办法恢复的最快| 疯狂动物城里的狐狸叫什么| 西瓜不能和什么一起吃| 山合念什么| 少白头是什么原因| 女人平胸是什么原因| 嗨体水光针有什么功效| 尿路结石吃什么药| 阴阳互补什么意思| 40岁属什么生肖| 丑人多作怪什么意思| 一日三餐是什么生肖| 蛇是什么类动物| 特种兵是什么兵种| 胃糜烂有什么症状| 腿有淤青是什么原因| 甲级战犯是什么意思| 咳嗽能吃什么水果| 上火便秘吃什么最快排便| 放化疗期间吃什么好| 面部神经挂什么科| 沙中土是什么意思| 什么是铅| 福生无量是什么意思| 贫血吃什么可以补血| 狐臭用什么药最好| 鸡蛋为什么不能放冰箱| 乳腺结节是什么症状| 生蚝什么时候最肥| 长痘痘用什么药| 殚精竭虑是什么意思| 常识是什么意思| 车前草治什么病| 风热感冒是什么意思| 黄金分割点是什么| 木耳属于什么类| 左侧卵巢囊肿是什么原因引起的| 脂溢性脱发用什么洗发水好| erdos是什么牌子| 常吃南瓜子有什么好处和坏处| 白手起家是什么生肖| 智人是什么意思| 做透析是什么病| 头发秃一块是什么原因| 稷是什么作物| 日久生情什么意思| 赵本山什么学历| 腹部胀气吃什么药| 肌肉一跳一跳什么原因| 白果治什么病| 女孩叫兮兮是什么意思| 末伏是什么意思| 一心一意指什么生肖| 官官相护是什么意思| ntl是什么意思| 支气管炎改变什么意思| 你好是什么意思| 阴茎进入阴道什么感觉| 惆怅是什么意思| 自尊心是什么意思| 准生证有什么用| 泽去掉三点水念什么| 枪色是什么色| 男人结扎对身体有什么影响| 头晕四肢无力是什么原因| 回奶吃什么快最有效的| 杰瑞是什么品种的老鼠| 云南古代叫什么| 什么样的伤口算开放性| wonderflower是什么牌子| 肺与什么相表里| 吃茄子有什么坏处| 吃茶叶蛋有什么好处和坏处| 友尽是什么意思| asic是什么意思| 日字旁和什么有关| 脊髓损伤有什么症状| 过敏性鼻炎吃什么水果好| 安全期是什么| 梦到别人给钱是什么意思| 鸡蛋不能和什么一起吃| 1月21日什么星座| 后装治疗是什么意思| elephant是什么意思| 身上泡疹是什么引起的| 唉声叹气是什么意思| ibm是做什么的| 胃热吃什么| 468是什么意思| 菠菜和什么不能一起吃| 消融是什么意思| 戈美其鞋子是什么档次| 角化异常性疾病是什么| 身无什么| 虎皮膏药有什么功效| 脉压差大是什么原因| 什么人不宜吃海参| 省政府秘书长什么级别| 来月经吃什么对身体好| 马齿苋什么人不能吃| 心电图t波改变是什么意思| 什么情况下做胃镜| 流产吃什么药| 上海市市委书记是什么级别| 黄皮是什么| 银耳钉变黑了说明什么| 什么时候敷面膜效果最好| 什么的果实| 吃李子不能吃什么| 脖子发麻是什么原因| 传染病八项挂什么科| 降火吃什么| 男性霉菌感染用什么药| 非那雄胺片是什么药| 挂帅是什么意思| 咳绿痰是什么原因| 能吃是福是什么意思| 男人吃什么能延时| wb是什么| 襁褓是什么意思| 心眼是什么意思| 钧鉴是什么意思| 什么是人| 扛扛的是什么意思| 鹿角菜是什么植物| 膀胱结石是什么症状| 柯基犬为什么要断尾巴| dr检查是什么意思| 副镇长是什么级别| 弢是什么意思| 甲状腺双叶回声欠均匀是什么意思| 脆皮鸭什么意思| 11月20号什么星座| 驾临是什么意思| 梦见自己大笑是什么意思| 恍然大悟是什么意思| 小便少是什么原因| 范畴的意思是什么| 舌面有裂纹是什么原因| 313什么意思| 护士证什么时候下来| 为所欲为什么意思| 一九七二年属什么生肖| 糙米是什么| 可尔必思是什么饮料| 什么叫脑白质病变| 做美甲有什么危害| 梦见晒被子是什么意思| 女同是什么| 办电话卡需要什么| 三唑磷主要打什么虫| 真露酒属于什么酒| 晚上睡觉小腿抽筋是什么原因| 打碎碗是什么预兆| 神经痛用什么药| 月与什么有关| crt是什么| 霸王龙吃什么| 孔子的真名叫什么| 做梦梦到牙齿掉了是什么意思| 什么人喜欢天天下雨| 为什么会得阑尾炎| 农历正月初一是什么节日| 适得其反是什么意思| 鸡胗炒什么菜好吃| 哺乳期可以吃什么感冒药| 皮肤属于什么系统| 青霉素过敏可以吃什么消炎药| 滴虫性阴道炎是什么原因引起的| 辐照食品什么意思| 什么也什么造句| 为什么南极比北极冷| 张良为什么不救韩信| black什么颜色| 壁虎长什么样| 张信哲属什么生肖| 阴囊瘙痒是什么原因| 毕加索全名是什么| 三尖瓣反流什么意思| 血糖降不下来是什么原因导致| 2月23号是什么星座| 均可是什么意思| 清洁度二度是什么意思| 脖子发麻是什么原因| 孕妇吃什么盐最好| 吃什么补血最快| crp是什么检查| 毕业礼物送什么| 右手大拇指抖动是什么原因| 吃什么瘦肚子脂肪最快| 原则性问题是什么意思| 膝盖小腿酸软无力是什么原因| 杧果是什么| 水什么| 植脂末是什么东西| 今天生日什么星座| 喉咙痒吃什么药好| 11月20日什么星座| 青龙白虎是什么意思| 左侧上颌窦炎症是什么意思| 阳虚湿热吃什么中成药| 6月21号什么星座| 为人是什么意思| 舌苔有裂纹是什么原因| 糖耐量受损是什么意思| 梦见亲人死了是什么意思| 心脑血管供血不足吃什么药| 什么手机有红外线功能| 躺着头晕是什么原因| 为什么身体没力气也没有精神| baron是什么意思| 甲亢能吃什么| 包茎不割会有什么影响| 化学性肝损伤是指什么| 一个口一个且念什么字| 经常放屁是什么问题| 甲减吃什么盐| 过期食品属于什么垃圾| 麦高芬是什么意思| 你的生命有什么可能| 做梦烧纸钱什么意思| 行货是什么意思| 二月春风似剪刀的上一句是什么| 舌炎是什么症状| 咨客是做什么的| 百度

感动!女模为生孩子双目失明 世上只有妈妈好


Directory: ../../../ffmpeg/
File: src/libavcodec/cavs.c
Date: 2025-08-04 11:35:17
Exec Total Coverage
Lines: 468 484 96.7%
Functions: 27 27 100.0%
Branches: 210 231 90.9%

Line Branch Exec Source
1 /*
2 * Chinese AVS video (AVS1-P2, JiZhun profile) decoder.
3 * Copyright (c) 2006 Stefan Gehrer <stefan.gehrer@gmx.de>
4 *
5 * This file is part of FFmpeg.
6 *
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (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 GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 */
21
22 /**
23 * @file
24 * Chinese AVS video (AVS1-P2, JiZhun profile) decoder
25 * @author Stefan Gehrer <stefan.gehrer@gmx.de>
26 */
27
28 #include "libavutil/mem.h"
29 #include "avcodec.h"
30 #include "golomb.h"
31 #include "h264chroma.h"
32 #include "idctdsp.h"
33 #include "mathops.h"
34 #include "qpeldsp.h"
35 #include "cavs.h"
36
37 static const uint8_t alpha_tab[64] = {
38 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 3, 3,
39 4, 4, 5, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 16, 18, 20,
40 22, 24, 26, 28, 30, 33, 33, 35, 35, 36, 37, 37, 39, 39, 42, 44,
41 46, 48, 50, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64
42 };
43
44 static const uint8_t beta_tab[64] = {
45 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2,
46 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6,
47 6, 7, 7, 7, 8, 8, 8, 9, 9, 10, 10, 11, 11, 12, 13, 14,
48 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 24, 25, 25, 26, 27
49 };
50
51 static const uint8_t tc_tab[64] = {
52 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
53 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2,
54 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4,
55 5, 5, 5, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 9, 9, 9
56 };
57
58 /** mark block as unavailable, i.e. out of picture
59 * or not yet decoded */
60 static const cavs_vector un_mv = { 0, 0, 1, NOT_AVAIL };
61
62 static const int8_t left_modifier_l[8] = { 0, -1, 6, -1, -1, 7, 6, 7 };
63 static const int8_t top_modifier_l[8] = { -1, 1, 5, -1, -1, 5, 7, 7 };
64 static const int8_t left_modifier_c[7] = { 5, -1, 2, -1, 6, 5, 6 };
65 static const int8_t top_modifier_c[7] = { 4, 1, -1, -1, 4, 6, 6 };
66
67 /*****************************************************************************
68 *
69 * in-loop deblocking filter
70 *
71 ****************************************************************************/
72
73 1814140 static inline int get_bs(cavs_vector *mvP, cavs_vector *mvQ, int b)
74 {
75
3/4
✓ Branch 0 taken 1797944 times.
✓ Branch 1 taken 16196 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1797944 times.
1814140 if ((mvP->ref == REF_INTRA) || (mvQ->ref == REF_INTRA))
76 16196 return 2;
77
2/2
✓ Branch 0 taken 1690399 times.
✓ Branch 1 taken 107545 times.
1797944 if((abs(mvP->x - mvQ->x) >= 4) ||
78
2/2
✓ Branch 0 taken 1628114 times.
✓ Branch 1 taken 62285 times.
1690399 (abs(mvP->y - mvQ->y) >= 4) ||
79
2/2
✓ Branch 0 taken 137621 times.
✓ Branch 1 taken 1490493 times.
1628114 (mvP->ref != mvQ->ref))
80 307451 return 1;
81
2/2
✓ Branch 0 taken 1233734 times.
✓ Branch 1 taken 256759 times.
1490493 if (b) {
82 1233734 mvP += MV_BWD_OFFS;
83 1233734 mvQ += MV_BWD_OFFS;
84
2/2
✓ Branch 0 taken 1218990 times.
✓ Branch 1 taken 14744 times.
1233734 if((abs(mvP->x - mvQ->x) >= 4) ||
85
2/2
✓ Branch 0 taken 1210365 times.
✓ Branch 1 taken 8625 times.
1218990 (abs(mvP->y - mvQ->y) >= 4) ||
86
2/2
✓ Branch 0 taken 44966 times.
✓ Branch 1 taken 1165399 times.
1210365 (mvP->ref != mvQ->ref))
87 68335 return 1;
88 }
89 1422158 return 0;
90 }
91
92 #define SET_PARAMS \
93 alpha = alpha_tab[av_clip_uintp2(qp_avg + h->alpha_offset, 6)]; \
94 beta = beta_tab[av_clip_uintp2(qp_avg + h->beta_offset, 6)]; \
95 tc = tc_tab[av_clip_uintp2(qp_avg + h->alpha_offset, 6)];
96
97 /**
98 * in-loop deblocking filter for a single macroblock
99 *
100 * boundary strength (bs) mapping:
101 *
102 * --4---5--
103 * 0 2 |
104 * | 6 | 7 |
105 * 1 3 |
106 * ---------
107 */
108 304585 void ff_cavs_filter(AVSContext *h, enum cavs_mb mb_type)
109 {
110 uint8_t bs[8];
111 int qp_avg, alpha, beta, tc;
112 int i;
113
114 /* save un-deblocked lines */
115 304585 h->topleft_border_y = h->top_border_y[h->mbx * 16 + 15];
116 304585 h->topleft_border_u = h->top_border_u[h->mbx * 10 + 8];
117 304585 h->topleft_border_v = h->top_border_v[h->mbx * 10 + 8];
118 304585 memcpy(&h->top_border_y[h->mbx * 16], h->cy + 15 * h->l_stride, 16);
119 304585 memcpy(&h->top_border_u[h->mbx * 10 + 1], h->cu + 7 * h->c_stride, 8);
120 304585 memcpy(&h->top_border_v[h->mbx * 10 + 1], h->cv + 7 * h->c_stride, 8);
121
2/2
✓ Branch 0 taken 2436680 times.
✓ Branch 1 taken 304585 times.
2741265 for (i = 0; i < 8; i++) {
122 2436680 h->left_border_y[i * 2 + 1] = *(h->cy + 15 + (i * 2 + 0) * h->l_stride);
123 2436680 h->left_border_y[i * 2 + 2] = *(h->cy + 15 + (i * 2 + 1) * h->l_stride);
124 2436680 h->left_border_u[i + 1] = *(h->cu + 7 + i * h->c_stride);
125 2436680 h->left_border_v[i + 1] = *(h->cv + 7 + i * h->c_stride);
126 }
127
1/2
✓ Branch 0 taken 304585 times.
✗ Branch 1 not taken.
304585 if (!h->loop_filter_disable) {
128 /* determine bs */
129
2/2
✓ Branch 0 taken 29448 times.
✓ Branch 1 taken 275137 times.
304585 if (mb_type == I_8X8)
130 29448 memset(bs, 2, 8);
131 else {
132 275137 memset(bs, 0, 8);
133
2/2
✓ Branch 0 taken 177755 times.
✓ Branch 1 taken 97382 times.
275137 if (ff_cavs_partition_flags[mb_type] & SPLITV) {
134 177755 bs[2] = get_bs(&h->mv[MV_FWD_X0], &h->mv[MV_FWD_X1], mb_type > P_8X8);
135 177755 bs[3] = get_bs(&h->mv[MV_FWD_X2], &h->mv[MV_FWD_X3], mb_type > P_8X8);
136 }
137
2/2
✓ Branch 0 taken 179041 times.
✓ Branch 1 taken 96096 times.
275137 if (ff_cavs_partition_flags[mb_type] & SPLITH) {
138 179041 bs[6] = get_bs(&h->mv[MV_FWD_X0], &h->mv[MV_FWD_X2], mb_type > P_8X8);
139 179041 bs[7] = get_bs(&h->mv[MV_FWD_X1], &h->mv[MV_FWD_X3], mb_type > P_8X8);
140 }
141 275137 bs[0] = get_bs(&h->mv[MV_FWD_A1], &h->mv[MV_FWD_X0], mb_type > P_8X8);
142 275137 bs[1] = get_bs(&h->mv[MV_FWD_A3], &h->mv[MV_FWD_X2], mb_type > P_8X8);
143 275137 bs[4] = get_bs(&h->mv[MV_FWD_B2], &h->mv[MV_FWD_X0], mb_type > P_8X8);
144 275137 bs[5] = get_bs(&h->mv[MV_FWD_B3], &h->mv[MV_FWD_X1], mb_type > P_8X8);
145 }
146
2/2
✓ Branch 0 taken 139667 times.
✓ Branch 1 taken 164918 times.
304585 if (AV_RN64(bs)) {
147
2/2
✓ Branch 0 taken 132933 times.
✓ Branch 1 taken 6734 times.
139667 if (h->flags & A_AVAIL) {
148 132933 qp_avg = (h->qp + h->left_qp + 1) >> 1;
149 132933 SET_PARAMS;
150 132933 h->cdsp.cavs_filter_lv(h->cy, h->l_stride, alpha, beta, tc, bs[0], bs[1]);
151 132933 qp_avg = (ff_cavs_chroma_qp[h->qp] + ff_cavs_chroma_qp[h->left_qp] + 1) >> 1;
152 132933 SET_PARAMS;
153 132933 h->cdsp.cavs_filter_cv(h->cu, h->c_stride, alpha, beta, tc, bs[0], bs[1]);
154 132933 h->cdsp.cavs_filter_cv(h->cv, h->c_stride, alpha, beta, tc, bs[0], bs[1]);
155 }
156 139667 qp_avg = h->qp;
157 139667 SET_PARAMS;
158 139667 h->cdsp.cavs_filter_lv(h->cy + 8, h->l_stride, alpha, beta, tc, bs[2], bs[3]);
159 139667 h->cdsp.cavs_filter_lh(h->cy + 8 * h->l_stride, h->l_stride, alpha, beta, tc, bs[6], bs[7]);
160
161
2/2
✓ Branch 0 taken 131217 times.
✓ Branch 1 taken 8450 times.
139667 if (h->flags & B_AVAIL) {
162 131217 qp_avg = (h->qp + h->top_qp[h->mbx] + 1) >> 1;
163 131217 SET_PARAMS;
164 131217 h->cdsp.cavs_filter_lh(h->cy, h->l_stride, alpha, beta, tc, bs[4], bs[5]);
165 131217 qp_avg = (ff_cavs_chroma_qp[h->qp] + ff_cavs_chroma_qp[h->top_qp[h->mbx]] + 1) >> 1;
166 131217 SET_PARAMS;
167 131217 h->cdsp.cavs_filter_ch(h->cu, h->c_stride, alpha, beta, tc, bs[4], bs[5]);
168 131217 h->cdsp.cavs_filter_ch(h->cv, h->c_stride, alpha, beta, tc, bs[4], bs[5]);
169 }
170 }
171 }
172 304585 h->left_qp = h->qp;
173 304585 h->top_qp[h->mbx] = h->qp;
174 304585 }
175
176 #undef SET_PARAMS
177
178 /*****************************************************************************
179 *
180 * spatial intra prediction
181 *
182 ****************************************************************************/
183
184 117792 void ff_cavs_load_intra_pred_luma(AVSContext *h, uint8_t *top,
185 uint8_t **left, int block)
186 {
187 int i;
188
189
4/5
✓ Branch 0 taken 29448 times.
✓ Branch 1 taken 29448 times.
✓ Branch 2 taken 29448 times.
✓ Branch 3 taken 29448 times.
✗ Branch 4 not taken.
117792 switch (block) {
190 29448 case 0:
191 29448 *left = h->left_border_y;
192 29448 h->left_border_y[0] = h->left_border_y[1];
193 29448 memset(&h->left_border_y[17], h->left_border_y[16], 9);
194 29448 memcpy(&top[1], &h->top_border_y[h->mbx * 16], 16);
195 29448 top[17] = top[16];
196 29448 top[0] = top[1];
197
4/4
✓ Branch 0 taken 28996 times.
✓ Branch 1 taken 452 times.
✓ Branch 2 taken 28390 times.
✓ Branch 3 taken 606 times.
29448 if ((h->flags & A_AVAIL) && (h->flags & B_AVAIL))
198 28390 h->left_border_y[0] = top[0] = h->topleft_border_y;
199 29448 break;
200 29448 case 1:
201 29448 *left = h->intern_border_y;
202
2/2
✓ Branch 0 taken 235584 times.
✓ Branch 1 taken 29448 times.
265032 for (i = 0; i < 8; i++)
203 235584 h->intern_border_y[i + 1] = *(h->cy + 7 + i * h->l_stride);
204 29448 memset(&h->intern_border_y[9], h->intern_border_y[8], 9);
205 29448 h->intern_border_y[0] = h->intern_border_y[1];
206 29448 memcpy(&top[1], &h->top_border_y[h->mbx * 16 + 8], 8);
207
2/2
✓ Branch 0 taken 28126 times.
✓ Branch 1 taken 1322 times.
29448 if (h->flags & C_AVAIL)
208 28126 memcpy(&top[9], &h->top_border_y[(h->mbx + 1) * 16], 8);
209 else
210 1322 memset(&top[9], top[8], 9);
211 29448 top[17] = top[16];
212 29448 top[0] = top[1];
213
2/2
✓ Branch 0 taken 28832 times.
✓ Branch 1 taken 616 times.
29448 if (h->flags & B_AVAIL)
214 28832 h->intern_border_y[0] = top[0] = h->top_border_y[h->mbx * 16 + 7];
215 29448 break;
216 29448 case 2:
217 29448 *left = &h->left_border_y[8];
218 29448 memcpy(&top[1], h->cy + 7 * h->l_stride, 16);
219 29448 top[17] = top[16];
220 29448 top[0] = top[1];
221
2/2
✓ Branch 0 taken 28996 times.
✓ Branch 1 taken 452 times.
29448 if (h->flags & A_AVAIL)
222 28996 top[0] = h->left_border_y[8];
223 29448 break;
224 29448 case 3:
225 29448 *left = &h->intern_border_y[8];
226
2/2
✓ Branch 0 taken 235584 times.
✓ Branch 1 taken 29448 times.
265032 for (i = 0; i < 8; i++)
227 235584 h->intern_border_y[i + 9] = *(h->cy + 7 + (i + 8) * h->l_stride);
228 29448 memset(&h->intern_border_y[17], h->intern_border_y[16], 9);
229 29448 memcpy(&top[0], h->cy + 7 + 7 * h->l_stride, 9);
230 29448 memset(&top[9], top[8], 9);
231 29448 break;
232 }
233 117792 }
234
235 29448 void ff_cavs_load_intra_pred_chroma(AVSContext *h)
236 {
237 /* extend borders by one pixel */
238 29448 h->left_border_u[9] = h->left_border_u[8];
239 29448 h->left_border_v[9] = h->left_border_v[8];
240
2/2
✓ Branch 0 taken 28126 times.
✓ Branch 1 taken 1322 times.
29448 if(h->flags & C_AVAIL) {
241 28126 h->top_border_u[h->mbx*10 + 9] = h->top_border_u[h->mbx*10 + 11];
242 28126 h->top_border_v[h->mbx*10 + 9] = h->top_border_v[h->mbx*10 + 11];
243 } else {
244 1322 h->top_border_u[h->mbx * 10 + 9] = h->top_border_u[h->mbx * 10 + 8];
245 1322 h->top_border_v[h->mbx * 10 + 9] = h->top_border_v[h->mbx * 10 + 8];
246 }
247
4/4
✓ Branch 0 taken 28996 times.
✓ Branch 1 taken 452 times.
✓ Branch 2 taken 28390 times.
✓ Branch 3 taken 606 times.
29448 if((h->flags & A_AVAIL) && (h->flags & B_AVAIL)) {
248 28390 h->top_border_u[h->mbx * 10] = h->left_border_u[0] = h->topleft_border_u;
249 28390 h->top_border_v[h->mbx * 10] = h->left_border_v[0] = h->topleft_border_v;
250 } else {
251 1058 h->left_border_u[0] = h->left_border_u[1];
252 1058 h->left_border_v[0] = h->left_border_v[1];
253 1058 h->top_border_u[h->mbx * 10] = h->top_border_u[h->mbx * 10 + 1];
254 1058 h->top_border_v[h->mbx * 10] = h->top_border_v[h->mbx * 10 + 1];
255 }
256 29448 }
257
258 52200 static void intra_pred_vert(uint8_t *d, uint8_t *top, uint8_t *left, ptrdiff_t stride)
259 {
260 int y;
261 52200 uint64_t a = AV_RN64(&top[1]);
262
2/2
✓ Branch 0 taken 417600 times.
✓ Branch 1 taken 52200 times.
469800 for (y = 0; y < 8; y++)
263 417600 *((uint64_t *)(d + y * stride)) = a;
264 52200 }
265
266 39433 static void intra_pred_horiz(uint8_t *d, uint8_t *top, uint8_t *left, ptrdiff_t stride)
267 {
268 int y;
269 uint64_t a;
270
2/2
✓ Branch 0 taken 315464 times.
✓ Branch 1 taken 39433 times.
354897 for (y = 0; y < 8; y++) {
271 315464 a = left[y + 1] * 0x0101010101010101ULL;
272 315464 *((uint64_t *)(d + y * stride)) = a;
273 }
274 39433 }
275
276 30 static void intra_pred_dc_128(uint8_t *d, uint8_t *top, uint8_t *left, ptrdiff_t stride)
277 {
278 int y;
279 30 uint64_t a = 0x8080808080808080ULL;
280
2/2
✓ Branch 0 taken 240 times.
✓ Branch 1 taken 30 times.
270 for (y = 0; y < 8; y++)
281 240 *((uint64_t *)(d + y * stride)) = a;
282 30 }
283
284 3128 static void intra_pred_plane(uint8_t *d, uint8_t *top, uint8_t *left, ptrdiff_t stride)
285 {
286 int x, y, ia;
287 3128 int ih = 0;
288 3128 int iv = 0;
289 3128 const uint8_t *cm = ff_crop_tab + MAX_NEG_CROP;
290
291
2/2
✓ Branch 0 taken 12512 times.
✓ Branch 1 taken 3128 times.
15640 for (x = 0; x < 4; x++) {
292 12512 ih += (x + 1) * (top[5 + x] - top[3 - x]);
293 12512 iv += (x + 1) * (left[5 + x] - left[3 - x]);
294 }
295 3128 ia = (top[8] + left[8]) << 4;
296 3128 ih = (17 * ih + 16) >> 5;
297 3128 iv = (17 * iv + 16) >> 5;
298
2/2
✓ Branch 0 taken 25024 times.
✓ Branch 1 taken 3128 times.
28152 for (y = 0; y < 8; y++)
299
2/2
✓ Branch 0 taken 200192 times.
✓ Branch 1 taken 25024 times.
225216 for (x = 0; x < 8; x++)
300 200192 d[y * stride + x] = cm[(ia + (x - 3) * ih + (y - 3) * iv + 16) >> 5];
301 3128 }
302
303 #define LOWPASS(ARRAY, INDEX) \
304 ((ARRAY[(INDEX) - 1] + 2 * ARRAY[(INDEX)] + ARRAY[(INDEX) + 1] + 2) >> 2)
305
306 69201 static void intra_pred_lp(uint8_t *d, uint8_t *top, uint8_t *left, ptrdiff_t stride)
307 {
308 int x, y;
309
2/2
✓ Branch 0 taken 553608 times.
✓ Branch 1 taken 69201 times.
622809 for (y = 0; y < 8; y++)
310
2/2
✓ Branch 0 taken 4428864 times.
✓ Branch 1 taken 553608 times.
4982472 for (x = 0; x < 8; x++)
311 4428864 d[y * stride + x] = (LOWPASS(top, x + 1) + LOWPASS(left, y + 1)) >> 1;
312 69201 }
313
314 5222 static void intra_pred_down_left(uint8_t *d, uint8_t *top, uint8_t *left, ptrdiff_t stride)
315 {
316 int x, y;
317
2/2
✓ Branch 0 taken 41776 times.
✓ Branch 1 taken 5222 times.
46998 for (y = 0; y < 8; y++)
318
2/2
✓ Branch 0 taken 334208 times.
✓ Branch 1 taken 41776 times.
375984 for (x = 0; x < 8; x++)
319 334208 d[y * stride + x] = (LOWPASS(top, x + y + 2) + LOWPASS(left, x + y + 2)) >> 1;
320 5222 }
321
322 3263 static void intra_pred_down_right(uint8_t *d, uint8_t *top, uint8_t *left, ptrdiff_t stride)
323 {
324 int x, y;
325
2/2
✓ Branch 0 taken 26104 times.
✓ Branch 1 taken 3263 times.
29367 for (y = 0; y < 8; y++)
326
2/2
✓ Branch 0 taken 208832 times.
✓ Branch 1 taken 26104 times.
234936 for (x = 0; x < 8; x++)
327
2/2
✓ Branch 0 taken 26104 times.
✓ Branch 1 taken 182728 times.
208832 if (x == y)
328 26104 d[y * stride + x] = (left[1] + 2 * top[0] + top[1] + 2) >> 2;
329
2/2
✓ Branch 0 taken 91364 times.
✓ Branch 1 taken 91364 times.
182728 else if (x > y)
330 91364 d[y * stride + x] = LOWPASS(top, x - y);
331 else
332 91364 d[y * stride + x] = LOWPASS(left, y - x);
333 3263 }
334
335 2433 static void intra_pred_lp_left(uint8_t *d, uint8_t *top, uint8_t *left, ptrdiff_t stride)
336 {
337 int x, y;
338
2/2
✓ Branch 0 taken 19464 times.
✓ Branch 1 taken 2433 times.
21897 for (y = 0; y < 8; y++)
339
2/2
✓ Branch 0 taken 155712 times.
✓ Branch 1 taken 19464 times.
175176 for (x = 0; x < 8; x++)
340 155712 d[y * stride + x] = LOWPASS(left, y + 1);
341 2433 }
342
343 1778 static void intra_pred_lp_top(uint8_t *d, uint8_t *top, uint8_t *left, ptrdiff_t stride)
344 {
345 int x, y;
346
2/2
✓ Branch 0 taken 14224 times.
✓ Branch 1 taken 1778 times.
16002 for (y = 0; y < 8; y++)
347
2/2
✓ Branch 0 taken 113792 times.
✓ Branch 1 taken 14224 times.
128016 for (x = 0; x < 8; x++)
348 113792 d[y * stride + x] = LOWPASS(top, x + 1);
349 1778 }
350
351 #undef LOWPASS
352
353 3204 static inline void modify_pred(const int8_t *mod_table, int *mode)
354 {
355 3204 *mode = mod_table[*mode];
356
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3204 times.
3204 if (*mode < 0) {
357 av_log(NULL, AV_LOG_ERROR, "Illegal intra prediction mode\n");
358 *mode = 0;
359 }
360 3204 }
361
362 29448 void ff_cavs_modify_mb_i(AVSContext *h, int *pred_mode_uv)
363 {
364 /* save pred modes before they get modified */
365 29448 h->pred_mode_Y[3] = h->pred_mode_Y[5];
366 29448 h->pred_mode_Y[6] = h->pred_mode_Y[8];
367 29448 h->top_pred_Y[h->mbx * 2 + 0] = h->pred_mode_Y[7];
368 29448 h->top_pred_Y[h->mbx * 2 + 1] = h->pred_mode_Y[8];
369
370 /* modify pred modes according to availability of neighbour samples */
371
2/2
✓ Branch 0 taken 452 times.
✓ Branch 1 taken 28996 times.
29448 if (!(h->flags & A_AVAIL)) {
372 452 modify_pred(left_modifier_l, &h->pred_mode_Y[4]);
373 452 modify_pred(left_modifier_l, &h->pred_mode_Y[7]);
374 452 modify_pred(left_modifier_c, pred_mode_uv);
375 }
376
2/2
✓ Branch 0 taken 616 times.
✓ Branch 1 taken 28832 times.
29448 if (!(h->flags & B_AVAIL)) {
377 616 modify_pred(top_modifier_l, &h->pred_mode_Y[4]);
378 616 modify_pred(top_modifier_l, &h->pred_mode_Y[5]);
379 616 modify_pred(top_modifier_c, pred_mode_uv);
380 }
381 29448 }
382
383 /*****************************************************************************
384 *
385 * motion compensation
386 *
387 ****************************************************************************/
388
389 1467259 static inline void mc_dir_part(AVSContext *h, AVFrame *pic, int chroma_height,
390 int delta, int list, uint8_t *dest_y,
391 uint8_t *dest_cb, uint8_t *dest_cr,
392 int src_x_offset, int src_y_offset,
393 qpel_mc_func *qpix_op,
394 h264_chroma_mc_func chroma_op, cavs_vector *mv)
395 {
396 1467259 const int mx = mv->x + src_x_offset * 8;
397 1467259 const int my = mv->y + src_y_offset * 8;
398 1467259 const int luma_xy = (mx & 3) + ((my & 3) << 2);
399 1467259 uint8_t *src_y = pic->data[0] + (mx >> 2) + (my >> 2) * h->l_stride;
400 1467259 uint8_t *src_cb = pic->data[1] + (mx >> 3) + (my >> 3) * h->c_stride;
401 1467259 uint8_t *src_cr = pic->data[2] + (mx >> 3) + (my >> 3) * h->c_stride;
402 1467259 int extra_width = 0;
403 1467259 int extra_height = extra_width;
404 1467259 const int full_mx = mx >> 2;
405 1467259 const int full_my = my >> 2;
406 1467259 const int pic_width = 16 * h->mb_width;
407 1467259 const int pic_height = 16 * h->mb_height;
408 1467259 int emu = 0;
409
410
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1467259 times.
1467259 if (!pic->data[0])
411 return;
412
2/2
✓ Branch 0 taken 123468 times.
✓ Branch 1 taken 1343791 times.
1467259 if (mx & 7)
413 123468 extra_width -= 3;
414
2/2
✓ Branch 0 taken 128760 times.
✓ Branch 1 taken 1338499 times.
1467259 if (my & 7)
415 128760 extra_height -= 3;
416
417
2/2
✓ Branch 0 taken 1466287 times.
✓ Branch 1 taken 972 times.
1467259 if (full_mx < 0 - extra_width ||
418
2/2
✓ Branch 0 taken 1464807 times.
✓ Branch 1 taken 1480 times.
1466287 full_my < 0 - extra_height ||
419
2/2
✓ Branch 0 taken 1449475 times.
✓ Branch 1 taken 15332 times.
1464807 full_mx + 16 /* FIXME */ > pic_width + extra_width ||
420
2/2
✓ Branch 0 taken 20070 times.
✓ Branch 1 taken 1429405 times.
1449475 full_my + 16 /* FIXME */ > pic_height + extra_height) {
421 37854 h->vdsp.emulated_edge_mc(h->edge_emu_buffer,
422 37854 src_y - 2 - 2 * h->l_stride,
423 h->l_stride, h->l_stride,
424 16 + 5, 16 + 5 /* FIXME */,
425 full_mx - 2, full_my - 2,
426 pic_width, pic_height);
427 37854 src_y = h->edge_emu_buffer + 2 + 2 * h->l_stride;
428 37854 emu = 1;
429 }
430
431 // FIXME try variable height perhaps?
432 1467259 qpix_op[luma_xy](dest_y, src_y, h->l_stride);
433
434
2/2
✓ Branch 0 taken 37854 times.
✓ Branch 1 taken 1429405 times.
1467259 if (emu) {
435 37854 h->vdsp.emulated_edge_mc(h->edge_emu_buffer, src_cb,
436 h->c_stride, h->c_stride,
437 9, 9 /* FIXME */,
438 mx >> 3, my >> 3,
439 pic_width >> 1, pic_height >> 1);
440 37854 src_cb = h->edge_emu_buffer;
441 }
442 1467259 chroma_op(dest_cb, src_cb, h->c_stride, chroma_height, mx & 7, my & 7);
443
444
2/2
✓ Branch 0 taken 37854 times.
✓ Branch 1 taken 1429405 times.
1467259 if (emu) {
445 37854 h->vdsp.emulated_edge_mc(h->edge_emu_buffer, src_cr,
446 h->c_stride, h->c_stride,
447 9, 9 /* FIXME */,
448 mx >> 3, my >> 3,
449 pic_width >> 1, pic_height >> 1);
450 37854 src_cr = h->edge_emu_buffer;
451 }
452 1467259 chroma_op(dest_cr, src_cr, h->c_stride, chroma_height, mx & 7, my & 7);
453 }
454
455 842488 static inline void mc_part_std(AVSContext *h, int chroma_height, int delta,
456 uint8_t *dest_y,
457 uint8_t *dest_cb,
458 uint8_t *dest_cr,
459 int x_offset, int y_offset,
460 qpel_mc_func *qpix_put,
461 h264_chroma_mc_func chroma_put,
462 qpel_mc_func *qpix_avg,
463 h264_chroma_mc_func chroma_avg,
464 cavs_vector *mv)
465 {
466 842488 qpel_mc_func *qpix_op = qpix_put;
467 842488 h264_chroma_mc_func chroma_op = chroma_put;
468
469 842488 dest_y += x_offset * 2 + y_offset * h->l_stride * 2;
470 842488 dest_cb += x_offset + y_offset * h->c_stride;
471 842488 dest_cr += x_offset + y_offset * h->c_stride;
472 842488 x_offset += 8 * h->mbx;
473 842488 y_offset += 8 * h->mby;
474
475
2/2
✓ Branch 0 taken 798473 times.
✓ Branch 1 taken 44015 times.
842488 if (mv->ref >= 0) {
476 798473 AVFrame *ref = h->DPB[mv->ref].f;
477 798473 mc_dir_part(h, ref, chroma_height, delta, 0,
478 dest_y, dest_cb, dest_cr, x_offset, y_offset,
479 qpix_op, chroma_op, mv);
480
481 798473 qpix_op = qpix_avg;
482 798473 chroma_op = chroma_avg;
483 }
484
485
2/2
✓ Branch 0 taken 668786 times.
✓ Branch 1 taken 173702 times.
842488 if ((mv + MV_BWD_OFFS)->ref >= 0) {
486 668786 AVFrame *ref = h->DPB[0].f;
487 668786 mc_dir_part(h, ref, chroma_height, delta, 1,
488 dest_y, dest_cb, dest_cr, x_offset, y_offset,
489 qpix_op, chroma_op, mv + MV_BWD_OFFS);
490 }
491 842488 }
492
493 275137 void ff_cavs_inter(AVSContext *h, enum cavs_mb mb_type)
494 {
495
2/2
✓ Branch 0 taken 86020 times.
✓ Branch 1 taken 189117 times.
275137 if (ff_cavs_partition_flags[mb_type] == 0) { // 16x16
496 86020 mc_part_std(h, 8, 0, h->cy, h->cu, h->cv, 0, 0,
497 86020 h->cdsp.put_cavs_qpel_pixels_tab[0],
498 h->h264chroma.put_h264_chroma_pixels_tab[0],
499 86020 h->cdsp.avg_cavs_qpel_pixels_tab[0],
500 h->h264chroma.avg_h264_chroma_pixels_tab[0],
501 &h->mv[MV_FWD_X0]);
502 } else {
503 189117 mc_part_std(h, 4, 0, h->cy, h->cu, h->cv, 0, 0,
504 189117 h->cdsp.put_cavs_qpel_pixels_tab[1],
505 h->h264chroma.put_h264_chroma_pixels_tab[1],
506 189117 h->cdsp.avg_cavs_qpel_pixels_tab[1],
507 h->h264chroma.avg_h264_chroma_pixels_tab[1],
508 &h->mv[MV_FWD_X0]);
509 189117 mc_part_std(h, 4, 0, h->cy, h->cu, h->cv, 4, 0,
510 189117 h->cdsp.put_cavs_qpel_pixels_tab[1],
511 h->h264chroma.put_h264_chroma_pixels_tab[1],
512 189117 h->cdsp.avg_cavs_qpel_pixels_tab[1],
513 h->h264chroma.avg_h264_chroma_pixels_tab[1],
514 &h->mv[MV_FWD_X1]);
515 189117 mc_part_std(h, 4, 0, h->cy, h->cu, h->cv, 0, 4,
516 189117 h->cdsp.put_cavs_qpel_pixels_tab[1],
517 h->h264chroma.put_h264_chroma_pixels_tab[1],
518 189117 h->cdsp.avg_cavs_qpel_pixels_tab[1],
519 h->h264chroma.avg_h264_chroma_pixels_tab[1],
520 &h->mv[MV_FWD_X2]);
521 189117 mc_part_std(h, 4, 0, h->cy, h->cu, h->cv, 4, 4,
522 189117 h->cdsp.put_cavs_qpel_pixels_tab[1],
523 h->h264chroma.put_h264_chroma_pixels_tab[1],
524 189117 h->cdsp.avg_cavs_qpel_pixels_tab[1],
525 h->h264chroma.avg_h264_chroma_pixels_tab[1],
526 &h->mv[MV_FWD_X3]);
527 }
528 275137 }
529
530 /*****************************************************************************
531 *
532 * motion vector prediction
533 *
534 ****************************************************************************/
535
536 514362 static inline void scale_mv(AVSContext *h, int *d_x, int *d_y,
537 cavs_vector *src, int distp)
538 {
539 514362 int64_t den = h->scale_den[FFMAX(src->ref, 0)];
540 514362 *d_x = (src->x * distp * den + 256 + FF_SIGNBIT(src->x)) >> 9;
541 514362 *d_y = (src->y * distp * den + 256 + FF_SIGNBIT(src->y)) >> 9;
542 514362 }
543
544 171454 static inline void mv_pred_median(AVSContext *h,
545 cavs_vector *mvP,
546 cavs_vector *mvA,
547 cavs_vector *mvB,
548 cavs_vector *mvC)
549 {
550 int ax, ay, bx, by, cx, cy;
551 int len_ab, len_bc, len_ca, len_mid;
552
553 /* scale candidates according to their temporal span */
554 171454 scale_mv(h, &ax, &ay, mvA, mvP->dist);
555 171454 scale_mv(h, &bx, &by, mvB, mvP->dist);
556 171454 scale_mv(h, &cx, &cy, mvC, mvP->dist);
557 /* find the geometrical median of the three candidates */
558 171454 len_ab = abs(ax - bx) + abs(ay - by);
559 171454 len_bc = abs(bx - cx) + abs(by - cy);
560 171454 len_ca = abs(cx - ax) + abs(cy - ay);
561 171454 len_mid = mid_pred(len_ab, len_bc, len_ca);
562
2/2
✓ Branch 0 taken 138549 times.
✓ Branch 1 taken 32905 times.
171454 if (len_mid == len_ab) {
563 138549 mvP->x = cx;
564 138549 mvP->y = cy;
565
2/2
✓ Branch 0 taken 24916 times.
✓ Branch 1 taken 7989 times.
32905 } else if (len_mid == len_bc) {
566 24916 mvP->x = ax;
567 24916 mvP->y = ay;
568 } else {
569 7989 mvP->x = bx;
570 7989 mvP->y = by;
571 }
572 171454 }
573
574 240838 void ff_cavs_mv(AVSContext *h, enum cavs_mv_loc nP, enum cavs_mv_loc nC,
575 enum cavs_mv_pred mode, enum cavs_block size, int ref)
576 {
577 240838 cavs_vector *mvP = &h->mv[nP];
578 240838 cavs_vector *mvA = &h->mv[nP-1];
579 240838 cavs_vector *mvB = &h->mv[nP-4];
580 240838 cavs_vector *mvC = &h->mv[nC];
581 240838 const cavs_vector *mvP2 = NULL;
582
583 240838 mvP->ref = ref;
584 240838 mvP->dist = h->dist[mvP->ref];
585
5/6
✓ Branch 0 taken 219122 times.
✓ Branch 1 taken 21716 times.
✓ Branch 2 taken 212335 times.
✓ Branch 3 taken 6787 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 212335 times.
240838 if (mvC->ref == NOT_AVAIL || (nP == MV_FWD_X3) || (nP == MV_BWD_X3 ))
586 28503 mvC = &h->mv[nP - 5]; // set to top-left (mvD)
587
2/2
✓ Branch 0 taken 20801 times.
✓ Branch 1 taken 220037 times.
240838 if (mode == MV_PRED_PSKIP &&
588
2/2
✓ Branch 0 taken 20081 times.
✓ Branch 1 taken 720 times.
20801 (mvA->ref == NOT_AVAIL ||
589
2/2
✓ Branch 0 taken 19308 times.
✓ Branch 1 taken 773 times.
20081 mvB->ref == NOT_AVAIL ||
590
2/2
✓ Branch 0 taken 850 times.
✓ Branch 1 taken 18458 times.
19308 (mvA->x | mvA->y | mvA->ref) == 0 ||
591
2/2
✓ Branch 0 taken 483 times.
✓ Branch 1 taken 367 times.
850 (mvB->x | mvB->y | mvB->ref) == 0)) {
592 20434 mvP2 = &un_mv;
593 /* if there is only one suitable candidate, take it */
594
6/6
✓ Branch 0 taken 191463 times.
✓ Branch 1 taken 28941 times.
✓ Branch 2 taken 22723 times.
✓ Branch 3 taken 168740 times.
✓ Branch 4 taken 11443 times.
✓ Branch 5 taken 11280 times.
220404 } else if (mvA->ref >= 0 && mvB->ref < 0 && mvC->ref < 0) {
595 11443 mvP2 = mvA;
596
6/6
✓ Branch 0 taken 28941 times.
✓ Branch 1 taken 180020 times.
✓ Branch 2 taken 20616 times.
✓ Branch 3 taken 8325 times.
✓ Branch 4 taken 4678 times.
✓ Branch 5 taken 15938 times.
208961 } else if (mvA->ref < 0 && mvB->ref >= 0 && mvC->ref < 0) {
597 4678 mvP2 = mvB;
598
6/6
✓ Branch 0 taken 24263 times.
✓ Branch 1 taken 180020 times.
✓ Branch 2 taken 8325 times.
✓ Branch 3 taken 15938 times.
✓ Branch 4 taken 3575 times.
✓ Branch 5 taken 4750 times.
204283 } else if (mvA->ref < 0 && mvB->ref < 0 && mvC->ref >= 0) {
599 3575 mvP2 = mvC;
600
4/4
✓ Branch 0 taken 18796 times.
✓ Branch 1 taken 181912 times.
✓ Branch 2 taken 14467 times.
✓ Branch 3 taken 4329 times.
200708 } else if (mode == MV_PRED_LEFT && mvA->ref == ref) {
601 14467 mvP2 = mvA;
602
4/4
✓ Branch 0 taken 10095 times.
✓ Branch 1 taken 176146 times.
✓ Branch 2 taken 7987 times.
✓ Branch 3 taken 2108 times.
186241 } else if (mode == MV_PRED_TOP && mvB->ref == ref) {
603 7987 mvP2 = mvB;
604
4/4
✓ Branch 0 taken 8878 times.
✓ Branch 1 taken 169376 times.
✓ Branch 2 taken 6800 times.
✓ Branch 3 taken 2078 times.
178254 } else if (mode == MV_PRED_TOPRIGHT && mvC->ref == ref) {
605 6800 mvP2 = mvC;
606 }
607
2/2
✓ Branch 0 taken 69384 times.
✓ Branch 1 taken 171454 times.
240838 if (mvP2) {
608 69384 mvP->x = mvP2->x;
609 69384 mvP->y = mvP2->y;
610 } else
611 171454 mv_pred_median(h, mvP, mvA, mvB, mvC);
612
613
2/2
✓ Branch 0 taken 191075 times.
✓ Branch 1 taken 49763 times.
240838 if (mode < MV_PRED_PSKIP) {
614 191075 int mx = get_se_golomb(&h->gb) + (unsigned)mvP->x;
615 191075 int my = get_se_golomb(&h->gb) + (unsigned)mvP->y;
616
617
2/4
✓ Branch 0 taken 191075 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 191075 times.
191075 if (mx != (int16_t)mx || my != (int16_t)my) {
618 av_log(h->avctx, AV_LOG_ERROR, "MV %d %d out of supported range\n", mx, my);
619 } else {
620 191075 mvP->x = mx;
621 191075 mvP->y = my;
622 }
623 }
624 240838 set_mvs(mvP, size);
625 240838 }
626
627 /*****************************************************************************
628 *
629 * macroblock level
630 *
631 ****************************************************************************/
632
633 /**
634 * initialise predictors for motion vectors and intra prediction
635 */
636 304585 void ff_cavs_init_mb(AVSContext *h)
637 {
638 int i;
639
640 /* copy predictors from top line (MB B and C) into cache */
641
2/2
✓ Branch 0 taken 913755 times.
✓ Branch 1 taken 304585 times.
1218340 for (i = 0; i < 3; i++) {
642 913755 h->mv[MV_FWD_B2 + i] = h->top_mv[0][h->mbx * 2 + i];
643 913755 h->mv[MV_BWD_B2 + i] = h->top_mv[1][h->mbx * 2 + i];
644 }
645 304585 h->pred_mode_Y[1] = h->top_pred_Y[h->mbx * 2 + 0];
646 304585 h->pred_mode_Y[2] = h->top_pred_Y[h->mbx * 2 + 1];
647 /* clear top predictors if MB B is not available */
648
2/2
✓ Branch 0 taken 8450 times.
✓ Branch 1 taken 296135 times.
304585 if (!(h->flags & B_AVAIL)) {
649 8450 h->mv[MV_FWD_B2] = un_mv;
650 8450 h->mv[MV_FWD_B3] = un_mv;
651 8450 h->mv[MV_BWD_B2] = un_mv;
652 8450 h->mv[MV_BWD_B3] = un_mv;
653 8450 h->pred_mode_Y[1] = h->pred_mode_Y[2] = NOT_AVAIL;
654 8450 h->flags &= ~(C_AVAIL | D_AVAIL);
655
2/2
✓ Branch 0 taken 289588 times.
✓ Branch 1 taken 6547 times.
296135 } else if (h->mbx) {
656 289588 h->flags |= D_AVAIL;
657 }
658
2/2
✓ Branch 0 taken 6733 times.
✓ Branch 1 taken 297852 times.
304585 if (h->mbx == h->mb_width - 1) // MB C not available
659 6733 h->flags &= ~C_AVAIL;
660 /* clear top-right predictors if MB C is not available */
661
2/2
✓ Branch 0 taken 14996 times.
✓ Branch 1 taken 289589 times.
304585 if (!(h->flags & C_AVAIL)) {
662 14996 h->mv[MV_FWD_C2] = un_mv;
663 14996 h->mv[MV_BWD_C2] = un_mv;
664 }
665 /* clear top-left predictors if MB D is not available */
666
2/2
✓ Branch 0 taken 14997 times.
✓ Branch 1 taken 289588 times.
304585 if (!(h->flags & D_AVAIL)) {
667 14997 h->mv[MV_FWD_D3] = un_mv;
668 14997 h->mv[MV_BWD_D3] = un_mv;
669 }
670 304585 }
671
672 /**
673 * save predictors for later macroblocks and increase
674 * macroblock address
675 * @return 0 if end of frame is reached, 1 otherwise
676 */
677 304585 int ff_cavs_next_mb(AVSContext *h)
678 {
679 int i;
680
681 304585 h->flags |= A_AVAIL;
682 304585 h->cy += 16;
683 304585 h->cu += 8;
684 304585 h->cv += 8;
685 /* copy mvs as predictors to the left */
686
2/2
✓ Branch 0 taken 1827510 times.
✓ Branch 1 taken 304585 times.
2132095 for (i = 0; i <= 20; i += 4)
687 1827510 h->mv[i] = h->mv[i + 2];
688 /* copy bottom mvs from cache to top line */
689 304585 h->top_mv[0][h->mbx * 2 + 0] = h->mv[MV_FWD_X2];
690 304585 h->top_mv[0][h->mbx * 2 + 1] = h->mv[MV_FWD_X3];
691 304585 h->top_mv[1][h->mbx * 2 + 0] = h->mv[MV_BWD_X2];
692 304585 h->top_mv[1][h->mbx * 2 + 1] = h->mv[MV_BWD_X3];
693 /* next MB address */
694 304585 h->mbidx++;
695 304585 h->mbx++;
696
2/2
✓ Branch 0 taken 6733 times.
✓ Branch 1 taken 297852 times.
304585 if (h->mbx == h->mb_width) { // New mb line
697 6733 h->flags = B_AVAIL | C_AVAIL;
698 /* clear left pred_modes */
699 6733 h->pred_mode_Y[3] = h->pred_mode_Y[6] = NOT_AVAIL;
700 /* clear left mv predictors */
701
2/2
✓ Branch 0 taken 40398 times.
✓ Branch 1 taken 6733 times.
47131 for (i = 0; i <= 20; i += 4)
702 40398 h->mv[i] = un_mv;
703 6733 h->mbx = 0;
704 6733 h->mby++;
705 /* re-calculate sample pointers */
706 6733 h->cy = h->cur.f->data[0] + h->mby * 16 * h->l_stride;
707 6733 h->cu = h->cur.f->data[1] + h->mby * 8 * h->c_stride;
708 6733 h->cv = h->cur.f->data[2] + h->mby * 8 * h->c_stride;
709
2/2
✓ Branch 0 taken 186 times.
✓ Branch 1 taken 6547 times.
6733 if (h->mby == h->mb_height) { // Frame end
710 186 return 0;
711 }
712 }
713 304399 return 1;
714 }
715
716 /*****************************************************************************
717 *
718 * frame level
719 *
720 ****************************************************************************/
721
722 187 int ff_cavs_init_pic(AVSContext *h)
723 {
724 int i;
725
726 /* clear some predictors */
727
2/2
✓ Branch 0 taken 1122 times.
✓ Branch 1 taken 187 times.
1309 for (i = 0; i <= 20; i += 4)
728 1122 h->mv[i] = un_mv;
729 187 h->mv[MV_BWD_X0] = ff_cavs_dir_mv;
730 187 set_mvs(&h->mv[MV_BWD_X0], BLK_16X16);
731 187 h->mv[MV_FWD_X0] = ff_cavs_dir_mv;
732 187 set_mvs(&h->mv[MV_FWD_X0], BLK_16X16);
733 187 h->pred_mode_Y[3] = h->pred_mode_Y[6] = NOT_AVAIL;
734 187 h->cy = h->cur.f->data[0];
735 187 h->cu = h->cur.f->data[1];
736 187 h->cv = h->cur.f->data[2];
737 187 h->l_stride = h->cur.f->linesize[0];
738 187 h->c_stride = h->cur.f->linesize[1];
739 187 h->luma_scan[2] = 8 * h->l_stride;
740 187 h->luma_scan[3] = 8 * h->l_stride + 8;
741 187 h->mbx = h->mby = h->mbidx = 0;
742 187 h->flags = 0;
743
744 187 return 0;
745 }
746
747 /*****************************************************************************
748 *
749 * headers and interface
750 *
751 ****************************************************************************/
752
753 /**
754 * some predictions require data from the top-neighbouring macroblock.
755 * this data has to be stored for one complete row of macroblocks
756 * and this storage space is allocated here
757 */
758 5 int ff_cavs_init_top_lines(AVSContext *h)
759 {
760 /* alloc top line of predictors */
761 5 h->top_qp = av_mallocz(h->mb_width);
762 5 h->top_mv[0] = av_calloc(h->mb_width * 2 + 1, sizeof(cavs_vector));
763 5 h->top_mv[1] = av_calloc(h->mb_width * 2 + 1, sizeof(cavs_vector));
764 5 h->top_pred_Y = av_calloc(h->mb_width * 2, sizeof(*h->top_pred_Y));
765 5 h->top_border_y = av_calloc(h->mb_width + 1, 16);
766 5 h->top_border_u = av_calloc(h->mb_width, 10);
767 5 h->top_border_v = av_calloc(h->mb_width, 10);
768
769 /* alloc space for co-located MVs and types */
770 5 h->col_mv = av_calloc(h->mb_width * h->mb_height,
771 4 * sizeof(*h->col_mv));
772 5 h->col_type_base = av_mallocz(h->mb_width * h->mb_height);
773 5 h->block = av_mallocz(64 * sizeof(int16_t));
774
775
4/8
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 5 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 5 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 5 times.
✗ Branch 7 not taken.
5 if (!h->top_qp || !h->top_mv[0] || !h->top_mv[1] || !h->top_pred_Y ||
776
3/6
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 5 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 5 times.
✗ Branch 5 not taken.
5 !h->top_border_y || !h->top_border_u || !h->top_border_v ||
777
3/6
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 5 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 5 times.
5 !h->col_mv || !h->col_type_base || !h->block) {
778 av_freep(&h->top_qp);
779 av_freep(&h->top_mv[0]);
780 av_freep(&h->top_mv[1]);
781 av_freep(&h->top_pred_Y);
782 av_freep(&h->top_border_y);
783 av_freep(&h->top_border_u);
784 av_freep(&h->top_border_v);
785 av_freep(&h->col_mv);
786 av_freep(&h->col_type_base);
787 av_freep(&h->block);
788 return AVERROR(ENOMEM);
789 }
790 5 return 0;
791 }
792
793 6 av_cold int ff_cavs_init(AVCodecContext *avctx)
794 {
795 6 AVSContext *h = avctx->priv_data;
796 uint8_t permutation[64];
797
798 6 ff_blockdsp_init(&h->bdsp);
799 6 ff_h264chroma_init(&h->h264chroma, 8);
800 6 ff_videodsp_init(&h->vdsp, 8);
801 6 ff_cavsdsp_init(&h->cdsp);
802 6 ff_init_scantable_permutation(permutation, h->cdsp.idct_perm);
803 6 ff_permute_scantable(h->permutated_scantable, ff_zigzag_direct, permutation);
804
805 6 h->avctx = avctx;
806 6 avctx->pix_fmt = AV_PIX_FMT_YUV420P;
807
808 6 h->cur.f = av_frame_alloc();
809 6 h->DPB[0].f = av_frame_alloc();
810 6 h->DPB[1].f = av_frame_alloc();
811
3/6
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 6 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 6 times.
6 if (!h->cur.f || !h->DPB[0].f || !h->DPB[1].f)
812 return AVERROR(ENOMEM);
813
814 6 h->luma_scan[0] = 0;
815 6 h->luma_scan[1] = 8;
816 6 h->intra_pred_l[INTRA_L_VERT] = intra_pred_vert;
817 6 h->intra_pred_l[INTRA_L_HORIZ] = intra_pred_horiz;
818 6 h->intra_pred_l[INTRA_L_LP] = intra_pred_lp;
819 6 h->intra_pred_l[INTRA_L_DOWN_LEFT] = intra_pred_down_left;
820 6 h->intra_pred_l[INTRA_L_DOWN_RIGHT] = intra_pred_down_right;
821 6 h->intra_pred_l[INTRA_L_LP_LEFT] = intra_pred_lp_left;
822 6 h->intra_pred_l[INTRA_L_LP_TOP] = intra_pred_lp_top;
823 6 h->intra_pred_l[INTRA_L_DC_128] = intra_pred_dc_128;
824 6 h->intra_pred_c[INTRA_C_LP] = intra_pred_lp;
825 6 h->intra_pred_c[INTRA_C_HORIZ] = intra_pred_horiz;
826 6 h->intra_pred_c[INTRA_C_VERT] = intra_pred_vert;
827 6 h->intra_pred_c[INTRA_C_PLANE] = intra_pred_plane;
828 6 h->intra_pred_c[INTRA_C_LP_LEFT] = intra_pred_lp_left;
829 6 h->intra_pred_c[INTRA_C_LP_TOP] = intra_pred_lp_top;
830 6 h->intra_pred_c[INTRA_C_DC_128] = intra_pred_dc_128;
831 6 h->mv[7] = un_mv;
832 6 h->mv[19] = un_mv;
833 6 return 0;
834 }
835
836 6 av_cold int ff_cavs_end(AVCodecContext *avctx)
837 {
838 6 AVSContext *h = avctx->priv_data;
839
840 6 av_frame_free(&h->cur.f);
841 6 av_frame_free(&h->DPB[0].f);
842 6 av_frame_free(&h->DPB[1].f);
843
844 6 av_freep(&h->top_qp);
845 6 av_freep(&h->top_mv[0]);
846 6 av_freep(&h->top_mv[1]);
847 6 av_freep(&h->top_pred_Y);
848 6 av_freep(&h->top_border_y);
849 6 av_freep(&h->top_border_u);
850 6 av_freep(&h->top_border_v);
851 6 av_freep(&h->col_mv);
852 6 av_freep(&h->col_type_base);
853 6 av_freep(&h->block);
854 6 av_freep(&h->edge_emu_buffer);
855 6 return 0;
856 }
857

酒酿是什么 94属什么生肖 肺部肿瘤3cm什么期 梦见雪地是什么征兆 岗位性质指的是什么
pwi是什么意思 尿出来很黄是什么原因 留守儿童是什么意思 强字五行属什么 坐围是什么
老人不睡觉是什么预兆 肛门里面痒是什么情况 阿尔马尔是什么药 什么叫2型糖尿病 6代表什么意思
牛和什么属相最配 尿常规粘液丝高是什么意思 1.22是什么星座 潦倒是什么意思 錾是什么意思
看舌头应该挂什么科hcv9jop3ns4r.cn 铎读什么hcv8jop0ns3r.cn mj什么意思hcv8jop2ns7r.cn 颈肩综合症有什么症状hcv9jop5ns1r.cn 慎什么意思hcv8jop7ns6r.cn
脚上长疣是什么原因wmyky.com 什么叫间质性肺病hcv9jop7ns2r.cn 锋芒的意思是什么hcv8jop4ns1r.cn 什么是近视hcv9jop0ns7r.cn 怀孕胎盘低有什么影响hcv9jop4ns8r.cn
低烧是什么原因onlinewuye.com 大姨妈有黑色血块是什么原因hcv9jop5ns2r.cn 等边三角形又叫什么三角形hcv8jop9ns6r.cn 广东第一峰叫什么山hcv7jop7ns4r.cn 蚕豆病是什么病有什么症状hcv8jop7ns2r.cn
mua是什么意思hcv9jop4ns8r.cn alpaca是什么意思hcv9jop7ns0r.cn 胃恶心想吐吃什么药hcv9jop6ns3r.cn 我方了是什么意思hcv9jop3ns3r.cn 170是什么号码hcv9jop4ns9r.cn
百度