Coverage Report

Created: 2026-07-25 07:52

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/ffmpeg/libavcodec/dvdec.c
Line
Count
Source
1
/*
2
 * DV decoder
3
 * Copyright (c) 2002 Fabrice Bellard
4
 * Copyright (c) 2004 Roman Shaposhnik
5
 *
6
 * 50 Mbps (DVCPRO50) support
7
 * Copyright (c) 2006 Daniel Maas <dmaas@maasdigital.com>
8
 *
9
 * 100 Mbps (DVCPRO HD) support
10
 * Initial code by Daniel Maas <dmaas@maasdigital.com> (funded by BBC R&D)
11
 * Final code by Roman Shaposhnik
12
 *
13
 * Many thanks to Dan Dennedy <dan@dennedy.org> for providing wealth
14
 * of DV technical info.
15
 *
16
 * This file is part of FFmpeg.
17
 *
18
 * FFmpeg is free software; you can redistribute it and/or
19
 * modify it under the terms of the GNU Lesser General Public
20
 * License as published by the Free Software Foundation; either
21
 * version 2.1 of the License, or (at your option) any later version.
22
 *
23
 * FFmpeg is distributed in the hope that it will be useful,
24
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
25
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
26
 * Lesser General Public License for more details.
27
 *
28
 * You should have received a copy of the GNU Lesser General Public
29
 * License along with FFmpeg; if not, write to the Free Software
30
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
31
 */
32
33
/**
34
 * @file
35
 * DV decoder
36
 */
37
38
#include "libavutil/avassert.h"
39
#include "libavutil/internal.h"
40
#include "libavutil/mem_internal.h"
41
#include "libavutil/thread.h"
42
43
#include "avcodec.h"
44
#include "codec_internal.h"
45
#include "decode.h"
46
#include "dv.h"
47
#include "dv_internal.h"
48
#include "dv_profile_internal.h"
49
#include "dvdata.h"
50
#include "get_bits.h"
51
#include "idctdsp.h"
52
#include "put_bits.h"
53
#include "simple_idct.h"
54
#include "thread.h"
55
56
typedef struct BlockInfo {
57
    const uint32_t *factor_table;
58
    const uint8_t *scan_table;
59
    uint8_t pos; /* position in block */
60
    void (*idct_put)(uint8_t *dest, ptrdiff_t stride, int16_t *block);
61
    uint8_t partial_bit_count;
62
    uint32_t partial_bit_buffer;
63
    int shift_offset;
64
} BlockInfo;
65
66
typedef struct DVDecContext {
67
    const AVDVProfile *sys;
68
    const AVFrame     *frame;
69
    const uint8_t     *buf;
70
71
    uint8_t      dv_zigzag[2][64];
72
    DVwork_chunk work_chunks[4 * 12 * 27];
73
    uint32_t     idct_factor[2 * 4 * 16 * 64];
74
    void       (*idct_put[2])(uint8_t *dest, ptrdiff_t stride, int16_t *block);
75
76
    IDCTDSPContext idsp;
77
} DVDecContext;
78
79
static const int dv_iweight_bits = 14;
80
81
static const uint16_t dv_iweight_88[64] = {
82
    32768, 16705, 16705, 17734, 17032, 17734, 18205, 18081,
83
    18081, 18205, 18725, 18562, 19195, 18562, 18725, 19266,
84
    19091, 19705, 19705, 19091, 19266, 21407, 19643, 20267,
85
    20228, 20267, 19643, 21407, 22725, 21826, 20853, 20806,
86
    20806, 20853, 21826, 22725, 23170, 23170, 21407, 21400,
87
    21407, 23170, 23170, 24598, 23786, 22018, 22018, 23786,
88
    24598, 25251, 24465, 22654, 24465, 25251, 25972, 25172,
89
    25172, 25972, 26722, 27969, 26722, 29692, 29692, 31521,
90
};
91
static const uint16_t dv_iweight_248[64] = {
92
    32768, 16384, 16705, 16705, 17734, 17734, 17734, 17734,
93
    18081, 18081, 18725, 18725, 21407, 21407, 19091, 19091,
94
    19195, 19195, 18205, 18205, 18725, 18725, 19705, 19705,
95
    20267, 20267, 21826, 21826, 23170, 23170, 20806, 20806,
96
    20267, 20267, 19266, 19266, 21407, 21407, 20853, 20853,
97
    21400, 21400, 23786, 23786, 24465, 24465, 22018, 22018,
98
    23170, 23170, 22725, 22725, 24598, 24598, 24465, 24465,
99
    25172, 25172, 27969, 27969, 25972, 25972, 29692, 29692
100
};
101
102
/**
103
 * The "inverse" DV100 weights are actually just the spec weights (zig-zagged).
104
 */
