Skip to content

Commit

Permalink
Merge pull request #762 from ElderOrb/audio_visualizations
Browse files Browse the repository at this point in the history
  • Loading branch information
dericed committed Jun 25, 2023
2 parents 374a552 + a448101 commit 1986582
Show file tree
Hide file tree
Showing 7 changed files with 172 additions and 64 deletions.
26 changes: 21 additions & 5 deletions .github/workflows/qctools.yml
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,9 @@ jobs:
include:
- compiler: clang-9
packages: llvm@9
env: { 'CC': 'clang-9', 'CXX': 'clang++-9' }
env: { 'CC': 'clang-9', 'CXX': 'clang++-9', 'HOMEBREW_NO_INSTALL_CLEANUP': '1', 'HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK': '1' }
- qt_version: "6.3.0"
qt_modules: "qtmultimedia"

runs-on: macos-latest

Expand All @@ -87,11 +89,17 @@ jobs:
- name: Install dependencies
run: |
brew install ${{ matrix.packages }} pkg-config qt ffmpeg
brew install ${{ matrix.packages }} pkg-config ffmpeg
- name: Install Qt6
uses: jurplel/install-qt-action@v3
with:
version: ${{ matrix.qt_version }}
modules: ${{ matrix.qt_modules }}

- name: Install qwt
run: |
brew install qwt
brew install --ignore-dependencies qwt
- name: Set Qt6 environment path
run: |
Expand Down Expand Up @@ -185,7 +193,9 @@ jobs:
include:
- compiler: clang-9
packages: llvm@9
env: { 'CC': 'clang-9', 'CXX': 'clang++-9' }
env: { 'CC': 'clang-9', 'CXX': 'clang++-9', 'HOMEBREW_NO_INSTALL_CLEANUP': '1', 'HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK': '1' }
- qt_version: "6.3.0"
qt_modules: "qtmultimedia"

runs-on: macos-latest

Expand All @@ -208,7 +218,13 @@ jobs:
- name: Install dependencies
run: |
brew install ${{ matrix.packages }} nasm qt
brew install ${{ matrix.packages }} nasm
- name: Install Qt6
uses: jurplel/install-qt-action@v3
with:
version: ${{ matrix.qt_version }}
modules: ${{ matrix.qt_modules }}

