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 */
251 uint8_t partial_bit_count;
252 uint16_t partial_bit_buffer;
256 /* block size in bits */
257 static const uint16_t block_sizes[6] = {
258 112, 112, 112, 112, 80, 80
260 /* bit budget for AC only in 5 MBs */
261 static const int vs_total_ac_bits = (100 * 4 + 68*2) * 5;
262 /* see dv_88_areas and dv_248_areas for details */
263 static const int mb_area_start[5] = { 1, 6, 21, 43, 64 };
265 static inline int get_bits_left(GetBitContext *s)
267 return s->size_in_bits - get_bits_count(s);
270 static inline int put_bits_left(PutBitContext* s)
272 return (s->buf_end - s->buf) * 8 - put_bits_count(s);
275 /* decode ac coefs */
276 static void dv_decode_ac(GetBitContext *gb, BlockInfo *mb, DCTELEM *block)
278 int last_index = gb->size_in_bits;
279 const uint8_t *scan_table = mb->scan_table;
280 const uint32_t *factor_table = mb->factor_table;
282 int partial_bit_count = mb->partial_bit_count;
283 int level, run, vlc_len, index;
286 UPDATE_CACHE(re, gb);
288 /* if we must parse a partial vlc, we do it here */
289 if (partial_bit_count > 0) {
290 re_cache = ((unsigned)re_cache >> partial_bit_count) |
291 (mb->partial_bit_buffer << (sizeof(re_cache)*8 - partial_bit_count));
292 re_index -= partial_bit_count;
293 mb->partial_bit_count = 0;
296 /* get the AC coefficients until last_index is reached */
299 printf("%2d: bits=%04x index=%d\n", 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].len;
305 index = NEG_USR32((unsigned)re_cache << TEX_VLC_BITS, -vlc_len) + dv_rl_vlc[index].level;
306 vlc_len = TEX_VLC_BITS - vlc_len;
308 level = dv_rl_vlc[index].level;
309 run = dv_rl_vlc[index].run;
311 /* gotta check if we're still within gb boundaries */
312 if (re_index + vlc_len > last_index) {
313 /* should be < 16 bits otherwise a codeword could have been parsed */
314 mb->partial_bit_count = last_index - re_index;
315 mb->partial_bit_buffer = NEG_USR32(re_cache, mb->partial_bit_count);
316 re_index = last_index;
322 printf("run=%d level=%d\n", run, level);
328 level = (level*factor_table[pos] + (1 << (dv_iweight_bits-1))) >> dv_iweight_bits;
329 block[scan_table[pos]] = level;
331 UPDATE_CACHE(re, gb);
333 CLOSE_READER(re, gb);
337 static inline void bit_copy(PutBitContext *pb, GetBitContext *gb)
339 int bits_left = get_bits_left(gb);
340 while (bits_left >= MIN_CACHE_BITS) {
341 put_bits(pb, MIN_CACHE_BITS, get_bits(gb, MIN_CACHE_BITS));
342 bits_left -= MIN_CACHE_BITS;
345 put_bits(pb, bits_left, get_bits(gb, bits_left));
349 /* mb_x and mb_y are in units of 8 pixels */
350 static inline void dv_decode_video_segment(DVVideoContext *s,
351 const uint8_t *buf_ptr1,
352 const uint16_t *mb_pos_ptr)
354 int quant, dc, dct_mode, class1, j;
355 int mb_index, mb_x, mb_y, v, last_index;
356 DCTELEM *block, *block1;
359 void (*idct_put)(uint8_t *dest, int line_size, DCTELEM *block);
360 const uint8_t *buf_ptr;
361 PutBitContext pb, vs_pb;
363 BlockInfo mb_data[5 * 6], *mb, *mb1;
364 DECLARE_ALIGNED_16(DCTELEM, sblock[5*6][64]);
365 DECLARE_ALIGNED_8(uint8_t, mb_bit_buffer[80 + 4]); /* allow some slack */
366 DECLARE_ALIGNED_8(uint8_t, vs_bit_buffer[5 * 80 + 4]); /* allow some slack */
367 const int log2_blocksize= 3-s->avctx->lowres;
369 assert((((int)mb_bit_buffer)&7)==0);
370 assert((((int)vs_bit_buffer)&7)==0);
372 memset(sblock, 0, sizeof(sblock));
374 /* pass 1 : read DC and AC coefficients in blocks */
376 block1 = &sblock[0][0];
378 init_put_bits(&vs_pb, vs_bit_buffer, 5 * 80);
379 for(mb_index = 0; mb_index < 5; mb_index++, mb1 += 6, block1 += 6 * 64) {
381 quant = buf_ptr[3] & 0x0f;
383 init_put_bits(&pb, mb_bit_buffer, 80);
386 for(j = 0;j < 6; j++) {
387 last_index = block_sizes[j];
388 init_get_bits(&gb, buf_ptr, last_index);
391 dc = get_sbits(&gb, 9);
392 dct_mode = get_bits1(&gb);
393 mb->dct_mode = dct_mode;
394 mb->scan_table = s->dv_zigzag[dct_mode];
395 class1 = get_bits(&gb, 2);
396 mb->factor_table = s->dv_idct_factor[class1 == 3][dct_mode]
397 [quant + dv_quant_offset[class1]];
399 /* convert to unsigned because 128 is not added in the
403 buf_ptr += last_index >> 3;
405 mb->partial_bit_count = 0;
408 printf("MB block: %d, %d ", mb_index, j);
410 dv_decode_ac(&gb, mb, block);
412 /* write the remaining bits in a new buffer only if the
421 /* pass 2 : we can do it just after */
423 printf("***pass 2 size=%d MB#=%d\n", put_bits_count(&pb), mb_index);
427 init_get_bits(&gb, mb_bit_buffer, put_bits_count(&pb));
429 for(j = 0;j < 6; j++, block += 64, mb++) {
430 if (mb->pos < 64 && get_bits_left(&gb) > 0) {
431 dv_decode_ac(&gb, mb, block);
432 /* if still not finished, no need to parse other blocks */
437 /* all blocks are finished, so the extra bytes can be used at
438 the video segment level */
440 bit_copy(&vs_pb, &gb);
443 /* we need a pass other the whole video segment */
445 printf("***pass 3 size=%d\n", put_bits_count(&vs_pb));
447 block = &sblock[0][0];
449 init_get_bits(&gb, vs_bit_buffer, put_bits_count(&vs_pb));
450 flush_put_bits(&vs_pb);
451 for(mb_index = 0; mb_index < 5; mb_index++) {
452 for(j = 0;j < 6; j++) {
455 printf("start %d:%d\n", mb_index, j);
457 dv_decode_ac(&gb, mb, block);
459 if (mb->pos >= 64 && mb->pos < 127)
460 av_log(NULL, AV_LOG_ERROR, "AC EOB marker is absent pos=%d\n", mb->pos);
466 /* compute idct and place blocks */
467 block = &sblock[0][0];
469 for(mb_index = 0; mb_index < 5; mb_index++) {
473 y_ptr = s->picture.data[0] + ((mb_y * s->picture.linesize[0] + mb_x)<<log2_blocksize);
474 c_offset = (((mb_y>>(s->sys->pix_fmt == PIX_FMT_YUV420P)) * s->picture.linesize[1] +
475 (mb_x>>((s->sys->pix_fmt == PIX_FMT_YUV411P)?2:1)))<<log2_blocksize);
477 for(j = 0;j < 6; j++) {
478 idct_put = s->idct_put[mb->dct_mode && log2_blocksize==3];
479 if (s->sys->pix_fmt == PIX_FMT_YUV422P) { /* 4:2:2 */
480 if (j == 0 || j == 2) {
482 idct_put(y_ptr + ((j >> 1)<<log2_blocksize),
483 s->picture.linesize[0], block);
486 idct_put(s->picture.data[6 - j] + c_offset,
487 s->picture.linesize[6 - j], block);
489 /* note: j=1 and j=3 are "dummy" blocks in 4:2:2 */
490 } else { /* 4:1:1 or 4:2:0 */
492 if (s->sys->pix_fmt == PIX_FMT_YUV411P && mb_x < (704 / 8)) {
493 /* NOTE: at end of line, the macroblock is handled as 420 */
494 idct_put(y_ptr + (j<<log2_blocksize), s->picture.linesize[0], block);
496 idct_put(y_ptr + (((j & 1) + (j >> 1) * s->picture.linesize[0])<<log2_blocksize),
497 s->picture.linesize[0], block);
500 if (s->sys->pix_fmt == PIX_FMT_YUV411P && mb_x >= (704 / 8)) {
501 uint64_t aligned_pixels[64/8];
502 uint8_t *pixels= (uint8_t*)aligned_pixels;
503 uint8_t *c_ptr, *c_ptr1, *ptr, *ptr1;
505 /* NOTE: at end of line, the macroblock is handled as 420 */
506 idct_put(pixels, 8, block);
507 linesize = s->picture.linesize[6 - j];
508 c_ptr = s->picture.data[6 - j] + c_offset;
510 for(y = 0;y < (1<<log2_blocksize); y++) {
511 ptr1= ptr + (1<<(log2_blocksize-1));
512 c_ptr1 = c_ptr + (linesize<<log2_blocksize);
513 for(x=0; x < (1<<(log2_blocksize-1)); x++){
514 c_ptr[x]= ptr[x]; c_ptr1[x]= ptr1[x];
520 /* don't ask me why they inverted Cb and Cr ! */
521 idct_put(s->picture.data[6 - j] + c_offset,
522 s->picture.linesize[6 - j], block);
532 #ifdef DV_CODEC_TINY_TARGET
533 /* Converts run and level (where level != 0) pair into vlc, returning bit size */
534 static av_always_inline int dv_rl2vlc(int run, int level, int sign, uint32_t* vlc)
537 if (run < DV_VLC_MAP_RUN_SIZE && level < DV_VLC_MAP_LEV_SIZE) {
538 *vlc = dv_vlc_map[run][level].vlc | sign;
539 size = dv_vlc_map[run][level].size;
542 if (level < DV_VLC_MAP_LEV_SIZE) {
543 *vlc = dv_vlc_map[0][level].vlc | sign;
544 size = dv_vlc_map[0][level].size;
546 *vlc = 0xfe00 | (level << 1) | sign;
550 *vlc |= ((run < 16) ? dv_vlc_map[run-1][0].vlc :
551 (0x1f80 | (run - 1))) << size;
552 size += (run < 16) ? dv_vlc_map[run-1][0].size : 13;
559 static av_always_inline int dv_rl2vlc_size(int run, int level)
563 if (run < DV_VLC_MAP_RUN_SIZE && level < DV_VLC_MAP_LEV_SIZE) {
564 size = dv_vlc_map[run][level].size;
567 size = (level < DV_VLC_MAP_LEV_SIZE) ? dv_vlc_map[0][level].size : 16;
569 size += (run < 16) ? dv_vlc_map[run-1][0].size : 13;
575 static av_always_inline int dv_rl2vlc(int run, int l, int sign, uint32_t* vlc)
577 *vlc = dv_vlc_map[run][l].vlc | sign;
578 return dv_vlc_map[run][l].size;
581 static av_always_inline int dv_rl2vlc_size(int run, int l)
583 return dv_vlc_map[run][l].size;
587 typedef struct EncBlockInfo {
597 uint8_t partial_bit_count;
598 uint32_t partial_bit_buffer; /* we can't use uint16_t here */
601 static av_always_inline PutBitContext* dv_encode_ac(EncBlockInfo* bi, PutBitContext* pb_pool,
602 PutBitContext* pb_end)
606 PutBitContext* pb = pb_pool;
607 int size = bi->partial_bit_count;
608 uint32_t vlc = bi->partial_bit_buffer;
610 bi->partial_bit_count = bi->partial_bit_buffer = 0;
612 /* Find suitable storage space */
613 for (; size > (bits_left = put_bits_left(pb)); pb++) {
616 put_bits(pb, bits_left, vlc >> size);
617 vlc = vlc & ((1<<size)-1);
619 if (pb + 1 >= pb_end) {
620 bi->partial_bit_count = size;
621 bi->partial_bit_buffer = vlc;
627 put_bits(pb, size, vlc);
632 /* Construct the next VLC */
634 bi->cur_ac = bi->next[prev];
636 size = dv_rl2vlc(bi->cur_ac - prev - 1, bi->mb[bi->cur_ac], bi->sign[bi->cur_ac], &vlc);
638 size = 4; vlc = 6; /* End Of Block stamp */
644 static av_always_inline void dv_set_class_number(DCTELEM* blk, EncBlockInfo* bi,
645 const uint8_t* zigzag_scan, const int *weight, int bias)
648 /* We offer two different methods for class number assignment: the
649 method suggested in SMPTE 314M Table 22, and an improved
650 method. The SMPTE method is very conservative; it assigns class
651 3 (i.e. severe quantization) to any block where the largest AC
652 component is greater than 36. ffmpeg's DV encoder tracks AC bit
653 consumption precisely, so there is no need to bias most blocks
654 towards strongly lossy compression. Instead, we assign class 2
655 to most blocks, and use class 3 only when strictly necessary
656 (for blocks whose largest AC component exceeds 255). */
658 #if 0 /* SMPTE spec method */
659 static const int classes[] = {12, 24, 36, 0xffff};
660 #else /* improved ffmpeg method */
661 static const int classes[] = {-1, -1, 255, 0xffff};
668 for (area = 0; area < 4; area++) {
669 bi->prev[area] = prev;
670 bi->bit_size[area] = 1; // 4 areas 4 bits for EOB :)
671 for (i=mb_area_start[area]; i<mb_area_start[area+1]; i++) {
672 int level = blk[zigzag_scan[i]];
674 if (level+15 > 30U) {
675 bi->sign[i] = (level>>31)&1;
676 /* weigh it and and shift down into range, adding for rounding */
677 /* the extra division by a factor of 2^4 reverses the 8x expansion of the DCT
678 AND the 2x doubling of the weights */
679 level = (FFABS(level) * weight[i] + (1<<(dv_weight_bits+3))) >> (dv_weight_bits+4);
681 if(level>max) max= level;
682 bi->bit_size[area] += dv_rl2vlc_size(i - prev - 1, level);
689 for(bi->cno = 0; max > classes[bi->cno]; bi->cno++);
697 for (area = 0; area < 4; area++) {
698 bi->prev[area] = prev;
699 bi->bit_size[area] = 1; // 4 areas 4 bits for EOB :)
700 for (; i<mb_area_start[area+1]; i= bi->next[i]) {
704 bi->bit_size[area] += dv_rl2vlc_size(i - prev - 1, bi->mb[i]);
714 //FIXME replace this by dsputil
715 #define SC(x, y) ((s[x] - s[y]) ^ ((s[x] - s[y]) >> 7))
716 static av_always_inline int dv_guess_dct_mode(DCTELEM *blk) {
722 /* Compute 8-8 score (small values give a better chance for 8-8 DCT) */
725 score88 += SC(0, 8) + SC(1, 9) + SC(2, 10) + SC(3, 11) +
726 SC(4, 12) + SC(5,13) + SC(6, 14) + SC(7, 15);
729 /* Compute 2-4-8 score (small values give a better chance for 2-4-8 DCT) */
732 score248 += SC(0, 16) + SC(1,17) + SC(2, 18) + SC(3, 19) +
733 SC(4, 20) + SC(5,21) + SC(6, 22) + SC(7, 23);
737 return (score88 - score248 > -10);
740 static inline void dv_guess_qnos(EncBlockInfo* blks, int* qnos)
743 int i, j, k, a, prev, a2;
746 size[0] = size[1] = size[2] = size[3] = size[4] = 1<<24;
749 for (i=0; i<5; i++) {
755 for (j=0; j<6; j++, b++) {
756 for (a=0; a<4; a++) {
757 if (b->area_q[a] != dv_quant_shifts[qnos[i] + dv_quant_offset[b->cno]][a]) {
758 b->bit_size[a] = 1; // 4 areas 4 bits for EOB :)
761 assert(b->next[prev] >= mb_area_start[a+1] || b->mb[prev]);
762 for (k= b->next[prev] ; k<mb_area_start[a+1]; k= b->next[k]) {
765 b->bit_size[a] += dv_rl2vlc_size(k - prev - 1, b->mb[k]);
768 if(b->next[k] >= mb_area_start[a+1] && b->next[k]<64){
769 for(a2=a+1; b->next[k] >= mb_area_start[a2+1]; a2++)
772 assert(b->mb[b->next[k]]);
773 b->bit_size[a2] += dv_rl2vlc_size(b->next[k] - prev - 1, b->mb[b->next[k]])
774 -dv_rl2vlc_size(b->next[k] - k - 1, b->mb[b->next[k]]);
775 assert(b->prev[a2]==k && (a2+1 >= 4 || b->prev[a2+1]!=k));
778 b->next[prev] = b->next[k];
783 size[i] += b->bit_size[a];
786 if(vs_total_ac_bits >= size[0] + size[1] + size[2] + size[3] + size[4])
789 } while (qnos[0]|qnos[1]|qnos[2]|qnos[3]|qnos[4]);
792 for(a=2; a==2 || vs_total_ac_bits < size[0]; a+=a){
794 size[0] = 5*6*4; //EOB
795 for (j=0; j<6*5; j++, b++) {
797 for (k= b->next[prev]; k<64; k= b->next[k]) {
798 if(b->mb[k] < a && b->mb[k] > -a){
799 b->next[prev] = b->next[k];
801 size[0] += dv_rl2vlc_size(k - prev - 1, b->mb[k]);
809 static inline void dv_encode_video_segment(DVVideoContext *s,
811 const uint16_t *mb_pos_ptr)
813 int mb_index, i, j, v;
814 int mb_x, mb_y, c_offset, linesize;
819 DECLARE_ALIGNED_16(DCTELEM, block[64]);
820 EncBlockInfo enc_blks[5*6];
821 PutBitContext pbs[5*6];
823 EncBlockInfo* enc_blk;
827 assert((((int)block) & 15) == 0);
829 enc_blk = &enc_blks[0];
831 for(mb_index = 0; mb_index < 5; mb_index++) {
835 y_ptr = s->picture.data[0] + ((mb_y * s->picture.linesize[0] + mb_x)<<3);
836 c_offset = (((mb_y>>(s->sys->pix_fmt == PIX_FMT_YUV420P)) * s->picture.linesize[1] +
837 (mb_x>>((s->sys->pix_fmt == PIX_FMT_YUV411P)?2:1)))<<3);
839 qnos[mb_index] = 15; /* No quantization */
840 ptr = dif + mb_index*80 + 4;
841 for(j = 0;j < 6; j++) {
843 if (s->sys->pix_fmt == PIX_FMT_YUV422P) { /* 4:2:2 */
844 if (j == 0 || j == 2) {
846 data = y_ptr + ((j>>1) * 8);
847 linesize = s->picture.linesize[0];
850 data = s->picture.data[6 - j] + c_offset;
851 linesize = s->picture.linesize[6 - j];
853 /* j=1 and j=3 are "dummy" blocks, used for AC data only */
858 } else { /* 4:1:1 or 4:2:0 */
859 if (j < 4) { /* Four Y blocks */
860 /* NOTE: at end of line, the macroblock is handled as 420 */
861 if (s->sys->pix_fmt == PIX_FMT_YUV411P && mb_x < (704 / 8)) {
862 data = y_ptr + (j * 8);
864 data = y_ptr + ((j & 1) * 8) + ((j >> 1) * 8 * s->picture.linesize[0]);
866 linesize = s->picture.linesize[0];
867 } else { /* Cr and Cb blocks */
868 /* don't ask Fabrice why they inverted Cb and Cr ! */
869 data = s->picture.data[6 - j] + c_offset;
870 linesize = s->picture.linesize[6 - j];
871 if (s->sys->pix_fmt == PIX_FMT_YUV411P && mb_x >= (704 / 8))
876 /* Everything is set up -- now just copy data -> DCT block */
877 if (do_edge_wrap) { /* Edge wrap copy: 4x16 -> 8x8 */
881 d = data + 8 * linesize;
882 b[0] = data[0]; b[1] = data[1]; b[2] = data[2]; b[3] = data[3];
883 b[4] = d[0]; b[5] = d[1]; b[6] = d[2]; b[7] = d[3];
887 } else { /* Simple copy: 8x8 -> 8x8 */
889 s->get_pixels(block, data, linesize);
892 if(s->avctx->flags & CODEC_FLAG_INTERLACED_DCT)
893 enc_blk->dct_mode = dv_guess_dct_mode(block);
895 enc_blk->dct_mode = 0;
896 enc_blk->area_q[0] = enc_blk->area_q[1] = enc_blk->area_q[2] = enc_blk->area_q[3] = 0;
897 enc_blk->partial_bit_count = 0;
898 enc_blk->partial_bit_buffer = 0;
902 /* We rely on the fact that encoding all zeros leads to an immediate EOB,
903 which is precisely what the spec calls for in the "dummy" blocks. */
904 memset(block, 0, sizeof(block));
906 s->fdct[enc_blk->dct_mode](block);
909 dv_set_class_number(block, enc_blk,
910 enc_blk->dct_mode ? ff_zigzag248_direct : ff_zigzag_direct,
911 enc_blk->dct_mode ? dv_weight_248 : dv_weight_88,
914 init_put_bits(pb, ptr, block_sizes[j]/8);
915 put_bits(pb, 9, (uint16_t)(((enc_blk->mb[0] >> 3) - 1024 + 2) >> 2));
916 put_bits(pb, 1, enc_blk->dct_mode);
917 put_bits(pb, 2, enc_blk->cno);
919 vs_bit_size += enc_blk->bit_size[0] + enc_blk->bit_size[1] +
920 enc_blk->bit_size[2] + enc_blk->bit_size[3];
923 ptr += block_sizes[j]/8;
927 if (vs_total_ac_bits < vs_bit_size)
928 dv_guess_qnos(&enc_blks[0], &qnos[0]);
930 for (i=0; i<5; i++) {
931 dif[i*80 + 3] = qnos[i];
934 /* First pass over individual cells only */
935 for (j=0; j<5*6; j++)
936 dv_encode_ac(&enc_blks[j], &pbs[j], &pbs[j+1]);
938 /* Second pass over each MB space */
939 for (j=0; j<5*6; j+=6) {
941 for (i=0; i<6; i++) {
942 if (enc_blks[i+j].partial_bit_count)
943 pb=dv_encode_ac(&enc_blks[i+j], pb, &pbs[j+6]);
947 /* Third and final pass over the whole vides segment space */
949 for (j=0; j<5*6; j++) {
950 if (enc_blks[j].partial_bit_count)
951 pb=dv_encode_ac(&enc_blks[j], pb, &pbs[6*5]);
952 if (enc_blks[j].partial_bit_count)
953 av_log(NULL, AV_LOG_ERROR, "ac bitstream overflow\n");
956 for (j=0; j<5*6; j++)
957 flush_put_bits(&pbs[j]);
960 static int dv_decode_mt(AVCodecContext *avctx, void* sl)
962 DVVideoContext *s = avctx->priv_data;
963 int slice = (size_t)sl;
965 /* which DIF channel is this? */
966 int chan = slice / (s->sys->difseg_size * 27);
968 /* slice within the DIF channel */
969 int chan_slice = slice % (s->sys->difseg_size * 27);
971 /* byte offset of this channel's data */
972 int chan_offset = chan * s->sys->difseg_size * 150 * 80;
974 dv_decode_video_segment(s, &s->buf[((chan_slice/27)*6+(chan_slice/3)+chan_slice*5+7)*80 + chan_offset],
975 &s->sys->video_place[slice*5]);
979 #ifdef CONFIG_DVVIDEO_ENCODER
980 static int dv_encode_mt(AVCodecContext *avctx, void* sl)
982 DVVideoContext *s = avctx->priv_data;
983 int slice = (size_t)sl;
985 /* which DIF channel is this? */
986 int chan = slice / (s->sys->difseg_size * 27);
988 /* slice within the DIF channel */
989 int chan_slice = slice % (s->sys->difseg_size * 27);
991 /* byte offset of this channel's data */
992 int chan_offset = chan * s->sys->difseg_size * 150 * 80;
994 dv_encode_video_segment(s, &s->buf[((chan_slice/27)*6+(chan_slice/3)+chan_slice*5+7)*80 + chan_offset],
995 &s->sys->video_place[slice*5]);
1000 #ifdef CONFIG_DECODERS
1001 /* NOTE: exactly one frame must be given (120000 bytes for NTSC,
1002 144000 bytes for PAL - or twice those for 50Mbps) */
1003 static int dvvideo_decode_frame(AVCodecContext *avctx,
1004 void *data, int *data_size,
1005 const uint8_t *buf, int buf_size)
1007 DVVideoContext *s = avctx->priv_data;
1009 s->sys = dv_frame_profile(buf);
1010 if (!s->sys || buf_size < s->sys->frame_size)
1011 return -1; /* NOTE: we only accept several full frames */
1013 if(s->picture.data[0])
1014 avctx->release_buffer(avctx, &s->picture);
1016 s->picture.reference = 0;
1017 s->picture.key_frame = 1;
1018 s->picture.pict_type = FF_I_TYPE;
1019 avctx->pix_fmt = s->sys->pix_fmt;
1020 avctx->time_base = (AVRational){s->sys->frame_rate_base, s->sys->frame_rate};
1021 avcodec_set_dimensions(avctx, s->sys->width, s->sys->height);
1022 if(avctx->get_buffer(avctx, &s->picture) < 0) {
1023 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
1026 s->picture.interlaced_frame = 1;
1027 s->picture.top_field_first = 0;
1030 avctx->execute(avctx, dv_decode_mt, (void**)&dv_anchor[0], NULL,
1031 s->sys->n_difchan * s->sys->difseg_size * 27);
1036 *data_size = sizeof(AVFrame);
1037 *(AVFrame*)data= s->picture;
1039 return s->sys->frame_size;
1044 static inline int dv_write_pack(enum dv_pack_type pack_id, DVVideoContext *c, uint8_t* buf)
1047 * Here's what SMPTE314M says about these two:
1048 * (page 6) APTn, AP1n, AP2n, AP3n: These data shall be identical
1049 * as track application IDs (APTn = 001, AP1n =
1050 * 001, AP2n = 001, AP3n = 001), if the source signal
1051 * comes from a digital VCR. If the signal source is
1052 * unknown, all bits for these data shall be set to 1.
1053 * (page 12) STYPE: STYPE defines a signal type of video signal
1054 * 00000b = 4:1:1 compression
1055 * 00100b = 4:2:2 compression
1057 * Now, I've got two problems with these statements:
1058 * 1. it looks like APT == 111b should be a safe bet, but it isn't.
1059 * It seems that for PAL as defined in IEC 61834 we have to set
1060 * APT to 000 and for SMPTE314M to 001.
1061 * 2. It is not at all clear what STYPE is used for 4:2:0 PAL
1062 * compression scheme (if any).
1064 int apt = (c->sys->pix_fmt == PIX_FMT_YUV420P ? 0 : 1);
1065 int stype = (c->sys->pix_fmt == PIX_FMT_YUV422P ? 4 : 0);
1068 if((int)(av_q2d(c->avctx->sample_aspect_ratio) * c->avctx->width / c->avctx->height * 10) == 17) /* 16:9 */
1071 buf[0] = (uint8_t)pack_id;
1073 case dv_header525: /* I can't imagine why these two weren't defined as real */
1074 case dv_header625: /* packs in SMPTE314M -- they definitely look like ones */
1075 buf[1] = 0xf8 | /* reserved -- always 1 */
1076 (apt & 0x07); /* APT: Track application ID */
1077 buf[2] = (0 << 7) | /* TF1: audio data is 0 - valid; 1 - invalid */
1078 (0x0f << 3) | /* reserved -- always 1 */
1079 (apt & 0x07); /* AP1: Audio application ID */
1080 buf[3] = (0 << 7) | /* TF2: video data is 0 - valid; 1 - invalid */
1081 (0x0f << 3) | /* reserved -- always 1 */
1082 (apt & 0x07); /* AP2: Video application ID */
1083 buf[4] = (0 << 7) | /* TF3: subcode(SSYB) is 0 - valid; 1 - invalid */
1084 (0x0f << 3) | /* reserved -- always 1 */
1085 (apt & 0x07); /* AP3: Subcode application ID */
1087 case dv_video_source:
1088 buf[1] = 0xff; /* reserved -- always 1 */
1089 buf[2] = (1 << 7) | /* B/W: 0 - b/w, 1 - color */
1090 (1 << 6) | /* following CLF is valid - 0, invalid - 1 */
1091 (3 << 4) | /* CLF: color frames id (see ITU-R BT.470-4) */
1092 0xf; /* reserved -- always 1 */
1093 buf[3] = (3 << 6) | /* reserved -- always 1 */
1094 (c->sys->dsf << 5) | /* system: 60fields/50fields */
1095 stype; /* signal type video compression */
1096 buf[4] = 0xff; /* VISC: 0xff -- no information */
1098 case dv_video_control:
1099 buf[1] = (0 << 6) | /* Copy generation management (CGMS) 0 -- free */
1100 0x3f; /* reserved -- always 1 */
1101 buf[2] = 0xc8 | /* reserved -- always b11001xxx */
1103 buf[3] = (1 << 7) | /* Frame/field flag 1 -- frame, 0 -- field */
1104 (1 << 6) | /* First/second field flag 0 -- field 2, 1 -- field 1 */
1105 (1 << 5) | /* Frame change flag 0 -- same picture as before, 1 -- different */
1106 (1 << 4) | /* 1 - interlaced, 0 - noninterlaced */
1107 0xc; /* reserved -- always b1100 */
1108 buf[4] = 0xff; /* reserved -- always 1 */
1111 buf[1] = buf[2] = buf[3] = buf[4] = 0xff;
1116 #ifdef CONFIG_DVVIDEO_ENCODER
1117 static void dv_format_frame(DVVideoContext* c, uint8_t* buf)
1121 for (chan = 0; chan < c->sys->n_difchan; chan++) {
1122 for (i = 0; i < c->sys->difseg_size; i++) {
1123 memset(buf, 0xff, 80 * 6); /* First 6 DIF blocks are for control data */
1125 /* DV header: 1DIF */
1126 buf += dv_write_dif_id(dv_sect_header, chan, i, 0, buf);
1127 buf += dv_write_pack((c->sys->dsf ? dv_header625 : dv_header525), c, buf);
1128 buf += 72; /* unused bytes */
1130 /* DV subcode: 2DIFs */
1131 for (j = 0; j < 2; j++) {
1132 buf += dv_write_dif_id(dv_sect_subcode, chan, i, j, buf);
1133 for (k = 0; k < 6; k++)
1134 buf += dv_write_ssyb_id(k, (i < c->sys->difseg_size/2), buf) + 5;
1135 buf += 29; /* unused bytes */
1138 /* DV VAUX: 3DIFS */
1139 for (j = 0; j < 3; j++) {
1140 buf += dv_write_dif_id(dv_sect_vaux, chan, i, j, buf);
1141 buf += dv_write_pack(dv_video_source, c, buf);
1142 buf += dv_write_pack(dv_video_control, c, buf);
1144 buf += dv_write_pack(dv_video_source, c, buf);
1145 buf += dv_write_pack(dv_video_control, c, buf);
1146 buf += 4*5 + 2; /* unused bytes */
1149 /* DV Audio/Video: 135 Video DIFs + 9 Audio DIFs */
1150 for (j = 0; j < 135; j++) {
1152 memset(buf, 0xff, 80);
1153 buf += dv_write_dif_id(dv_sect_audio, chan, i, j/15, buf);
1154 buf += 77; /* audio control & shuffled PCM audio */
1156 buf += dv_write_dif_id(dv_sect_video, chan, i, j, buf);
1157 buf += 77; /* 1 video macro block: 1 bytes control
1158 4 * 14 bytes Y 8x8 data
1159 10 bytes Cr 8x8 data
1160 10 bytes Cb 8x8 data */
1167 static int dvvideo_encode_frame(AVCodecContext *c, uint8_t *buf, int buf_size,
1170 DVVideoContext *s = c->priv_data;
1172 s->sys = dv_codec_profile(c);
1175 if(buf_size < s->sys->frame_size)
1178 c->pix_fmt = s->sys->pix_fmt;
1179 s->picture = *((AVFrame *)data);
1180 s->picture.key_frame = 1;
1181 s->picture.pict_type = FF_I_TYPE;
1184 c->execute(c, dv_encode_mt, (void**)&dv_anchor[0], NULL,
1185 s->sys->n_difchan * s->sys->difseg_size * 27);
1189 dv_format_frame(s, buf);
1191 return s->sys->frame_size;
1195 static int dvvideo_close(AVCodecContext *c)
1197 DVVideoContext *s = c->priv_data;
1199 if(s->picture.data[0])
1200 c->release_buffer(c, &s->picture);
1206 #ifdef CONFIG_DVVIDEO_ENCODER
1207 AVCodec dvvideo_encoder = {
1211 sizeof(DVVideoContext),
1213 dvvideo_encode_frame,
1214 .pix_fmts = (enum PixelFormat[]) {PIX_FMT_YUV411P, PIX_FMT_YUV422P, PIX_FMT_YUV420P, PIX_FMT_NONE},
1215 .long_name = NULL_IF_CONFIG_SMALL("DV (Digital Video)"),
1217 #endif // CONFIG_DVVIDEO_ENCODER
1219 #ifdef CONFIG_DVVIDEO_DECODER
1220 AVCodec dvvideo_decoder = {
1224 sizeof(DVVideoContext),
1228 dvvideo_decode_frame,
1231 .long_name = NULL_IF_CONFIG_SMALL("DV (Digital Video)"),