105
static const uint16_t dv_iweight_1080_y[64] = {
106
    128,  16,  16,  17,  17,  17,  18,  18,
107
     18,  18,  18,  18,  19,  18,  18,  19,
108
     19,  19,  19,  19,  19,  42,  38,  40,
109
     40,  40,  38,  42,  44,  43,  41,  41,
110
     41,  41,  43,  44,  45,  45,  42,  42,
111
     42,  45,  45,  48,  46,  43,  43,  46,
112
     48,  49,  48,  44,  48,  49, 101,  98,
113
     98, 101, 104, 109, 104, 116, 116, 123,
114
};
115
static const uint16_t dv_iweight_1080_c[64] = {
116
    128,  16,  16,  17,  17,  17,  25,  25,
117
     25,  25,  26,  25,  26,  25,  26,  26,
118
     26,  27,  27,  26,  26,  42,  38,  40,
119
     40,  40,  38,  42,  44,  43,  41,  41,
120
     41,  41,  43,  44,  91,  91,  84,  84,
121
     84,  91,  91,  96,  93,  86,  86,  93,
122
     96, 197, 191, 177, 191, 197, 203, 197,
123
    197, 203, 209, 219, 209, 232, 232, 246,
124
};
125
static const uint16_t dv_iweight_720_y[64] = {
126
    128,  16,  16,  17,  17,  17,  18,  18,
127
     18,  18,  18,  18,  19,  18,  18,  19,
128
     19,  19,  19,  19,  19,  42,  38,  40,
129
     40,  40,  38,  42,  44,  43,  41,  41,
130
     41,  41,  43,  44,  68,  68,  63,  63,
131
     63,  68,  68,  96,  92,  86,  86,  92,
132
     96,  98,  96,  88,  96,  98, 202, 196,
133
    196, 202, 208, 218, 208, 232, 232, 246,
134
};
135
static const uint16_t dv_iweight_720_c[64] = {
136
    128,  24,  24,  26,  26,  26,  36,  36,
137
     36,  36,  36,  36,  38,  36,  36,  38,
138
     38,  38,  38,  38,  38,  84,  76,  80,
139
     80,  80,  76,  84,  88,  86,  82,  82,
140
     82,  82,  86,  88, 182, 182, 168, 168,
141
    168, 182, 182, 192, 186, 192, 172, 186,
142
    192, 394, 382, 354, 382, 394, 406, 394,
143
    394, 406, 418, 438, 418, 464, 464, 492,
144
};
145
146
28.6M
#define TEX_VLC_BITS 10
147
148
/* XXX: also include quantization */
149
static RL_VLC_ELEM dv_rl_vlc[1664];
150
151
static av_cold void dv_init_static(void)
152
1
{
153
1
    VLCElem vlc_buf[FF_ARRAY_ELEMS(dv_rl_vlc)] = { 0 };
154
1
    VLC dv_vlc = { .table = vlc_buf, .table_allocated = FF_ARRAY_ELEMS(vlc_buf) };
155
1
    const unsigned offset = FF_ARRAY_ELEMS(dv_rl_vlc) - (2 * NB_DV_VLC - NB_DV_ZERO_LEVEL_ENTRIES);
156
1
    RL_VLC_ELEM *tmp = dv_rl_vlc + offset;
157
1
    int i, j;
158
159
    /* it's faster to include sign bit in a generic VLC parsing scheme */
160
410
    for (i = 0, j = 0; i < NB_DV_VLC; i++, j++) {
161
409
        tmp[j].len8  = ff_dv_vlc_len[i];
162
409
        tmp[j].run   = ff_dv_vlc_run[i];
163
409
        tmp[j].level = ff_dv_vlc_level[i];
164
165
409
        if (ff_dv_vlc_level[i]) {
166
337
            tmp[j].len8++;
167
168
337
            j++;
169
337
            tmp[j].len8  =  ff_dv_vlc_len[i] + 1;
170
337
            tmp[j].run   =  ff_dv_vlc_run[i];
171
337
            tmp[j].level = -ff_dv_vlc_level[i];
172
337
        }
173
409
    }
174
175
    /* NOTE: as a trick, we use the fact the no codes are unused
176
     * to accelerate the parsing of partial codes */
177
1
    ff_vlc_init_from_lengths(&dv_vlc, TEX_VLC_BITS, j,
178
1
                             &tmp[0].len8, sizeof(tmp[0]),
179
1
                             NULL, 0, 0, 0, VLC_INIT_USE_STATIC, NULL);
180
1
    av_assert1(dv_vlc.table_size == 1664);
181
182
1.66k
    for (int i = 0; i < dv_vlc.table_size; i++) {
183
1.66k
        int code = dv_vlc.table[i].sym;
184
1.66k
        int len  = dv_vlc.table[i].len;
185
1.66k
        int level, run;
186
187
1.66k
        if (len < 0) { // more bits needed
188
32
            run   = 0;
189
32
            level = code;
190
1.63k
        } else {
191
1.63k
            av_assert1(i <= code + offset);
192
1.63k
            run   = tmp[code].run + 1;
193
1.63k
            level = tmp[code].level;
194
1.63k
        }
195
1.66k
        dv_rl_vlc[i].len8  = len;
196
1.66k
        dv_rl_vlc[i].level = level;
197
1.66k
        dv_rl_vlc[i].run   = run;
198
1.66k
    }
199
1
}
200
201
static void dv_init_weight_tables(DVDecContext *ctx, const AVDVProfile *d)
202
973
{
203
973
    int j, i, c, s;
204
973
    uint32_t *factor1 = &ctx->idct_factor[0],
205
973
             *factor2 = &ctx->idct_factor[DV_PROFILE_IS_HD(d) ? 4096 : 2816];
206
207
973
    if (DV_PROFILE_IS_HD(d)) {
208
        /* quantization quanta by QNO for DV100 */
209
211
        static const uint8_t dv100_qstep[16] = {
210
211
            1, /* QNO = 0 and 1 both have no quantization */
211
211
            1,
212
211
            2, 3, 4, 5, 6, 7, 8, 16, 18, 20, 22, 24, 28, 52
213
211
        };
214
211
        const uint16_t *iweight1, *iweight2;
215
216
211
        if (d->height == 720) {
217
91
            iweight1 = &dv_iweight_720_y[0];
218
91
            iweight2 = &dv_iweight_720_c[0];
219
120
        } else {
220
120
            iweight1 = &dv_iweight_1080_y[0];
221
120
            iweight2 = &dv_iweight_1080_c[0];
222
120
        }
223
1.05k
        for (c = 0; c < 4; c++) {
224
14.3k
            for (s = 0; s < 16; s++) {
225
877k
                for (i = 0; i < 64; i++) {
226
864k
                    *factor1++ = (dv100_qstep[s] << (c + 9)) * iweight1[i];
227
864k
                    *factor2++ = (dv100_qstep[s] << (c + 9)) * iweight2[i];
228
864k
                }
229
13.5k
            }
230
844
        }
231
762
    } else {
232
762
        static const uint8_t dv_quant_areas[4] = { 6, 21, 43, 64 };
233
762
        const uint16_t *iweight1 = &dv_iweight_88[0];
234
2.28k
        for (j = 0; j < 2; j++, iweight1 = &dv_iweight_248[0]) {
235
35.0k
            for (s = 0; s < 22; s++) {
236
167k
                for (i = c = 0; c < 4; c++) {
237
2.27M
                    for (; i < dv_quant_areas[c]; i++) {
238
2.14M
                        *factor1   = iweight1[i] << (ff_dv_quant_shifts[s][c] + 1);
239
2.14M
                        *factor2++ = (*factor1++) << 1;
240
2.14M
                    }
241
134k
                }
242
33.5k
            }
243
1.52k
        }
244
762
    }
245
973
}
246
247
static av_cold int dvvideo_decode_init(AVCodecContext *avctx)
248
1.57k
{
249
1.57k
    static AVOnce init_static_once = AV_ONCE_INIT;
250
1.57k
    DVDecContext *s = avctx->priv_data;
251
1.57k
    int i;
252
253
1.57k
    avctx->chroma_sample_location = AVCHROMA_LOC_TOPLEFT;
254
255
1.57k
    ff_idctdsp_init(&s->idsp, avctx);
256
257
102k
    for (i = 0; i < 64; i++)
258
100k
        s->dv_zigzag[0][i] = s->idsp.idct_permutation[ff_zigzag_direct[i]];
259
260
1.57k
    if (avctx->lowres){
261
30.0k
        for (i = 0; i < 64; i++){
262
29.6k
            int j = ff_dv_zigzag248_direct[i];
263
29.6k
            s->dv_zigzag[1][i] = s->idsp.idct_permutation[(j & 7) + (j & 8) * 4 + (j & 48) / 2];
264
29.6k
        }
265
463
    }else
266
1.11k
        memcpy(s->dv_zigzag[1], ff_dv_zigzag248_direct, sizeof(s->dv_zigzag[1]));
267
268
1.57k
    s->idct_put[0] = s->idsp.idct_put;
269
1.57k
    s->idct_put[1] = ff_simple_idct248_put;
270
271
1.57k
    ff_thread_once(&init_static_once, dv_init_static);
272
273
1.57k
    return 0;
274
1.57k
}
275
276
/* decode AC coefficients */
277
static void dv_decode_ac(GetBitContext *gb, BlockInfo *mb, int16_t *block)
278
32.0M
{
279
32.0M
    int last_index = gb->size_in_bits;
280
32.0M
    const uint8_t  *scan_table   = mb->scan_table;
281
32.0M
    const uint32_t *factor_table = mb->factor_table;
282
32.0M
    int pos                      = mb->pos;
283
32.0M
    int partial_bit_count        = mb->partial_bit_count;
284
32.0M
    int level, run, vlc_len, index;
285
286
32.0M
    OPEN_READER_NOSIZE(re, gb);
287
32.0M
    UPDATE_CACHE(re, gb);
288
289
    /* if we must parse a partial VLC, we do it here */
290
32.0M
    if (partial_bit_count > 0) {
291
3.21M
        re_cache              = re_cache >> partial_bit_count |
292
3.21M
                                mb->partial_bit_buffer;
293
3.21M
        re_index             -= partial_bit_count;
294
3.21M
        mb->partial_bit_count = 0;
295
3.21M
    }
296
297
    /* get the AC coefficients until last_index is reached */
298
427M
    for (;;) {
299
427M
        ff_dlog(NULL, "%2d: bits=%04"PRIx32" index=%u\n",
300
427M
                pos, SHOW_UBITS(re, gb, 16), re_index);
301
        /* our own optimized GET_RL_VLC */
302
427M
        index   = NEG_USR32(re_cache, TEX_VLC_BITS);
303
427M
        vlc_len = dv_rl_vlc[index].len8;
304
427M
        if (vlc_len < 0) {
305
28.6M
            index = NEG_USR32((unsigned) re_cache << TEX_VLC_BITS, -vlc_len) +
306
28.6M
                    dv_rl_vlc[index].level;
307
28.6M
            vlc_len = TEX_VLC_BITS - vlc_len;
308
28.6M
        }
309
427M
        level = dv_rl_vlc[index].level;
310
427M
        run   = dv_rl_vlc[index].run;
311
312
        /* gotta check if we're still within gb boundaries */
313
427M
        if (re_index + vlc_len > last_index) {
314
            /* should be < 16 bits otherwise a codeword could have been parsed */
315
21.5M
            mb->partial_bit_count  = last_index - re_index;
316
21.5M
            mb->partial_bit_buffer = re_cache & ~(-1u >> mb->partial_bit_count);
317
21.5M
            re_index               = last_index;
318
21.5M
            break;
319
21.5M
        }
320
405M
        re_index += vlc_len;
321
322
405M
        ff_dlog(NULL, "run=%d level=%d\n", run, level);
323
405M
        pos += run;
324
405M
        if (pos >= 64)
325
10.4M
            break;
326
327
395M
        level = (level * factor_table[pos] + (1 << (dv_iweight_bits - 1))) >>
328
395M
                dv_iweight_bits;
329
395M
        block[scan_table[pos]] = level;
330
331
395M
        UPDATE_CACHE(re, gb);
332
395M
    }
333
32.0M
    CLOSE_READER(re, gb);
334
32.0M
    mb->pos = pos;
335
32.0M
}
336
337
static inline void bit_copy(PutBitContext *pb, GetBitContext *gb)
338
10.2M
{
339
10.2M
    int bits_left = get_bits_left(gb);
340
31.0M
    while (bits_left >= MIN_CACHE_BITS) {
341
20.8M
        put_bits(pb, MIN_CACHE_BITS, get_bits(gb, MIN_CACHE_BITS));
342
20.8M
        bits_left -= MIN_CACHE_BITS;
343
20.8M
    }
344
10.2M
    if (bits_left > 0)
345
8.68M
        put_bits(pb, bits_left, get_bits(gb, bits_left));
346
10.2M
}
347
348
static av_always_inline void put_block_8x4(int16_t *block, uint8_t *restrict p, int stride)
349
36.0k
{
350
36.0k
    int i, j;
351
352
180k
    for (i = 0; i < 4; i++) {
353
1.29M
        for (j = 0; j < 8; j++)
354
1.15M
            p[j] = av_clip_uint8(block[j]);
355
144k
        block += 8;
356
144k
        p += stride;
357
144k
    }
358
36.0k
}
359
360
static void dv100_idct_put_last_row_field_chroma(const DVDecContext *s, uint8_t *data,
361
                                                 int stride, int16_t *blocks)
