aboutsummaryrefslogtreecommitdiffstats
path: root/ui/qt/rtp_player_dialog.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ui/qt/rtp_player_dialog.cpp')
-rw-r--r--ui/qt/rtp_player_dialog.cpp179
1 files changed, 123 insertions, 56 deletions
diff --git a/ui/qt/rtp_player_dialog.cpp b/ui/qt/rtp_player_dialog.cpp
index 19c7763cb0..8e7b3f7444 100644
--- a/ui/qt/rtp_player_dialog.cpp
+++ b/ui/qt/rtp_player_dialog.cpp
@@ -11,6 +11,12 @@
#include <ui/tap-rtp-common.h>
#include "rtp_player_dialog.h"
#include <ui_rtp_player_dialog.h>
+#include "epan/epan_dissect.h"
+
+#include "file.h"
+#include "frame_tvbuff.h"
+
+#include "rtp_analysis_dialog.h"
#ifdef QT_MULTIMEDIA_LIB
@@ -219,17 +225,20 @@ RtpPlayerDialog::RtpPlayerDialog(QWidget &parent, CaptureFile &cf) :
ui->stopButton->setIcon(StockIcon("media-playback-stop"));
ui->stopButton->setEnabled(false);
+ inaudible_btn_ = ui->buttonBox->addButton(ui->actionInaudibleButton->text(), QDialogButtonBox::ActionRole);
+ inaudible_btn_->setToolTip(ui->actionInaudibleButton->toolTip());
+ inaudible_btn_->setEnabled(false);
+ inaudible_btn_->setMenu(ui->menuInaudible);
+
+ analyze_btn_ = RtpAnalysisDialog::addAnalyzeButton(ui->buttonBox, this);
+
+ prepare_btn_ = ui->buttonBox->addButton(ui->actionPrepareFilter->text(), QDialogButtonBox::ActionRole);
+ prepare_btn_->setToolTip(ui->actionPrepareFilter->toolTip());
+ connect(prepare_btn_, SIGNAL(pressed()), this, SLOT(on_actionPrepareFilter_triggered()));
export_btn_ = ui->buttonBox->addButton(ui->actionExportButton->text(), QDialogButtonBox::ActionRole);
export_btn_->setToolTip(ui->actionExportButton->toolTip());
export_btn_->setEnabled(false);
-
- QMenu *save_menu = new QMenu(export_btn_);
- save_menu->addAction(ui->actionSaveAudioSyncStream);
- save_menu->addAction(ui->actionSaveAudioSyncFile);
- save_menu->addSeparator();
- save_menu->addAction(ui->actionSavePayload);
- save_menu->setToolTipsVisible(true);
- export_btn_->setMenu(save_menu);
+ export_btn_->setMenu(ui->menuExport);
// Ordered, unique device names starting with the system default
QMap<QString, bool> out_device_map; // true == default device
@@ -240,6 +249,7 @@ RtpPlayerDialog::RtpPlayerDialog(QWidget &parent, CaptureFile &cf) :
}
}
+ ui->outputDeviceComboBox->blockSignals(true);
foreach (QString out_name, out_device_map.keys()) {
ui->outputDeviceComboBox->addItem(out_name);
if (out_device_map.value(out_name)) {
@@ -257,6 +267,7 @@ RtpPlayerDialog::RtpPlayerDialog(QWidget &parent, CaptureFile &cf) :
stereo_available_ = isStereoAvailable();
fillAudioRateMenu();
}
+ ui->outputDeviceComboBox->blockSignals(false);
ui->audioPlot->setMouseTracking(true);
ui->audioPlot->setEnabled(true);
@@ -271,31 +282,10 @@ RtpPlayerDialog::RtpPlayerDialog(QWidget &parent, CaptureFile &cf) :
graph_ctx_menu_->addAction(ui->actionPlay);
list_ctx_menu_->addAction(ui->actionStop);
graph_ctx_menu_->addAction(ui->actionStop);
- QMenu *selection_menu1 = list_ctx_menu_->addMenu(tr("Select"));
- QMenu *selection_menu2 = graph_ctx_menu_->addMenu(tr("Select"));
- selection_menu1->addAction(ui->actionSelectAll);
- selection_menu2->addAction(ui->actionSelectAll);
- selection_menu1->addAction(ui->actionSelectNone);
- selection_menu2->addAction(ui->actionSelectNone);
- selection_menu1->addAction(ui->actionSelectInvert);
- selection_menu2->addAction(ui->actionSelectInvert);
- QMenu *audio_routing_menu1 = list_ctx_menu_->addMenu(tr("Audio Routing"));
- QMenu *audio_routing_menu2 = graph_ctx_menu_->addMenu(tr("Audio Routing"));
- // All AudioRouting actions are in menu, some of them are disabled later
- audio_routing_menu1->addAction(ui->actionAudioRoutingMute);
- audio_routing_menu2->addAction(ui->actionAudioRoutingMute);
- audio_routing_menu1->addAction(ui->actionAudioRoutingUnmute);
- audio_routing_menu2->addAction(ui->actionAudioRoutingUnmute);
- audio_routing_menu1->addAction(ui->actionAudioRoutingMuteInvert);
- audio_routing_menu2->addAction(ui->actionAudioRoutingMuteInvert);
- audio_routing_menu1->addAction(ui->actionAudioRoutingP);
- audio_routing_menu2->addAction(ui->actionAudioRoutingP);
- audio_routing_menu1->addAction(ui->actionAudioRoutingL);
- audio_routing_menu2->addAction(ui->actionAudioRoutingL);
- audio_routing_menu1->addAction(ui->actionAudioRoutingLR);
- audio_routing_menu2->addAction(ui->actionAudioRoutingLR);
- audio_routing_menu1->addAction(ui->actionAudioRoutingR);
- audio_routing_menu2->addAction(ui->actionAudioRoutingR);
+ list_ctx_menu_->addMenu(ui->menuSelect);
+ graph_ctx_menu_->addMenu(ui->menuSelect);
+ list_ctx_menu_->addMenu(ui->menuAudioRouting);
+ graph_ctx_menu_->addMenu(ui->menuAudioRouting);
list_ctx_menu_->addAction(ui->actionRemoveStream);
graph_ctx_menu_->addAction(ui->actionRemoveStream);
list_ctx_menu_->addAction(ui->actionGoToSetupPacketTree);
@@ -419,6 +409,7 @@ void RtpPlayerDialog::rescanPackets(bool rescale_axes)
{
lockUI();
// Show information for a user - it can last long time...
+ playback_error_.clear();
ui->hintLabel->setText("<i><small>" + tr("Decoding streams...") + "</i></small>");
wsApp->processEvents();
@@ -902,6 +893,16 @@ bool RtpPlayerDialog::eventFilter(QObject *, QEvent *event)
case Qt::Key_S:
on_actionStop_triggered();
return true;
+ case Qt::Key_N:
+ if (keyEvent.modifiers() == Qt::ShiftModifier) {
+ // Shift+N
+ on_actionDeselectInaudible_triggered();
+ return true;
+ } else {
+ on_actionSelectInaudible_triggered();
+ return true;
+ }
+ break;
}
}
@@ -919,8 +920,10 @@ void RtpPlayerDialog::updateWidgets()
bool enable_pause = false;
bool enable_stop = false;
bool enable_timing = true;
+ int count = ui->streamTreeWidget->topLevelItemCount();
+ int selected = ui->streamTreeWidget->selectedItems().count();
- if (ui->streamTreeWidget->topLevelItemCount() < 1)
+ if (count < 1)
enable_play = false;
for (int row = 0; row < ui->streamTreeWidget->topLevelItemCount(); row++) {
@@ -959,6 +962,10 @@ void RtpPlayerDialog::updateWidgets()
ui->timingComboBox->setEnabled(enable_timing);
ui->todCheckBox->setEnabled(enable_timing);
+ inaudible_btn_->setEnabled(count > 0);
+ analyze_btn_->setEnabled(selected > 0);
+ prepare_btn_->setEnabled(selected > 0);
+
updateHintLabel();
ui->audioPlot->replot();
}
@@ -1452,11 +1459,17 @@ void RtpPlayerDialog::on_streamTreeWidget_itemSelectionChanged()
int selected = ui->streamTreeWidget->selectedItems().count();
if (selected == 0) {
+ analyze_btn_->setEnabled(false);
+ prepare_btn_->setEnabled(false);
export_btn_->setEnabled(false);
} else if (selected == 1) {
+ analyze_btn_->setEnabled(true);
+ prepare_btn_->setEnabled(true);
export_btn_->setEnabled(true);
ui->actionSavePayload->setEnabled(true);
} else {
+ analyze_btn_->setEnabled(true);
+ prepare_btn_->setEnabled(true);
export_btn_->setEnabled(true);
ui->actionSavePayload->setEnabled(false);
}
@@ -1704,11 +1717,13 @@ QString RtpPlayerDialog::currentOutputDeviceName()
void RtpPlayerDialog::fillAudioRateMenu()
{
+ ui->outputAudioRate->blockSignals(true);
ui->outputAudioRate->clear();
ui->outputAudioRate->addItem(tr("Automatic"));
foreach (int rate, getCurrentDeviceInfo().supportedSampleRates()) {
ui->outputAudioRate->addItem(QString::number(rate));
}
+ ui->outputAudioRate->blockSignals(false);
}
void RtpPlayerDialog::cleanupMarkerStream()
@@ -1876,10 +1891,12 @@ bool RtpPlayerDialog::isStereoAvailable()
void RtpPlayerDialog::invertSelection()
{
block_redraw_ = true;
+ ui->streamTreeWidget->blockSignals(true);
for (int row = 0; row < ui->streamTreeWidget->topLevelItemCount(); row++) {
QTreeWidgetItem *ti = ui->streamTreeWidget->topLevelItem(row);
ti->setSelected(!ti->isSelected());
}
+ ui->streamTreeWidget->blockSignals(false);
block_redraw_ = false;
ui->audioPlot->replot();
updateHintLabel();
@@ -2167,7 +2184,24 @@ save_payload_t RtpPlayerDialog::selectFilePayloadFormatAndName(QString *file_pat
return save_format;
}
-QVector<RtpAudioStream *>RtpPlayerDialog::getSelectedAudibleAudioStreams()
+QVector<rtpstream_id_t *>RtpPlayerDialog::getSelectedRtpStreamIDs()
+{
+ QList<QTreeWidgetItem *> items = ui->streamTreeWidget->selectedItems();
+ QVector<rtpstream_id_t *> ids;
+
+ if (items.count() > 0) {
+ foreach(QTreeWidgetItem *ti, items) {
+ RtpAudioStream *audio_stream = ti->data(stream_data_col_, Qt::UserRole).value<RtpAudioStream*>();
+ if (audio_stream) {
+ ids << audio_stream->getID();
+ }
+ }
+ }
+
+ return ids;
+}
+
+QVector<RtpAudioStream *>RtpPlayerDialog::getSelectedAudibleNonmutedAudioStreams()
{
QList<QTreeWidgetItem *> items = ui->streamTreeWidget->selectedItems();
QVector<RtpAudioStream *> streams;
@@ -2196,7 +2230,7 @@ void RtpPlayerDialog::saveAudio(bool sync_to_stream)
QString path;
QVector<RtpAudioStream *>streams;
- streams = getSelectedAudibleAudioStreams();
+ streams = getSelectedAudibleNonmutedAudioStreams();
if (streams.count() < 1) {
QMessageBox::warning(this, tr("Warning"), tr("No stream selected or none of selected streams provide audio"));
return;
@@ -2320,30 +2354,63 @@ void RtpPlayerDialog::on_actionSavePayload_triggered()
savePayload();
}
-#if 0
-// This also serves as a title in RtpAudioFrame.
-static const QString stream_key_tmpl_ = "%1:%2 " UTF8_RIGHTWARDS_ARROW " %3:%4 0x%5";
-const QString RtpPlayerDialog::streamKey(const rtpstream_info_t *rtpstream)
+void RtpPlayerDialog::selectInaudible(bool select)
+{
+ block_redraw_ = true;
+ ui->streamTreeWidget->blockSignals(true);
+ for (int row = 0; row < ui->streamTreeWidget->topLevelItemCount(); row++) {
+ QTreeWidgetItem *ti = ui->streamTreeWidget->topLevelItem(row);
+ RtpAudioStream *audio_stream = ti->data(stream_data_col_, Qt::UserRole).value<RtpAudioStream*>();
+ // Streams with no audio
+ if (audio_stream && (audio_stream->sampleRate()==0)) {
+ ti->setSelected(select);
+ }
+ }
+ ui->streamTreeWidget->blockSignals(false);
+ block_redraw_ = false;
+ ui->audioPlot->replot();
+ updateHintLabel();
+}
+
+void RtpPlayerDialog::on_actionSelectInaudible_triggered()
{
- const QString stream_key = QString(stream_key_tmpl_)
- .arg(address_to_display_qstring(&rtpstream->src_addr))
- .arg(rtpstream->src_port)
- .arg(address_to_display_qstring(&rtpstream->dst_addr))
- .arg(rtpstream->dst_port)
- .arg(rtpstream->ssrc, 0, 16);
- return stream_key;
+ selectInaudible(true);
}
-const QString RtpPlayerDialog::streamKey(const packet_info *pinfo, const struct _rtp_info *rtpinfo)
+void RtpPlayerDialog::on_actionDeselectInaudible_triggered()
{
- const QString stream_key = QString(stream_key_tmpl_)
- .arg(address_to_display_qstring(&pinfo->src))
- .arg(pinfo->srcport)
- .arg(address_to_display_qstring(&pinfo->dst))
- .arg(pinfo->destport)
- .arg(rtpinfo->info_sync_src, 0, 16);
- return stream_key;
+ selectInaudible(false);
}
-#endif
+
+void RtpPlayerDialog::on_actionPrepareFilter_triggered()
+{
+ QVector<rtpstream_id_t *> ids = getSelectedRtpStreamIDs();
+ QString filter = make_filter_based_on_rtpstream_id(ids);
+ if (filter.length() > 0) {
+ emit updateFilter(filter);
+ }
+}
+
+void RtpPlayerDialog::rtpAnalysisReplace()
+{
+ if (ui->streamTreeWidget->selectedItems().count() < 1) return;
+
+ emit rtpAnalysisDialogReplaceRtpStreams(getSelectedRtpStreamIDs());
+}
+
+void RtpPlayerDialog::rtpAnalysisAdd()
+{
+ if (ui->streamTreeWidget->selectedItems().count() < 1) return;
+
+ emit rtpAnalysisDialogAddRtpStreams(getSelectedRtpStreamIDs());
+}
+
+void RtpPlayerDialog::rtpAnalysisRemove()
+{
+ if (ui->streamTreeWidget->selectedItems().count() < 1) return;
+
+ emit rtpAnalysisDialogRemoveRtpStreams(getSelectedRtpStreamIDs());
+}
+
#endif // QT_MULTIMEDIA_LIB