Skip to content

Commit

Permalink
fix docker cmd, add presets to new channel
Browse files Browse the repository at this point in the history
  • Loading branch information
jb-alvarado committed Feb 4, 2025
1 parent 0f583ae commit ab0039a
Show file tree
Hide file tree
Showing 8 changed files with 154 additions and 63 deletions.
2 changes: 1 addition & 1 deletion docker/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ COPY <<-EOT /run.sh
#!/bin/sh

if [ ! -f /db/ffplayout.db ]; then
ffplayout -i -u admin -p admin -m contact@example.com --storage "/tv-media" --playlists "/playlists" --public "/public" --logs "/logging" --mail-smtp "mail.example.org" --mail-user "admin@example.org" --mail-password "" --mail-starttls
ffplayout -i -u admin -p admin -m contact@example.com --storage "/tv-media" --playlists "/playlists" --public "/public" --logs "/logging" --smtp-server "mail.example.org" --smtp-user "admin@example.org" --smtp-password "" --smtp-port 465 --smtp-starttls false
fi

/usr/bin/ffplayout -l "0.0.0.0:8787"
Expand Down
2 changes: 1 addition & 1 deletion docker/nonfree.Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ COPY <<-EOT /run.sh
#!/bin/sh

if [ ! -f /db/ffplayout.db ]; then
ffplayout -i -u admin -p admin -m contact@example.com --storage "/tv-media" --playlists "/playlists" --public "/public" --logs "/logging" --mail-smtp "mail.example.org" --mail-user "admin@example.org" --mail-password "" --mail-starttls
ffplayout -i -u admin -p admin -m contact@example.com --storage "/tv-media" --playlists "/playlists" --public "/public" --logs "/logging" --smtp-server "mail.example.org" --smtp-user "admin@example.org" --smtp-password "" --smtp-port 465 --smtp-starttls false
fi

/usr/bin/ffplayout -l "0.0.0.0:8787"
Expand Down
2 changes: 1 addition & 1 deletion docker/nvidia.Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -200,7 +200,7 @@ COPY <<-EOT /run.sh
#!/bin/sh

if [ ! -f /db/ffplayout.db ]; then
ffplayout -i -u admin -p admin -m contact@example.com --storage "/tv-media" --playlists "/playlists" --public "/public" --logs "/logging" --mail-smtp "mail.example.org" --mail-user "admin@example.org" --mail-password "" --mail-starttls
ffplayout -i -u admin -p admin -m contact@example.com --storage "/tv-media" --playlists "/playlists" --public "/public" --logs "/logging" --smtp-server "mail.example.org" --smtp-user "admin@example.org" --smtp-password "" --smtp-port 465 --smtp-starttls false
fi