362
4.50k
{
363
4.50k
    s->idsp.idct(blocks + 0*64);
364
4.50k
    s->idsp.idct(blocks + 1*64);
365
366
4.50k
    put_block_8x4(blocks+0*64,       data,              stride<<1);
367
4.50k
    put_block_8x4(blocks+0*64 + 4*8, data + 8,          stride<<1);
368
4.50k
    put_block_8x4(blocks+1*64,       data + stride,     stride<<1);
369
4.50k
    put_block_8x4(blocks+1*64 + 4*8, data + 8 + stride, stride<<1);
370
4.50k
}
371
372
static void dv100_idct_put_last_row_field_luma(const DVDecContext *s, uint8_t *data,
373
                                               int stride, int16_t *blocks)
374
2.25k
{
375
2.25k
    s->idsp.idct(blocks + 0*64);
376
2.25k
    s->idsp.idct(blocks + 1*64);
377
2.25k
    s->idsp.idct(blocks + 2*64);
378
2.25k
    s->idsp.idct(blocks + 3*64);
379
380
2.25k
    put_block_8x4(blocks+0*64,       data,               stride<<1);
381
2.25k
    put_block_8x4(blocks+0*64 + 4*8, data + 16,          stride<<1);
382
2.25k
    put_block_8x4(blocks+1*64,       data + 8,           stride<<1);
383
2.25k
    put_block_8x4(blocks+1*64 + 4*8, data + 24,          stride<<1);
384
2.25k
    put_block_8x4(blocks+2*64,       data + stride,      stride<<1);
385
2.25k
    put_block_8x4(blocks+2*64 + 4*8, data + 16 + stride, stride<<1);
386
2.25k
    put_block_8x4(blocks+3*64,       data + 8  + stride, stride<<1);
387
2.25k
    put_block_8x4(blocks+3*64 + 4*8, data + 24 + stride, stride<<1);
388
2.25k
}
389
390
/* mb_x and mb_y are in units of 8 pixels */
391
static int dv_decode_video_segment(AVCodecContext *avctx, void *arg)
392
451k
{
393
451k
    const DVDecContext *s = avctx->priv_data;
394
451k
    DVwork_chunk *work_chunk = arg;
395
451k
    int quant, dc, dct_mode, class1, j;
396
451k
    int mb_index, mb_x, mb_y, last_index;
397
451k
    int y_stride, linesize;
398
451k
    int16_t *block, *block1;
399
451k
    int c_offset;
400
451k
    uint8_t *y_ptr;
401
451k
    const uint8_t *buf_ptr;
402
451k
    PutBitContext pb, vs_pb;
403
451k
    GetBitContext gb;
404
451k
    BlockInfo mb_data[5 * DV_MAX_BPM], *mb, *mb1;
405
451k
    LOCAL_ALIGNED_16(int16_t, sblock, [5 * DV_MAX_BPM], [64]);
406
451k
    LOCAL_ALIGNED_16(uint8_t, mb_bit_buffer, [80     + AV_INPUT_BUFFER_PADDING_SIZE]); /* allow some slack */
407
451k
    LOCAL_ALIGNED_16(uint8_t, vs_bit_buffer, [80 * 5 + AV_INPUT_BUFFER_PADDING_SIZE]); /* allow some slack */
408
451k
    const int log2_blocksize = 3 - avctx->lowres;
409
451k
    int is_field_mode[5];
410
451k
    int vs_bit_buffer_damaged = 0;
411
451k
    int mb_bit_buffer_damaged[5] = {0};
412
451k
    int retried = 0;
413
451k
    int sta;
414
415
451k
    av_assert1((((uintptr_t) mb_bit_buffer) & 7) == 0);
416
451k
    av_assert1((((uintptr_t) vs_bit_buffer) & 7) == 0);
417
418
824k
retry:
419
420
824k
    memset(sblock, 0, 5 * DV_MAX_BPM * sizeof(*sblock));
421
422
    /* pass 1: read DC and AC coefficients in blocks */
423
824k
    buf_ptr = &s->buf[work_chunk->buf_offset * 80];
424
824k
    block1  = &sblock[0][0];
425
824k
    mb1     = mb_data;
426
824k
    init_put_bits(&vs_pb, vs_bit_buffer, 5 * 80);
427
4.94M
    for (mb_index = 0; mb_index < 5; mb_index++, mb1 += s->sys->bpm, block1 += s->sys->bpm * 64) {
428
        /* skip header */
429
4.12M
        quant    = buf_ptr[3] & 0x0f;
430
4.12M
        if (avctx->error_concealment) {
431
4.00M
            if ((buf_ptr[3] >> 4) == 0x0E)
432
38.7k
                vs_bit_buffer_damaged = 1;
433
4.00M
            if (!mb_index) {
434
800k
                sta = buf_ptr[3] >> 4;
435
3.20M
            } else if (sta != (buf_ptr[3] >> 4))
436
1.92M
                vs_bit_buffer_damaged = 1;
437
4.00M
        }
438
4.12M
        buf_ptr += 4;
439
4.12M
        init_put_bits(&pb, mb_bit_buffer, 80);
440
4.12M
        mb    = mb1;
441
4.12M
        block = block1;
442
4.12M
        is_field_mode[mb_index] = 0;
443
32.3M
        for (j = 0; j < s->sys->bpm; j++) {
444
28.1M
            last_index = s->sys->block_sizes[j];
445
28.1M
            init_get_bits(&gb, buf_ptr, last_index);
446
447
            /* get the DC */
448
28.1M
            dc       = get_sbits(&gb, 9);
449
28.1M
            dct_mode = get_bits1(&gb);
450
28.1M
            class1   = get_bits(&gb, 2);
451
28.1M
            if (DV_PROFILE_IS_HD(s->sys)) {
452
13.8M
                mb->idct_put     = s->idct_put[0];
453
13.8M
                mb->scan_table   = s->dv_zigzag[0];
454
13.8M
                mb->factor_table = &s->idct_factor[(j >= 4) * 4 * 16 * 64 +
455
13.8M
                                                   class1       * 16 * 64 +
456
13.8M
                                                   quant             * 64];
457
13.8M
                is_field_mode[mb_index] |= !j && dct_mode;
458
14.3M
            } else {
459
14.3M
                mb->idct_put     = s->idct_put[dct_mode && log2_blocksize == 3];
460
14.3M
                mb->scan_table   = s->dv_zigzag[dct_mode];
461
14.3M
                mb->factor_table =
462
14.3M
                    &s->idct_factor[(class1 == 3)               * 2 * 22 * 64 +
463
14.3M
                                    dct_mode                        * 22 * 64 +
464
14.3M
                                    (quant + ff_dv_quant_offset[class1]) * 64];
465
14.3M
            }
466
28.1M
            dc = dc * 4;
467
            /* convert to unsigned because 128 is not added in the
468
             * standard IDCT */
469
28.1M
            dc                   += 1024;
470
28.1M
            block[0]              = dc;
471
28.1M
            buf_ptr              += last_index >> 3;
472
28.1M
            mb->pos               = 0;
473
28.1M
            mb->partial_bit_count = 0;
474
475
28.1M
            ff_dlog(avctx, "MB block: %d, %d ", mb_index, j);
476
28.1M
            dv_decode_ac(&gb, mb, block);
477
478
            /* write the remaining bits in a new buffer only if the
479
             * block is finished */
480
28.1M
            if (mb->pos >= 64)
481
8.08M
                bit_copy(&pb, &gb);
482
28.1M
            if (mb->pos >= 64 && mb->pos < 127)
483
433k
                vs_bit_buffer_damaged = mb_bit_buffer_damaged[mb_index] = 1;
484
485
28.1M
            block += 64;
486
28.1M
            mb++;
487
28.1M
        }
488
489
4.12M
        if (mb_bit_buffer_damaged[mb_index] > 0)
490
510k
            continue;
491
492
        /* pass 2: we can do it just after */
493
3.61M
        ff_dlog(avctx, "***pass 2 size=%d MB#=%d\n", put_bits_count(&pb), mb_index);
494
3.61M
        block = block1;
495
3.61M
        mb    = mb1;
496
3.61M
        init_get_bits(&gb, mb_bit_buffer, put_bits_count(&pb));
497
3.61M
        put_bits32(&pb, 0); // padding must be zeroed
498
3.61M
        flush_put_bits(&pb);
499
20.2M
        for (j = 0; j < s->sys->bpm; j++, block += 64, mb++) {
500
18.1M
            if (mb->pos < 64 && get_bits_left(&gb) > 0) {
501
3.79M
                dv_decode_ac(&gb, mb, block);
502
                /* if still not finished, no need to parse other blocks */
503
3.79M
                if (mb->pos < 64)
504
1.46M
                    break;
505
2.32M
                if (mb->pos < 127)
506
268k
                    vs_bit_buffer_damaged = mb_bit_buffer_damaged[mb_index] = 1;
507
2.32M
            }
508
18.1M
        }
509
        /* all blocks are finished, so the extra bytes can be used at
510
         * the video segment level */
511
3.61M
        if (j >= s->sys->bpm)
512
2.14M
            bit_copy(&vs_pb, &gb);
513
3.61M
    }
514
515
    /* we need a pass over the whole video segment */
516
824k
    ff_dlog(avctx, "***pass 3 size=%d\n", put_bits_count(&vs_pb));
517
824k
    block = &sblock[0][0];
518
824k
    mb    = mb_data;
519
824k
    init_get_bits(&gb, vs_bit_buffer, put_bits_count(&vs_pb));
520
824k
    put_bits32(&vs_pb, 0); // padding must be zeroed
521
824k
    flush_put_bits(&vs_pb);
522
4.94M
    for (mb_index = 0; mb_index < 5; mb_index++) {
523
32.3M
        for (j = 0; j < s->sys->bpm; j++) {
524
28.1M
            if (mb->pos < 64 && get_bits_left(&gb) > 0 && !vs_bit_buffer_damaged) {
525
11.6k
                ff_dlog(avctx, "start %d:%d\n", mb_index, j);
526
11.6k
                dv_decode_ac(&gb, mb, block);
527
11.6k
            }
528
529
28.1M
            if (mb->pos >= 64 && mb->pos < 127) {
530
702k
                av_log(avctx, AV_LOG_ERROR,
531
702k
                       "AC EOB marker is absent pos=%d\n", mb->pos);
532
702k
                vs_bit_buffer_damaged = 1;
533
702k
            }
534
28.1M
            block += 64;
535
28.1M
            mb++;
536
28.1M
        }
537
4.12M
    }
538
824k
    if (vs_bit_buffer_damaged && !retried) {
539
373k
        av_log(avctx, AV_LOG_ERROR, "Concealing bitstream errors\n");
540
373k
        retried = 1;
541
373k
        goto retry;
542
373k
    }
543
544
    /* compute idct and place blocks */
545
451k
    block = &sblock[0][0];
546
451k
    mb    = mb_data;
547
2.70M
    for (mb_index = 0; mb_index < 5; mb_index++) {
548
2.25M
        dv_calculate_mb_xy(s->sys, s->buf, work_chunk, mb_index, &mb_x, &mb_y);
549
550
        /* idct_put'ting luminance */
551
2.25M
        if ((s->sys->pix_fmt == AV_PIX_FMT_YUV420P)                      ||
552
2.19M
            (s->sys->pix_fmt == AV_PIX_FMT_YUV411P && mb_x >= (704 / 8)) ||
553
2.16M
            (s->sys->height >= 720 && mb_y != 134)) {
554
1.02M
            y_stride = (s->frame->linesize[0] <<
555
1.02M
                        ((!is_field_mode[mb_index]) * log2_blocksize));
556
1.23M
        } else {
557
1.23M
            y_stride = (2 << log2_blocksize);
558
1.23M
        }
559
2.25M
        y_ptr    = s->frame->data[0] +
560
2.25M
                   ((mb_y * s->frame->linesize[0] + mb_x) << log2_blocksize);
561
2.25M
        if (mb_y == 134 && is_field_mode[mb_index]) {
562
2.25k
            dv100_idct_put_last_row_field_luma(s, y_ptr, s->frame->linesize[0], block);
563
2.25M
        } else {
564
2.25M
            linesize = s->frame->linesize[0] << is_field_mode[mb_index];
565
2.25M
            mb[0].idct_put(y_ptr, linesize, block + 0 * 64);
566
2.25M
            if (s->sys->video_stype == 4) { /* SD 422 */
567
58.3k
                mb[2].idct_put(y_ptr + (1 << log2_blocksize),            linesize, block + 2 * 64);
568
2.19M
            } else {
569
2.19M
                mb[1].idct_put(y_ptr + (1 << log2_blocksize),            linesize, block + 1 * 64);
570
2.19M
                mb[2].idct_put(y_ptr                         + y_stride, linesize, block + 2 * 64);
571
2.19M
                mb[3].idct_put(y_ptr + (1 << log2_blocksize) + y_stride, linesize, block + 3 * 64);
572
2.19M
            }
573
2.25M
        }
574
2.25M
        mb    += 4;
575
2.25M
        block += 4 * 64;
576
577
        /* idct_put'ting chrominance */
578
2.25M
        c_offset = (((mb_y >>  (s->sys->pix_fmt == AV_PIX_FMT_YUV420P)) * s->frame->linesize[1] +
579
2.25M
                     (mb_x >> ((s->sys->pix_fmt == AV_PIX_FMT_YUV411P) ? 2 : 1))) << log2_blocksize);
580
6.76M
        for (j = 2; j; j--) {
581
4.51M
            uint8_t *c_ptr = s->frame->data[j] + c_offset;
582
4.51M
            if (s->sys->pix_fmt == AV_PIX_FMT_YUV411P && mb_x >= (704 / 8)) {
583
53.0k
                uint64_t aligned_pixels[64 / 8];
584
53.0k
                uint8_t *pixels = (uint8_t *) aligned_pixels;
585
53.0k
                uint8_t *c_ptr1, *ptr1;
586
53.0k
                int x, y;
587
53.0k
                mb->idct_put(pixels, 8, block);
588
385k
                for (y = 0; y < (1 << log2_blocksize); y++, c_ptr += s->frame->linesize[j], pixels += 8) {
589
332k
                    ptr1   = pixels + ((1 << (log2_blocksize))>>1);
590
332k
                    c_ptr1 = c_ptr + (s->frame->linesize[j] << log2_blocksize);
591
1.56M
                    for (x = 0; x < (1 << FFMAX(log2_blocksize - 1, 0)); x++) {
592
1.23M
                        c_ptr[x]  = pixels[x];
593
1.23M
                        c_ptr1[x] = ptr1[x];
594
1.23M
                    }
595
332k
                }
596
53.0k
                block += 64;
597
53.0k
                mb++;
598
4.46M
            } else {
599
4.46M
                y_stride = (mb_y == 134) ? (1 << log2_blocksize) :
600
4.46M
                    s->frame->linesize[j] << ((!is_field_mode[mb_index]) * log2_blocksize);
601
4.46M
                if (mb_y == 134 && is_field_mode[mb_index]) {
602
4.50k
                    dv100_idct_put_last_row_field_chroma(s, c_ptr, s->frame->linesize[j], block);
603
4.50k
                    mb += 2;
604
4.50k
                    block += 2*64;
605
4.45M
                } else {
606
4.45M
                    linesize = s->frame->linesize[j] << is_field_mode[mb_index];
607
4.45M
                    (mb++)->idct_put(c_ptr, linesize, block);
608
4.45M
                    block += 64;
609
4.45M
                    if (s->sys->bpm == 8) {
610
1.87M
                        (mb++)->idct_put(c_ptr + y_stride, linesize, block);
611
1.87M
                        block += 64;
612
1.87M
                    }
613
4.45M
                }
614
4.46M
            }
615
4.51M
        }
616
2.25M
    }
617
451k
    return 0;
618
824k
}
619
620
/* NOTE: exactly one frame must be given (120000 bytes for NTSC,
621
 * 144000 bytes for PAL - or twice those for 50Mbps) */
