Showing the changes to libavcodec (5 of 5 files). Show all
Unified · Split
| @@ -101,7 +101,6 @@ typedef struct MpegEncContext { · 100 unmodified lines | ||
| 101 | 101 | int h263_flv; ///< use flv H.263 header |
| 102 | 102 | |
| 103 | 103 | enum AVCodecID codec_id; /* see AV_CODEC_ID_xxx */ |
| 104 | − int fixed_qscale; ///< fixed qscale if non zero | |
| 105 | 104 | int encoding; ///< true if we are encoding (vs decoding) |
| 106 | 105 | int max_b_frames; ///< max number of B-frames for encoding |
| 107 | 106 | int luma_elim_threshold; |
| @@ -478,10 +477,6 @@ typedef struct MpegEncContext { · 370 unmodified lines | ||
| 478 | 477 | me_cmp_func sse_cmp[2]; |
| 479 | 478 | int (*sum_abs_dctelem)(const int16_t *block); |
| 480 | 479 | |
| 481 | − float border_masking; | |
| 482 | − int lmin, lmax; | |
| 483 | − int vbv_ignore_qmax; | |
| 484 | − | |
| 485 | 480 | /// Bitfield containing information which frames to reconstruct. |
| 486 | 481 | int frame_reconstruction_bitfield; |
| 487 | 482 | |
| @@ -493,7 +488,6 @@ typedef struct MpegEncContext { · 5 unmodified lines | ||
| 493 | 488 | |
| 494 | 489 | int error_rate; |
| 495 | 490 | |
| 496 | − int scenechange_threshold; | |
| 497 | 491 | int noise_reduction; |
| 498 | 492 | |
| 499 | 493 | int intra_penalty; |
| @@ -195,8 +195,10 @@ void ff_convert_matrix(MpegEncContext *s, int (*qmat)[64], · 194 unmodified lines | ||
| 195 | 195 | } |
| 196 | 196 | } |
| 197 | 197 | |
| 198 | −static inline void update_qscale(MpegEncContext *s) | |
| 198 | +static inline void update_qscale(MPVMainEncContext *const m) | |
| 199 | 199 | { |
| 200 | + MpegEncContext *const s = &m->s; | |
| 201 | + | |
| 200 | 202 | if (s->q_scale_type == 1 && 0) { |
| 201 | 203 | int i; |
| 202 | 204 | int bestdiff=INT_MAX; |
| @@ -205,7 +207,7 @@ static inline void update_qscale(MpegEncContext *s) · 2 unmodified lines | ||
| 205 | 207 | for (i = 0 ; i<FF_ARRAY_ELEMS(ff_mpeg2_non_linear_qscale); i++) { |
| 206 | 208 | int diff = FFABS((ff_mpeg2_non_linear_qscale[i]<<(FF_LAMBDA_SHIFT + 6)) - (int)s->lambda * 139); |
| 207 | 209 | if (ff_mpeg2_non_linear_qscale[i] < s->avctx->qmin || |
| 208 | − (ff_mpeg2_non_linear_qscale[i] > s->avctx->qmax && !s->vbv_ignore_qmax)) | |
| 210 | + (ff_mpeg2_non_linear_qscale[i] > s->avctx->qmax && !m->vbv_ignore_qmax)) | |
| 209 | 211 | continue; |
| 210 | 212 | if (diff < bestdiff) { |
| 211 | 213 | bestdiff = diff; |
| @@ -216,7 +218,7 @@ static inline void update_qscale(MpegEncContext *s) · 4 unmodified lines | ||
| 216 | 218 | } else { |
| 217 | 219 | s->qscale = (s->lambda * 139 + FF_LAMBDA_SCALE * 64) >> |
| 218 | 220 | (FF_LAMBDA_SHIFT + 7); |
| 219 | − s->qscale = av_clip(s->qscale, s->avctx->qmin, s->vbv_ignore_qmax ? 31 : s->avctx->qmax); | |
| 221 | + s->qscale = av_clip(s->qscale, s->avctx->qmin, m->vbv_ignore_qmax ? 31 : s->avctx->qmax); | |
| 220 | 222 | } |
| 221 | 223 | |
| 222 | 224 | s->lambda2 = (s->lambda * s->lambda + FF_LAMBDA_SCALE / 2) >> |
| @@ -507,16 +509,16 @@ av_cold int ff_mpv_encode_init(AVCodecContext *avctx) · 284 unmodified lines | ||
| 507 | 509 | } |
| 508 | 510 | |
| 509 | 511 | /* Fixed QSCALE */ |
| 510 | − s->fixed_qscale = !!(avctx->flags & AV_CODEC_FLAG_QSCALE); | |
| 512 | + m->fixed_qscale = !!(avctx->flags & AV_CODEC_FLAG_QSCALE); | |
| 511 | 513 | |
| 512 | 514 | s->adaptive_quant = (avctx->lumi_masking || |
| 513 | 515 | avctx->dark_masking || |
| 514 | 516 | avctx->temporal_cplx_masking || |
| 515 | 517 | avctx->spatial_cplx_masking || |
| 516 | 518 | avctx->p_masking || |
| 517 | − s->border_masking || | |
| 519 | + m->border_masking || | |
| 518 | 520 | (s->mpv_flags & FF_MPV_FLAG_QP_RD)) && |
| 519 | − !s->fixed_qscale; | |
| 521 | + !m->fixed_qscale; | |
| 520 | 522 | |
| 521 | 523 | s->loop_filter = !!(avctx->flags & AV_CODEC_FLAG_LOOP_FILTER); |
| 522 | 524 | |
| @@ -580,7 +582,7 @@ av_cold int ff_mpv_encode_init(AVCodecContext *avctx) · 57 unmodified lines | ||
| 580 | 582 | return AVERROR(EINVAL); |
| 581 | 583 | } |
| 582 | 584 | |
| 583 | − if (!s->fixed_qscale && | |
| 585 | + if (!m->fixed_qscale && | |
| 584 | 586 | avctx->bit_rate * av_q2d(avctx->time_base) > |
| 585 | 587 | avctx->bit_rate_tolerance) { |
| 586 | 588 | double nbt = avctx->bit_rate * av_q2d(avctx->time_base) * 5; |
| @@ -675,7 +677,7 @@ av_cold int ff_mpv_encode_init(AVCodecContext *avctx) · 88 unmodified lines | ||
| 675 | 677 | return AVERROR(EINVAL); |
| 676 | 678 | } |
| 677 | 679 | |
| 678 | − if (s->scenechange_threshold < 1000000000 && | |
| 680 | + if (m->scenechange_threshold < 1000000000 && | |
| 679 | 681 | (avctx->flags & AV_CODEC_FLAG_CLOSED_GOP)) { |
| 680 | 682 | av_log(avctx, AV_LOG_ERROR, |
| 681 | 683 | "closed gop with scene change detection are not supported yet, " |
| @@ -890,9 +892,9 @@ av_cold int ff_mpv_encode_init(AVCodecContext *avctx) · 208 unmodified lines | ||
| 890 | 892 | s->frame_reconstruction_bitfield = 0; |
| 891 | 893 | } |
| 892 | 894 | |
| 893 | − if (s->lmin > s->lmax) { | |
| 894 | − av_log(avctx, AV_LOG_WARNING, "Clipping lmin value to %d\n", s->lmax); | |
| 895 | − s->lmin = s->lmax; | |
| 895 | + if (m->lmin > m->lmax) { | |
| 896 | + av_log(avctx, AV_LOG_WARNING, "Clipping lmin value to %d\n", m->lmax); | |
| 897 | + m->lmin = m->lmax; | |
| 896 | 898 | } |
| 897 | 899 | |
| 898 | 900 | /* init */ |
| @@ -1876,7 +1878,7 @@ int ff_mpv_encode_picture(AVCodecContext *avctx, AVPacket *pkt, · 977 unmodified lines | ||
| 1876 | 1878 | |
| 1877 | 1879 | ff_mpv_unref_picture(&s->cur_pic); |
| 1878 | 1880 | |
| 1879 | − s->vbv_ignore_qmax = 0; | |
| 1881 | + m->vbv_ignore_qmax = 0; | |
| 1880 | 1882 | |
| 1881 | 1883 | m->picture_in_gop_number++; |
| 1882 | 1884 | |
| @@ -1935,7 +1937,7 @@ vbv_retry: · 52 unmodified lines | ||
| 1935 | 1937 | int min_step = hq ? 1 : (1<<(FF_LAMBDA_SHIFT + 7))/139; |
| 1936 | 1938 | |
| 1937 | 1939 | if (put_bits_count(&s->pb) > max_size && |
| 1938 | − s->lambda < s->lmax) { | |
| 1940 | + s->lambda < m->lmax) { | |
| 1939 | 1941 | m->next_lambda = FFMAX(s->lambda + min_step, s->lambda * |
| 1940 | 1942 | (s->qscale + 1) / s->qscale); |
| 1941 | 1943 | if (s->adaptive_quant) { |
| @@ -1955,7 +1957,7 @@ vbv_retry: · 13 unmodified lines | ||
| 1955 | 1957 | s->time_base = s->last_time_base; |
| 1956 | 1958 | s->last_non_b_time = s->time - s->pp_time; |
| 1957 | 1959 | } |
| 1958 | − s->vbv_ignore_qmax = 1; | |
| 1960 | + m->vbv_ignore_qmax = 1; | |
| 1959 | 1961 | av_log(avctx, AV_LOG_VERBOSE, "reencoding frame due to VBV\n"); |
| 1960 | 1962 | goto vbv_retry; |
| 1961 | 1963 | } |
| @@ -3616,7 +3618,7 @@ static int estimate_qp(MPVMainEncContext *const m, int dry_run) · 1654 unmodified lines | ||
| 3616 | 3618 | if (m->next_lambda){ |
| 3617 | 3619 | s->cur_pic.ptr->f->quality = m->next_lambda; |
| 3618 | 3620 | if(!dry_run) m->next_lambda= 0; |
| 3619 | − } else if (!s->fixed_qscale) { | |
| 3621 | + } else if (!m->fixed_qscale) { | |
| 3620 | 3622 | int quality = ff_rate_estimate_qscale(m, dry_run); |
| 3621 | 3623 | s->cur_pic.ptr->f->quality = quality; |
| 3622 | 3624 | if (s->cur_pic.ptr->f->quality < 0) |
| @@ -3643,7 +3645,7 @@ static int estimate_qp(MPVMainEncContext *const m, int dry_run) · 20 unmodified lines | ||
| 3643 | 3645 | //FIXME broken |
| 3644 | 3646 | }else |
| 3645 | 3647 | s->lambda = s->cur_pic.ptr->f->quality; |
| 3646 | − update_qscale(s); | |
| 3648 | + update_qscale(m); | |
| 3647 | 3649 | return 0; |
| 3648 | 3650 | } |
| 3649 | 3651 | |
| @@ -3700,7 +3702,7 @@ static int encode_picture(MPVMainEncContext *const m, const AVPacket *pkt) · 50 unmodified lines | ||
| 3700 | 3702 | s->lambda= s->last_lambda_for[s->pict_type]; |
| 3701 | 3703 | else |
| 3702 | 3704 | s->lambda= s->last_lambda_for[s->last_non_b_pict_type]; |
| 3703 | − update_qscale(s); | |
| 3705 | + update_qscale(m); | |
| 3704 | 3706 | } |
| 3705 | 3707 | |
| 3706 | 3708 | ff_me_init_pic(s); |
| @@ -3742,7 +3744,7 @@ static int encode_picture(MPVMainEncContext *const m, const AVPacket *pkt) · 35 unmodified lines | ||
| 3742 | 3744 | for(i=0; i<s->mb_stride*s->mb_height; i++) |
| 3743 | 3745 | s->mb_type[i]= CANDIDATE_MB_TYPE_INTRA; |
| 3744 | 3746 | |
| 3745 | − if(!s->fixed_qscale){ | |
| 3747 | + if (!m->fixed_qscale) { | |
| 3746 | 3748 | /* finding spatial complexity for I-frame rate control */ |
| 3747 | 3749 | s->avctx->execute(s->avctx, mb_var_thread, &s->thread_context[0], NULL, context_count, sizeof(void*)); |
| 3748 | 3750 | } |
| @@ -3754,7 +3756,7 @@ static int encode_picture(MPVMainEncContext *const m, const AVPacket *pkt) · 5 unmodified lines | ||
| 3754 | 3756 | s->mb_var_sum = s->me. mb_var_sum_temp; |
| 3755 | 3757 | emms_c(); |
| 3756 | 3758 | |
| 3757 | − if (s->me.scene_change_score > s->scenechange_threshold && | |
| 3759 | + if (s->me.scene_change_score > m->scenechange_threshold && | |
| 3758 | 3760 | s->pict_type == AV_PICTURE_TYPE_P) { |
| 3759 | 3761 | s->pict_type= AV_PICTURE_TYPE_I; |
| 3760 | 3762 | for(i=0; i<s->mb_stride*s->mb_height; i++) |
| @@ -61,6 +61,12 @@ typedef struct MPVMainEncContext { · 60 unmodified lines | ||
| 61 | 61 | int b_sensitivity; |
| 62 | 62 | int brd_scale; |
| 63 | 63 | |
| 64 | + int scenechange_threshold; | |
| 65 | + | |
| 66 | + float border_masking; | |
| 67 | + int lmin, lmax; | |
| 68 | + int vbv_ignore_qmax; | |
| 69 | + | |
| 64 | 70 | /* frame skip options */ |
| 65 | 71 | int frame_skip_threshold; |
| 66 | 72 | int frame_skip_factor; |
| @@ -73,6 +79,7 @@ typedef struct MPVMainEncContext { · 6 unmodified lines | ||
| 73 | 79 | int frame_bits; ///< bits used for the current frame |
| 74 | 80 | int stuffing_bits; ///< bits used for stuffing |
| 75 | 81 | int next_lambda; ///< next lambda used for retrying to encode a frame |
| 82 | + int fixed_qscale; ///< fixed qscale if non zero | |
| 76 | 83 | RateControlContext rc_context; ///< contains stuff only accessed in ratecontrol.c |
| 77 | 84 | } MPVMainEncContext; |
| 78 | 85 | |
| @@ -154,14 +161,14 @@ FF_MPV_OPT_CMP_FUNC, \ · 75 unmodified lines | ||
| 154 | 161 | FF_RC_OFFSET(rc_eq), AV_OPT_TYPE_STRING, .flags = FF_MPV_OPT_FLAGS }, \ |
| 155 | 162 | {"rc_init_cplx", "initial complexity for 1-pass encoding", FF_RC_OFFSET(initial_cplx), AV_OPT_TYPE_FLOAT, {.dbl = 0 }, -FLT_MAX, FLT_MAX, FF_MPV_OPT_FLAGS}, \ |
| 156 | 163 | {"rc_buf_aggressivity", "currently useless", FF_RC_OFFSET(buffer_aggressivity), AV_OPT_TYPE_FLOAT, {.dbl = 1.0 }, -FLT_MAX, FLT_MAX, FF_MPV_OPT_FLAGS}, \ |
| 157 | −{"border_mask", "increase the quantizer for macroblocks close to borders", FF_MPV_OFFSET(border_masking), AV_OPT_TYPE_FLOAT, {.dbl = 0 }, -FLT_MAX, FLT_MAX, FF_MPV_OPT_FLAGS}, \ | |
| 158 | −{"lmin", "minimum Lagrange factor (VBR)", FF_MPV_OFFSET(lmin), AV_OPT_TYPE_INT, {.i64 = 2*FF_QP2LAMBDA }, 0, INT_MAX, FF_MPV_OPT_FLAGS }, \ | |
| 159 | −{"lmax", "maximum Lagrange factor (VBR)", FF_MPV_OFFSET(lmax), AV_OPT_TYPE_INT, {.i64 = 31*FF_QP2LAMBDA }, 0, INT_MAX, FF_MPV_OPT_FLAGS }, \ | |
| 164 | +{"border_mask", "increase the quantizer for macroblocks close to borders", FF_MPV_MAIN_OFFSET(border_masking), AV_OPT_TYPE_FLOAT, {.dbl = 0 }, -FLT_MAX, FLT_MAX, FF_MPV_OPT_FLAGS}, \ | |
| 165 | +{"lmin", "minimum Lagrange factor (VBR)", FF_MPV_MAIN_OFFSET(lmin), AV_OPT_TYPE_INT, {.i64 = 2*FF_QP2LAMBDA }, 0, INT_MAX, FF_MPV_OPT_FLAGS }, \ | |
| 166 | +{"lmax", "maximum Lagrange factor (VBR)", FF_MPV_MAIN_OFFSET(lmax), AV_OPT_TYPE_INT, {.i64 = 31*FF_QP2LAMBDA }, 0, INT_MAX, FF_MPV_OPT_FLAGS }, \ | |
| 160 | 167 | {"skip_threshold", "Frame skip threshold", FF_MPV_MAIN_OFFSET(frame_skip_threshold), AV_OPT_TYPE_INT, {.i64 = 0 }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS }, \ |
| 161 | 168 | {"skip_factor", "Frame skip factor", FF_MPV_MAIN_OFFSET(frame_skip_factor), AV_OPT_TYPE_INT, {.i64 = 0 }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS }, \ |
| 162 | 169 | {"skip_exp", "Frame skip exponent", FF_MPV_MAIN_OFFSET(frame_skip_exp), AV_OPT_TYPE_INT, {.i64 = 0 }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS }, \ |
| 163 | 170 | {"skip_cmp", "Frame skip compare function", FF_MPV_MAIN_OFFSET(frame_skip_cmp), AV_OPT_TYPE_INT, {.i64 = FF_CMP_DCTMAX }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS, .unit = "cmp_func" }, \ |
| 164 | −{"sc_threshold", "Scene change threshold", FF_MPV_OFFSET(scenechange_threshold), AV_OPT_TYPE_INT, {.i64 = 0 }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS }, \ | |
| 171 | +{"sc_threshold", "Scene change threshold", FF_MPV_MAIN_OFFSET(scenechange_threshold), AV_OPT_TYPE_INT, {.i64 = 0 }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS }, \ | |
| 165 | 172 | {"noise_reduction", "Noise reduction", FF_MPV_OFFSET(noise_reduction), AV_OPT_TYPE_INT, {.i64 = 0 }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS }, \ |
| 166 | 173 | {"ps", "RTP payload size in bytes", FF_MPV_OFFSET(rtp_payload_size), AV_OPT_TYPE_INT, {.i64 = 0 }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS }, \ |
| 167 | 174 | |
| @@ -142,10 +142,11 @@ static double get_diff_limited_q(MPVMainEncContext *m, const RateControlEntry *r · 141 unmodified lines | ||
| 142 | 142 | /** |
| 143 | 143 | * Get the qmin & qmax for pict_type. |
| 144 | 144 | */ |
| 145 | −static void get_qminmax(int *qmin_ret, int *qmax_ret, MpegEncContext *s, int pict_type) | |
| 145 | +static void get_qminmax(int *qmin_ret, int *qmax_ret, MPVMainEncContext *const m, int pict_type) | |
| 146 | 146 | { |
| 147 | − int qmin = s->lmin; | |
| 148 | − int qmax = s->lmax; | |
| 147 | + MpegEncContext *const s = &m->s; | |
| 148 | + int qmin = m->lmin; | |
| 149 | + int qmax = m->lmax; | |
| 149 | 150 | |
| 150 | 151 | av_assert0(qmin <= qmax); |
| 151 | 152 | |
| @@ -182,7 +183,7 @@ static double modify_qscale(MPVMainEncContext *const m, const RateControlEntry * · 30 unmodified lines | ||
| 182 | 183 | const int pict_type = rce->new_pict_type; |
| 183 | 184 | int qmin, qmax; |
| 184 | 185 | |
| 185 | − get_qminmax(&qmin, &qmax, s, pict_type); | |
| 186 | + get_qminmax(&qmin, &qmax, m, pict_type); | |
| 186 | 187 | |
| 187 | 188 | /* modulation */ |
| 188 | 189 | if (rcc->qmod_freq && |
| @@ -784,15 +785,16 @@ static void update_predictor(Predictor *p, double q, double var, double size) · 595 unmodified lines | ||
| 784 | 785 | } |
| 785 | 786 | |
| 786 | 787 | static void adaptive_quantization(RateControlContext *const rcc, |
| 787 | − MpegEncContext *const s, double q) | |
| 788 | + MPVMainEncContext *const m, double q) | |
| 788 | 789 | { |
| 790 | + MpegEncContext *const s = &m->s; | |
| 789 | 791 | int i; |
| 790 | 792 | const float lumi_masking = s->avctx->lumi_masking / (128.0 * 128.0); |
| 791 | 793 | const float dark_masking = s->avctx->dark_masking / (128.0 * 128.0); |
| 792 | 794 | const float temp_cplx_masking = s->avctx->temporal_cplx_masking; |
| 793 | 795 | const float spatial_cplx_masking = s->avctx->spatial_cplx_masking; |
| 794 | 796 | const float p_masking = s->avctx->p_masking; |
| 795 | − const float border_masking = s->border_masking; | |
| 797 | + const float border_masking = m->border_masking; | |
| 796 | 798 | float bits_sum = 0.0; |
| 797 | 799 | float cplx_sum = 0.0; |
| 798 | 800 | float *cplx_tab = rcc->cplx_tab; |
| @@ -932,7 +934,7 @@ float ff_rate_estimate_qscale(MPVMainEncContext *const m, int dry_run) · 133 unmodified lines | ||
| 932 | 934 | const int pict_type = s->pict_type; |
| 933 | 935 | emms_c(); |
| 934 | 936 | |
| 935 | − get_qminmax(&qmin, &qmax, s, pict_type); | |
| 937 | + get_qminmax(&qmin, &qmax, m, pict_type); | |
| 936 | 938 | |
| 937 | 939 | fps = get_fps(s->avctx); |
| 938 | 940 | /* update predictors */ |
| @@ -1068,7 +1070,7 @@ float ff_rate_estimate_qscale(MPVMainEncContext *const m, int dry_run) · 129 unmodified lines | ||
| 1068 | 1070 | q = qmax; |
| 1069 | 1071 | |
| 1070 | 1072 | if (s->adaptive_quant) |
| 1071 | − adaptive_quantization(rcc, s, q); | |
| 1073 | + adaptive_quantization(rcc, m, q); | |
| 1072 | 1074 | else |
| 1073 | 1075 | q = (int)(q + 0.5); |
| 1074 | 1076 | |
| @@ -228,8 +228,8 @@ static av_cold int encode_init(AVCodecContext *avctx) · 227 unmodified lines | ||
| 228 | 228 | |
| 229 | 229 | mpv->avctx = avctx; |
| 230 | 230 | mpv->bit_rate= avctx->bit_rate; |
| 231 | − mpv->lmin = avctx->mb_lmin; | |
| 232 | − mpv->lmax = avctx->mb_lmax; | |
| 231 | + enc->m.lmin = avctx->mb_lmin; | |
| 232 | + enc->m.lmax = avctx->mb_lmax; | |
| 233 | 233 | mpv->mb_num = (avctx->width * avctx->height + 255) / 256; // For ratecontrol |
| 234 | 234 | |
| 235 | 235 | mpv->me.temp = |