diff options
author | Tomas Kukosa <tomas.kukosa@siemens.com> | 2007-12-28 13:01:55 +0000 |
---|---|---|
committer | Tomas Kukosa <tomas.kukosa@siemens.com> | 2007-12-28 13:01:55 +0000 |
commit | 487792b348faebb252f1a8be8bc0e274086d4da9 (patch) | |
tree | c883f5f46893e36400f0405857f83d0f51938261 /gtk | |
parent | 3963febfa14f0acd2d7a6826e129579ab42239c3 (diff) | |
download | wireshark-487792b348faebb252f1a8be8bc0e274086d4da9.tar.gz |
save RTP in 16-bit linear PCM instead of 8-bit G.711 u-Law
(preparation for more codecs support via codec plugins)
svn path=/trunk/; revision=23961
Diffstat (limited to 'gtk')
-rw-r--r-- | gtk/rtp_analysis.c | 82 |
1 files changed, 35 insertions, 47 deletions
diff --git a/gtk/rtp_analysis.c b/gtk/rtp_analysis.c index a4bdf39a27..cfa2f02549 100644 --- a/gtk/rtp_analysis.c +++ b/gtk/rtp_analysis.c @@ -46,6 +46,7 @@ #include <epan/epan_dissect.h> #include <epan/filesystem.h> +#include <epan/pint.h> #include "util.h" #include <epan/tap.h> @@ -2503,8 +2504,8 @@ static gboolean copy_file(gchar *dest, gint channels, gint format, user_data_t * int to_fd, forw_fd, rev_fd, fread = 0, rread = 0, fwritten, rwritten; gchar f_pd[1] = {0}; gchar r_pd[1] = {0}; - gint16 tmp; - gchar pd[1]; + gint16 sample; + gchar pd[4]; guint32 f_write_silence = 0; guint32 r_write_silence = 0; progdlg_t *progbar; @@ -2529,42 +2530,29 @@ static gboolean copy_file(gchar *dest, gint channels, gint format, user_data_t * return FALSE; } - progbar = create_progress_dlg("Saving voice in a file", dest, TRUE, - &stop_flag); + progbar = create_progress_dlg("Saving voice in a file", dest, TRUE, &stop_flag); if (format == SAVE_AU_FORMAT) /* au format */ { /* First we write the .au header. XXX Hope this is endian independant */ /* the magic word 0x2e736e64 == .snd */ - *pd = (unsigned char)0x2e; nchars=eth_write(to_fd, pd, 1); - *pd = (unsigned char)0x73; nchars=eth_write(to_fd, pd, 1); - *pd = (unsigned char)0x6e; nchars=eth_write(to_fd, pd, 1); - *pd = (unsigned char)0x64; nchars=eth_write(to_fd, pd, 1); + phtonl(pd, 0x2e736e64); + nchars=eth_write(to_fd, pd, 4); /* header offset == 24 bytes */ - *pd = (unsigned char)0x00; nchars=eth_write(to_fd, pd, 1); - nchars=eth_write(to_fd, pd, 1); - nchars=eth_write(to_fd, pd, 1); - *pd = (unsigned char)0x18; nchars=eth_write(to_fd, pd, 1); + phtonl(pd, 24); + nchars=eth_write(to_fd, pd, 4); /* total length, it is permited to set this to 0xffffffff */ - *pd = (unsigned char)0xff; nchars=eth_write(to_fd, pd, 1); - nchars=eth_write(to_fd, pd, 1); - nchars=eth_write(to_fd, pd, 1); - nchars=eth_write(to_fd, pd, 1); - /* encoding format == 8 bit ulaw */ - *pd = (unsigned char)0x00; nchars=eth_write(to_fd, pd, 1); - nchars=eth_write(to_fd, pd, 1); - nchars=eth_write(to_fd, pd, 1); - *pd = (unsigned char)0x01; nchars=eth_write(to_fd, pd, 1); + phtonl(pd, -1); + nchars=eth_write(to_fd, pd, 4); + /* encoding format == 16-bit linear PCM */ + phtonl(pd, 3); + nchars=eth_write(to_fd, pd, 4); /* sample rate == 8000 Hz */ - *pd = (unsigned char)0x00; nchars=eth_write(to_fd, pd, 1); - nchars=eth_write(to_fd, pd, 1); - *pd = (unsigned char)0x1f; nchars=eth_write(to_fd, pd, 1); - *pd = (unsigned char)0x40; nchars=eth_write(to_fd, pd, 1); + phtonl(pd, 8000); + nchars=eth_write(to_fd, pd, 4); /* channels == 1 */ - *pd = (unsigned char)0x00; nchars=eth_write(to_fd, pd, 1); - nchars=eth_write(to_fd, pd, 1); - nchars=eth_write(to_fd, pd, 1); - *pd = (unsigned char)0x01; nchars=eth_write(to_fd, pd, 1); + phtonl(pd, 1); + nchars=eth_write(to_fd, pd, 4); switch (channels) { @@ -2583,11 +2571,12 @@ static gboolean copy_file(gchar *dest, gint channels, gint format, user_data_t * count++; if (user_data->forward.statinfo.pt == PT_PCMU){ - *pd = *f_pd; + sample = ulaw2linear(*f_pd); + phtons(pd, sample); } else if(user_data->forward.statinfo.pt == PT_PCMA){ - tmp = (gint16 )alaw2linear(*f_pd); - *pd = (unsigned char)linear2ulaw(tmp); + sample = alaw2linear(*f_pd); + phtons(pd, sample); } else{ eth_close(forw_fd); @@ -2597,8 +2586,8 @@ static gboolean copy_file(gchar *dest, gint channels, gint format, user_data_t * return FALSE; } - fwritten = eth_write(to_fd, pd, 1); - if ((fwritten < fread) || (fwritten < 0) || (fread < 0)) { + fwritten = eth_write(to_fd, pd, 2); + if ((fwritten < 2) || (fwritten < 0) || (fread < 0)) { eth_close(forw_fd); eth_close(rev_fd); eth_close(to_fd); @@ -2623,11 +2612,12 @@ static gboolean copy_file(gchar *dest, gint channels, gint format, user_data_t * count++; if (user_data->forward.statinfo.pt == PT_PCMU){ - *pd = *r_pd; + sample = ulaw2linear(*f_pd); + phtons(pd, sample); } else if(user_data->forward.statinfo.pt == PT_PCMA){ - tmp = (gint16 )alaw2linear(*r_pd); - *pd = (unsigned char)linear2ulaw(tmp); + sample = alaw2linear(*f_pd); + phtons(pd, sample); } else{ eth_close(forw_fd); @@ -2637,8 +2627,8 @@ static gboolean copy_file(gchar *dest, gint channels, gint format, user_data_t * return FALSE; } - rwritten = eth_write(to_fd, pd, 1); - if ((rwritten < rread) || (rwritten < 0) || (rread < 0)) { + rwritten = eth_write(to_fd, pd, 2); + if ((rwritten < 2) || (rwritten < 0) || (rread < 0)) { eth_close(forw_fd); eth_close(rev_fd); eth_close(to_fd); @@ -2706,14 +2696,12 @@ static gboolean copy_file(gchar *dest, gint channels, gint format, user_data_t * if ((rread == 0) && (fread == 0)) break; if ((user_data->forward.statinfo.pt == PT_PCMU) && (user_data->reversed.statinfo.pt == PT_PCMU)){ - tmp = ulaw2linear(*r_pd); - tmp += ulaw2linear(*f_pd); - *pd = (unsigned char)linear2ulaw(tmp/2); + sample = (ulaw2linear(*r_pd) + ulaw2linear(*f_pd)) / 2; + phtons(pd, sample); } else if((user_data->forward.statinfo.pt == PT_PCMA) && (user_data->reversed.statinfo.pt == PT_PCMA)){ - tmp = alaw2linear(*r_pd); - tmp += alaw2linear(*f_pd); - *pd = (unsigned char)linear2ulaw(tmp/2); + sample = (alaw2linear(*r_pd) + alaw2linear(*f_pd)) / 2; + phtons(pd, sample); } else { @@ -2725,8 +2713,8 @@ static gboolean copy_file(gchar *dest, gint channels, gint format, user_data_t * } - rwritten = eth_write(to_fd, pd, 1); - if ((rwritten < 0) || (rread < 0) || (fread < 0)) { + rwritten = eth_write(to_fd, pd, 2); + if ((rwritten < 2) || (rread < 0) || (fread < 0)) { eth_close(forw_fd); eth_close(rev_fd); eth_close(to_fd); |