81 "in DV, input value is: %s\n",
name ?
name :
"unknown");
89 "Valid DV profiles are:\n",
101 memset(&fdsp,0,
sizeof(fdsp));
102 memset(&mecc,0,
sizeof(mecc));
103 memset(&pdsp,0,
sizeof(pdsp));
114 s->fdct[0] = fdsp.
fdct;
117 #if !CONFIG_HARDCODED_TABLES
146 *vlc = 0xfe00 | (
level << 1) | sign;
223 if (pb + 1 >= pb_end) {
267 131072, 257107, 257107, 242189, 252167, 242189, 235923, 237536,
268 237536, 235923, 229376, 231390, 223754, 231390, 229376, 222935,
269 224969, 217965, 217965, 224969, 222935, 200636, 218652, 211916,
270 212325, 211916, 218652, 200636, 188995, 196781, 205965, 206433,
271 206433, 205965, 196781, 188995, 185364, 185364, 200636, 200704,
272 200636, 185364, 185364, 174609, 180568, 195068, 195068, 180568,
273 174609, 170091, 175557, 189591, 175557, 170091, 165371, 170627,
274 170627, 165371, 160727, 153560, 160727, 144651, 144651, 136258,
277 131072, 262144, 257107, 257107, 242189, 242189, 242189, 242189,
278 237536, 237536, 229376, 229376, 200636, 200636, 224973, 224973,
279 223754, 223754, 235923, 235923, 229376, 229376, 217965, 217965,
280 211916, 211916, 196781, 196781, 185364, 185364, 206433, 206433,
281 211916, 211916, 222935, 222935, 200636, 200636, 205964, 205964,
282 200704, 200704, 180568, 180568, 175557, 175557, 195068, 195068,
283 185364, 185364, 188995, 188995, 174606, 174606, 175557, 175557,
284 170627, 170627, 153560, 153560, 165371, 165371, 144651, 144651,
289 #define DV100_SACRIFICE_QUALITY_FOR_SPEED 1
290 #define DV100_ENABLE_FINER 1
293 #define DV100_MAKE_QLEVEL(qno,cno) ((qno<<2) | (cno))
294 #define DV100_QLEVEL_QNO(qlevel) (qlevel>>2)
295 #define DV100_QLEVEL_CNO(qlevel) (qlevel&0x3)
297 #define DV100_NUM_QLEVELS 31
346 #if DV100_SACRIFICE_QUALITY_FOR_SPEED
355 65536, 65536, 32768, 21845, 16384, 13107, 10923, 9362, 8192, 4096, 3641, 3277, 2979, 2731, 2341, 1260,
361 { 8192, 65536, 65536, 61681, 61681, 61681, 58254, 58254,
362 58254, 58254, 58254, 58254, 55188, 58254, 58254, 55188,
363 55188, 55188, 55188, 55188, 55188, 24966, 27594, 26214,
364 26214, 26214, 27594, 24966, 23831, 24385, 25575, 25575,
365 25575, 25575, 24385, 23831, 23302, 23302, 24966, 24966,
366 24966, 23302, 23302, 21845, 22795, 24385, 24385, 22795,
367 21845, 21400, 21845, 23831, 21845, 21400, 10382, 10700,
368 10700, 10382, 10082, 9620, 10082, 9039, 9039, 8525, },
369 { 8192, 65536, 65536, 61681, 61681, 61681, 41943, 41943,
370 41943, 41943, 40330, 41943, 40330, 41943, 40330, 40330,
371 40330, 38836, 38836, 40330, 40330, 24966, 27594, 26214,
372 26214, 26214, 27594, 24966, 23831, 24385, 25575, 25575,
373 25575, 25575, 24385, 23831, 11523, 11523, 12483, 12483,
374 12483, 11523, 11523, 10923, 11275, 12193, 12193, 11275,
375 10923, 5323, 5490, 5924, 5490, 5323, 5165, 5323,
376 5323, 5165, 5017, 4788, 5017, 4520, 4520, 4263, }
380 { 8192, 65536, 65536, 61681, 61681, 61681, 58254, 58254,
381 58254, 58254, 58254, 58254, 55188, 58254, 58254, 55188,
382 55188, 55188, 55188, 55188, 55188, 24966, 27594, 26214,
383 26214, 26214, 27594, 24966, 23831, 24385, 25575, 25575,
384 25575, 25575, 24385, 23831, 15420, 15420, 16644, 16644,
385 16644, 15420, 15420, 10923, 11398, 12193, 12193, 11398,
386 10923, 10700, 10923, 11916, 10923, 10700, 5191, 5350,
387 5350, 5191, 5041, 4810, 5041, 4520, 4520, 4263, },
388 { 8192, 43691, 43691, 40330, 40330, 40330, 29127, 29127,
389 29127, 29127, 29127, 29127, 27594, 29127, 29127, 27594,
390 27594, 27594, 27594, 27594, 27594, 12483, 13797, 13107,
391 13107, 13107, 13797, 12483, 11916, 12193, 12788, 12788,
392 12788, 12788, 12193, 11916, 5761, 5761, 6242, 6242,
393 6242, 5761, 5761, 5461, 5638, 5461, 6096, 5638,
394 5461, 2661, 2745, 2962, 2745, 2661, 2583, 2661,
395 2661, 2583, 2509, 2394, 2509, 2260, 2260, 2131, }
400 const uint8_t *zigzag_scan,
415 static const int classes[] = { 12, 24, 36, 0xffff };
417 static const int classes[] = { -1, -1, 255, 0xffff };
419 int max = classes[0];
421 const unsigned deadzone =
s->quant_deadzone;
422 const unsigned threshold = 2 * deadzone;
426 for (area = 0; area < 4; area++) {
427 bi->
prev[area] = prev;
432 if (
level + deadzone > threshold) {
460 for (area = 0; area < 4; area++) {
461 bi->
prev[area] = prev;
484 const uint8_t *zigzag_scan,
495 for (
i = 0;
i < 64;
i += 2) {
499 level0 =
blk[zigzag_scan[
i+0]];
500 level1 =
blk[zigzag_scan[
i+1]];
503 bi->
sign[
i+0] = (level0>>31)&1;
504 bi->
sign[
i+1] = (level1>>31)&1;
507 level0 =
FFABS(level0);
508 level1 =
FFABS(level1);
511 level0 = (level0*
weight[
i+0] + 4096 + (1<<17)) >> 18;
512 level1 = (level1*
weight[
i+1] + 4096 + (1<<17)) >> 18;
515 bi->
save[
i+0] = level0;
516 bi->
save[
i+1] = level1;
561 memset(
blk, 0, 64*
sizeof(*
blk));
567 if (
s->sys->height == 1080) {
610 if (
b->area_q[0] == qno &&
b->cno == cno)
611 return b->bit_size[0];
624 for (k = 1; k < 64; k++) {
638 return b->bit_size[0];
652 for (
i = 0;
i < 5;
i++) {
654 for (j = 0; j < 8; j++) {
655 if (blks[8*
i+j].min_qlevel > min_qlevel[
i])
661 for (
i = 0;
i < 5;
i++) {
663 if (qlevels[
i] < min_qlevel[
i])
664 qlevels[
i] = min_qlevel[
i];
668 for (j = 0; j < 8; j++) {
670 size[
i] += size_cache[8*
i+j][qlevels[
i]];
676 int largest =
size[0] % 5;
677 int qlevels_done = 0;
681 for (
i = 0;
i < 5;
i++) {
682 if (qlevels[
i] < qlevels[largest])
688 largest = (largest+1) % 5;
702 for (j = 0; j < 8; j++,
b++) {
704 if(size_cache[8*
i+j][qlevels[
i]] == 0) {
709 size[
i] += size_cache[8*
i+j][qlevels[
i]];
718 int largest =
size[0] % 5;
720 while (qlevels[0] > min_qlevel[0] ||
721 qlevels[1] > min_qlevel[1] ||
722 qlevels[2] > min_qlevel[2] ||
723 qlevels[3] > min_qlevel[3] ||
724 qlevels[4] > min_qlevel[4]) {
727 for (
i = 0;
i < 5;
i++) {
728 if (qlevels[
i] > min_qlevel[
i] && qlevels[
i] > qlevels[largest])
735 largest = (largest+1) % 5;
737 if (qlevels[
i] <= min_qlevel[
i]) {
742 save_qlevel = qlevels[
i];
744 if (qlevels[
i] < min_qlevel[
i])
745 qlevels[
i] = min_qlevel[
i];
753 for (j = 0; j < 8; j++,
b++) {
755 if(size_cache[8*
i+j][qlevels[
i]] == 0) {
758 size[
i] += size_cache[8*
i+j][qlevels[
i]];
764 qlevels[
i] = save_qlevel;
772 for (
i = 0;
i < 5;
i++) {
776 for (j = 0; j < 8; j++,
b++) {
786 int i, j, k,
a, prev,
a2;
796 for (
i = 0;
i < 5;
i++) {
802 for (j = 0; j < 6; j++,
b++) {
803 for (
a = 0;
a < 4;
a++) {
825 b->next[prev] =
b->next[k];
828 b->prev[
a + 1] = prev;
836 }
while (qnos[0] | qnos[1] | qnos[2] | qnos[3] | qnos[4]);
841 for (j = 0; j < 6 * 5; j++,
b++) {
843 for (k =
b->next[prev]; k < 64; k = b->next[k]) {
844 if (
b->mb[k] <
a &&
b->mb[k] > -
a) {
845 b->next[prev] =
b->next[k];
862 for (mb_index = 0; mb_index < 5; mb_index++) {
863 data = dif + mb_index*80 + 4;
880 int mb_x, mb_y, c_offset;
881 ptrdiff_t linesize, y_stride;
882 const uint8_t *y_ptr;
891 int *qnosp = &qnos[0];
894 enc_blk = &enc_blks[0];
895 for (mb_index = 0; mb_index < 5; mb_index++) {
900 y_ptr =
s->frame->data[0] + (mb_y *
s->frame->linesize[0] + mb_x) * 8;
901 linesize =
s->frame->linesize[0];
903 if (
s->sys->height == 1080 && mb_y < 134)
907 for (
i = 1;
i < 8;
i++)
913 (
s->sys->height >= 720 && mb_y != 134)) {
914 y_stride =
s->frame->linesize[0] * (1 << (3*!enc_blk->
dct_mode));
918 y_ptr =
s->frame->data[0] +
919 (mb_y *
s->frame->linesize[0] + mb_x) * 8;
920 linesize =
s->frame->linesize[0];
922 if (
s->sys->video_stype == 4) {
940 for (j = 2; j; j--) {
941 const uint8_t *c_ptr =
s->frame->data[j] + c_offset;
942 linesize =
s->frame->linesize[j];
943 y_stride = (mb_y == 134) ? 8 : (
s->frame->linesize[j] * (1 << (3*!enc_blk->
dct_mode)));
945 uint8_t *
b = scratch;
946 for (
i = 0;
i < 8;
i++) {
947 const uint8_t *
d = c_ptr + linesize * 8;
964 if (
s->sys->bpm == 8)
978 for (j = 0; j < 5 *
s->sys->bpm;) {
985 for (
i = 0;
i <
s->sys->bpm;
i++, j++) {
986 int sz =
s->sys->block_sizes[
i] >> 3;
989 put_sbits(&pbs[j], 9, ((enc_blks[j].
mb[0] >> 3) - 1024 + 2) >> 2);
991 put_bits(&pbs[j], 2, enc_blks[j].cno);
999 for (
i = 0;
i <
s->sys->bpm;
i++)
1000 if (enc_blks[start_mb +
i].partial_bit_count)
1002 &pbs[start_mb +
s->sys->bpm]);
1007 for (j = 0; j < 5 *
s->sys->bpm; j++) {
1008 if (enc_blks[j].partial_bit_count)
1010 if (enc_blks[j].partial_bit_count)
1014 for (j = 0; j < 5 *
s->sys->bpm; j++) {
1050 if (
c->avctx->height >= 720)
1056 (
int)(
av_q2d(
c->avctx->sample_aspect_ratio) *
1057 c->avctx->width /
c->avctx->height * 10) >= 17)
1061 buf[0] = (uint8_t) pack_id;
1084 (
c->sys->dsf << 5) |
1085 c->sys->video_stype;
1110 uint8_t seq_num, uint8_t dif_num,
1113 int fsc = chan_num & 1;
1114 int fsp = 1 - (chan_num >> 1);
1116 buf[0] = (uint8_t) t;
1117 buf[1] = (seq_num << 4) |
1127 if (syb_num == 0 || syb_num == 6) {
1128 buf[0] = (fr << 7) |
1131 }
else if (syb_num == 11) {
1132 buf[0] = (fr << 7) |
1135 buf[0] = (fr << 7) |
1149 int chan_offset = 2*(
c->sys->height == 720 &&
c->avctx->frame_num & 1);
1151 for (chan = 0; chan <
c->sys->n_difchan; chan++) {
1152 for (
i = 0;
i <
c->sys->difseg_size;
i++) {
1153 memset(buf, 0xff, 80 * 6);
1162 for (j = 0; j < 2; j++) {
1164 for (k = 0; k < 6; k++)
1170 for (j = 0; j < 3; j++) {
1181 for (j = 0; j < 135; j++) {
1183 memset(buf, 0xff, 80);
1208 c->pix_fmt =
s->sys->pix_fmt;
1224 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
1225 #define OFFSET(x) offsetof(DVEncContext, x)
1227 {
"quant_deadzone",
"Quantizer dead zone",
OFFSET(quant_deadzone),
AV_OPT_TYPE_INT, { .i64 = 7 }, 0, 1024,
VE },
1239 .
p.
name =
"dvvideo",