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
41 #include "libavutil/internal.h"
42 #include "libavutil/pixdesc.h"
47 #include "simple_idct.h"
49 #include "dv_tablegen.h"
52 /* XXX: also include quantization */
53 RL_VLC_ELEM ff_dv_rl_vlc[1184];
55 static inline void dv_calc_mb_coordinates(const DVprofile *d, int chan, int seq, int slot,
58 static const uint8_t off[] = { 2, 6, 8, 0, 4 };
59 static const uint8_t shuf1[] = { 36, 18, 54, 0, 72 };
60 static const uint8_t shuf2[] = { 24, 12, 36, 0, 48 };
61 static const uint8_t shuf3[] = { 18, 9, 27, 0, 36 };
63 static const uint8_t l_start[] = {0, 4, 9, 13, 18, 22, 27, 31, 36, 40};
64 static const uint8_t l_start_shuffled[] = { 9, 4, 13, 0, 18 };
66 static const uint8_t serpent1[] = {0, 1, 2, 2, 1, 0,
71 static const uint8_t serpent2[] = {0, 1, 2, 3, 4, 5, 5, 4, 3, 2, 1, 0,
72 0, 1, 2, 3, 4, 5, 5, 4, 3, 2, 1, 0,
75 static const uint8_t remap[][2] = {{ 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, /* dummy */
76 { 0, 0}, { 0, 1}, { 0, 2}, { 0, 3}, {10, 0},
77 {10, 1}, {10, 2}, {10, 3}, {20, 0}, {20, 1},
78 {20, 2}, {20, 3}, {30, 0}, {30, 1}, {30, 2},
79 {30, 3}, {40, 0}, {40, 1}, {40, 2}, {40, 3},
80 {50, 0}, {50, 1}, {50, 2}, {50, 3}, {60, 0},
81 {60, 1}, {60, 2}, {60, 3}, {70, 0}, {70, 1},
82 {70, 2}, {70, 3}, { 0,64}, { 0,65}, { 0,66},
83 {10,64}, {10,65}, {10,66}, {20,64}, {20,65},
84 {20,66}, {30,64}, {30,65}, {30,66}, {40,64},
85 {40,65}, {40,66}, {50,64}, {50,65}, {50,66},
86 {60,64}, {60,65}, {60,66}, {70,64}, {70,65},
87 {70,66}, { 0,67}, {20,67}, {40,67}, {60,67}};
95 blk = (chan*11+seq)*27+slot;
97 if (chan == 0 && seq == 11) {
106 i = (4*chan + blk + off[m])%11;
109 x = shuf1[m] + (chan&1)*9 + k%9;
110 y = (i*3+k/9)*2 + (chan>>1) + 1;
112 tbl[m] = (x<<1)|(y<<9);
115 blk = (chan*10+seq)*27+slot;
117 i = (4*chan + (seq/5) + 2*blk + off[m])%10;
120 x = shuf1[m]+(chan&1)*9 + k%9;
121 y = (i*3+k/9)*2 + (chan>>1) + 4;
124 x = remap[y][0]+((x-80)<<(y>59));
127 tbl[m] = (x<<1)|(y<<9);
130 blk = (chan*10+seq)*27+slot;
132 i = (4*chan + (seq/5) + 2*blk + off[m])%10;
133 k = (blk/5)%27 + (i&1)*3;
135 x = shuf2[m] + k%6 + 6*(chan&1);
136 y = l_start[i] + k/6 + 45*(chan>>1);
137 tbl[m] = (x<<1)|(y<<9);
140 switch (d->pix_fmt) {
141 case AV_PIX_FMT_YUV422P:
142 x = shuf3[m] + slot/3;
144 ((((seq + off[m]) % d->difseg_size)<<1) + chan)*3;
145 tbl[m] = (x<<1)|(y<<8);
147 case AV_PIX_FMT_YUV420P:
148 x = shuf3[m] + slot/3;
150 ((seq + off[m]) % d->difseg_size)*3;
151 tbl[m] = (x<<1)|(y<<9);
153 case AV_PIX_FMT_YUV411P:
154 i = (seq + off[m]) % d->difseg_size;
155 k = slot + ((m==1||m==2)?3:0);
157 x = l_start_shuffled[m] + k/6;
158 y = serpent2[k] + i*6;
161 tbl[m] = (x<<2)|(y<<8);
170 /* quantization quanta by QNO for DV100 */
171 static const uint8_t dv100_qstep[16] = {
172 1, /* QNO = 0 and 1 both have no quantization */
174 2, 3, 4, 5, 6, 7, 8, 16, 18, 20, 22, 24, 28, 52
177 static const uint8_t dv_quant_areas[4] = { 6, 21, 43, 64 };
179 int ff_dv_init_dynamic_tables(const DVprofile *d)
182 uint32_t *factor1, *factor2;
183 const int *iweight1, *iweight2;
185 if (!d->work_chunks[dv_work_pool_size(d)-1].buf_offset) {
187 for (c=0; c<d->n_difchan; c++) {
188 for (s=0; s<d->difseg_size; s++) {
190 for (j=0; j<27; j++) {
192 if (!(DV_PROFILE_IS_1080i50(d) && c != 0 && s == 11) &&
193 !(DV_PROFILE_IS_720p50(d) && s > 9)) {
194 dv_calc_mb_coordinates(d, c, s, j, &d->work_chunks[i].mb_coordinates[0]);
195 d->work_chunks[i++].buf_offset = p;
203 if (!d->idct_factor[DV_PROFILE_IS_HD(d)?8191:5631]) {
204 factor1 = &d->idct_factor[0];
205 factor2 = &d->idct_factor[DV_PROFILE_IS_HD(d)?4096:2816];
206 if (d->height == 720) {
207 iweight1 = &ff_dv_iweight_720_y[0];
208 iweight2 = &ff_dv_iweight_720_c[0];
210 iweight1 = &ff_dv_iweight_1080_y[0];
211 iweight2 = &ff_dv_iweight_1080_c[0];
213 if (DV_PROFILE_IS_HD(d)) {
214 for (c = 0; c < 4; c++) {
215 for (s = 0; s < 16; s++) {
216 for (i = 0; i < 64; i++) {
217 *factor1++ = (dv100_qstep[s] << (c + 9)) * iweight1[i];
218 *factor2++ = (dv100_qstep[s] << (c + 9)) * iweight2[i];
223 iweight1 = &ff_dv_iweight_88[0];
224 for (j = 0; j < 2; j++, iweight1 = &ff_dv_iweight_248[0]) {
225 for (s = 0; s < 22; s++) {
226 for (i = c = 0; c < 4; c++) {
227 for (; i < dv_quant_areas[c]; i++) {
228 *factor1 = iweight1[i] << (ff_dv_quant_shifts[s][c] + 1);
229 *factor2++ = (*factor1++) << 1;
240 av_cold int ff_dvvideo_init(AVCodecContext *avctx)
242 DVVideoContext *s = avctx->priv_data;
249 uint16_t new_dv_vlc_bits[NB_DV_VLC*2];
250 uint8_t new_dv_vlc_len[NB_DV_VLC*2];
251 uint8_t new_dv_vlc_run[NB_DV_VLC*2];
252 int16_t new_dv_vlc_level[NB_DV_VLC*2];
256 /* it's faster to include sign bit in a generic VLC parsing scheme */
257 for (i = 0, j = 0; i < NB_DV_VLC; i++, j++) {
258 new_dv_vlc_bits[j] = dv_vlc_bits[i];
259 new_dv_vlc_len[j] = dv_vlc_len[i];
260 new_dv_vlc_run[j] = dv_vlc_run[i];
261 new_dv_vlc_level[j] = dv_vlc_level[i];
263 if (dv_vlc_level[i]) {
264 new_dv_vlc_bits[j] <<= 1;
268 new_dv_vlc_bits[j] = (dv_vlc_bits[i] << 1) | 1;
269 new_dv_vlc_len[j] = dv_vlc_len[i] + 1;
270 new_dv_vlc_run[j] = dv_vlc_run[i];
271 new_dv_vlc_level[j] = -dv_vlc_level[i];
275 /* NOTE: as a trick, we use the fact the no codes are unused
276 to accelerate the parsing of partial codes */
277 init_vlc(&dv_vlc, TEX_VLC_BITS, j,
278 new_dv_vlc_len, 1, 1, new_dv_vlc_bits, 2, 2, 0);
279 av_assert1(dv_vlc.table_size == 1184);
281 for (i = 0; i < dv_vlc.table_size; i++){
282 int code = dv_vlc.table[i][0];
283 int len = dv_vlc.table[i][1];
286 if (len < 0){ //more bits needed
290 run = new_dv_vlc_run [code] + 1;
291 level = new_dv_vlc_level[code];
293 ff_dv_rl_vlc[i].len = len;
294 ff_dv_rl_vlc[i].level = level;
295 ff_dv_rl_vlc[i].run = run;
297 ff_free_vlc(&dv_vlc);
300 /* Generic DSP setup */
301 memset(&dsp,0, sizeof(dsp));
302 ff_dsputil_init(&dsp, avctx);
303 ff_set_cmp(&dsp, dsp.ildct_cmp, avctx->ildct_cmp);
304 s->get_pixels = dsp.get_pixels;
305 s->ildct_cmp = dsp.ildct_cmp[5];
308 s->fdct[0] = dsp.fdct;
309 s->idct_put[0] = dsp.idct_put;
310 for (i = 0; i < 64; i++)
311 s->dv_zigzag[0][i] = dsp.idct_permutation[ff_zigzag_direct[i]];
314 s->fdct[1] = dsp.fdct248;
315 s->idct_put[1] = ff_simple_idct248_put; // FIXME: need to add it to DSP
317 for (i = 0; i < 64; i++){
318 int j = ff_zigzag248_direct[i];
319 s->dv_zigzag[1][i] = dsp.idct_permutation[(j & 7) + (j & 8) * 4 + (j & 48) / 2];
322 memcpy(s->dv_zigzag[1], ff_zigzag248_direct, 64);
324 avcodec_get_frame_defaults(&s->picture);
325 avctx->coded_frame = &s->picture;
327 avctx->chroma_sample_location = AVCHROMA_LOC_TOPLEFT;
332 static av_cold int dvvideo_init_encoder(AVCodecContext *avctx)
334 if (!avpriv_dv_codec_profile(avctx)) {
335 av_log(avctx, AV_LOG_ERROR, "Found no DV profile for %ix%i %s video. "
336 "Valid DV profiles are:\n",
337 avctx->width, avctx->height, av_get_pix_fmt_name(avctx->pix_fmt));
338 ff_dv_print_profiles(avctx, AV_LOG_ERROR);
339 return AVERROR(EINVAL);
341 if (avctx->height > 576) {
342 av_log(avctx, AV_LOG_ERROR, "DVCPRO HD encoding is not supported.\n");
343 return AVERROR_PATCHWELCOME;
346 dv_vlc_map_tableinit();
348 return ff_dvvideo_init(avctx);
351 /* bit budget for AC only in 5 MBs */
352 static const int vs_total_ac_bits = (100 * 4 + 68*2) * 5;
353 static const int mb_area_start[5] = { 1, 6, 21, 43, 64 };
356 /* Converts run and level (where level != 0) pair into VLC, returning bit size */
357 static av_always_inline int dv_rl2vlc(int run, int level, int sign, uint32_t* vlc)
360 if (run < DV_VLC_MAP_RUN_SIZE && level < DV_VLC_MAP_LEV_SIZE) {
361 *vlc = dv_vlc_map[run][level].vlc | sign;
362 size = dv_vlc_map[run][level].size;
365 if (level < DV_VLC_MAP_LEV_SIZE) {
366 *vlc = dv_vlc_map[0][level].vlc | sign;
367 size = dv_vlc_map[0][level].size;
369 *vlc = 0xfe00 | (level << 1) | sign;
373 *vlc |= ((run < 16) ? dv_vlc_map[run-1][0].vlc :
374 (0x1f80 | (run - 1))) << size;
375 size += (run < 16) ? dv_vlc_map[run-1][0].size : 13;
382 static av_always_inline int dv_rl2vlc_size(int run, int level)
386 if (run < DV_VLC_MAP_RUN_SIZE && level < DV_VLC_MAP_LEV_SIZE) {
387 size = dv_vlc_map[run][level].size;
390 size = (level < DV_VLC_MAP_LEV_SIZE) ? dv_vlc_map[0][level].size : 16;
392 size += (run < 16) ? dv_vlc_map[run-1][0].size : 13;
398 static av_always_inline int dv_rl2vlc(int run, int l, int sign, uint32_t* vlc)
400 *vlc = dv_vlc_map[run][l].vlc | sign;
401 return dv_vlc_map[run][l].size;
404 static av_always_inline int dv_rl2vlc_size(int run, int l)
406 return dv_vlc_map[run][l].size;
410 typedef struct EncBlockInfo {
420 uint8_t partial_bit_count;
421 uint32_t partial_bit_buffer; /* we can't use uint16_t here */
424 static av_always_inline PutBitContext* dv_encode_ac(EncBlockInfo* bi,
425 PutBitContext* pb_pool,
426 PutBitContext* pb_end)
429 PutBitContext* pb = pb_pool;
430 int size = bi->partial_bit_count;
431 uint32_t vlc = bi->partial_bit_buffer;
433 bi->partial_bit_count = bi->partial_bit_buffer = 0;
435 /* Find suitable storage space */
436 for (; size > (bits_left = put_bits_left(pb)); pb++) {
439 put_bits(pb, bits_left, vlc >> size);
440 vlc = vlc & ((1 << size) - 1);
442 if (pb + 1 >= pb_end) {
443 bi->partial_bit_count = size;
444 bi->partial_bit_buffer = vlc;
450 put_bits(pb, size, vlc);
452 if (bi->cur_ac >= 64)
455 /* Construct the next VLC */
457 bi->cur_ac = bi->next[prev];
458 if (bi->cur_ac < 64){
459 size = dv_rl2vlc(bi->cur_ac - prev - 1, bi->mb[bi->cur_ac], bi->sign[bi->cur_ac], &vlc);
461 size = 4; vlc = 6; /* End Of Block stamp */
467 static av_always_inline int dv_guess_dct_mode(DVVideoContext *s, uint8_t *data, int linesize) {
468 if (s->avctx->flags & CODEC_FLAG_INTERLACED_DCT) {
469 int ps = s->ildct_cmp(NULL, data, NULL, linesize, 8) - 400;
471 int is = s->ildct_cmp(NULL, data , NULL, linesize<<1, 4) +
472 s->ildct_cmp(NULL, data + linesize, NULL, linesize<<1, 4);
480 static const int dv_weight_bits = 18;
481 static const int dv_weight_88[64] = {
482 131072, 257107, 257107, 242189, 252167, 242189, 235923, 237536,
483 237536, 235923, 229376, 231390, 223754, 231390, 229376, 222935,
484 224969, 217965, 217965, 224969, 222935, 200636, 218652, 211916,
485 212325, 211916, 218652, 200636, 188995, 196781, 205965, 206433,
486 206433, 205965, 196781, 188995, 185364, 185364, 200636, 200704,
487 200636, 185364, 185364, 174609, 180568, 195068, 195068, 180568,
488 174609, 170091, 175557, 189591, 175557, 170091, 165371, 170627,
489 170627, 165371, 160727, 153560, 160727, 144651, 144651, 136258,
491 static const int dv_weight_248[64] = {
492 131072, 242189, 257107, 237536, 229376, 200636, 242189, 223754,
493 224969, 196781, 262144, 242189, 229376, 200636, 257107, 237536,
494 211916, 185364, 235923, 217965, 229376, 211916, 206433, 180568,
495 242189, 223754, 224969, 196781, 211916, 185364, 235923, 217965,
496 200704, 175557, 222935, 205965, 200636, 185364, 195068, 170627,
497 229376, 211916, 206433, 180568, 200704, 175557, 222935, 205965,
498 175557, 153560, 188995, 174609, 165371, 144651, 200636, 185364,
499 195068, 170627, 175557, 153560, 188995, 174609, 165371, 144651,
502 static av_always_inline int dv_init_enc_block(EncBlockInfo* bi, uint8_t *data, int linesize, DVVideoContext *s, int bias)
505 const uint8_t* zigzag_scan;
506 LOCAL_ALIGNED_16(int16_t, blk, [64]);
508 /* We offer two different methods for class number assignment: the
509 method suggested in SMPTE 314M Table 22, and an improved
510 method. The SMPTE method is very conservative; it assigns class
511 3 (i.e. severe quantization) to any block where the largest AC
512 component is greater than 36. FFmpeg's DV encoder tracks AC bit
513 consumption precisely, so there is no need to bias most blocks
514 towards strongly lossy compression. Instead, we assign class 2
515 to most blocks, and use class 3 only when strictly necessary
516 (for blocks whose largest AC component exceeds 255). */
518 #if 0 /* SMPTE spec method */
519 static const int classes[] = {12, 24, 36, 0xffff};
520 #else /* improved FFmpeg method */
521 static const int classes[] = {-1, -1, 255, 0xffff};
523 int max = classes[0];
526 av_assert2((((int)blk) & 15) == 0);
528 bi->area_q[0] = bi->area_q[1] = bi->area_q[2] = bi->area_q[3] = 0;
529 bi->partial_bit_count = 0;
530 bi->partial_bit_buffer = 0;
533 bi->dct_mode = dv_guess_dct_mode(s, data, linesize);
534 s->get_pixels(blk, data, linesize);
535 s->fdct[bi->dct_mode](blk);
537 /* We rely on the fact that encoding all zeros leads to an immediate EOB,
538 which is precisely what the spec calls for in the "dummy" blocks. */
539 memset(blk, 0, 64*sizeof(*blk));
544 zigzag_scan = bi->dct_mode ? ff_zigzag248_direct : ff_zigzag_direct;
545 weight = bi->dct_mode ? dv_weight_248 : dv_weight_88;
547 for (area = 0; area < 4; area++) {
548 bi->prev[area] = prev;
549 bi->bit_size[area] = 1; // 4 areas 4 bits for EOB :)
550 for (i = mb_area_start[area]; i < mb_area_start[area+1]; i++) {
551 int level = blk[zigzag_scan[i]];
553 if (level + 15 > 30U) {
554 bi->sign[i] = (level >> 31) & 1;
555 /* weight it and shift down into range, adding for rounding */
556 /* the extra division by a factor of 2^4 reverses the 8x expansion of the DCT
557 AND the 2x doubling of the weights */
558 level = (FFABS(level) * weight[i] + (1 << (dv_weight_bits+3))) >> (dv_weight_bits+4);
562 bi->bit_size[area] += dv_rl2vlc_size(i - prev - 1, level);
569 for (bi->cno = 0; max > classes[bi->cno]; bi->cno++);
577 for (area = 0; area < 4; area++) {
578 bi->prev[area] = prev;
579 bi->bit_size[area] = 1; // 4 areas 4 bits for EOB :)
580 for (; i < mb_area_start[area+1]; i = bi->next[i]) {
584 bi->bit_size[area] += dv_rl2vlc_size(i - prev - 1, bi->mb[i]);
593 return bi->bit_size[0] + bi->bit_size[1] + bi->bit_size[2] + bi->bit_size[3];
596 static inline void dv_guess_qnos(EncBlockInfo* blks, int* qnos)
599 int i, j, k, a, prev, a2;
602 size[0] = size[1] = size[2] = size[3] = size[4] = 1 << 24;
605 for (i = 0; i < 5; i++) {
611 for (j = 0; j < 6; j++, b++) {
612 for (a = 0; a < 4; a++) {
613 if (b->area_q[a] != ff_dv_quant_shifts[qnos[i] + ff_dv_quant_offset[b->cno]][a]) {
614 b->bit_size[a] = 1; // 4 areas 4 bits for EOB :)
617 av_assert2(b->next[prev] >= mb_area_start[a+1] || b->mb[prev]);
618 for (k = b->next[prev] ; k < mb_area_start[a+1]; k = b->next[k]) {
621 b->bit_size[a] += dv_rl2vlc_size(k - prev - 1, b->mb[k]);
624 if (b->next[k] >= mb_area_start[a+1] && b->next[k]<64){
625 for (a2 = a + 1; b->next[k] >= mb_area_start[a2+1]; a2++)
628 av_assert2(b->mb[b->next[k]]);
629 b->bit_size[a2] += dv_rl2vlc_size(b->next[k] - prev - 1, b->mb[b->next[k]])
630 -dv_rl2vlc_size(b->next[k] - k - 1, b->mb[b->next[k]]);
631 av_assert2(b->prev[a2] == k && (a2 + 1 >= 4 || b->prev[a2+1] != k));
634 b->next[prev] = b->next[k];
639 size[i] += b->bit_size[a];
642 if (vs_total_ac_bits >= size[0] + size[1] + size[2] + size[3] + size[4])
645 } while (qnos[0]|qnos[1]|qnos[2]|qnos[3]|qnos[4]);
648 for (a = 2; a == 2 || vs_total_ac_bits < size[0]; a += a){
650 size[0] = 5 * 6 * 4; //EOB
651 for (j = 0; j < 6 *5; j++, b++) {
653 for (k = b->next[prev]; k < 64; k = b->next[k]) {
654 if (b->mb[k] < a && b->mb[k] > -a){
655 b->next[prev] = b->next[k];
657 size[0] += dv_rl2vlc_size(k - prev - 1, b->mb[k]);
665 static int dv_encode_video_segment(AVCodecContext *avctx, void *arg)
667 DVVideoContext *s = avctx->priv_data;
668 DVwork_chunk *work_chunk = arg;
670 int mb_x, mb_y, c_offset, linesize, y_stride;
673 LOCAL_ALIGNED_8(uint8_t, scratch, [128]);
674 EncBlockInfo enc_blks[5*DV_MAX_BPM];
675 PutBitContext pbs[5*DV_MAX_BPM];
677 EncBlockInfo* enc_blk;
679 int qnos[5] = {15, 15, 15, 15, 15}; /* No quantization */
680 int* qnosp = &qnos[0];
682 dif = &s->buf[work_chunk->buf_offset*80];
683 enc_blk = &enc_blks[0];
684 for (mb_index = 0; mb_index < 5; mb_index++) {
685 dv_calculate_mb_xy(s, work_chunk, mb_index, &mb_x, &mb_y);
687 /* initializing luminance blocks */
688 if ((s->sys->pix_fmt == AV_PIX_FMT_YUV420P) ||
689 (s->sys->pix_fmt == AV_PIX_FMT_YUV411P && mb_x >= (704 / 8)) ||
690 (s->sys->height >= 720 && mb_y != 134)) {
691 y_stride = s->picture.linesize[0] << 3;
695 y_ptr = s->picture.data[0] + ((mb_y * s->picture.linesize[0] + mb_x) << 3);
696 linesize = s->picture.linesize[0];
698 if (s->sys->video_stype == 4) { /* SD 422 */
700 dv_init_enc_block(enc_blk+0, y_ptr , linesize, s, 0) +
701 dv_init_enc_block(enc_blk+1, NULL , linesize, s, 0) +
702 dv_init_enc_block(enc_blk+2, y_ptr + 8 , linesize, s, 0) +
703 dv_init_enc_block(enc_blk+3, NULL , linesize, s, 0);
706 dv_init_enc_block(enc_blk+0, y_ptr , linesize, s, 0) +
707 dv_init_enc_block(enc_blk+1, y_ptr + 8 , linesize, s, 0) +
708 dv_init_enc_block(enc_blk+2, y_ptr + y_stride, linesize, s, 0) +
709 dv_init_enc_block(enc_blk+3, y_ptr + 8 + y_stride, linesize, s, 0);
713 /* initializing chrominance blocks */
714 c_offset = (((mb_y >> (s->sys->pix_fmt == AV_PIX_FMT_YUV420P)) * s->picture.linesize[1] +
715 (mb_x >> ((s->sys->pix_fmt == AV_PIX_FMT_YUV411P) ? 2 : 1))) << 3);
716 for (j = 2; j; j--) {
717 uint8_t *c_ptr = s->picture.data[j] + c_offset;
718 linesize = s->picture.linesize[j];
719 y_stride = (mb_y == 134) ? 8 : (s->picture.linesize[j] << 3);
720 if (s->sys->pix_fmt == AV_PIX_FMT_YUV411P && mb_x >= (704 / 8)) {
722 uint8_t* b = scratch;
723 for (i = 0; i < 8; i++) {
724 d = c_ptr + (linesize << 3);
725 b[0] = c_ptr[0]; b[1] = c_ptr[1]; b[2] = c_ptr[2]; b[3] = c_ptr[3];
726 b[4] = d[0]; b[5] = d[1]; b[6] = d[2]; b[7] = d[3];
734 vs_bit_size += dv_init_enc_block( enc_blk++, c_ptr , linesize, s, 1);
735 if (s->sys->bpm == 8) {
736 vs_bit_size += dv_init_enc_block(enc_blk++, c_ptr + y_stride, linesize, s, 1);
741 if (vs_total_ac_bits < vs_bit_size)
742 dv_guess_qnos(&enc_blks[0], qnosp);
744 /* DIF encoding process */
745 for (j=0; j<5*s->sys->bpm;) {
751 /* First pass over individual cells only */
752 for (i=0; i<s->sys->bpm; i++, j++) {
753 int sz = s->sys->block_sizes[i]>>3;
755 init_put_bits(&pbs[j], dif, sz);
756 put_sbits(&pbs[j], 9, ((enc_blks[j].mb[0] >> 3) - 1024 + 2) >> 2);
757 put_bits(&pbs[j], 1, enc_blks[j].dct_mode);
758 put_bits(&pbs[j], 2, enc_blks[j].cno);
760 dv_encode_ac(&enc_blks[j], &pbs[j], &pbs[j+1]);
764 /* Second pass over each MB space */
766 for (i=0; i<s->sys->bpm; i++) {
767 if (enc_blks[start_mb+i].partial_bit_count)
768 pb = dv_encode_ac(&enc_blks[start_mb+i], pb, &pbs[start_mb+s->sys->bpm]);
772 /* Third and final pass over the whole video segment space */
774 for (j=0; j<5*s->sys->bpm; j++) {
775 if (enc_blks[j].partial_bit_count)
776 pb = dv_encode_ac(&enc_blks[j], pb, &pbs[s->sys->bpm*5]);
777 if (enc_blks[j].partial_bit_count)
778 av_log(avctx, AV_LOG_ERROR, "ac bitstream overflow\n");
781 for (j=0; j<5*s->sys->bpm; j++) {
783 int size = pbs[j].size_in_bits >> 3;
784 flush_put_bits(&pbs[j]);
785 pos = put_bits_count(&pbs[j]) >> 3;
787 av_log(avctx, AV_LOG_ERROR, "bitstream written beyond buffer size\n");
790 memset(pbs[j].buf + pos, 0xff, size - pos);
796 static inline int dv_write_pack(enum dv_pack_type pack_id, DVVideoContext *c,
800 * Here's what SMPTE314M says about these two:
801 * (page 6) APTn, AP1n, AP2n, AP3n: These data shall be identical
802 * as track application IDs (APTn = 001, AP1n =
803 * 001, AP2n = 001, AP3n = 001), if the source signal
804 * comes from a digital VCR. If the signal source is
805 * unknown, all bits for these data shall be set to 1.
806 * (page 12) STYPE: STYPE defines a signal type of video signal
807 * 00000b = 4:1:1 compression
808 * 00100b = 4:2:2 compression
810 * Now, I've got two problems with these statements:
811 * 1. it looks like APT == 111b should be a safe bet, but it isn't.
812 * It seems that for PAL as defined in IEC 61834 we have to set
813 * APT to 000 and for SMPTE314M to 001.
814 * 2. It is not at all clear what STYPE is used for 4:2:0 PAL
815 * compression scheme (if any).
817 int apt = (c->sys->pix_fmt == AV_PIX_FMT_YUV420P ? 0 : 1);
818 int fs = c->picture.top_field_first ? 0x00 : 0x40;
821 if ((int)(av_q2d(c->avctx->sample_aspect_ratio) * c->avctx->width / c->avctx->height * 10) >= 17) /* 16:9 */
824 buf[0] = (uint8_t)pack_id;
826 case dv_header525: /* I can't imagine why these two weren't defined as real */
827 case dv_header625: /* packs in SMPTE314M -- they definitely look like ones */
828 buf[1] = 0xf8 | /* reserved -- always 1 */
829 (apt & 0x07); /* APT: Track application ID */
830 buf[2] = (0 << 7) | /* TF1: audio data is 0 - valid; 1 - invalid */
831 (0x0f << 3) | /* reserved -- always 1 */
832 (apt & 0x07); /* AP1: Audio application ID */
833 buf[3] = (0 << 7) | /* TF2: video data is 0 - valid; 1 - invalid */
834 (0x0f << 3) | /* reserved -- always 1 */
835 (apt & 0x07); /* AP2: Video application ID */
836 buf[4] = (0 << 7) | /* TF3: subcode(SSYB) is 0 - valid; 1 - invalid */
837 (0x0f << 3) | /* reserved -- always 1 */
838 (apt & 0x07); /* AP3: Subcode application ID */
840 case dv_video_source:
841 buf[1] = 0xff; /* reserved -- always 1 */
842 buf[2] = (1 << 7) | /* B/W: 0 - b/w, 1 - color */
843 (1 << 6) | /* following CLF is valid - 0, invalid - 1 */
844 (3 << 4) | /* CLF: color frames ID (see ITU-R BT.470-4) */
845 0xf; /* reserved -- always 1 */
846 buf[3] = (3 << 6) | /* reserved -- always 1 */
847 (c->sys->dsf << 5) | /* system: 60fields/50fields */
848 c->sys->video_stype; /* signal type video compression */
849 buf[4] = 0xff; /* VISC: 0xff -- no information */
851 case dv_video_control:
852 buf[1] = (0 << 6) | /* Copy generation management (CGMS) 0 -- free */
853 0x3f; /* reserved -- always 1 */
854 buf[2] = 0xc8 | /* reserved -- always b11001xxx */
856 buf[3] = (1 << 7) | /* frame/field flag 1 -- frame, 0 -- field */
857 fs | /* first/second field flag 0 -- field 2, 1 -- field 1 */
858 (1 << 5) | /* frame change flag 0 -- same picture as before, 1 -- different */
859 (1 << 4) | /* 1 - interlaced, 0 - noninterlaced */
860 0xc; /* reserved -- always b1100 */
861 buf[4] = 0xff; /* reserved -- always 1 */
864 buf[1] = buf[2] = buf[3] = buf[4] = 0xff;
869 #if CONFIG_DVVIDEO_ENCODER
870 static inline int dv_write_dif_id(enum dv_section_type t, uint8_t chan_num,
871 uint8_t seq_num, uint8_t dif_num,
874 buf[0] = (uint8_t)t; /* Section type */
875 buf[1] = (seq_num << 4) | /* DIF seq number 0-9 for 525/60; 0-11 for 625/50 */
876 (chan_num << 3) | /* FSC: for 50Mb/s 0 - first channel; 1 - second */
877 7; /* reserved -- always 1 */
878 buf[2] = dif_num; /* DIF block number Video: 0-134, Audio: 0-8 */
883 static inline int dv_write_ssyb_id(uint8_t syb_num, uint8_t fr, uint8_t* buf)
885 if (syb_num == 0 || syb_num == 6) {
886 buf[0] = (fr << 7) | /* FR ID 1 - first half of each channel; 0 - second */
887 (0 << 4) | /* AP3 (Subcode application ID) */
888 0x0f; /* reserved -- always 1 */
890 else if (syb_num == 11) {
891 buf[0] = (fr << 7) | /* FR ID 1 - first half of each channel; 0 - second */
892 0x7f; /* reserved -- always 1 */
895 buf[0] = (fr << 7) | /* FR ID 1 - first half of each channel; 0 - second */
896 (0 << 4) | /* APT (Track application ID) */
897 0x0f; /* reserved -- always 1 */
899 buf[1] = 0xf0 | /* reserved -- always 1 */
900 (syb_num & 0x0f); /* SSYB number 0 - 11 */
901 buf[2] = 0xff; /* reserved -- always 1 */
905 static void dv_format_frame(DVVideoContext* c, uint8_t* buf)
909 for (chan = 0; chan < c->sys->n_difchan; chan++) {
910 for (i = 0; i < c->sys->difseg_size; i++) {
911 memset(buf, 0xff, 80 * 6); /* first 6 DIF blocks are for control data */
913 /* DV header: 1DIF */
914 buf += dv_write_dif_id(dv_sect_header, chan, i, 0, buf);
915 buf += dv_write_pack((c->sys->dsf ? dv_header625 : dv_header525), c, buf);
916 buf += 72; /* unused bytes */
918 /* DV subcode: 2DIFs */
919 for (j = 0; j < 2; j++) {
920 buf += dv_write_dif_id(dv_sect_subcode, chan, i, j, buf);
921 for (k = 0; k < 6; k++)
922 buf += dv_write_ssyb_id(k, (i < c->sys->difseg_size/2), buf) + 5;
923 buf += 29; /* unused bytes */
927 for (j = 0; j < 3; j++) {
928 buf += dv_write_dif_id(dv_sect_vaux, chan, i, j, buf);
929 buf += dv_write_pack(dv_video_source, c, buf);
930 buf += dv_write_pack(dv_video_control, c, buf);
932 buf += dv_write_pack(dv_video_source, c, buf);
933 buf += dv_write_pack(dv_video_control, c, buf);
934 buf += 4*5 + 2; /* unused bytes */
937 /* DV Audio/Video: 135 Video DIFs + 9 Audio DIFs */
938 for (j = 0; j < 135; j++) {
940 memset(buf, 0xff, 80);
941 buf += dv_write_dif_id(dv_sect_audio, chan, i, j/15, buf);
942 buf += 77; /* audio control & shuffled PCM audio */
944 buf += dv_write_dif_id(dv_sect_video, chan, i, j, buf);
945 buf += 77; /* 1 video macroblock: 1 bytes control
946 4 * 14 bytes Y 8x8 data
948 10 bytes Cb 8x8 data */
955 static int dvvideo_encode_frame(AVCodecContext *c, AVPacket *pkt,
956 const AVFrame *frame, int *got_packet)
958 DVVideoContext *s = c->priv_data;
961 s->sys = avpriv_dv_codec_profile(c);
962 if (!s->sys || ff_dv_init_dynamic_tables(s->sys))
964 if ((ret = ff_alloc_packet2(c, pkt, s->sys->frame_size)) < 0)
967 c->pix_fmt = s->sys->pix_fmt;
969 s->picture.key_frame = 1;
970 s->picture.pict_type = AV_PICTURE_TYPE_I;
973 c->execute(c, dv_encode_video_segment, s->sys->work_chunks, NULL,
974 dv_work_pool_size(s->sys), sizeof(DVwork_chunk));
978 dv_format_frame(s, pkt->data);
980 pkt->flags |= AV_PKT_FLAG_KEY;
986 AVCodec ff_dvvideo_encoder = {
988 .long_name = NULL_IF_CONFIG_SMALL("DV (Digital Video)"),
989 .type = AVMEDIA_TYPE_VIDEO,
990 .id = AV_CODEC_ID_DVVIDEO,
991 .priv_data_size = sizeof(DVVideoContext),
992 .init = dvvideo_init_encoder,
993 .encode2 = dvvideo_encode_frame,
994 .capabilities = CODEC_CAP_SLICE_THREADS,
995 .pix_fmts = (const enum AVPixelFormat[]) {
996 AV_PIX_FMT_YUV411P, AV_PIX_FMT_YUV422P, AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE
999 #endif // CONFIG_DVVIDEO_ENCODER