diff --git a/src/accountcreationwizard.cpp b/src/accountcreationwizard.cpp index dc9583114c193dc2b45091264dd00d762f9151a2..9888044863828dd31e2c08d0ec550c57a6643571 100644 --- a/src/accountcreationwizard.cpp +++ b/src/accountcreationwizard.cpp @@ -24,7 +24,6 @@ // LRC #include <account.h> -#include <codecmodel.h> #include <profilemodel.h> #include <profile.h> #include <accountmodel.h> diff --git a/src/currentcallview.cpp b/src/currentcallview.cpp index b45a17c3f5bf7eb9fdf29d427b40d284abeef26e..d487583e019470c16100fac027c6b4478866abdd 100644 --- a/src/currentcallview.cpp +++ b/src/currentcallview.cpp @@ -25,13 +25,11 @@ #include <glib/gi18n.h> // Lrc -#include <account.h> #include <api/conversationmodel.h> #include <api/contact.h> #include <api/contactmodel.h> #include <api/newcallmodel.h> -#include <callmodel.h> -#include <codecmodel.h> +#include <api/newcodecmodel.h> #include <globalinstances.h> #include <smartinfohub.h> #include <video/previewmanager.h> @@ -187,47 +185,6 @@ gtk_scale_button_get_scale(GtkScaleButton* button) return scale; } -static void -set_call_quality(Call& call, bool auto_quality_on, double desired_quality) -{ - /* set auto quality true or false, also set the bitrate and quality values; - * the slider is from 0 to 100, use the min and max vals to scale each value accordingly */ - if (const auto& codecModel = call.account()->codecModel()) { - const auto& videoCodecs = codecModel->videoCodecs(); - - for (int i=0; i < videoCodecs->rowCount();i++) { - const auto& idx = videoCodecs->index(i,0); - - if (auto_quality_on) { - // g_debug("enable auto quality"); - videoCodecs->setData(idx, "true", CodecModel::Role::AUTO_QUALITY_ENABLED); - } else { - auto min_bitrate = idx.data(static_cast<int>(CodecModel::Role::MIN_BITRATE)).toInt(); - auto max_bitrate = idx.data(static_cast<int>(CodecModel::Role::MAX_BITRATE)).toInt(); - auto min_quality = idx.data(static_cast<int>(CodecModel::Role::MIN_QUALITY)).toInt(); - auto max_quality = idx.data(static_cast<int>(CodecModel::Role::MAX_QUALITY)).toInt(); - - // g_debug("bitrate min: %d, max: %d, quality min: %d, max: %d", min_bitrate, max_bitrate, min_quality, max_quality); - - double bitrate; - bitrate = min_bitrate + (double)(max_bitrate - min_bitrate)*(desired_quality/100.0); - if (bitrate < 0) bitrate = 0; - - double quality; - // note: a lower value means higher quality - quality = (double)min_quality - (min_quality - max_quality)*(desired_quality/100.0); - if (quality < 0) quality = 0; - - // g_debug("disable auto quality; %% quality: %d; bitrate: %d; quality: %d", (int)desired_quality, (int)bitrate, (int)quality); - videoCodecs->setData(idx, "false", CodecModel::Role::AUTO_QUALITY_ENABLED); - videoCodecs->setData(idx, QString::number((int)bitrate), CodecModel::Role::BITRATE); - videoCodecs->setData(idx, QString::number((int)quality), CodecModel::Role::QUALITY); - } - } - codecModel << CodecModel::EditAction::SAVE; - } -} - } // namespace class CppImpl @@ -285,6 +242,40 @@ private: inline namespace gtk_callbacks { +static void +set_call_quality(CurrentCallView* view, bool auto_quality_on, double desired_quality) +{ + auto* priv = CURRENT_CALL_VIEW_GET_PRIVATE(view); + + auto videoCodecs = (*priv->cpp->accountInfo)->codecModel->getVideoCodecs(); + for (const auto& codec : videoCodecs) { + if (auto_quality_on) { + (*priv->cpp->accountInfo)->codecModel->autoQuality(codec.id, true); + } else { + (*priv->cpp->accountInfo)->codecModel->autoQuality(codec.id, false); + double min_bitrate = 0., max_bitrate = 0., min_quality = 0., max_quality = 0.; + try { + min_bitrate = std::stoi(codec.min_bitrate); + max_bitrate = std::stoi(codec.max_bitrate); + min_quality = std::stoi(codec.min_quality); + max_quality = std::stoi(codec.max_quality); + } catch (...) { + g_error("Cannot convert a codec value to an int, abort"); + break; + } + + double bitrate = min_bitrate + (max_bitrate - min_bitrate)*(desired_quality/100.0); + if (bitrate < 0) bitrate = 0; + (*priv->cpp->accountInfo)->codecModel->bitrate(codec.id, bitrate); + + // note: a lower value means higher quality + double quality = min_quality - (min_quality - max_quality)*(desired_quality/100.0); + if (quality < 0) quality = 0; + (*priv->cpp->accountInfo)->codecModel->quality(codec.id, quality); + } + } +} + static void on_new_chat_interactions(CurrentCallView* view) { @@ -455,14 +446,7 @@ on_autoquality_toggled(GtkToggleButton* button, CurrentCallView* view) double desired_quality = gtk_scale_button_get_value(GTK_SCALE_BUTTON(priv->scalebutton_quality)); - auto callToRender = priv->cpp->conversation->callId; - if (!priv->cpp->conversation->confId.empty()) - callToRender = priv->cpp->conversation->confId; - auto renderer = (*priv->cpp->accountInfo)->callModel->getRenderer(callToRender); - for (auto* activeCall: CallModel::instance().getActiveCalls()) { - if (activeCall and activeCall->videoRenderer() == renderer) - set_call_quality(*activeCall, auto_quality_on, desired_quality); - } + set_call_quality(view, auto_quality_on, desired_quality); } static void @@ -478,13 +462,7 @@ on_quality_changed(G_GNUC_UNUSED GtkScaleButton *button, G_GNUC_UNUSED gdouble v /* only update if the scale button is released, to reduce the number of updates */ if (priv->cpp->quality_scale_pressed) return; - auto callToRender = priv->cpp->conversation->callId; - if (!priv->cpp->conversation->confId.empty()) - callToRender = priv->cpp->conversation->confId; - auto renderer = (*priv->cpp->accountInfo)->callModel->getRenderer(callToRender); - for (auto* activeCall: CallModel::instance().getActiveCalls()) - if (activeCall and activeCall->videoRenderer() == renderer) - set_call_quality(*activeCall, false, gtk_scale_button_get_value(button)); + set_call_quality(view, false, gtk_scale_button_get_value(button)); } static gboolean @@ -963,35 +941,15 @@ CppImpl::insertControls() g_signal_connect(scale, "button-release-event", G_CALLBACK(on_quality_button_released), self); } - /* by this time we should have the call already set, but we check to make sure */ - auto callToRender = conversation->callId; - if (!conversation->confId.empty()) - callToRender = conversation->confId; - auto renderer = (*accountInfo)->callModel->getRenderer(callToRender); - for (auto* activeCall: CallModel::instance().getActiveCalls()) - if (activeCall and activeCall->videoRenderer() == renderer) { - g_signal_connect(widgets->video_widget, "drag-data-received", - G_CALLBACK(video_widget_on_drag_data_received), activeCall); - /* check if auto quality is enabled or not */ - if (const auto& codecModel = activeCall->account()->codecModel()) { - const auto& videoCodecs = codecModel->videoCodecs(); - if (videoCodecs->rowCount() > 0) { - /* we only need to check the first codec since by default it is ON for all, and the - * gnome client sets its ON or OFF for all codecs as well */ - const auto& idx = videoCodecs->index(0,0); - auto auto_quality_enabled = idx.data(static_cast<int>(CodecModel::Role::AUTO_QUALITY_ENABLED)).toString() == "true"; - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widgets->checkbutton_autoquality), - auto_quality_enabled); - - // TODO: save the manual quality setting in the client and set the slider to that value here; - // the daemon resets the bitrate/quality between each call, and the default may be - // different for each codec, so there is no reason to check it here - } - } - } else { - /* Auto-quality is off by default */ - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widgets->checkbutton_autoquality), FALSE); - } + auto videoCodecs = (*accountInfo)->codecModel->getVideoCodecs(); + if (!videoCodecs.empty()) { + bool autoQualityEnabled = videoCodecs.front().auto_quality_enabled; + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widgets->checkbutton_autoquality), + autoQualityEnabled); + } else { + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widgets->checkbutton_autoquality), + false); + } // Get if the user wants to show the smartInfo box auto display_smartinfo = g_action_map_lookup_action(G_ACTION_MAP(g_application_get_default()),