FFmpeg
Loading...
Searching...
No Matches
dvdec.c
Go to the documentation of this file.
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"
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
56typedef 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);
64} BlockInfo;
65
66typedef struct DVDecContext {
68 const AVFrame *frame;
69 const uint8_t *buf;
70
71 uint8_t dv_zigzag[2][64];
73 uint32_t idct_factor[2 * 4 * 16 * 64];
74 void (*idct_put[2])(uint8_t *dest, ptrdiff_t stride, int16_t *block);
75
78
79static const int dv_iweight_bits = 14;
80
81static 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};
91static 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 */
105static 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};
115static 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};
125static 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};
135static 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#define TEX_VLC_BITS 10
147
148/* XXX: also include quantization */
150
151static av_cold void dv_init_static(void)
152{
153 VLCElem vlc_buf[FF_ARRAY_ELEMS(dv_rl_vlc)] = { 0 };
154 VLC dv_vlc = { .table = vlc_buf, .table_allocated = FF_ARRAY_ELEMS(vlc_buf) };
157 int i, j;
158
159 /* it's faster to include sign bit in a generic VLC parsing scheme */
160 for (i = 0, j = 0; i < NB_DV_VLC; i++, j++) {
161 tmp[j].len8 = ff_dv_vlc_len[i];
162 tmp[j].run = ff_dv_vlc_run[i];
163 tmp[j].level = ff_dv_vlc_level[i];
164
165 if (ff_dv_vlc_level[i]) {
166 tmp[j].len8++;
167
168 j++;
169 tmp[j].len8 = ff_dv_vlc_len[i] + 1;
170 tmp[j].run = ff_dv_vlc_run[i];
171 tmp[j].level = -ff_dv_vlc_level[i];
172 }
173 }
174
175 /* NOTE: as a trick, we use the fact the no codes are unused
176 * to accelerate the parsing of partial codes */
178 &tmp[0].len8, sizeof(tmp[0]),
179 NULL, 0, 0, 0, VLC_INIT_USE_STATIC, NULL);
180 av_assert1(dv_vlc.table_size == 1664);
181
182 for (int i = 0; i < dv_vlc.table_size; i++) {
183 int code = dv_vlc.table[i].sym;
184 int len = dv_vlc.table[i].len;
185 int level, run;
186
187 if (len < 0) { // more bits needed
188 run = 0;
189 level = code;
190 } else {
191 av_assert1(i <= code + offset);
192 run = tmp[code].run + 1;
193 level = tmp[code].level;
194 }
195 dv_rl_vlc[i].len8 = len;
196 dv_rl_vlc[i].level = level;
197 dv_rl_vlc[i].run = run;
198 }
199}
200
202{
203 int j, i, c, s;
204 uint32_t *factor1 = &ctx->idct_factor[0],
205 *factor2 = &ctx->idct_factor[DV_PROFILE_IS_HD(d) ? 4096 : 2816];
206
207 if (DV_PROFILE_IS_HD(d)) {
208 /* quantization quanta by QNO for DV100 */
209 static const uint8_t dv100_qstep[16] = {
210 1, /* QNO = 0 and 1 both have no quantization */
211 1,
212 2, 3, 4, 5, 6, 7, 8, 16, 18, 20, 22, 24, 28, 52
213 };
214 const uint16_t *iweight1, *iweight2;
215
216 if (d->height == 720) {
217 iweight1 = &dv_iweight_720_y[0];
218 iweight2 = &dv_iweight_720_c[0];
219 } else {
220 iweight1 = &dv_iweight_1080_y[0];
221 iweight2 = &dv_iweight_1080_c[0];
222 }
223 for (c = 0; c < 4; c++) {
224 for (s = 0; s < 16; s++) {
225 for (i = 0; i < 64; i++) {
226 *factor1++ = (dv100_qstep[s] << (c + 9)) * iweight1[i];
227 *factor2++ = (dv100_qstep[s] << (c + 9)) * iweight2[i];
228 }
229 }
230 }
231 } else {
232 static const uint8_t dv_quant_areas[4] = { 6, 21, 43, 64 };
233 const uint16_t *iweight1 = &dv_iweight_88[0];
234 for (j = 0; j < 2; j++, iweight1 = &dv_iweight_248[0]) {
235 for (s = 0; s < 22; s++) {
236 for (i = c = 0; c < 4; c++) {
237 for (; i < dv_quant_areas[c]; i++) {
238 *factor1 = iweight1[i] << (ff_dv_quant_shifts[s][c] + 1);
239 *factor2++ = (*factor1++) << 1;
240 }
241 }
242 }
243 }
244 }
245}
246
248{
249 static AVOnce init_static_once = AV_ONCE_INIT;
250 DVDecContext *s = avctx->priv_data;
251 int i;
252
254
255 ff_idctdsp_init(&s->idsp, avctx);
256
257 for (i = 0; i < 64; i++)
258 s->dv_zigzag[0][i] = s->idsp.idct_permutation[ff_zigzag_direct[i]];
259
260 if (avctx->lowres){
261 for (i = 0; i < 64; i++){
262 int j = ff_dv_zigzag248_direct[i];
263 s->dv_zigzag[1][i] = s->idsp.idct_permutation[(j & 7) + (j & 8) * 4 + (j & 48) / 2];
264 }
265 }else
266 memcpy(s->dv_zigzag[1], ff_dv_zigzag248_direct, sizeof(s->dv_zigzag[1]));
267
268 s->idct_put[0] = s->idsp.idct_put;
269 s->idct_put[1] = ff_simple_idct248_put;
270
271 ff_thread_once(&init_static_once, dv_init_static);
272
273 return 0;
274}
275
276/* decode AC coefficients */
277static void dv_decode_ac(GetBitContext *gb, BlockInfo *mb, int16_t *block)
278{
279 int last_index = gb->size_in_bits;
280 const uint8_t *scan_table = mb->scan_table;
281 const uint32_t *factor_table = mb->factor_table;
282 int pos = mb->pos;
283 int partial_bit_count = mb->partial_bit_count;
284 int level, run, vlc_len, index;
285
286 OPEN_READER_NOSIZE(re, gb);
287 UPDATE_CACHE(re, gb);
288
289 /* if we must parse a partial VLC, we do it here */
290 if (partial_bit_count > 0) {
291 re_cache = re_cache >> partial_bit_count |
292 mb->partial_bit_buffer;
293 re_index -= partial_bit_count;
294 mb->partial_bit_count = 0;
295 }
296
297 /* get the AC coefficients until last_index is reached */
298 for (;;) {
299 ff_dlog(NULL, "%2d: bits=%04"PRIx32" index=%u\n",
300 pos, SHOW_UBITS(re, gb, 16), re_index);
301 /* our own optimized GET_RL_VLC */
302 index = NEG_USR32(re_cache, TEX_VLC_BITS);
303 vlc_len = dv_rl_vlc[index].len8;
304 if (vlc_len < 0) {
305 index = NEG_USR32((unsigned) re_cache << TEX_VLC_BITS, -vlc_len) +
306 dv_rl_vlc[index].level;
307 vlc_len = TEX_VLC_BITS - vlc_len;
308 }
309 level = dv_rl_vlc[index].level;
310 run = dv_rl_vlc[index].run;
311
312 /* gotta check if we're still within gb boundaries */
313 if (re_index + vlc_len > last_index) {
314 /* should be < 16 bits otherwise a codeword could have been parsed */
315 mb->partial_bit_count = last_index - re_index;
316 mb->partial_bit_buffer = re_cache & ~(-1u >> mb->partial_bit_count);
317 re_index = last_index;
318 break;
319 }
320 re_index += vlc_len;
321
322 ff_dlog(NULL, "run=%d level=%d\n", run, level);
323 pos += run;
324 if (pos >= 64)
325 break;
326
327 level = (level * factor_table[pos] + (1 << (dv_iweight_bits - 1))) >>
329 block[scan_table[pos]] = level;
330
331 UPDATE_CACHE(re, gb);
332 }
333 CLOSE_READER(re, gb);
334 mb->pos = pos;
335}
336
337static inline void bit_copy(PutBitContext *pb, GetBitContext *gb)
338{
339 int bits_left = get_bits_left(gb);
340 while (bits_left >= MIN_CACHE_BITS) {
343 }
344 if (bits_left > 0)
346}
347
348static av_always_inline void put_block_8x4(int16_t *block, uint8_t *restrict p, int stride)
349{
350 int i, j;
351
352 for (i = 0; i < 4; i++) {
353 for (j = 0; j < 8; j++)
354 p[j] = av_clip_uint8(block[j]);
355 block += 8;
356 p += stride;
357 }
358}
359
361 int stride, int16_t *blocks)
362{
363 s->idsp.idct(blocks + 0*64);
364 s->idsp.idct(blocks + 1*64);
365
366 put_block_8x4(blocks+0*64, data, stride<<1);
367 put_block_8x4(blocks+0*64 + 4*8, data + 8, stride<<1);
368 put_block_8x4(blocks+1*64, data + stride, stride<<1);
369 put_block_8x4(blocks+1*64 + 4*8, data + 8 + stride, stride<<1);
370}
371
373 int stride, int16_t *blocks)
374{
375 s->idsp.idct(blocks + 0*64);
376 s->idsp.idct(blocks + 1*64);
377 s->idsp.idct(blocks + 2*64);
378 s->idsp.idct(blocks + 3*64);
379
380 put_block_8x4(blocks+0*64, data, stride<<1);
381 put_block_8x4(blocks+0*64 + 4*8, data + 16, stride<<1);
382 put_block_8x4(blocks+1*64, data + 8, stride<<1);
383 put_block_8x4(blocks+1*64 + 4*8, data + 24, stride<<1);
384 put_block_8x4(blocks+2*64, data + stride, stride<<1);
385 put_block_8x4(blocks+2*64 + 4*8, data + 16 + stride, stride<<1);
386 put_block_8x4(blocks+3*64, data + 8 + stride, stride<<1);
387 put_block_8x4(blocks+3*64 + 4*8, data + 24 + stride, stride<<1);
388}
389
390/* mb_x and mb_y are in units of 8 pixels */
392{
393 const DVDecContext *s = avctx->priv_data;
394 DVwork_chunk *work_chunk = arg;
395 int quant, dc, dct_mode, class1, j;
396 int mb_index, mb_x, mb_y, last_index;
397 int y_stride, linesize;
398 int16_t *block, *block1;
399 int c_offset;
400 uint8_t *y_ptr;
401 const uint8_t *buf_ptr;
402 PutBitContext pb, vs_pb;
403 GetBitContext gb;
404 BlockInfo mb_data[5 * DV_MAX_BPM], *mb, *mb1;
405 LOCAL_ALIGNED_16(int16_t, sblock, [5 * DV_MAX_BPM], [64]);
406 LOCAL_ALIGNED_16(uint8_t, mb_bit_buffer, [80 + AV_INPUT_BUFFER_PADDING_SIZE]); /* allow some slack */
407 LOCAL_ALIGNED_16(uint8_t, vs_bit_buffer, [80 * 5 + AV_INPUT_BUFFER_PADDING_SIZE]); /* allow some slack */
408 const int log2_blocksize = 3 - avctx->lowres;
409 int is_field_mode[5];
410 int vs_bit_buffer_damaged = 0;
411 int mb_bit_buffer_damaged[5] = {0};
412 int retried = 0;
413 int sta;
414
415 av_assert1((((uintptr_t) mb_bit_buffer) & 7) == 0);
416 av_assert1((((uintptr_t) vs_bit_buffer) & 7) == 0);
417
418retry:
419
420 memset(sblock, 0, 5 * DV_MAX_BPM * sizeof(*sblock));
421
422 /* pass 1: read DC and AC coefficients in blocks */
423 buf_ptr = &s->buf[work_chunk->buf_offset * 80];
424 block1 = &sblock[0][0];
425 mb1 = mb_data;
426 init_put_bits(&vs_pb, vs_bit_buffer, 5 * 80);
427 for (mb_index = 0; mb_index < 5; mb_index++, mb1 += s->sys->bpm, block1 += s->sys->bpm * 64) {
428 /* skip header */
429 quant = buf_ptr[3] & 0x0f;
430 if (avctx->error_concealment) {
431 if ((buf_ptr[3] >> 4) == 0x0E)
432 vs_bit_buffer_damaged = 1;
433 if (!mb_index) {
434 sta = buf_ptr[3] >> 4;
435 } else if (sta != (buf_ptr[3] >> 4))
436 vs_bit_buffer_damaged = 1;
437 }
438 buf_ptr += 4;
439 init_put_bits(&pb, mb_bit_buffer, 80);
440 mb = mb1;
441 block = block1;
442 is_field_mode[mb_index] = 0;
443 for (j = 0; j < s->sys->bpm; j++) {
444 last_index = s->sys->block_sizes[j];
445 init_get_bits(&gb, buf_ptr, last_index);
446
447 /* get the DC */
448 dc = get_sbits(&gb, 9);
449 dct_mode = get_bits1(&gb);
450 class1 = get_bits(&gb, 2);
451 if (DV_PROFILE_IS_HD(s->sys)) {
452 mb->idct_put = s->idct_put[0];
453 mb->scan_table = s->dv_zigzag[0];
454 mb->factor_table = &s->idct_factor[(j >= 4) * 4 * 16 * 64 +
455 class1 * 16 * 64 +
456 quant * 64];
457 is_field_mode[mb_index] |= !j && dct_mode;
458 } else {
459 mb->idct_put = s->idct_put[dct_mode && log2_blocksize == 3];
460 mb->scan_table = s->dv_zigzag[dct_mode];
461 mb->factor_table =
462 &s->idct_factor[(class1 == 3) * 2 * 22 * 64 +
463 dct_mode * 22 * 64 +
464 (quant + ff_dv_quant_offset[class1]) * 64];
465 }
466 dc = dc * 4;
467 /* convert to unsigned because 128 is not added in the
468 * standard IDCT */
469 dc += 1024;
470 block[0] = dc;
471 buf_ptr += last_index >> 3;
472 mb->pos = 0;
473 mb->partial_bit_count = 0;
474
475 ff_dlog(avctx, "MB block: %d, %d ", mb_index, j);
476 dv_decode_ac(&gb, mb, block);
477
478 /* write the remaining bits in a new buffer only if the
479 * block is finished */
480 if (mb->pos >= 64)
481 bit_copy(&pb, &gb);
482 if (mb->pos >= 64 && mb->pos < 127)
483 vs_bit_buffer_damaged = mb_bit_buffer_damaged[mb_index] = 1;
484
485 block += 64;
486 mb++;
487 }
488
489 if (mb_bit_buffer_damaged[mb_index] > 0)
490 continue;
491
492 /* pass 2: we can do it just after */
493 ff_dlog(avctx, "***pass 2 size=%d MB#=%d\n", put_bits_count(&pb), mb_index);
494 block = block1;
495 mb = mb1;
496 init_get_bits(&gb, mb_bit_buffer, put_bits_count(&pb));
497 put_bits32(&pb, 0); // padding must be zeroed
498 flush_put_bits(&pb);
499 for (j = 0; j < s->sys->bpm; j++, block += 64, mb++) {
500 if (mb->pos < 64 && get_bits_left(&gb) > 0) {
501 dv_decode_ac(&gb, mb, block);
502 /* if still not finished, no need to parse other blocks */
503 if (mb->pos < 64)
504 break;
505 if (mb->pos < 127)
506 vs_bit_buffer_damaged = mb_bit_buffer_damaged[mb_index] = 1;
507 }
508 }
509 /* all blocks are finished, so the extra bytes can be used at
510 * the video segment level */
511 if (j >= s->sys->bpm)
512 bit_copy(&vs_pb, &gb);
513 }
514
515 /* we need a pass over the whole video segment */
516 ff_dlog(avctx, "***pass 3 size=%d\n", put_bits_count(&vs_pb));
517 block = &sblock[0][0];
518 mb = mb_data;
519 init_get_bits(&gb, vs_bit_buffer, put_bits_count(&vs_pb));
520 put_bits32(&vs_pb, 0); // padding must be zeroed
521 flush_put_bits(&vs_pb);
522 for (mb_index = 0; mb_index < 5; mb_index++) {
523 for (j = 0; j < s->sys->bpm; j++) {
524 if (mb->pos < 64 && get_bits_left(&gb) > 0 && !vs_bit_buffer_damaged) {
525 ff_dlog(avctx, "start %d:%d\n", mb_index, j);
526 dv_decode_ac(&gb, mb, block);
527 }
528
529 if (mb->pos >= 64 && mb->pos < 127) {
530 av_log(avctx, AV_LOG_ERROR,
531 "AC EOB marker is absent pos=%d\n", mb->pos);
532 vs_bit_buffer_damaged = 1;
533 }
534 block += 64;
535 mb++;
536 }
537 }
538 if (vs_bit_buffer_damaged && !retried) {
539 av_log(avctx, AV_LOG_ERROR, "Concealing bitstream errors\n");
540 retried = 1;
541 goto retry;
542 }
543
544 /* compute idct and place blocks */
545 block = &sblock[0][0];
546 mb = mb_data;
547 for (mb_index = 0; mb_index < 5; mb_index++) {
548 dv_calculate_mb_xy(s->sys, s->buf, work_chunk, mb_index, &mb_x, &mb_y);
549
550 /* idct_put'ting luminance */
551 if ((s->sys->pix_fmt == AV_PIX_FMT_YUV420P) ||
552 (s->sys->pix_fmt == AV_PIX_FMT_YUV411P && mb_x >= (704 / 8)) ||
553 (s->sys->height >= 720 && mb_y != 134)) {
554 y_stride = (s->frame->linesize[0] <<
555 ((!is_field_mode[mb_index]) * log2_blocksize));
556 } else {
557 y_stride = (2 << log2_blocksize);
558 }
559 y_ptr = s->frame->data[0] +
560 ((mb_y * s->frame->linesize[0] + mb_x) << log2_blocksize);
561 if (mb_y == 134 && is_field_mode[mb_index]) {
562 dv100_idct_put_last_row_field_luma(s, y_ptr, s->frame->linesize[0], block);
563 } else {
564 linesize = s->frame->linesize[0] << is_field_mode[mb_index];
565 mb[0].idct_put(y_ptr, linesize, block + 0 * 64);
566 if (s->sys->video_stype == 4) { /* SD 422 */
567 mb[2].idct_put(y_ptr + (1 << log2_blocksize), linesize, block + 2 * 64);
568 } else {
569 mb[1].idct_put(y_ptr + (1 << log2_blocksize), linesize, block + 1 * 64);
570 mb[2].idct_put(y_ptr + y_stride, linesize, block + 2 * 64);
571 mb[3].idct_put(y_ptr + (1 << log2_blocksize) + y_stride, linesize, block + 3 * 64);
572 }
573 }
574 mb += 4;
575 block += 4 * 64;
576
577 /* idct_put'ting chrominance */
578 c_offset = (((mb_y >> (s->sys->pix_fmt == AV_PIX_FMT_YUV420P)) * s->frame->linesize[1] +
579 (mb_x >> ((s->sys->pix_fmt == AV_PIX_FMT_YUV411P) ? 2 : 1))) << log2_blocksize);
580 for (j = 2; j; j--) {
581 uint8_t *c_ptr = s->frame->data[j] + c_offset;
582 if (s->sys->pix_fmt == AV_PIX_FMT_YUV411P && mb_x >= (704 / 8)) {
583 uint64_t aligned_pixels[64 / 8];
584 uint8_t *pixels = (uint8_t *) aligned_pixels;
585 uint8_t *c_ptr1, *ptr1;
586 int x, y;
587 mb->idct_put(pixels, 8, block);
588 for (y = 0; y < (1 << log2_blocksize); y++, c_ptr += s->frame->linesize[j], pixels += 8) {
589 ptr1 = pixels + ((1 << (log2_blocksize))>>1);
590 c_ptr1 = c_ptr + (s->frame->linesize[j] << log2_blocksize);
591 for (x = 0; x < (1 << FFMAX(log2_blocksize - 1, 0)); x++) {
592 c_ptr[x] = pixels[x];
593 c_ptr1[x] = ptr1[x];
594 }
595 }
596 block += 64;
597 mb++;
598 } else {
599 y_stride = (mb_y == 134) ? (1 << log2_blocksize) :
600 s->frame->linesize[j] << ((!is_field_mode[mb_index]) * log2_blocksize);
601 if (mb_y == 134 && is_field_mode[mb_index]) {
602 dv100_idct_put_last_row_field_chroma(s, c_ptr, s->frame->linesize[j], block);
603 mb += 2;
604 block += 2*64;
605 } else {
606 linesize = s->frame->linesize[j] << is_field_mode[mb_index];
607 (mb++)->idct_put(c_ptr, linesize, block);
608 block += 64;
609 if (s->sys->bpm == 8) {
610 (mb++)->idct_put(c_ptr + y_stride, linesize, block);
611 block += 64;
612 }
613 }
614 }
615 }
616 }
617 return 0;
618}
619
620/* NOTE: exactly one frame must be given (120000 bytes for NTSC,
621 * 144000 bytes for PAL - or twice those for 50Mbps) */
623 int *got_frame, AVPacket *avpkt)
624{
625 uint8_t *buf = avpkt->data;
626 int buf_size = avpkt->size;
627 DVDecContext *s = avctx->priv_data;
628 const uint8_t *vsc_pack;
629 int apt, is16_9, ret;
630 const AVDVProfile *sys;
631
632 sys = ff_dv_frame_profile(avctx, s->sys, buf, buf_size);
633 if (!sys || buf_size < sys->frame_size) {
634 av_log(avctx, AV_LOG_ERROR, "could not find dv frame profile\n");
635 return -1; /* NOTE: we only accept several full frames */
636 }
637
638 if (sys != s->sys) {
639 ff_dv_init_dynamic_tables(s->work_chunks, sys);
641 s->sys = sys;
642 }
643
644 s->frame = frame;
645 avctx->pix_fmt = s->sys->pix_fmt;
646 avctx->framerate = av_inv_q(s->sys->time_base);
647 avctx->bit_rate = av_rescale_q(s->sys->frame_size,
648 (AVRational) { 8, 1 },
649 s->sys->time_base);
650
651 ret = ff_set_dimensions(avctx, s->sys->width, s->sys->height);
652 if (ret < 0)
653 return ret;
654
655 /* Determine the codec's sample_aspect ratio from the packet */
656 vsc_pack = buf + 80 * 5 + 48 + 5;
657 if (*vsc_pack == DV_VIDEO_CONTROL) {
658 apt = buf[4] & 0x07;
659 is16_9 = (vsc_pack[2] & 0x07) == 0x02 ||
660 (!apt && (vsc_pack[2] & 0x07) == 0x07);
661 ff_set_sar(avctx, s->sys->sar[is16_9]);
662 }
663
664 if ((ret = ff_thread_get_buffer(avctx, frame, 0)) < 0)
665 return ret;
666
667 /* Determine the codec's field order from the packet */
668 if ( *vsc_pack == DV_VIDEO_CONTROL ) {
669 if (avctx->height == 720) {
672 } else if (avctx->height == 1080) {
674 frame->flags |= AV_FRAME_FLAG_TOP_FIELD_FIRST * ((vsc_pack[3] & 0x40) == 0x40);
675 } else {
676 frame->flags |= AV_FRAME_FLAG_INTERLACED * ((vsc_pack[3] & 0x10) == 0x10);
677 frame->flags |= AV_FRAME_FLAG_TOP_FIELD_FIRST * !(vsc_pack[3] & 0x40);
678 }
679 }
680
681 s->buf = buf;
682 avctx->execute(avctx, dv_decode_video_segment, s->work_chunks, NULL,
683 dv_work_pool_size(s->sys), sizeof(DVwork_chunk));
684
685 /* return image */
686 *got_frame = 1;
687
688 return s->sys->frame_size;
689}
690
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),
700 .p.max_lowres = 3,
701};
const FFCodec ff_dvvideo_decoder
Definition dvdec.c:691
simple assert() macros that are a bit more flexible than ISO C assert().
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
Definition avassert.h:58
Libavcodec external API header.
#define bits_left
Definition bitstream.h:116
#define i(width, name, range_min, range_max)
Definition cbs_h264.c:63
#define mb(name)
Definition cbs_lcevc.c:95
#define s(width, name)
Definition cbs_vp9.c:198
#define FF_CODEC_DECODE_CB(func)
#define CODEC_LONG_NAME(str)
#define av_clip_uint8
Definition common.h:106
#define NULL
Definition coverity.c:32
static int16_t block[64]
Definition dct.c:125
static int16_t block1[64]
Definition dct.c:126
int ff_set_sar(AVCodecContext *avctx, AVRational sar)
Check that the provided sample aspect ratio is valid and set it on the codec context.
Definition utils.c:106
int ff_set_dimensions(AVCodecContext *s, int width, int height)
Definition utils.c:91
static AVFrame * frame
int(* init)(AVBSFContext *ctx)
Definition dts2pts.c:608
static int dv_work_pool_size(const AVDVProfile *d)
Definition dv_internal.h:37
static void dv_calculate_mb_xy(const AVDVProfile *sys, const uint8_t *buf, const DVwork_chunk *work_chunk, int m, int *mb_x, int *mb_y)
Definition dv_internal.h:47
const AVDVProfile * ff_dv_frame_profile(AVCodecContext *codec, const AVDVProfile *sys, const uint8_t *frame, unsigned buf_size)
Get a DV profile for the provided compressed frame.
Definition dv_profile.c:261
const uint8_t ff_dv_quant_offset[4]
Definition dvdata.c:70
const uint8_t ff_dv_zigzag248_direct[64]
Definition dvdata.c:33
const uint8_t ff_dv_vlc_len[NB_DV_VLC]
Definition dvdata.c:77
const uint8_t ff_dv_quant_shifts[22][4]
Definition dvdata.c:45
const uint8_t ff_dv_vlc_run[NB_DV_VLC]
Definition dvdata.c:131
const uint8_t ff_dv_vlc_level[NB_DV_VLC]
Definition dvdata.c:185
#define NB_DV_VLC
Definition dvdata.h:29
#define NB_DV_ZERO_LEVEL_ENTRIES
Definition dvdata.h:31
#define TEX_VLC_BITS
Definition dvdec.c:146
static void dv100_idct_put_last_row_field_chroma(const DVDecContext *s, uint8_t *data, int stride, int16_t *blocks)
Definition dvdec.c:360
static const uint16_t dv_iweight_1080_y[64]
The "inverse" DV100 weights are actually just the spec weights (zig-zagged).
Definition dvdec.c:105
static av_cold void dv_init_static(void)
Definition dvdec.c:151
static av_always_inline void put_block_8x4(int16_t *block, uint8_t *restrict p, int stride)
Definition dvdec.c:348
static const uint16_t dv_iweight_720_c[64]
Definition dvdec.c:135
static av_cold int dvvideo_decode_init(AVCodecContext *avctx)
Definition dvdec.c:247
static const uint16_t dv_iweight_248[64]
Definition dvdec.c:91
static void dv100_idct_put_last_row_field_luma(const DVDecContext *s, uint8_t *data, int stride, int16_t *blocks)
Definition dvdec.c:372
static void bit_copy(PutBitContext *pb, GetBitContext *gb)
Definition dvdec.c:337
static const uint16_t dv_iweight_720_y[64]
Definition dvdec.c:125
static void dv_init_weight_tables(DVDecContext *ctx, const AVDVProfile *d)
Definition dvdec.c:201
static const uint16_t dv_iweight_88[64]
Definition dvdec.c:81
static const int dv_iweight_bits
Definition dvdec.c:79
static int dvvideo_decode_frame(AVCodecContext *avctx, AVFrame *frame, int *got_frame, AVPacket *avpkt)
Definition dvdec.c:622
static const uint16_t dv_iweight_1080_c[64]
Definition dvdec.c:115
static int dv_decode_video_segment(AVCodecContext *avctx, void *arg)
Definition dvdec.c:391
static RL_VLC_ELEM dv_rl_vlc[1664]
Definition dvdec.c:149
static void dv_decode_ac(GetBitContext *gb, BlockInfo *mb, int16_t *block)
Definition dvdec.c:277
static const uint8_t frame_size[4]
Definition g723_1.h:222
bitstream reader API header.
static int get_sbits(GetBitContext *s, int n)
Definition get_bits.h:322
#define CLOSE_READER(name, gb)
Definition get_bits.h:189
static int get_bits_left(GetBitContext *gb)
Definition get_bits.h:688
#define SHOW_UBITS(name, gb, num)
Definition get_bits.h:247
static unsigned int get_bits1(GetBitContext *s)
Definition get_bits.h:391
#define OPEN_READER_NOSIZE(name, gb)
Definition get_bits.h:172
#define UPDATE_CACHE(name, gb)
Definition get_bits.h:213
#define MIN_CACHE_BITS
Definition get_bits.h:167
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
Definition get_bits.h:337
static int init_get_bits(GetBitContext *s, const uint8_t *buffer, int bit_size)
Initialize GetBitContext.
Definition get_bits.h:517
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
Definition codec.h:49
#define AV_CODEC_CAP_SLICE_THREADS
Codec supports slice-based (or partition-based) multithreading.
Definition codec.h:102
#define AV_CODEC_CAP_FRAME_THREADS
Codec supports frame-level multithreading.
Definition codec.h:98
@ AV_CODEC_ID_DVVIDEO
Definition codec_id.h:74
#define AV_INPUT_BUFFER_PADDING_SIZE
Required number of additionally allocated bytes at the end of the input bitstream for decoding.
Definition defs.h:40
#define AV_FRAME_FLAG_INTERLACED
A flag to mark frames whose content is interlaced.
Definition frame.h:695
#define AV_FRAME_FLAG_TOP_FIELD_FIRST
A flag to mark frames where the top field is displayed first if the content is interlaced.
Definition frame.h:700
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition log.h:210
static av_always_inline AVRational av_inv_q(AVRational q)
Invert a rational.
Definition rational.h:159
int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq)
Rescale a 64-bit integer by 2 rational numbers.
@ AVMEDIA_TYPE_VIDEO
Definition avutil.h:200
int index
Definition gxfenc.c:90
static void put_bits(Jpeg2000EncoderContext *s, int val, int n)
put n times val bit
Definition j2kenc.c:154
unsigned offset
Definition libaomenc.c:763
static void idct_put(FourXContext *f, int x, int y)
Definition 4xm.c:559
void ff_dv_init_dynamic_tables(DVwork_chunk *work_chunks, const AVDVProfile *d)
Definition dv.c:170
Constants for DV codec.
@ DV_VIDEO_CONTROL
Definition dv.h:47
#define DV_MAX_BPM
maximum number of blocks per macroblock in any DV format
Definition dv.h:72
#define DV_PROFILE_IS_HD(p)
Definition dv.h:53
av_cold void ff_idctdsp_init(IDCTDSPContext *c, AVCodecContext *avctx)
Definition idctdsp.c:228
const char * arg
Definition jacosubdec.c:65
Multithreading API for decoders.
#define av_always_inline
Definition attributes.h:72
#define av_cold
Definition attributes.h:117
common internal API header
#define AVOnce
Definition thread.h:202
static int ff_thread_once(char *control, void(*routine)(void))
Definition thread.h:205
#define AV_ONCE_INIT
Definition thread.h:203
#define FFMAX(a, b)
Definition macros.h:47
const uint8_t ff_zigzag_direct[64]
Definition mathtables.c:137
#define NEG_USR32(a, s)
Definition mathops.h:180
#define LOCAL_ALIGNED_16(t, v,...)
const char data[16]
Definition mxf.c:149
@ AVCHROMA_LOC_TOPLEFT
ITU-R 601, SMPTE 274M 296M S314M(DV 4:1:1), mpeg2 4:2:2.
Definition pixfmt.h:806
@ AV_PIX_FMT_YUV420P
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
Definition pixfmt.h:73
@ AV_PIX_FMT_YUV411P
planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples)
Definition pixfmt.h:80
int ff_thread_get_buffer(AVCodecContext *avctx, AVFrame *f, int flags)
Wrapper around get_buffer() for frame-multithreaded codecs.
bitstream writer API
static void init_put_bits(PutBitContext *s, uint8_t *buffer, int buffer_size)
Initialize the PutBitContext s.
Definition put_bits.h:62
static int put_bits_count(PutBitContext *s)
Definition put_bits.h:90
static void flush_put_bits(PutBitContext *s)
Pad the end of the output stream with zeros.
Definition put_bits.h:153
static av_unused void put_bits32(PutBitContext *s, uint32_t value)
Write exactly 32 bits into a bitstream.
Definition put_bits.h:301
void ff_simple_idct248_put(uint8_t *dest, ptrdiff_t line_size, int16_t *block)
simple idct header.
#define FF_ARRAY_ELEMS(a)
const uint8_t * code
Definition spdifenc.c:433
unsigned int pos
Definition spdifenc.c:431
main external API structure.
Definition avcodec.h:443
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
Definition avcodec.h:643
int error_concealment
error concealment flags
Definition avcodec.h:1382
AVRational framerate
Definition avcodec.h:563
int64_t bit_rate
the average bitrate
Definition avcodec.h:493
int(* execute)(struct AVCodecContext *c, int(*func)(struct AVCodecContext *c2, void *arg), void *arg2, int *ret, int count, int size)
The codec may call this to execute several independent things.
Definition avcodec.h:1609
enum AVChromaLocation chroma_sample_location
This defines the location of chroma samples.
Definition avcodec.h:688
int lowres
low resolution decoding, 1-> 1/2 size, 2->1/4 size
Definition avcodec.h:1702
void * priv_data
Definition avcodec.h:470
This structure describes decoded (raw) audio or video data.
Definition frame.h:472
This structure stores compressed data.
Definition packet.h:580
int size
Definition packet.h:604
uint8_t * data
Definition packet.h:603
Rational number (pair of numerator and denominator).
Definition rational.h:58
uint8_t pos
Definition dvdec.c:59
void(* idct_put)(uint8_t *dest, ptrdiff_t stride, int16_t *block)
Definition dvdec.c:60
uint32_t partial_bit_buffer
Definition dvdec.c:62
const uint32_t * factor_table
Definition dvdec.c:57
const uint8_t * scan_table
Definition dvdec.c:58
int shift_offset
Definition dvdec.c:63
uint8_t partial_bit_count
Definition dvdec.c:61
const AVDVProfile * sys
Definition dvdec.c:67
DVwork_chunk work_chunks[4 *12 *27]
Definition dvdec.c:72
uint8_t dv_zigzag[2][64]
Definition dvdec.c:71
uint32_t idct_factor[2 *4 *16 *64]
Definition dvdec.c:73
IDCTDSPContext idsp
Definition dvdec.c:76
const AVFrame * frame
Definition dvdec.c:68
const uint8_t * buf
Definition dvdec.c:69
void(* idct_put[2])(uint8_t *dest, ptrdiff_t stride, int16_t *block)
Definition dvdec.c:74
uint16_t buf_offset
Definition dv_internal.h:31
Definition vlc.h:32
VLCBaseType len
Definition vlc.h:37
VLCBaseType sym
Definition vlc.h:36
Definition vlc.h:50
int table_size
Definition vlc.h:53
VLCElem * table
Definition vlc.h:52
uint8_t run
Definition svq3.c:207
uint8_t level
Definition svq3.c:208
#define stride
#define ff_dlog(a,...)
#define av_log(a,...)
static uint8_t tmp[40]
Definition aes_ctr.c:52
static AVFormatContext * ctx
Definition movenc.c:49
int ff_vlc_init_from_lengths(VLC *vlc, int nb_bits, int nb_codes, const int8_t *lens, int lens_wrap, const void *symbols, int symbols_wrap, int symbols_size, int offset, int flags, void *logctx)
Build VLC decoding tables suitable for use with get_vlc2()
Definition vlc.c:306
#define VLC_INIT_USE_STATIC
Definition vlc.h:190
VLCElem RL_VLC_ELEM
Definition vlc.h:48
static const uint8_t quant[64]
Definition vmixdec.c:71
int len
static double c[64]