comparison dnxhdenc.c @ 5969:c5d11f6f6a3d libavcodec

fix corner case when qscale 1 bits < frame bits but max bits with worst padding > frame bits
author bcoudurier
date Sun, 02 Dec 2007 19:20:46 +0000
parents d112d5c13ae8
children e1ac22f75cf6
comparison
equal deleted inserted replaced
5968:3f452f275542 5969:c5d11f6f6a3d
669 } 669 }
670 //dprintf(ctx->m.avctx, "%d, qscale %d, bits %d, frame %d, higher %d, lower %d\n", 670 //dprintf(ctx->m.avctx, "%d, qscale %d, bits %d, frame %d, higher %d, lower %d\n",
671 // ctx->m.avctx->frame_number, qscale, bits, ctx->frame_bits, last_higher, last_lower); 671 // ctx->m.avctx->frame_number, qscale, bits, ctx->frame_bits, last_higher, last_lower);
672 if (bits < ctx->frame_bits) { 672 if (bits < ctx->frame_bits) {
673 if (qscale == 1) 673 if (qscale == 1)
674 break; 674 return 1;
675 if (last_higher == qscale - 1) { 675 if (last_higher == qscale - 1) {
676 qscale = last_higher; 676 qscale = last_higher;
677 break; 677 break;
678 } 678 }
679 last_lower = FFMIN(qscale, last_lower); 679 last_lower = FFMIN(qscale, last_lower);
708 } 708 }
709 709
710 static int dnxhd_encode_variance(AVCodecContext *avctx, DNXHDEncContext *ctx) 710 static int dnxhd_encode_variance(AVCodecContext *avctx, DNXHDEncContext *ctx)
711 { 711 {
712 int max_bits = 0; 712 int max_bits = 0;
713 int x, y; 713 int ret, x, y;
714 if (dnxhd_find_qscale(ctx) < 0) 714 if ((ret = dnxhd_find_qscale(ctx)) < 0)
715 return -1; 715 return -1;
716 for (y = 0; y < ctx->m.mb_height; y++) { 716 for (y = 0; y < ctx->m.mb_height; y++) {
717 for (x = 0; x < ctx->m.mb_width; x++) { 717 for (x = 0; x < ctx->m.mb_width; x++) {
718 int mb = y*ctx->m.mb_width+x; 718 int mb = y*ctx->m.mb_width+x;
719 int delta_bits; 719 int delta_bits;
728 : INT_MIN; //avoid increasing qscale 728 : INT_MIN; //avoid increasing qscale
729 } 729 }
730 } 730 }
731 max_bits += 31; //worst padding 731 max_bits += 31; //worst padding
732 } 732 }
733 if (max_bits > ctx->frame_bits) { 733 if (!ret) {
734 if (RC_VARIANCE) 734 if (RC_VARIANCE)
735 avctx->execute(avctx, dnxhd_mb_var_thread, (void**)&ctx->thread[0], NULL, avctx->thread_count); 735 avctx->execute(avctx, dnxhd_mb_var_thread, (void**)&ctx->thread[0], NULL, avctx->thread_count);
736 qsort(ctx->mb_cmp, ctx->m.mb_num, sizeof(RCEntry), dnxhd_rc_cmp); 736 qsort(ctx->mb_cmp, ctx->m.mb_num, sizeof(RCEntry), dnxhd_rc_cmp);
737 for (x = 0; x < ctx->m.mb_num && max_bits > ctx->frame_bits; x++) { 737 for (x = 0; x < ctx->m.mb_num && max_bits > ctx->frame_bits; x++) {
738 int mb = ctx->mb_cmp[x].mb; 738 int mb = ctx->mb_cmp[x].mb;