3 * Copyright (c) 2002 Fabrice Bellard.
4 * Copyright (c) 2004 Roman Shaposhnik.
7 * Copyright (c) 2003 Roman Shaposhnik.
9 * 50 Mbps (DVCPRO50) support
10 * Copyright (c) 2006 Daniel Maas <dmaas@maasdigital.com>
12 * 100 Mbps (DVCPRO HD) support
13 * Initial code by Daniel Maas <dmaas@maasdigital.com> (funded by BBC R&D)
14 * Final code by Roman Shaposhnik
16 * Many thanks to Dan Dennedy <dan@dennedy.org> for providing wealth
17 * of DV technical info.
19 * This file is part of FFmpeg.
21 * FFmpeg is free software; you can redistribute it and/or
22 * modify it under the terms of the GNU Lesser General Public
23 * License as published by the Free Software Foundation; either
24 * version 2.1 of the License, or (at your option) any later version.
26 * FFmpeg is distributed in the hope that it will be useful,
27 * but WITHOUT ANY WARRANTY; without even the implied warranty of
28 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
29 * Lesser General Public License for more details.
31 * You should have received a copy of the GNU Lesser General Public
32 * License along with FFmpeg; if not, write to the Free Software
33 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
40 #define ALT_BITSTREAM_READER
43 #include "bitstream.h"
44 #include "simple_idct.h"
50 typedef struct DVVideoContext {
53 AVCodecContext *avctx;
56 uint8_t dv_zigzag[2][64];
57 uint32_t dv_idct_factor[2][2][22][64];
58 uint32_t dv100_idct_factor[4][4][16][64];
60 void (*get_pixels)(DCTELEM *block, const uint8_t *pixels, int line_size);
61 void (*fdct[2])(DCTELEM *block);
62 void (*idct_put[2])(uint8_t *dest, int line_size, DCTELEM *block);
66 * MultiThreading - dv_anchor applies to entire DV codec, not just the avcontext
67 * one element is needed for each video segment in a DV frame
68 * at most there are 4 DIF channels * 12 DIF sequences * 27 video segments (1080i50)
70 #define DV_ANCHOR_SIZE (4*12*27)
72 static void* dv_anchor[DV_ANCHOR_SIZE];
74 #define TEX_VLC_BITS 9
77 #define DV_VLC_MAP_RUN_SIZE 15
78 #define DV_VLC_MAP_LEV_SIZE 23
80 #define DV_VLC_MAP_RUN_SIZE 64
81 #define DV_VLC_MAP_LEV_SIZE 512 //FIXME sign was removed so this should be /2 but needs check
84 /* XXX: also include quantization */
85 static RL_VLC_ELEM dv_rl_vlc[1184];
86 /* VLC encoding lookup table */
87 static struct dv_vlc_pair {
90 } dv_vlc_map[DV_VLC_MAP_RUN_SIZE][DV_VLC_MAP_LEV_SIZE];
92 static void dv_build_unquantize_tables(DVVideoContext *s, uint8_t* perm)
96 /* NOTE: max left shift is 6 */
97 for (q = 0; q < 22; q++) {
100 for (a = 0; a < 4; a++) {
101 for (; i < dv_quant_areas[a]; i++) {
103 s->dv_idct_factor[0][0][q][i] = dv_iweight_88[i] << (dv_quant_shifts[q][a] + 1);
104 s->dv_idct_factor[1][0][q][i] = s->dv_idct_factor[0][0][q][i] << 1;
107 s->dv_idct_factor[0][1][q][i] = dv_iweight_248[i] << (dv_quant_shifts[q][a] + 1);
108 s->dv_idct_factor[1][1][q][i] = s->dv_idct_factor[0][1][q][i] << 1;
113 for (a = 0; a < 4; a++) {
114 for (q = 0; q < 16; q++) {
115 for (i = 1; i < 64; i++) {
116 s->dv100_idct_factor[0][a][q][i] = (dv100_qstep[q] << (a + 9)) * dv_iweight_1080_y[i];
117 s->dv100_idct_factor[1][a][q][i] = (dv100_qstep[q] << (a + 9)) * dv_iweight_1080_c[i];
118 s->dv100_idct_factor[2][a][q][i] = (dv100_qstep[q] << (a + 9)) * dv_iweight_720_y[i];
119 s->dv100_idct_factor[3][a][q][i] = (dv100_qstep[q] << (a + 9)) * dv_iweight_720_c[i];
125 static av_cold int dvvideo_init(AVCodecContext *avctx)
127 DVVideoContext *s = avctx->priv_data;
134 uint16_t new_dv_vlc_bits[NB_DV_VLC*2];
135 uint8_t new_dv_vlc_len[NB_DV_VLC*2];
136 uint8_t new_dv_vlc_run[NB_DV_VLC*2];
137 int16_t new_dv_vlc_level[NB_DV_VLC*2];
141 /* dv_anchor lets each thread know its ID */
142 for (i = 0; i < DV_ANCHOR_SIZE; i++)
143 dv_anchor[i] = (void*)(size_t)i;
145 /* it's faster to include sign bit in a generic VLC parsing scheme */
146 for (i = 0, j = 0; i < NB_DV_VLC; i++, j++) {
147 new_dv_vlc_bits[j] = dv_vlc_bits[i];
148 new_dv_vlc_len[j] = dv_vlc_len[i];
149 new_dv_vlc_run[j] = dv_vlc_run[i];
150 new_dv_vlc_level[j] = dv_vlc_level[i];
152 if (dv_vlc_level[i]) {
153 new_dv_vlc_bits[j] <<= 1;
157 new_dv_vlc_bits[j] = (dv_vlc_bits[i] << 1) | 1;
158 new_dv_vlc_len[j] = dv_vlc_len[i] + 1;
159 new_dv_vlc_run[j] = dv_vlc_run[i];
160 new_dv_vlc_level[j] = -dv_vlc_level[i];
164 /* NOTE: as a trick, we use the fact the no codes are unused
165 to accelerate the parsing of partial codes */
166 init_vlc(&dv_vlc, TEX_VLC_BITS, j,
167 new_dv_vlc_len, 1, 1, new_dv_vlc_bits, 2, 2, 0);
168 assert(dv_vlc.table_size == 1184);
170 for (i = 0; i < dv_vlc.table_size; i++){
171 int code = dv_vlc.table[i][0];
172 int len = dv_vlc.table[i][1];
175 if (len < 0){ //more bits needed
179 run = new_dv_vlc_run [code] + 1;
180 level = new_dv_vlc_level[code];
182 dv_rl_vlc[i].len = len;
183 dv_rl_vlc[i].level = level;
184 dv_rl_vlc[i].run = run;
188 for (i = 0; i < NB_DV_VLC - 1; i++) {
189 if (dv_vlc_run[i] >= DV_VLC_MAP_RUN_SIZE)
192 if (dv_vlc_level[i] >= DV_VLC_MAP_LEV_SIZE)
196 if (dv_vlc_map[dv_vlc_run[i]][dv_vlc_level[i]].size != 0)
199 dv_vlc_map[dv_vlc_run[i]][dv_vlc_level[i]].vlc =
200 dv_vlc_bits[i] << (!!dv_vlc_level[i]);
201 dv_vlc_map[dv_vlc_run[i]][dv_vlc_level[i]].size =
202 dv_vlc_len[i] + (!!dv_vlc_level[i]);
204 for (i = 0; i < DV_VLC_MAP_RUN_SIZE; i++) {
206 for (j = 1; j < DV_VLC_MAP_LEV_SIZE; j++) {
207 if (dv_vlc_map[i][j].size == 0) {
208 dv_vlc_map[i][j].vlc = dv_vlc_map[0][j].vlc |
209 (dv_vlc_map[i-1][0].vlc << (dv_vlc_map[0][j].size));
210 dv_vlc_map[i][j].size = dv_vlc_map[i-1][0].size +
211 dv_vlc_map[0][j].size;
215 for (j = 1; j < DV_VLC_MAP_LEV_SIZE/2; j++) {
216 if (dv_vlc_map[i][j].size == 0) {
217 dv_vlc_map[i][j].vlc = dv_vlc_map[0][j].vlc |
218 (dv_vlc_map[i-1][0].vlc << (dv_vlc_map[0][j].size));
219 dv_vlc_map[i][j].size = dv_vlc_map[i-1][0].size +
220 dv_vlc_map[0][j].size;
222 dv_vlc_map[i][((uint16_t)(-j))&0x1ff].vlc =
223 dv_vlc_map[i][j].vlc | 1;
224 dv_vlc_map[i][((uint16_t)(-j))&0x1ff].size =
225 dv_vlc_map[i][j].size;
231 /* Generic DSP setup */
232 dsputil_init(&dsp, avctx);
233 s->get_pixels = dsp.get_pixels;
236 s->fdct[0] = dsp.fdct;
237 s->idct_put[0] = dsp.idct_put;
238 for (i = 0; i < 64; i++)
239 s->dv_zigzag[0][i] = dsp.idct_permutation[ff_zigzag_direct[i]];
242 s->fdct[1] = dsp.fdct248;
243 s->idct_put[1] = ff_simple_idct248_put; // FIXME: need to add it to DSP
245 for (i = 0; i < 64; i++){
246 int j = ff_zigzag248_direct[i];
247 s->dv_zigzag[1][i] = dsp.idct_permutation[(j & 7) + (j & 8) * 4 + (j & 48) / 2];
250 memcpy(s->dv_zigzag[1], ff_zigzag248_direct, 64);
252 /* XXX: do it only for constant case */
253 dv_build_unquantize_tables(s, dsp.idct_permutation);
255 avctx->coded_frame = &s->picture;
262 // #define printf(...) av_log(NULL, AV_LOG_ERROR, __VA_ARGS__)
264 typedef struct BlockInfo {
265 const uint32_t *factor_table;
266 const uint8_t *scan_table;
267 uint8_t pos; /* position in block */
268 void (*idct_put)(uint8_t *dest, int line_size, DCTELEM *block);
269 uint8_t partial_bit_count;
270 uint16_t partial_bit_buffer;
274 /* bit budget for AC only in 5 MBs */
275 static const int vs_total_ac_bits = (100 * 4 + 68*2) * 5;
276 /* see dv_88_areas and dv_248_areas for details */
277 static const int mb_area_start[5] = { 1, 6, 21, 43, 64 };
279 static inline int get_bits_left(GetBitContext *s)
281 return s->size_in_bits - get_bits_count(s);
284 static inline int put_bits_left(PutBitContext* s)
286 return (s->buf_end - s->buf) * 8 - put_bits_count(s);
289 /* decode ac coefficients */
290 static void dv_decode_ac(GetBitContext *gb, BlockInfo *mb, DCTELEM *block)
292 int last_index = gb->size_in_bits;
293 const uint8_t *scan_table = mb->scan_table;
294 const uint32_t *factor_table = mb->factor_table;
296 int partial_bit_count = mb->partial_bit_count;
297 int level, run, vlc_len, index;
300 UPDATE_CACHE(re, gb);
302 /* if we must parse a partial vlc, we do it here */
303 if (partial_bit_count > 0) {
304 re_cache = ((unsigned)re_cache >> partial_bit_count) |
305 (mb->partial_bit_buffer << (sizeof(re_cache) * 8 - partial_bit_count));
306 re_index -= partial_bit_count;
307 mb->partial_bit_count = 0;
310 /* get the AC coefficients until last_index is reached */
313 printf("%2d: bits=%04x index=%d\n", pos, SHOW_UBITS(re, gb, 16), re_index);
315 /* our own optimized GET_RL_VLC */
316 index = NEG_USR32(re_cache, TEX_VLC_BITS);
317 vlc_len = dv_rl_vlc[index].len;
319 index = NEG_USR32((unsigned)re_cache << TEX_VLC_BITS, -vlc_len) + dv_rl_vlc[index].level;
320 vlc_len = TEX_VLC_BITS - vlc_len;
322 level = dv_rl_vlc[index].level;
323 run = dv_rl_vlc[index].run;
325 /* gotta check if we're still within gb boundaries */
326 if (re_index + vlc_len > last_index) {
327 /* should be < 16 bits otherwise a codeword could have been parsed */
328 mb->partial_bit_count = last_index - re_index;
329 mb->partial_bit_buffer = NEG_USR32(re_cache, mb->partial_bit_count);
330 re_index = last_index;
336 printf("run=%d level=%d\n", run, level);
342 level = (level * factor_table[pos] + (1 << (dv_iweight_bits - 1))) >> dv_iweight_bits;
343 block[scan_table[pos]] = level;
345 UPDATE_CACHE(re, gb);
347 CLOSE_READER(re, gb);
351 static inline void bit_copy(PutBitContext *pb, GetBitContext *gb)
353 int bits_left = get_bits_left(gb);
354 while (bits_left >= MIN_CACHE_BITS) {
355 put_bits(pb, MIN_CACHE_BITS, get_bits(gb, MIN_CACHE_BITS));
356 bits_left -= MIN_CACHE_BITS;
359 put_bits(pb, bits_left, get_bits(gb, bits_left));
363 /* mb_x and mb_y are in units of 8 pixels */
364 static inline void dv_decode_video_segment(DVVideoContext *s,
365 const uint8_t *buf_ptr1,
366 const uint16_t *mb_pos_ptr)
368 int quant, dc, dct_mode, class1, j;
369 int mb_index, mb_x, mb_y, v, last_index;
370 int y_stride, linesize;
371 DCTELEM *block, *block1;
374 const uint8_t *buf_ptr;
375 PutBitContext pb, vs_pb;
377 BlockInfo mb_data[5 * DV_MAX_BPM], *mb, *mb1;
378 DECLARE_ALIGNED_16(DCTELEM, sblock[5*DV_MAX_BPM][64]);
379 DECLARE_ALIGNED_8(uint8_t, mb_bit_buffer[80 + 4]); /* allow some slack */
380 DECLARE_ALIGNED_8(uint8_t, vs_bit_buffer[5 * 80 + 4]); /* allow some slack */
381 const int log2_blocksize = 3-s->avctx->lowres;
382 int is_field_mode[5];
384 assert((((int)mb_bit_buffer) & 7) == 0);
385 assert((((int)vs_bit_buffer) & 7) == 0);
387 memset(sblock, 0, sizeof(sblock));
389 /* pass 1 : read DC and AC coefficients in blocks */
391 block1 = &sblock[0][0];
393 init_put_bits(&vs_pb, vs_bit_buffer, 5 * 80);
394 for (mb_index = 0; mb_index < 5; mb_index++, mb1 += s->sys->bpm, block1 += s->sys->bpm * 64) {
396 quant = buf_ptr[3] & 0x0f;
398 init_put_bits(&pb, mb_bit_buffer, 80);
401 is_field_mode[mb_index] = 0;
402 for (j = 0; j < s->sys->bpm; j++) {
403 last_index = s->sys->block_sizes[j];
404 init_get_bits(&gb, buf_ptr, last_index);
407 dc = get_sbits(&gb, 9);
408 dct_mode = get_bits1(&gb);
409 class1 = get_bits(&gb, 2);
410 if (DV_PROFILE_IS_HD(s->sys)) {
411 mb->idct_put = s->idct_put[0];
412 mb->scan_table = s->dv_zigzag[0];
413 mb->factor_table = s->dv100_idct_factor[((s->sys->height == 720) << 1) | (j >= 4)][class1][quant];
414 is_field_mode[mb_index] |= !j && dct_mode;
416 mb->idct_put = s->idct_put[dct_mode && log2_blocksize == 3];
417 mb->scan_table = s->dv_zigzag[dct_mode];
418 mb->factor_table = s->dv_idct_factor[class1 == 3][dct_mode]
419 [quant + dv_quant_offset[class1]];
422 /* convert to unsigned because 128 is not added in the
426 buf_ptr += last_index >> 3;
428 mb->partial_bit_count = 0;
431 printf("MB block: %d, %d ", mb_index, j);
433 dv_decode_ac(&gb, mb, block);
435 /* write the remaining bits in a new buffer only if the
444 /* pass 2 : we can do it just after */
446 printf("***pass 2 size=%d MB#=%d\n", put_bits_count(&pb), mb_index);
450 init_get_bits(&gb, mb_bit_buffer, put_bits_count(&pb));
452 for (j = 0; j < s->sys->bpm; j++, block += 64, mb++) {
453 if (mb->pos < 64 && get_bits_left(&gb) > 0) {
454 dv_decode_ac(&gb, mb, block);
455 /* if still not finished, no need to parse other blocks */
460 /* all blocks are finished, so the extra bytes can be used at
461 the video segment level */
462 if (j >= s->sys->bpm)
463 bit_copy(&vs_pb, &gb);
466 /* we need a pass other the whole video segment */
468 printf("***pass 3 size=%d\n", put_bits_count(&vs_pb));
470 block = &sblock[0][0];
472 init_get_bits(&gb, vs_bit_buffer, put_bits_count(&vs_pb));
473 flush_put_bits(&vs_pb);
474 for (mb_index = 0; mb_index < 5; mb_index++) {
475 for (j = 0; j < s->sys->bpm; j++) {
478 printf("start %d:%d\n", mb_index, j);
480 dv_decode_ac(&gb, mb, block);
482 if (mb->pos >= 64 && mb->pos < 127)
483 av_log(NULL, AV_LOG_ERROR, "AC EOB marker is absent pos=%d\n", mb->pos);
489 /* compute idct and place blocks */
490 block = &sblock[0][0];
492 for (mb_index = 0; mb_index < 5; mb_index++) {
496 /* We work with 720p frames split in half. The odd half-frame (chan==2,3) is displaced :-( */
497 if (s->sys->height == 720 && !(s->buf[1] & 0x0C)) {
498 mb_y -= (mb_y > 17) ? 18 : -72; /* shifting the Y coordinate down by 72/2 macroblocks */
501 /* idct_put'ting luminance */
502 if ((s->sys->pix_fmt == PIX_FMT_YUV420P) ||
503 (s->sys->pix_fmt == PIX_FMT_YUV411P && mb_x >= (704 / 8)) ||
504 (s->sys->height >= 720 && mb_y != 134)) {
505 y_stride = (s->picture.linesize[0] << ((!is_field_mode[mb_index]) * log2_blocksize));
507 y_stride = (2 << log2_blocksize);
509 y_ptr = s->picture.data[0] + ((mb_y * s->picture.linesize[0] + mb_x) << log2_blocksize);
510 linesize = s->picture.linesize[0] << is_field_mode[mb_index];
511 mb[0] .idct_put(y_ptr , linesize, block + 0*64);
512 if (s->sys->video_stype == 4) { /* SD 422 */
513 mb[2].idct_put(y_ptr + (1 << log2_blocksize) , linesize, block + 2*64);
515 mb[1].idct_put(y_ptr + (1 << log2_blocksize) , linesize, block + 1*64);
516 mb[2].idct_put(y_ptr + y_stride, linesize, block + 2*64);
517 mb[3].idct_put(y_ptr + (1 << log2_blocksize) + y_stride, linesize, block + 3*64);
522 /* idct_put'ting chrominance */
523 c_offset = (((mb_y >> (s->sys->pix_fmt == PIX_FMT_YUV420P)) * s->picture.linesize[1] +
524 (mb_x >> ((s->sys->pix_fmt == PIX_FMT_YUV411P) ? 2 : 1))) << log2_blocksize);
525 for (j = 2; j; j--) {
526 uint8_t *c_ptr = s->picture.data[j] + c_offset;
527 if (s->sys->pix_fmt == PIX_FMT_YUV411P && mb_x >= (704 / 8)) {
528 uint64_t aligned_pixels[64/8];
529 uint8_t *pixels = (uint8_t*)aligned_pixels;
530 uint8_t *c_ptr1, *ptr1;
532 mb->idct_put(pixels, 8, block);
533 for (y = 0; y < (1 << log2_blocksize); y++, c_ptr += s->picture.linesize[j], pixels += 8) {
534 ptr1 = pixels + (1 << (log2_blocksize - 1));
535 c_ptr1 = c_ptr + (s->picture.linesize[j] << log2_blocksize);
536 for (x = 0; x < (1 << (log2_blocksize - 1)); x++) {
537 c_ptr[x] = pixels[x];
543 y_stride = (mb_y == 134) ? (1 << log2_blocksize) :
544 s->picture.linesize[j] << ((!is_field_mode[mb_index]) * log2_blocksize);
545 linesize = s->picture.linesize[j] << is_field_mode[mb_index];
546 (mb++)-> idct_put(c_ptr , linesize, block); block += 64;
547 if (s->sys->bpm == 8) {
548 (mb++)->idct_put(c_ptr + y_stride, linesize, block); block += 64;
556 /* Converts run and level (where level != 0) pair into vlc, returning bit size */
557 static av_always_inline int dv_rl2vlc(int run, int level, int sign, uint32_t* vlc)
560 if (run < DV_VLC_MAP_RUN_SIZE && level < DV_VLC_MAP_LEV_SIZE) {
561 *vlc = dv_vlc_map[run][level].vlc | sign;
562 size = dv_vlc_map[run][level].size;
565 if (level < DV_VLC_MAP_LEV_SIZE) {
566 *vlc = dv_vlc_map[0][level].vlc | sign;
567 size = dv_vlc_map[0][level].size;
569 *vlc = 0xfe00 | (level << 1) | sign;
573 *vlc |= ((run < 16) ? dv_vlc_map[run-1][0].vlc :
574 (0x1f80 | (run - 1))) << size;
575 size += (run < 16) ? dv_vlc_map[run-1][0].size : 13;
582 static av_always_inline int dv_rl2vlc_size(int run, int level)
586 if (run < DV_VLC_MAP_RUN_SIZE && level < DV_VLC_MAP_LEV_SIZE) {
587 size = dv_vlc_map[run][level].size;
590 size = (level < DV_VLC_MAP_LEV_SIZE) ? dv_vlc_map[0][level].size : 16;
592 size += (run < 16) ? dv_vlc_map[run-1][0].size : 13;
598 static av_always_inline int dv_rl2vlc(int run, int l, int sign, uint32_t* vlc)
600 *vlc = dv_vlc_map[run][l].vlc | sign;
601 return dv_vlc_map[run][l].size;
604 static av_always_inline int dv_rl2vlc_size(int run, int l)
606 return dv_vlc_map[run][l].size;
610 typedef struct EncBlockInfo {
620 uint8_t partial_bit_count;
621 uint32_t partial_bit_buffer; /* we can't use uint16_t here */
624 static av_always_inline PutBitContext* dv_encode_ac(EncBlockInfo* bi,
625 PutBitContext* pb_pool,
626 PutBitContext* pb_end)
629 PutBitContext* pb = pb_pool;
630 int size = bi->partial_bit_count;
631 uint32_t vlc = bi->partial_bit_buffer;
633 bi->partial_bit_count = bi->partial_bit_buffer = 0;
635 /* Find suitable storage space */
636 for (; size > (bits_left = put_bits_left(pb)); pb++) {
639 put_bits(pb, bits_left, vlc >> size);
640 vlc = vlc & ((1 << size) - 1);
642 if (pb + 1 >= pb_end) {
643 bi->partial_bit_count = size;
644 bi->partial_bit_buffer = vlc;
650 put_bits(pb, size, vlc);
652 if (bi->cur_ac >= 64)
655 /* Construct the next VLC */
657 bi->cur_ac = bi->next[prev];
658 if (bi->cur_ac < 64){
659 size = dv_rl2vlc(bi->cur_ac - prev - 1, bi->mb[bi->cur_ac], bi->sign[bi->cur_ac], &vlc);
661 size = 4; vlc = 6; /* End Of Block stamp */
667 static av_always_inline void dv_set_class_number(DCTELEM* blk, EncBlockInfo* bi,
668 const uint8_t* zigzag_scan,
669 const int *weight, int bias)
672 /* We offer two different methods for class number assignment: the
673 method suggested in SMPTE 314M Table 22, and an improved
674 method. The SMPTE method is very conservative; it assigns class
675 3 (i.e. severe quantization) to any block where the largest AC
676 component is greater than 36. FFmpeg's DV encoder tracks AC bit
677 consumption precisely, so there is no need to bias most blocks
678 towards strongly lossy compression. Instead, we assign class 2
679 to most blocks, and use class 3 only when strictly necessary
680 (for blocks whose largest AC component exceeds 255). */
682 #if 0 /* SMPTE spec method */
683 static const int classes[] = {12, 24, 36, 0xffff};
684 #else /* improved FFmpeg method */
685 static const int classes[] = {-1, -1, 255, 0xffff};
687 int max = classes[0];
692 for (area = 0; area < 4; area++) {
693 bi->prev[area] = prev;
694 bi->bit_size[area] = 1; // 4 areas 4 bits for EOB :)
695 for (i = mb_area_start[area]; i < mb_area_start[area+1]; i++) {
696 int level = blk[zigzag_scan[i]];
698 if (level + 15 > 30U) {
699 bi->sign[i] = (level >> 31) & 1;
700 /* weigh it and and shift down into range, adding for rounding */
701 /* the extra division by a factor of 2^4 reverses the 8x expansion of the DCT
702 AND the 2x doubling of the weights */
703 level = (FFABS(level) * weight[i] + (1 << (dv_weight_bits+3))) >> (dv_weight_bits+4);
707 bi->bit_size[area] += dv_rl2vlc_size(i - prev - 1, level);
714 for (bi->cno = 0; max > classes[bi->cno]; bi->cno++);
722 for (area = 0; area < 4; area++) {
723 bi->prev[area] = prev;
724 bi->bit_size[area] = 1; // 4 areas 4 bits for EOB :)
725 for (; i < mb_area_start[area+1]; i = bi->next[i]) {
729 bi->bit_size[area] += dv_rl2vlc_size(i - prev - 1, bi->mb[i]);
739 //FIXME replace this by dsputil
740 #define SC(x, y) ((s[x] - s[y]) ^ ((s[x] - s[y]) >> 7))
741 static av_always_inline int dv_guess_dct_mode(DCTELEM *blk) {
747 /* Compute 8-8 score (small values give a better chance for 8-8 DCT) */
749 for (i = 0; i < 7; i++) {
750 score88 += SC(0, 8) + SC(1, 9) + SC(2, 10) + SC(3, 11) +
751 SC(4, 12) + SC(5,13) + SC(6, 14) + SC(7, 15);
754 /* Compute 2-4-8 score (small values give a better chance for 2-4-8 DCT) */
756 for (i = 0; i < 6; i++) {
757 score248 += SC(0, 16) + SC(1,17) + SC(2, 18) + SC(3, 19) +
758 SC(4, 20) + SC(5,21) + SC(6, 22) + SC(7, 23);
762 return (score88 - score248 > -10);
765 static inline void dv_guess_qnos(EncBlockInfo* blks, int* qnos)
768 int i, j, k, a, prev, a2;
771 size[0] = size[1] = size[2] = size[3] = size[4] = 1 << 24;
774 for (i = 0; i < 5; i++) {
780 for (j = 0; j < 6; j++, b++) {
781 for (a = 0; a < 4; a++) {
782 if (b->area_q[a] != dv_quant_shifts[qnos[i] + dv_quant_offset[b->cno]][a]) {
783 b->bit_size[a] = 1; // 4 areas 4 bits for EOB :)
786 assert(b->next[prev] >= mb_area_start[a+1] || b->mb[prev]);
787 for (k = b->next[prev] ; k < mb_area_start[a+1]; k = b->next[k]) {
790 b->bit_size[a] += dv_rl2vlc_size(k - prev - 1, b->mb[k]);
793 if (b->next[k] >= mb_area_start[a+1] && b->next[k]<64){
794 for (a2 = a + 1; b->next[k] >= mb_area_start[a2+1]; a2++)
797 assert(b->mb[b->next[k]]);
798 b->bit_size[a2] += dv_rl2vlc_size(b->next[k] - prev - 1, b->mb[b->next[k]])
799 -dv_rl2vlc_size(b->next[k] - k - 1, b->mb[b->next[k]]);
800 assert(b->prev[a2] == k && (a2 + 1 >= 4 || b->prev[a2+1] != k));
803 b->next[prev] = b->next[k];
808 size[i] += b->bit_size[a];
811 if (vs_total_ac_bits >= size[0] + size[1] + size[2] + size[3] + size[4])
814 } while (qnos[0]|qnos[1]|qnos[2]|qnos[3]|qnos[4]);
817 for (a = 2; a == 2 || vs_total_ac_bits < size[0]; a += a){
819 size[0] = 5 * 6 * 4; //EOB
820 for (j = 0; j < 6 *5; j++, b++) {
822 for (k = b->next[prev]; k < 64; k = b->next[k]) {
823 if (b->mb[k] < a && b->mb[k] > -a){
824 b->next[prev] = b->next[k];
826 size[0] += dv_rl2vlc_size(k - prev - 1, b->mb[k]);
834 static inline void dv_encode_video_segment(DVVideoContext *s,
836 const uint16_t *mb_pos_ptr)
838 int mb_index, i, j, v;
839 int mb_x, mb_y, c_offset, linesize;
844 DECLARE_ALIGNED_16(DCTELEM, block[64]);
845 EncBlockInfo enc_blks[5*6];
846 PutBitContext pbs[5*6];
848 EncBlockInfo* enc_blk;
852 assert((((int)block) & 15) == 0);
854 enc_blk = &enc_blks[0];
856 for (mb_index = 0; mb_index < 5; mb_index++) {
860 y_ptr = s->picture.data[0] + ((mb_y * s->picture.linesize[0] + mb_x) << 3);
861 c_offset = (((mb_y >> (s->sys->pix_fmt == PIX_FMT_YUV420P)) * s->picture.linesize[1] +
862 (mb_x >> ((s->sys->pix_fmt == PIX_FMT_YUV411P) ? 2 : 1))) << 3);
864 qnos[mb_index] = 15; /* No quantization */
865 ptr = dif + mb_index*80 + 4;
866 for (j = 0; j < 6; j++) {
868 if (s->sys->pix_fmt == PIX_FMT_YUV422P) { /* 4:2:2 */
869 if (j == 0 || j == 2) {
871 data = y_ptr + ((j >> 1) * 8);
872 linesize = s->picture.linesize[0];
875 data = s->picture.data[6 - j] + c_offset;
876 linesize = s->picture.linesize[6 - j];
878 /* j=1 and j=3 are "dummy" blocks, used for AC data only */
883 } else { /* 4:1:1 or 4:2:0 */
884 if (j < 4) { /* Four Y blocks */
885 /* NOTE: at end of line, the macroblock is handled as 420 */
886 if (s->sys->pix_fmt == PIX_FMT_YUV411P && mb_x < (704 / 8)) {
887 data = y_ptr + (j * 8);
889 data = y_ptr + ((j & 1) * 8) + ((j >> 1) * 8 * s->picture.linesize[0]);
891 linesize = s->picture.linesize[0];
892 } else { /* Cr and Cb blocks */
893 /* don't ask Fabrice why they inverted Cb and Cr ! */
894 data = s->picture.data [6 - j] + c_offset;
895 linesize = s->picture.linesize[6 - j];
896 if (s->sys->pix_fmt == PIX_FMT_YUV411P && mb_x >= (704 / 8))
901 /* Everything is set up -- now just copy data -> DCT block */
902 if (do_edge_wrap) { /* Edge wrap copy: 4x16 -> 8x8 */
905 for (i = 0; i < 8; i++) {
906 d = data + 8 * linesize;
907 b[0] = data[0]; b[1] = data[1]; b[2] = data[2]; b[3] = data[3];
908 b[4] = d[0]; b[5] = d[1]; b[6] = d[2]; b[7] = d[3];
912 } else { /* Simple copy: 8x8 -> 8x8 */
914 s->get_pixels(block, data, linesize);
917 if (s->avctx->flags & CODEC_FLAG_INTERLACED_DCT)
918 enc_blk->dct_mode = dv_guess_dct_mode(block);
920 enc_blk->dct_mode = 0;
921 enc_blk->area_q[0] = enc_blk->area_q[1] = enc_blk->area_q[2] = enc_blk->area_q[3] = 0;
922 enc_blk->partial_bit_count = 0;
923 enc_blk->partial_bit_buffer = 0;
927 /* We rely on the fact that encoding all zeros leads to an immediate EOB,
928 which is precisely what the spec calls for in the "dummy" blocks. */
929 memset(block, 0, sizeof(block));
931 s->fdct[enc_blk->dct_mode](block);
934 dv_set_class_number(block, enc_blk,
935 enc_blk->dct_mode ? ff_zigzag248_direct : ff_zigzag_direct,
936 enc_blk->dct_mode ? dv_weight_248 : dv_weight_88,
939 init_put_bits(pb, ptr, s->sys->block_sizes[j]/8);
940 put_bits(pb, 9, (uint16_t)(((enc_blk->mb[0] >> 3) - 1024 + 2) >> 2));
941 put_bits(pb, 1, enc_blk->dct_mode);
942 put_bits(pb, 2, enc_blk->cno);
944 vs_bit_size += enc_blk->bit_size[0] + enc_blk->bit_size[1] +
945 enc_blk->bit_size[2] + enc_blk->bit_size[3];
948 ptr += s->sys->block_sizes[j]/8;
952 if (vs_total_ac_bits < vs_bit_size)
953 dv_guess_qnos(&enc_blks[0], &qnos[0]);
955 for (i = 0; i < 5; i++) {
956 dif[i*80 + 3] = qnos[i];
959 /* First pass over individual cells only */
960 for (j = 0; j < 5 * 6; j++)
961 dv_encode_ac(&enc_blks[j], &pbs[j], &pbs[j+1]);
963 /* Second pass over each MB space */
964 for (j = 0; j < 5 * 6; j += 6) {
966 for (i = 0; i < 6; i++) {
967 if (enc_blks[i+j].partial_bit_count)
968 pb = dv_encode_ac(&enc_blks[i+j], pb, &pbs[j+6]);
972 /* Third and final pass over the whole video segment space */
974 for (j = 0; j < 5 * 6; j++) {
975 if (enc_blks[j].partial_bit_count)
976 pb = dv_encode_ac(&enc_blks[j], pb, &pbs[6*5]);
977 if (enc_blks[j].partial_bit_count)
978 av_log(NULL, AV_LOG_ERROR, "ac bitstream overflow\n");
981 for (j = 0; j < 5 * 6; j++)
982 flush_put_bits(&pbs[j]);
985 static int dv_decode_mt(AVCodecContext *avctx, void* sl)
987 DVVideoContext *s = avctx->priv_data;
988 int slice = (size_t)sl;
990 /* which DIF channel is this? */
991 int chan = slice / (s->sys->difseg_size * 27);
993 /* slice within the DIF channel */
994 int chan_slice = slice % (s->sys->difseg_size * 27);
996 /* byte offset of this channel's data */
997 int chan_offset = chan * s->sys->difseg_size * 150 * 80;
1000 int seq = chan_slice / 27;
1002 /* in 1080i50 and 720p50 some seq are unused */
1003 if ((DV_PROFILE_IS_1080i50(s->sys) && chan != 0 && seq == 11) ||
1004 (DV_PROFILE_IS_720p50(s->sys) && seq > 9))
1007 dv_decode_video_segment(s, &s->buf[(seq * 6 + (chan_slice / 3)
1008 + chan_slice * 5 + 7)
1009 * 80 + chan_offset],
1010 &s->sys->video_place[slice * 5]);
1014 #ifdef CONFIG_DVVIDEO_ENCODER
1015 static int dv_encode_mt(AVCodecContext *avctx, void* sl)
1017 DVVideoContext *s = avctx->priv_data;
1018 int slice = (size_t)sl;
1020 /* which DIF channel is this? */
1021 int chan = slice / (s->sys->difseg_size * 27);
1023 /* slice within the DIF channel */
1024 int chan_slice = slice % (s->sys->difseg_size * 27);
1026 /* byte offset of this channel's data */
1027 int chan_offset = chan * s->sys->difseg_size * 150 * 80;
1029 dv_encode_video_segment(s, &s->buf[((chan_slice / 27) * 6 + (chan_slice / 3)
1030 + chan_slice * 5 + 7)
1031 * 80 + chan_offset],
1032 &s->sys->video_place[slice * 5]);
1037 #ifdef CONFIG_DVVIDEO_DECODER
1038 /* NOTE: exactly one frame must be given (120000 bytes for NTSC,
1039 144000 bytes for PAL - or twice those for 50Mbps) */
1040 static int dvvideo_decode_frame(AVCodecContext *avctx,
1041 void *data, int *data_size,
1042 const uint8_t *buf, int buf_size)
1044 DVVideoContext *s = avctx->priv_data;
1046 s->sys = dv_frame_profile(buf);
1047 if (!s->sys || buf_size < s->sys->frame_size)
1048 return -1; /* NOTE: we only accept several full frames */
1050 if (s->picture.data[0])
1051 avctx->release_buffer(avctx, &s->picture);
1053 s->picture.reference = 0;
1054 s->picture.key_frame = 1;
1055 s->picture.pict_type = FF_I_TYPE;
1056 avctx->pix_fmt = s->sys->pix_fmt;
1057 avctx->time_base = s->sys->time_base;
1058 avcodec_set_dimensions(avctx, s->sys->width, s->sys->height);
1059 if (avctx->get_buffer(avctx, &s->picture) < 0) {
1060 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
1063 s->picture.interlaced_frame = 1;
1064 s->picture.top_field_first = 0;
1067 avctx->execute(avctx, dv_decode_mt, (void**)&dv_anchor[0], NULL,
1068 s->sys->n_difchan * s->sys->difseg_size * 27);
1073 *data_size = sizeof(AVFrame);
1074 *(AVFrame*)data = s->picture;
1076 return s->sys->frame_size;
1078 #endif /* CONFIG_DVVIDEO_DECODER */
1081 static inline int dv_write_pack(enum dv_pack_type pack_id, DVVideoContext *c,
1085 * Here's what SMPTE314M says about these two:
1086 * (page 6) APTn, AP1n, AP2n, AP3n: These data shall be identical
1087 * as track application IDs (APTn = 001, AP1n =
1088 * 001, AP2n = 001, AP3n = 001), if the source signal
1089 * comes from a digital VCR. If the signal source is
1090 * unknown, all bits for these data shall be set to 1.
1091 * (page 12) STYPE: STYPE defines a signal type of video signal
1092 * 00000b = 4:1:1 compression
1093 * 00100b = 4:2:2 compression
1095 * Now, I've got two problems with these statements:
1096 * 1. it looks like APT == 111b should be a safe bet, but it isn't.
1097 * It seems that for PAL as defined in IEC 61834 we have to set
1098 * APT to 000 and for SMPTE314M to 001.
1099 * 2. It is not at all clear what STYPE is used for 4:2:0 PAL
1100 * compression scheme (if any).
1102 int apt = (c->sys->pix_fmt == PIX_FMT_YUV420P ? 0 : 1);
1103 int stype = (c->sys->pix_fmt == PIX_FMT_YUV422P ? 4 : 0);
1106 if ((int)(av_q2d(c->avctx->sample_aspect_ratio) * c->avctx->width / c->avctx->height * 10) == 17) /* 16:9 */
1109 buf[0] = (uint8_t)pack_id;
1111 case dv_header525: /* I can't imagine why these two weren't defined as real */
1112 case dv_header625: /* packs in SMPTE314M -- they definitely look like ones */
1113 buf[1] = 0xf8 | /* reserved -- always 1 */
1114 (apt & 0x07); /* APT: Track application ID */
1115 buf[2] = (0 << 7) | /* TF1: audio data is 0 - valid; 1 - invalid */
1116 (0x0f << 3) | /* reserved -- always 1 */
1117 (apt & 0x07); /* AP1: Audio application ID */
1118 buf[3] = (0 << 7) | /* TF2: video data is 0 - valid; 1 - invalid */
1119 (0x0f << 3) | /* reserved -- always 1 */
1120 (apt & 0x07); /* AP2: Video application ID */
1121 buf[4] = (0 << 7) | /* TF3: subcode(SSYB) is 0 - valid; 1 - invalid */
1122 (0x0f << 3) | /* reserved -- always 1 */
1123 (apt & 0x07); /* AP3: Subcode application ID */
1125 case dv_video_source:
1126 buf[1] = 0xff; /* reserved -- always 1 */
1127 buf[2] = (1 << 7) | /* B/W: 0 - b/w, 1 - color */
1128 (1 << 6) | /* following CLF is valid - 0, invalid - 1 */
1129 (3 << 4) | /* CLF: color frames ID (see ITU-R BT.470-4) */
1130 0xf; /* reserved -- always 1 */
1131 buf[3] = (3 << 6) | /* reserved -- always 1 */
1132 (c->sys->dsf << 5) | /* system: 60fields/50fields */
1133 stype; /* signal type video compression */
1134 buf[4] = 0xff; /* VISC: 0xff -- no information */
1136 case dv_video_control:
1137 buf[1] = (0 << 6) | /* Copy generation management (CGMS) 0 -- free */
1138 0x3f; /* reserved -- always 1 */
1139 buf[2] = 0xc8 | /* reserved -- always b11001xxx */
1141 buf[3] = (1 << 7) | /* frame/field flag 1 -- frame, 0 -- field */
1142 (1 << 6) | /* first/second field flag 0 -- field 2, 1 -- field 1 */
1143 (1 << 5) | /* frame change flag 0 -- same picture as before, 1 -- different */
1144 (1 << 4) | /* 1 - interlaced, 0 - noninterlaced */
1145 0xc; /* reserved -- always b1100 */
1146 buf[4] = 0xff; /* reserved -- always 1 */
1149 buf[1] = buf[2] = buf[3] = buf[4] = 0xff;
1154 #ifdef CONFIG_DVVIDEO_ENCODER
1155 static void dv_format_frame(DVVideoContext* c, uint8_t* buf)
1159 for (chan = 0; chan < c->sys->n_difchan; chan++) {
1160 for (i = 0; i < c->sys->difseg_size; i++) {
1161 memset(buf, 0xff, 80 * 6); /* first 6 DIF blocks are for control data */
1163 /* DV header: 1DIF */
1164 buf += dv_write_dif_id(dv_sect_header, chan, i, 0, buf);
1165 buf += dv_write_pack((c->sys->dsf ? dv_header625 : dv_header525), c, buf);
1166 buf += 72; /* unused bytes */
1168 /* DV subcode: 2DIFs */
1169 for (j = 0; j < 2; j++) {
1170 buf += dv_write_dif_id(dv_sect_subcode, chan, i, j, buf);
1171 for (k = 0; k < 6; k++)
1172 buf += dv_write_ssyb_id(k, (i < c->sys->difseg_size/2), buf) + 5;
1173 buf += 29; /* unused bytes */
1176 /* DV VAUX: 3DIFS */
1177 for (j = 0; j < 3; j++) {
1178 buf += dv_write_dif_id(dv_sect_vaux, chan, i, j, buf);
1179 buf += dv_write_pack(dv_video_source, c, buf);
1180 buf += dv_write_pack(dv_video_control, c, buf);
1182 buf += dv_write_pack(dv_video_source, c, buf);
1183 buf += dv_write_pack(dv_video_control, c, buf);
1184 buf += 4*5 + 2; /* unused bytes */
1187 /* DV Audio/Video: 135 Video DIFs + 9 Audio DIFs */
1188 for (j = 0; j < 135; j++) {
1190 memset(buf, 0xff, 80);
1191 buf += dv_write_dif_id(dv_sect_audio, chan, i, j/15, buf);
1192 buf += 77; /* audio control & shuffled PCM audio */
1194 buf += dv_write_dif_id(dv_sect_video, chan, i, j, buf);
1195 buf += 77; /* 1 video macroblock: 1 bytes control
1196 4 * 14 bytes Y 8x8 data
1197 10 bytes Cr 8x8 data
1198 10 bytes Cb 8x8 data */
1205 static int dvvideo_encode_frame(AVCodecContext *c, uint8_t *buf, int buf_size,
1208 DVVideoContext *s = c->priv_data;
1210 s->sys = dv_codec_profile(c);
1213 if (buf_size < s->sys->frame_size)
1216 c->pix_fmt = s->sys->pix_fmt;
1217 s->picture = *((AVFrame *)data);
1218 s->picture.key_frame = 1;
1219 s->picture.pict_type = FF_I_TYPE;
1222 c->execute(c, dv_encode_mt, (void**)&dv_anchor[0], NULL,
1223 s->sys->n_difchan * s->sys->difseg_size * 27);
1227 dv_format_frame(s, buf);
1229 return s->sys->frame_size;
1233 static int dvvideo_close(AVCodecContext *c)
1235 DVVideoContext *s = c->priv_data;
1237 if (s->picture.data[0])
1238 c->release_buffer(c, &s->picture);
1244 #ifdef CONFIG_DVVIDEO_ENCODER
1245 AVCodec dvvideo_encoder = {
1249 sizeof(DVVideoContext),
1251 dvvideo_encode_frame,
1252 .pix_fmts = (enum PixelFormat[]) {PIX_FMT_YUV411P, PIX_FMT_YUV422P, PIX_FMT_YUV420P, PIX_FMT_NONE},
1253 .long_name = NULL_IF_CONFIG_SMALL("DV (Digital Video)"),
1255 #endif // CONFIG_DVVIDEO_ENCODER
1257 #ifdef CONFIG_DVVIDEO_DECODER
1258 AVCodec dvvideo_decoder = {
1262 sizeof(DVVideoContext),
1266 dvvideo_decode_frame,
1269 .long_name = NULL_IF_CONFIG_SMALL("DV (Digital Video)"),