622
static int dvvideo_decode_frame(AVCodecContext *avctx, AVFrame *frame,
623
                                int *got_frame, AVPacket *avpkt)
624
227k
{
625
227k
    uint8_t *buf = avpkt->data;
626
227k
    int buf_size = avpkt->size;
627
227k
    DVDecContext *s = avctx->priv_data;
628
227k
    const uint8_t *vsc_pack;
629
227k
    int apt, is16_9, ret;
630
227k
    const AVDVProfile *sys;
631
632
227k
    sys = ff_dv_frame_profile(avctx, s->sys, buf, buf_size);
633
227k
    if (!sys || buf_size < sys->frame_size) {
634
226k
        av_log(avctx, AV_LOG_ERROR, "could not find dv frame profile\n");
635
226k
        return -1; /* NOTE: we only accept several full frames */
636
226k
    }
637
638
1.16k
    if (sys != s->sys) {
639
973
        ff_dv_init_dynamic_tables(s->work_chunks, sys);
640
973
        dv_init_weight_tables(s, sys);
641
973
        s->sys = sys;
642
973
    }
643
644
1.16k
    s->frame            = frame;
645
1.16k
    avctx->pix_fmt      = s->sys->pix_fmt;
646
1.16k
    avctx->framerate    = av_inv_q(s->sys->time_base);
647
1.16k
    avctx->bit_rate     = av_rescale_q(s->sys->frame_size,
648
1.16k
                                       (AVRational) { 8, 1 },
649
1.16k
                                       s->sys->time_base);
650
651
1.16k
    ret = ff_set_dimensions(avctx, s->sys->width, s->sys->height);
652
1.16k
    if (ret < 0)
653
0
        return ret;
654
655
    /* Determine the codec's sample_aspect ratio from the packet */
656
1.16k
    vsc_pack = buf + 80 * 5 + 48 + 5;
657
1.16k
    if (*vsc_pack == DV_VIDEO_CONTROL) {
658
108
        apt    = buf[4] & 0x07;
659
108
        is16_9 = (vsc_pack[2] & 0x07) == 0x02 ||
660
63
                 (!apt && (vsc_pack[2] & 0x07) == 0x07);
661
108
        ff_set_sar(avctx, s->sys->sar[is16_9]);
662
108
    }
663
664
1.16k
    if ((ret = ff_thread_get_buffer(avctx, frame, 0)) < 0)
665
0
        return ret;
666
667
    /* Determine the codec's field order from the packet */
668
1.16k
    if ( *vsc_pack == DV_VIDEO_CONTROL ) {
669
108
        if (avctx->height == 720) {
670
10
            frame->flags &= ~AV_FRAME_FLAG_INTERLACED;
671
10
            frame->flags &= ~AV_FRAME_FLAG_TOP_FIELD_FIRST;
672
98
        } else if (avctx->height == 1080) {
673
7
            frame->flags |= AV_FRAME_FLAG_INTERLACED;
674
7
            frame->flags |= AV_FRAME_FLAG_TOP_FIELD_FIRST * ((vsc_pack[3] & 0x40) == 0x40);
675
91
        } else {
676
91
            frame->flags |= AV_FRAME_FLAG_INTERLACED * ((vsc_pack[3] & 0x10) == 0x10);
677
91
            frame->flags |= AV_FRAME_FLAG_TOP_FIELD_FIRST * !(vsc_pack[3] & 0x40);
678
91
        }
679
108
    }
680
681
1.16k
    s->buf = buf;
682
1.16k
    avctx->execute(avctx, dv_decode_video_segment, s->work_chunks, NULL,
683
1.16k
                   dv_work_pool_size(s->sys), sizeof(DVwork_chunk));
684
685
    /* return image */
686
1.16k
    *got_frame = 1;
687
688
1.16k
    return s->sys->frame_size;
689
1.16k
}
690
691
const FFCodec ff_dvvideo_decoder = {
692
    .p.name         = "dvvideo",
693
    CODEC_LONG_NAME("DV (Digital Video)"),
694
    .p.type         = AVMEDIA_TYPE_VIDEO,
695
    .p.id           = AV_CODEC_ID_DVVIDEO,
696
    .priv_data_size = sizeof(DVDecContext),
697
    .init           = dvvideo_decode_init,
698
    FF_CODEC_DECODE_CB(dvvideo_decode_frame),
699
    .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_FRAME_THREADS | AV_CODEC_CAP_SLICE_THREADS,
700
    .p.max_lowres   = 3,
701
};