/usr/bin/ffplayout -l "0.0.0.0:8787"
Expand Down
2 changes: 1 addition & 1 deletion engine/src/api/routes.rs
Original file line number Diff line number Diff line change
Expand Up @@ -668,7 +668,7 @@ async fn add_advanced_config(
.await
.ok_or(ServiceError::BadRequest("Channel not found".to_string()))?;

handles::insert_advanced_configuration(&pool, *id, data.into_inner()).await?;
handles::insert_advanced_configuration(&pool, *id, None, data.into_inner()).await?;
let new_config = get_config(&pool, *id).await?;

manager.update_config(new_config).await;
Expand Down
85 changes: 81 additions & 4 deletions engine/src/db/handles.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,31 @@ use sqlx::{sqlite::SqliteQueryResult, Pool, Row, Sqlite};
use super::models::{AdvancedConfiguration, Configuration};
use crate::db::models::{Channel, GlobalSettings, Role, TextPreset, User};
use crate::utils::{
advanced_config::AdvancedConfig,
advanced_config::{AdvancedConfig, DecoderConfig, FilterConfig, IngestConfig},
config::PlayoutConfig,
errors::{ProcessError, ServiceError},
is_running_in_container,
};

pub const NVIDIA_NAME: &str = "Nvidia";
pub const NVIDIA_INPUT: &str =
"-thread_queue_size 1024 -hwaccel_device 0 -hwaccel cuvid -hwaccel_output_format cuda";
pub const NVIDIA_DECODER_OUTPUT: &str = "-c:v h264_nvenc -preset p2 -tune ll -b:v 50000k -minrate 50000k -maxrate 50000k -bufsize 25000k -c:a s302m -strict -2 -sample_fmt s16 -ar 48000 -ac 2";
pub const NVIDIA_FILTER_DEINTERLACE: &str = "yadif_cuda=0:-1:0";
pub const NVIDIA_FILTER_SCALE: &str = "scale_cuda={}:{}:format=yuv420p";
pub const NVIDIA_FILTER_LOGO_SCALE: &str = "null";
pub const NVIDIA_FILTER_OVERLAY: &str = "overlay_cuda={}:shortest=1";

pub const QSV_NAME: &str = "QSV";
pub const QSV_INPUT: &str =
"-hwaccel qsv -init_hw_device qsv=hw -filter_hw_device hw -hwaccel_output_format qsv";
pub const QSV_DECODER_OUTPUT: &str = "-c:v mpeg2_qsv -g 1 -b:v 50000k -minrate 50000k -maxrate 50000k -bufsize 25000k -c:a s302m -strict -2 -sample_fmt s16 -ar 48000 -ac 2";
pub const QSV_FILTER_DEINTERLACE: &str = "deinterlace_qsv";
pub const QSV_FILTER_FPS: &str = "vpp_qsv=framerate=25";
pub const QSV_FILTER_SCALE: &str = "scale_qsv={}:{}";
pub const QSV_FILTER_LOGO_SCALE: &str = "scale_qsv={}";
pub const QSV_FILTER_OVERLAY: &str = "overlay_qsv={}:shortest=1";

pub async fn db_migrate(conn: &Pool<Sqlite>) -> Result<(), ProcessError> {
sqlx::migrate!("../migrations").run(conn).await?;

Expand All @@ -39,6 +58,61 @@ pub async fn db_migrate(conn: &Pool<Sqlite>) -> Result<(), ProcessError> {
.bind(shared)
.execute(conn)
.await?;

insert_advanced_configuration(
conn,
1,
Some(1),
AdvancedConfig {
name: Some(NVIDIA_NAME.to_string()),
decoder: DecoderConfig {
input_param: Some(NVIDIA_INPUT.to_string()),
output_param: Some(NVIDIA_DECODER_OUTPUT.to_string()),
..Default::default()
},
ingest: IngestConfig {
input_param: Some(NVIDIA_INPUT.to_string()),
..Default::default()
},
filter: FilterConfig {
deinterlace: Some(NVIDIA_FILTER_DEINTERLACE.to_string()),
scale: Some(NVIDIA_FILTER_SCALE.to_string()),
overlay_logo_scale: Some(NVIDIA_FILTER_LOGO_SCALE.to_string()),
overlay_logo: Some(NVIDIA_FILTER_OVERLAY.to_string()),
..Default::default()
},
..Default::default()
},
)
.await?;

insert_advanced_configuration(
conn,
1,
Some(1),
AdvancedConfig {
name: Some(QSV_NAME.to_string()),
decoder: DecoderConfig {
input_param: Some(QSV_INPUT.to_string()),
output_param: Some(QSV_DECODER_OUTPUT.to_string()),
..Default::default()
},
ingest: IngestConfig {
input_param: Some(QSV_INPUT.to_string()),
..Default::default()
},
filter: FilterConfig {
deinterlace: Some(QSV_FILTER_DEINTERLACE.to_string()),
fps: Some(QSV_FILTER_FPS.to_string()),
scale: Some(QSV_FILTER_SCALE.to_string()),
overlay_logo_scale: Some(QSV_FILTER_LOGO_SCALE.to_string()),
overlay_logo: Some(QSV_FILTER_OVERLAY.to_string()),
..Default::default()
},
..Default::default()
},
)
.await?;
}

Ok(())
Expand Down Expand Up @@ -317,8 +391,9 @@ pub async fn update_configuration(
pub async fn insert_advanced_configuration(
conn: &Pool<Sqlite>,
channel_id: i32,
adv_id: Option<i32>,
config: AdvancedConfig,
) -> Result<(), ProcessError> {
) -> Result<i32, ProcessError> {
const QUERY_INSERT: &str =
"INSERT INTO advanced_configurations (channel_id, decoder_input_param, decoder_output_param, encoder_input_param,
ingest_input_param, filter_deinterlace, filter_pad_video, filter_fps, filter_scale, filter_set_dar,
Expand Down Expand Up @@ -362,13 +437,15 @@ pub async fn insert_advanced_configuration(
.await?
.get("id");

let a_id = adv_id.unwrap_or(advanced_id);

sqlx::query(QUERY_UPDATE)
.bind(channel_id)
.bind(advanced_id)
.bind(a_id)
.execute(conn)
.await?;

Ok(())
Ok(advanced_id)
}

pub async fn update_advanced_configuration(
Expand Down
66 changes: 63 additions & 3 deletions engine/src/utils/channels.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,16 @@ use log::*;
use sqlx::{Pool, Sqlite};
use tokio::sync::Mutex;

use crate::db::{handles, models::Channel};
use crate::db::{
handles::{self, *},
models::Channel,
};
use crate::player::controller::{ChannelController, ChannelManager};
use crate::utils::{
advanced_config::AdvancedConfig, config::get_config, copy_assets, errors::ServiceError,
advanced_config::{AdvancedConfig, DecoderConfig, FilterConfig, IngestConfig},
config::get_config,
copy_assets,
errors::ServiceError,
mail::MailQueue,
};

Expand Down Expand Up @@ -39,16 +45,70 @@ pub async fn create_channel(

handles::new_channel_presets(conn, channel.id).await?;
handles::update_channel(conn, channel.id, channel.clone()).await?;
handles::insert_advanced_configuration(
let adv_id = handles::insert_advanced_configuration(
conn,
channel.id,
None,
AdvancedConfig {
name: Some("None".to_string()),
..Default::default()
},
)
.await?;
handles::insert_configuration(conn, channel.id, OUTPUT_PARM).await?;
handles::insert_advanced_configuration(
conn,
channel.id,
Some(adv_id),
AdvancedConfig {
name: Some(NVIDIA_NAME.to_string()),
decoder: DecoderConfig {
input_param: Some(NVIDIA_INPUT.to_string()),
output_param: Some(NVIDIA_DECODER_OUTPUT.to_string()),
..Default::default()
},
ingest: IngestConfig {
input_param: Some(NVIDIA_INPUT.to_string()),
..Default::default()
},
filter: FilterConfig {
deinterlace: Some(NVIDIA_FILTER_DEINTERLACE.to_string()),
scale: Some(NVIDIA_FILTER_SCALE.to_string()),
overlay_logo_scale: Some(NVIDIA_FILTER_LOGO_SCALE.to_string()),
overlay_logo: Some(NVIDIA_FILTER_OVERLAY.to_string()),
..Default::default()
},
..Default::default()
},
)
.await?;
handles::insert_advanced_configuration(
conn,
channel.id,
Some(adv_id),
AdvancedConfig {
name: Some(QSV_NAME.to_string()),
decoder: DecoderConfig {
input_param: Some(QSV_INPUT.to_string()),
output_param: Some(QSV_DECODER_OUTPUT.to_string()),
..Default::default()
},
ingest: IngestConfig {
input_param: Some(QSV_INPUT.to_string()),
..Default::default()
},
filter: FilterConfig {
deinterlace: Some(QSV_FILTER_DEINTERLACE.to_string()),
fps: Some(QSV_FILTER_FPS.to_string()),
scale: Some(QSV_FILTER_SCALE.to_string()),
overlay_logo_scale: Some(QSV_FILTER_LOGO_SCALE.to_string()),
overlay_logo: Some(QSV_FILTER_OVERLAY.to_string()),
..Default::default()
},
..Default::default()
},
)
.await?;

let config = get_config(conn, channel.id).await?;

Expand Down
6 changes: 6 additions & 0 deletions frontend/components/ConfigChannel.vue
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
<input
v-model="channel.name"
type="text"
name="name"
placeholder="Type here"
class="input input-bordered w-full !bg-base-100"
@keyup="isChanged"
Expand All @@ -28,6 +29,7 @@
<input
v-model="channel.preview_url"
type="text"
name="preview_url"
class="input input-bordered w-full !bg-base-100"
@keyup="isChanged"
:disabled="authStore.role === 'user'"
Expand All @@ -41,6 +43,7 @@
<input
v-model="channel.extra_extensions"
type="text"
name="extra_extensions"
class="input input-bordered w-full !bg-base-100"
@keyup="isChanged"
:disabled="authStore.role === 'user'"
Expand All @@ -61,6 +64,7 @@
<input
v-model="channel.public"
type="text"
name="public"
class="input input-bordered w-full"
@keyup="isChanged"
/>
Expand All @@ -73,6 +77,7 @@
<input
v-model="channel.playlists"
type="text"
name="playlists"
class="input input-bordered w-full"
@keyup="isChanged"
/>
Expand All @@ -85,6 +90,7 @@
<input
v-model="channel.storage"
type="text"
name="storage"
class="input input-bordered w-full"
@keyup="isChanged"
/>
Expand Down
52 changes: 0 additions & 52 deletions migrations/00004_extend_configs.sql
Original file line number Diff line number Diff line change
Expand Up @@ -10,55 +10,3 @@ DROP filter_pad_scale_h;
ALTER TABLE advanced_configurations ADD name TEXT;

UPDATE advanced_configurations SET name = 'None';

INSERT INTO
advanced_configurations (
channel_id,
decoder_input_param,
decoder_output_param,
ingest_input_param,
filter_deinterlace,
filter_scale,
filter_overlay_logo_scale,
filter_overlay_logo,
name
)
VALUES
(
1,
'-thread_queue_size 1024 -hwaccel_device 0 -hwaccel cuvid -hwaccel_output_format cuda',
'-c:v h264_nvenc -preset p2 -tune ll -b:v 50000k -minrate 50000k -maxrate 50000k -bufsize 25000k -c:a s302m -strict -2 -sample_fmt s16 -ar 48000 -ac 2',
'-thread_queue_size 1024 -hwaccel_device 0 -hwaccel cuvid -hwaccel_output_format cuda',
'yadif_cuda=0:-1:0',
'scale_cuda={}:{}:format=yuv420p',
'null',
'overlay_cuda={}:shortest=1',
'Nvidia'
);

INSERT INTO
advanced_configurations (
channel_id,
decoder_input_param,
decoder_output_param,
ingest_input_param,
filter_deinterlace,
filter_fps,
filter_scale,
filter_overlay_logo_scale,
filter_overlay_logo,
name
)
VALUES
(
1,
'-hwaccel qsv -init_hw_device qsv=hw -filter_hw_device hw -hwaccel_output_format qsv',
'-c:v mpeg2_qsv -g 1 -b:v 50000k -minrate 50000k -maxrate 50000k -bufsize 25000k -c:a s302m -strict -2 -sample_fmt s16 -ar 48000 -ac 2',
'-hwaccel qsv -init_hw_device qsv=hw -filter_hw_device hw -hwaccel_output_format qsv',
'deinterlace_qsv',
'vpp_qsv=framerate=25',
'scale_qsv={}:{}',
'scale_qsv={}',
'overlay_qsv={}:shortest=1',
'QSV'
);

0 comments on commit ab0039a

Please sign in to comment.