summaryrefslogtreecommitdiffstats
path: root/libmpcodecs
diff options
context:
space:
mode:
authorrguyom <rguyom@b3059339-0415-0410-9bf9-f77b7e298cf2>2002-11-14 21:46:36 +0000
committerrguyom <rguyom@b3059339-0415-0410-9bf9-f77b7e298cf2>2002-11-14 21:46:36 +0000
commit14604b4b4a3ca1ead2626150167e2c3abca8abb8 (patch)
tree202f3009967882b6d1e777036172594662476b7b /libmpcodecs
parenta91424802f3745f303865a847c04d2096a22e35d (diff)
downloadmpv-14604b4b4a3ca1ead2626150167e2c3abca8abb8.tar.bz2
mpv-14604b4b4a3ca1ead2626150167e2c3abca8abb8.tar.xz
- added modulated quatization
- fixed the default and range of kfthreshold, kfreduction and keyframe_boost - added a few comments git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@8193 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libmpcodecs')
-rw-r--r--libmpcodecs/ve_xvid.c32
1 files changed, 26 insertions, 6 deletions
diff --git a/libmpcodecs/ve_xvid.c b/libmpcodecs/ve_xvid.c
index d3dde28039..3de4eb61f7 100644
--- a/libmpcodecs/ve_xvid.c
+++ b/libmpcodecs/ve_xvid.c
@@ -63,10 +63,11 @@ static int xvidenc_max_quantizer = -1;
static int xvidenc_min_key_interval = 0;
static int xvidenc_max_key_interval = -1;
static int xvidenc_mpeg_quant = 0;
+static int xvidenc_mod_quant = 0;
static int xvidenc_lumi_mask = 0;
static int xvidenc_keyframe_boost = 0;
-static int xvidenc_kfthreshold = 0;
-static int xvidenc_kfreduction = 0;
+static int xvidenc_kfthreshold = -1;
+static int xvidenc_kfreduction = -1;
static int xvidenc_fixed_quant = 0;
static int xvidenc_debug = 0;
static int xvidenc_hintedme = 0;
@@ -85,10 +86,11 @@ struct config xvidencopts_conf[] = {
{ "min_key_interval", &xvidenc_min_key_interval, CONF_TYPE_INT, 0, 0, 0, NULL}, /* for XVID_MODE_2PASS_2 */
{ "max_key_interval", &xvidenc_max_key_interval, CONF_TYPE_INT, 0, 0, 0, NULL},
{ "mpeg_quant", &xvidenc_mpeg_quant, CONF_TYPE_FLAG, 0, 0, 1, NULL},
+ { "mod_quant", &xvidenc_mod_quant, CONF_TYPE_FLAG, 0, 0, 1, NULL},
{ "lumi_mask", &xvidenc_lumi_mask, CONF_TYPE_FLAG, 0, 0, 1, NULL},
- { "keyframe_boost", &xvidenc_keyframe_boost, CONF_TYPE_INT, 0, 0, 0, NULL}, /* for XVID_MODE_2PASS_2 */
+ { "keyframe_boost", &xvidenc_keyframe_boost, CONF_TYPE_INT, CONF_RANGE, 0, 10000, NULL}, /* for XVID_MODE_2PASS_2 */
{ "kfthreshold", &xvidenc_kfthreshold, CONF_TYPE_INT, 0, 0, 0, NULL}, /* for XVID_MODE_2PASS_2 */
- { "kfreduction", &xvidenc_kfreduction, CONF_TYPE_INT, 0, 0, 0, NULL}, /* for XVID_MODE_2PASS_2 */
+ { "kfreduction", &xvidenc_kfreduction, CONF_TYPE_INT, CONF_RANGE, 0, 100, NULL}, /* for XVID_MODE_2PASS_2 */
{ "fixed_quant", &xvidenc_fixed_quant, CONF_TYPE_INT, CONF_RANGE, 1, 31, NULL}, /* for XVID_MODE_FIXED_QUANT */
{ "debug", &xvidenc_debug, CONF_TYPE_FLAG, 0, 0, 1, NULL},
{ "hintedme", &xvidenc_hintedme, CONF_TYPE_FLAG, 0, 0, 1, NULL},
@@ -230,9 +232,9 @@ config(struct vf_instance_s* vf,
fp->vbr_state.max_iquant = fp->vbr_state.max_pquant = enc_param.max_quantizer;
if (xvidenc_keyframe_boost)
fp->vbr_state.keyframe_boost = xvidenc_keyframe_boost;
- if (xvidenc_kfthreshold)
+ if (xvidenc_kfthreshold >= 0)
fp->vbr_state.kftreshold = xvidenc_kfthreshold;
- if (xvidenc_kfreduction)
+ if (xvidenc_kfreduction >= 0)
fp->vbr_state.kfreduction = xvidenc_kfreduction;
if (xvidenc_min_key_interval)
fp->vbr_state.min_key_interval = xvidenc_min_key_interval;
@@ -284,8 +286,18 @@ put_image(struct vf_instance_s* vf, mp_image_t *mpi)
fp->enc_frame.bitstream = fp->mux->buffer;
fp->enc_frame.length = -1 /* fp->mux->buffer_size */;
fp->enc_frame.image = mpi->planes[0];
+
+ // get quantizers & I/P decision from the VBR engine
fp->enc_frame.quant = vbrGetQuant(&fp->vbr_state);
fp->enc_frame.intra = vbrGetIntra(&fp->vbr_state);
+
+ // modulated quantizer type
+ if (xvidenc_mod_quant && xvidenc_pass == 2) {
+ fp->enc_frame.general |= (fp->enc_frame.quant < 4) ? XVID_MPEGQUANT : XVID_H263QUANT;
+ fp->enc_frame.general &= (fp->enc_frame.quant < 4) ? ~XVID_H263QUANT : ~XVID_MPEGQUANT;
+ }
+
+ // hinted ME, 1st part
if (xvidenc_hintedme && xvidenc_pass == 1) {
fp->enc_frame.hint.hintstream = fp->hintstream;
fp->enc_frame.hint.rawhints = 0;
@@ -310,6 +322,8 @@ put_image(struct vf_instance_s* vf, mp_image_t *mpi)
else
perror("xvid: hint file read failure");
}
+
+ // encode frame
switch (xvid_encore(fp->enc_handle, XVID_ENC_ENCODE, &fp->enc_frame, &enc_stats)) {
case XVID_ERR_OK:
break;
@@ -323,9 +337,15 @@ put_image(struct vf_instance_s* vf, mp_image_t *mpi)
mp_msg(MSGT_MENCODER, MSGL_ERR, "xvid: failure\n");
break;
}
+
+ // write output
mencoder_write_chunk(fp->mux, fp->enc_frame.length, fp->enc_frame.intra ? 0x10 : 0);
+
+ // update the VBR engine
vbrUpdate(&fp->vbr_state, enc_stats.quant, fp->enc_frame.intra,
enc_stats.hlength, fp->enc_frame.length, enc_stats.kblks, enc_stats.mblks, enc_stats.ublks);
+
+ // hinted ME, 2nd part
if (fp->enc_frame.general & XVID_HINTEDME_GET) {
size_t wrote = fwrite(&fp->enc_frame.hint.hintlength, sizeof(fp->enc_frame.hint.hintlength), 1, fp->hintfile);
if (wrote == 1) {