wireshark/ui/rtp_media.h
Jirka Novak 37f3c65ca5 rtp_analysis_dialog.cpp: save any supported codec as .au
Change improves Wireshark ability to save rtp streams. It allows a user
to save any supported codec with 8 kHz rate. In real, it means G.711 and
G.729 for now.
There is no hardcoded codec limitation during save anymore. If code detects
unsupported codec or rate during save, it replaces samples with silence and
reports it. Therefore any added codec in future will be supported.

Note to RTP saving:
RTP streams (there can be up to two of them for save) can contain multiple
codecs in each direction - some of it can be supported and some
unsupported. What should be exported then?
Till my patch save do not run and a user received nothing even part of stream
was OK/encoded with supported codec.
Therefore I managed the code to start with export and do its best.
Unknown codec/part is replaced with silence and user is warned after
export. Therefore a user will get:
a) audio - when all codecs are supported (no warning)
b) mix audio/silence - when some codecs are supported (warning)
c) only silence - when no codec is supported (warning)

BTW same output user sees/gets in RTP player for years.

Change-Id: Id938d419f5841af46d2d2d3ddfaf1ec9a0235bcc
Reviewed-on: https://code.wireshark.org/review/35105
Petri-Dish: Roland Knall <rknall@gmail.com>
Tested-by: Petri Dish Buildbot
Reviewed-by: Roland Knall <rknall@gmail.com>
2019-11-21 16:06:49 +00:00

94 lines
2.8 KiB
C

/* rtp_media.h
*
* RTP decoding routines for Wireshark.
* Copied from ui/gtk/rtp_player.c
*
* Copyright 2006, Alejandro Vaquero <alejandrovaquero@yahoo.com>
*
* Wireshark - Network traffic analyzer
* By Gerald Combs <gerald@wireshark.org>
* Copyright 1999 Gerald Combs
*
* SPDX-License-Identifier: GPL-2.0-or-later
*/
#ifndef __RTP_MEDIA_H__
#define __RTP_MEDIA_H__
/** @file
* "RTP Player" dialog box common routines.
* @ingroup main_ui_group
*/
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
#include <glib.h>
/****************************************************************************/
/* INTERFACE */
/****************************************************************************/
typedef gint16 SAMPLE;
#define SAMPLE_MAX G_MAXINT16
#define SAMPLE_MIN G_MININT16
/* Defines an RTP packet */
typedef struct _rtp_packet {
guint32 frame_num; /* Qt only */
struct _rtp_info *info; /* the RTP dissected info */
double arrive_offset; /* arrive offset time since the beginning of the stream as ms in GTK UI and s in Qt UI */
guint8* payload_data;
} rtp_packet_t;
/** Create a new hash table.
*
* @return A new hash table suitable for passing to decode_rtp_packet.
*/
GHashTable *rtp_decoder_hash_table_new(void);
/** Decode payload from an RTP packet
*
* @param payload_type Payload number
* @param payload_type_str Payload name, can be NULL
* @param payload_data Payload
* @param payload_len Length of payload
* @param out_buff Output audio samples.
* @param decoders_hash Hash table created with rtp_decoder_hash_table_new.
* @param channels_ptr If non-NULL, receives the number of channels in the sample.
* @param sample_rate_ptr If non-NULL, receives the sample rate.
* @return The number of decoded bytes on success, 0 on failure.
*/
size_t decode_rtp_packet_payload(guint8 payload_type, const gchar *payload_type_str, guint8 *payload_data, size_t payload_len, SAMPLE **out_buff, GHashTable *decoders_hash, guint *channels_ptr, guint *sample_rate_ptr);
/** Decode an RTP packet
*
* @param rp Wrapper for per-packet RTP tap data.
* @param out_buff Output audio samples.
* @param decoders_hash Hash table created with rtp_decoder_hash_table_new.
* @param channels_ptr If non-NULL, receives the number of channels in the sample.
* @param sample_rate_ptr If non-NULL, receives the sample rate.
* @return The number of decoded bytes on success, 0 on failure.
*/
size_t decode_rtp_packet(rtp_packet_t *rp, SAMPLE **out_buff, GHashTable *decoders_hash, guint *channels_ptr, guint *sample_rate_ptr);
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* __RTP_MEDIA_H__ */
/*
* Editor modelines - https://www.wireshark.org/tools/modelines.html
*
* Local variables:
* c-basic-offset: 4
* tab-width: 8
* indent-tabs-mode: nil
* End:
*
* vi: set shiftwidth=4 tabstop=8 expandtab:
* :indentSize=4:tabSize=8:noTabs=true:
*/