Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
transcoding: Fix mpeg2 video bitrate limiter/quantizer. Tweaking of m…
…isc default settings
  • Loading branch information
tajson authored and perexg committed Jan 13, 2015
1 parent 7b01d9c commit baec61b
Showing 1 changed file with 41 additions and 27 deletions.
68 changes: 41 additions & 27 deletions src/plumbing/transcoding.c 100644 → 100755
Expand Up @@ -590,10 +590,10 @@ transcoder_stream_audio(transcoder_t *t, transcoder_stream_t *ts, th_pkt_t *pkt)
// Convert audio
tvhtrace("transcode", "%04X: converting audio", shortid(t));

tvhinfo("transcode", "%04X: IN : channels=%d, layout=%" PRIi64 ", rate=%d, fmt=%d, bitrate=%d",
tvhtrace("transcode", "%04X: IN : channels=%d, layout=%" PRIi64 ", rate=%d, fmt=%d, bitrate=%d",
shortid(t), ictx->channels, ictx->channel_layout, ictx->sample_rate,
ictx->sample_fmt, ictx->bit_rate);
tvhinfo("transcode", "%04X: OUT: channels=%d, layout=%" PRIi64 ", rate=%d, fmt=%d, bitrate=%d",
tvhtrace("transcode", "%04X: OUT: channels=%d, layout=%" PRIi64 ", rate=%d, fmt=%d, bitrate=%d",
shortid(t), octx->channels, octx->channel_layout, octx->sample_rate,
octx->sample_fmt, octx->bit_rate);

Expand Down Expand Up @@ -1037,41 +1037,58 @@ transcoder_stream_video(transcoder_t *t, transcoder_stream_t *ts, th_pkt_t *pkt)
octx->pix_fmt = PIX_FMT_YUV420P;
octx->flags |= CODEC_FLAG_GLOBAL_HEADER;

// Default settings for quantizer. Best quality unless changed by the streaming profile.
octx->qmin = 1;
octx->qmax = FF_LAMBDA_MAX;

if (t->t_props.tp_vbitrate == 0) {
if (t->t_props.tp_vbitrate == 0) { // "Auto"
octx->bit_rate = 2 * octx->width * octx->height;
octx->rc_max_rate = 4 * octx->bit_rate;
}

} else {
octx->bit_rate = t->t_props.tp_vbitrate * 1000;
octx->rc_max_rate = octx->bit_rate;
if (t->t_props.tp_vbitrate >0 && t->t_props.tp_vbitrate <64) { // CRF
octx->qmin = t->t_props.tp_vbitrate;
}

if (t->t_props.tp_vbitrate >=64) { // CBR
octx->rc_max_rate = t->t_props.tp_vbitrate * 1000;
octx->bit_rate = ceil(octx->rc_max_rate / 1.15);
}

octx->rc_buffer_size = 2 * octx->rc_max_rate;
if (octx->rc_max_rate > 0)
octx->rc_buffer_size = 2 * octx->rc_max_rate;

break;

case SCT_VP8:
octx->codec_id = AV_CODEC_ID_VP8;
octx->pix_fmt = PIX_FMT_YUV420P;

av_dict_set(&opts, "quality", "good", 0);
av_dict_set(&opts, "quality", "realtime", 0);

octx->qcompress = 0.6;

if (t->t_props.tp_vbitrate == 0) {
octx->qmin = 10;
octx->qmax = 20;
octx->rc_max_rate = 6 * octx->width * octx->height;
}

// Stream profile vbitrate 1-63 is used for user specified qmin quantizer (CRF mode).
if (t->t_props.tp_vbitrate >0 && t->t_props.tp_vbitrate <64) {
octx->qmin = t->t_props.tp_vbitrate; // qmax = 63 as default.
} else { // CBR mode.
octx->bit_rate = t->t_props.tp_vbitrate * 1000;
octx->rc_max_rate = octx->bit_rate;
octx->qmin = t->t_props.tp_vbitrate;
octx->qmax = octx->qmin + 30 <= 63 ? octx->qmin + 30 : 63;
octx->rc_max_rate = 16 * octx->width * octx->height;
}

if (t->t_props.tp_vbitrate >=64) { // CBR mode.
octx->rc_max_rate = t->t_props.tp_vbitrate * 1000;
octx->bit_rate = ceil(octx->rc_max_rate / 1.15);
}

octx->rc_buffer_size = 8 * 1024 * 224;
if (octx->rc_max_rate > 0)
octx->rc_buffer_size = 8 * 1024 * 224;

break;

case SCT_H264:
Expand All @@ -1088,15 +1105,8 @@ transcoder_stream_video(transcoder_t *t, transcoder_stream_t *ts, th_pkt_t *pkt)
// Recommended default: -qcomp 0.60
octx->qcompress = 0.6;

// Minimum quantizer. Doesn't need to be changed.
// Recommended default: -qmin 10
// octx->qmin = 10;

// Maximum quantizer. Doesn't need to be changed.
// Recommended default: -qmax 51
// octx->qmax = 30;

av_dict_set(&opts, "preset", "veryfast", 0);
// Default = "medium". We gain more encoding speed compared to the loss of quality when lowering it _slightly_.
av_dict_set(&opts, "preset", "faster", 0);
// Use main profile instead of the standard "baseline", we are aiming for better quality.
// Older devices (iPhone <4, Android <4) only supports baseline. Chromecast only supports >=4.1...
av_dict_set(&opts, "profile", "main", 0); // L3.0
Expand All @@ -1116,12 +1126,16 @@ transcoder_stream_video(transcoder_t *t, transcoder_stream_t *ts, th_pkt_t *pkt)
// Stream profile vbitrate 1-63 is used for user specified qmin quantizer (CRF mode).
if (t->t_props.tp_vbitrate >0 && t->t_props.tp_vbitrate <64) {
octx->qmin = t->t_props.tp_vbitrate; // qmax = 51 in all default profiles, let's stick with it for now.
} else { // Bitrate limited encoding (CBR mode).
octx->bit_rate = t->t_props.tp_vbitrate * 1000;
octx->rc_max_rate = octx->bit_rate;
}

octx->rc_buffer_size = 8 * 1024 * 224;
if (t->t_props.tp_vbitrate >=64) { // Bitrate limited encoding (CBR mode).
octx->rc_max_rate = t->t_props.tp_vbitrate * 1000;
octx->bit_rate = ceil(octx->rc_max_rate / 1.15);
}

if (octx->rc_max_rate > 0)
octx->rc_buffer_size = 8 * 1024 * 224;

break;

default:
Expand Down

0 comments on commit baec61b

Please sign in to comment.