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