脖子上有结节挂什么科| 什么是狂躁症| 慢性肾功能不全是什么意思| 面诊是什么意思| 铁公鸡是什么意思| 丝状疣长什么样| 什么是什么的眼睛| 阳萎吃什么药| 立加羽读什么| 小便短赤吃什么药| 弦是什么| 七月二十是什么星座| 身份证有x代表什么| 运动员心率为什么慢| 防空警报是什么| 五楼五行属什么| 睡眠不好吃什么中成药| 盗汗挂什么科| 牛肚是什么部位| 发难是什么意思| 打耳洞后不能吃什么| 厚黑学讲的是什么| 斑鸠和鸽子有什么区别| 没有排卵是什么原因| 天然是什么意思| 九月什么星座| 诛心是什么意思| 水豚吃什么| 草酸对人体有什么危害| 一个虫一个离念什么| 先天性心脏病最怕什么| 西西里的美丽传说讲的什么| 牛郎是什么职业| 护士规培是什么意思| 尿检肌酐高是什么原因| 心肌缺血吃什么药效果最好| 潮喷是什么| 什么得什么词语| 肌肉酸痛用什么膏药| 睡不着吃什么| 大肠炒什么菜好吃| 成人礼是什么意思| 次胖是什么意思| lee中文叫什么| 疑神疑鬼是什么意思| 脑管瘤的症状是什么| 牙齿痛用什么药| 1958年属狗的是什么命| 4.29是什么星座| 八字比肩是什么意思| 湿气太重吃什么| 注音是什么| 贫血吃什么水果补血最快| 骨强度不足是什么原因| 熬夜吃什么对身体好| 吃火龙果有什么好处和坏处| 狂犬疫苗什么时候打有效| 什么动物| 什么瓜不能吃脑筋急转弯| 眼睛粘糊是什么原因| 额头上有痣代表什么| 螃蟹和什么不能一起吃| 2003年属羊的是什么命| 肾上腺分泌什么激素| 华佗属什么生肖| 黄山毛峰是什么茶| 直肠前突有什么症状| 水瓶座的幸运色是什么| 东吴在现在什么地方| 冰冻三尺非一日之寒是什么意思| 两侧肋骨疼是什么原因| 白葡萄酒配什么食物| 银耳是什么| 肺栓塞有什么症状| 高沫是什么茶| 吃人嘴短拿人手软什么意思| 胆固醇高是什么原因引起| 鼻毛变白什么征兆| 木耳和什么不能一起吃| 为什么拉屎是绿色的| 内分泌科主要看什么| 平常吃什么补肾| 筋头巴脑是什么东西| 小孩补铁吃什么| 冲太岁是什么意思| 痔疮出血吃什么药| 手串19颗代表什么意思| 孙俪是什么星座| 2018 年是什么年| 近视和远视有什么区别| 八月三号什么星座| npv是什么病毒| 一天中什么时候最热| 以色列是什么人种| 火鸡面为什么那么辣| 杨梅有什么功效与作用| 压抑是什么意思| 胎儿生物物理评分8分什么意思| 郡肝是什么部位| 扁桃体发炎是什么症状| 舒坦是什么意思| qa是什么| 自愈什么意思| 氯气什么味道| 脑萎缩吃什么药| 小孩睡觉打呼噜是什么原因| 鸡肉煲汤加搭配什么好| ubc是什么意思| tp是什么| 宝姿是什么档次的牌子| 蟠桃为什么是扁的| 湿疹涂什么药| 炭疽病是什么病| 预防老年痴呆吃什么药| 河南是什么气候| 司令是什么级别| 家里养什么花最好| 羊经后半边读什么| 紫苏长什么样子图片| 大拇指脱皮是什么原因| 人生于世上有几个知己是什么歌| 小燕子吃什么食物| 糙米饭是什么米| 八月份是什么季节| 双子座的幸运花是什么| 竟然是什么意思| 乳白色是什么颜色| 女人没有白带说明什么| 地奥司明片治疗什么病| 血氨高是什么原因| rv医学上是什么意思| 人工虎骨粉是什么做的| 双子座和什么座最不配| 可乐煮姜有什么作用| 来大姨妈喝什么最好| 手上起倒刺是缺什么| 扁桃体发炎是什么症状| 地龙是什么动物| 硬度不够是什么原因| 梦到大牙掉了一颗是什么意思| 辜负什么意思| 什么贤什么能| 头晕用什么药好| 便秘喝什么茶好| 苹果熬水喝有什么功效| 双肾囊性灶是什么意思| 复方阿胶浆适合什么样的人喝| 保护嗓子长期喝什么茶| 冥是什么意思| 淋巴吃什么药可以消除| 每个月14号都是什么情人节| 甲状腺功能三项查什么| 为什么会有跳蚤| 气胸有什么症状| 便秘吃什么好| 出处是什么意思| 爽肤水和精华水有什么区别| 肉芽是什么| 射手座什么性格| 曲马多是什么药| 梦见跟别人打架是什么意思| 什么人不能吃蜂蜜| 金牛座与什么星座最配| 自诩是什么意思| 洪字五行属什么| 芍药花什么时候开花| 老人适合吃什么水果| out是什么意思| 口腹蜜剑什么意思| 花是什么生肖| 阁僚是什么意思| 人生观价值观世界观是什么意思| 置之死地而后生是什么意思| 黄皮果什么味道| 头晕呕吐吃什么药| 感光度是什么意思| 1968年属什么生肖| 氟比洛芬是什么药| 孕妇梦见狗是什么意思| 老是口干舌燥是什么原因| 8月30号是什么星座| 丝状疣用什么药膏最好| 甲减是什么原因引起的| 阴道有灼热感是什么原因| 灰猫是什么品种| 需要是什么意思| 浓郁是什么意思| 早泄要吃什么药| 上火吃什么药好| 什么杯子喝水最健康| 这是为什么| 三叉神经是什么病| 语什么心什么| 翻白眼是什么意思| 1997年出生属什么| 氯高是什么原因| 儿童测骨龄挂什么科| 京东积分有什么用| 鼻子两侧挤出来的白色东西是什么| 薏米有什么作用| 幽门螺杆菌什么药最好| 手足口病是什么| 尿路感染为什么会尿血| kms是什么药| 肚子胀气老放屁是什么原因| 戳是什么意思| 鱿鱼炒什么好吃| 长期熬夜会有什么后果| 维生素h是什么| loho眼镜属于什么档次| 总出汗是什么原因| 正常人为什么传导阻滞| avg什么意思| 考试吃什么| 荷花什么时候开放| 女性尿路感染挂什么科| 为什么会长水泡| 什么是血脂| 梦见猫什么意思| 怀孕梦到蛇预示着什么| 村姑是什么意思| 尿液检查红细胞高是什么原因| 痤疮用什么药治最好效果最快| 脸部下垂什么方法提升效果好| 夜游神是什么意思| 心绞痛是什么病| 呵呵是什么意思啊| 晚上7点到9点是什么时辰| 小便短赤是什么症状| 黄体破裂是什么| 什么是卡路里| 肛裂用什么药膏| 18k金是什么材质| 俯卧撑有什么好处| 知青为什么要下乡| 乌鱼蛋是什么| 什么菜下饭又好吃| 心静自然凉是什么意思| 减肥期间吃什么水果| 屁多吃什么药| 什么的超市| 益生菌吃了有什么好处| 女人吃山竹有什么好处| 10万个为什么的作者| 宫颈小有什么影响| 脸上长水泡似的痘痘是什么原因| 跑马什么意思| 5月12号是什么星座| 九月二十八是什么星座| 6月24日什么星座| 梦到女儿丢了什么预兆| 岁月从不败美人什么意思| 胃胀吃什么药效果好| 有胃病的人吃什么最养胃| 两千年前是什么朝代| 女人左眼下有痣代表什么| 格列本脲和格列美脲有什么区别| 社保缴费基数和工资有什么关系| 一什么屏风| 辅警政审主要审些什么| 手上有湿疹是什么原因引起的| 兰州市区有什么好玩的地方| ckd5期是什么意思| 荪是什么意思| 百度

