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];
58 void (*get_pixels)(DCTELEM *block, const uint8_t *pixels, int line_size);
59 void (*fdct[2])(DCTELEM *block);
60 void (*idct_put[2])(uint8_t *dest, int line_size, DCTELEM *block);
63 #define TEX_VLC_BITS 9
66 #define DV_VLC_MAP_RUN_SIZE 15
67 #define DV_VLC_MAP_LEV_SIZE 23
69 #define DV_VLC_MAP_RUN_SIZE 64
70 #define DV_VLC_MAP_LEV_SIZE 512 //FIXME sign was removed so this should be /2 but needs check
73 /* XXX: also include quantization */
74 static RL_VLC_ELEM dv_rl_vlc[1184];
75 /* VLC encoding lookup table */
76 static struct dv_vlc_pair {
79 } dv_vlc_map[DV_VLC_MAP_RUN_SIZE][DV_VLC_MAP_LEV_SIZE];
81 static inline int dv_work_pool_size(const DVprofile *d)
83 int size = d->n_difchan*d->difseg_size*27;
84 if (DV_PROFILE_IS_1080i50(d))
86 if (DV_PROFILE_IS_720p50(d))
91 static inline void dv_calc_mb_coordinates(const DVprofile *d, int chan, int seq, int slot,
94 const static uint8_t off[] = { 2, 6, 8, 0, 4 };
95 const static uint8_t shuf1[] = { 36, 18, 54, 0, 72 };
96 const static uint8_t shuf2[] = { 24, 12, 36, 0, 48 };
97 const static uint8_t shuf3[] = { 18, 9, 27, 0, 36 };
99 const static uint8_t l_start[] = {0, 4, 9, 13, 18, 22, 27, 31, 36, 40};
100 const static uint8_t l_start_shuffled[] = { 9, 4, 13, 0, 18 };
102 const static uint8_t serpent1[] = {0, 1, 2, 2, 1, 0,
107 const static uint8_t serpent2[] = {0, 1, 2, 3, 4, 5, 5, 4, 3, 2, 1, 0,
108 0, 1, 2, 3, 4, 5, 5, 4, 3, 2, 1, 0,
111 const static uint8_t remap[][2] = {{ 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, /* dummy */
112 { 0, 0}, { 0, 1}, { 0, 2}, { 0, 3}, {10, 0},
113 {10, 1}, {10, 2}, {10, 3}, {20, 0}, {20, 1},
114 {20, 2}, {20, 3}, {30, 0}, {30, 1}, {30, 2},
115 {30, 3}, {40, 0}, {40, 1}, {40, 2}, {40, 3},
116 {50, 0}, {50, 1}, {50, 2}, {50, 3}, {60, 0},
117 {60, 1}, {60, 2}, {60, 3}, {70, 0}, {70, 1},
118 {70, 2}, {70, 3}, { 0,64}, { 0,65}, { 0,66},
119 {10,64}, {10,65}, {10,66}, {20,64}, {20,65},
120 {20,66}, {30,64}, {30,65}, {30,66}, {40,64},
121 {40,65}, {40,66}, {50,64}, {50,65}, {50,66},
122 {60,64}, {60,65}, {60,66}, {70,64}, {70,65},
123 {70,66}, { 0,67}, {20,67}, {40,67}, {60,67}};
128 for (m=0; m<5; m++) {
131 blk = (chan*11+seq)*27+slot;
133 if (chan == 0 && seq == 11) {
142 i = (4*chan + blk + off[m])%11;
145 x = shuf1[m] + (chan&1)*9 + k%9;
146 y = (i*3+k/9)*2 + (chan>>1) + 1;
148 tbl[m] = (x<<1)|(y<<9);
151 blk = (chan*10+seq)*27+slot;
153 i = (4*chan + (seq/5) + 2*blk + off[m])%10;
156 x = shuf1[m]+(chan&1)*9 + k%9;
157 y = (i*3+k/9)*2 + (chan>>1) + 4;
160 x = remap[y][0]+((x-80)<<(y>59));
163 tbl[m] = (x<<1)|(y<<9);
166 blk = (chan*10+seq)*27+slot;
168 i = (4*chan + (seq/5) + 2*blk + off[m])%10;
169 k = (blk/5)%27 + (i&1)*3;
171 x = shuf2[m] + k%6 + 6*(chan&1);
172 y = l_start[i] + k/6 + 45*(chan>>1);
173 tbl[m] = (x<<1)|(y<<9);
176 switch (d->pix_fmt) {
177 case PIX_FMT_YUV422P:
178 x = shuf3[m] + slot/3;
180 ((((seq + off[m]) % d->difseg_size)<<1) + chan)*3;
181 tbl[m] = (x<<1)|(y<<8);
183 case PIX_FMT_YUV420P:
184 x = shuf3[m] + slot/3;
186 ((seq + off[m]) % d->difseg_size)*3;
187 tbl[m] = (x<<1)|(y<<9);
189 case PIX_FMT_YUV411P:
190 i = (seq + off[m]) % d->difseg_size;
191 k = slot + ((m==1||m==2)?3:0);
193 x = l_start_shuffled[m] + k/6;
194 y = serpent2[k] + i*6;
197 tbl[m] = (x<<2)|(y<<8);
206 static int dv_init_dynamic_tables(const DVprofile *d)
209 uint32_t *factor1, *factor2;
210 const int *iweight1, *iweight2;
212 if (!d->work_chunks[dv_work_pool_size(d)-1].buf_offset) {
214 for (c=0; c<d->n_difchan; c++) {
215 for (s=0; s<d->difseg_size; s++) {
217 for (j=0; j<27; j++) {
219 if (!(DV_PROFILE_IS_1080i50(d) && c != 0 && s == 11) &&
220 !(DV_PROFILE_IS_720p50(d) && s > 9)) {
221 dv_calc_mb_coordinates(d, c, s, j, &d->work_chunks[i].mb_coordinates[0]);
222 d->work_chunks[i++].buf_offset = p;
230 if (!d->idct_factor[DV_PROFILE_IS_HD(d)?8191:5631]) {
231 factor1 = &d->idct_factor[0];
232 factor2 = &d->idct_factor[DV_PROFILE_IS_HD(d)?4096:2816];
233 if (d->height == 720) {
234 iweight1 = &dv_iweight_720_y[0];
235 iweight2 = &dv_iweight_720_c[0];
237 iweight1 = &dv_iweight_1080_y[0];
238 iweight2 = &dv_iweight_1080_c[0];
240 if (DV_PROFILE_IS_HD(d)) {
241 for (c = 0; c < 4; c++) {
242 for (s = 0; s < 16; s++) {
243 for (i = 0; i < 64; i++) {
244 *factor1++ = (dv100_qstep[s] << (c + 9)) * iweight1[i];
245 *factor2++ = (dv100_qstep[s] << (c + 9)) * iweight2[i];
250 iweight1 = &dv_iweight_88[0];
251 for (j = 0; j < 2; j++, iweight1 = &dv_iweight_248[0]) {
252 for (s = 0; s < 22; s++) {
253 for (i = c = 0; c < 4; c++) {
254 for (; i < dv_quant_areas[c]; i++) {
255 *factor1 = iweight1[i] << (dv_quant_shifts[s][c] + 1);
256 *factor2++ = (*factor1++) << 1;
267 static av_cold int dvvideo_init(AVCodecContext *avctx)
269 DVVideoContext *s = avctx->priv_data;
276 uint16_t new_dv_vlc_bits[NB_DV_VLC*2];
277 uint8_t new_dv_vlc_len[NB_DV_VLC*2];
278 uint8_t new_dv_vlc_run[NB_DV_VLC*2];
279 int16_t new_dv_vlc_level[NB_DV_VLC*2];
283 /* it's faster to include sign bit in a generic VLC parsing scheme */
284 for (i = 0, j = 0; i < NB_DV_VLC; i++, j++) {
285 new_dv_vlc_bits[j] = dv_vlc_bits[i];
286 new_dv_vlc_len[j] = dv_vlc_len[i];
287 new_dv_vlc_run[j] = dv_vlc_run[i];
288 new_dv_vlc_level[j] = dv_vlc_level[i];
290 if (dv_vlc_level[i]) {
291 new_dv_vlc_bits[j] <<= 1;
295 new_dv_vlc_bits[j] = (dv_vlc_bits[i] << 1) | 1;
296 new_dv_vlc_len[j] = dv_vlc_len[i] + 1;
297 new_dv_vlc_run[j] = dv_vlc_run[i];
298 new_dv_vlc_level[j] = -dv_vlc_level[i];
302 /* NOTE: as a trick, we use the fact the no codes are unused
303 to accelerate the parsing of partial codes */
304 init_vlc(&dv_vlc, TEX_VLC_BITS, j,
305 new_dv_vlc_len, 1, 1, new_dv_vlc_bits, 2, 2, 0);
306 assert(dv_vlc.table_size == 1184);
308 for (i = 0; i < dv_vlc.table_size; i++){
309 int code = dv_vlc.table[i][0];
310 int len = dv_vlc.table[i][1];
313 if (len < 0){ //more bits needed
317 run = new_dv_vlc_run [code] + 1;
318 level = new_dv_vlc_level[code];
320 dv_rl_vlc[i].len = len;
321 dv_rl_vlc[i].level = level;
322 dv_rl_vlc[i].run = run;
326 for (i = 0; i < NB_DV_VLC - 1; i++) {
327 if (dv_vlc_run[i] >= DV_VLC_MAP_RUN_SIZE)
330 if (dv_vlc_level[i] >= DV_VLC_MAP_LEV_SIZE)
334 if (dv_vlc_map[dv_vlc_run[i]][dv_vlc_level[i]].size != 0)
337 dv_vlc_map[dv_vlc_run[i]][dv_vlc_level[i]].vlc =
338 dv_vlc_bits[i] << (!!dv_vlc_level[i]);
339 dv_vlc_map[dv_vlc_run[i]][dv_vlc_level[i]].size =
340 dv_vlc_len[i] + (!!dv_vlc_level[i]);
342 for (i = 0; i < DV_VLC_MAP_RUN_SIZE; i++) {
344 for (j = 1; j < DV_VLC_MAP_LEV_SIZE; j++) {
345 if (dv_vlc_map[i][j].size == 0) {
346 dv_vlc_map[i][j].vlc = dv_vlc_map[0][j].vlc |
347 (dv_vlc_map[i-1][0].vlc << (dv_vlc_map[0][j].size));
348 dv_vlc_map[i][j].size = dv_vlc_map[i-1][0].size +
349 dv_vlc_map[0][j].size;
353 for (j = 1; j < DV_VLC_MAP_LEV_SIZE/2; j++) {
354 if (dv_vlc_map[i][j].size == 0) {
355 dv_vlc_map[i][j].vlc = dv_vlc_map[0][j].vlc |
356 (dv_vlc_map[i-1][0].vlc << (dv_vlc_map[0][j].size));
357 dv_vlc_map[i][j].size = dv_vlc_map[i-1][0].size +
358 dv_vlc_map[0][j].size;
360 dv_vlc_map[i][((uint16_t)(-j))&0x1ff].vlc =
361 dv_vlc_map[i][j].vlc | 1;
362 dv_vlc_map[i][((uint16_t)(-j))&0x1ff].size =
363 dv_vlc_map[i][j].size;
369 /* Generic DSP setup */
370 dsputil_init(&dsp, avctx);
371 s->get_pixels = dsp.get_pixels;
374 s->fdct[0] = dsp.fdct;
375 s->idct_put[0] = dsp.idct_put;
376 for (i = 0; i < 64; i++)
377 s->dv_zigzag[0][i] = dsp.idct_permutation[ff_zigzag_direct[i]];
380 s->fdct[1] = dsp.fdct248;
381 s->idct_put[1] = ff_simple_idct248_put; // FIXME: need to add it to DSP
383 for (i = 0; i < 64; i++){
384 int j = ff_zigzag248_direct[i];
385 s->dv_zigzag[1][i] = dsp.idct_permutation[(j & 7) + (j & 8) * 4 + (j & 48) / 2];
388 memcpy(s->dv_zigzag[1], ff_zigzag248_direct, 64);
390 avctx->coded_frame = &s->picture;
397 // #define printf(...) av_log(NULL, AV_LOG_ERROR, __VA_ARGS__)
399 typedef struct BlockInfo {
400 const uint32_t *factor_table;
401 const uint8_t *scan_table;
402 uint8_t pos; /* position in block */
403 void (*idct_put)(uint8_t *dest, int line_size, DCTELEM *block);
404 uint8_t partial_bit_count;
405 uint16_t partial_bit_buffer;
409 /* bit budget for AC only in 5 MBs */
410 static const int vs_total_ac_bits = (100 * 4 + 68*2) * 5;
411 /* see dv_88_areas and dv_248_areas for details */
412 static const int mb_area_start[5] = { 1, 6, 21, 43, 64 };
414 static inline int get_bits_left(GetBitContext *s)
416 return s->size_in_bits - get_bits_count(s);
419 static inline int put_bits_left(PutBitContext* s)
421 return (s->buf_end - s->buf) * 8 - put_bits_count(s);
424 /* decode ac coefficients */
425 static void dv_decode_ac(GetBitContext *gb, BlockInfo *mb, DCTELEM *block)
427 int last_index = gb->size_in_bits;
428 const uint8_t *scan_table = mb->scan_table;
429 const uint32_t *factor_table = mb->factor_table;
431 int partial_bit_count = mb->partial_bit_count;
432 int level, run, vlc_len, index;
435 UPDATE_CACHE(re, gb);
437 /* if we must parse a partial vlc, we do it here */
438 if (partial_bit_count > 0) {
439 re_cache = ((unsigned)re_cache >> partial_bit_count) |
440 (mb->partial_bit_buffer << (sizeof(re_cache) * 8 - partial_bit_count));
441 re_index -= partial_bit_count;
442 mb->partial_bit_count = 0;
445 /* get the AC coefficients until last_index is reached */
448 printf("%2d: bits=%04x index=%d\n", pos, SHOW_UBITS(re, gb, 16), re_index);
450 /* our own optimized GET_RL_VLC */
451 index = NEG_USR32(re_cache, TEX_VLC_BITS);
452 vlc_len = dv_rl_vlc[index].len;
454 index = NEG_USR32((unsigned)re_cache << TEX_VLC_BITS, -vlc_len) + dv_rl_vlc[index].level;
455 vlc_len = TEX_VLC_BITS - vlc_len;
457 level = dv_rl_vlc[index].level;
458 run = dv_rl_vlc[index].run;
460 /* gotta check if we're still within gb boundaries */
461 if (re_index + vlc_len > last_index) {
462 /* should be < 16 bits otherwise a codeword could have been parsed */
463 mb->partial_bit_count = last_index - re_index;
464 mb->partial_bit_buffer = NEG_USR32(re_cache, mb->partial_bit_count);
465 re_index = last_index;
471 printf("run=%d level=%d\n", run, level);
477 level = (level * factor_table[pos] + (1 << (dv_iweight_bits - 1))) >> dv_iweight_bits;
478 block[scan_table[pos]] = level;
480 UPDATE_CACHE(re, gb);
482 CLOSE_READER(re, gb);
486 static inline void bit_copy(PutBitContext *pb, GetBitContext *gb)
488 int bits_left = get_bits_left(gb);
489 while (bits_left >= MIN_CACHE_BITS) {
490 put_bits(pb, MIN_CACHE_BITS, get_bits(gb, MIN_CACHE_BITS));
491 bits_left -= MIN_CACHE_BITS;
494 put_bits(pb, bits_left, get_bits(gb, bits_left));
498 static inline void dv_calculate_mb_xy(DVVideoContext *s, DVwork_chunk *work_chunk, int m, int *mb_x, int *mb_y)
500 *mb_x = work_chunk->mb_coordinates[m] & 0xff;
501 *mb_y = work_chunk->mb_coordinates[m] >> 8;
503 /* We work with 720p frames split in half. The odd half-frame (chan==2,3) is displaced :-( */
504 if (s->sys->height == 720 && !(s->buf[1]&0x0C)) {
505 *mb_y -= (*mb_y>17)?18:-72; /* shifting the Y coordinate down by 72/2 macro blocks */
509 /* mb_x and mb_y are in units of 8 pixels */
510 static int dv_decode_video_segment(AVCodecContext *avctx, DVwork_chunk *work_chunk)
512 DVVideoContext *s = avctx->priv_data;
513 int quant, dc, dct_mode, class1, j;
514 int mb_index, mb_x, mb_y, last_index;
515 int y_stride, linesize;
516 DCTELEM *block, *block1;
519 const uint8_t *buf_ptr;
520 PutBitContext pb, vs_pb;
522 BlockInfo mb_data[5 * DV_MAX_BPM], *mb, *mb1;
523 DECLARE_ALIGNED_16(DCTELEM, sblock[5*DV_MAX_BPM][64]);
524 DECLARE_ALIGNED_8(uint8_t, mb_bit_buffer[80 + 4]); /* allow some slack */
525 DECLARE_ALIGNED_8(uint8_t, vs_bit_buffer[5 * 80 + 4]); /* allow some slack */
526 const int log2_blocksize = 3-s->avctx->lowres;
527 int is_field_mode[5];
529 assert((((int)mb_bit_buffer) & 7) == 0);
530 assert((((int)vs_bit_buffer) & 7) == 0);
532 memset(sblock, 0, sizeof(sblock));
534 /* pass 1 : read DC and AC coefficients in blocks */
535 buf_ptr = &s->buf[work_chunk->buf_offset*80];
536 block1 = &sblock[0][0];
538 init_put_bits(&vs_pb, vs_bit_buffer, 5 * 80);
539 for (mb_index = 0; mb_index < 5; mb_index++, mb1 += s->sys->bpm, block1 += s->sys->bpm * 64) {
541 quant = buf_ptr[3] & 0x0f;
543 init_put_bits(&pb, mb_bit_buffer, 80);
546 is_field_mode[mb_index] = 0;
547 for (j = 0; j < s->sys->bpm; j++) {
548 last_index = s->sys->block_sizes[j];
549 init_get_bits(&gb, buf_ptr, last_index);
552 dc = get_sbits(&gb, 9);
553 dct_mode = get_bits1(&gb);
554 class1 = get_bits(&gb, 2);
555 if (DV_PROFILE_IS_HD(s->sys)) {
556 mb->idct_put = s->idct_put[0];
557 mb->scan_table = s->dv_zigzag[0];
558 mb->factor_table = &s->sys->idct_factor[(j >= 4)*4*16*64 + class1*16*64 + quant*64];
559 is_field_mode[mb_index] |= !j && dct_mode;
561 mb->idct_put = s->idct_put[dct_mode && log2_blocksize == 3];
562 mb->scan_table = s->dv_zigzag[dct_mode];
563 mb->factor_table = &s->sys->idct_factor[(class1 == 3)*2*22*64 + dct_mode*22*64 +
564 (quant + dv_quant_offset[class1])*64];
567 /* convert to unsigned because 128 is not added in the
571 buf_ptr += last_index >> 3;
573 mb->partial_bit_count = 0;
576 printf("MB block: %d, %d ", mb_index, j);
578 dv_decode_ac(&gb, mb, block);
580 /* write the remaining bits in a new buffer only if the
589 /* pass 2 : we can do it just after */
591 printf("***pass 2 size=%d MB#=%d\n", put_bits_count(&pb), mb_index);
595 init_get_bits(&gb, mb_bit_buffer, put_bits_count(&pb));
597 for (j = 0; j < s->sys->bpm; j++, block += 64, mb++) {
598 if (mb->pos < 64 && get_bits_left(&gb) > 0) {
599 dv_decode_ac(&gb, mb, block);
600 /* if still not finished, no need to parse other blocks */
605 /* all blocks are finished, so the extra bytes can be used at
606 the video segment level */
607 if (j >= s->sys->bpm)
608 bit_copy(&vs_pb, &gb);
611 /* we need a pass other the whole video segment */
613 printf("***pass 3 size=%d\n", put_bits_count(&vs_pb));
615 block = &sblock[0][0];
617 init_get_bits(&gb, vs_bit_buffer, put_bits_count(&vs_pb));
618 flush_put_bits(&vs_pb);
619 for (mb_index = 0; mb_index < 5; mb_index++) {
620 for (j = 0; j < s->sys->bpm; j++) {
623 printf("start %d:%d\n", mb_index, j);
625 dv_decode_ac(&gb, mb, block);
627 if (mb->pos >= 64 && mb->pos < 127)
628 av_log(NULL, AV_LOG_ERROR, "AC EOB marker is absent pos=%d\n", mb->pos);
634 /* compute idct and place blocks */
635 block = &sblock[0][0];
637 for (mb_index = 0; mb_index < 5; mb_index++) {
638 dv_calculate_mb_xy(s, work_chunk, mb_index, &mb_x, &mb_y);
640 /* idct_put'ting luminance */
641 if ((s->sys->pix_fmt == PIX_FMT_YUV420P) ||
642 (s->sys->pix_fmt == PIX_FMT_YUV411P && mb_x >= (704 / 8)) ||
643 (s->sys->height >= 720 && mb_y != 134)) {
644 y_stride = (s->picture.linesize[0] << ((!is_field_mode[mb_index]) * log2_blocksize));
646 y_stride = (2 << log2_blocksize);
648 y_ptr = s->picture.data[0] + ((mb_y * s->picture.linesize[0] + mb_x) << log2_blocksize);
649 linesize = s->picture.linesize[0] << is_field_mode[mb_index];
650 mb[0] .idct_put(y_ptr , linesize, block + 0*64);
651 if (s->sys->video_stype == 4) { /* SD 422 */
652 mb[2].idct_put(y_ptr + (1 << log2_blocksize) , linesize, block + 2*64);
654 mb[1].idct_put(y_ptr + (1 << log2_blocksize) , linesize, block + 1*64);
655 mb[2].idct_put(y_ptr + y_stride, linesize, block + 2*64);
656 mb[3].idct_put(y_ptr + (1 << log2_blocksize) + y_stride, linesize, block + 3*64);
661 /* idct_put'ting chrominance */
662 c_offset = (((mb_y >> (s->sys->pix_fmt == PIX_FMT_YUV420P)) * s->picture.linesize[1] +
663 (mb_x >> ((s->sys->pix_fmt == PIX_FMT_YUV411P) ? 2 : 1))) << log2_blocksize);
664 for (j = 2; j; j--) {
665 uint8_t *c_ptr = s->picture.data[j] + c_offset;
666 if (s->sys->pix_fmt == PIX_FMT_YUV411P && mb_x >= (704 / 8)) {
667 uint64_t aligned_pixels[64/8];
668 uint8_t *pixels = (uint8_t*)aligned_pixels;
669 uint8_t *c_ptr1, *ptr1;
671 mb->idct_put(pixels, 8, block);
672 for (y = 0; y < (1 << log2_blocksize); y++, c_ptr += s->picture.linesize[j], pixels += 8) {
673 ptr1 = pixels + (1 << (log2_blocksize - 1));
674 c_ptr1 = c_ptr + (s->picture.linesize[j] << log2_blocksize);
675 for (x = 0; x < (1 << (log2_blocksize - 1)); x++) {
676 c_ptr[x] = pixels[x];
682 y_stride = (mb_y == 134) ? (1 << log2_blocksize) :
683 s->picture.linesize[j] << ((!is_field_mode[mb_index]) * log2_blocksize);
684 linesize = s->picture.linesize[j] << is_field_mode[mb_index];
685 (mb++)-> idct_put(c_ptr , linesize, block); block += 64;
686 if (s->sys->bpm == 8) {
687 (mb++)->idct_put(c_ptr + y_stride, linesize, block); block += 64;
696 /* Converts run and level (where level != 0) pair into vlc, returning bit size */
697 static av_always_inline int dv_rl2vlc(int run, int level, int sign, uint32_t* vlc)
700 if (run < DV_VLC_MAP_RUN_SIZE && level < DV_VLC_MAP_LEV_SIZE) {
701 *vlc = dv_vlc_map[run][level].vlc | sign;
702 size = dv_vlc_map[run][level].size;
705 if (level < DV_VLC_MAP_LEV_SIZE) {
706 *vlc = dv_vlc_map[0][level].vlc | sign;
707 size = dv_vlc_map[0][level].size;
709 *vlc = 0xfe00 | (level << 1) | sign;
713 *vlc |= ((run < 16) ? dv_vlc_map[run-1][0].vlc :
714 (0x1f80 | (run - 1))) << size;
715 size += (run < 16) ? dv_vlc_map[run-1][0].size : 13;
722 static av_always_inline int dv_rl2vlc_size(int run, int level)
726 if (run < DV_VLC_MAP_RUN_SIZE && level < DV_VLC_MAP_LEV_SIZE) {
727 size = dv_vlc_map[run][level].size;
730 size = (level < DV_VLC_MAP_LEV_SIZE) ? dv_vlc_map[0][level].size : 16;
732 size += (run < 16) ? dv_vlc_map[run-1][0].size : 13;
738 static av_always_inline int dv_rl2vlc(int run, int l, int sign, uint32_t* vlc)
740 *vlc = dv_vlc_map[run][l].vlc | sign;
741 return dv_vlc_map[run][l].size;
744 static av_always_inline int dv_rl2vlc_size(int run, int l)
746 return dv_vlc_map[run][l].size;
750 typedef struct EncBlockInfo {
760 uint8_t partial_bit_count;
761 uint32_t partial_bit_buffer; /* we can't use uint16_t here */
764 static av_always_inline PutBitContext* dv_encode_ac(EncBlockInfo* bi,
765 PutBitContext* pb_pool,
766 PutBitContext* pb_end)
769 PutBitContext* pb = pb_pool;
770 int size = bi->partial_bit_count;
771 uint32_t vlc = bi->partial_bit_buffer;
773 bi->partial_bit_count = bi->partial_bit_buffer = 0;
775 /* Find suitable storage space */
776 for (; size > (bits_left = put_bits_left(pb)); pb++) {
779 put_bits(pb, bits_left, vlc >> size);
780 vlc = vlc & ((1 << size) - 1);
782 if (pb + 1 >= pb_end) {
783 bi->partial_bit_count = size;
784 bi->partial_bit_buffer = vlc;
790 put_bits(pb, size, vlc);
792 if (bi->cur_ac >= 64)
795 /* Construct the next VLC */
797 bi->cur_ac = bi->next[prev];
798 if (bi->cur_ac < 64){
799 size = dv_rl2vlc(bi->cur_ac - prev - 1, bi->mb[bi->cur_ac], bi->sign[bi->cur_ac], &vlc);
801 size = 4; vlc = 6; /* End Of Block stamp */
807 //FIXME replace this by dsputil
808 #define SC(x, y) ((s[x] - s[y]) ^ ((s[x] - s[y]) >> 7))
809 static av_always_inline int dv_guess_dct_mode(DCTELEM *blk) {
815 /* Compute 8-8 score (small values give a better chance for 8-8 DCT) */
817 for (i = 0; i < 7; i++) {
818 score88 += SC(0, 8) + SC(1, 9) + SC(2, 10) + SC(3, 11) +
819 SC(4, 12) + SC(5,13) + SC(6, 14) + SC(7, 15);
822 /* Compute 2-4-8 score (small values give a better chance for 2-4-8 DCT) */
824 for (i = 0; i < 6; i++) {
825 score248 += SC(0, 16) + SC(1,17) + SC(2, 18) + SC(3, 19) +
826 SC(4, 20) + SC(5,21) + SC(6, 22) + SC(7, 23);
830 return (score88 - score248 > -10);
833 static av_always_inline int dv_init_enc_block(EncBlockInfo* bi, uint8_t *data, int linesize, DVVideoContext *s, int bias)
836 const uint8_t* zigzag_scan;
837 DECLARE_ALIGNED_16(DCTELEM, blk[64]);
839 /* We offer two different methods for class number assignment: the
840 method suggested in SMPTE 314M Table 22, and an improved
841 method. The SMPTE method is very conservative; it assigns class
842 3 (i.e. severe quantization) to any block where the largest AC
843 component is greater than 36. FFmpeg's DV encoder tracks AC bit
844 consumption precisely, so there is no need to bias most blocks
845 towards strongly lossy compression. Instead, we assign class 2
846 to most blocks, and use class 3 only when strictly necessary
847 (for blocks whose largest AC component exceeds 255). */
849 #if 0 /* SMPTE spec method */
850 static const int classes[] = {12, 24, 36, 0xffff};
851 #else /* improved FFmpeg method */
852 static const int classes[] = {-1, -1, 255, 0xffff};
854 int max = classes[0];
857 assert((((int)blk) & 15) == 0);
859 bi->area_q[0] = bi->area_q[1] = bi->area_q[2] = bi->area_q[3] = 0;
860 bi->partial_bit_count = 0;
861 bi->partial_bit_buffer = 0;
864 s->get_pixels(blk, data, linesize);
865 bi->dct_mode = (s->avctx->flags & CODEC_FLAG_INTERLACED_DCT) &&
866 dv_guess_dct_mode(blk);
867 s->fdct[bi->dct_mode](blk);
869 /* We rely on the fact that encoding all zeros leads to an immediate EOB,
870 which is precisely what the spec calls for in the "dummy" blocks. */
871 memset(blk, 0, sizeof(blk));
876 zigzag_scan = bi->dct_mode ? ff_zigzag248_direct : ff_zigzag_direct;
877 weight = bi->dct_mode ? dv_weight_248 : dv_weight_88;
879 for (area = 0; area < 4; area++) {
880 bi->prev[area] = prev;
881 bi->bit_size[area] = 1; // 4 areas 4 bits for EOB :)
882 for (i = mb_area_start[area]; i < mb_area_start[area+1]; i++) {
883 int level = blk[zigzag_scan[i]];
885 if (level + 15 > 30U) {
886 bi->sign[i] = (level >> 31) & 1;
887 /* weigh it and and shift down into range, adding for rounding */
888 /* the extra division by a factor of 2^4 reverses the 8x expansion of the DCT
889 AND the 2x doubling of the weights */
890 level = (FFABS(level) * weight[i] + (1 << (dv_weight_bits+3))) >> (dv_weight_bits+4);
894 bi->bit_size[area] += dv_rl2vlc_size(i - prev - 1, level);
901 for (bi->cno = 0; max > classes[bi->cno]; bi->cno++);
909 for (area = 0; area < 4; area++) {
910 bi->prev[area] = prev;
911 bi->bit_size[area] = 1; // 4 areas 4 bits for EOB :)
912 for (; i < mb_area_start[area+1]; i = bi->next[i]) {
916 bi->bit_size[area] += dv_rl2vlc_size(i - prev - 1, bi->mb[i]);
925 return bi->bit_size[0] + bi->bit_size[1] + bi->bit_size[2] + bi->bit_size[3];
928 static inline void dv_guess_qnos(EncBlockInfo* blks, int* qnos)
931 int i, j, k, a, prev, a2;
934 size[0] = size[1] = size[2] = size[3] = size[4] = 1 << 24;
937 for (i = 0; i < 5; i++) {
943 for (j = 0; j < 6; j++, b++) {
944 for (a = 0; a < 4; a++) {
945 if (b->area_q[a] != dv_quant_shifts[qnos[i] + dv_quant_offset[b->cno]][a]) {
946 b->bit_size[a] = 1; // 4 areas 4 bits for EOB :)
949 assert(b->next[prev] >= mb_area_start[a+1] || b->mb[prev]);
950 for (k = b->next[prev] ; k < mb_area_start[a+1]; k = b->next[k]) {
953 b->bit_size[a] += dv_rl2vlc_size(k - prev - 1, b->mb[k]);
956 if (b->next[k] >= mb_area_start[a+1] && b->next[k]<64){
957 for (a2 = a + 1; b->next[k] >= mb_area_start[a2+1]; a2++)
960 assert(b->mb[b->next[k]]);
961 b->bit_size[a2] += dv_rl2vlc_size(b->next[k] - prev - 1, b->mb[b->next[k]])
962 -dv_rl2vlc_size(b->next[k] - k - 1, b->mb[b->next[k]]);
963 assert(b->prev[a2] == k && (a2 + 1 >= 4 || b->prev[a2+1] != k));
966 b->next[prev] = b->next[k];
971 size[i] += b->bit_size[a];
974 if (vs_total_ac_bits >= size[0] + size[1] + size[2] + size[3] + size[4])
977 } while (qnos[0]|qnos[1]|qnos[2]|qnos[3]|qnos[4]);
980 for (a = 2; a == 2 || vs_total_ac_bits < size[0]; a += a){
982 size[0] = 5 * 6 * 4; //EOB
983 for (j = 0; j < 6 *5; j++, b++) {
985 for (k = b->next[prev]; k < 64; k = b->next[k]) {
986 if (b->mb[k] < a && b->mb[k] > -a){
987 b->next[prev] = b->next[k];
989 size[0] += dv_rl2vlc_size(k - prev - 1, b->mb[k]);
997 static int dv_encode_video_segment(AVCodecContext *avctx, DVwork_chunk *work_chunk)
999 DVVideoContext *s = avctx->priv_data;
1001 int mb_x, mb_y, c_offset, linesize;
1006 uint8_t scratch[64];
1007 EncBlockInfo enc_blks[5*DV_MAX_BPM];
1008 PutBitContext pbs[5*DV_MAX_BPM];
1010 EncBlockInfo* enc_blk;
1011 int vs_bit_size = 0;
1014 dif = &s->buf[work_chunk->buf_offset*80];
1015 enc_blk = &enc_blks[0];
1017 for (mb_index = 0; mb_index < 5; mb_index++) {
1018 dv_calculate_mb_xy(s, work_chunk, mb_index, &mb_x, &mb_y);
1019 y_ptr = s->picture.data[0] + ((mb_y * s->picture.linesize[0] + mb_x) << 3);
1020 c_offset = (((mb_y >> (s->sys->pix_fmt == PIX_FMT_YUV420P)) * s->picture.linesize[1] +
1021 (mb_x >> ((s->sys->pix_fmt == PIX_FMT_YUV411P) ? 2 : 1))) << 3);
1022 qnos[mb_index] = 15; /* No quantization */
1023 ptr = dif + mb_index*80 + 4;
1024 for (j = 0; j < 6; j++) {
1025 if (s->sys->pix_fmt == PIX_FMT_YUV422P) { /* 4:2:2 */
1026 if (j == 0 || j == 2) {
1028 data = y_ptr + ((j >> 1) * 8);
1029 linesize = s->picture.linesize[0];
1032 data = s->picture.data[6 - j] + c_offset;
1033 linesize = s->picture.linesize[6 - j];
1035 /* j=1 and j=3 are "dummy" blocks, used for AC data only */
1039 } else { /* 4:1:1 or 4:2:0 */
1040 if (j < 4) { /* Four Y blocks */
1041 /* NOTE: at end of line, the macroblock is handled as 420 */
1042 if (s->sys->pix_fmt == PIX_FMT_YUV411P && mb_x < (704 / 8)) {
1043 data = y_ptr + (j * 8);
1045 data = y_ptr + ((j & 1) * 8) + ((j >> 1) * 8 * s->picture.linesize[0]);
1047 linesize = s->picture.linesize[0];
1048 } else { /* Cr and Cb blocks */
1049 /* don't ask Fabrice why they inverted Cb and Cr ! */
1050 data = s->picture.data [6 - j] + c_offset;
1051 linesize = s->picture.linesize[6 - j];
1052 if (s->sys->pix_fmt == PIX_FMT_YUV411P && mb_x >= (704 / 8)) {
1054 uint8_t* b = scratch;
1055 for (i = 0; i < 8; i++) {
1056 d = data + 8 * linesize;
1057 b[0] = data[0]; b[1] = data[1]; b[2] = data[2]; b[3] = data[3];
1058 b[4] = d[0]; b[5] = d[1]; b[6] = d[2]; b[7] = d[3];
1068 vs_bit_size += dv_init_enc_block(enc_blk, data, linesize, s, j>>2);
1070 init_put_bits(pb, ptr, s->sys->block_sizes[j]/8);
1071 put_bits(pb, 9, (uint16_t)(((enc_blk->mb[0] >> 3) - 1024 + 2) >> 2));
1072 put_bits(pb, 1, enc_blk->dct_mode);
1073 put_bits(pb, 2, enc_blk->cno);
1077 ptr += s->sys->block_sizes[j]/8;
1081 if (vs_total_ac_bits < vs_bit_size)
1082 dv_guess_qnos(&enc_blks[0], &qnos[0]);
1084 for (i = 0; i < 5; i++) {
1085 dif[i*80 + 3] = qnos[i];
1088 /* First pass over individual cells only */
1089 for (j = 0; j < 5 * s->sys->bpm; j++)
1090 dv_encode_ac(&enc_blks[j], &pbs[j], &pbs[j+1]);
1092 /* Second pass over each MB space */
1093 for (j=0; j<5*s->sys->bpm; j+=s->sys->bpm) {
1095 for (i=0; i<s->sys->bpm; i++) {
1096 if (enc_blks[i+j].partial_bit_count)
1097 pb = dv_encode_ac(&enc_blks[i+j], pb, &pbs[j+s->sys->bpm]);
1101 /* Third and final pass over the whole video segment space */
1103 for (j=0; j<5*s->sys->bpm; j++) {
1104 if (enc_blks[j].partial_bit_count)
1105 pb = dv_encode_ac(&enc_blks[j], pb, &pbs[s->sys->bpm*5]);
1106 if (enc_blks[j].partial_bit_count)
1107 av_log(NULL, AV_LOG_ERROR, "ac bitstream overflow\n");
1110 for (j=0; j<5*s->sys->bpm; j++)
1111 flush_put_bits(&pbs[j]);
1116 #if CONFIG_DVVIDEO_DECODER
1117 /* NOTE: exactly one frame must be given (120000 bytes for NTSC,
1118 144000 bytes for PAL - or twice those for 50Mbps) */
1119 static int dvvideo_decode_frame(AVCodecContext *avctx,
1120 void *data, int *data_size,
1121 const uint8_t *buf, int buf_size)
1123 DVVideoContext *s = avctx->priv_data;
1125 s->sys = dv_frame_profile(buf);
1126 if (!s->sys || buf_size < s->sys->frame_size || dv_init_dynamic_tables(s->sys))
1127 return -1; /* NOTE: we only accept several full frames */
1129 if (s->picture.data[0])
1130 avctx->release_buffer(avctx, &s->picture);
1132 s->picture.reference = 0;
1133 s->picture.key_frame = 1;
1134 s->picture.pict_type = FF_I_TYPE;
1135 avctx->pix_fmt = s->sys->pix_fmt;
1136 avctx->time_base = s->sys->time_base;
1137 avcodec_set_dimensions(avctx, s->sys->width, s->sys->height);
1138 if (avctx->get_buffer(avctx, &s->picture) < 0) {
1139 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
1142 s->picture.interlaced_frame = 1;
1143 s->picture.top_field_first = 0;
1146 avctx->execute(avctx, dv_decode_video_segment, s->sys->work_chunks, NULL,
1147 dv_work_pool_size(s->sys), sizeof(DVwork_chunk));
1152 *data_size = sizeof(AVFrame);
1153 *(AVFrame*)data = s->picture;
1155 return s->sys->frame_size;
1157 #endif /* CONFIG_DVVIDEO_DECODER */
1160 static inline int dv_write_pack(enum dv_pack_type pack_id, DVVideoContext *c,
1164 * Here's what SMPTE314M says about these two:
1165 * (page 6) APTn, AP1n, AP2n, AP3n: These data shall be identical
1166 * as track application IDs (APTn = 001, AP1n =
1167 * 001, AP2n = 001, AP3n = 001), if the source signal
1168 * comes from a digital VCR. If the signal source is
1169 * unknown, all bits for these data shall be set to 1.
1170 * (page 12) STYPE: STYPE defines a signal type of video signal
1171 * 00000b = 4:1:1 compression
1172 * 00100b = 4:2:2 compression
1174 * Now, I've got two problems with these statements:
1175 * 1. it looks like APT == 111b should be a safe bet, but it isn't.
1176 * It seems that for PAL as defined in IEC 61834 we have to set
1177 * APT to 000 and for SMPTE314M to 001.
1178 * 2. It is not at all clear what STYPE is used for 4:2:0 PAL
1179 * compression scheme (if any).
1181 int apt = (c->sys->pix_fmt == PIX_FMT_YUV420P ? 0 : 1);
1182 int stype = (c->sys->pix_fmt == PIX_FMT_YUV422P ? 4 : 0);
1185 if ((int)(av_q2d(c->avctx->sample_aspect_ratio) * c->avctx->width / c->avctx->height * 10) == 17) /* 16:9 */
1188 buf[0] = (uint8_t)pack_id;
1190 case dv_header525: /* I can't imagine why these two weren't defined as real */
1191 case dv_header625: /* packs in SMPTE314M -- they definitely look like ones */
1192 buf[1] = 0xf8 | /* reserved -- always 1 */
1193 (apt & 0x07); /* APT: Track application ID */
1194 buf[2] = (0 << 7) | /* TF1: audio data is 0 - valid; 1 - invalid */
1195 (0x0f << 3) | /* reserved -- always 1 */
1196 (apt & 0x07); /* AP1: Audio application ID */
1197 buf[3] = (0 << 7) | /* TF2: video data is 0 - valid; 1 - invalid */
1198 (0x0f << 3) | /* reserved -- always 1 */
1199 (apt & 0x07); /* AP2: Video application ID */
1200 buf[4] = (0 << 7) | /* TF3: subcode(SSYB) is 0 - valid; 1 - invalid */
1201 (0x0f << 3) | /* reserved -- always 1 */
1202 (apt & 0x07); /* AP3: Subcode application ID */
1204 case dv_video_source:
1205 buf[1] = 0xff; /* reserved -- always 1 */
1206 buf[2] = (1 << 7) | /* B/W: 0 - b/w, 1 - color */
1207 (1 << 6) | /* following CLF is valid - 0, invalid - 1 */
1208 (3 << 4) | /* CLF: color frames ID (see ITU-R BT.470-4) */
1209 0xf; /* reserved -- always 1 */
1210 buf[3] = (3 << 6) | /* reserved -- always 1 */
1211 (c->sys->dsf << 5) | /* system: 60fields/50fields */
1212 stype; /* signal type video compression */
1213 buf[4] = 0xff; /* VISC: 0xff -- no information */
1215 case dv_video_control:
1216 buf[1] = (0 << 6) | /* Copy generation management (CGMS) 0 -- free */
1217 0x3f; /* reserved -- always 1 */
1218 buf[2] = 0xc8 | /* reserved -- always b11001xxx */
1220 buf[3] = (1 << 7) | /* frame/field flag 1 -- frame, 0 -- field */
1221 (1 << 6) | /* first/second field flag 0 -- field 2, 1 -- field 1 */
1222 (1 << 5) | /* frame change flag 0 -- same picture as before, 1 -- different */
1223 (1 << 4) | /* 1 - interlaced, 0 - noninterlaced */
1224 0xc; /* reserved -- always b1100 */
1225 buf[4] = 0xff; /* reserved -- always 1 */
1228 buf[1] = buf[2] = buf[3] = buf[4] = 0xff;
1233 #if CONFIG_DVVIDEO_ENCODER
1234 static void dv_format_frame(DVVideoContext* c, uint8_t* buf)
1238 for (chan = 0; chan < c->sys->n_difchan; chan++) {
1239 for (i = 0; i < c->sys->difseg_size; i++) {
1240 memset(buf, 0xff, 80 * 6); /* first 6 DIF blocks are for control data */
1242 /* DV header: 1DIF */
1243 buf += dv_write_dif_id(dv_sect_header, chan, i, 0, buf);
1244 buf += dv_write_pack((c->sys->dsf ? dv_header625 : dv_header525), c, buf);
1245 buf += 72; /* unused bytes */
1247 /* DV subcode: 2DIFs */
1248 for (j = 0; j < 2; j++) {
1249 buf += dv_write_dif_id(dv_sect_subcode, chan, i, j, buf);
1250 for (k = 0; k < 6; k++)
1251 buf += dv_write_ssyb_id(k, (i < c->sys->difseg_size/2), buf) + 5;
1252 buf += 29; /* unused bytes */
1255 /* DV VAUX: 3DIFS */
1256 for (j = 0; j < 3; j++) {
1257 buf += dv_write_dif_id(dv_sect_vaux, chan, i, j, buf);
1258 buf += dv_write_pack(dv_video_source, c, buf);
1259 buf += dv_write_pack(dv_video_control, c, buf);
1261 buf += dv_write_pack(dv_video_source, c, buf);
1262 buf += dv_write_pack(dv_video_control, c, buf);
1263 buf += 4*5 + 2; /* unused bytes */
1266 /* DV Audio/Video: 135 Video DIFs + 9 Audio DIFs */
1267 for (j = 0; j < 135; j++) {
1269 memset(buf, 0xff, 80);
1270 buf += dv_write_dif_id(dv_sect_audio, chan, i, j/15, buf);
1271 buf += 77; /* audio control & shuffled PCM audio */
1273 buf += dv_write_dif_id(dv_sect_video, chan, i, j, buf);
1274 buf += 77; /* 1 video macroblock: 1 bytes control
1275 4 * 14 bytes Y 8x8 data
1276 10 bytes Cr 8x8 data
1277 10 bytes Cb 8x8 data */
1284 static int dvvideo_encode_frame(AVCodecContext *c, uint8_t *buf, int buf_size,
1287 DVVideoContext *s = c->priv_data;
1289 s->sys = dv_codec_profile(c);
1290 if (!s->sys || buf_size < s->sys->frame_size || dv_init_dynamic_tables(s->sys))
1293 c->pix_fmt = s->sys->pix_fmt;
1294 s->picture = *((AVFrame *)data);
1295 s->picture.key_frame = 1;
1296 s->picture.pict_type = FF_I_TYPE;
1299 c->execute(c, dv_encode_video_segment, s->sys->work_chunks, NULL,
1300 dv_work_pool_size(s->sys), sizeof(DVwork_chunk));
1304 dv_format_frame(s, buf);
1306 return s->sys->frame_size;
1310 static int dvvideo_close(AVCodecContext *c)
1312 DVVideoContext *s = c->priv_data;
1314 if (s->picture.data[0])
1315 c->release_buffer(c, &s->picture);
1321 #if CONFIG_DVVIDEO_ENCODER
1322 AVCodec dvvideo_encoder = {
1326 sizeof(DVVideoContext),
1328 dvvideo_encode_frame,
1329 .pix_fmts = (enum PixelFormat[]) {PIX_FMT_YUV411P, PIX_FMT_YUV422P, PIX_FMT_YUV420P, PIX_FMT_NONE},
1330 .long_name = NULL_IF_CONFIG_SMALL("DV (Digital Video)"),
1332 #endif // CONFIG_DVVIDEO_ENCODER
1334 #if CONFIG_DVVIDEO_DECODER
1335 AVCodec dvvideo_decoder = {
1339 sizeof(DVVideoContext),
1343 dvvideo_decode_frame,
1346 .long_name = NULL_IF_CONFIG_SMALL("DV (Digital Video)"),