1 /*
2 * DV encoder
3 * Copyright (c) 2003 Roman Shaposhnik
4 *
5 * This file is part of FFmpeg.
6 *
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 */
21
22 /**
23 * @file
24 * DV encoder
25 */
26
27 #include "config.h"
28
31
41
43 {
49
53 "Valid DV profiles are:\n",
57 }
61 }
63 if (ret < 0) {
66 }
67
71
73
74 memset(&fdsp,0, sizeof(fdsp));
75 memset(&mecc,0, sizeof(mecc));
76 memset(&pdsp,0, sizeof(pdsp));
81
84
87
89 }
90
91 /* bit budget for AC only in 5 MBs */
94
95 #if CONFIG_SMALL
96 /* Convert run and level (where level != 0) pair into VLC, returning bit size */
98 uint32_t *vlc)
99 {
104 } else {
108 } else {
109 *vlc = 0xfe00 | (level << 1) | sign;
110 size = 16;
111 }
112 if (run) {
113 *vlc |= ((run < 16) ?
dv_vlc_map[run - 1][0].vlc :
114 (0x1f80 | (run - 1))) <<
size;
115 size += (run < 16) ?
dv_vlc_map[run - 1][0].size : 13;
116 }
117 }
118
120 }
121
123 {
125
128 } else {
130 if (run)
131 size += (run < 16) ?
dv_vlc_map[run - 1][0].size : 13;
132 }
134 }
135 #else
137 {
140 }
141
143 {
145 }
146 #endif
147
161
165 {
166 int prev, bits_left;
170
173 for (;;) {
174 /* Find suitable storage space */
176 if (bits_left) {
177 size -= bits_left;
178 put_bits(pb, bits_left, vlc >> size);
179 vlc = vlc & ((1 <<
size) - 1);
180 }
181 if (pb + 1 >= pb_end) {
184 return pb;
185 }
186 }
187
188 /* Store VLC */
190
192 break;
193
194 /* Construct the next VLC */
200 } else {
201 size = 4;
202 vlc = 6; /* End Of Block stamp */
203 }
204 }
205 return pb;
206 }
207
209 int linesize)
210 {
213 if (ps > 0) {
216 return ps > is;
217 }
218 }
219
220 return 0;
221 }
222
225 131072, 257107, 257107, 242189, 252167, 242189, 235923, 237536,
226 237536, 235923, 229376, 231390, 223754, 231390, 229376, 222935,
227 224969, 217965, 217965, 224969, 222935, 200636, 218652, 211916,
228 212325, 211916, 218652, 200636, 188995, 196781, 205965, 206433,
229 206433, 205965, 196781, 188995, 185364, 185364, 200636, 200704,
230 200636, 185364, 185364, 174609, 180568, 195068, 195068, 180568,
231 174609, 170091, 175557, 189591, 175557, 170091, 165371, 170627,
232 170627, 165371, 160727, 153560, 160727, 144651, 144651, 136258,
233 };
235 131072, 262144, 257107, 257107, 242189, 242189, 242189, 242189,
236 237536, 237536, 229376, 229376, 200636, 200636, 224973, 224973,
237 223754, 223754, 235923, 235923, 229376, 229376, 217965, 217965,
238 211916, 211916, 196781, 196781, 185364, 185364, 206433, 206433,
239 211916, 211916, 222935, 222935, 200636, 200636, 205964, 205964,
240 200704, 200704, 180568, 180568, 175557, 175557, 195068, 195068,
241 185364, 185364, 188995, 188995, 174606, 174606, 175557, 175557,
242 170627, 170627, 153560, 153560, 165371, 165371, 144651, 144651,
243 };
244
247 int bias)
248 {
252 int i, area;
253 /* We offer two different methods for class number assignment: the
254 * method suggested in SMPTE 314M Table 22, and an improved
255 * method. The SMPTE method is very conservative; it assigns class
256 * 3 (i.e. severe quantization) to any block where the largest AC
257 * component is greater than 36. FFmpeg's DV encoder tracks AC bit
258 * consumption precisely, so there is no need to bias most blocks
259 * towards strongly lossy compression. Instead, we assign class 2
260 * to most blocks, and use class 3 only when strictly necessary
261 * (for blocks whose largest AC component exceeds 255). */
262
263 #if 0 /* SMPTE spec method */
264 static const int classes[] = { 12, 24, 36, 0xffff };
265 #else /* improved FFmpeg method */
266 static const int classes[] = { -1, -1, 255, 0xffff };
267 #endif
268 int max = classes[0];
269 int prev = 0;
270
272
280 if (data) {
284 } else {
285 /* We rely on the fact that encoding all zeros leads to an immediate
286 * EOB, which is precisely what the spec calls for in the "dummy"
287 * blocks. */
288 memset(blk, 0, 64 * sizeof(*blk));
290 }
292
295
296 for (area = 0; area < 4; area++) {
297 bi->
prev[area] = prev;
298 bi->
bit_size[area] = 1;
// 4 areas 4 bits for EOB :)
300 int level = blk[zigzag_scan[i]];
301
302 if (level + 15 > 30
U) {
303 bi->
sign[i] = (level >> 31) & 1;
304 /* Weight it and shift down into range, adding for rounding.
305 * The extra division by a factor of 2^4 reverses the 8x
306 * expansion of the DCT AND the 2x doubling of the weights. */
307 level = (
FFABS(level) * weight[i] + (1 << (dv_weight_bits + 3))) >>
308 (dv_weight_bits + 4);
310 if (level > max)
314 prev = i;
315 }
316 }
317 }
319 for (bi->
cno = 0; max > classes[bi->
cno]; bi->
cno++)
320 ;
321
323
326 prev = 0;
328 for (area = 0; area < 4; area++) {
329 bi->
prev[area] = prev;
330 bi->
bit_size[area] = 1;
// 4 areas 4 bits for EOB :)
333
337 prev = i;
338 }
339 }
340 }
342 }
343
346 }
347
349 {
350 int size[5];
351 int i, j, k,
a, prev,
a2;
353
354 size[0] =
355 size[1] =
356 size[2] =
357 size[3] =
358 size[4] = 1 << 24;
359 do {
360 b = blks;
361 for (i = 0; i < 5; i++) {
362 if (!qnos[i])
363 continue;
364
365 qnos[i]--;
366 size[i] = 0;
367 for (j = 0; j < 6; j++, b++) {
368 for (a = 0; a < 4; a++) {
370 b->
bit_size[
a] = 1;
// 4 areas 4 bits for EOB :)
378 prev = k;
379 } else {
389 }
391 }
392 }
393 b->
prev[a + 1] = prev;
394 }
396 }
397 }
399 return;
400 }
401 } while (qnos[0] | qnos[1] | qnos[2] | qnos[3] | qnos[4]);
402
404 b = blks;
405 size[0] = 5 * 6 * 4; // EOB
406 for (j = 0; j < 6 * 5; j++, b++) {
408 for (k = b->
next[prev]; k < 64; k = b->next[k]) {
409 if (b->
mb[k] < a && b->
mb[k] > -a) {
411 } else {
413 prev = k;
414 }
415 }
416 }
417 }
418 }
419
421 {
424 int mb_index, i, j;
425 int mb_x, mb_y, c_offset, linesize, y_stride;
433 int vs_bit_size = 0;
434 int qnos[5] = { 15, 15, 15, 15, 15 }; /* No quantization */
435 int *qnosp = &qnos[0];
436
438 enc_blk = &enc_blks[0];
439 for (mb_index = 0; mb_index < 5; mb_index++) {
441
442 /* initializing luminance blocks */
445 (s->
sys->
height >= 720 && mb_y != 134)) {
447 } else {
448 y_stride = 16;
449 }
453
455 vs_bit_size +=
460 } else {
461 vs_bit_size +=
466 }
467 enc_blk += 4;
468
469 /* initializing chrominance blocks */
472 for (j = 2; j; j--) {
479 for (i = 0; i < 8; i++) {
480 d = c_ptr + (linesize << 3);
481 b[0] = c_ptr[0];
482 b[1] = c_ptr[1];
483 b[2] = c_ptr[2];
484 b[3] = c_ptr[3];
485 b[4] = d[0];
486 b[5] = d[1];
487 b[6] = d[2];
488 b[7] = d[3];
489 c_ptr += linesize;
490 b += 16;
491 }
492 c_ptr = scratch;
493 linesize = 16;
494 }
495
499 linesize, s, 1);
500 }
501 }
502
505
506 /* DIF encoding process */
507 for (j = 0; j < 5 * s->
sys->
bpm;) {
508 int start_mb = j;
509
510 dif[3] = *qnosp++;
511 dif += 4;
512
513 /* First pass over individual cells only */
514 for (i = 0; i < s->
sys->
bpm; i++, j++) {
516
518 put_sbits(&pbs[j], 9, ((enc_blks[j].
mb[0] >> 3) - 1024 + 2) >> 2);
519 put_bits(&pbs[j], 1, enc_blks[j].dct_mode);
520 put_bits(&pbs[j], 2, enc_blks[j].cno);
521
523 dif += sz;
524 }
525
526 /* Second pass over each MB space */
527 pb = &pbs[start_mb];
528 for (i = 0; i < s->
sys->
bpm; i++)
529 if (enc_blks[start_mb + i].partial_bit_count)
531 &pbs[start_mb + s->
sys->
bpm]);
532 }
533
534 /* Third and final pass over the whole video segment space */
535 pb = &pbs[0];
536 for (j = 0; j < 5 * s->
sys->
bpm; j++) {
537 if (enc_blks[j].partial_bit_count)
539 if (enc_blks[j].partial_bit_count)
541 }
542
543 for (j = 0; j < 5 * s->
sys->
bpm; j++) {
544 int pos;
548 if (pos > size) {
550 "bitstream written beyond buffer size\n");
551 return -1;
552 }
553 memset(pbs[j].
buf + pos, 0xff, size - pos);
554 }
555
556 return 0;
557 }
558
561 {
562 /*
563 * Here's what SMPTE314M says about these two:
564 * (page 6) APTn, AP1n, AP2n, AP3n: These data shall be identical
565 * as track application IDs (APTn = 001, AP1n =
566 * 001, AP2n = 001, AP3n = 001), if the source signal
567 * comes from a digital VCR. If the signal source is
568 * unknown, all bits for these data shall be set to 1.
569 * (page 12) STYPE: STYPE defines a signal type of video signal
570 * 00000b = 4:1:1 compression
571 * 00100b = 4:2:2 compression
572 * XXXXXX = Reserved
573 * Now, I've got two problems with these statements:
574 * 1. it looks like APT == 111b should be a safe bet, but it isn't.
575 * It seems that for PAL as defined in IEC 61834 we have to set
576 * APT to 000 and for SMPTE314M to 001.
577 * 2. It is not at all clear what STYPE is used for 4:2:0 PAL
578 * compression scheme (if any).
579 */
582
586 aspect = 0x02;
587
589 switch (pack_id) {
590 case dv_header525:
/* I can't imagine why these two weren't defined as real */
591 case dv_header625:
/* packs in SMPTE314M -- they definitely look like ones */
592 buf[1] = 0xf8 | /* reserved -- always 1 */
593 (apt & 0x07); /* APT: Track application ID */
594 buf[2] = (0 << 7) | /* TF1: audio data is 0 - valid; 1 - invalid */
595 (0x0f << 3) | /* reserved -- always 1 */
596 (apt & 0x07); /* AP1: Audio application ID */
597 buf[3] = (0 << 7) | /* TF2: video data is 0 - valid; 1 - invalid */
598 (0x0f << 3) | /* reserved -- always 1 */
599 (apt & 0x07); /* AP2: Video application ID */
600 buf[4] = (0 << 7) | /* TF3: subcode(SSYB) is 0 - valid; 1 - invalid */
601 (0x0f << 3) | /* reserved -- always 1 */
602 (apt & 0x07); /* AP3: Subcode application ID */
603 break;
605 buf[1] = 0xff; /* reserved -- always 1 */
606 buf[2] = (1 << 7) | /* B/W: 0 - b/w, 1 - color */
607 (1 << 6) | /* following CLF is valid - 0, invalid - 1 */
608 (3 << 4) | /* CLF: color frames ID (see ITU-R BT.470-4) */
609 0xf; /* reserved -- always 1 */
610 buf[3] = (3 << 6) | /* reserved -- always 1 */
611 (c->
sys->
dsf << 5) |
/* system: 60fields/50fields */
613 buf[4] = 0xff; /* VISC: 0xff -- no information */
614 break;
616 buf[1] = (0 << 6) | /* Copy generation management (CGMS) 0 -- free */
617 0x3f; /* reserved -- always 1 */
618 buf[2] = 0xc8 | /* reserved -- always b11001xxx */
619 aspect;
620 buf[3] = (1 << 7) | /* frame/field flag 1 -- frame, 0 -- field */
621 fs | /* first/second field flag 0 -- field 2, 1 -- field 1 */
622 (1 << 5) | /* frame change flag 0 -- same picture as before, 1 -- different */
623 (1 << 4) | /* 1 - interlaced, 0 - noninterlaced */
624 0xc; /* reserved -- always b1100 */
625 buf[4] = 0xff; /* reserved -- always 1 */
626 break;
627 default:
628 buf[1] =
629 buf[2] =
630 buf[3] =
631 buf[4] = 0xff;
632 }
633 return 5;
634 }
635
639 {
640 buf[0] = (
uint8_t) t;
/* Section type */
641 buf[1] = (seq_num << 4) | /* DIF seq number 0-9 for 525/60; 0-11 for 625/50 */
642 (chan_num << 3) | /* FSC: for 50Mb/s 0 - first channel; 1 - second */
643 7; /* reserved -- always 1 */
644 buf[2] = dif_num; /* DIF block number Video: 0-134, Audio: 0-8 */
645 return 3;
646 }
647
649 {
650 if (syb_num == 0 || syb_num == 6) {
651 buf[0] = (fr << 7) | /* FR ID 1 - first half of each channel; 0 - second */
652 (0 << 4) | /* AP3 (Subcode application ID) */
653 0x0f; /* reserved -- always 1 */
654 } else if (syb_num == 11) {
655 buf[0] = (fr << 7) | /* FR ID 1 - first half of each channel; 0 - second */
656 0x7f; /* reserved -- always 1 */
657 } else {
658 buf[0] = (fr << 7) | /* FR ID 1 - first half of each channel; 0 - second */
659 (0 << 4) | /* APT (Track application ID) */
660 0x0f; /* reserved -- always 1 */
661 }
662 buf[1] = 0xf0 | /* reserved -- always 1 */
663 (syb_num & 0x0f); /* SSYB number 0 - 11 */
664 buf[2] = 0xff; /* reserved -- always 1 */
665 return 3;
666 }
667
669 {
670 int chan, i, j, k;
671
674 memset(buf, 0xff, 80 * 6); /* first 6 DIF blocks are for control data */
675
676 /* DV header: 1DIF */
679 c, buf);
680 buf += 72; /* unused bytes */
681
682 /* DV subcode: 2DIFs */
683 for (j = 0; j < 2; j++) {
685 for (k = 0; k < 6; k++)
687 buf += 29; /* unused bytes */
688 }
689
690 /* DV VAUX: 3DIFS */
691 for (j = 0; j < 3; j++) {
695 buf += 7 * 5;
698 buf += 4 * 5 + 2; /* unused bytes */
699 }
700
701 /* DV Audio/Video: 135 Video DIFs + 9 Audio DIFs */
702 for (j = 0; j < 135; j++) {
703 if (j % 15 == 0) {
704 memset(buf, 0xff, 80);
706 buf += 77; /* audio control & shuffled PCM audio */
707 }
709 buf += 77; /* 1 video macroblock: 1 bytes control
710 * 4 * 14 bytes Y 8x8 data
711 * 10 bytes Cr 8x8 data
712 * 10 bytes Cb 8x8 data */
713 }
714 }
715 }
716 }
717
720 {
723
726
731
735
736 emms_c();
737
739
741 *got_packet = 1;
742
743 return 0;
744 }
745
747 {
749 return 0;
750 }
751
765 },
766 };