octx->qmin = 1;
octx->qmax = FF_LAMBDA_MAX;
- octx->bit_rate = 2 * octx->width * octx->height;
- octx->rc_max_rate = 4 * octx->bit_rate;
+ if (t->t_props.tp_vbitrate == 0) {
+ 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 * 1.05;
+ }
+
octx->rc_buffer_size = 2 * octx->rc_max_rate;
break;
octx->codec_id = AV_CODEC_ID_VP8;
octx->pix_fmt = PIX_FMT_YUV420P;
- octx->qmin = 10;
- octx->qmax = 20;
-
av_dict_set(&opts, "quality", "realtime", 0);
- octx->bit_rate = 3 * octx->width * octx->height;
+ if (t->t_props.tp_vbitrate == 0) {
+ octx->qmin = 10;
+ octx->qmax = 20;
+ } else {
+ octx->bit_rate = t->t_props.tp_vbitrate * 1000;
+ octx->rc_max_rate = octx->bit_rate * 1.05;
+ }
+
octx->rc_buffer_size = 8 * 1024 * 224;
- octx->rc_max_rate = 2 * octx->bit_rate;
break;
case SCT_H264:
// Minimum quantizer. Doesn't need to be changed.
// Recommended default: -qmin 10
- octx->qmin = 10;
+ // octx->qmin = 10;
// Maximum quantizer. Doesn't need to be changed.
// Recommended default: -qmax 51
- octx->qmax = 30;
+ // octx->qmax = 30;
av_dict_set(&opts, "preset", "medium", 0);
av_dict_set(&opts, "profile", "baseline", 0);
+ av_dict_set(&opts, "tune", "zerolatency", 0);
+
+ if (t->t_props.tp_vbitrate == 0) {
+ octx->qmin = 10;
+ octx->qmax = 30;
+ } else {
+ octx->bit_rate = t->t_props.tp_vbitrate * 1000;
+ octx->rc_max_rate = octx->bit_rate * 1.05;
+ }
- octx->bit_rate = 2 * octx->width * octx->height;
octx->rc_buffer_size = 8 * 1024 * 224;
- octx->rc_max_rate = 2 * octx->rc_buffer_size;
break;
default:
strncpy(tp->tp_scodec, props->tp_scodec, sizeof(tp->tp_scodec)-1);
tp->tp_channels = props->tp_channels;
tp->tp_bandwidth = props->tp_bandwidth;
+ tp->tp_vbitrate = props->tp_vbitrate;
tp->tp_resolution = props->tp_resolution;
memcpy(tp->tp_language, props->tp_language, 4);
uint32_t pro_resolution;
uint32_t pro_channels;
uint32_t pro_bandwidth;
+ uint32_t pro_vbitrate;
char *pro_language;
char *pro_vcodec;
char *pro_acodec;
.def.s = "libx264",
.list = profile_class_vcodec_list,
},
+ {
+ .type = PT_U32,
+ .id = "vbitrate",
+ .name = "Video Bitrate (kb/s) (0=Auto)",
+ .off = offsetof(profile_transcode_t, pro_vbitrate),
+ .def.u32 = 0,
+ },
{
.type = PT_STR,
.id = "acodec",
return pro->pro_bandwidth >= 64 ? pro->pro_bandwidth : 64;
}
+static int
+profile_transcode_vbitrate(profile_transcode_t *pro)
+{
+ return pro->pro_vbitrate;
+}
+
static int
profile_transcode_can_share(profile_chain_t *prch,
profile_chain_t *joiner)
return 0;
if (profile_transcode_bandwidth(pro1) != profile_transcode_bandwidth(pro2))
return 0;
+ if (profile_transcode_vbitrate(pro1) != profile_transcode_vbitrate(pro2))
+ return 0;
if (strcmp(pro1->pro_language ?: "", pro2->pro_language ?: ""))
return 0;
return 1;
props.tp_resolution = profile_transcode_resolution(pro);
props.tp_channels = pro->pro_channels;
props.tp_bandwidth = profile_transcode_bandwidth(pro);
+ props.tp_vbitrate = profile_transcode_vbitrate(pro);
strncpy(props.tp_language, pro->pro_language ?: "", 3);
dst = prch->prch_gh = globalheaders_create(dst);
htsmsg_add_u32 (conf, "resolution", 384);
htsmsg_add_u32 (conf, "channels", 2);
htsmsg_add_str (conf, "vcodec", "libvpx");
+ htsmsg_add_str (conf, "vbitrate", 0);
htsmsg_add_str (conf, "acodec", "libvorbis");
htsmsg_add_bool(conf, "shield", 1);
(void)profile_create(NULL, conf, 1);
htsmsg_add_u32 (conf, "resolution", 384);
htsmsg_add_u32 (conf, "channels", 2);
htsmsg_add_str (conf, "vcodec", "libx264");
+ htsmsg_add_str (conf, "vbitrate", 0);
htsmsg_add_str (conf, "acodec", "aac");
htsmsg_add_bool(conf, "shield", 1);
(void)profile_create(NULL, conf, 1);
htsmsg_add_u32 (conf, "resolution", 384);
htsmsg_add_u32 (conf, "channels", 2);
htsmsg_add_str (conf, "vcodec", "libx264");
+ htsmsg_add_str (conf, "vbitrate", 0);
htsmsg_add_str (conf, "acodec", "aac");
htsmsg_add_bool(conf, "shield", 1);
(void)profile_create(NULL, conf, 1);