停电了打什么电话


Directory: ../../../ffmpeg/
File: src/libavcodec/aic.c
Date: 2025-08-04 11:35:17
Exec Total Coverage
Lines: 169 190 88.9%
Functions: 9 9 100.0%
Branches: 95 114 83.3%

Line Branch Exec Source
1 /*
2 * Apple Intermediate Codec decoder
3 *
4 * Copyright (c) 2013 Konstantin Shishkov
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 #include <inttypes.h>
24
25 #include "libavutil/mem.h"
26 #include "libavutil/mem_internal.h"
27
28 #include "avcodec.h"
29 #include "bytestream.h"
30 #include "codec_internal.h"
31 #include "get_bits.h"
32 #include "golomb.h"
33 #include "idctdsp.h"
34 #include "thread.h"
35 #include "unary.h"
36
37 #define AIC_HDR_SIZE 24
38 #define AIC_BAND_COEFFS (64 + 32 + 192 + 96)
39
40 enum AICBands {
41 COEFF_LUMA = 0,
42 COEFF_CHROMA,
43 COEFF_LUMA_EXT,
44 COEFF_CHROMA_EXT,
45 NUM_BANDS
46 };
47
48 static const uint8_t aic_num_band_coeffs[NUM_BANDS] = { 64, 32, 192, 96 };
49
50 static const uint16_t aic_band_off[NUM_BANDS] = { 0, 64, 96, 288 };
51
52 static const uint8_t aic_quant_matrix[64] = {
53 8, 16, 19, 22, 22, 26, 26, 27,
54 16, 16, 22, 22, 26, 27, 27, 29,
55 19, 22, 26, 26, 27, 29, 29, 35,
56 22, 24, 27, 27, 29, 32, 34, 38,
57 26, 27, 29, 29, 32, 35, 38, 46,
58 27, 29, 34, 34, 35, 40, 46, 56,
59 29, 34, 34, 37, 40, 48, 56, 69,
60 34, 37, 38, 40, 48, 58, 69, 83,
61 };
62
63 static const uint8_t aic_y_scan[64] = {
64 0, 4, 1, 2, 5, 8, 12, 9,
65 6, 3, 7, 10, 13, 14, 11, 15,
66 47, 43, 46, 45, 42, 39, 35, 38,
67 41, 44, 40, 37, 34, 33, 36, 32,
68 16, 20, 17, 18, 21, 24, 28, 25,
69 22, 19, 23, 26, 29, 30, 27, 31,
70 63, 59, 62, 61, 58, 55, 51, 54,
71 57, 60, 56, 53, 50, 49, 52, 48,
72 };
73
74 static const uint8_t aic_y_ext_scan[192] = {
75 64, 72, 65, 66, 73, 80, 88, 81,
76 74, 67, 75, 82, 89, 90, 83, 91,
77 0, 4, 1, 2, 5, 8, 12, 9,
78 6, 3, 7, 10, 13, 14, 11, 15,
79 16, 20, 17, 18, 21, 24, 28, 25,
80 22, 19, 23, 26, 29, 30, 27, 31,
81 155, 147, 154, 153, 146, 139, 131, 138,
82 145, 152, 144, 137, 130, 129, 136, 128,
83 47, 43, 46, 45, 42, 39, 35, 38,
84 41, 44, 40, 37, 34, 33, 36, 32,
85 63, 59, 62, 61, 58, 55, 51, 54,
86 57, 60, 56, 53, 50, 49, 52, 48,
87 96, 104, 97, 98, 105, 112, 120, 113,
88 106, 99, 107, 114, 121, 122, 115, 123,
89 68, 76, 69, 70, 77, 84, 92, 85,
90 78, 71, 79, 86, 93, 94, 87, 95,
91 100, 108, 101, 102, 109, 116, 124, 117,
92 110, 103, 111, 118, 125, 126, 119, 127,
93 187, 179, 186, 185, 178, 171, 163, 170,
94 177, 184, 176, 169, 162, 161, 168, 160,
95 159, 151, 158, 157, 150, 143, 135, 142,
96 149, 156, 148, 141, 134, 133, 140, 132,
97 191, 183, 190, 189, 182, 175, 167, 174,
98 181, 188, 180, 173, 166, 165, 172, 164,
99 };
100
101 static const uint8_t aic_c_scan[64] = {
102 0, 4, 1, 2, 5, 8, 12, 9,
103 6, 3, 7, 10, 13, 14, 11, 15,
104 31, 27, 30, 29, 26, 23, 19, 22,
105 25, 28, 24, 21, 18, 17, 20, 16,
106 32, 36, 33, 34, 37, 40, 44, 41,
107 38, 35, 39, 42, 45, 46, 43, 47,
108 63, 59, 62, 61, 58, 55, 51, 54,
109 57, 60, 56, 53, 50, 49, 52, 48,
110 };
111
112 static const uint8_t aic_c_ext_scan[192] = {
113 16, 24, 17, 18, 25, 32, 40, 33,
114 26, 19, 27, 34, 41, 42, 35, 43,
115 0, 4, 1, 2, 5, 8, 12, 9,
116 6, 3, 7, 10, 13, 14, 11, 15,
117 20, 28, 21, 22, 29, 36, 44, 37,
118 30, 23, 31, 38, 45, 46, 39, 47,
119 95, 87, 94, 93, 86, 79, 71, 78,
120 85, 92, 84, 77, 70, 69, 76, 68,
121 63, 59, 62, 61, 58, 55, 51, 54,
122 57, 60, 56, 53, 50, 49, 52, 48,
123 91, 83, 90, 89, 82, 75, 67, 74,
124 81, 88, 80, 73, 66, 65, 72, 64,
125 112, 120, 113, 114, 121, 128, 136, 129,
126 122, 115, 123, 130, 137, 138, 131, 139,
127 96, 100, 97, 98, 101, 104, 108, 105,
128 102, 99, 103, 106, 109, 110, 107, 111,
129 116, 124, 117, 118, 125, 132, 140, 133,
130 126, 119, 127, 134, 141, 142, 135, 143,
131 191, 183, 190, 189, 182, 175, 167, 174,
132 181, 188, 180, 173, 166, 165, 172, 164,
133 159, 155, 158, 157, 154, 151, 147, 150,
134 153, 156, 152, 149, 146, 145, 148, 144,
135 187, 179, 186, 185, 178, 171, 163, 170,
136 177, 184, 176, 169, 162, 161, 168, 160,
137 };
138
139 static const uint8_t * const aic_scan[NUM_BANDS] = {
140 aic_y_scan, aic_c_scan, aic_y_ext_scan, aic_c_ext_scan
141 };
142
143 typedef struct AICContext {
144 AVCodecContext *avctx;
145 AVFrame *frame;
146 IDCTDSPContext idsp;
147
148 int num_x_slices;
149 int slice_width;
150 int mb_width, mb_height;
151 int quant;
152 int interlaced;
153
154 int16_t *slice_data;
155 int16_t *data_ptr[NUM_BANDS];
156
157 DECLARE_ALIGNED(16, int16_t, block)[64];
158 DECLARE_ALIGNED(16, uint8_t, quant_matrix)[64];
159 } AICContext;
160
161 73 static int aic_decode_header(AICContext *ctx, const uint8_t *src, int size)
162 {
163 uint32_t frame_size;
164 int width, height;
165
166
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 73 times.
73 if (src[0] != 1) {
167 av_log(ctx->avctx, AV_LOG_ERROR, "Invalid version %d\n", src[0]);
168 return AVERROR_INVALIDDATA;
169 }
170
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 73 times.
73 if (src[1] != AIC_HDR_SIZE - 2) {
171 av_log(ctx->avctx, AV_LOG_ERROR, "Invalid header size %d\n", src[1]);
172 return AVERROR_INVALIDDATA;
173 }
174 73 frame_size = AV_RB32(src + 2);
175 73 width = AV_RB16(src + 6);
176 73 height = AV_RB16(src + 8);
177
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 72 times.
73 if (frame_size > size) {
178 1 av_log(ctx->avctx, AV_LOG_ERROR, "Frame size should be %"PRIu32" got %d\n",
179 frame_size, size);
180 1 return AVERROR_INVALIDDATA;
181 }
182
2/4
✓ Branch 0 taken 72 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 72 times.
72 if (width != ctx->avctx->width || height != ctx->avctx->height) {
183 av_log(ctx->avctx, AV_LOG_ERROR,
184 "Picture dimension changed: old: %d x %d, new: %d x %d\n",
185 ctx->avctx->width, ctx->avctx->height, width, height);
186 return AVERROR_INVALIDDATA;
187 }
188 72 ctx->quant = src[15];
189 72 ctx->interlaced = ((src[16] >> 4) == 3);
190
191 72 return 0;
192 }
193
194 #define GET_CODE(val, type, add_bits) \
195 do { \
196 if (type) \
197 val = get_ue_golomb(gb); \
198 else \
199 val = get_unary(gb, 1, 31); \
200 if (add_bits) \
201 val = (val << add_bits) + get_bits(gb, add_bits); \
202 } while (0)
203
204 15888 static int aic_decode_coeffs(GetBitContext *gb, int16_t *dst,
205 int band, int slice_width, int force_chroma)
206 {
207 int has_skips, coeff_type, coeff_bits, skip_type, skip_bits;
208 15888 const int num_coeffs = aic_num_band_coeffs[band];
209 15888 const uint8_t *scan = aic_scan[band | force_chroma];
210 int mb, idx;
211 unsigned val;
212
213
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 15888 times.
15888 if (get_bits_left(gb) < 5)
214 return AVERROR_INVALIDDATA;
215
216 15888 has_skips = get_bits1(gb);
217 15888 coeff_type = get_bits1(gb);
218 15888 coeff_bits = get_bits(gb, 3);
219
220
2/2
✓ Branch 0 taken 13996 times.
✓ Branch 1 taken 1892 times.
15888 if (has_skips) {
221 13996 skip_type = get_bits1(gb);
222 13996 skip_bits = get_bits(gb, 3);
223
224
2/2
✓ Branch 0 taken 423437 times.
✓ Branch 1 taken 13996 times.
437433 for (mb = 0; mb < slice_width; mb++) {
225 423437 idx = -1;
226 do {
227
3/4
✓ Branch 0 taken 5032630 times.
✗ Branch 1 not taken.
✓ Branch 4 taken 323504 times.
✓ Branch 5 taken 4709126 times.
5032630 GET_CODE(val, skip_type, skip_bits);
228
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5032630 times.
5032630 if (val >= 0x10000)
229 return AVERROR_INVALIDDATA;
230 5032630 idx += val + 1;
231
2/2
✓ Branch 0 taken 252068 times.
✓ Branch 1 taken 4780562 times.
5032630 if (idx >= num_coeffs)
232 252068 break;
233
4/4
✓ Branch 0 taken 4639461 times.
✓ Branch 1 taken 141101 times.
✓ Branch 4 taken 4639461 times.
✓ Branch 5 taken 141101 times.
4780562 GET_CODE(val, coeff_type, coeff_bits);
234 4780562 val++;
235
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 4780562 times.
4780562 if (val >= 0x10000)
236 return AVERROR_INVALIDDATA;
237 4780562 dst[scan[idx]] = val;
238
2/2
✓ Branch 0 taken 4609193 times.
✓ Branch 1 taken 171369 times.
4780562 } while (idx < num_coeffs - 1);
239 423437 dst += num_coeffs;
240 }
241 } else {
242
2/2
✓ Branch 0 taken 56851 times.
✓ Branch 1 taken 1892 times.
58743 for (mb = 0; mb < slice_width; mb++) {
243
2/2
✓ Branch 0 taken 10519744 times.
✓ Branch 1 taken 56851 times.
10576595 for (idx = 0; idx < num_coeffs; idx++) {
244
3/4
✓ Branch 0 taken 10519744 times.
✗ Branch 1 not taken.
✓ Branch 4 taken 180544 times.
✓ Branch 5 taken 10339200 times.
10519744 GET_CODE(val, coeff_type, coeff_bits);
245
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10519744 times.
10519744 if (val >= 0x10000)
246 return AVERROR_INVALIDDATA;
247 10519744 dst[scan[idx]] = val;
248 }
249 56851 dst += num_coeffs;
250 }
251 }
252 15888 return 0;
253 }
254
255 353232 static void recombine_block(int16_t *dst, const uint8_t *scan,
256 int16_t **base, int16_t **ext)
257 {
258 int i, j;
259
260
2/2
✓ Branch 0 taken 1412928 times.
✓ Branch 1 taken 353232 times.
1766160 for (i = 0; i < 4; i++) {
261
2/2
✓ Branch 0 taken 5651712 times.
✓ Branch 1 taken 1412928 times.
7064640 for (j = 0; j < 4; j++)
262 5651712 dst[scan[i * 8 + j]] = (*base)[j];
263
2/2
✓ Branch 0 taken 5651712 times.
✓ Branch 1 taken 1412928 times.
7064640 for (j = 0; j < 4; j++)
264 5651712 dst[scan[i * 8 + j + 4]] = (*ext)[j];
265 1412928 *base += 4;
266 1412928 *ext += 4;
267 }
268
2/2
✓ Branch 0 taken 1412928 times.
✓ Branch 1 taken 353232 times.
1766160 for (; i < 8; i++) {
269
2/2
✓ Branch 0 taken 11303424 times.
✓ Branch 1 taken 1412928 times.
12716352 for (j = 0; j < 8; j++)
270 11303424 dst[scan[i * 8 + j]] = (*ext)[j];
271 1412928 *ext += 8;
272 }
273 353232 }
274
275 367200 static void recombine_block_il(int16_t *dst, const uint8_t *scan,
276 int16_t **base, int16_t **ext,
277 int block_no)
278 {
279 int i, j;
280
281
2/2
✓ Branch 0 taken 183600 times.
✓ Branch 1 taken 183600 times.
367200 if (block_no < 2) {
282
2/2
✓ Branch 0 taken 1468800 times.
✓ Branch 1 taken 183600 times.
1652400 for (i = 0; i < 8; i++) {
283
2/2
✓ Branch 0 taken 5875200 times.
✓ Branch 1 taken 1468800 times.
7344000 for (j = 0; j < 4; j++)
284 5875200 dst[scan[i * 8 + j]] = (*base)[j];
285
2/2
✓ Branch 0 taken 5875200 times.
✓ Branch 1 taken 1468800 times.
7344000 for (j = 0; j < 4; j++)
286 5875200 dst[scan[i * 8 + j + 4]] = (*ext)[j];
287 1468800 *base += 4;
288 1468800 *ext += 4;
289 }
290 } else {
291
2/2
✓ Branch 0 taken 11750400 times.
✓ Branch 1 taken 183600 times.
11934000 for (i = 0; i < 64; i++)
292 11750400 dst[scan[i]] = (*ext)[i];
293 183600 *ext += 64;
294 }
295 367200 }
296
297 720432 static void unquant_block(int16_t *block, int q, uint8_t *quant_matrix)
298 {
299 int i;
300
301
2/2
✓ Branch 0 taken 46107648 times.
✓ Branch 1 taken 720432 times.
46828080 for (i = 0; i < 64; i++) {
302 46107648 int val = (uint16_t)block[i];
303 46107648 int sign = val & 1;
304
305 46107648 block[i] = (((val >> 1) ^ -sign) * q * quant_matrix[i] >> 4)
306 46107648 + sign;
307 }
308 720432 }
309
310 3972 static int aic_decode_slice(AICContext *ctx, int mb_x, int mb_y,
311 const uint8_t *src, int src_size)
312 {
313 GetBitContext gb;
314 int ret, i, mb, blk;
315 3972 int slice_width = FFMIN(ctx->slice_width, ctx->mb_width - mb_x);
316
4/4
✓ Branch 0 taken 3870 times.
✓ Branch 1 taken 102 times.
✓ Branch 2 taken 102 times.
✓ Branch 3 taken 3768 times.
3972 int last_row = mb_y && mb_y == ctx->mb_height - 1;
317 int y_pos, c_pos;
318 uint8_t *Y, *C[2];
319 uint8_t *dst;
320 3972 int16_t *base_y = ctx->data_ptr[COEFF_LUMA];
321 3972 int16_t *base_c = ctx->data_ptr[COEFF_CHROMA];
322 3972 int16_t *ext_y = ctx->data_ptr[COEFF_LUMA_EXT];
323 3972 int16_t *ext_c = ctx->data_ptr[COEFF_CHROMA_EXT];
324 3972 const int ystride = ctx->frame->linesize[0];
325
326
2/2
✓ Branch 0 taken 102 times.
✓ Branch 1 taken 3870 times.
3972 if (last_row) {
327 102 y_pos = (ctx->avctx->height - 16);
328 102 c_pos = ((ctx->avctx->height+1)/2 - 8);
329 } else {
330 3870 y_pos = mb_y * 16;
331 3870 c_pos = mb_y * 8;
332 }
333
334 3972 Y = ctx->frame->data[0] + mb_x * 16 + y_pos * ystride;
335
2/2
✓ Branch 0 taken 7944 times.
✓ Branch 1 taken 3972 times.
11916 for (i = 0; i < 2; i++)
336 7944 C[i] = ctx->frame->data[i + 1] + mb_x * 8
337 7944 + c_pos * ctx->frame->linesize[i + 1];
338 3972 init_get_bits(&gb, src, src_size * 8);
339
340 3972 memset(ctx->slice_data, 0,
341 sizeof(*ctx->slice_data) * slice_width * AIC_BAND_COEFFS);
342
2/2
✓ Branch 0 taken 15888 times.
✓ Branch 1 taken 3972 times.
19860 for (i = 0; i < NUM_BANDS; i++)
343
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 15888 times.
15888 if ((ret = aic_decode_coeffs(&gb, ctx->data_ptr[i],
344 i, slice_width,
345 15888 !ctx->interlaced)) < 0)
346 return ret;
347
348
2/2
✓ Branch 0 taken 120072 times.
✓ Branch 1 taken 3972 times.
124044 for (mb = 0; mb < slice_width; mb++) {
349
2/2
✓ Branch 0 taken 480288 times.
✓ Branch 1 taken 120072 times.
600360 for (blk = 0; blk < 4; blk++) {
350
2/2
✓ Branch 0 taken 113088 times.
✓ Branch 1 taken 367200 times.
480288 if (!ctx->interlaced)
351 113088 recombine_block(ctx->block, ctx->idsp.idct_permutation,
352 &base_y, &ext_y);
353 else
354 367200 recombine_block_il(ctx->block, ctx->idsp.idct_permutation,
355 &base_y, &ext_y, blk);
356 480288 unquant_block(ctx->block, ctx->quant, ctx->quant_matrix);
357 480288 ctx->idsp.idct(ctx->block);
358
359
2/2
✓ Branch 0 taken 113088 times.
✓ Branch 1 taken 367200 times.
480288 if (!ctx->interlaced) {
360 113088 dst = Y + (blk >> 1) * 8 * ystride + (blk & 1) * 8;
361 113088 ctx->idsp.put_signed_pixels_clamped(ctx->block, dst, ystride);
362 } else {
363 367200 dst = Y + (blk & 1) * 8 + (blk >> 1) * ystride;
364 367200 ctx->idsp.put_signed_pixels_clamped(ctx->block, dst,
365 367200 ystride * 2);
366 }
367 }
368 120072 Y += 16;
369
370
2/2
✓ Branch 0 taken 240144 times.
✓ Branch 1 taken 120072 times.
360216 for (blk = 0; blk < 2; blk++) {
371 240144 recombine_block(ctx->block, ctx->idsp.idct_permutation,
372 &base_c, &ext_c);
373 240144 unquant_block(ctx->block, ctx->quant, ctx->quant_matrix);
374 240144 ctx->idsp.idct(ctx->block);
375 240144 ctx->idsp.put_signed_pixels_clamped(ctx->block, C[blk],
376 240144 ctx->frame->linesize[blk + 1]);
377 240144 C[blk] += 8;
378 }
379 }
380
381 3972 return 0;
382 }
383
384 73 static int aic_decode_frame(AVCodecContext *avctx, AVFrame *frame,
385 int *got_frame, AVPacket *avpkt)
386 {
387 73 AICContext *ctx = avctx->priv_data;
388 73 const uint8_t *buf = avpkt->data;
389 73 int buf_size = avpkt->size;
390 GetByteContext gb;
391 uint32_t off;
392 int x, y, ret;
393 int slice_size;
394
395 73 ctx->frame = frame;
396
397 73 off = FFALIGN(AIC_HDR_SIZE + ctx->num_x_slices * ctx->mb_height * 2, 4);
398
399
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 73 times.
73 if (buf_size < off) {
400 av_log(avctx, AV_LOG_ERROR, "Too small frame\n");
401 return AVERROR_INVALIDDATA;
402 }
403
404 73 ret = aic_decode_header(ctx, buf, buf_size);
405
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 72 times.
73 if (ret < 0) {
406 1 av_log(avctx, AV_LOG_ERROR, "Invalid header\n");
407 1 return ret;
408 }
409
410
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 72 times.
72 if ((ret = ff_thread_get_buffer(avctx, ctx->frame, 0)) < 0)
411 return ret;
412
413 72 bytestream2_init(&gb, buf + AIC_HDR_SIZE,
414 72 ctx->num_x_slices * ctx->mb_height * 2);
415
416
2/2
✓ Branch 0 taken 1932 times.
✓ Branch 1 taken 72 times.
2004 for (y = 0; y < ctx->mb_height; y++) {
417
2/2
✓ Branch 0 taken 3972 times.
✓ Branch 1 taken 1932 times.
5904 for (x = 0; x < ctx->mb_width; x += ctx->slice_width) {
418 3972 slice_size = bytestream2_get_le16(&gb) * 4;
419
2/4
✓ Branch 0 taken 3972 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 3972 times.
3972 if (slice_size + off > buf_size || !slice_size) {
420 av_log(avctx, AV_LOG_ERROR,
421 "Incorrect slice size %d at %d.%d\n", slice_size, x, y);
422 return AVERROR_INVALIDDATA;
423 }
424
425 3972 ret = aic_decode_slice(ctx, x, y, buf + off, slice_size);
426
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3972 times.
3972 if (ret < 0) {
427 av_log(avctx, AV_LOG_ERROR,
428 "Error decoding slice at %d.%d\n", x, y);
429 return ret;
430 }
431
432 3972 off += slice_size;
433 }
434 }
435
436 72 *got_frame = 1;
437
438 72 return avpkt->size;
439 }
440
441 4 static av_cold int aic_decode_init(AVCodecContext *avctx)
442 {
443 4 AICContext *ctx = avctx->priv_data;
444 int i;
445
446 4 ctx->avctx = avctx;
447
448 4 avctx->pix_fmt = AV_PIX_FMT_YUV420P;
449
450 4 ff_idctdsp_init(&ctx->idsp, avctx);
451
452
2/2
✓ Branch 0 taken 256 times.
✓ Branch 1 taken 4 times.
260 for (i = 0; i < 64; i++)
453 256 ctx->quant_matrix[ctx->idsp.idct_permutation[i]] = aic_quant_matrix[i];
454
455 4 ctx->mb_width = FFALIGN(avctx->width, 16) >> 4;
456 4 ctx->mb_height = FFALIGN(avctx->height, 16) >> 4;
457
458 4 ctx->num_x_slices = (ctx->mb_width + 15) >> 4;
459 4 ctx->slice_width = 16;
460
1/2
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
8 for (i = 1; i < ctx->mb_width; i++) {
461
3/4
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 4 times.
✓ Branch 3 taken 4 times.
8 if (!(ctx->mb_width % i) && (ctx->mb_width / i <= 32)) {
462 4 ctx->slice_width = ctx->mb_width / i;
463 4 ctx->num_x_slices = i;
464 4 break;
465 }
466 }
467
468 4 ctx->slice_data = av_calloc(ctx->slice_width, AIC_BAND_COEFFS * sizeof(*ctx->slice_data));
469
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
4 if (!ctx->slice_data) {
470 av_log(avctx, AV_LOG_ERROR, "Error allocating slice buffer\n");
471
472 return AVERROR(ENOMEM);
473 }
474
475
2/2
✓ Branch 0 taken 16 times.
✓ Branch 1 taken 4 times.
20 for (i = 0; i < NUM_BANDS; i++)
476 16 ctx->data_ptr[i] = ctx->slice_data + ctx->slice_width
477 16 * aic_band_off[i];
478
479 4 return 0;
480 }
481
482 4 static av_cold int aic_decode_close(AVCodecContext *avctx)
483 {
484 4 AICContext *ctx = avctx->priv_data;
485
486 4 av_freep(&ctx->slice_data);
487
488 4 return 0;
489 }
490
491 const FFCodec ff_aic_decoder = {
492 .p.name = "aic",
493 CODEC_LONG_NAME("Apple Intermediate Codec"),
494 .p.type = AVMEDIA_TYPE_VIDEO,
495 .p.id = AV_CODEC_ID_AIC,
496 .priv_data_size = sizeof(AICContext),
497 .init = aic_decode_init,
498 .close = aic_decode_close,
499 FF_CODEC_DECODE_CB(aic_decode_frame),
500 .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_FRAME_THREADS,
501 };
502

bp是什么意思医学上面 风向是指风什么的方向 直系亲属为什么不能输血 孩子注意力不集中缺什么微量元素 头疼看什么科
胃气上逆有什么好的办法治疗 赞什么不已 猫咪弓背是什么原因 皮肤癣用什么药 尿道感染吃什么药最好
尿蛋白是什么意思 鱼饼是什么做的 半熟芝士是什么意思 梦到自己头发白了是什么意思 阿里郎是什么意思
瘦了是什么原因 什么水什么什么 夏天喝什么汤 蜈蚣怕什么东西 ch是什么牌子
农历7月21日是什么星座hcv9jop5ns5r.cn bml什么意思hcv8jop2ns8r.cn 心灵鸡汤是什么意思hcv8jop2ns8r.cn 脖子上有结节挂什么科hcv7jop9ns0r.cn 脚筋疼是什么原因gysmod.com
排卵什么意思hcv9jop3ns6r.cn 膈肌痉挛是什么症状hcv7jop6ns4r.cn 姜太公钓鱼愿者上钩是什么意思hcv9jop4ns3r.cn 总是放响屁是什么原因hcv7jop5ns1r.cn 月黑见渔灯的见读什么jasonfriends.com
热能是什么hcv8jop6ns7r.cn 龟裂是什么意思gangsutong.com 开门是什么意思hcv7jop5ns1r.cn 牛巴是什么hcv7jop5ns5r.cn 植物神经紊乱看什么科xscnpatent.com
半梦半醒是什么意思bfb118.com 乳腺钼靶是什么意思hcv9jop2ns1r.cn 有结石不能吃什么东西hcv9jop5ns7r.cn 体测是什么意思hcv9jop7ns1r.cn 肾不好有什么症状hcv7jop9ns1r.cn
百度