- name: Set Qt6 environment path
run: |
Expand Down
2 changes: 1 addition & 1 deletion Project/QtCreator/qctools-QtAVPlayer
Submodule qctools-QtAVPlayer updated 89 files
+2 −0 .cmake.conf
+71 −52 .github/workflows/main.yaml
+1 −1 .qmake.conf
+51 −5 CMakeLists.txt
+55 −30 README.md
+0 −1 examples/CMakeLists.txt
+16 −4 examples/qml_video/CMakeLists.txt
+30 −19 examples/qml_video/main.cpp
+1 −0 examples/qml_video/qml_qt6.qrc
+22 −24 src/QtAVPlayer/CMakeLists.txt
+2 −2 src/QtAVPlayer/QtAVPlayer.pro
+74 −0 src/QtAVPlayer/qavandroidsurfacetexture.cpp
+61 −0 src/QtAVPlayer/qavandroidsurfacetexture_p.h
+5 −2 src/QtAVPlayer/qavaudiocodec.cpp
+1 −1 src/QtAVPlayer/qavaudiocodec_p.h
+2 −4 src/QtAVPlayer/qavaudiofilter.cpp
+1 −2 src/QtAVPlayer/qavaudiofilter_p.h
+30 −9 src/QtAVPlayer/qavaudioframe.cpp
+3 −3 src/QtAVPlayer/qavaudioframe.h
+27 −4 src/QtAVPlayer/qavaudioinputfilter.cpp
+2 −2 src/QtAVPlayer/qavaudioinputfilter_p.h
+1 −0 src/QtAVPlayer/qavaudiooutput.h
+2 −2 src/QtAVPlayer/qavaudiooutputfilter.cpp
+1 −1 src/QtAVPlayer/qavaudiooutputfilter_p.h
+4 −5 src/QtAVPlayer/qavcodec.cpp
+4 −5 src/QtAVPlayer/qavcodec_p.h
+62 −73 src/QtAVPlayer/qavdemuxer.cpp
+5 −4 src/QtAVPlayer/qavdemuxer_p.h
+2 −4 src/QtAVPlayer/qavfilter.cpp
+3 −5 src/QtAVPlayer/qavfilter_p.h
+2 −3 src/QtAVPlayer/qavfiltergraph.cpp
+2 −3 src/QtAVPlayer/qavfiltergraph_p.h
+4 −4 src/QtAVPlayer/qavframe.cpp
+2 −2 src/QtAVPlayer/qavframe.h
+3 −4 src/QtAVPlayer/qavframecodec.cpp
+2 −2 src/QtAVPlayer/qavframecodec_p.h
+151 −2 src/QtAVPlayer/qavhwdevice_d3d11.cpp
+4 −2 src/QtAVPlayer/qavhwdevice_d3d11_p.h
+82 −4 src/QtAVPlayer/qavhwdevice_mediacodec.cpp
+8 −3 src/QtAVPlayer/qavhwdevice_mediacodec_p.h
+2 −0 src/QtAVPlayer/qavhwdevice_p.h
+3 −4 src/QtAVPlayer/qavhwdevice_vaapi_drm_egl.cpp
+2 −2 src/QtAVPlayer/qavhwdevice_vaapi_drm_egl_p.h
+3 −4 src/QtAVPlayer/qavhwdevice_vaapi_x11_glx.cpp
+2 −2 src/QtAVPlayer/qavhwdevice_vaapi_x11_glx_p.h
+2 −3 src/QtAVPlayer/qavhwdevice_vdpau.cpp
+2 −2 src/QtAVPlayer/qavhwdevice_vdpau_p.h
+3 −4 src/QtAVPlayer/qavhwdevice_videotoolbox.mm
+2 −2 src/QtAVPlayer/qavhwdevice_videotoolbox_p.h
+5 −6 src/QtAVPlayer/qavinoutfilter.cpp
+4 −5 src/QtAVPlayer/qavinoutfilter_p.h
+2 −0 src/QtAVPlayer/qavinoutfilter_p_p.h
+1 −1 src/QtAVPlayer/qaviodevice.cpp
+2 −3 src/QtAVPlayer/qavpacket.cpp
+2 −3 src/QtAVPlayer/qavpacket_p.h
+1 −1 src/QtAVPlayer/qavplayer-config.h.in
+4 −4 src/QtAVPlayer/qavplayer-config_p.h.in
+14 −3 src/QtAVPlayer/qavplayer.cpp
+3 −0 src/QtAVPlayer/qavplayer.h
+126 −26 src/QtAVPlayer/qavstream.cpp
+32 −4 src/QtAVPlayer/qavstream.h
+5 −6 src/QtAVPlayer/qavstreamframe.cpp
+3 −4 src/QtAVPlayer/qavstreamframe.h
+2 −2 src/QtAVPlayer/qavsubtitlecodec.cpp
+1 −1 src/QtAVPlayer/qavsubtitlecodec_p.h
+3 −3 src/QtAVPlayer/qavsubtitleframe.cpp
+1 −1 src/QtAVPlayer/qavsubtitleframe.h
+2 −2 src/QtAVPlayer/qavvideobuffer_p.h
+25 −2 src/QtAVPlayer/qavvideocodec.cpp
+1 −1 src/QtAVPlayer/qavvideocodec_p.h
+2 −4 src/QtAVPlayer/qavvideofilter.cpp
+1 −2 src/QtAVPlayer/qavvideofilter_p.h
+135 −13 src/QtAVPlayer/qavvideoframe.cpp
+13 −6 src/QtAVPlayer/qavvideoframe.h
+5 −5 src/QtAVPlayer/qavvideoinputfilter.cpp
+2 −2 src/QtAVPlayer/qavvideoinputfilter_p.h
+2 −2 src/QtAVPlayer/qavvideooutputfilter.cpp
+1 −1 src/QtAVPlayer/qavvideooutputfilter_p.h
+2 −2 src/QtAVPlayer/qtavplayerglobal.h
+1 −0 tests/CMakeLists.txt
+1 −0 tests/auto/CMakeLists.txt
+2 −0 tests/auto/integration/CMakeLists.txt
+22 −0 tests/auto/integration/qavdemuxer/CMakeLists.txt
+2 −5 tests/auto/integration/qavdemuxer/qavdemuxer.pro
+20 −14 tests/auto/integration/qavdemuxer/tst_qavdemuxer.cpp
+10 −0 tests/auto/integration/qavplayer/CMakeLists.txt
+3 −6 tests/auto/integration/qavplayer/qavplayer.pro
+123 −87 tests/auto/integration/qavplayer/tst_qavplayer.cpp
+ tests/auto/integration/testdata/20190821_075842.jpg
Original file line number Diff line number Diff line change
Expand Up @@ -114,8 +114,9 @@ qtConfig(vdpau) {
}

