Skip to content

Commit

Permalink
export: implemented audio bit rate setting
Browse files Browse the repository at this point in the history
The UI for this isn't perfect, I just wrote this in because I needed it. But the backend is solid.
  • Loading branch information
itsmattkc committed Dec 3, 2020
1 parent 7dd9115 commit 0699795
Show file tree
Hide file tree
Showing 6 changed files with 45 additions and 6 deletions.
3 changes: 2 additions & 1 deletion app/codec/encoder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,8 @@ EncodingParams::EncodingParams() :
video_max_bit_rate_(0),
video_buffer_size_(0),
video_threads_(0),
audio_enabled_(false)
audio_enabled_(false),
audio_bit_rate_(0)
{
}

Expand Down
11 changes: 11 additions & 0 deletions app/codec/encoder.h
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,16 @@ class EncodingParams {
const ExportCodec::Codec &audio_codec() const;
const AudioParams& audio_params() const;

const int64_t& audio_bit_rate() const
{
return audio_bit_rate_;
}

void set_audio_bit_rate(const int64_t& b)
{
audio_bit_rate_ = b;
}

const rational& GetExportLength() const;
void SetExportLength(const rational& GetExportLength);

Expand All @@ -90,6 +100,7 @@ class EncodingParams {
bool audio_enabled_;
ExportCodec::Codec audio_codec_;
AudioParams audio_params_;
int64_t audio_bit_rate_;

rational export_length_;

Expand Down
17 changes: 12 additions & 5 deletions app/codec/ffmpeg/ffmpegencoder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -500,7 +500,7 @@ bool FFmpegEncoder::InitializeStream(AVMediaType type, AVStream** stream_ptr, AV

if (codec_id == AV_CODEC_ID_H264) {
// For some reason, FFmpeg doesn't set libx264's bff flag so we have to do it ourselves
av_opt_set(video_codec_ctx_->priv_data, "x264opts", "bff=1", AV_OPT_SEARCH_CHILDREN);
av_opt_set(codec_ctx->priv_data, "x264opts", "bff=1", AV_OPT_SEARCH_CHILDREN);
}
}
}
Expand All @@ -510,28 +510,35 @@ bool FFmpegEncoder::InitializeStream(AVMediaType type, AVStream** stream_ptr, AV
QHash<QString, QString>::const_iterator i;

for (i=params().video_opts().begin();i!=params().video_opts().end();i++) {
av_opt_set(video_codec_ctx_->priv_data, i.key().toUtf8(), i.value().toUtf8(), AV_OPT_SEARCH_CHILDREN);
av_opt_set(codec_ctx->priv_data, i.key().toUtf8(), i.value().toUtf8(), AV_OPT_SEARCH_CHILDREN);
}

if (params().video_bit_rate() > 0) {
video_codec_ctx_->bit_rate = params().video_bit_rate();
codec_ctx->bit_rate = params().video_bit_rate();
}

if (params().video_max_bit_rate() > 0) {
video_codec_ctx_->rc_max_rate = params().video_max_bit_rate();
codec_ctx->rc_max_rate = params().video_max_bit_rate();
}

if (params().video_buffer_size() > 0) {
video_codec_ctx_->rc_buffer_size = static_cast<int>(params().video_buffer_size());
codec_ctx->rc_buffer_size = static_cast<int>(params().video_buffer_size());
}
}

} else {

// Assume audio stream
codec_ctx->sample_rate = params().audio_params().sample_rate();
codec_ctx->channel_layout = params().audio_params().channel_layout();
codec_ctx->channels = av_get_channel_layout_nb_channels(codec_ctx->channel_layout);
codec_ctx->sample_fmt = encoder->sample_fmts[0];
codec_ctx->time_base = {1, codec_ctx->sample_rate};

if (params().audio_bit_rate() > 0) {
codec_ctx->bit_rate = params().audio_bit_rate();
}

}

if (!SetupCodecContext(stream, codec_ctx, encoder)) {
Expand Down
2 changes: 2 additions & 0 deletions app/dialog/export/export.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -490,6 +490,8 @@ ExportParams ExportDialog::GenerateParams() const
if (audio_enabled_->isChecked()) {
ExportCodec::Codec audio_codec = static_cast<ExportCodec::Codec>(audio_tab_->codec_combobox()->currentData().toInt());
params.EnableAudio(audio_render_params, audio_codec);

params.set_audio_bit_rate(audio_tab_->bit_rate_slider()->GetValue() * 1000);
}

return params;
Expand Down
11 changes: 11 additions & 0 deletions app/dialog/export/exportaudiotab.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,17 @@ ExportAudioTab::ExportAudioTab(QWidget* parent) :
layout->addWidget(new QLabel(tr("Format:")), row, 0);
layout->addWidget(new QComboBox(), row, 1);

row++;

layout->addWidget(new QLabel(tr("Bit Rate:")), row, 0);

bit_rate_slider_ = new IntegerSlider();
bit_rate_slider_->SetMinimum(32);
bit_rate_slider_->SetMaximum(320);
bit_rate_slider_->SetValue(256);
bit_rate_slider_->SetFormat(tr("%1 kbps"));
layout->addWidget(bit_rate_slider_, row, 1);

outer_layout->addStretch();
}

Expand Down
7 changes: 7 additions & 0 deletions app/dialog/export/exportaudiotab.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
#include <QWidget>

#include "common/define.h"
#include "widget/slider/integerslider.h"
#include "widget/standardcombos/standardcombos.h"

namespace olive {
Expand All @@ -50,10 +51,16 @@ class ExportAudioTab : public QWidget
return channel_layout_combobox_;
}

IntegerSlider* bit_rate_slider() const
{
return bit_rate_slider_;
}

private:
QComboBox* codec_combobox_;
SampleRateComboBox* sample_rate_combobox_;
ChannelLayoutComboBox* channel_layout_combobox_;
IntegerSlider* bit_rate_slider_;

};

Expand Down

0 comments on commit 0699795

Please sign in to comment.