Wireshark 4.7.0
The Wireshark network protocol analyzer
Loading...
Searching...
No Matches
rtp_audio_stream.h
Go to the documentation of this file.
1
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;
34#if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
35class QAudioSink;
36#else
37class QAudioOutput;
38#endif
39class QIODevice;
40
41
45class RtpAudioStream : public QObject
46{
47 Q_OBJECT
48public:
52 enum TimingMode {
53 JitterBuffer,
54 RtpTimestamp,
55 Uninterrupted
56 };
57
64 explicit RtpAudioStream(QObject *parent, rtpstream_id_t *id, bool stereo_required);
65
69 ~RtpAudioStream();
70
76 bool isMatch(const rtpstream_id_t *id) const;
77
84 bool isMatch(const struct _packet_info *pinfo, const struct _rtp_info *rtp_info) const;
85
91 void addRtpPacket(const struct _packet_info *pinfo, const struct _rtp_info *rtp_info);
92
96 void clearPackets();
97
102 void reset(double global_start_time);
103
108 AudioRouting getAudioRouting();
109
114 void setAudioRouting(AudioRouting audio_routing);
115
116#if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
121 void decode(QAudioDevice out_device);
122#else
127 void decode(QAudioDeviceInfo out_device);
128#endif
129
133 void decodeVisual();
134
139 double startRelTime() const { return start_rel_time_; }
140
145 double stopRelTime() const { return stop_rel_time_; }
146
151 unsigned sampleRate() const { return first_sample_rate_; }
152
157 unsigned playRate() const { return audio_out_rate_; }
158
163 void setRequestedPlayRate(unsigned new_rate) { audio_requested_out_rate_ = new_rate; }
164
169 void setVisualSampleRate(unsigned new_rate) { visual_sample_rate_ = new_rate; }
170
175 const QStringList payloadNames() const;
176
182 const QVector<double> visualTimestamps(bool relative = true);
183
190 const QVector<double> visualSamples(int y_offset = 0);
191
197 const QVector<double> outOfSequenceTimestamps(bool relative = true);
198
203 int outOfSequence() { return static_cast<int>(out_of_seq_timestamps_.size()); }
204
210 const QVector<double> outOfSequenceSamples(int y_offset = 0);
211
217 const QVector<double> jitterDroppedTimestamps(bool relative = true);
218
223 int jitterDropped() { return static_cast<int>(jitter_drop_timestamps_.size()); }
224
230 const QVector<double> jitterDroppedSamples(int y_offset = 0);
231
237 const QVector<double> wrongTimestampTimestamps(bool relative = true);
238
243 int wrongTimestamps() { return static_cast<int>(wrong_timestamp_timestamps_.size()); }
244
250 const QVector<double> wrongTimestampSamples(int y_offset = 0);
251
257 const QVector<double> insertedSilenceTimestamps(bool relative = true);
258
263 int insertedSilences() { return static_cast<int>(silence_timestamps_.size()); }
264
270 const QVector<double> insertedSilenceSamples(int y_offset = 0);
271
278 quint32 nearestPacket(double timestamp, bool is_relative = true);
279
284 QColor color() { return color_; }
285
290 void setColor(QColor color) { color_ = color; }
291
296 QAudio::State outputState() const;
297
302 void setJitterBufferSize(int jitter_buffer_size) { jitter_buffer_size_ = jitter_buffer_size; }
303
308 void setTimingMode(TimingMode timing_mode) { timing_mode_ = timing_mode; }
309
314 void setStartPlayTime(double start_play_time) { start_play_time_ = start_play_time; }
315
316#if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
322 bool prepareForPlay(QAudioDevice out_device);
323#else
329 bool prepareForPlay(QAudioDeviceInfo out_device);
330#endif
331
335 void startPlaying();
336
340 void pausePlaying();
341
345 void stopPlaying();
346
351 void seekPlaying(qint64 samples);
352
357 void setStereoRequired(bool stereo_required) { stereo_required_ = stereo_required; }
358
363 qint16 getMaxSampleValue() { return max_sample_val_; }
364
369 void setMaxSampleValue(int16_t max_sample_val) { max_sample_val_ = max_sample_val; }
370
375 void seekSample(qint64 samples);
376
382 qint64 readSample(SAMPLE *sample);
383
388 qint64 getLeadSilenceSamples() { return prepend_samples_; }
389
394 qint64 getTotalSamples() { return (audio_file_->getTotalSamples()); }
395
400 qint64 getEndOfSilenceSample() { return (audio_file_->getEndOfSilenceSample()); }
401
406 double getEndOfSilenceTime() { return (double)getEndOfSilenceSample() / (double)playRate(); }
407
413 qint64 convertTimeToSamples(double time) { return (qint64)(time * playRate()); }
414
420 bool savePayload(QIODevice *file);
421
426 unsigned getHash() { return rtpstream_id_to_hash(&(id_)); }
427
432 rtpstream_id_t *getID() { return &(id_); }
433
438 QString getIDAsQString();
439
444 rtpstream_info_t *getStreamInfo() { return &rtpstream_; }
445
446signals:
451 void processedSecs(double secs);
452
457 void playbackError(const QString error_msg);
458
464 void finishedPlaying(RtpAudioStream *stream, QAudio::Error error);
465
466private:
468 rtpstream_id_t id_;
470 rtpstream_info_t rtpstream_;
472 bool first_packet_;
473
475 QVector<struct _rtp_packet *>rtp_packets_;
477 RtpAudioFile *audio_file_;
479 QIODevice *temp_file_;
481 struct _GHashTable *decoders_hash_;
483 double global_start_rel_time_;
485 double start_abs_offset_;
487 double start_rel_time_;
489 double stop_rel_time_;
491 qint64 prepend_samples_;
493 AudioRouting audio_routing_;
495 bool stereo_required_;
497 quint32 first_sample_rate_;
499 quint32 audio_out_rate_;
501 quint32 audio_requested_out_rate_;
503 uint32_t visual_sample_rate_;
505 QSet<QString> payload_names_;
507 struct SpeexResamplerState_ *visual_resampler_;
509 QMap<double, quint32> packet_timestamps_;
511 QVector<qint16> visual_samples_;
513 QVector<double> out_of_seq_timestamps_;
515 QVector<double> jitter_drop_timestamps_;
517 QVector<double> wrong_timestamp_timestamps_;
519 QVector<double> silence_timestamps_;
520
522 qint16 max_sample_val_;
523
525 qint16 max_sample_val_used_;
526
528 QColor color_;
529
531 int jitter_buffer_size_;
532
534 TimingMode timing_mode_;
535
537 double start_play_time_;
538
544 const QString formatDescription(const QAudioFormat & format);
545
550 QString currentOutputDevice();
551
552#if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
554 QAudioSink *audio_output_;
555
560 void decodeAudio(QAudioDevice out_device);
561
569 quint32 calculateAudioOutRate(QAudioDevice out_device, unsigned int sample_rate, unsigned int requested_out_rate);
570#else
572 QAudioOutput *audio_output_;
573
578 void decodeAudio(QAudioDeviceInfo out_device);
579
587 quint32 calculateAudioOutRate(QAudioDeviceInfo out_device, unsigned int sample_rate, unsigned int requested_out_rate);
588#endif
589
597 SAMPLE *resizeBufferIfNeeded(SAMPLE *buff, int32_t *buff_bytes, qint64 requested_size);
598
599private slots:
604 void outputStateChanged(QAudio::State new_state);
605
609 void delayedStopStream();
610};
611
612#endif // QT_MULTIMEDIA_LIB
613
614#endif // RTPAUDIOSTREAM_H
Encapsulates the mute state and channel assignment for one audio stream.
Definition rtp_audio_routing.h:35
A QIODevice subclass that handles reading and writing of RTP audio files and frames.
Definition rtp_audio_file.h:49
Represents the metadata and indexing information for a single captured frame.
Definition packet_info.h:43
Definition packet-rtp.h:29
Definition rtp_stream_id.h:33
Holds all state and statistics accumulated for a single RTP stream.
Definition rtp_stream.h:42
Definition stream.c:41