android {
QT += core-private
PRIVATE_HEADERS += qavhwdevice_mediacodec_p.h
SOURCES += qavhwdevice_mediacodec.cpp
SOURCES += qavhwdevice_mediacodec.cpp qavandroidsurfacetexture.cpp

LIBS += -lavdevice -lavformat -lavutil -lavcodec -lavfilter -lswscale -lswresample
equals(ANDROID_TARGET_ARCH, armeabi-v7a): \
Expand Down
2 changes: 0 additions & 2 deletions Source/GUI/filters.h
Original file line number Diff line number Diff line change
Expand Up @@ -925,7 +925,6 @@ const filter Filters[] =
"readvitc=scan_max=${1},readeia608=scan_max=${1}:spw=${2}:chp=1,crop=iw:${1}:0:0,scale=${width}:${height}:flags=neighbor,drawtext=fontfile=${fontfile}:fontcolor=white:fontsize=36:box=1:boxcolor=black@0.5:x=(w-tw)/2:y=h*3/4-ascent:text=Line %{metadata\\\\:lavfi.readeia608.0.line\\\\:-} %{metadata\\\\:lavfi.readeia608.0.cc\\\\:------} - Line %{metadata\\\\:lavfi.readeia608.1.line\\\\:-} %{metadata\\\\:lavfi.readeia608.1.cc\\\\:------},drawtext=fontfile=${fontfile}:fontcolor=white:fontsize=36:box=1:boxcolor=black@0.5:x=(w-tw)/2:y=h*3/4-ascent*3:text=VITC %{metadata\\\\:lavfi.readvitc.tc_str\\\\:-- -- -- --}",
},
},
/*
{
"(Separator)",
-1,
Expand Down Expand Up @@ -1087,7 +1086,6 @@ const filter Filters[] =
"ebur128=video=1:meter=${1}[out0][out1];[out1]anullsink;[out0]copy",
},
},
*/
{
"(End)",
-1,
Expand Down
7 changes: 7 additions & 0 deletions Source/GUI/filterselector.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -206,6 +206,13 @@ QString FilterSelector::getFilterName()

return QString();
}
int FilterSelector::getFilterType()
{
if(m_currentFilterIndex != -1)
return Filters[m_currentFilterIndex].Type;

return -1;
}

