Wireshark 4.7.3
The Wireshark network protocol analyzer
Loading...
Searching...
No Matches
rtp_audio_stream.h
Go to the documentation of this file.
1
9
10#ifndef RTPAUDIOSTREAM_H
11#define RTPAUDIOSTREAM_H
12
13#include "config.h"
14
15#ifdef QT_MULTIMEDIA_LIB
16
17#include <epan/address.h>
18#include <ui/rtp_stream.h>
21#include <ui/rtp_media.h>
22
23#include <QAudio>
24#include <QColor>
25#include <QMap>
26#include <QObject>
27#include <QSet>
28#include <QVector>
29#include <QColor>
30#include <QIODevice>
31#include <QAudioOutput>
32
33class QAudioFormat;
34class QAudioSink;
35class QIODevice;
36
37
41class RtpAudioStream : public QObject
42{
43 Q_OBJECT
44public:
48 enum TimingMode {
49 JitterBuffer,
50 RtpTimestamp,
51 Uninterrupted
52 };
53
60 explicit RtpAudioStream(QObject *parent, rtpstream_id_t *id, bool stereo_required);
61
65 ~RtpAudioStream();
66
72 bool isMatch(const rtpstream_id_t *id) const;
73
80 bool isMatch(const struct _packet_info *pinfo, const struct _rtp_info *rtp_info) const;
81
87 void addRtpPacket(const struct _packet_info *pinfo, const struct _rtp_info *rtp_info);
88
92 void clearPackets();
93
98 void reset(double global_start_time);
99
104 AudioRouting getAudioRouting();
105
110 void setAudioRouting(AudioRouting audio_routing);
111
116 void decode(QAudioDevice out_device);
117
121 void decodeVisual();
122
127 double startRelTime() const { return start_rel_time_; }
128
133 double stopRelTime() const { return stop_rel_time_; }
134
139 unsigned sampleRate() const { return first_sample_rate_; }
140
145 unsigned playRate() const { return audio_out_rate_; }
146
151 void setRequestedPlayRate(unsigned new_rate) { audio_requested_out_rate_ = new_rate; }
152
157 void setVisualSampleRate(unsigned new_rate) { visual_sample_rate_ = new_rate; }
158
163 const QStringList payloadNames() const;
164
170 const QVector<double> visualTimestamps(bool relative = true);
171
178 const QVector<double> visualSamples(int y_offset = 0);
179
185 const QVector<double> outOfSequenceTimestamps(bool relative = true);
186
191 int outOfSequence() { return static_cast<int>(out_of_seq_timestamps_.size()); }
192
198 const QVector<double> outOfSequenceSamples(int y_offset = 0);
199
205 const QVector<double> jitterDroppedTimestamps(bool relative = true);
206
211 int jitterDropped() { return static_cast<int>(jitter_drop_timestamps_.size()); }
212
218 const QVector<double> jitterDroppedSamples(int y_offset = 0);
219
225 const QVector<double> wrongTimestampTimestamps(bool relative = true);
226
231 int wrongTimestamps() { return static_cast<int>(wrong_timestamp_timestamps_.size()); }
232
238 const QVector<double> wrongTimestampSamples(int y_offset = 0);
239
245 const QVector<double> insertedSilenceTimestamps(bool relative = true);
246
251 int insertedSilences() { return static_cast<int>(silence_timestamps_.size()); }
252
258 const QVector<double> insertedSilenceSamples(int y_offset = 0);
259
266 quint32 nearestPacket(double timestamp, bool is_relative = true);
267
272 QColor color() { return color_; }
273
278 void setColor(QColor color) { color_ = color; }
279
284 QAudio::State outputState() const;
285
290 void setJitterBufferSize(int jitter_buffer_size) { jitter_buffer_size_ = jitter_buffer_size; }
291
296 void setTimingMode(TimingMode timing_mode) { timing_mode_ = timing_mode; }
297
302 void setStartPlayTime(double start_play_time) { start_play_time_ = start_play_time; }
303
309 bool prepareForPlay(QAudioDevice out_device);
310
314 void startPlaying();
315
319 void pausePlaying();
320
324 void stopPlaying();
325
330 void seekPlaying(qint64 samples);
331
336 void setStereoRequired(bool stereo_required) { stereo_required_ = stereo_required; }
337
342 qint16 getMaxSampleValue() { return max_sample_val_; }
343
348 void setMaxSampleValue(int16_t max_sample_val) { max_sample_val_ = max_sample_val; }
349
354 void seekSample(qint64 samples);
355
361 qint64 readSample(SAMPLE *sample);
362
367 qint64 getLeadSilenceSamples() { return prepend_samples_; }
368
373 qint64 getTotalSamples() { return (audio_file_->getTotalSamples()); }
374
379 qint64 getEndOfSilenceSample() { return (audio_file_->getEndOfSilenceSample()); }
380
385 double getEndOfSilenceTime() { return (double)getEndOfSilenceSample() / (double)playRate(); }
386
392 qint64 convertTimeToSamples(double time) { return (qint64)(time * playRate()); }
393
399 bool savePayload(QIODevice *file);
400
405 unsigned getHash() { return rtpstream_id_to_hash(&(id_)); }
406
411 rtpstream_id_t *getID() { return &(id_); }
412
417 QString getIDAsQString();
418
423 rtpstream_info_t *getStreamInfo() { return &rtpstream_; }
424
425signals:
430 void processedSecs(double secs);
431
436 void playbackError(const QString error_msg);
437
443 void finishedPlaying(RtpAudioStream *stream, QAudio::Error error);
444
445private:
447 rtpstream_id_t id_;
449 rtpstream_info_t rtpstream_;
451 bool first_packet_;
452
454 QVector<struct _rtp_packet *>rtp_packets_;
456 RtpAudioFile *audio_file_;
458 QIODevice *temp_file_;
460 struct _GHashTable *decoders_hash_;
462 double global_start_rel_time_;
464 double start_abs_offset_;
466 double start_rel_time_;
468 double stop_rel_time_;
470 qint64 prepend_samples_;
472 AudioRouting audio_routing_;
474 bool stereo_required_;
476 quint32 first_sample_rate_;
478 quint32 audio_out_rate_;
480 quint32 audio_requested_out_rate_;
482 uint32_t visual_sample_rate_;
484 QSet<QString> payload_names_;
486 struct SpeexResamplerState_ *visual_resampler_;
488 QMap<double, quint32> packet_timestamps_;
490 QVector<qint16> visual_samples_;
492 QVector<double> out_of_seq_timestamps_;
494 QVector<double> jitter_drop_timestamps_;
496 QVector<double> wrong_timestamp_timestamps_;
498 QVector<double> silence_timestamps_;
499
501 qint16 max_sample_val_;
502
504 qint16 max_sample_val_used_;
505
507 QColor color_;
508
510 int jitter_buffer_size_;
511
513 TimingMode timing_mode_;
514
516 double start_play_time_;
517
523 const QString formatDescription(const QAudioFormat & format);
524
529 QString currentOutputDevice();
530
532 QAudioSink *audio_output_;
533
538 void decodeAudio(QAudioDevice out_device);
539
547 quint32 calculateAudioOutRate(QAudioDevice out_device, unsigned int sample_rate, unsigned int requested_out_rate);
548
556 SAMPLE *resizeBufferIfNeeded(SAMPLE *buff, int32_t *buff_bytes, qint64 requested_size);
557
558private slots:
563 void outputStateChanged(QAudio::State new_state);
564
568 void delayedStopStream();
569};
570
571#endif // QT_MULTIMEDIA_LIB
572
573#endif // RTPAUDIOSTREAM_H
struct _rtpstream_info rtpstream_info_t
Holds all state and statistics accumulated for a single RTP stream.
struct _rtpstream_id rtpstream_id_t