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 * Many thanks to Dan Dennedy <dan@dennedy.org> for providing wealth
13 * of DV technical info.
15 * This file is part of FFmpeg.
17 * FFmpeg is free software; you can redistribute it and/or
18 * modify it under the terms of the GNU Lesser General Public
19 * License as published by the Free Software Foundation; either
20 * version 2.1 of the License, or (at your option) any later version.
22 * FFmpeg is distributed in the hope that it will be useful,
23 * but WITHOUT ANY WARRANTY; without even the implied warranty of
24 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
25 * Lesser General Public License for more details.
27 * You should have received a copy of the GNU Lesser General Public
28 * License along with FFmpeg; if not, write to the Free Software
29 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
36 #define ALT_BITSTREAM_READER
39 #include "bitstream.h"
40 #include "simple_idct.h"
46 typedef struct DVVideoContext {
49 AVCodecContext *avctx;
52 uint8_t dv_zigzag[2][64];
53 uint32_t dv_idct_factor[2][2][22][64];
55 void (*get_pixels)(DCTELEM *block, const uint8_t *pixels, int line_size);
56 void (*fdct[2])(DCTELEM *block);
57 void (*idct_put[2])(uint8_t *dest, int line_size, DCTELEM *block);
60 /* MultiThreading - dv_anchor applies to entire DV codec, not just the avcontext */
61 /* one element is needed for each video segment in a DV frame */
62 /* at most there are 2 DIF channels * 12 DIF sequences * 27 video segments (PAL 50Mbps) */
63 #define DV_ANCHOR_SIZE (2*12*27)
65 static void* dv_anchor[DV_ANCHOR_SIZE];
67 #define TEX_VLC_BITS 9
69 #ifdef DV_CODEC_TINY_TARGET
70 #define DV_VLC_MAP_RUN_SIZE 15
71 #define DV_VLC_MAP_LEV_SIZE 23
73 #define DV_VLC_MAP_RUN_SIZE 64
74 #define DV_VLC_MAP_LEV_SIZE 512 //FIXME sign was removed so this should be /2 but needs check
77 /* XXX: also include quantization */
78 static RL_VLC_ELEM dv_rl_vlc[1184];
79 /* VLC encoding lookup table */
80 static struct dv_vlc_pair {
83 } dv_vlc_map[DV_VLC_MAP_RUN_SIZE][DV_VLC_MAP_LEV_SIZE];
85 static void dv_build_unquantize_tables(DVVideoContext *s, uint8_t* perm)
89 /* NOTE: max left shift is 6 */
90 for(q = 0; q < 22; q++) {
93 for(a = 0; a<4; a++) {
94 for(; i < dv_quant_areas[a]; i++) {
96 s->dv_idct_factor[0][0][q][i] = dv_iweight_88[i]<<(dv_quant_shifts[q][a] + 1);
97 s->dv_idct_factor[1][0][q][i] = s->dv_idct_factor[0][0][q][i]<<1;
100 s->dv_idct_factor[0][1][q][i] = dv_iweight_248[i]<<(dv_quant_shifts[q][a] + 1);
101 s->dv_idct_factor[1][1][q][i] = s->dv_idct_factor[0][1][q][i]<<1;
107 static av_cold int dvvideo_init(AVCodecContext *avctx)
109 DVVideoContext *s = avctx->priv_data;
116 uint16_t new_dv_vlc_bits[NB_DV_VLC*2];
117 uint8_t new_dv_vlc_len[NB_DV_VLC*2];
118 uint8_t new_dv_vlc_run[NB_DV_VLC*2];
119 int16_t new_dv_vlc_level[NB_DV_VLC*2];
123 /* dv_anchor lets each thread know its Id */
124 for (i=0; i<DV_ANCHOR_SIZE; i++)
125 dv_anchor[i] = (void*)(size_t)i;
127 /* it's faster to include sign bit in a generic VLC parsing scheme */
128 for (i=0, j=0; i<NB_DV_VLC; i++, j++) {
129 new_dv_vlc_bits[j] = dv_vlc_bits[i];
130 new_dv_vlc_len[j] = dv_vlc_len[i];
131 new_dv_vlc_run[j] = dv_vlc_run[i];
132 new_dv_vlc_level[j] = dv_vlc_level[i];
134 if (dv_vlc_level[i]) {
135 new_dv_vlc_bits[j] <<= 1;
139 new_dv_vlc_bits[j] = (dv_vlc_bits[i] << 1) | 1;
140 new_dv_vlc_len[j] = dv_vlc_len[i] + 1;
141 new_dv_vlc_run[j] = dv_vlc_run[i];
142 new_dv_vlc_level[j] = -dv_vlc_level[i];
146 /* NOTE: as a trick, we use the fact the no codes are unused
147 to accelerate the parsing of partial codes */
148 init_vlc(&dv_vlc, TEX_VLC_BITS, j,
149 new_dv_vlc_len, 1, 1, new_dv_vlc_bits, 2, 2, 0);
150 assert(dv_vlc.table_size == 1184);
152 for(i = 0; i < dv_vlc.table_size; i++){
153 int code= dv_vlc.table[i][0];
154 int len = dv_vlc.table[i][1];
157 if(len<0){ //more bits needed
161 run= new_dv_vlc_run[code] + 1;
162 level= new_dv_vlc_level[code];
164 dv_rl_vlc[i].len = len;
165 dv_rl_vlc[i].level = level;
166 dv_rl_vlc[i].run = run;
170 for (i = 0; i < NB_DV_VLC - 1; i++) {
171 if (dv_vlc_run[i] >= DV_VLC_MAP_RUN_SIZE)
173 #ifdef DV_CODEC_TINY_TARGET
174 if (dv_vlc_level[i] >= DV_VLC_MAP_LEV_SIZE)
178 if (dv_vlc_map[dv_vlc_run[i]][dv_vlc_level[i]].size != 0)
181 dv_vlc_map[dv_vlc_run[i]][dv_vlc_level[i]].vlc = dv_vlc_bits[i] <<
183 dv_vlc_map[dv_vlc_run[i]][dv_vlc_level[i]].size = dv_vlc_len[i] +
186 for (i = 0; i < DV_VLC_MAP_RUN_SIZE; i++) {
187 #ifdef DV_CODEC_TINY_TARGET
188 for (j = 1; j < DV_VLC_MAP_LEV_SIZE; j++) {
189 if (dv_vlc_map[i][j].size == 0) {
190 dv_vlc_map[i][j].vlc = dv_vlc_map[0][j].vlc |
191 (dv_vlc_map[i-1][0].vlc << (dv_vlc_map[0][j].size));
192 dv_vlc_map[i][j].size = dv_vlc_map[i-1][0].size +
193 dv_vlc_map[0][j].size;
197 for (j = 1; j < DV_VLC_MAP_LEV_SIZE/2; j++) {
198 if (dv_vlc_map[i][j].size == 0) {
199 dv_vlc_map[i][j].vlc = dv_vlc_map[0][j].vlc |
200 (dv_vlc_map[i-1][0].vlc << (dv_vlc_map[0][j].size));
201 dv_vlc_map[i][j].size = dv_vlc_map[i-1][0].size +
202 dv_vlc_map[0][j].size;
204 dv_vlc_map[i][((uint16_t)(-j))&0x1ff].vlc =
205 dv_vlc_map[i][j].vlc | 1;
206 dv_vlc_map[i][((uint16_t)(-j))&0x1ff].size =
207 dv_vlc_map[i][j].size;
213 /* Generic DSP setup */
214 dsputil_init(&dsp, avctx);
215 s->get_pixels = dsp.get_pixels;
218 s->fdct[0] = dsp.fdct;
219 s->idct_put[0] = dsp.idct_put;
221 s->dv_zigzag[0][i] = dsp.idct_permutation[ff_zigzag_direct[i]];
224 s->fdct[1] = dsp.fdct248;
225 s->idct_put[1] = ff_simple_idct248_put; // FIXME: need to add it to DSP
227 for (i=0; i<64; i++){
228 int j= ff_zigzag248_direct[i];
229 s->dv_zigzag[1][i] = dsp.idct_permutation[(j&7) + (j&8)*4 + (j&48)/2];
232 memcpy(s->dv_zigzag[1], ff_zigzag248_direct, 64);
234 /* XXX: do it only for constant case */
235 dv_build_unquantize_tables(s, dsp.idct_permutation);
237 avctx->coded_frame = &s->picture;
244 // #define printf(...) av_log(NULL, AV_LOG_ERROR, __VA_ARGS__)
246 typedef struct BlockInfo {
247 const uint32_t *factor_table;
248 const uint8_t *scan_table;
249 uint8_t pos; /* position in block */
250 void (*idct_put)(uint8_t *dest, int line_size, DCTELEM *block);
251 uint8_t partial_bit_count;
252 uint16_t partial_bit_buffer;
256 /* bit budget for AC only in 5 MBs */
257 static const int vs_total_ac_bits = (100 * 4 + 68*2) * 5;
258 /* see dv_88_areas and dv_248_areas for details */
259 static const int mb_area_start[5] = { 1, 6, 21, 43, 64 };
261 static inline int get_bits_left(GetBitContext *s)
263 return s->size_in_bits - get_bits_count(s);
266 static inline int put_bits_left(PutBitContext* s)
268 return (s->buf_end - s->buf) * 8 - put_bits_count(s);
271 /* decode ac coefs */
272 static void dv_decode_ac(GetBitContext *gb, BlockInfo *mb, DCTELEM *block)
274 int last_index = gb->size_in_bits;
275 const uint8_t *scan_table = mb->scan_table;
276 const uint32_t *factor_table = mb->factor_table;
278 int partial_bit_count = mb->partial_bit_count;
279 int level, run, vlc_len, index;
282 UPDATE_CACHE(re, gb);
284 /* if we must parse a partial vlc, we do it here */
285 if (partial_bit_count > 0) {
286 re_cache = ((unsigned)re_cache >> partial_bit_count) |
287 (mb->partial_bit_buffer << (sizeof(re_cache)*8 - partial_bit_count));
288 re_index -= partial_bit_count;
289 mb->partial_bit_count = 0;
292 /* get the AC coefficients until last_index is reached */
295 printf("%2d: bits=%04x index=%d\n", pos, SHOW_UBITS(re, gb, 16), re_index);
297 /* our own optimized GET_RL_VLC */
298 index = NEG_USR32(re_cache, TEX_VLC_BITS);
299 vlc_len = dv_rl_vlc[index].len;
301 index = NEG_USR32((unsigned)re_cache << TEX_VLC_BITS, -vlc_len) + dv_rl_vlc[index].level;
302 vlc_len = TEX_VLC_BITS - vlc_len;
304 level = dv_rl_vlc[index].level;
305 run = dv_rl_vlc[index].run;
307 /* gotta check if we're still within gb boundaries */
308 if (re_index + vlc_len > last_index) {
309 /* should be < 16 bits otherwise a codeword could have been parsed */
310 mb->partial_bit_count = last_index - re_index;
311 mb->partial_bit_buffer = NEG_USR32(re_cache, mb->partial_bit_count);
312 re_index = last_index;
318 printf("run=%d level=%d\n", run, level);
324 level = (level*factor_table[pos] + (1 << (dv_iweight_bits-1))) >> dv_iweight_bits;
325 block[scan_table[pos]] = level;
327 UPDATE_CACHE(re, gb);
329 CLOSE_READER(re, gb);
333 static inline void bit_copy(PutBitContext *pb, GetBitContext *gb)
335 int bits_left = get_bits_left(gb);
336 while (bits_left >= MIN_CACHE_BITS) {
337 put_bits(pb, MIN_CACHE_BITS, get_bits(gb, MIN_CACHE_BITS));
338 bits_left -= MIN_CACHE_BITS;
341 put_bits(pb, bits_left, get_bits(gb, bits_left));
345 /* mb_x and mb_y are in units of 8 pixels */
346 static inline void dv_decode_video_segment(DVVideoContext *s,
347 const uint8_t *buf_ptr1,
348 const uint16_t *mb_pos_ptr)
350 int quant, dc, dct_mode, class1, j;
351 int mb_index, mb_x, mb_y, v, last_index;
352 DCTELEM *block, *block1;
355 const uint8_t *buf_ptr;
356 PutBitContext pb, vs_pb;
358 BlockInfo mb_data[5 * DV_MAX_BPM], *mb, *mb1;
359 DECLARE_ALIGNED_16(DCTELEM, sblock[5*DV_MAX_BPM][64]);
360 DECLARE_ALIGNED_8(uint8_t, mb_bit_buffer[80 + 4]); /* allow some slack */
361 DECLARE_ALIGNED_8(uint8_t, vs_bit_buffer[5 * 80 + 4]); /* allow some slack */
362 const int log2_blocksize= 3-s->avctx->lowres;
364 assert((((int)mb_bit_buffer)&7)==0);
365 assert((((int)vs_bit_buffer)&7)==0);
367 memset(sblock, 0, sizeof(sblock));
369 /* pass 1 : read DC and AC coefficients in blocks */
371 block1 = &sblock[0][0];
373 init_put_bits(&vs_pb, vs_bit_buffer, 5 * 80);
374 for(mb_index = 0; mb_index < 5; mb_index++, mb1 += s->sys->bpm, block1 += s->sys->bpm * 64) {
376 quant = buf_ptr[3] & 0x0f;
378 init_put_bits(&pb, mb_bit_buffer, 80);
381 for(j = 0;j < s->sys->bpm; j++) {
382 last_index = s->sys->block_sizes[j];
383 init_get_bits(&gb, buf_ptr, last_index);
386 dc = get_sbits(&gb, 9);
387 dct_mode = get_bits1(&gb);
388 class1 = get_bits(&gb, 2);
389 mb->idct_put = s->idct_put[dct_mode && log2_blocksize==3];
390 mb->scan_table = s->dv_zigzag[dct_mode];
391 mb->factor_table = s->dv_idct_factor[class1 == 3][dct_mode]
392 [quant + dv_quant_offset[class1]];
394 /* convert to unsigned because 128 is not added in the
398 buf_ptr += last_index >> 3;
400 mb->partial_bit_count = 0;
403 printf("MB block: %d, %d ", mb_index, j);
405 dv_decode_ac(&gb, mb, block);
407 /* write the remaining bits in a new buffer only if the
416 /* pass 2 : we can do it just after */
418 printf("***pass 2 size=%d MB#=%d\n", put_bits_count(&pb), mb_index);
422 init_get_bits(&gb, mb_bit_buffer, put_bits_count(&pb));
424 for(j = 0;j < s->sys->bpm; j++, block += 64, mb++) {
425 if (mb->pos < 64 && get_bits_left(&gb) > 0) {
426 dv_decode_ac(&gb, mb, block);
427 /* if still not finished, no need to parse other blocks */
432 /* all blocks are finished, so the extra bytes can be used at
433 the video segment level */
434 if (j >= s->sys->bpm)
435 bit_copy(&vs_pb, &gb);
438 /* we need a pass other the whole video segment */
440 printf("***pass 3 size=%d\n", put_bits_count(&vs_pb));
442 block = &sblock[0][0];
444 init_get_bits(&gb, vs_bit_buffer, put_bits_count(&vs_pb));
445 flush_put_bits(&vs_pb);
446 for(mb_index = 0; mb_index < 5; mb_index++) {
447 for(j = 0;j < s->sys->bpm; j++) {
450 printf("start %d:%d\n", mb_index, j);
452 dv_decode_ac(&gb, mb, block);
454 if (mb->pos >= 64 && mb->pos < 127)
455 av_log(NULL, AV_LOG_ERROR, "AC EOB marker is absent pos=%d\n", mb->pos);
461 /* compute idct and place blocks */
462 block = &sblock[0][0];
464 for(mb_index = 0; mb_index < 5; mb_index++) {
468 y_ptr = s->picture.data[0] + ((mb_y * s->picture.linesize[0] + mb_x)<<log2_blocksize);
469 c_offset = (((mb_y>>(s->sys->pix_fmt == PIX_FMT_YUV420P)) * s->picture.linesize[1] +
470 (mb_x>>((s->sys->pix_fmt == PIX_FMT_YUV411P)?2:1)))<<log2_blocksize);
472 for(j = 0;j < 6; j++) {
473 if (s->sys->pix_fmt == PIX_FMT_YUV422P) { /* 4:2:2 */
474 if (j == 0 || j == 2) {
476 mb->idct_put(y_ptr + ((j >> 1)<<log2_blocksize),
477 s->picture.linesize[0], block);
480 mb->idct_put(s->picture.data[6 - j] + c_offset,
481 s->picture.linesize[6 - j], block);
483 /* note: j=1 and j=3 are "dummy" blocks in 4:2:2 */
484 } else { /* 4:1:1 or 4:2:0 */
486 if (s->sys->pix_fmt == PIX_FMT_YUV411P && mb_x < (704 / 8)) {
487 /* NOTE: at end of line, the macroblock is handled as 420 */
488 mb->idct_put(y_ptr + (j<<log2_blocksize), s->picture.linesize[0], block);
490 mb->idct_put(y_ptr + (((j & 1) + (j >> 1) * s->picture.linesize[0])<<log2_blocksize),
491 s->picture.linesize[0], block);
494 if (s->sys->pix_fmt == PIX_FMT_YUV411P && mb_x >= (704 / 8)) {
495 uint64_t aligned_pixels[64/8];
496 uint8_t *pixels= (uint8_t*)aligned_pixels;
497 uint8_t *c_ptr, *c_ptr1, *ptr, *ptr1;
499 /* NOTE: at end of line, the macroblock is handled as 420 */
500 mb->idct_put(pixels, 8, block);
501 linesize = s->picture.linesize[6 - j];
502 c_ptr = s->picture.data[6 - j] + c_offset;
504 for(y = 0;y < (1<<log2_blocksize); y++) {
505 ptr1= ptr + (1<<(log2_blocksize-1));
506 c_ptr1 = c_ptr + (linesize<<log2_blocksize);
507 for(x=0; x < (1<<(log2_blocksize-1)); x++){
508 c_ptr[x]= ptr[x]; c_ptr1[x]= ptr1[x];
514 /* don't ask me why they inverted Cb and Cr ! */
515 mb->idct_put(s->picture.data[6 - j] + c_offset,
516 s->picture.linesize[6 - j], block);
526 #ifdef DV_CODEC_TINY_TARGET
527 /* Converts run and level (where level != 0) pair into vlc, returning bit size */
528 static av_always_inline int dv_rl2vlc(int run, int level, int sign, uint32_t* vlc)
531 if (run < DV_VLC_MAP_RUN_SIZE && level < DV_VLC_MAP_LEV_SIZE) {
532 *vlc = dv_vlc_map[run][level].vlc | sign;
533 size = dv_vlc_map[run][level].size;
536 if (level < DV_VLC_MAP_LEV_SIZE) {
537 *vlc = dv_vlc_map[0][level].vlc | sign;
538 size = dv_vlc_map[0][level].size;
540 *vlc = 0xfe00 | (level << 1) | sign;
544 *vlc |= ((run < 16) ? dv_vlc_map[run-1][0].vlc :
545 (0x1f80 | (run - 1))) << size;
546 size += (run < 16) ? dv_vlc_map[run-1][0].size : 13;
553 static av_always_inline int dv_rl2vlc_size(int run, int level)
557 if (run < DV_VLC_MAP_RUN_SIZE && level < DV_VLC_MAP_LEV_SIZE) {
558 size = dv_vlc_map[run][level].size;
561 size = (level < DV_VLC_MAP_LEV_SIZE) ? dv_vlc_map[0][level].size : 16;
563 size += (run < 16) ? dv_vlc_map[run-1][0].size : 13;
569 static av_always_inline int dv_rl2vlc(int run, int l, int sign, uint32_t* vlc)
571 *vlc = dv_vlc_map[run][l].vlc | sign;
572 return dv_vlc_map[run][l].size;
575 static av_always_inline int dv_rl2vlc_size(int run, int l)
577 return dv_vlc_map[run][l].size;
581 typedef struct EncBlockInfo {
591 uint8_t partial_bit_count;
592 uint32_t partial_bit_buffer; /* we can't use uint16_t here */
595 static av_always_inline PutBitContext* dv_encode_ac(EncBlockInfo* bi, PutBitContext* pb_pool,
596 PutBitContext* pb_end)
600 PutBitContext* pb = pb_pool;
601 int size = bi->partial_bit_count;
602 uint32_t vlc = bi->partial_bit_buffer;
604 bi->partial_bit_count = bi->partial_bit_buffer = 0;
606 /* Find suitable storage space */
607 for (; size > (bits_left = put_bits_left(pb)); pb++) {
610 put_bits(pb, bits_left, vlc >> size);
611 vlc = vlc & ((1<<size)-1);
613 if (pb + 1 >= pb_end) {
614 bi->partial_bit_count = size;
615 bi->partial_bit_buffer = vlc;
621 put_bits(pb, size, vlc);
626 /* Construct the next VLC */
628 bi->cur_ac = bi->next[prev];
630 size = dv_rl2vlc(bi->cur_ac - prev - 1, bi->mb[bi->cur_ac], bi->sign[bi->cur_ac], &vlc);
632 size = 4; vlc = 6; /* End Of Block stamp */
638 static av_always_inline void dv_set_class_number(DCTELEM* blk, EncBlockInfo* bi,
639 const uint8_t* zigzag_scan, const int *weight, int bias)
642 /* We offer two different methods for class number assignment: the
643 method suggested in SMPTE 314M Table 22, and an improved
644 method. The SMPTE method is very conservative; it assigns class
645 3 (i.e. severe quantization) to any block where the largest AC
646 component is greater than 36. ffmpeg's DV encoder tracks AC bit
647 consumption precisely, so there is no need to bias most blocks
648 towards strongly lossy compression. Instead, we assign class 2
649 to most blocks, and use class 3 only when strictly necessary
650 (for blocks whose largest AC component exceeds 255). */
652 #if 0 /* SMPTE spec method */
653 static const int classes[] = {12, 24, 36, 0xffff};
654 #else /* improved ffmpeg method */
655 static const int classes[] = {-1, -1, 255, 0xffff};
662 for (area = 0; area < 4; area++) {
663 bi->prev[area] = prev;
664 bi->bit_size[area] = 1; // 4 areas 4 bits for EOB :)
665 for (i=mb_area_start[area]; i<mb_area_start[area+1]; i++) {
666 int level = blk[zigzag_scan[i]];
668 if (level+15 > 30U) {
669 bi->sign[i] = (level>>31)&1;
670 /* weigh it and and shift down into range, adding for rounding */
671 /* the extra division by a factor of 2^4 reverses the 8x expansion of the DCT
672 AND the 2x doubling of the weights */
673 level = (FFABS(level) * weight[i] + (1<<(dv_weight_bits+3))) >> (dv_weight_bits+4);
675 if(level>max) max= level;
676 bi->bit_size[area] += dv_rl2vlc_size(i - prev - 1, level);
683 for(bi->cno = 0; max > classes[bi->cno]; bi->cno++);
691 for (area = 0; area < 4; area++) {
692 bi->prev[area] = prev;
693 bi->bit_size[area] = 1; // 4 areas 4 bits for EOB :)
694 for (; i<mb_area_start[area+1]; i= bi->next[i]) {
698 bi->bit_size[area] += dv_rl2vlc_size(i - prev - 1, bi->mb[i]);
708 //FIXME replace this by dsputil
709 #define SC(x, y) ((s[x] - s[y]) ^ ((s[x] - s[y]) >> 7))
710 static av_always_inline int dv_guess_dct_mode(DCTELEM *blk) {
716 /* Compute 8-8 score (small values give a better chance for 8-8 DCT) */
719 score88 += SC(0, 8) + SC(1, 9) + SC(2, 10) + SC(3, 11) +
720 SC(4, 12) + SC(5,13) + SC(6, 14) + SC(7, 15);
723 /* Compute 2-4-8 score (small values give a better chance for 2-4-8 DCT) */
726 score248 += SC(0, 16) + SC(1,17) + SC(2, 18) + SC(3, 19) +
727 SC(4, 20) + SC(5,21) + SC(6, 22) + SC(7, 23);
731 return (score88 - score248 > -10);
734 static inline void dv_guess_qnos(EncBlockInfo* blks, int* qnos)
737 int i, j, k, a, prev, a2;
740 size[0] = size[1] = size[2] = size[3] = size[4] = 1<<24;
743 for (i=0; i<5; i++) {
749 for (j=0; j<6; j++, b++) {
750 for (a=0; a<4; a++) {
751 if (b->area_q[a] != dv_quant_shifts[qnos[i] + dv_quant_offset[b->cno]][a]) {
752 b->bit_size[a] = 1; // 4 areas 4 bits for EOB :)
755 assert(b->next[prev] >= mb_area_start[a+1] || b->mb[prev]);
756 for (k= b->next[prev] ; k<mb_area_start[a+1]; k= b->next[k]) {
759 b->bit_size[a] += dv_rl2vlc_size(k - prev - 1, b->mb[k]);
762 if(b->next[k] >= mb_area_start[a+1] && b->next[k]<64){
763 for(a2=a+1; b->next[k] >= mb_area_start[a2+1]; a2++)
766 assert(b->mb[b->next[k]]);
767 b->bit_size[a2] += dv_rl2vlc_size(b->next[k] - prev - 1, b->mb[b->next[k]])
768 -dv_rl2vlc_size(b->next[k] - k - 1, b->mb[b->next[k]]);
769 assert(b->prev[a2]==k && (a2+1 >= 4 || b->prev[a2+1]!=k));
772 b->next[prev] = b->next[k];
777 size[i] += b->bit_size[a];
780 if(vs_total_ac_bits >= size[0] + size[1] + size[2] + size[3] + size[4])
783 } while (qnos[0]|qnos[1]|qnos[2]|qnos[3]|qnos[4]);
786 for(a=2; a==2 || vs_total_ac_bits < size[0]; a+=a){
788 size[0] = 5*6*4; //EOB
789 for (j=0; j<6*5; j++, b++) {
791 for (k= b->next[prev]; k<64; k= b->next[k]) {
792 if(b->mb[k] < a && b->mb[k] > -a){
793 b->next[prev] = b->next[k];
795 size[0] += dv_rl2vlc_size(k - prev - 1, b->mb[k]);
803 static inline void dv_encode_video_segment(DVVideoContext *s,
805 const uint16_t *mb_pos_ptr)
807 int mb_index, i, j, v;
808 int mb_x, mb_y, c_offset, linesize;
813 DECLARE_ALIGNED_16(DCTELEM, block[64]);
814 EncBlockInfo enc_blks[5*6];
815 PutBitContext pbs[5*6];
817 EncBlockInfo* enc_blk;
821 assert((((int)block) & 15) == 0);
823 enc_blk = &enc_blks[0];
825 for(mb_index = 0; mb_index < 5; mb_index++) {
829 y_ptr = s->picture.data[0] + ((mb_y * s->picture.linesize[0] + mb_x)<<3);
830 c_offset = (((mb_y>>(s->sys->pix_fmt == PIX_FMT_YUV420P)) * s->picture.linesize[1] +
831 (mb_x>>((s->sys->pix_fmt == PIX_FMT_YUV411P)?2:1)))<<3);
833 qnos[mb_index] = 15; /* No quantization */
834 ptr = dif + mb_index*80 + 4;
835 for(j = 0;j < 6; j++) {
837 if (s->sys->pix_fmt == PIX_FMT_YUV422P) { /* 4:2:2 */
838 if (j == 0 || j == 2) {
840 data = y_ptr + ((j>>1) * 8);
841 linesize = s->picture.linesize[0];
844 data = s->picture.data[6 - j] + c_offset;
845 linesize = s->picture.linesize[6 - j];
847 /* j=1 and j=3 are "dummy" blocks, used for AC data only */
852 } else { /* 4:1:1 or 4:2:0 */
853 if (j < 4) { /* Four Y blocks */
854 /* NOTE: at end of line, the macroblock is handled as 420 */
855 if (s->sys->pix_fmt == PIX_FMT_YUV411P && mb_x < (704 / 8)) {
856 data = y_ptr + (j * 8);
858 data = y_ptr + ((j & 1) * 8) + ((j >> 1) * 8 * s->picture.linesize[0]);
860 linesize = s->picture.linesize[0];
861 } else { /* Cr and Cb blocks */
862 /* don't ask Fabrice why they inverted Cb and Cr ! */
863 data = s->picture.data[6 - j] + c_offset;
864 linesize = s->picture.linesize[6 - j];
865 if (s->sys->pix_fmt == PIX_FMT_YUV411P && mb_x >= (704 / 8))
870 /* Everything is set up -- now just copy data -> DCT block */
871 if (do_edge_wrap) { /* Edge wrap copy: 4x16 -> 8x8 */
875 d = data + 8 * linesize;
876 b[0] = data[0]; b[1] = data[1]; b[2] = data[2]; b[3] = data[3];
877 b[4] = d[0]; b[5] = d[1]; b[6] = d[2]; b[7] = d[3];
881 } else { /* Simple copy: 8x8 -> 8x8 */
883 s->get_pixels(block, data, linesize);
886 if(s->avctx->flags & CODEC_FLAG_INTERLACED_DCT)
887 enc_blk->dct_mode = dv_guess_dct_mode(block);
889 enc_blk->dct_mode = 0;
890 enc_blk->area_q[0] = enc_blk->area_q[1] = enc_blk->area_q[2] = enc_blk->area_q[3] = 0;
891 enc_blk->partial_bit_count = 0;
892 enc_blk->partial_bit_buffer = 0;
896 /* We rely on the fact that encoding all zeros leads to an immediate EOB,
897 which is precisely what the spec calls for in the "dummy" blocks. */
898 memset(block, 0, sizeof(block));
900 s->fdct[enc_blk->dct_mode](block);
903 dv_set_class_number(block, enc_blk,
904 enc_blk->dct_mode ? ff_zigzag248_direct : ff_zigzag_direct,
905 enc_blk->dct_mode ? dv_weight_248 : dv_weight_88,
908 init_put_bits(pb, ptr, s->sys->block_sizes[j]/8);
909 put_bits(pb, 9, (uint16_t)(((enc_blk->mb[0] >> 3) - 1024 + 2) >> 2));
910 put_bits(pb, 1, enc_blk->dct_mode);
911 put_bits(pb, 2, enc_blk->cno);
913 vs_bit_size += enc_blk->bit_size[0] + enc_blk->bit_size[1] +
914 enc_blk->bit_size[2] + enc_blk->bit_size[3];
917 ptr += s->sys->block_sizes[j]/8;
921 if (vs_total_ac_bits < vs_bit_size)
922 dv_guess_qnos(&enc_blks[0], &qnos[0]);
924 for (i=0; i<5; i++) {
925 dif[i*80 + 3] = qnos[i];
928 /* First pass over individual cells only */
929 for (j=0; j<5*6; j++)
930 dv_encode_ac(&enc_blks[j], &pbs[j], &pbs[j+1]);
932 /* Second pass over each MB space */
933 for (j=0; j<5*6; j+=6) {
935 for (i=0; i<6; i++) {
936 if (enc_blks[i+j].partial_bit_count)
937 pb=dv_encode_ac(&enc_blks[i+j], pb, &pbs[j+6]);
941 /* Third and final pass over the whole vides segment space */
943 for (j=0; j<5*6; j++) {
944 if (enc_blks[j].partial_bit_count)
945 pb=dv_encode_ac(&enc_blks[j], pb, &pbs[6*5]);
946 if (enc_blks[j].partial_bit_count)
947 av_log(NULL, AV_LOG_ERROR, "ac bitstream overflow\n");
950 for (j=0; j<5*6; j++)
951 flush_put_bits(&pbs[j]);
954 static int dv_decode_mt(AVCodecContext *avctx, void* sl)
956 DVVideoContext *s = avctx->priv_data;
957 int slice = (size_t)sl;
959 /* which DIF channel is this? */
960 int chan = slice / (s->sys->difseg_size * 27);
962 /* slice within the DIF channel */
963 int chan_slice = slice % (s->sys->difseg_size * 27);
965 /* byte offset of this channel's data */
966 int chan_offset = chan * s->sys->difseg_size * 150 * 80;
969 int seq = chan_slice / 27;
971 dv_decode_video_segment(s, &s->buf[(seq*6+(chan_slice/3)+chan_slice*5+7)*80 + chan_offset],
972 &s->sys->video_place[slice*5]);
976 #ifdef CONFIG_DVVIDEO_ENCODER
977 static int dv_encode_mt(AVCodecContext *avctx, void* sl)
979 DVVideoContext *s = avctx->priv_data;
980 int slice = (size_t)sl;
982 /* which DIF channel is this? */
983 int chan = slice / (s->sys->difseg_size * 27);
985 /* slice within the DIF channel */
986 int chan_slice = slice % (s->sys->difseg_size * 27);
988 /* byte offset of this channel's data */
989 int chan_offset = chan * s->sys->difseg_size * 150 * 80;
991 dv_encode_video_segment(s, &s->buf[((chan_slice/27)*6+(chan_slice/3)+chan_slice*5+7)*80 + chan_offset],
992 &s->sys->video_place[slice*5]);
997 #ifdef CONFIG_DECODERS
998 /* NOTE: exactly one frame must be given (120000 bytes for NTSC,
999 144000 bytes for PAL - or twice those for 50Mbps) */
1000 static int dvvideo_decode_frame(AVCodecContext *avctx,
1001 void *data, int *data_size,
1002 const uint8_t *buf, int buf_size)
1004 DVVideoContext *s = avctx->priv_data;
1006 s->sys = dv_frame_profile(buf);
1007 if (!s->sys || buf_size < s->sys->frame_size)
1008 return -1; /* NOTE: we only accept several full frames */
1010 if(s->picture.data[0])
1011 avctx->release_buffer(avctx, &s->picture);
1013 s->picture.reference = 0;
1014 s->picture.key_frame = 1;
1015 s->picture.pict_type = FF_I_TYPE;
1016 avctx->pix_fmt = s->sys->pix_fmt;
1017 avctx->time_base = (AVRational){s->sys->frame_rate_base, s->sys->frame_rate};
1018 avcodec_set_dimensions(avctx, s->sys->width, s->sys->height);
1019 if(avctx->get_buffer(avctx, &s->picture) < 0) {
1020 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
1023 s->picture.interlaced_frame = 1;
1024 s->picture.top_field_first = 0;
1027 avctx->execute(avctx, dv_decode_mt, (void**)&dv_anchor[0], NULL,
1028 s->sys->n_difchan * s->sys->difseg_size * 27);
1033 *data_size = sizeof(AVFrame);
1034 *(AVFrame*)data= s->picture;
1036 return s->sys->frame_size;
1041 static inline int dv_write_pack(enum dv_pack_type pack_id, DVVideoContext *c, uint8_t* buf)
1044 * Here's what SMPTE314M says about these two:
1045 * (page 6) APTn, AP1n, AP2n, AP3n: These data shall be identical
1046 * as track application IDs (APTn = 001, AP1n =
1047 * 001, AP2n = 001, AP3n = 001), if the source signal
1048 * comes from a digital VCR. If the signal source is
1049 * unknown, all bits for these data shall be set to 1.
1050 * (page 12) STYPE: STYPE defines a signal type of video signal
1051 * 00000b = 4:1:1 compression
1052 * 00100b = 4:2:2 compression
1054 * Now, I've got two problems with these statements:
1055 * 1. it looks like APT == 111b should be a safe bet, but it isn't.
1056 * It seems that for PAL as defined in IEC 61834 we have to set
1057 * APT to 000 and for SMPTE314M to 001.
1058 * 2. It is not at all clear what STYPE is used for 4:2:0 PAL
1059 * compression scheme (if any).
1061 int apt = (c->sys->pix_fmt == PIX_FMT_YUV420P ? 0 : 1);
1062 int stype = (c->sys->pix_fmt == PIX_FMT_YUV422P ? 4 : 0);
1065 if((int)(av_q2d(c->avctx->sample_aspect_ratio) * c->avctx->width / c->avctx->height * 10) == 17) /* 16:9 */
1068 buf[0] = (uint8_t)pack_id;
1070 case dv_header525: /* I can't imagine why these two weren't defined as real */
1071 case dv_header625: /* packs in SMPTE314M -- they definitely look like ones */
1072 buf[1] = 0xf8 | /* reserved -- always 1 */
1073 (apt & 0x07); /* APT: Track application ID */
1074 buf[2] = (0 << 7) | /* TF1: audio data is 0 - valid; 1 - invalid */
1075 (0x0f << 3) | /* reserved -- always 1 */
1076 (apt & 0x07); /* AP1: Audio application ID */
1077 buf[3] = (0 << 7) | /* TF2: video data is 0 - valid; 1 - invalid */
1078 (0x0f << 3) | /* reserved -- always 1 */
1079 (apt & 0x07); /* AP2: Video application ID */
1080 buf[4] = (0 << 7) | /* TF3: subcode(SSYB) is 0 - valid; 1 - invalid */
1081 (0x0f << 3) | /* reserved -- always 1 */
1082 (apt & 0x07); /* AP3: Subcode application ID */
1084 case dv_video_source:
1085 buf[1] = 0xff; /* reserved -- always 1 */
1086 buf[2] = (1 << 7) | /* B/W: 0 - b/w, 1 - color */
1087 (1 << 6) | /* following CLF is valid - 0, invalid - 1 */
1088 (3 << 4) | /* CLF: color frames id (see ITU-R BT.470-4) */
1089 0xf; /* reserved -- always 1 */
1090 buf[3] = (3 << 6) | /* reserved -- always 1 */
1091 (c->sys->dsf << 5) | /* system: 60fields/50fields */
1092 stype; /* signal type video compression */
1093 buf[4] = 0xff; /* VISC: 0xff -- no information */
1095 case dv_video_control:
1096 buf[1] = (0 << 6) | /* Copy generation management (CGMS) 0 -- free */
1097 0x3f; /* reserved -- always 1 */
1098 buf[2] = 0xc8 | /* reserved -- always b11001xxx */
1100 buf[3] = (1 << 7) | /* Frame/field flag 1 -- frame, 0 -- field */
1101 (1 << 6) | /* First/second field flag 0 -- field 2, 1 -- field 1 */
1102 (1 << 5) | /* Frame change flag 0 -- same picture as before, 1 -- different */
1103 (1 << 4) | /* 1 - interlaced, 0 - noninterlaced */
1104 0xc; /* reserved -- always b1100 */
1105 buf[4] = 0xff; /* reserved -- always 1 */
1108 buf[1] = buf[2] = buf[3] = buf[4] = 0xff;
1113 #ifdef CONFIG_DVVIDEO_ENCODER
1114 static void dv_format_frame(DVVideoContext* c, uint8_t* buf)
1118 for (chan = 0; chan < c->sys->n_difchan; chan++) {
1119 for (i = 0; i < c->sys->difseg_size; i++) {
1120 memset(buf, 0xff, 80 * 6); /* First 6 DIF blocks are for control data */
1122 /* DV header: 1DIF */
1123 buf += dv_write_dif_id(dv_sect_header, chan, i, 0, buf);
1124 buf += dv_write_pack((c->sys->dsf ? dv_header625 : dv_header525), c, buf);
1125 buf += 72; /* unused bytes */
1127 /* DV subcode: 2DIFs */
1128 for (j = 0; j < 2; j++) {
1129 buf += dv_write_dif_id(dv_sect_subcode, chan, i, j, buf);
1130 for (k = 0; k < 6; k++)
1131 buf += dv_write_ssyb_id(k, (i < c->sys->difseg_size/2), buf) + 5;
1132 buf += 29; /* unused bytes */
1135 /* DV VAUX: 3DIFS */
1136 for (j = 0; j < 3; j++) {
1137 buf += dv_write_dif_id(dv_sect_vaux, chan, i, j, buf);
1138 buf += dv_write_pack(dv_video_source, c, buf);
1139 buf += dv_write_pack(dv_video_control, c, buf);
1141 buf += dv_write_pack(dv_video_source, c, buf);
1142 buf += dv_write_pack(dv_video_control, c, buf);
1143 buf += 4*5 + 2; /* unused bytes */
1146 /* DV Audio/Video: 135 Video DIFs + 9 Audio DIFs */
1147 for (j = 0; j < 135; j++) {
1149 memset(buf, 0xff, 80);
1150 buf += dv_write_dif_id(dv_sect_audio, chan, i, j/15, buf);
1151 buf += 77; /* audio control & shuffled PCM audio */
1153 buf += dv_write_dif_id(dv_sect_video, chan, i, j, buf);
1154 buf += 77; /* 1 video macro block: 1 bytes control
1155 4 * 14 bytes Y 8x8 data
1156 10 bytes Cr 8x8 data
1157 10 bytes Cb 8x8 data */
1164 static int dvvideo_encode_frame(AVCodecContext *c, uint8_t *buf, int buf_size,
1167 DVVideoContext *s = c->priv_data;
1169 s->sys = dv_codec_profile(c);
1172 if(buf_size < s->sys->frame_size)
1175 c->pix_fmt = s->sys->pix_fmt;
1176 s->picture = *((AVFrame *)data);
1177 s->picture.key_frame = 1;
1178 s->picture.pict_type = FF_I_TYPE;
1181 c->execute(c, dv_encode_mt, (void**)&dv_anchor[0], NULL,
1182 s->sys->n_difchan * s->sys->difseg_size * 27);
1186 dv_format_frame(s, buf);
1188 return s->sys->frame_size;
1192 static int dvvideo_close(AVCodecContext *c)
1194 DVVideoContext *s = c->priv_data;
1196 if(s->picture.data[0])
1197 c->release_buffer(c, &s->picture);
1203 #ifdef CONFIG_DVVIDEO_ENCODER
1204 AVCodec dvvideo_encoder = {
1208 sizeof(DVVideoContext),
1210 dvvideo_encode_frame,
1211 .pix_fmts = (enum PixelFormat[]) {PIX_FMT_YUV411P, PIX_FMT_YUV422P, PIX_FMT_YUV420P, PIX_FMT_NONE},
1212 .long_name = NULL_IF_CONFIG_SMALL("DV (Digital Video)"),
1214 #endif // CONFIG_DVVIDEO_ENCODER
1216 #ifdef CONFIG_DVVIDEO_DECODER
1217 AVCodec dvvideo_decoder = {
1221 sizeof(DVVideoContext),
1225 dvvideo_decode_frame,
1228 .long_name = NULL_IF_CONFIG_SMALL("DV (Digital Video)"),