void FilterSelector::on_FiltersOptions_click()
{
Expand Down
1 change: 1 addition & 0 deletions Source/GUI/filterselector.h
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ class FilterSelector : public QFrame

QString getFilter();
QString getFilterName();
int getFilterType();

Q_SIGNALS:
void filterChanged(const QString& filterString);
Expand Down
195 changes: 140 additions & 55 deletions Source/GUI/player.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -785,99 +785,184 @@ void Player::applyFilter()

ui->plainTextEdit->clear();

QStringList definedFilters;
QStringList definedVideoFilters;
QStringList definedAudioFilters;

for(auto i = 0; i < MaxFilters; ++i) {
auto layoutItem = (ui->filterGroupBox->layout()->itemAt(i));
auto filter = qobject_cast<FilterSelector*>(layoutItem->widget());
if(!filter)
continue;

auto rawFilter = filter->getFilter();
auto type = filter->getFilterType();

auto filterString = replaceFilterTokens(rawFilter);
auto empty = filterString.isEmpty();
if(!empty)
definedFilters.append(filterString);
if(!empty) {
if(type == 0)
definedVideoFilters.append(filterString);
else if(type == 1)
definedAudioFilters.append(filterString);
}
}

ui->plainTextEdit->appendPlainText(QString("*** defined filters ***: \n\n%1").arg(definedFilters.join("\n")));
ui->plainTextEdit->appendPlainText(QString("*** defined video filters ***: \n\n%1").arg(definedVideoFilters.join("\n")));
ui->plainTextEdit->appendPlainText(QString("*** defined audio filters ***: \n\n%1").arg(definedAudioFilters.join("\n")));

if(definedFilters.empty()) {
if(definedAudioFilters.empty() && definedVideoFilters.empty()) {
setFilter(QString());
return;
}

auto layout = QString();
if(ui->vertical_checkBox->isChecked()) {
layout = "0_0|0_h0|0_h0+h1|0_h0+h1+h2|0_h0+h1+h2+h3|0_h0+h1+h2+h3+h4";
} else if(ui->horizontal_checkBox->isChecked()) {
layout = "0_0|w0_0|w0+w1_0|w0+w1+w2_0|w0+w1+w2+w3_0|w0+w1+w2+w3+w4_0";
} else if(ui->grid_checkBox->isChecked()) {
layout = "0_0|w0_0|0_h0|w0_h0|0_h0+h1|w0_h0+h1";
}
QString combinedVideoFilter;
if(!definedVideoFilters.empty())
{
ui->plainTextEdit->appendPlainText(QString("*** VIDEO ***: \n\n"));

auto layout = QString();
if(ui->vertical_checkBox->isChecked()) {
layout = "0_0|0_h0|0_h0+h1|0_h0+h1+h2|0_h0+h1+h2+h3|0_h0+h1+h2+h3+h4";
} else if(ui->horizontal_checkBox->isChecked()) {
layout = "0_0|w0_0|w0+w1_0|w0+w1+w2_0|w0+w1+w2+w3_0|w0+w1+w2+w3+w4_0";
} else if(ui->grid_checkBox->isChecked()) {
layout = "0_0|w0_0|0_h0|w0_h0|0_h0+h1|w0_h0+h1";
}

ui->plainTextEdit->appendPlainText(QString("*** layout ***: \n\n%1").arg(layout));
ui->plainTextEdit->appendPlainText(QString("*** layout ***: \n\n%1").arg(layout));

QString splits[] = {
"sws_flags=neighbor;%1",
"sws_flags=neighbor;%1split=2[x1][x2];",
"sws_flags=neighbor;%1split=3[x1][x2][x3];",
"sws_flags=neighbor;%1split=4[x1][x2][x3][x4];",
"sws_flags=neighbor;%1split=5[x1][x2][x3][x4][x5];",
"sws_flags=neighbor;%1split=6[x1][x2][x3][x4][x5][x6];"
};
QString videoSplits[] = {
"sws_flags=neighbor;%1",
"sws_flags=neighbor;%1split=2[x1][x2];",
"sws_flags=neighbor;%1split=3[x1][x2][x3];",
"sws_flags=neighbor;%1split=4[x1][x2][x3][x4];",
"sws_flags=neighbor;%1split=5[x1][x2][x3][x4][x5];",
"sws_flags=neighbor;%1split=6[x1][x2][x3][x4][x5][x6];"
};

auto adjustmentFilterString = replaceFilterTokens(m_adjustmentSelector->getFilter());
auto split = splits[definedFilters.length() - 1].arg(!adjustmentFilterString.isEmpty() ? (adjustmentFilterString + ",") : adjustmentFilterString);
auto adjustmentFilterString = replaceFilterTokens(m_adjustmentSelector->getFilter());
auto videoSplit = videoSplits[definedVideoFilters.length() - 1].arg(!adjustmentFilterString.isEmpty() ? (adjustmentFilterString + ",") : adjustmentFilterString);

ui->plainTextEdit->appendPlainText(QString("*** split ***: \n\n%1").arg(split));
ui->plainTextEdit->appendPlainText(QString("*** video split ***: \n\n%1").arg(videoSplit));

QString filterString;
QString videoFilterString;

if(definedFilters.length() == 1) {
filterString = definedFilters[0];
} else {
for(int i = 0; i < definedFilters.length(); ++i) {
if(ui->fitToGrid_checkBox->isChecked()) {
if(i == 0) {
filterString += replaceFilterTokens(QString("[x%1]%2[y%1];")).arg(i + 1).arg(definedFilters[i]);
if(definedVideoFilters.length() == 1) {
videoFilterString = definedVideoFilters[0];
} else {
for(int i = 0; i < definedVideoFilters.length(); ++i) {
if(ui->fitToGrid_checkBox->isChecked()) {
if(i == 0) {
videoFilterString += replaceFilterTokens(QString("[x%1]%2[y%1];")).arg(i + 1).arg(definedVideoFilters[i]);
} else {
videoFilterString += replaceFilterTokens(QString("[x%1]%2[z%1];[z%1][y1]scale2ref[y%1][y1];")).arg(i + 1).arg(definedVideoFilters[i]);
}
} else {
filterString += replaceFilterTokens(QString("[x%1]%2[z%1];[z%1][y1]scale2ref[y%1][y1];")).arg(i + 1).arg(definedFilters[i]);
videoFilterString += QString("[x%1]%2[y%1];").arg(i + 1).arg(definedVideoFilters[i]);
}
} else {
filterString += QString("[x%1]%2[y%1];").arg(i + 1).arg(definedFilters[i]);
}
}
}

ui->plainTextEdit->appendPlainText(QString("*** filterString ***: \n\n%1").arg(filterString));
ui->plainTextEdit->appendPlainText(QString("*** videoFilterString ***: \n\n%1").arg(videoFilterString));

QString xstack_inputs[] = {
"",
"[y1][y2]",
"[y1][y2][y3]",
"[y1][y2][y3][y4]",
"[y1][y2][y3][y4][y5]",
"[y1][y2][y3][y4][y5][y6]"
};
QString videoXstackInputs[] = {
"",
"[y1][y2]",
"[y1][y2][y3]",
"[y1][y2][y3][y4]",
"[y1][y2][y3][y4][y5]",
"[y1][y2][y3][y4][y5][y6]"
};

auto videoXstackInput = videoXstackInputs[definedVideoFilters.length() - 1];

ui->plainTextEdit->appendPlainText(QString("*** videoXstackInput ***: \n\n%1").arg(videoXstackInput));

auto xstack_input = xstack_inputs[definedFilters.length() - 1];
QString videoXstackOption;

ui->plainTextEdit->appendPlainText(QString("*** xstack_input ***: \n\n%1").arg(xstack_input));
if(definedVideoFilters.length() != 1) {
videoXstackOption = QString("%1xstack=fill=slategray:inputs=%2:layout=%3").arg(videoXstackInput).arg(definedVideoFilters.length()).arg(layout);
}

QString xstack_option;
combinedVideoFilter = videoSplit + videoFilterString + videoXstackOption;

if(definedFilters.length() != 1) {
xstack_option = QString("%1xstack=fill=slategray:inputs=%2:layout=%3").arg(xstack_input).arg(definedFilters.length()).arg(layout);
if(ui->graphmonitor_checkBox->isChecked())
{
combinedVideoFilter.append(QString(",graphmonitor=flags=queue+pts+time+timebase+format+size+rate:m=full"));
}

ui->plainTextEdit->appendPlainText(QString("*** result ***: \n\n%1").arg(combinedVideoFilter));
}

QString combinedFilter = split + filterString + xstack_option;
QString combinedAudioFilter;
if(!definedAudioFilters.empty())
{
ui->plainTextEdit->appendPlainText(QString("*** AUDIO ***: \n\n"));

QString audioSplits[] = {
"%1",
"%1asplit=2[a1][a2];",
"%1asplit=3[a1][a2][a3];",
"%1asplit=4[a1][a2][a3][a4];",
"%1asplit=5[a1][a2][a3][a4][a5];",
"%1asplit=6[a1][a2][a3][a4][a5][a6];"
};

auto audioSplit = audioSplits[definedAudioFilters.length() - 1].arg("");

ui->plainTextEdit->appendPlainText(QString("*** audio split ***: \n\n%1").arg(audioSplit));

QString audioFilterString;

if(definedAudioFilters.length() == 1) {
audioFilterString = definedAudioFilters[0];
} else {
for(int i = 0; i < definedAudioFilters.length(); ++i) {
audioFilterString += QString("[a%1]%2[b%1];").arg(i + 1).arg(definedAudioFilters[i]);
}
}

QString audioXstackInputs[] = {
"",
"[b1][b2]",
"[b1][b2][b3]",
"[b1][b2][b3][b4]",
"[b1][b2][b3][b4][b5]",
"[b1][b2][b3][b4][b5][b6]"
};

ui->plainTextEdit->appendPlainText(QString("*** audioFilterString ***: \n\n%1").arg(audioFilterString));

if(ui->graphmonitor_checkBox->isChecked())
auto audioXstackInput = audioXstackInputs[definedAudioFilters.length() - 1];

ui->plainTextEdit->appendPlainText(QString("*** audioXstackInput ***: \n\n%1").arg(audioXstackInput));

QString audioXstackOption;

if(definedAudioFilters.length() != 1) {
audioXstackOption = QString("%1xstack=fill=slategray:inputs=%2:layout=%3").arg(audioXstackInput).arg(definedAudioFilters.length()).arg("0_0|0_h0|0_h0+h1|0_h0+h1+h2|0_h0+h1+h2+h3|0_h0+h1+h2+h3+h4");
}

combinedAudioFilter = audioSplit + audioFilterString + audioXstackOption;

ui->plainTextEdit->appendPlainText(QString("*** result ***: \n\n%1").arg(combinedAudioFilter));
}

QString combinedFilter;
if(!combinedVideoFilter.isEmpty() && !combinedAudioFilter.isEmpty())
{
combinedFilter = QString("videoFilterString[VFS];audioFilterString[AFS];[VFS][AFS]xstack=fill=slategray:inputs=2:layout=0_0|0_h0")
.replace("videoFilterString", combinedVideoFilter)
.replace("audioFilterString", combinedAudioFilter);
} else if(!combinedVideoFilter.isEmpty())
{
combinedFilter = combinedVideoFilter;
} else if(!combinedAudioFilter.isEmpty())
{
combinedFilter.append(QString(",graphmonitor=flags=queue+pts+time+timebase+format+size+rate:m=full"));
combinedFilter = combinedAudioFilter;
}

ui->plainTextEdit->appendPlainText(QString("*** result ***: \n\n%1").arg(combinedFilter));
ui->plainTextEdit->appendPlainText(QString("*** filterString ***: \n\n%1").arg(combinedFilter));

setFilter(combinedFilter);
}
Expand Down

0 comments on commit 1986582

Please sign in to comment.