FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavcodec/ffv1enc.c
Date: 2025-04-25 22:50:00
Exec Total Coverage
Lines: 610 1072 56.9%
Functions: 21 28 75.0%
Branches: 440 1017 43.3%

Line Branch Exec Source
1 /*
2 * FFV1 encoder
3 *
4 * Copyright (c) 2003-2013 Michael Niedermayer <michaelni@gmx.at>
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 * FF Video Codec 1 (a lossless codec) encoder
26 */
27
28 #include "libavutil/attributes.h"
29 #include "libavutil/avassert.h"
30 #include "libavutil/crc.h"
31 #include "libavutil/mem.h"
32 #include "libavutil/opt.h"
33 #include "libavutil/pixdesc.h"
34 #include "libavutil/qsort.h"
35
36 #include "avcodec.h"
37 #include "encode.h"
38 #include "codec_internal.h"
39 #include "put_bits.h"
40 #include "put_golomb.h"
41 #include "rangecoder.h"
42 #include "ffv1.h"
43 #include "ffv1enc.h"
44
45 static const int8_t quant5_10bit[256] = {
46 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1,
47 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
48 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
49 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
50 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
51 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
52 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
53 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
54 -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
55 -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
56 -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
57 -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
58 -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -1,
59 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
60 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
61 -1, -1, -1, -1, -1, -1, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0,
62 };
63
64 static const int8_t quant5[256] = {
65 0, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
66 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
67 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
68 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
69 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
70 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
71 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
72 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
73 -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
74 -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
75 -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
76 -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
77 -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
78 -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
79 -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
80 -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -1, -1, -1,
81 };
82
83 static const int8_t quant9_10bit[256] = {
84 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2,
85 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3,
86 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
87 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
88 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
89 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
90 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
91 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
92 -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4,
93 -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4,
94 -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4,
95 -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4,
96 -4, -4, -4, -4, -4, -4, -4, -4, -4, -3, -3, -3, -3, -3, -3, -3,
97 -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3,
98 -3, -3, -3, -3, -3, -3, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
99 -2, -2, -2, -2, -1, -1, -1, -1, -1, -1, -1, -1, -0, -0, -0, -0,
100 };
101
102 static const int8_t quant11[256] = {
103 0, 1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4,
104 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
105 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
106 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
107 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
108 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
109 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
110 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
111 -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5,
112 -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5,
113 -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5,
114 -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5,
115 -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5,
116 -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -4, -4,
117 -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4,
118 -4, -4, -4, -4, -4, -3, -3, -3, -3, -3, -3, -3, -2, -2, -2, -1,
119 };
120
121 static const uint8_t ver2_state[256] = {
122 0, 10, 10, 10, 10, 16, 16, 16, 28, 16, 16, 29, 42, 49, 20, 49,
123 59, 25, 26, 26, 27, 31, 33, 33, 33, 34, 34, 37, 67, 38, 39, 39,
124 40, 40, 41, 79, 43, 44, 45, 45, 48, 48, 64, 50, 51, 52, 88, 52,
125 53, 74, 55, 57, 58, 58, 74, 60, 101, 61, 62, 84, 66, 66, 68, 69,
126 87, 82, 71, 97, 73, 73, 82, 75, 111, 77, 94, 78, 87, 81, 83, 97,
127 85, 83, 94, 86, 99, 89, 90, 99, 111, 92, 93, 134, 95, 98, 105, 98,
128 105, 110, 102, 108, 102, 118, 103, 106, 106, 113, 109, 112, 114, 112, 116, 125,
129 115, 116, 117, 117, 126, 119, 125, 121, 121, 123, 145, 124, 126, 131, 127, 129,
130 165, 130, 132, 138, 133, 135, 145, 136, 137, 139, 146, 141, 143, 142, 144, 148,
131 147, 155, 151, 149, 151, 150, 152, 157, 153, 154, 156, 168, 158, 162, 161, 160,
132 172, 163, 169, 164, 166, 184, 167, 170, 177, 174, 171, 173, 182, 176, 180, 178,
133 175, 189, 179, 181, 186, 183, 192, 185, 200, 187, 191, 188, 190, 197, 193, 196,
134 197, 194, 195, 196, 198, 202, 199, 201, 210, 203, 207, 204, 205, 206, 208, 214,
135 209, 211, 221, 212, 213, 215, 224, 216, 217, 218, 219, 220, 222, 228, 223, 225,
136 226, 224, 227, 229, 240, 230, 231, 232, 233, 234, 235, 236, 238, 239, 237, 242,
137 241, 243, 242, 244, 245, 246, 247, 248, 249, 250, 251, 252, 252, 253, 254, 255,
138 };
139
140 8 static void find_best_state(uint8_t best_state[256][256],
141 const uint8_t one_state[256])
142 {
143 int i, j, k, m;
144 uint32_t l2tab[256];
145
146
2/2
✓ Branch 0 taken 2040 times.
✓ Branch 1 taken 8 times.
2048 for (i = 1; i < 256; i++)
147 2040 l2tab[i] = -log2(i / 256.0) * ((1U << 31) / 8);
148
149
2/2
✓ Branch 0 taken 2048 times.
✓ Branch 1 taken 8 times.
2056 for (i = 0; i < 256; i++) {
150 uint64_t best_len[256];
151
152
2/2
✓ Branch 0 taken 524288 times.
✓ Branch 1 taken 2048 times.
526336 for (j = 0; j < 256; j++)
153 524288 best_len[j] = UINT64_MAX;
154
155
2/2
✓ Branch 0 taken 42040 times.
✓ Branch 1 taken 2048 times.
44088 for (j = FFMAX(i - 10, 1); j < FFMIN(i + 11, 256); j++) {
156 42040 uint32_t occ[256] = { 0 };
157 42040 uint64_t len = 0;
158 42040 occ[j] = UINT32_MAX;
159
160
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 42040 times.
42040 if (!one_state[j])
161 continue;
162
163
2/2
✓ Branch 0 taken 10762240 times.
✓ Branch 1 taken 42040 times.
10804280 for (k = 0; k < 256; k++) {
164 10762240 uint32_t newocc[256] = { 0 };
165
2/2
✓ Branch 0 taken 2744371200 times.
✓ Branch 1 taken 10762240 times.
2755133440 for (m = 1; m < 256; m++)
166
2/2
✓ Branch 0 taken 861994804 times.
✓ Branch 1 taken 1882376396 times.
2744371200 if (occ[m]) {
167 861994804 len += (occ[m]*(( i *(uint64_t)l2tab[ m]
168 861994804 + (256-i)*(uint64_t)l2tab[256-m])>>8)) >> 8;
169 }
170
2/2
✓ Branch 0 taken 3100046 times.
✓ Branch 1 taken 7662194 times.
10762240 if (len < best_len[k]) {
171 3100046 best_len[k] = len;
172 3100046 best_state[i][k] = j;
173 }
174
2/2
✓ Branch 0 taken 2744371200 times.
✓ Branch 1 taken 10762240 times.
2755133440 for (m = 1; m < 256; m++)
175
2/2
✓ Branch 0 taken 861994804 times.
✓ Branch 1 taken 1882376396 times.
2744371200 if (occ[m]) {
176 861994804 newocc[ one_state[ m]] += occ[m] * (uint64_t) i >> 8;
177 861994804 newocc[256 - one_state[256 - m]] += occ[m] * (uint64_t)(256 - i) >> 8;
178 }
179 10762240 memcpy(occ, newocc, sizeof(occ));
180 }
181 }
182 }
183 8 }
184
185 239905402 static av_always_inline av_flatten void put_symbol_inline(RangeCoder *c,
186 uint8_t *state, int v,
187 int is_signed,
188 uint64_t rc_stat[256][2],
189 uint64_t rc_stat2[32][2])
190 {
191 int i;
192
193 #define put_rac(C, S, B) \
194 do { \
195 if (rc_stat) { \
196 rc_stat[*(S)][B]++; \
197 rc_stat2[(S) - state][B]++; \
198 } \
199 put_rac(C, S, B); \
200 } while (0)
201
202
2/2
✓ Branch 0 taken 150069347 times.
✓ Branch 1 taken 89836055 times.
239905402 if (v) {
203
2/2
✓ Branch 0 taken 150035433 times.
✓ Branch 1 taken 33914 times.
150069347 const unsigned a = is_signed ? FFABS(v) : v;
204 150069347 const int e = av_log2(a);
205
2/2
✓ Branch 0 taken 38585298 times.
✓ Branch 1 taken 111484049 times.
150069347 put_rac(c, state + 0, 0);
206
2/2
✓ Branch 0 taken 125107169 times.
✓ Branch 1 taken 24962178 times.
150069347 if (e <= 9) {
207
2/2
✓ Branch 0 taken 435122815 times.
✓ Branch 1 taken 125107169 times.
560229984 for (i = 0; i < e; i++)
208
2/2
✓ Branch 0 taken 102966854 times.
✓ Branch 1 taken 332155961 times.
435122815 put_rac(c, state + 1 + i, 1); // 1..10
209
2/2
✓ Branch 0 taken 38585298 times.
✓ Branch 1 taken 86521871 times.
125107169 put_rac(c, state + 1 + i, 0);
210
211
2/2
✓ Branch 0 taken 435122815 times.
✓ Branch 1 taken 125107169 times.
560229984 for (i = e - 1; i >= 0; i--)
212
2/2
✓ Branch 0 taken 102966854 times.
✓ Branch 1 taken 332155961 times.
435122815 put_rac(c, state + 22 + i, (a >> i) & 1); // 22..31
213
214
2/2
✓ Branch 0 taken 125073255 times.
✓ Branch 1 taken 33914 times.
125107169 if (is_signed)
215
2/2
✓ Branch 0 taken 38585298 times.
✓ Branch 1 taken 86487957 times.
125073255 put_rac(c, state + 11 + e, v < 0); // 11..21
216 } else {
217
2/2
✓ Branch 0 taken 269770289 times.
✓ Branch 1 taken 24962178 times.
294732467 for (i = 0; i < e; i++)
218
3/8
✗ Branch 0 not taken.
✓ Branch 1 taken 269770289 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 249621780 times.
✓ Branch 7 taken 20148509 times.
269770289 put_rac(c, state + 1 + FFMIN(i, 9), 1); // 1..10
219
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 24962178 times.
24962178 put_rac(c, state + 1 + 9, 0);
220
221
2/2
✓ Branch 0 taken 269770289 times.
✓ Branch 1 taken 24962178 times.
294732467 for (i = e - 1; i >= 0; i--)
222
3/8
✗ Branch 0 not taken.
✓ Branch 1 taken 269770289 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 249621780 times.
✓ Branch 7 taken 20148509 times.
269770289 put_rac(c, state + 22 + FFMIN(i, 9), (a >> i) & 1); // 22..31
223
224
1/2
✓ Branch 0 taken 24962178 times.
✗ Branch 1 not taken.
24962178 if (is_signed)
225
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 24962178 times.
24962178 put_rac(c, state + 11 + 10, v < 0); // 11..21
226 }
227 } else {
228
2/2
✓ Branch 0 taken 14846302 times.
✓ Branch 1 taken 74989753 times.
89836055 put_rac(c, state + 0, 1);
229 }
230 #undef put_rac
231 239905402 }
232
233 1702002 static av_noinline void put_symbol(RangeCoder *c, uint8_t *state,
234 int v, int is_signed)
235 {
236 1702002 put_symbol_inline(c, state, v, is_signed, NULL, NULL);
237 1702002 }
238
239
240 163659991 static inline void put_vlc_symbol(PutBitContext *pb, VlcState *const state,
241 int v, int bits)
242 {
243 int i, k, code;
244 163659991 v = fold(v - state->bias, bits);
245
246 163659991 i = state->count;
247 163659991 k = 0;
248
2/2
✓ Branch 0 taken 272532174 times.
✓ Branch 1 taken 163659991 times.
436192165 while (i < state->error_sum) { // FIXME: optimize
249 272532174 k++;
250 272532174 i += i;
251 }
252
253 av_assert2(k <= 16);
254
255 163659991 code = v ^ ((2 * state->drift + state->count) >> 31);
256
257 ff_dlog(NULL, "v:%d/%d bias:%d error:%d drift:%d count:%d k:%d\n", v, code,
258 state->bias, state->error_sum, state->drift, state->count, k);
259 163659991 set_sr_golomb(pb, code, k, 12, bits);
260
261 163659991 update_vlc_state(state, v);
262 163659991 }
263
264 #define TYPE int16_t
265 #define RENAME(name) name
266 #include "ffv1enc_template.c"
267 #undef TYPE
268 #undef RENAME
269
270 #define TYPE int32_t
271 #define RENAME(name) name ## 32
272 #include "ffv1enc_template.c"
273
274 23235 static int encode_plane(FFV1Context *f, FFV1SliceContext *sc,
275 const uint8_t *src, int w, int h,
276 int stride, int plane_index, int remap_index, int pixel_stride, int ac)
277 {
278 int x, y, i, ret;
279 23235 const int pass1 = !!(f->avctx->flags & AV_CODEC_FLAG_PASS1);
280
2/2
✓ Branch 0 taken 9600 times.
✓ Branch 1 taken 13635 times.
23235 const int ring_size = f->context_model ? 3 : 2;
281 int16_t *sample[3];
282 23235 sc->run_index = 0;
283
284 23235 memset(sc->sample_buffer, 0, ring_size * (w + 6) * sizeof(*sc->sample_buffer));
285
286
2/2
✓ Branch 0 taken 2214000 times.
✓ Branch 1 taken 23235 times.
2237235 for (y = 0; y < h; y++) {
287
2/2
✓ Branch 0 taken 5326400 times.
✓ Branch 1 taken 2214000 times.
7540400 for (i = 0; i < ring_size; i++)
288 5326400 sample[i] = sc->sample_buffer + (w + 6) * ((h + i - y) % ring_size) + 3;
289
290 2214000 sample[0][-1]= sample[1][0 ];
291 2214000 sample[1][ w]= sample[1][w-1];
292
293
2/2
✓ Branch 0 taken 1104000 times.
✓ Branch 1 taken 1110000 times.
2214000 if (f->bits_per_raw_sample <= 8) {
294
2/2
✓ Branch 0 taken 168153700 times.
✓ Branch 1 taken 1104000 times.
169257700 for (x = 0; x < w; x++)
295 168153700 sample[0][x] = src[x * pixel_stride + stride * y];
296
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1104000 times.
1104000 if (sc->remap)
297 for (x = 0; x < w; x++)
298 sample[0][x] = sc->fltmap[remap_index][ sample[0][x] ];
299
300
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 1104000 times.
1104000 if((ret = encode_line(f, sc, f->avctx, w, sample, plane_index, 8, ac, pass1)) < 0)
301 return ret;
302 } else {
303
2/2
✓ Branch 0 taken 840600 times.
✓ Branch 1 taken 269400 times.
1110000 if (f->packed_at_lsb) {
304
2/2
✓ Branch 0 taken 100818600 times.
✓ Branch 1 taken 840600 times.
101659200 for (x = 0; x < w; x++) {
305 100818600 sample[0][x] = ((uint16_t*)(src + stride*y))[x * pixel_stride];
306 }
307 } else {
308
2/2
✓ Branch 0 taken 45792600 times.
✓ Branch 1 taken 269400 times.
46062000 for (x = 0; x < w; x++) {
309 45792600 sample[0][x] = ((uint16_t*)(src + stride*y))[x * pixel_stride] >> (16 - f->bits_per_raw_sample);
310 }
311 }
312
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1110000 times.
1110000 if (sc->remap)
313 for (x = 0; x < w; x++)
314 sample[0][x] = sc->fltmap[remap_index][ (uint16_t)sample[0][x] ];
315
316
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 1110000 times.
1110000 if((ret = encode_line(f, sc, f->avctx, w, sample, plane_index, f->bits_per_raw_sample, ac, pass1)) < 0)
317 return ret;
318 }
319 }
320 23235 return 0;
321 }
322
323 static void load_plane(FFV1Context *f, FFV1SliceContext *sc,
324 const uint8_t *src, int w, int h,
325 int stride, int remap_index, int pixel_stride)
326 {
327 int x, y;
328
329 memset(sc->fltmap[remap_index], 0, 65536 * sizeof(*sc->fltmap[remap_index]));
330
331 for (y = 0; y < h; y++) {
332 if (f->bits_per_raw_sample <= 8) {
333 for (x = 0; x < w; x++)
334 sc->fltmap[remap_index][ src[x * pixel_stride + stride * y] ] = 1;
335 } else {
336 if (f->packed_at_lsb) {
337 for (x = 0; x < w; x++)
338 sc->fltmap[remap_index][ ((uint16_t*)(src + stride*y))[x * pixel_stride] ] = 1;
339 } else {
340 for (x = 0; x < w; x++)
341 sc->fltmap[remap_index][ ((uint16_t*)(src + stride*y))[x * pixel_stride] >> (16 - f->bits_per_raw_sample) ] = 1;
342 }
343 }
344 }
345 }
346
347 570 static void write_quant_table(RangeCoder *c, int16_t *quant_table)
348 {
349 570 int last = 0;
350 int i;
351 uint8_t state[CONTEXT_SIZE];
352 570 memset(state, 128, sizeof(state));
353
354
2/2
✓ Branch 0 taken 72390 times.
✓ Branch 1 taken 570 times.
72960 for (i = 1; i < MAX_QUANT_TABLE_SIZE/2; i++)
355
2/2
✓ Branch 0 taken 1652 times.
✓ Branch 1 taken 70738 times.
72390 if (quant_table[i] != quant_table[i - 1]) {
356 1652 put_symbol(c, state, i - last - 1, 0);
357 1652 last = i;
358 }
359 570 put_symbol(c, state, i - last - 1, 0);
360 570 }
361
362 114 static void write_quant_tables(RangeCoder *c,
363 int16_t quant_table[MAX_CONTEXT_INPUTS][MAX_QUANT_TABLE_SIZE])
364 {
365 int i;
366
2/2
✓ Branch 0 taken 570 times.
✓ Branch 1 taken 114 times.
684 for (i = 0; i < 5; i++)
367 570 write_quant_table(c, quant_table[i]);
368 114 }
369
370 94 static int contains_non_128(uint8_t (*initial_state)[CONTEXT_SIZE],
371 int nb_contexts)
372 {
373
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 94 times.
94 if (!initial_state)
374 return 0;
375
2/2
✓ Branch 0 taken 277446 times.
✓ Branch 1 taken 86 times.
277532 for (int i = 0; i < nb_contexts; i++)
376
2/2
✓ Branch 0 taken 8878024 times.
✓ Branch 1 taken 277438 times.
9155462 for (int j = 0; j < CONTEXT_SIZE; j++)
377
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8878016 times.
8878024 if (initial_state[i][j] != 128)
378 8 return 1;
379 86 return 0;
380 }
381
382 249 static void write_header(FFV1Context *f)
383 {
384 uint8_t state[CONTEXT_SIZE];
385 int i, j;
386 249 RangeCoder *const c = &f->slices[0].c;
387
388 249 memset(state, 128, sizeof(state));
389
390
2/2
✓ Branch 0 taken 20 times.
✓ Branch 1 taken 229 times.
249 if (f->version < 2) {
391 20 put_symbol(c, state, f->version, 0);
392 20 put_symbol(c, state, f->ac, 0);
393
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 20 times.
20 if (f->ac == AC_RANGE_CUSTOM_TAB) {
394 for (i = 1; i < 256; i++)
395 put_symbol(c, state,
396 f->state_transition[i] - c->one_state[i], 1);
397 }
398 20 put_symbol(c, state, f->colorspace, 0); //YUV cs type
399
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 20 times.
20 if (f->version > 0)
400 put_symbol(c, state, f->bits_per_raw_sample, 0);
401 20 put_rac(c, state, f->chroma_planes);
402 20 put_symbol(c, state, f->chroma_h_shift, 0);
403 20 put_symbol(c, state, f->chroma_v_shift, 0);
404 20 put_rac(c, state, f->transparency);
405
406 20 write_quant_tables(c, f->quant_tables[f->context_model]);
407
2/2
✓ Branch 0 taken 20 times.
✓ Branch 1 taken 209 times.
229 } else if (f->version < 3) {
408 20 put_symbol(c, state, f->slice_count, 0);
409
2/2
✓ Branch 0 taken 80 times.
✓ Branch 1 taken 20 times.
100 for (i = 0; i < f->slice_count; i++) {
410 80 FFV1SliceContext *fs = &f->slices[i];
411 80 put_symbol(c, state,
412 80 (fs->slice_x + 1) * f->num_h_slices / f->width, 0);
413 80 put_symbol(c, state,
414 80 (fs->slice_y + 1) * f->num_v_slices / f->height, 0);
415 80 put_symbol(c, state,
416 80 (fs->slice_width + 1) * f->num_h_slices / f->width - 1,
417 0);
418 80 put_symbol(c, state,
419 80 (fs->slice_height + 1) * f->num_v_slices / f->height - 1,
420 0);
421
2/2
✓ Branch 0 taken 160 times.
✓ Branch 1 taken 80 times.
240 for (j = 0; j < f->plane_count; j++) {
422 160 put_symbol(c, state, fs->plane[j].quant_table_index, 0);
423
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 160 times.
160 av_assert0(fs->plane[j].quant_table_index == f->context_model);
424 }
425 }
426 }
427 249 }
428
429 51 static void set_micro_version(FFV1Context *f)
430 {
431 51 f->combined_version = f->version << 16;
432
2/2
✓ Branch 0 taken 43 times.
✓ Branch 1 taken 8 times.
51 if (f->version > 2) {
433
1/2
✓ Branch 0 taken 43 times.
✗ Branch 1 not taken.
43 if (f->version == 3) {
434 43 f->micro_version = 4;
435 } else if (f->version == 4) {
436 f->micro_version = 8;
437 } else
438 av_assert0(0);
439
440 43 f->combined_version += f->micro_version;
441 } else
442
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
8 av_assert0(f->micro_version == 0);
443 51 }
444
445 47 av_cold int ff_ffv1_write_extradata(AVCodecContext *avctx)
446 {
447 47 FFV1Context *f = avctx->priv_data;
448
449 RangeCoder c;
450 uint8_t state[CONTEXT_SIZE];
451 int i, j, k;
452 uint8_t state2[32][CONTEXT_SIZE];
453 unsigned v;
454
455 47 memset(state2, 128, sizeof(state2));
456 47 memset(state, 128, sizeof(state));
457
458 47 f->avctx->extradata_size = 10000 + 4 +
459 (11 * 11 * 5 * 5 * 5 + 11 * 11 * 11) * 32;
460 47 f->avctx->extradata = av_malloc(f->avctx->extradata_size + AV_INPUT_BUFFER_PADDING_SIZE);
461
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 47 times.
47 if (!f->avctx->extradata)
462 return AVERROR(ENOMEM);
463 47 ff_init_range_encoder(&c, f->avctx->extradata, f->avctx->extradata_size);
464 47 ff_build_rac_states(&c, 0.05 * (1LL << 32), 256 - 8);
465
466 47 put_symbol(&c, state, f->version, 0);
467
2/2
✓ Branch 0 taken 43 times.
✓ Branch 1 taken 4 times.
47 if (f->version > 2)
468 43 put_symbol(&c, state, f->micro_version, 0);
469
470 47 put_symbol(&c, state, f->ac, 0);
471
2/2
✓ Branch 0 taken 29 times.
✓ Branch 1 taken 18 times.
47 if (f->ac == AC_RANGE_CUSTOM_TAB)
472
2/2
✓ Branch 0 taken 7395 times.
✓ Branch 1 taken 29 times.
7424 for (i = 1; i < 256; i++)
473 7395 put_symbol(&c, state, f->state_transition[i] - c.one_state[i], 1);
474
475 47 put_symbol(&c, state, f->colorspace, 0); // YUV cs type
476 47 put_symbol(&c, state, f->bits_per_raw_sample, 0);
477 47 put_rac(&c, state, f->chroma_planes);
478 47 put_symbol(&c, state, f->chroma_h_shift, 0);
479 47 put_symbol(&c, state, f->chroma_v_shift, 0);
480 47 put_rac(&c, state, f->transparency);
481 47 put_symbol(&c, state, f->num_h_slices - 1, 0);
482 47 put_symbol(&c, state, f->num_v_slices - 1, 0);
483
484 47 put_symbol(&c, state, f->quant_table_count, 0);
485
2/2
✓ Branch 0 taken 94 times.
✓ Branch 1 taken 47 times.
141 for (i = 0; i < f->quant_table_count; i++)
486 94 write_quant_tables(&c, f->quant_tables[i]);
487
488
2/2
✓ Branch 0 taken 94 times.
✓ Branch 1 taken 47 times.
141 for (i = 0; i < f->quant_table_count; i++) {
489
2/2
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 86 times.
94 if (contains_non_128(f->initial_states[i], f->context_count[i])) {
490 8 put_rac(&c, state, 1);
491
2/2
✓ Branch 0 taken 50504 times.
✓ Branch 1 taken 8 times.
50512 for (j = 0; j < f->context_count[i]; j++)
492
2/2
✓ Branch 0 taken 1616128 times.
✓ Branch 1 taken 50504 times.
1666632 for (k = 0; k < CONTEXT_SIZE; k++) {
493
2/2
✓ Branch 0 taken 1615872 times.
✓ Branch 1 taken 256 times.
1616128 int pred = j ? f->initial_states[i][j - 1][k] : 128;
494 1616128 put_symbol(&c, state2[k],
495 1616128 (int8_t)(f->initial_states[i][j][k] - pred), 1);
496 }
497 } else {
498 86 put_rac(&c, state, 0);
499 }
500 }
501
502
2/2
✓ Branch 0 taken 43 times.
✓ Branch 1 taken 4 times.
47 if (f->version > 2) {
503 43 put_symbol(&c, state, f->ec, 0);
504 43 put_symbol(&c, state, f->intra = (f->avctx->gop_size < 2), 0);
505 }
506
507 47 f->avctx->extradata_size = ff_rac_terminate(&c, 0);
508
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 47 times.
47 v = av_crc(av_crc_get_table(AV_CRC_32_IEEE), f->crcref, f->avctx->extradata, f->avctx->extradata_size) ^ (f->crcref ? 0x8CD88196 : 0);
509 47 AV_WL32(f->avctx->extradata + f->avctx->extradata_size, v);
510 47 f->avctx->extradata_size += 4;
511
512 47 return 0;
513 }
514
515 8 static int sort_stt(FFV1Context *s, uint8_t stt[256])
516 {
517 8 int i, i2, changed, print = 0;
518
519 do {
520 37 changed = 0;
521
2/2
✓ Branch 0 taken 8584 times.
✓ Branch 1 taken 37 times.
8621 for (i = 12; i < 244; i++) {
522
4/4
✓ Branch 0 taken 34114 times.
✓ Branch 1 taken 111 times.
✓ Branch 2 taken 25641 times.
✓ Branch 3 taken 8473 times.
34225 for (i2 = i + 1; i2 < 245 && i2 < i + 4; i2++) {
523
524 #define COST(old, new) \
525 s->rc_stat[old][0] * -log2((256 - (new)) / 256.0) + \
526 s->rc_stat[old][1] * -log2((new) / 256.0)
527
528 #define COST2(old, new) \
529 COST(old, new) + COST(256 - (old), 256 - (new))
530
531 25641 double size0 = COST2(i, i) + COST2(i2, i2);
532 25641 double sizeX = COST2(i, i2) + COST2(i2, i);
533
5/6
✓ Branch 0 taken 5086 times.
✓ Branch 1 taken 20555 times.
✓ Branch 2 taken 5086 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 5085 times.
✓ Branch 5 taken 1 times.
25641 if (size0 - sizeX > size0*(1e-14) && i != 128 && i2 != 128) {
534 int j;
535 5085 FFSWAP(int, stt[i], stt[i2]);
536 5085 FFSWAP(int, s->rc_stat[i][0], s->rc_stat[i2][0]);
537 5085 FFSWAP(int, s->rc_stat[i][1], s->rc_stat[i2][1]);
538
2/2
✓ Branch 0 taken 5084 times.
✓ Branch 1 taken 1 times.
5085 if (i != 256 - i2) {
539 5084 FFSWAP(int, stt[256 - i], stt[256 - i2]);
540 5084 FFSWAP(int, s->rc_stat[256 - i][0], s->rc_stat[256 - i2][0]);
541 5084 FFSWAP(int, s->rc_stat[256 - i][1], s->rc_stat[256 - i2][1]);
542 }
543
2/2
✓ Branch 0 taken 1296675 times.
✓ Branch 1 taken 5085 times.
1301760 for (j = 1; j < 256; j++) {
544
2/2
✓ Branch 0 taken 5094 times.
✓ Branch 1 taken 1291581 times.
1296675 if (stt[j] == i)
545 5094 stt[j] = i2;
546
2/2
✓ Branch 0 taken 5122 times.
✓ Branch 1 taken 1286459 times.
1291581 else if (stt[j] == i2)
547 5122 stt[j] = i;
548
2/2
✓ Branch 0 taken 1296420 times.
✓ Branch 1 taken 255 times.
1296675 if (i != 256 - i2) {
549
2/2
✓ Branch 0 taken 4906 times.
✓ Branch 1 taken 1291514 times.
1296420 if (stt[256 - j] == 256 - i)
550 4906 stt[256 - j] = 256 - i2;
551
2/2
✓ Branch 0 taken 5124 times.
✓ Branch 1 taken 1286390 times.
1291514 else if (stt[256 - j] == 256 - i2)
552 5124 stt[256 - j] = 256 - i;
553 }
554 }
555 5085 print = changed = 1;
556 }
557 }
558 }
559
2/2
✓ Branch 0 taken 29 times.
✓ Branch 1 taken 8 times.
37 } while (changed);
560 8 return print;
561 }
562
563
564 47 int ff_ffv1_encode_determine_slices(AVCodecContext *avctx)
565 {
566 47 FFV1Context *s = avctx->priv_data;
567 47 int plane_count = 1 + 2*s->chroma_planes + s->transparency;
568 47 int max_h_slices = AV_CEIL_RSHIFT(avctx->width , s->chroma_h_shift);
569 47 int max_v_slices = AV_CEIL_RSHIFT(avctx->height, s->chroma_v_shift);
570
5/6
✓ Branch 0 taken 44 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 44 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 40 times.
✓ Branch 5 taken 4 times.
47 s->num_v_slices = (avctx->width > 352 || avctx->height > 288 || !avctx->slices) ? 2 : 1;
571 47 s->num_v_slices = FFMIN(s->num_v_slices, max_v_slices);
572
1/2
✓ Branch 0 taken 52 times.
✗ Branch 1 not taken.
52 for (; s->num_v_slices <= 32; s->num_v_slices++) {
573
2/2
✓ Branch 0 taken 58 times.
✓ Branch 1 taken 5 times.
63 for (s->num_h_slices = s->num_v_slices; s->num_h_slices <= 2*s->num_v_slices; s->num_h_slices++) {
574 58 int maxw = (avctx->width + s->num_h_slices - 1) / s->num_h_slices;
575 58 int maxh = (avctx->height + s->num_v_slices - 1) / s->num_v_slices;
576
2/4
✓ Branch 0 taken 58 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 58 times.
58 if (s->num_h_slices > max_h_slices || s->num_v_slices > max_v_slices)
577 continue;
578
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 58 times.
58 if (maxw * maxh * (int64_t)(s->bits_per_raw_sample+1) * plane_count > 8<<24)
579 continue;
580
1/2
✓ Branch 0 taken 58 times.
✗ Branch 1 not taken.
58 if (s->version < 4)
581
1/2
✓ Branch 1 taken 58 times.
✗ Branch 2 not taken.
58 if ( ff_need_new_slices(avctx->width , s->num_h_slices, s->chroma_h_shift)
582
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 58 times.
58 ||ff_need_new_slices(avctx->height, s->num_v_slices, s->chroma_v_shift))
583 continue;
584
3/4
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 54 times.
✓ Branch 2 taken 4 times.
✗ Branch 3 not taken.
58 if (avctx->slices == s->num_h_slices * s->num_v_slices && avctx->slices <= MAX_SLICES)
585 4 return 0;
586
2/2
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 51 times.
54 if (maxw*maxh > 360*288)
587 3 continue;
588
2/2
✓ Branch 0 taken 43 times.
✓ Branch 1 taken 8 times.
51 if (!avctx->slices)
589 43 return 0;
590 }
591 }
592 av_log(avctx, AV_LOG_ERROR,
593 "Unsupported number %d of slices requested, please specify a "
594 "supported number with -slices (ex:4,6,9,12,16, ...)\n",
595 avctx->slices);
596 return AVERROR(ENOSYS);
597 }
598
599 51 av_cold int ff_ffv1_encode_init(AVCodecContext *avctx)
600 {
601 51 FFV1Context *s = avctx->priv_data;
602 int i, j, k, m, ret;
603
604
2/2
✓ Branch 0 taken 35 times.
✓ Branch 1 taken 16 times.
51 if ((avctx->flags & (AV_CODEC_FLAG_PASS1 | AV_CODEC_FLAG_PASS2)) ||
605
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 31 times.
35 avctx->slices > 1)
606 20 s->version = FFMAX(s->version, 2);
607
608
3/4
✓ Branch 0 taken 16 times.
✓ Branch 1 taken 35 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 16 times.
51 if ((avctx->flags & (AV_CODEC_FLAG_PASS1 | AV_CODEC_FLAG_PASS2)) && s->ac == AC_GOLOMB_RICE) {
609 av_log(avctx, AV_LOG_ERROR, "2 Pass mode is not possible with golomb coding\n");
610 return AVERROR(EINVAL);
611 }
612
613 // Unspecified level & slices, we choose version 1.2+ to ensure multithreaded decodability
614
6/6
✓ Branch 0 taken 47 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 18 times.
✓ Branch 3 taken 29 times.
✓ Branch 4 taken 1 times.
✓ Branch 5 taken 17 times.
51 if (avctx->slices == 0 && avctx->level < 0 && avctx->width * avctx->height > 720*576)
615 1 s->version = FFMAX(s->version, 2);
616
617
4/4
✓ Branch 0 taken 26 times.
✓ Branch 1 taken 25 times.
✓ Branch 2 taken 21 times.
✓ Branch 3 taken 5 times.
51 if (avctx->level <= 0 && s->version == 2) {
618 21 s->version = 3;
619 }
620
3/4
✓ Branch 0 taken 29 times.
✓ Branch 1 taken 22 times.
✓ Branch 2 taken 29 times.
✗ Branch 3 not taken.
51 if (avctx->level >= 0 && avctx->level <= 4) {
621
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 29 times.
29 if (avctx->level < s->version) {
622 av_log(avctx, AV_LOG_ERROR, "Version %d needed for requested features but %d requested\n", s->version, avctx->level);
623 return AVERROR(EINVAL);
624 }
625 29 s->version = avctx->level;
626
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 21 times.
22 } else if (s->version < 3)
627 1 s->version = 3;
628
629
1/2
✓ Branch 0 taken 51 times.
✗ Branch 1 not taken.
51 if (s->ec < 0) {
630
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 51 times.
51 if (s->version >= 4) {
631 s->ec = 2;
632 s->crcref = 0x7a8c4079;
633
2/2
✓ Branch 0 taken 43 times.
✓ Branch 1 taken 8 times.
51 } else if (s->version >= 3) {
634 43 s->ec = 1;
635 } else
636 8 s->ec = 0;
637 }
638
639 // CRC requires version 3+
640
2/2
✓ Branch 0 taken 43 times.
✓ Branch 1 taken 8 times.
51 if (s->ec == 1)
641 43 s->version = FFMAX(s->version, 3);
642
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 51 times.
51 if (s->ec == 2)
643 s->version = FFMAX(s->version, 4);
644
645
4/6
✓ Branch 0 taken 47 times.
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 47 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 4 times.
51 if ((s->version == 2 || s->version>3) && avctx->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
646 av_log(avctx, AV_LOG_ERROR, "Version 2 or 4 needed for requested features but version 2 or 4 is experimental and not enabled\n");
647 return AVERROR_INVALIDDATA;
648 }
649
650
2/2
✓ Branch 0 taken 29 times.
✓ Branch 1 taken 22 times.
51 if (s->ac == AC_RANGE_CUSTOM_TAB) {
651
2/2
✓ Branch 0 taken 7395 times.
✓ Branch 1 taken 29 times.
7424 for (i = 1; i < 256; i++)
652 7395 s->state_transition[i] = ver2_state[i];
653 } else {
654 RangeCoder c;
655 22 ff_build_rac_states(&c, 0.05 * (1LL << 32), 256 - 8);
656
2/2
✓ Branch 0 taken 5610 times.
✓ Branch 1 taken 22 times.
5632 for (i = 1; i < 256; i++)
657 5610 s->state_transition[i] = c.one_state[i];
658 }
659
660
2/2
✓ Branch 0 taken 13056 times.
✓ Branch 1 taken 51 times.
13107 for (i = 0; i < 256; i++) {
661 13056 s->quant_table_count = 2;
662
4/6
✓ Branch 0 taken 13056 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 5376 times.
✓ Branch 3 taken 7680 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 5376 times.
13056 if ((s->qtable == -1 && s->bits_per_raw_sample <= 8) || s->qtable == 1) {
663 7680 s->quant_tables[0][0][i]= quant11[i];
664 7680 s->quant_tables[0][1][i]= 11*quant11[i];
665 7680 s->quant_tables[0][2][i]= 11*11*quant11[i];
666 7680 s->quant_tables[1][0][i]= quant11[i];
667 7680 s->quant_tables[1][1][i]= 11*quant11[i];
668 7680 s->quant_tables[1][2][i]= 11*11*quant5 [i];
669 7680 s->quant_tables[1][3][i]= 5*11*11*quant5 [i];
670 7680 s->quant_tables[1][4][i]= 5*5*11*11*quant5 [i];
671 7680 s->context_count[0] = (11 * 11 * 11 + 1) / 2;
672 7680 s->context_count[1] = (11 * 11 * 5 * 5 * 5 + 1) / 2;
673 } else {
674 5376 s->quant_tables[0][0][i]= quant9_10bit[i];
675 5376 s->quant_tables[0][1][i]= 9*quant9_10bit[i];
676 5376 s->quant_tables[0][2][i]= 9*9*quant9_10bit[i];
677 5376 s->quant_tables[1][0][i]= quant9_10bit[i];
678 5376 s->quant_tables[1][1][i]= 9*quant9_10bit[i];
679 5376 s->quant_tables[1][2][i]= 9*9*quant5_10bit[i];
680 5376 s->quant_tables[1][3][i]= 5*9*9*quant5_10bit[i];
681 5376 s->quant_tables[1][4][i]= 5*5*9*9*quant5_10bit[i];
682 5376 s->context_count[0] = (9 * 9 * 9 + 1) / 2;
683 5376 s->context_count[1] = (9 * 9 * 5 * 5 * 5 + 1) / 2;
684 }
685 }
686
687
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 51 times.
51 if ((ret = ff_ffv1_allocate_initial_states(s)) < 0)
688 return ret;
689
690
1/2
✓ Branch 0 taken 51 times.
✗ Branch 1 not taken.
51 if (!s->transparency)
691 51 s->plane_count = 2;
692
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 51 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
51 if (!s->chroma_planes && s->version > 3)
693 s->plane_count--;
694
695 51 s->picture_number = 0;
696
697
2/2
✓ Branch 0 taken 16 times.
✓ Branch 1 taken 35 times.
51 if (avctx->flags & (AV_CODEC_FLAG_PASS1 | AV_CODEC_FLAG_PASS2)) {
698
2/2
✓ Branch 0 taken 32 times.
✓ Branch 1 taken 16 times.
48 for (i = 0; i < s->quant_table_count; i++) {
699 32 s->rc_stat2[i] = av_mallocz(s->context_count[i] *
700 sizeof(*s->rc_stat2[i]));
701
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 32 times.
32 if (!s->rc_stat2[i])
702 return AVERROR(ENOMEM);
703 }
704 }
705
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 43 times.
51 if (avctx->stats_in) {
706 8 char *p = avctx->stats_in;
707 8 uint8_t (*best_state)[256] = av_malloc_array(256, 256);
708 8 int gob_count = 0;
709 char *next;
710
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
8 if (!best_state)
711 return AVERROR(ENOMEM);
712
713
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
8 av_assert0(s->version >= 2);
714
715 for (;;) {
716
2/2
✓ Branch 0 taken 2048 times.
✓ Branch 1 taken 8 times.
2056 for (j = 0; j < 256; j++)
717
2/2
✓ Branch 0 taken 4096 times.
✓ Branch 1 taken 2048 times.
6144 for (i = 0; i < 2; i++) {
718 4096 s->rc_stat[j][i] = strtol(p, &next, 0);
719
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 4096 times.
4096 if (next == p) {
720 av_log(avctx, AV_LOG_ERROR,
721 "2Pass file invalid at %d %d [%s]\n", j, i, p);
722 av_freep(&best_state);
723 return AVERROR_INVALIDDATA;
724 }
725 4096 p = next;
726 }
727
2/2
✓ Branch 0 taken 16 times.
✓ Branch 1 taken 8 times.
24 for (i = 0; i < s->quant_table_count; i++)
728
2/2
✓ Branch 0 taken 54628 times.
✓ Branch 1 taken 16 times.
54644 for (j = 0; j < s->context_count[i]; j++) {
729
2/2
✓ Branch 0 taken 1748096 times.
✓ Branch 1 taken 54628 times.
1802724 for (k = 0; k < 32; k++)
730
2/2
✓ Branch 0 taken 3496192 times.
✓ Branch 1 taken 1748096 times.
5244288 for (m = 0; m < 2; m++) {
731 3496192 s->rc_stat2[i][j][k][m] = strtol(p, &next, 0);
732
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3496192 times.
3496192 if (next == p) {
733 av_log(avctx, AV_LOG_ERROR,
734 "2Pass file invalid at %d %d %d %d [%s]\n",
735 i, j, k, m, p);
736 av_freep(&best_state);
737 return AVERROR_INVALIDDATA;
738 }
739 3496192 p = next;
740 }
741 }
742 8 gob_count = strtol(p, &next, 0);
743
2/4
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 8 times.
8 if (next == p || gob_count <= 0) {
744 av_log(avctx, AV_LOG_ERROR, "2Pass file invalid\n");
745 av_freep(&best_state);
746 return AVERROR_INVALIDDATA;
747 }
748 8 p = next;
749
3/4
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 8 times.
16 while (*p == '\n' || *p == ' ')
750 8 p++;
751
1/2
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
8 if (p[0] == 0)
752 8 break;
753 }
754
1/2
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
8 if (s->ac == AC_RANGE_CUSTOM_TAB)
755 8 sort_stt(s, s->state_transition);
756
757 8 find_best_state(best_state, s->state_transition);
758
759
2/2
✓ Branch 0 taken 16 times.
✓ Branch 1 taken 8 times.
24 for (i = 0; i < s->quant_table_count; i++) {
760
2/2
✓ Branch 0 taken 512 times.
✓ Branch 1 taken 16 times.
528 for (k = 0; k < 32; k++) {
761 512 double a=0, b=0;
762 512 int jp = 0;
763
2/2
✓ Branch 0 taken 1748096 times.
✓ Branch 1 taken 512 times.
1748608 for (j = 0; j < s->context_count[i]; j++) {
764 1748096 double p = 128;
765
6/6
✓ Branch 0 taken 179054 times.
✓ Branch 1 taken 1569042 times.
✓ Branch 2 taken 154 times.
✓ Branch 3 taken 178900 times.
✓ Branch 4 taken 112423 times.
✓ Branch 5 taken 1456773 times.
1748096 if (s->rc_stat2[i][j][k][0] + s->rc_stat2[i][j][k][1] > 200 && j || a+b > 200) {
766
2/2
✓ Branch 0 taken 291303 times.
✓ Branch 1 taken 20 times.
291323 if (a+b)
767 291303 p = 256.0 * b / (a + b);
768 291323 s->initial_states[i][jp][k] =
769 291323 best_state[av_clip(round(p), 1, 255)][av_clip_uint8((a + b) / gob_count)];
770
2/2
✓ Branch 0 taken 883713 times.
✓ Branch 1 taken 291323 times.
1175036 for(jp++; jp<j; jp++)
771 883713 s->initial_states[i][jp][k] = s->initial_states[i][jp-1][k];
772 291323 a=b=0;
773 }
774 1748096 a += s->rc_stat2[i][j][k][0];
775 1748096 b += s->rc_stat2[i][j][k][1];
776
2/2
✓ Branch 0 taken 1284515 times.
✓ Branch 1 taken 463581 times.
1748096 if (a+b) {
777 1284515 p = 256.0 * b / (a + b);
778 }
779 1748096 s->initial_states[i][j][k] =
780 1748096 best_state[av_clip(round(p), 1, 255)][av_clip_uint8((a + b) / gob_count)];
781 }
782 }
783 }
784 8 av_freep(&best_state);
785 }
786
787
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 47 times.
51 if (s->version <= 1) {
788 /* Disable slices when the version doesn't support them */
789 4 s->num_h_slices = 1;
790 4 s->num_v_slices = 1;
791 }
792
793 51 set_micro_version(s);
794
795 51 return 0;
796 }
797
798 51 av_cold int ff_ffv1_encode_setup_plane_info(AVCodecContext *avctx,
799 enum AVPixelFormat pix_fmt)
800 {
801 51 FFV1Context *s = avctx->priv_data;
802 51 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
803
804 51 s->plane_count = 3;
805
5/17
✗ Branch 0 not taken.
✓ Branch 1 taken 13 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 4 times.
✓ Branch 5 taken 26 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✓ Branch 8 taken 4 times.
✓ Branch 9 taken 4 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
51 switch(pix_fmt) {
806 case AV_PIX_FMT_GRAY9:
807 case AV_PIX_FMT_YUV444P9:
808 case AV_PIX_FMT_YUV422P9:
809 case AV_PIX_FMT_YUV420P9:
810 case AV_PIX_FMT_YUVA444P9:
811 case AV_PIX_FMT_YUVA422P9:
812 case AV_PIX_FMT_YUVA420P9:
813 if (!avctx->bits_per_raw_sample)
814 s->bits_per_raw_sample = 9;
815 case AV_PIX_FMT_GRAY10:
816 case AV_PIX_FMT_YUV444P10:
817 case AV_PIX_FMT_YUV440P10:
818 case AV_PIX_FMT_YUV420P10:
819 case AV_PIX_FMT_YUV422P10:
820 case AV_PIX_FMT_YUVA444P10:
821 case AV_PIX_FMT_YUVA422P10:
822 case AV_PIX_FMT_YUVA420P10:
823
3/4
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 12 times.
✗ Branch 3 not taken.
13 if (!avctx->bits_per_raw_sample && !s->bits_per_raw_sample)
824 12 s->bits_per_raw_sample = 10;
825 case AV_PIX_FMT_GRAY12:
826 case AV_PIX_FMT_YUV444P12:
827 case AV_PIX_FMT_YUV440P12:
828 case AV_PIX_FMT_YUV420P12:
829 case AV_PIX_FMT_YUV422P12:
830 case AV_PIX_FMT_YUVA444P12:
831 case AV_PIX_FMT_YUVA422P12:
832
3/4
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 12 times.
13 if (!avctx->bits_per_raw_sample && !s->bits_per_raw_sample)
833 s->bits_per_raw_sample = 12;
834 case AV_PIX_FMT_GRAY14:
835 case AV_PIX_FMT_YUV444P14:
836 case AV_PIX_FMT_YUV420P14:
837 case AV_PIX_FMT_YUV422P14:
838
3/4
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 12 times.
13 if (!avctx->bits_per_raw_sample && !s->bits_per_raw_sample)
839 s->bits_per_raw_sample = 14;
840 13 s->packed_at_lsb = 1;
841 17 case AV_PIX_FMT_GRAY16:
842 case AV_PIX_FMT_YUV444P16:
843 case AV_PIX_FMT_YUV422P16:
844 case AV_PIX_FMT_YUV420P16:
845 case AV_PIX_FMT_YUVA444P16:
846 case AV_PIX_FMT_YUVA422P16:
847 case AV_PIX_FMT_YUVA420P16:
848 case AV_PIX_FMT_GRAYF16:
849 case AV_PIX_FMT_YAF16:
850
4/4
✓ Branch 0 taken 16 times.
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 4 times.
✓ Branch 3 taken 12 times.
17 if (!avctx->bits_per_raw_sample && !s->bits_per_raw_sample) {
851 4 s->bits_per_raw_sample = 16;
852
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 12 times.
13 } else if (!s->bits_per_raw_sample) {
853 1 s->bits_per_raw_sample = avctx->bits_per_raw_sample;
854 }
855
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 17 times.
17 if (s->bits_per_raw_sample <= 8) {
856 av_log(avctx, AV_LOG_ERROR, "bits_per_raw_sample invalid\n");
857 return AVERROR_INVALIDDATA;
858 }
859 17 s->version = FFMAX(s->version, 1);
860 43 case AV_PIX_FMT_GRAY8:
861 case AV_PIX_FMT_YA8:
862 case AV_PIX_FMT_YUV444P:
863 case AV_PIX_FMT_YUV440P:
864 case AV_PIX_FMT_YUV422P:
865 case AV_PIX_FMT_YUV420P:
866 case AV_PIX_FMT_YUV411P:
867 case AV_PIX_FMT_YUV410P:
868 case AV_PIX_FMT_YUVA444P:
869 case AV_PIX_FMT_YUVA422P:
870 case AV_PIX_FMT_YUVA420P:
871 43 s->chroma_planes = desc->nb_components < 3 ? 0 : 1;
872 43 s->colorspace = 0;
873 43 s->transparency = !!(desc->flags & AV_PIX_FMT_FLAG_ALPHA);
874
4/4
✓ Branch 0 taken 42 times.
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 26 times.
✓ Branch 3 taken 16 times.
43 if (!avctx->bits_per_raw_sample && !s->bits_per_raw_sample)
875 26 s->bits_per_raw_sample = 8;
876
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 17 times.
17 else if (!s->bits_per_raw_sample)
877 s->bits_per_raw_sample = 8;
878 43 break;
879 case AV_PIX_FMT_RGB32:
880 s->colorspace = 1;
881 s->transparency = 1;
882 s->chroma_planes = 1;
883 s->bits_per_raw_sample = 8;
884 break;
885 case AV_PIX_FMT_RGBA64:
886 s->colorspace = 1;
887 s->transparency = 1;
888 s->chroma_planes = 1;
889 s->bits_per_raw_sample = 16;
890 s->use32bit = 1;
891 s->version = FFMAX(s->version, 1);
892 break;
893 4 case AV_PIX_FMT_RGB48:
894 4 s->colorspace = 1;
895 4 s->chroma_planes = 1;
896 4 s->bits_per_raw_sample = 16;
897 4 s->use32bit = 1;
898 4 s->version = FFMAX(s->version, 1);
899 4 break;
900 4 case AV_PIX_FMT_0RGB32:
901 4 s->colorspace = 1;
902 4 s->chroma_planes = 1;
903 4 s->bits_per_raw_sample = 8;
904 4 break;
905 case AV_PIX_FMT_GBRP9:
906 if (!avctx->bits_per_raw_sample)
907 s->bits_per_raw_sample = 9;
908 case AV_PIX_FMT_GBRP10:
909 case AV_PIX_FMT_GBRAP10:
910 if (!avctx->bits_per_raw_sample && !s->bits_per_raw_sample)
911 s->bits_per_raw_sample = 10;
912 case AV_PIX_FMT_GBRP12:
913 case AV_PIX_FMT_GBRAP12:
914 if (!avctx->bits_per_raw_sample && !s->bits_per_raw_sample)
915 s->bits_per_raw_sample = 12;
916 case AV_PIX_FMT_GBRP14:
917 case AV_PIX_FMT_GBRAP14:
918 if (!avctx->bits_per_raw_sample && !s->bits_per_raw_sample)
919 s->bits_per_raw_sample = 14;
920 case AV_PIX_FMT_GBRP16:
921 case AV_PIX_FMT_GBRAP16:
922 case AV_PIX_FMT_GBRPF16:
923 case AV_PIX_FMT_GBRAPF16:
924 if (!avctx->bits_per_raw_sample && !s->bits_per_raw_sample)
925 s->bits_per_raw_sample = 16;
926 case AV_PIX_FMT_GBRPF32:
927 case AV_PIX_FMT_GBRAPF32:
928 if (!avctx->bits_per_raw_sample && !s->bits_per_raw_sample)
929 s->bits_per_raw_sample = 32;
930 else if (!s->bits_per_raw_sample)
931 s->bits_per_raw_sample = avctx->bits_per_raw_sample;
932 s->transparency = !!(desc->flags & AV_PIX_FMT_FLAG_ALPHA);
933 s->colorspace = 1;
934 s->chroma_planes = 1;
935 if (s->bits_per_raw_sample >= 16) {
936 s->use32bit = 1;
937 }
938 s->version = FFMAX(s->version, 1);
939 break;
940 default:
941 av_log(avctx, AV_LOG_ERROR, "format %s not supported\n",
942 av_get_pix_fmt_name(pix_fmt));
943 return AVERROR(ENOSYS);
944 }
945 51 s->flt = !!(desc->flags & AV_PIX_FMT_FLAG_FLOAT);
946
2/4
✓ Branch 0 taken 51 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 51 times.
51 if (s->flt || s->remap_mode > 0)
947 s->version = FFMAX(s->version, 4);
948
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 51 times.
51 av_assert0(s->bits_per_raw_sample >= 8);
949
950
1/2
✓ Branch 0 taken 51 times.
✗ Branch 1 not taken.
51 if (s->remap_mode < 0)
951
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 51 times.
51 s->remap_mode = s->flt ? 2 : 0;
952
2/4
✓ Branch 0 taken 51 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 51 times.
51 if (s->remap_mode == 0 && s->bits_per_raw_sample == 32) {
953 av_log(avctx, AV_LOG_ERROR, "32bit requires remap\n");
954 return AVERROR(EINVAL);
955 }
956
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 51 times.
51 if (s->remap_mode == 2 &&
957 !((s->bits_per_raw_sample == 16 || s->bits_per_raw_sample == 32 || s->bits_per_raw_sample == 64) && s->flt)) {
958 av_log(avctx, AV_LOG_ERROR, "remap 2 is for float16/32/64 only\n");
959 return AVERROR(EINVAL);
960 }
961
962 51 return av_pix_fmt_get_chroma_sub_sample(pix_fmt, &s->chroma_h_shift, &s->chroma_v_shift);
963 }
964
965 51 static av_cold int encode_init_internal(AVCodecContext *avctx)
966 {
967 int ret;
968 51 FFV1Context *s = avctx->priv_data;
969
970
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 51 times.
51 if ((ret = ff_ffv1_common_init(avctx, s)) < 0)
971 return ret;
972
973
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 51 times.
51 if (s->ac == 1) // Compatbility with common command line usage
974 s->ac = AC_RANGE_CUSTOM_TAB;
975
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 51 times.
51 else if (s->ac == AC_RANGE_DEFAULT_TAB_FORCE)
976 s->ac = AC_RANGE_DEFAULT_TAB;
977
978 51 ret = ff_ffv1_encode_setup_plane_info(avctx, avctx->pix_fmt);
979
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 51 times.
51 if (ret < 0)
980 return ret;
981
982
4/6
✗ Branch 0 not taken.
✓ Branch 1 taken 51 times.
✓ Branch 2 taken 21 times.
✓ Branch 3 taken 30 times.
✓ Branch 4 taken 21 times.
✗ Branch 5 not taken.
51 if (s->bits_per_raw_sample > (s->version > 3 ? 16 : 8) && !s->remap_mode) {
983
2/2
✓ Branch 0 taken 13 times.
✓ Branch 1 taken 8 times.
21 if (s->ac == AC_GOLOMB_RICE) {
984 13 av_log(avctx, AV_LOG_INFO,
985 "high bits_per_raw_sample, forcing range coder\n");
986 13 s->ac = AC_RANGE_CUSTOM_TAB;
987 }
988 }
989
990
991 51 ret = ff_ffv1_encode_init(avctx);
992
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 51 times.
51 if (ret < 0)
993 return ret;
994
995
2/2
✓ Branch 0 taken 47 times.
✓ Branch 1 taken 4 times.
51 if (s->version > 1) {
996
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 47 times.
47 if ((ret = ff_ffv1_encode_determine_slices(avctx)) < 0)
997 return ret;
998
999
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 47 times.
47 if ((ret = ff_ffv1_write_extradata(avctx)) < 0)
1000 return ret;
1001 }
1002
1003
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 51 times.
51 if ((ret = ff_ffv1_init_slice_contexts(s)) < 0)
1004 return ret;
1005 51 s->slice_count = s->max_slice_count;
1006
1007
2/2
✓ Branch 0 taken 197 times.
✓ Branch 1 taken 51 times.
248 for (int j = 0; j < s->slice_count; j++) {
1008 197 FFV1SliceContext *sc = &s->slices[j];
1009
1010
2/2
✓ Branch 0 taken 394 times.
✓ Branch 1 taken 197 times.
591 for (int i = 0; i < s->plane_count; i++) {
1011 394 PlaneContext *const p = &s->slices[j].plane[i];
1012
1013 394 p->quant_table_index = s->context_model;
1014 394 p->context_count = s->context_count[p->quant_table_index];
1015 }
1016
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 197 times.
197 av_assert0(s->remap_mode >= 0);
1017
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 197 times.
197 if (s->remap_mode) {
1018 for (int p = 0; p < 1 + 2*s->chroma_planes + s->transparency ; p++) {
1019 if (s->bits_per_raw_sample == 32) {
1020 sc->unit[p] = av_malloc_array(sc->slice_width, sc->slice_height * sizeof(**sc->unit));
1021 if (!sc->unit[p])
1022 return AVERROR(ENOMEM);
1023 sc->bitmap[p] = av_malloc_array(sc->slice_width * sc->slice_height, sizeof(*sc->bitmap[p]));
1024 if (!sc->bitmap[p])
1025 return AVERROR(ENOMEM);
1026 } else {
1027 sc->fltmap[p] = av_malloc_array(65536, sizeof(*sc->fltmap[p]));
1028 if (!sc->fltmap[p])
1029 return AVERROR(ENOMEM);
1030 }
1031 }
1032 }
1033
1034 197 ff_build_rac_states(&s->slices[j].c, 0.05 * (1LL << 32), 256 - 8);
1035
1036 197 s->slices[j].remap = s->remap_mode;
1037 }
1038
1039
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 51 times.
51 if ((ret = ff_ffv1_init_slices_state(s)) < 0)
1040 return ret;
1041
1042 #define STATS_OUT_SIZE 1024 * 1024 * 6
1043
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 43 times.
51 if (avctx->flags & AV_CODEC_FLAG_PASS1) {
1044 8 avctx->stats_out = av_mallocz(STATS_OUT_SIZE);
1045
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
8 if (!avctx->stats_out)
1046 return AVERROR(ENOMEM);
1047
2/2
✓ Branch 0 taken 16 times.
✓ Branch 1 taken 8 times.
24 for (int i = 0; i < s->quant_table_count; i++)
1048
2/2
✓ Branch 0 taken 64 times.
✓ Branch 1 taken 16 times.
80 for (int j = 0; j < s->max_slice_count; j++) {
1049 64 FFV1SliceContext *sc = &s->slices[j];
1050
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 64 times.
64 av_assert0(!sc->rc_stat2[i]);
1051 64 sc->rc_stat2[i] = av_mallocz(s->context_count[i] *
1052 sizeof(*sc->rc_stat2[i]));
1053
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 64 times.
64 if (!sc->rc_stat2[i])
1054 return AVERROR(ENOMEM);
1055 }
1056 }
1057
1058 51 return 0;
1059 }
1060
1061 8345 static void encode_slice_header(FFV1Context *f, FFV1SliceContext *sc)
1062 {
1063 8345 RangeCoder *c = &sc->c;
1064 uint8_t state[CONTEXT_SIZE];
1065 int j;
1066 8345 memset(state, 128, sizeof(state));
1067
1068 8345 put_symbol(c, state, sc->sx, 0);
1069 8345 put_symbol(c, state, sc->sy, 0);
1070 8345 put_symbol(c, state, 0, 0);
1071 8345 put_symbol(c, state, 0, 0);
1072
2/2
✓ Branch 0 taken 16690 times.
✓ Branch 1 taken 8345 times.
25035 for (j=0; j<f->plane_count; j++) {
1073 16690 put_symbol(c, state, sc->plane[j].quant_table_index, 0);
1074
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 16690 times.
16690 av_assert0(sc->plane[j].quant_table_index == f->context_model);
1075 }
1076
1/2
✓ Branch 0 taken 8345 times.
✗ Branch 1 not taken.
8345 if (!(f->cur_enc_frame->flags & AV_FRAME_FLAG_INTERLACED))
1077 8345 put_symbol(c, state, 3, 0);
1078 else
1079 put_symbol(c, state, 1 + !(f->cur_enc_frame->flags & AV_FRAME_FLAG_TOP_FIELD_FIRST), 0);
1080 8345 put_symbol(c, state, f->cur_enc_frame->sample_aspect_ratio.num, 0);
1081 8345 put_symbol(c, state, f->cur_enc_frame->sample_aspect_ratio.den, 0);
1082
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8345 times.
8345 if (f->version > 3) {
1083 put_rac(c, state, sc->slice_coding_mode == 1);
1084 if (sc->slice_coding_mode == 1)
1085 ff_ffv1_clear_slice_state(f, sc);
1086 put_symbol(c, state, sc->slice_coding_mode, 0);
1087 if (sc->slice_coding_mode != 1 && f->colorspace == 1) {
1088 put_symbol(c, state, sc->slice_rct_by_coef, 0);
1089 put_symbol(c, state, sc->slice_rct_ry_coef, 0);
1090 }
1091 put_symbol(c, state, sc->remap, 0);
1092 }
1093 8345 }
1094
1095 static void choose_rct_params(const FFV1Context *f, FFV1SliceContext *sc,
1096 const uint8_t *src[3], const int stride[3], int w, int h)
1097 {
1098 #define NB_Y_COEFF 15
1099 static const int rct_y_coeff[15][2] = {
1100 {0, 0}, // 4G
1101 {1, 1}, // R + 2G + B
1102 {2, 2}, // 2R + 2B
1103 {0, 2}, // 2G + 2B
1104 {2, 0}, // 2R + 2G
1105 {4, 0}, // 4R
1106 {0, 4}, // 4B
1107
1108 {0, 3}, // 1G + 3B
1109 {3, 0}, // 3R + 1G
1110 {3, 1}, // 3R + B
1111 {1, 3}, // R + 3B
1112 {1, 2}, // R + G + 2B
1113 {2, 1}, // 2R + G + B
1114 {0, 1}, // 3G + B
1115 {1, 0}, // R + 3G
1116 };
1117
1118 int stat[NB_Y_COEFF] = {0};
1119 int x, y, i, p, best;
1120 int16_t *sample[3];
1121 int lbd = f->bits_per_raw_sample <= 8;
1122 int packed = !src[1];
1123 int transparency = f->transparency;
1124 int packed_size = (3 + transparency)*2;
1125
1126 for (y = 0; y < h; y++) {
1127 int lastr=0, lastg=0, lastb=0;
1128 for (p = 0; p < 3; p++)
1129 sample[p] = sc->sample_buffer + p*w;
1130
1131 for (x = 0; x < w; x++) {
1132 int b, g, r;
1133 int ab, ag, ar;
1134 if (lbd) {
1135 unsigned v = *((const uint32_t*)(src[0] + x*4 + stride[0]*y));
1136 b = v & 0xFF;
1137 g = (v >> 8) & 0xFF;
1138 r = (v >> 16) & 0xFF;
1139 } else if (packed) {
1140 const uint16_t *p = ((const uint16_t*)(src[0] + x*packed_size + stride[0]*y));
1141 r = p[0];
1142 g = p[1];
1143 b = p[2];
1144 } else if (f->use32bit || transparency) {
1145 g = *((const uint16_t *)(src[0] + x*2 + stride[0]*y));
1146 b = *((const uint16_t *)(src[1] + x*2 + stride[1]*y));
1147 r = *((const uint16_t *)(src[2] + x*2 + stride[2]*y));
1148 } else {
1149 b = *((const uint16_t*)(src[0] + x*2 + stride[0]*y));
1150 g = *((const uint16_t*)(src[1] + x*2 + stride[1]*y));
1151 r = *((const uint16_t*)(src[2] + x*2 + stride[2]*y));
1152 }
1153
1154 ar = r - lastr;
1155 ag = g - lastg;
1156 ab = b - lastb;
1157 if (x && y) {
1158 int bg = ag - sample[0][x];
1159 int bb = ab - sample[1][x];
1160 int br = ar - sample[2][x];
1161
1162 br -= bg;
1163 bb -= bg;
1164
1165 for (i = 0; i<NB_Y_COEFF; i++) {
1166 stat[i] += FFABS(bg + ((br*rct_y_coeff[i][0] + bb*rct_y_coeff[i][1])>>2));
1167 }
1168
1169 }
1170 sample[0][x] = ag;
1171 sample[1][x] = ab;
1172 sample[2][x] = ar;
1173
1174 lastr = r;
1175 lastg = g;
1176 lastb = b;
1177 }
1178 }
1179
1180 best = 0;
1181 for (i=1; i<NB_Y_COEFF; i++) {
1182 if (stat[i] < stat[best])
1183 best = i;
1184 }
1185
1186 sc->slice_rct_by_coef = rct_y_coeff[best][1];
1187 sc->slice_rct_ry_coef = rct_y_coeff[best][0];
1188 }
1189
1190 static void encode_histogram_remap(FFV1Context *f, FFV1SliceContext *sc)
1191 {
1192 int len = 1 << f->bits_per_raw_sample;
1193 int flip = sc->remap == 2 ? 0x7FFF : 0;
1194
1195 for (int p= 0; p < 1 + 2*f->chroma_planes + f->transparency; p++) {
1196 int j = 0;
1197 int lu = 0;
1198 uint8_t state[2][32];
1199 int run = 0;
1200
1201 memset(state, 128, sizeof(state));
1202 put_symbol(&sc->c, state[0], 0, 0);
1203 memset(state, 128, sizeof(state));
1204 for (int i= 0; i<len; i++) {
1205 int ri = i ^ ((i&0x8000) ? 0 : flip);
1206 int u = sc->fltmap[p][ri];
1207 sc->fltmap[p][ri] = j;
1208 j+= u;
1209
1210 if (lu == u) {
1211 run ++;
1212 } else {
1213 put_symbol_inline(&sc->c, state[lu], run, 0, NULL, NULL);
1214 if (run == 0)
1215 lu = u;
1216 run = 0;
1217 }
1218 }
1219 if (run)
1220 put_symbol(&sc->c, state[lu], run, 0);
1221 sc->remap_count[p] = j;
1222 }
1223 }
1224
1225 static void load_rgb_float32_frame(FFV1Context *f, FFV1SliceContext *sc,
1226 const uint8_t *src[4],
1227 int w, int h, const int stride[4])
1228 {
1229 int x, y;
1230 int transparency = f->transparency;
1231 int i = 0;
1232
1233 for (y = 0; y < h; y++) {
1234 for (x = 0; x < w; x++) {
1235 int b, g, r, av_uninit(a);
1236
1237 g = *((const uint32_t *)(src[0] + x*4 + stride[0]*y));
1238 b = *((const uint32_t *)(src[1] + x*4 + stride[1]*y));
1239 r = *((const uint32_t *)(src[2] + x*4 + stride[2]*y));
1240 if (transparency)
1241 a = *((const uint32_t *)(src[3] + x*4 + stride[3]*y));
1242
1243 if (sc->remap == 2) {
1244 #define FLIP(f) (((f)&0x80000000) ? (f) : (f)^0x7FFFFFFF);
1245 g = FLIP(g);
1246 b = FLIP(b);
1247 r = FLIP(r);
1248 }
1249 // We cannot build a histogram as we do for 16bit, we need a bit of magic here
1250 // Its possible to reduce the memory needed at the cost of more dereferencing
1251 sc->unit[0][i].val = g;
1252 sc->unit[0][i].ndx = x + y*w;
1253
1254 sc->unit[1][i].val = b;
1255 sc->unit[1][i].ndx = x + y*w;
1256
1257 sc->unit[2][i].val = r;
1258 sc->unit[2][i].ndx = x + y*w;
1259
1260 if (transparency) {
1261 sc->unit[3][i].val = a;
1262 sc->unit[3][i].ndx = x + y*w;
1263 }
1264 i++;
1265 }
1266 }
1267
1268 //TODO switch to radix sort
1269 #define CMP(A,B) ((A)->val - (int64_t)(B)->val)
1270 AV_QSORT(sc->unit[0], i, struct Unit, CMP);
1271 AV_QSORT(sc->unit[1], i, struct Unit, CMP);
1272 AV_QSORT(sc->unit[2], i, struct Unit, CMP);
1273 if (transparency)
1274 AV_QSORT(sc->unit[3], i, struct Unit, CMP);
1275 }
1276
1277 static int encode_float32_remap_segment(FFV1SliceContext *sc,
1278 int p, int mul_count, int *mul_tab, int update, int final)
1279 {
1280 const int pixel_num = sc->slice_width * sc->slice_height;
1281 uint8_t state[2][3][32];
1282 int mul[4096+1];
1283 RangeCoder rc = sc->c;
1284 int lu = 0;
1285 int run = 0;
1286 int64_t last_val = -1;
1287 int compact_index = -1;
1288 int i = 0;
1289 int current_mul_index = -1;
1290 int run1final = 0;
1291 int run1start_i;
1292 int run1start_last_val;
1293 int run1start_mul_index;
1294
1295 memcpy(mul, mul_tab, sizeof(*mul_tab)*(mul_count+1));
1296 memset(state, 128, sizeof(state));
1297 put_symbol(&rc, state[0][0], mul_count, 0);
1298 memset(state, 128, sizeof(state));
1299
1300 for (; i < pixel_num+1; i++) {
1301 int current_mul = current_mul_index < 0 ? 1 : FFABS(mul[current_mul_index]);
1302 int64_t val;
1303 if (i == pixel_num) {
1304 if (last_val == 0xFFFFFFFF) {
1305 break;
1306 } else {
1307 val = last_val + ((1LL<<32) - last_val + current_mul - 1) / current_mul * current_mul;
1308 av_assert2(val >= (1LL<<32));
1309 val += lu * current_mul; //ensure a run1 ends
1310 }
1311 } else
1312 val = sc->unit[p][i].val;
1313
1314 if (last_val != val) {
1315 int64_t delta = val - last_val;
1316 int64_t step = FFMAX(1, (delta + current_mul/2) / current_mul);
1317 av_assert2(last_val < val);
1318 av_assert2(current_mul > 0);
1319
1320 delta -= step*current_mul;
1321 av_assert2(delta <= current_mul/2);
1322 av_assert2(delta > -current_mul);
1323
1324 av_assert2(step > 0);
1325 if (lu) {
1326 if (!run) {
1327 run1start_i = i - 1;
1328 run1start_last_val = last_val;
1329 run1start_mul_index= current_mul_index;
1330 }
1331 if (step == 1) {
1332 if (run1final) {
1333 if (current_mul>1)
1334 put_symbol_inline(&rc, state[lu][1], delta, 1, NULL, NULL);
1335 }
1336 run ++;
1337 av_assert2(last_val + current_mul + delta == val);
1338 } else {
1339 if (run1final) {
1340 if (run == 0)
1341 lu ^= 1;
1342 i--; // we did not encode val so we need to backstep
1343 last_val += current_mul;
1344 } else {
1345 put_symbol_inline(&rc, state[lu][0], run, 0, NULL, NULL);
1346 i = run1start_i;
1347 last_val = run1start_last_val; // we could compute this instead of storing
1348 current_mul_index = run1start_mul_index;
1349 }
1350 run1final ^= 1;
1351
1352 run = 0;
1353 continue;
1354 }
1355 } else {
1356 av_assert2(run == 0);
1357 av_assert2(run1final == 0);
1358 put_symbol_inline(&rc, state[lu][0], step - 1, 0, NULL, NULL);
1359
1360 if (current_mul > 1)
1361 put_symbol_inline(&rc, state[lu][1], delta, 1, NULL, NULL);
1362 if (step == 1)
1363 lu ^= 1;
1364
1365 av_assert2(last_val + step * current_mul + delta == val);
1366 }
1367 last_val = val;
1368 current_mul_index = ((last_val + 1) * mul_count) >> 32;
1369 if (!run || run1final) {
1370 av_assert2(mul[ current_mul_index ]);
1371 if (mul[ current_mul_index ] < 0) {
1372 av_assert2(i < pixel_num);
1373 mul[ current_mul_index ] *= -1;
1374 put_symbol_inline(&rc, state[0][2], mul[ current_mul_index ], 0, NULL, NULL);
1375 }
1376 if (i < pixel_num)
1377 compact_index ++;
1378 }
1379 }
1380 if (!run || run1final)
1381 if (final && i < pixel_num)
1382 sc->bitmap[p][sc->unit[p][i].ndx] = compact_index;
1383 }
1384
1385 if (update) {
1386 sc->c = rc;
1387 sc->remap_count[p] = compact_index + 1;
1388 }
1389 return get_rac_count(&rc);
1390 }
1391
1392 static void encode_float32_remap(FFV1Context *f, FFV1SliceContext *sc,
1393 const uint8_t *src[4])
1394 {
1395 int pixel_num = sc->slice_width * sc->slice_height;
1396 const int max_log2_mul_count = ((int[]){ 1, 1, 1, 9, 9, 10})[f->remap_optimizer];
1397 const int log2_mul_count_step = ((int[]){ 1, 1, 1, 9, 9, 1})[f->remap_optimizer];
1398 const int max_log2_mul = ((int[]){ 1, 8, 8, 9, 22, 22})[f->remap_optimizer];
1399 const int log2_mul_step = ((int[]){ 1, 8, 1, 1, 1, 1})[f->remap_optimizer];
1400 const int bruteforce_count = ((int[]){ 0, 0, 0, 1, 1, 1})[f->remap_optimizer];
1401 const int stair_mode = ((int[]){ 0, 0, 0, 1, 0, 0})[f->remap_optimizer];
1402 const int magic_log2 = ((int[]){ 1, 1, 1, 1, 0, 0})[f->remap_optimizer];
1403
1404 for (int p= 0; p < 1 + 2*f->chroma_planes + f->transparency; p++) {
1405 int best_log2_mul_count = 0;
1406 float score_sum[11] = {0};
1407 int mul_all[11][1025];
1408
1409 for (int log2_mul_count= 0; log2_mul_count <= max_log2_mul_count; log2_mul_count += log2_mul_count_step) {
1410 float score_tab_all[1025][23] = {0};
1411 int64_t last_val = -1;
1412 int *mul_tab = mul_all[log2_mul_count];
1413 int last_mul_index = -1;
1414 int mul_count = 1 << log2_mul_count;
1415
1416 score_sum[log2_mul_count] = 2 * log2_mul_count;
1417 if (magic_log2)
1418 score_sum[log2_mul_count] = av_float2int((float)mul_count * mul_count);
1419 for (int i= 0; i<pixel_num; i++) {
1420 int64_t val = sc->unit[p][i].val;
1421 int mul_index = (val + 1LL)*mul_count >> 32;
1422 if (val != last_val) {
1423 float *score_tab = score_tab_all[(last_val + 1LL)*mul_count >> 32];
1424 av_assert2(last_val < val);
1425 for(int si= 0; si <= max_log2_mul; si += log2_mul_step) {
1426 int64_t delta = val - last_val;
1427 int mul;
1428 int64_t cost;
1429
1430 if (last_val < 0) {
1431 mul = 1;
1432 } else if (stair_mode && mul_count == 512 && si == max_log2_mul ) {
1433 if (mul_index >= 0x378/8 && mul_index <= 23 + 0x378/8) {
1434 mul = (0x800080 >> (mul_index - 0x378/8));
1435 } else
1436 mul = 1;
1437 } else {
1438 mul = (0x10001LL)<<si >> 16;
1439 }
1440
1441 cost = FFMAX((delta + mul/2) / mul, 1);
1442 float score = 1;
1443 if (mul > 1) {
1444 score *= (fabs(delta - cost*mul)+1);
1445 if (mul_count > 1)
1446 score *= score;
1447 }
1448 score *= cost;
1449 score *= score;
1450 if (mul_index != last_mul_index)
1451 score *= mul;
1452 if (magic_log2) {
1453 score_tab[si] += av_float2int(score);
1454 } else
1455 score_tab[si] += log2f(score);
1456 }
1457 }
1458 last_val = val;
1459 last_mul_index = mul_index;
1460 }
1461 for(int i= 0; i<mul_count; i++) {
1462 int best_index = 0;
1463 float *score_tab = score_tab_all[i];
1464 for(int si= 0; si <= max_log2_mul; si += log2_mul_step) {
1465 if (score_tab[si] < score_tab[ best_index ])
1466 best_index = si;
1467 }
1468 if (stair_mode && mul_count == 512 && best_index == max_log2_mul ) {
1469 if (i >= 0x378/8 && i <= 23 + 0x378/8) {
1470 mul_tab[i] = -(0x800080 >> (i - 0x378/8));
1471 } else
1472 mul_tab[i] = -1;
1473 } else
1474 mul_tab[i] = -((0x10001LL)<<best_index >> 16);
1475 score_sum[log2_mul_count] += score_tab[ best_index ];
1476 }
1477 mul_tab[mul_count] = 1;
1478
1479 if (bruteforce_count)
1480 score_sum[log2_mul_count] = encode_float32_remap_segment(sc, p, mul_count, mul_all[log2_mul_count], 0, 0);
1481
1482 if (score_sum[log2_mul_count] < score_sum[best_log2_mul_count])
1483 best_log2_mul_count = log2_mul_count;
1484 }
1485
1486 encode_float32_remap_segment(sc, p, 1<<best_log2_mul_count, mul_all[best_log2_mul_count], 1, 1);
1487 }
1488 }
1489
1490 static int encode_float32_rgb_frame(FFV1Context *f, FFV1SliceContext *sc,
1491 const uint8_t *src[4],
1492 int w, int h, const int stride[4], int ac)
1493 {
1494 int x, y, p, i;
1495 const int ring_size = f->context_model ? 3 : 2;
1496 int32_t *sample[4][3];
1497 const int pass1 = !!(f->avctx->flags & AV_CODEC_FLAG_PASS1);
1498 int bits[4], offset;
1499 int transparency = f->transparency;
1500
1501 ff_ffv1_compute_bits_per_plane(f, sc, bits, &offset, NULL, f->bits_per_raw_sample);
1502
1503 sc->run_index = 0;
1504
1505 memset(RENAME(sc->sample_buffer), 0, ring_size * MAX_PLANES *
1506 (w + 6) * sizeof(*RENAME(sc->sample_buffer)));
1507
1508 for (y = 0; y < h; y++) {
1509 for (i = 0; i < ring_size; i++)
1510 for (p = 0; p < MAX_PLANES; p++)
1511 sample[p][i]= RENAME(sc->sample_buffer) + p*ring_size*(w+6) + ((h+i-y)%ring_size)*(w+6) + 3;
1512
1513 for (x = 0; x < w; x++) {
1514 int b, g, r, av_uninit(a);
1515 g = sc->bitmap[0][x + w*y];
1516 b = sc->bitmap[1][x + w*y];
1517 r = sc->bitmap[2][x + w*y];
1518 if (transparency)
1519 a = sc->bitmap[3][x + w*y];
1520
1521 if (sc->slice_coding_mode != 1) {
1522 b -= g;
1523 r -= g;
1524 g += (b * sc->slice_rct_by_coef + r * sc->slice_rct_ry_coef) >> 2;
1525 b += offset;
1526 r += offset;
1527 }
1528
1529 sample[0][0][x] = g;
1530 sample[1][0][x] = b;
1531 sample[2][0][x] = r;
1532 sample[3][0][x] = a;
1533 }
1534 for (p = 0; p < 3 + transparency; p++) {
1535 int ret;
1536 sample[p][0][-1] = sample[p][1][0 ];
1537 sample[p][1][ w] = sample[p][1][w-1];
1538 ret = encode_line32(f, sc, f->avctx, w, sample[p], (p + 1) / 2,
1539 bits[p], ac, pass1);
1540 if (ret < 0)
1541 return ret;
1542 }
1543 }
1544 return 0;
1545 }
1546
1547
1548 9345 static int encode_slice(AVCodecContext *c, void *arg)
1549 {
1550 9345 FFV1SliceContext *sc = arg;
1551 9345 FFV1Context *f = c->priv_data;
1552 9345 int width = sc->slice_width;
1553 9345 int height = sc->slice_height;
1554 9345 int x = sc->slice_x;
1555 9345 int y = sc->slice_y;
1556 9345 const AVFrame *const p = f->cur_enc_frame;
1557 9345 const int ps = av_pix_fmt_desc_get(c->pix_fmt)->comp[0].step;
1558 int ret;
1559 9345 RangeCoder c_bak = sc->c;
1560 9345 const int chroma_width = AV_CEIL_RSHIFT(width, f->chroma_h_shift);
1561 9345 const int chroma_height = AV_CEIL_RSHIFT(height, f->chroma_v_shift);
1562 37380 const uint8_t *planes[4] = {p->data[0] + ps*x + y*p->linesize[0],
1563
2/2
✓ Branch 0 taken 7745 times.
✓ Branch 1 taken 1600 times.
9345 p->data[1] ? p->data[1] + ps*x + y*p->linesize[1] : NULL,
1564
2/2
✓ Branch 0 taken 7745 times.
✓ Branch 1 taken 1600 times.
9345 p->data[2] ? p->data[2] + ps*x + y*p->linesize[2] : NULL,
1565
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 9345 times.
9345 p->data[3] ? p->data[3] + ps*x + y*p->linesize[3] : NULL};
1566 9345 int ac = f->ac;
1567
1568 9345 sc->slice_coding_mode = 0;
1569
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 9345 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
9345 if (f->version > 3 && f->colorspace == 1) {
1570 choose_rct_params(f, sc, planes, p->linesize, width, height);
1571 } else {
1572 9345 sc->slice_rct_by_coef = 1;
1573 9345 sc->slice_rct_ry_coef = 1;
1574 }
1575
1576 9345 retry:
1577
2/2
✓ Branch 0 taken 941 times.
✓ Branch 1 taken 8404 times.
9345 if (f->key_frame)
1578 941 ff_ffv1_clear_slice_state(f, sc);
1579
2/2
✓ Branch 0 taken 8345 times.
✓ Branch 1 taken 1000 times.
9345 if (f->version > 2) {
1580 8345 encode_slice_header(f, sc);
1581 }
1582
1583
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 9345 times.
9345 if (sc->remap) {
1584 //Both the 16bit and 32bit remap do exactly the same thing but with 16bits we can
1585 //Implement this using a "histogram" while for 32bit that would be gb sized, thus a more
1586 //complex implementation sorting pairs is used.
1587 if (f->bits_per_raw_sample != 32) {
1588 if (f->colorspace == 0 && c->pix_fmt != AV_PIX_FMT_YA8 && c->pix_fmt != AV_PIX_FMT_YAF16) {
1589 const int cx = x >> f->chroma_h_shift;
1590 const int cy = y >> f->chroma_v_shift;
1591
1592 //TODO decide on the order for the encoded remaps and loads. with golomb rice it
1593 // easier to have all range coded ones together, otherwise it may be nicer to handle each plane as a whole?
1594
1595 load_plane(f, sc, p->data[0] + ps*x + y*p->linesize[0], width, height, p->linesize[0], 0, 1);
1596
1597 if (f->chroma_planes) {
1598 load_plane(f, sc, p->data[1] + ps*cx+cy*p->linesize[1], chroma_width, chroma_height, p->linesize[1], 1, 1);
1599 load_plane(f, sc, p->data[2] + ps*cx+cy*p->linesize[2], chroma_width, chroma_height, p->linesize[2], 2, 1);
1600 }
1601 if (f->transparency)
1602 load_plane(f, sc, p->data[3] + ps*x + y*p->linesize[3], width, height, p->linesize[3], 3, 1);
1603 } else if (c->pix_fmt == AV_PIX_FMT_YA8 || c->pix_fmt == AV_PIX_FMT_YAF16) {
1604 load_plane(f, sc, p->data[0] + ps*x + y*p->linesize[0], width, height, p->linesize[0], 0, 2);
1605 load_plane(f, sc, p->data[0] + (ps>>1) + ps*x + y*p->linesize[0], width, height, p->linesize[0], 1, 2);
1606 } else if (f->use32bit) {
1607 load_rgb_frame32(f, sc, planes, width, height, p->linesize);
1608 } else
1609 load_rgb_frame (f, sc, planes, width, height, p->linesize);
1610
1611 encode_histogram_remap(f, sc);
1612 } else {
1613 load_rgb_float32_frame(f, sc, planes, width, height, p->linesize);
1614 encode_float32_remap(f, sc, planes);
1615 }
1616 }
1617
1618
2/2
✓ Branch 0 taken 3700 times.
✓ Branch 1 taken 5645 times.
9345 if (ac == AC_GOLOMB_RICE) {
1619
6/6
✓ Branch 0 taken 1000 times.
✓ Branch 1 taken 2700 times.
✓ Branch 2 taken 600 times.
✓ Branch 3 taken 400 times.
✓ Branch 4 taken 400 times.
✓ Branch 5 taken 200 times.
3700 sc->ac_byte_count = f->version > 2 || (!x && !y) ? ff_rac_terminate(&sc->c, f->version > 2) : 0;
1620 3700 init_put_bits(&sc->pb,
1621 3700 sc->c.bytestream_start + sc->ac_byte_count,
1622 3700 sc->c.bytestream_end - sc->c.bytestream_start - sc->ac_byte_count);
1623 }
1624
1625
4/6
✓ Branch 0 taken 7745 times.
✓ Branch 1 taken 1600 times.
✓ Branch 2 taken 7745 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 7745 times.
✗ Branch 5 not taken.
17090 if (f->colorspace == 0 && c->pix_fmt != AV_PIX_FMT_YA8 && c->pix_fmt != AV_PIX_FMT_YAF16) {
1626 7745 const int cx = x >> f->chroma_h_shift;
1627 7745 const int cy = y >> f->chroma_v_shift;
1628
1629 7745 ret = encode_plane(f, sc, p->data[0] + ps*x + y*p->linesize[0], width, height, p->linesize[0], 0, 0, 1, ac);
1630
1631
1/2
✓ Branch 0 taken 7745 times.
✗ Branch 1 not taken.
7745 if (f->chroma_planes) {
1632 7745 ret |= encode_plane(f, sc, p->data[1] + ps*cx+cy*p->linesize[1], chroma_width, chroma_height, p->linesize[1], 1, 1, 1, ac);
1633 7745 ret |= encode_plane(f, sc, p->data[2] + ps*cx+cy*p->linesize[2], chroma_width, chroma_height, p->linesize[2], 1, 2, 1, ac);
1634 }
1635
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 7745 times.
7745 if (f->transparency)
1636 ret |= encode_plane(f, sc, p->data[3] + ps*x + y*p->linesize[3], width, height, p->linesize[3], 2, 3, 1, ac);
1637
2/4
✓ Branch 0 taken 1600 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 1600 times.
1600 } else if (c->pix_fmt == AV_PIX_FMT_YA8 || c->pix_fmt == AV_PIX_FMT_YAF16) {
1638 ret = encode_plane(f, sc, p->data[0] + ps*x + y*p->linesize[0], width, height, p->linesize[0], 0, 0, 2, ac);
1639 ret |= encode_plane(f, sc, p->data[0] + (ps>>1) + ps*x + y*p->linesize[0], width, height, p->linesize[0], 1, 1, 2, ac);
1640
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1600 times.
1600 } else if (f->bits_per_raw_sample == 32) {
1641 ret = encode_float32_rgb_frame(f, sc, planes, width, height, p->linesize, ac);
1642
2/2
✓ Branch 0 taken 800 times.
✓ Branch 1 taken 800 times.
1600 } else if (f->use32bit) {
1643 800 ret = encode_rgb_frame32(f, sc, planes, width, height, p->linesize, ac);
1644 } else {
1645 800 ret = encode_rgb_frame(f, sc, planes, width, height, p->linesize, ac);
1646 }
1647
1648
2/2
✓ Branch 0 taken 5645 times.
✓ Branch 1 taken 3700 times.
9345 if (ac != AC_GOLOMB_RICE) {
1649 5645 sc->ac_byte_count = ff_rac_terminate(&sc->c, 1);
1650 } else {
1651 3700 flush_put_bits(&sc->pb); // FIXME: nicer padding
1652 3700 sc->ac_byte_count += put_bytes_output(&sc->pb);
1653 }
1654
1655
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 9345 times.
9345 if (ret < 0) {
1656 av_assert0(sc->slice_coding_mode == 0);
1657 if (f->version < 4) {
1658 av_log(c, AV_LOG_ERROR, "Buffer too small\n");
1659 return ret;
1660 }
1661 av_log(c, AV_LOG_DEBUG, "Coding slice as PCM\n");
1662 ac = 1;
1663 sc->slice_coding_mode = 1;
1664 sc->c = c_bak;
1665 goto retry;
1666 }
1667
1668 9345 return 0;
1669 }
1670
1671 2480 size_t ff_ffv1_encode_buffer_size(AVCodecContext *avctx)
1672 {
1673 2480 FFV1Context *f = avctx->priv_data;
1674
1675 2480 size_t maxsize = avctx->width*avctx->height * (1 + f->transparency);
1676
1/2
✓ Branch 0 taken 2480 times.
✗ Branch 1 not taken.
2480 if (f->chroma_planes)
1677 2480 maxsize += AV_CEIL_RSHIFT(avctx->width, f->chroma_h_shift) * AV_CEIL_RSHIFT(f->height, f->chroma_v_shift) * 2;
1678 2480 maxsize += f->slice_count * 800; //for slice header
1679
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2480 times.
2480 if (f->version > 3) {
1680 maxsize *= f->bits_per_raw_sample + 1;
1681 if (f->remap_mode)
1682 maxsize += f->slice_count * 70000 * (1 + 2*f->chroma_planes + f->transparency);
1683 } else {
1684 2480 maxsize += f->slice_count * 2 * (avctx->width + avctx->height); //for bug with slices that code some pixels more than once
1685 2480 maxsize *= 8*(2*f->bits_per_raw_sample + 5);
1686 }
1687 2480 maxsize >>= 3;
1688 2480 maxsize += FF_INPUT_BUFFER_MIN_SIZE;
1689
1690 2480 return maxsize;
1691 }
1692
1693 2531 static int encode_frame(AVCodecContext *avctx, AVPacket *pkt,
1694 const AVFrame *pict, int *got_packet)
1695 {
1696 2531 FFV1Context *f = avctx->priv_data;
1697 2531 RangeCoder *const c = &f->slices[0].c;
1698 2531 uint8_t keystate = 128;
1699 uint8_t *buf_p;
1700 int i, ret;
1701 int64_t maxsize;
1702
1703
2/2
✓ Branch 0 taken 51 times.
✓ Branch 1 taken 2480 times.
2531 if(!pict) {
1704
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 43 times.
51 if (avctx->flags & AV_CODEC_FLAG_PASS1) {
1705 int j, k, m;
1706 8 char *p = avctx->stats_out;
1707 8 char *end = p + STATS_OUT_SIZE;
1708
1709 8 memset(f->rc_stat, 0, sizeof(f->rc_stat));
1710
2/2
✓ Branch 0 taken 16 times.
✓ Branch 1 taken 8 times.
24 for (i = 0; i < f->quant_table_count; i++)
1711 16 memset(f->rc_stat2[i], 0, f->context_count[i] * sizeof(*f->rc_stat2[i]));
1712
1713
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
8 av_assert0(f->slice_count == f->max_slice_count);
1714
2/2
✓ Branch 0 taken 32 times.
✓ Branch 1 taken 8 times.
40 for (j = 0; j < f->slice_count; j++) {
1715 32 const FFV1SliceContext *sc = &f->slices[j];
1716
2/2
✓ Branch 0 taken 8192 times.
✓ Branch 1 taken 32 times.
8224 for (i = 0; i < 256; i++) {
1717 8192 f->rc_stat[i][0] += sc->rc_stat[i][0];
1718 8192 f->rc_stat[i][1] += sc->rc_stat[i][1];
1719 }
1720
2/2
✓ Branch 0 taken 64 times.
✓ Branch 1 taken 32 times.
96 for (i = 0; i < f->quant_table_count; i++) {
1721
2/2
✓ Branch 0 taken 218512 times.
✓ Branch 1 taken 64 times.
218576 for (k = 0; k < f->context_count[i]; k++)
1722
2/2
✓ Branch 0 taken 6992384 times.
✓ Branch 1 taken 218512 times.
7210896 for (m = 0; m < 32; m++) {
1723 6992384 f->rc_stat2[i][k][m][0] += sc->rc_stat2[i][k][m][0];
1724 6992384 f->rc_stat2[i][k][m][1] += sc->rc_stat2[i][k][m][1];
1725 }
1726 }
1727 }
1728
1729
2/2
✓ Branch 0 taken 2048 times.
✓ Branch 1 taken 8 times.
2056 for (j = 0; j < 256; j++) {
1730 2048 snprintf(p, end - p, "%" PRIu64 " %" PRIu64 " ",
1731 f->rc_stat[j][0], f->rc_stat[j][1]);
1732 2048 p += strlen(p);
1733 }
1734 8 snprintf(p, end - p, "\n");
1735
1736
2/2
✓ Branch 0 taken 16 times.
✓ Branch 1 taken 8 times.
24 for (i = 0; i < f->quant_table_count; i++) {
1737
2/2
✓ Branch 0 taken 54628 times.
✓ Branch 1 taken 16 times.
54644 for (j = 0; j < f->context_count[i]; j++)
1738
2/2
✓ Branch 0 taken 1748096 times.
✓ Branch 1 taken 54628 times.
1802724 for (m = 0; m < 32; m++) {
1739 1748096 snprintf(p, end - p, "%" PRIu64 " %" PRIu64 " ",
1740 1748096 f->rc_stat2[i][j][m][0], f->rc_stat2[i][j][m][1]);
1741 1748096 p += strlen(p);
1742 }
1743 }
1744 8 snprintf(p, end - p, "%d\n", f->gob_count);
1745 }
1746 51 return 0;
1747 }
1748
1749 /* Maximum packet size */
1750 2480 maxsize = ff_ffv1_encode_buffer_size(avctx);
1751
1752
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2480 times.
2480 if (maxsize > INT_MAX - AV_INPUT_BUFFER_PADDING_SIZE - 32) {
1753 FFV1Context *f = avctx->priv_data;
1754 if (!f->maxsize_warned) {
1755 av_log(avctx, AV_LOG_WARNING, "Cannot allocate worst case packet size, the encoding could fail\n");
1756 f->maxsize_warned++;
1757 }
1758 maxsize = INT_MAX - AV_INPUT_BUFFER_PADDING_SIZE - 32;
1759 }
1760
1761
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 2480 times.
2480 if ((ret = ff_alloc_packet(avctx, pkt, maxsize)) < 0)
1762 return ret;
1763
1764 2480 ff_init_range_encoder(c, pkt->data, pkt->size);
1765 2480 ff_build_rac_states(c, 0.05 * (1LL << 32), 256 - 8);
1766
1767 2480 f->cur_enc_frame = pict;
1768
1769
3/4
✓ Branch 0 taken 2480 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 249 times.
✓ Branch 3 taken 2231 times.
2480 if (avctx->gop_size == 0 || f->picture_number % avctx->gop_size == 0) {
1770 249 put_rac(c, &keystate, 1);
1771 249 f->key_frame = 1;
1772 249 f->gob_count++;
1773 249 write_header(f);
1774 } else {
1775 2231 put_rac(c, &keystate, 0);
1776 2231 f->key_frame = 0;
1777 }
1778
1779
2/2
✓ Branch 0 taken 1405 times.
✓ Branch 1 taken 1075 times.
2480 if (f->ac == AC_RANGE_CUSTOM_TAB) {
1780 int i;
1781
2/2
✓ Branch 0 taken 358275 times.
✓ Branch 1 taken 1405 times.
359680 for (i = 1; i < 256; i++) {
1782 358275 c->one_state[i] = f->state_transition[i];
1783 358275 c->zero_state[256 - i] = 256 - c->one_state[i];
1784 }
1785 }
1786
1787
2/2
✓ Branch 0 taken 9345 times.
✓ Branch 1 taken 2480 times.
11825 for (i = 0; i < f->slice_count; i++) {
1788 9345 FFV1SliceContext *sc = &f->slices[i];
1789 9345 uint8_t *start = pkt->data + pkt->size * (int64_t)i / f->slice_count;
1790 9345 int len = pkt->size / f->slice_count;
1791
2/2
✓ Branch 0 taken 6865 times.
✓ Branch 1 taken 2480 times.
9345 if (i) {
1792 6865 ff_init_range_encoder(&sc->c, start, len);
1793 } else {
1794
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2480 times.
2480 av_assert0(sc->c.bytestream_end >= sc->c.bytestream_start + len);
1795
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2480 times.
2480 av_assert0(sc->c.bytestream < sc->c.bytestream_start + len);
1796 2480 sc->c.bytestream_end = sc->c.bytestream_start + len;
1797 }
1798 }
1799 2480 avctx->execute(avctx, encode_slice, f->slices, NULL,
1800 f->slice_count, sizeof(*f->slices));
1801
1802 2480 buf_p = pkt->data;
1803
2/2
✓ Branch 0 taken 9345 times.
✓ Branch 1 taken 2480 times.
11825 for (i = 0; i < f->slice_count; i++) {
1804 9345 FFV1SliceContext *sc = &f->slices[i];
1805 9345 int bytes = sc->ac_byte_count;
1806
4/4
✓ Branch 0 taken 2480 times.
✓ Branch 1 taken 6865 times.
✓ Branch 2 taken 2080 times.
✓ Branch 3 taken 400 times.
9345 if (i > 0 || f->version > 2) {
1807
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8945 times.
8945 av_assert0(bytes < pkt->size / f->slice_count);
1808 8945 memmove(buf_p, sc->c.bytestream_start, bytes);
1809
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8945 times.
8945 av_assert0(bytes < (1 << 24));
1810 8945 AV_WB24(buf_p + bytes, bytes);
1811 8945 bytes += 3;
1812 }
1813
2/2
✓ Branch 0 taken 8345 times.
✓ Branch 1 taken 1000 times.
9345 if (f->ec) {
1814 unsigned v;
1815 8345 buf_p[bytes++] = 0;
1816
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 8345 times.
8345 v = av_crc(av_crc_get_table(AV_CRC_32_IEEE), f->crcref, buf_p, bytes) ^ (f->crcref ? 0x8CD88196 : 0);
1817 8345 AV_WL32(buf_p + bytes, v);
1818 8345 bytes += 4;
1819 }
1820 9345 buf_p += bytes;
1821 }
1822
1823
2/2
✓ Branch 0 taken 400 times.
✓ Branch 1 taken 2080 times.
2480 if (avctx->flags & AV_CODEC_FLAG_PASS1)
1824 400 avctx->stats_out[0] = '\0';
1825
1826 2480 f->picture_number++;
1827 2480 pkt->size = buf_p - pkt->data;
1828 2480 pkt->flags |= AV_PKT_FLAG_KEY * f->key_frame;
1829 2480 *got_packet = 1;
1830
1831 2480 return 0;
1832 }
1833
1834 51 static av_cold int encode_close(AVCodecContext *avctx)
1835 {
1836 51 FFV1Context *const s = avctx->priv_data;
1837
1838
2/2
✓ Branch 0 taken 197 times.
✓ Branch 1 taken 51 times.
248 for (int j = 0; j < s->max_slice_count; j++) {
1839 197 FFV1SliceContext *sc = &s->slices[j];
1840
1841
2/2
✓ Branch 0 taken 788 times.
✓ Branch 1 taken 197 times.
985 for(int p = 0; p<4; p++) {
1842 788 av_freep(&sc->unit[p]);
1843 788 av_freep(&sc->bitmap[p]);
1844 }
1845 }
1846
1847 51 av_freep(&avctx->stats_out);
1848 51 ff_ffv1_close(s);
1849
1850 51 return 0;
1851 }
1852
1853 #define OFFSET(x) offsetof(FFV1Context, x)
1854 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
1855 static const AVOption options[] = {
1856 { "slicecrc", "Protect slices with CRCs", OFFSET(ec), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 2, VE },
1857 { "coder", "Coder type", OFFSET(ac), AV_OPT_TYPE_INT,
1858 { .i64 = 0 }, -2, 2, VE, .unit = "coder" },
1859 { "rice", "Golomb rice", 0, AV_OPT_TYPE_CONST,
1860 { .i64 = AC_GOLOMB_RICE }, INT_MIN, INT_MAX, VE, .unit = "coder" },
1861 { "range_def", "Range with default table", 0, AV_OPT_TYPE_CONST,
1862 { .i64 = AC_RANGE_DEFAULT_TAB_FORCE }, INT_MIN, INT_MAX, VE, .unit = "coder" },
1863 { "range_tab", "Range with custom table", 0, AV_OPT_TYPE_CONST,
1864 { .i64 = AC_RANGE_CUSTOM_TAB }, INT_MIN, INT_MAX, VE, .unit = "coder" },
1865 { "ac", "Range with custom table (the ac option exists for compatibility and is deprecated)", 0, AV_OPT_TYPE_CONST,
1866 { .i64 = 1 }, INT_MIN, INT_MAX, VE, .unit = "coder" },
1867 { "context", "Context model", OFFSET(context_model), AV_OPT_TYPE_INT,
1868 { .i64 = 0 }, 0, 1, VE },
1869 { "qtable", "Quantization table", OFFSET(qtable), AV_OPT_TYPE_INT,
1870 { .i64 = -1 }, -1, 2, VE , .unit = "qtable"},
1871 { "default", NULL, 0, AV_OPT_TYPE_CONST,
1872 { .i64 = QTABLE_DEFAULT }, INT_MIN, INT_MAX, VE, .unit = "qtable" },
1873 { "8bit", NULL, 0, AV_OPT_TYPE_CONST,
1874 { .i64 = QTABLE_8BIT }, INT_MIN, INT_MAX, VE, .unit = "qtable" },
1875 { "greater8bit", NULL, 0, AV_OPT_TYPE_CONST,
1876 { .i64 = QTABLE_GT8BIT }, INT_MIN, INT_MAX, VE, .unit = "qtable" },
1877 { "remap_mode", "Remap Mode", OFFSET(remap_mode), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 2, VE, .unit = "remap_mode" },
1878 { "auto", "Automatic", 0, AV_OPT_TYPE_CONST,
1879 { .i64 = -1 }, INT_MIN, INT_MAX, VE, .unit = "remap_mode" },
1880 { "off", "Disabled", 0, AV_OPT_TYPE_CONST,
1881 { .i64 = 0 }, INT_MIN, INT_MAX, VE, .unit = "remap_mode" },
1882 { "dualrle", "Dual RLE", 0, AV_OPT_TYPE_CONST,
1883 { .i64 = 1 }, INT_MIN, INT_MAX, VE, .unit = "remap_mode" },
1884 { "flipdualrle", "Dual RLE", 0, AV_OPT_TYPE_CONST,
1885 { .i64 = 2 }, INT_MIN, INT_MAX, VE, .unit = "remap_mode" },
1886 { "remap_optimizer", "Remap Optimizer", OFFSET(remap_optimizer), AV_OPT_TYPE_INT, { .i64 = 3 }, 0, 5, VE, .unit = "remap_optimizer" },
1887
1888 { NULL }
1889 };
1890
1891 static const AVClass ffv1_class = {
1892 .class_name = "ffv1 encoder",
1893 .item_name = av_default_item_name,
1894 .option = options,
1895 .version = LIBAVUTIL_VERSION_INT,
1896 };
1897
1898 const FFCodec ff_ffv1_encoder = {
1899 .p.name = "ffv1",
1900 CODEC_LONG_NAME("FFmpeg video codec #1"),
1901 .p.type = AVMEDIA_TYPE_VIDEO,
1902 .p.id = AV_CODEC_ID_FFV1,
1903 .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY |
1904 AV_CODEC_CAP_SLICE_THREADS |
1905 AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE,
1906 .priv_data_size = sizeof(FFV1Context),
1907 .init = encode_init_internal,
1908 FF_CODEC_ENCODE_CB(encode_frame),
1909 .close = encode_close,
1910 CODEC_PIXFMTS(
1911 AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUVA420P, AV_PIX_FMT_YUVA422P, AV_PIX_FMT_YUV444P,
1912 AV_PIX_FMT_YUVA444P, AV_PIX_FMT_YUV440P, AV_PIX_FMT_YUV422P, AV_PIX_FMT_YUV411P,
1913 AV_PIX_FMT_YUV410P, AV_PIX_FMT_0RGB32, AV_PIX_FMT_RGB32, AV_PIX_FMT_YUV420P16,
1914 AV_PIX_FMT_YUV422P16, AV_PIX_FMT_YUV444P16, AV_PIX_FMT_YUV444P9, AV_PIX_FMT_YUV422P9,
1915 AV_PIX_FMT_YUV420P9, AV_PIX_FMT_YUV420P10, AV_PIX_FMT_YUV422P10, AV_PIX_FMT_YUV444P10,
1916 AV_PIX_FMT_YUV420P12, AV_PIX_FMT_YUV422P12, AV_PIX_FMT_YUV444P12,
1917 AV_PIX_FMT_YUVA444P16, AV_PIX_FMT_YUVA422P16, AV_PIX_FMT_YUVA420P16,
1918 AV_PIX_FMT_YUVA444P12, AV_PIX_FMT_YUVA422P12,
1919 AV_PIX_FMT_YUVA444P10, AV_PIX_FMT_YUVA422P10, AV_PIX_FMT_YUVA420P10,
1920 AV_PIX_FMT_YUVA444P9, AV_PIX_FMT_YUVA422P9, AV_PIX_FMT_YUVA420P9,
1921 AV_PIX_FMT_GRAY16, AV_PIX_FMT_GRAY8, AV_PIX_FMT_GBRP9, AV_PIX_FMT_GBRP10,
1922 AV_PIX_FMT_GBRP12, AV_PIX_FMT_GBRP14, AV_PIX_FMT_GBRAP14,
1923 AV_PIX_FMT_GBRAP10, AV_PIX_FMT_GBRAP12,
1924 AV_PIX_FMT_YA8,
1925 AV_PIX_FMT_GRAY10, AV_PIX_FMT_GRAY12, AV_PIX_FMT_GRAY14,
1926 AV_PIX_FMT_GBRP16, AV_PIX_FMT_RGB48,
1927 AV_PIX_FMT_GBRAP16, AV_PIX_FMT_RGBA64,
1928 AV_PIX_FMT_GRAY9,
1929 AV_PIX_FMT_YUV420P14, AV_PIX_FMT_YUV422P14, AV_PIX_FMT_YUV444P14,
1930 AV_PIX_FMT_YUV440P10, AV_PIX_FMT_YUV440P12,
1931 AV_PIX_FMT_YAF16,
1932 AV_PIX_FMT_GRAYF16,
1933 AV_PIX_FMT_GBRPF16, AV_PIX_FMT_GBRPF32),
1934 .color_ranges = AVCOL_RANGE_MPEG,
1935 .p.priv_class = &ffv1_class,
1936 .caps_internal = FF_CODEC_CAP_INIT_CLEANUP | FF_CODEC_CAP_EOF_FLUSH,
1937 };
1938