comparison dnxhdenc.c @ 5802:d112d5c13ae8 libavcodec

better lambda search method
author bcoudurier
date Tue, 09 Oct 2007 14:15:03 +0000
parents 5691b843e72a
children c5d11f6f6a3d
comparison
equal deleted inserted replaced
5801:0be16259b7d8 5802:d112d5c13ae8
571 return 0; 571 return 0;
572 } 572 }
573 573
574 static int dnxhd_encode_rdo(AVCodecContext *avctx, DNXHDEncContext *ctx) 574 static int dnxhd_encode_rdo(AVCodecContext *avctx, DNXHDEncContext *ctx)
575 { 575 {
576 unsigned lambda, up_lambda, down_lambda; 576 int lambda, up_step, down_step;
577 int last_lower = INT_MAX, last_higher = 0;
577 int x, y, q; 578 int x, y, q;
578 579
579 for (q = 1; q < avctx->qmax; q++) { 580 for (q = 1; q < avctx->qmax; q++) {
580 ctx->qscale = q; 581 ctx->qscale = q;
581 avctx->execute(avctx, dnxhd_calc_bits_thread, (void**)&ctx->thread[0], NULL, avctx->thread_count); 582 avctx->execute(avctx, dnxhd_calc_bits_thread, (void**)&ctx->thread[0], NULL, avctx->thread_count);
582 } 583 }
583 up_lambda = avctx->qmax<<LAMBDA_FRAC_BITS; 584 up_step = down_step = 2<<LAMBDA_FRAC_BITS;
584 down_lambda = 1; // higher ?
585 lambda = ctx->lambda; 585 lambda = ctx->lambda;
586 586
587 for (;;) { 587 for (;;) {
588 int bits = 0; 588 int bits = 0;
589 int end = 0; 589 int end = 0;
590 if (lambda == up_lambda) { 590 if (lambda == last_higher) {
591 lambda--; 591 lambda++;
592 end = 1; // need to set final qscales/bits 592 end = 1; // need to set final qscales/bits
593 }
594 if (lambda == down_lambda) {
595 lambda++;
596 end = 1;
597 } 593 }
598 for (y = 0; y < ctx->m.mb_height; y++) { 594 for (y = 0; y < ctx->m.mb_height; y++) {
599 for (x = 0; x < ctx->m.mb_width; x++) { 595 for (x = 0; x < ctx->m.mb_width; x++) {
600 unsigned min = UINT_MAX; 596 unsigned min = UINT_MAX;
601 int qscale = 1; 597 int qscale = 1;
613 } 609 }
614 bits = (bits+31)&~31; // padding 610 bits = (bits+31)&~31; // padding
615 if (bits > ctx->frame_bits) 611 if (bits > ctx->frame_bits)
616 break; 612 break;
617 } 613 }
618 //dprintf(ctx->m.avctx, "lambda %d, up %d, down %d, bits %d, frame %d\n", lambda, up_lambda, down_lambda, bits, ctx->frame_bits); 614 //dprintf(ctx->m.avctx, "lambda %d, up %u, down %u, bits %d, frame %d\n",
615 // lambda, last_higher, last_lower, bits, ctx->frame_bits);
619 if (end) { 616 if (end) {
620 if (bits > ctx->frame_bits) 617 if (bits > ctx->frame_bits)
621 return -1; 618 return -1;
622 break; 619 break;
623 } 620 }
624 if (bits < ctx->frame_bits) { 621 if (bits < ctx->frame_bits) {
625 up_lambda = lambda; 622 last_lower = FFMIN(lambda, last_lower);
626 lambda = (down_lambda+lambda)>>1; 623 if (last_higher != 0)
624 lambda = (lambda+last_higher)>>1;
625 else
626 lambda -= down_step;
627 down_step *= 5; // XXX tune ?
628 up_step = 1<<LAMBDA_FRAC_BITS;
629 lambda = FFMAX(1, lambda);
630 if (lambda == last_lower)
631 break;
627 } else { 632 } else {
628 down_lambda = lambda; 633 last_higher = FFMAX(lambda, last_higher);
629 lambda = (up_lambda+lambda)>>1; 634 if (last_lower != INT_MAX)
630 } 635 lambda = (lambda+last_lower)>>1;
631 } 636 else
637 lambda += up_step;
638 up_step *= 5;
639 down_step = 1<<LAMBDA_FRAC_BITS;
640 }
641 }
642 //dprintf(ctx->m.avctx, "out lambda %d\n", lambda);
632 ctx->lambda = lambda; 643 ctx->lambda = lambda;
633 return 0; 644 return 0;
634 } 645 }
635 646
636 static int dnxhd_find_qscale(DNXHDEncContext *ctx) 647 static int dnxhd_find_qscale(DNXHDEncContext *ctx)