Wireshark  2.9.0-477-g68ec514b
The Wireshark network protocol analyzer
rtp_audio_stream.h
1 /* rtp_audio_stream.h
2  *
3  * Wireshark - Network traffic analyzer
4  * By Gerald Combs <gerald@wireshark.org>
5  * Copyright 1998 Gerald Combs
6  *
7  * SPDX-License-Identifier: GPL-2.0-or-later
8  */
9 
10 #ifndef RTPAUDIOSTREAM_H
11 #define RTPAUDIOSTREAM_H
12 
13 #include "config.h"
14 
15 #ifdef QT_MULTIMEDIA_LIB
16 
17 #include <glib.h>
18 
19 #include <epan/address.h>
20 
21 #include <QAudio>
22 #include <QColor>
23 #include <QMap>
24 #include <QObject>
25 #include <QSet>
26 #include <QVector>
27 
28 class QAudioFormat;
29 class QAudioOutput;
30 class QTemporaryFile;
31 
32 struct _rtp_info;
33 struct _rtp_stream_info;
34 struct _rtp_sample;
35 
36 class RtpAudioStream : public QObject
37 {
38  Q_OBJECT
39 public:
40  enum TimingMode { JitterBuffer, RtpTimestamp, Uninterrupted };
41 
42  explicit RtpAudioStream(QObject *parent, struct _rtp_stream_info *rtp_stream);
43  ~RtpAudioStream();
44  bool isMatch(const struct _rtp_stream_info *rtp_stream) const;
45  bool isMatch(const struct _packet_info *pinfo, const struct _rtp_info *rtp_info) const;
46  void addRtpStream(const struct _rtp_stream_info *rtp_stream);
47  void addRtpPacket(const struct _packet_info *pinfo, const struct _rtp_info *rtp_info);
48  void reset(double start_rel_time);
49  void decode();
50 
51  double startRelTime() const { return start_rel_time_; }
52  double stopRelTime() const { return stop_rel_time_; }
53  unsigned sampleRate() const { return audio_out_rate_; }
54  const QStringList payloadNames() const;
55 
60  const QVector<double> visualTimestamps(bool relative = true);
67  const QVector<double> visualSamples(int y_offset = 0);
68 
73  const QVector<double> outOfSequenceTimestamps(bool relative = true);
74  int outOfSequence() { return out_of_seq_timestamps_.size(); }
80  const QVector<double> outOfSequenceSamples(int y_offset = 0);
81 
86  const QVector<double> jitterDroppedTimestamps(bool relative = true);
87  int jitterDropped() { return jitter_drop_timestamps_.size(); }
93  const QVector<double> jitterDroppedSamples(int y_offset = 0);
94 
99  const QVector<double> wrongTimestampTimestamps(bool relative = true);
100  int wrongTimestamps() { return wrong_timestamp_timestamps_.size(); }
106  const QVector<double> wrongTimestampSamples(int y_offset = 0);
107 
112  const QVector<double> insertedSilenceTimestamps(bool relative = true);
113  int insertedSilences() { return silence_timestamps_.size(); }
119  const QVector<double> insertedSilenceSamples(int y_offset = 0);
120 
121  quint32 nearestPacket(double timestamp, bool is_relative = true);
122 
123  QRgb color() { return color_; }
124  void setColor(QRgb color) { color_ = color; }
125 
126  QAudio::State outputState() const;
127 
128  void setJitterBufferSize(int jitter_buffer_size) { jitter_buffer_size_ = jitter_buffer_size; }
129  void setTimingMode(TimingMode timing_mode) { timing_mode_ = timing_mode; }
130 
131 signals:
132  void startedPlaying();
133  void processedSecs(double secs);
134  void playbackError(const QString error_msg);
135  void finishedPlaying();
136 
137 public slots:
138  void startPlaying();
139  void stopPlaying();
140 
141 private:
142  // Used to identify unique streams.
143  // The GTK+ UI also uses the call number + current channel.
144  address src_addr_;
145  quint16 src_port_;
146  address dst_addr_;
147  quint16 dst_port_;
148  quint32 ssrc_;
149 
150  QVector<struct _rtp_packet *>rtp_packets_;
151  QTemporaryFile *tempfile_;
152  struct _GHashTable *decoders_hash_;
153  QList<const struct _rtp_stream_info *>rtp_streams_;
154  double global_start_rel_time_;
155  double start_abs_offset_;
156  double start_rel_time_;
157  double stop_rel_time_;
158  quint32 audio_out_rate_;
159  QSet<QString> payload_names_;
160  struct SpeexResamplerState_ *audio_resampler_;
161  struct SpeexResamplerState_ *visual_resampler_;
162  QAudioOutput *audio_output_;
163  QMap<double, quint32> packet_timestamps_;
164  QVector<qint16> visual_samples_;
165  QVector<double> out_of_seq_timestamps_;
166  QVector<double> jitter_drop_timestamps_;
167  QVector<double> wrong_timestamp_timestamps_;
168  QVector<double> silence_timestamps_;
169  qint16 max_sample_val_;
170  QRgb color_;
171 
172  int jitter_buffer_size_;
173  TimingMode timing_mode_;
174 
175  void writeSilence(int samples);
176  const QString formatDescription(const QAudioFormat & format);
177  QString currentOutputDevice();
178 
179 private slots:
180  void outputStateChanged(QAudio::State new_state);
181  void outputNotify();
182 };
183 
184 #endif // QT_MULTIMEDIA_LIB
185 
186 #endif // RTPAUDIOSTREAM_H
187 
188 /*
189  * Editor modelines
190  *
191  * Local Variables:
192  * c-basic-offset: 4
193  * tab-width: 8
194  * indent-tabs-mode: nil
195  * End:
196  *
197  * ex: set shiftwidth=4 tabstop=8 expandtab:
198  * :indentSize=4:tabSize=8:noTabs=true:
199  */
Definition: packet_info.h:44
Definition: resample.c:113
Definition: packet-rtp.h:26
Definition: rtp_stream.h:36
Definition: address.h:47