ratecontrol.h
上传用户:shlianrong
上传日期:2022-07-08
资源大小:309k
文件大小:3k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*
  2.  * Ratecontrol
  3.  * Copyright (c) 2000, 2001, 2002 Fabrice Bellard.
  4.  * Copyright (c) 2002-2004 Michael Niedermayer
  5.  *
  6.  * This file is part of FFmpeg.
  7.  *
  8.  * FFmpeg is free software; you can redistribute it and/or
  9.  * modify it under the terms of the GNU Lesser General Public
  10.  * License as published by the Free Software Foundation; either
  11.  * version 2.1 of the License, or (at your option) any later version.
  12.  *
  13.  * FFmpeg is distributed in the hope that it will be useful,
  14.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  16.  * Lesser General Public License for more details.
  17.  *
  18.  * You should have received a copy of the GNU Lesser General Public
  19.  * License along with FFmpeg; if not, write to the Free Software
  20.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  21.  */
  22. #ifndef AVCODEC_RATECONTROL_H
  23. #define AVCODEC_RATECONTROL_H
  24. /**
  25.  * @file ratecontrol.h
  26.  * ratecontrol header.
  27.  */
  28. #include <stdio.h>
  29. //#include <stdint.h>
  30. #include "eval.h"
  31. typedef struct Predictor{
  32.     double coeff;
  33.     double count;
  34.     double decay;
  35. } Predictor;
  36. typedef struct RateControlEntry{
  37.     int pict_type;
  38.     float qscale;
  39.     int mv_bits;
  40.     int i_tex_bits;
  41.     int p_tex_bits;
  42.     int misc_bits;
  43.     int header_bits;
  44.     uint64_t expected_bits;
  45.     int new_pict_type;
  46.     float new_qscale;
  47.     int mc_mb_var_sum;
  48.     int mb_var_sum;
  49.     int i_count;
  50.     int skip_count;
  51.     int f_code;
  52.     int b_code;
  53. }RateControlEntry;
  54. /**
  55.  * rate control context.
  56.  */
  57. typedef struct RateControlContext{
  58.     FILE *stats_file;
  59.     int num_entries;              ///< number of RateControlEntries
  60.     RateControlEntry *entry;
  61.     double buffer_index;          ///< amount of bits in the video/audio buffer
  62.     Predictor pred[5];
  63.     double short_term_qsum;       ///< sum of recent qscales
  64.     double short_term_qcount;     ///< count of recent qscales
  65.     double pass1_rc_eq_output_sum;///< sum of the output of the rc equation, this is used for normalization
  66.     double pass1_wanted_bits;     ///< bits which should have been outputed by the pass1 code (including complexity init)
  67.     double last_qscale;
  68.     double last_qscale_for[5];    ///< last qscale for a specific pict type, used for max_diff & ipb factor stuff
  69.     int last_mc_mb_var_sum;
  70.     int last_mb_var_sum;
  71.     uint64_t i_cplx_sum[5];
  72.     uint64_t p_cplx_sum[5];
  73.     uint64_t mv_bits_sum[5];
  74.     uint64_t qscale_sum[5];
  75.     int frame_count[5];
  76.     int last_non_b_pict_type;
  77.     void *non_lavc_opaque;        ///< context for non lavc rc code (for example xvid)
  78.     float dry_run_qscale;         ///< for xvid rc
  79.     int last_picture_number;      ///< for xvid rc
  80.     AVEvalExpr * rc_eq_eval;
  81. }RateControlContext;
  82. struct MpegEncContext;
  83. /* rate control */
  84. int ff_rate_control_init(struct MpegEncContext *s);
  85. float ff_rate_estimate_qscale(struct MpegEncContext *s, int dry_run);
  86. void ff_write_pass1_stats(struct MpegEncContext *s);
  87. void ff_rate_control_uninit(struct MpegEncContext *s);
  88. int ff_vbv_update(struct MpegEncContext *s, int frame_size);
  89. void ff_get_2pass_fcode(struct MpegEncContext *s);
  90. int ff_xvid_rate_control_init(struct MpegEncContext *s);
  91. void ff_xvid_rate_control_uninit(struct MpegEncContext *s);
  92. float ff_xvid_rate_estimate_qscale(struct MpegEncContext *s, int dry_run);
  93. #endif /* AVCODEC_RATECONTROL_H */