summaryrefslogtreecommitdiff
path: root/asn1/mpeg-audio/packet-mpeg-audio-template.c
diff options
context:
space:
mode:
authorJörg Mayer <jmayer@loplof.de>2007-10-09 17:59:22 +0000
committerJörg Mayer <jmayer@loplof.de>2007-10-09 17:59:22 +0000
commit8f83b34f60d7bd1b41e9e4e871645b25ad28e437 (patch)
tree3bf9b0f492074eeeb8bbaebe6abd9040f4b38b94 /asn1/mpeg-audio/packet-mpeg-audio-template.c
parent03eee8b93096d6f9b10cc2c00e18a39a7166527d (diff)
downloadwireshark-8f83b34f60d7bd1b41e9e4e871645b25ad28e437.tar.gz
Rename mpeg to mpeg-audio, mpeg-pes got its own
dir already svn path=/trunk/; revision=23114
Diffstat (limited to 'asn1/mpeg-audio/packet-mpeg-audio-template.c')
-rw-r--r--asn1/mpeg-audio/packet-mpeg-audio-template.c203
1 files changed, 203 insertions, 0 deletions
diff --git a/asn1/mpeg-audio/packet-mpeg-audio-template.c b/asn1/mpeg-audio/packet-mpeg-audio-template.c
new file mode 100644
index 0000000000..33597b99fd
--- /dev/null
+++ b/asn1/mpeg-audio/packet-mpeg-audio-template.c
@@ -0,0 +1,203 @@
+/* MPEG audio packet decoder.
+ * Written by Shaun Jackman <sjackman@gmail.com>.
+ * Copyright 2007 Shaun Jackman
+ *
+ * $Id$
+ *
+ * Wireshark - Network traffic analyzer
+ * By Gerald Combs <gerald@wireshark.org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdio.h>
+#include <string.h>
+
+#include <glib.h>
+
+#include <epan/packet.h>
+#include <epan/prefs.h>
+#include <epan/asn1.h>
+
+#include <wiretap/mpeg-audio.h>
+
+#include "packet-per.h"
+
+#include "packet-mpeg-audio-hf.c"
+#include "packet-mpeg-audio-ett.c"
+#include "packet-mpeg-audio-fn.c"
+
+static int proto_mpeg_audio = -1;
+
+static int hf_mpeg_audio = -1;
+static int hf_mpeg_audio_data = -1;
+static int hf_mpeg_audio_padbytes = -1;
+static int hf_id3v1 = -1;
+static int hf_id3v2 = -1;
+
+static gboolean
+dissect_mpeg_audio_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
+{
+ guint32 h;
+ struct mpa mpa;
+ size_t data_size = 0;
+ asn1_ctx_t asn1_ctx;
+ int offset = 0;
+
+ if (!tvb_bytes_exist(tvb, 0, 4))
+ return FALSE; /* not enough data for an MPEG audio frame */
+
+ h = tvb_get_ntohl(tvb, 0);
+ MPA_UNMARSHAL(&mpa, h);
+ if (!MPA_SYNC_VALID(&mpa))
+ return FALSE;
+ if (!MPA_VERSION_VALID(&mpa))
+ return FALSE;
+ if (!MPA_LAYER_VALID(&mpa))
+ return FALSE;
+
+ if (check_col(pinfo->cinfo, COL_PROTOCOL)) {
+ static const char *version_names[] = { "1", "2", "2.5" };
+ col_add_fstr(pinfo->cinfo, COL_PROTOCOL,
+ "MPEG-%s", version_names[MPA_VERSION(&mpa)]);
+ }
+ if (check_col(pinfo->cinfo, COL_INFO))
+ col_add_fstr(pinfo->cinfo, COL_INFO,
+ "Audio Layer %d", MPA_LAYER(&mpa) + 1);
+ if (MPA_BITRATE_VALID(&mpa) && MPA_FREQUENCY_VALID(&mpa)) {
+ data_size = MPA_DATA_BYTES(&mpa) - sizeof mpa;
+ if (check_col(pinfo->cinfo, COL_DEF_SRC)) {
+ SET_ADDRESS(&pinfo->src, AT_NONE, 0, NULL);
+ col_add_fstr(pinfo->cinfo, COL_DEF_SRC,
+ "%d kb/s", MPA_BITRATE(&mpa) / 1000);
+ }
+ if (check_col(pinfo->cinfo, COL_DEF_DST)) {
+ SET_ADDRESS(&pinfo->dst, AT_NONE, 0, NULL);
+ col_add_fstr(pinfo->cinfo, COL_DEF_DST,
+ "%g kHz", MPA_FREQUENCY(&mpa) / (float)1000);
+ }
+ }
+
+ if (tree == NULL)
+ return TRUE;
+
+ asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, TRUE, pinfo);
+ offset = dissect_mpeg_audio_Audio(tvb, offset, &asn1_ctx,
+ tree, hf_mpeg_audio);
+ if (data_size > 0) {
+ unsigned int padding;
+
+ proto_tree_add_item(tree, hf_mpeg_audio_data, tvb,
+ offset / 8, data_size, FALSE);
+ offset += data_size * 8;
+ padding = MPA_PADDING(&mpa);
+ if (padding > 0) {
+ proto_tree_add_item(tree, hf_mpeg_audio_padbytes, tvb,
+ offset / 8, padding, FALSE);
+ offset += padding * 8;
+ }
+ }
+ return TRUE;
+}
+
+static void
+dissect_id3v1(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
+{
+ asn1_ctx_t asn1_ctx;
+
+ if (check_col(pinfo->cinfo, COL_PROTOCOL))
+ col_set_str(pinfo->cinfo, COL_PROTOCOL, "ID3v1");
+ if (check_col(pinfo->cinfo, COL_INFO))
+ col_clear(pinfo->cinfo, COL_INFO);
+ if (tree == NULL)
+ return;
+ asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, TRUE, pinfo);
+ dissect_mpeg_audio_ID3v1(tvb, 0, &asn1_ctx,
+ tree, hf_id3v1);
+}
+
+static void
+dissect_id3v2(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
+{
+ if (check_col(pinfo->cinfo, COL_PROTOCOL))
+ col_set_str(pinfo->cinfo, COL_PROTOCOL, "ID3v2");
+ if (check_col(pinfo->cinfo, COL_INFO))
+ col_clear(pinfo->cinfo, COL_INFO);
+ proto_tree_add_item(tree, hf_id3v2, tvb,
+ 0, -1, FALSE);
+}
+
+static gboolean
+dissect_mpeg_audio(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
+{
+ int magic;
+
+ if (!tvb_bytes_exist(tvb, 0, 3))
+ return FALSE; /* not enough data for an ID tag or audio frame */
+ magic = tvb_get_ntoh24(tvb, 0);
+ switch (magic) {
+ case 0x544147: /* TAG */
+ dissect_id3v1(tvb, pinfo, tree);
+ return TRUE;
+ case 0x494433: /* ID3 */
+ dissect_id3v2(tvb, pinfo, tree);
+ return TRUE;
+ default:
+ return dissect_mpeg_audio_frame(tvb, pinfo, tree);
+ }
+}
+
+void
+proto_register_mpeg_audio(void)
+{
+ static hf_register_info hf[] = {
+#include "packet-mpeg-audio-hfarr.c"
+ { &hf_mpeg_audio,
+ { "MPEG Audio", "mpeg.audio",
+ FT_NONE, BASE_NONE, NULL, 0, NULL, HFILL }},
+ { &hf_mpeg_audio_data,
+ { "Data", "mpeg.audio.data",
+ FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL }},
+ { &hf_mpeg_audio_padbytes,
+ { "Padding", "mpeg.audio.padbytes",
+ FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL }},
+
+ { &hf_id3v1,
+ { "ID3v1", "id3v1",
+ FT_NONE, BASE_NONE, NULL, 0, NULL, HFILL }},
+ { &hf_id3v2,
+ { "ID3v2", "id3v2",
+ FT_NONE, BASE_NONE, NULL, 0, NULL, HFILL }},
+ };
+
+ static gint *ett[] = {
+#include "packet-mpeg-audio-ettarr.c"
+ };
+
+ proto_mpeg_audio = proto_register_protocol(
+ "Moving Picture Experts Group Audio", "MPEG Audio", "mpeg.audio");
+ proto_register_field_array(proto_mpeg_audio, hf, array_length(hf));
+ proto_register_subtree_array(ett, array_length(ett));
+}
+
+void
+proto_reg_handoff_mpeg_audio(void)
+{
+ heur_dissector_add("mpeg", dissect_mpeg_audio, proto_mpeg_audio);
+}