Mercurial > libavcodec.hg
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) |