Wireshark-dev: Re: [Wireshark-dev] asn1: New MPEG dissector
From: "ronnie sahlberg" <ronniesahlberg@xxxxxxxxx>
Date: Sat, 26 Aug 2006 00:42:01 +0000
the wiretap files... On 8/26/06, ronnie sahlberg <ronniesahlberg@xxxxxxxxx> wrote:
can you also confirm that the wiretap fiel to read the mpeg file
format is also GPL if so i will check it in
On 8/25/06, Shaun Jackman <sjackman@xxxxxxxxx> wrote:
> This patch posts only the asn1 portion of the previous MPEG patch. It
> omits the plugins/mpeg/* portion. It also adds a GPL license to the
> two new files.
>
> Cheers,
> Shaun
>
> Signed-off-by: Shaun Jackman <sjackman@xxxxxxxxx>
>
> 2006-08-25 Shaun Jackman <sjackman@xxxxxxxxx>
>
> * asn1/mpeg/Makefile: New file.
> * asn1/mpeg/mpeg.asn: Ditto.
> * asn1/mpeg/packet-mpeg-template.c: Ditto.
> * epan/dissectors/packet-mpeg.c: Regenerate.
> * epan/dissectors/Makefile.in: Regenerate.
>
> diff --unidirectional-new-file -urXX
> wireshark-0.99.2.orig/asn1/mpeg/Makefile
> wireshark-0.99.2/asn1/mpeg/Makefile
> --- wireshark-0.99.2.orig/asn1/mpeg/Makefile 1969-12-31 17:00:00.000000000
> -0700
> +++ wireshark-0.99.2/asn1/mpeg/Makefile 2006-08-15 15:58:43.000000000
-0600
> @@ -0,0 +1,14 @@
> +DISSECTOR_FILES=packet-mpeg.c
> +
> +all: generate_dissector
> +
> +generate_dissector: $(DISSECTOR_FILES)
> +
> +$(DISSECTOR_FILES): ../../tools/asn2wrs.py mpeg.asn
packet-mpeg-template.c
> + python ../../tools/asn2wrs.py -e -p mpeg -s packet-mpeg-template
mpeg.asn
> +
> +clean:
> + rm -f parsetab.py parsetab.pyc $(DISSECTOR_FILES)
> +
> +copy_files: generate_dissector
> + cp $(DISSECTOR_FILES) ../../epan/dissectors
> diff --unidirectional-new-file -urXX
> wireshark-0.99.2.orig/asn1/mpeg/mpeg.asn
> wireshark-0.99.2/asn1/mpeg/mpeg.asn
> --- wireshark-0.99.2.orig/asn1/mpeg/mpeg.asn 1969-12-31 17:00:00.000000000
> -0700
> +++ wireshark-0.99.2/asn1/mpeg/mpeg.asn 2006-08-25 16:53:17.000000000
-0600
> @@ -0,0 +1,42 @@
> +-- ASN description of MPEG
> +-- Written by Shaun Jackman <sjackman@xxxxxxxxx>
> +-- Copyright 2006 Shaun Jackman
> +--
> +-- This program is free software; you can redistribute it and/or
> +-- modify it under the terms of the GNU General Public License.
> +
> +MPEG DEFINITIONS ::= BEGIN
> +
> +Audio ::= SEQUENCE {
> + sync BIT STRING (SIZE (11)),
> + version ENUMERATED
> + { mpeg-2-5(0), reserved(1), mpeg-2(2), mpeg-1(3) },
> + layer ENUMERATED
> + { reserved(0), layer-3(1), layer-2(2), layer-1(3) },
> + protection ENUMERATED { crc(0), none(1) },
> + bitrate INTEGER (0..15),
> + frequency INTEGER (0..3),
> + padding BOOLEAN,
> + private BOOLEAN,
> + channel-mode ENUMERATED
> + { stereo(0), joint-stereo(1), dual-channel(2), single-channel(3) },
> + mode-extension INTEGER (0..3),
> + copyright BOOLEAN,
> + original BOOLEAN,
> + emphasis ENUMERATED
> + { none(0), em-50-15-ms(1), reserved(2), ccit-j-17(3) }
> +}
> +
> +ID3v1 ::= SEQUENCE {
> + tag OCTET STRING (SIZE (3)),
> + title OCTET STRING (SIZE (30)),
> + artist OCTET STRING (SIZE (30)),
> + album OCTET STRING (SIZE (30)),
> + year OCTET STRING (SIZE (4)),
> + comment OCTET STRING (SIZE (28)),
> + zero INTEGER (0..255),
> + track INTEGER (0..255),
> + genre INTEGER (0..255)
> +}
> +
> +END
> diff --unidirectional-new-file -urXX
> wireshark-0.99.2.orig/asn1/mpeg/packet-mpeg-template.c
> wireshark-0.99.2/asn1/mpeg/packet-mpeg-template.c
> --- wireshark-0.99.2.orig/asn1/mpeg/packet-mpeg-template.c 1969-12-31
> 17:00:00.000000000 -0700
> +++ wireshark-0.99.2/asn1/mpeg/packet-mpeg-template.c 2006-08-25
> 16:51:34.000000000 -0600
> @@ -0,0 +1,238 @@
> +/* MPEG packet decoder.
> + * Written by Shaun Jackman <sjackman@xxxxxxxxx>.
> + * Copyright 2006 Shaun Jackman
> + *
> + * This program is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU General Public License.
> + */
> +
> +#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 "packet-per.h"
> +
> +#include "packet-mpeg-hf.c"
> +#include "packet-mpeg-ett.c"
> +#include "packet-mpeg-fn.c"
> +
> +static int hf_mpeg_audio = -1;
> +static int hf_mpeg_data = -1;
> +static int hf_mpeg_padbytes = -1;
> +static int hf_id3v1 = -1;
> +static int hf_id3v2 = -1;
> +
> +struct header {
> + unsigned emphasis :2;
> + unsigned original :1;
> + unsigned copyright :1;
> + unsigned mode_ext :2;
> + unsigned mode :2;
> + unsigned private :1;
> + unsigned padding :1;
> + unsigned frequency :2;
> + unsigned bitrate :4;
> + unsigned protection :1;
> + unsigned layer :2;
> + unsigned version :2;
> + unsigned sync :11;
> +};
> +
> +enum { SYNC = 0x7ff };
> +static const int versions[4] = { 2, -1, 1, 0 };
> +static const int layers[4] = { -1, 2, 1, 0 };
> +
> +static const unsigned samples_per_frame[3][3] = {
> + { 384, 1152, 1152 },
> + { 384, 1152, 576 },
> + { 384, 1152, 576 },
> +};
> +
> +static const unsigned bitrates[3][3][16] = { /* kb/s */
> + {
> + { 0, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448
},
> + { 0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384
},
> + { 0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320
},
> + },
> + {
> + { 0, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256
},
> + { 0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160
},
> + { 0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160
},
> + },
> + {
> + { 0, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256
},
> + { 0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160
},
> + { 0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160
},
> + },
> +};
> +
> +static const unsigned frequencies[3][4] = {
> + { 44100, 48000, 32000 },
> + { 22050, 24000, 16000 },
> + { 11025, 12000, 8000 },
> +};
> +static const unsigned padding[3] = { 4, 1, 1 };
> +
> +static size_t
> +read_header(tvbuff_t *tvb, packet_info *pinfo, struct header *header)
> +{
> + size_t data_size = 0;
> + uint32_t h = tvb_get_ntohl(tvb, 0);
> + memcpy(header, &h, sizeof *header);
> + if (header->sync == SYNC) {
> + int version = versions[header->version];
> + int layer = layers[header->layer];
> + if (version >= 0 && layer >= 0) {
> + unsigned bitrate = bitrates[version][layer][header->bitrate] * 1000;
> + unsigned frequency = frequencies[version][header->frequency];
> + 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[version]);
> + }
> + if (check_col(pinfo->cinfo, COL_INFO))
> + col_add_fstr(pinfo->cinfo, COL_INFO,
> + "Audio Layer %d", layer+1);
> + if (bitrate > 0 && frequency > 0) {
> + unsigned samples = samples_per_frame[version][layer];
> + data_size = bitrate * samples / frequency / 8 - sizeof header;
> + 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", bitrate / 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", frequency / (float)1000);
> + }
> + }
> + } else {
> + if (check_col(pinfo->cinfo, COL_PROTOCOL))
> + col_add_str(pinfo->cinfo, COL_PROTOCOL, "MPEG");
> + }
> + }
> + return data_size;
> +}
> +
> +static void
> +dissect_mpa(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
> +{
> + struct header header;
> + size_t data_size = read_header(tvb, pinfo, &header);
> + if (tree == NULL)
> + return;
> +
> + if (header.sync != SYNC)
> + return;
> + asn1_ctx_t asn1_ctx;
> + asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, TRUE, pinfo);
> + int offset = 0;
> + offset = dissect_mpeg_Audio(tvb, offset, &asn1_ctx,
> + tree, hf_mpeg_audio);
> + if (data_size > 0) {
> + proto_tree_add_item(tree, hf_mpeg_data, tvb,
> + offset / 8, data_size, FALSE);
> + offset += data_size * 8;
> + if (header.padding)
> + proto_tree_add_item(tree, hf_mpeg_padbytes, tvb,
> + offset / 8, 1, FALSE);
> + }
> +}
> +
> +static void
> +dissect_id3v1(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
> +{
> + if (check_col(pinfo->cinfo, COL_PROTOCOL))
> + col_set_str(pinfo->cinfo, COL_PROTOCOL, "ID3v1");
> + if (tree == NULL)
> + return;
> + asn1_ctx_t asn1_ctx;
> + asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, TRUE, pinfo);
> + dissect_mpeg_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");
> + proto_tree_add_item(tree, hf_id3v2, tvb,
> + 0, -1, FALSE);
> +}
> +
> +static void
> +dissect_mpeg(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
> +{
> + if (check_col(pinfo->cinfo, COL_PROTOCOL))
> + col_clear(pinfo->cinfo, COL_PROTOCOL);
> + if (check_col(pinfo->cinfo, COL_INFO))
> + col_clear(pinfo->cinfo, COL_INFO);
> +
> + int magic = tvb_get_ntoh24(tvb, 0);
> + switch (magic) {
> + case 0x544147:
> + dissect_id3v1(tvb, pinfo, tree);
> + break;
> + case 0x494433:
> + dissect_id3v2(tvb, pinfo, tree);
> + break;
> + default:
> + dissect_mpa(tvb, pinfo, tree);
> + }
> +}
> +
> +static int proto_mpeg = -1;
> +
> +void
> +proto_register_mpeg(void)
> +{
> + static hf_register_info hf[] = {
> +#include "packet-mpeg-hfarr.c"
> + { &hf_mpeg_audio,
> + { "MPEG Audio", "mpeg.audio",
> + FT_NONE, BASE_NONE, NULL, 0, NULL, HFILL }},
> + { &hf_mpeg_data,
> + { "Data", "mpeg.data",
> + FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL }},
> + { &hf_mpeg_padbytes,
> + { "Padding", "mpeg.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-ettarr.c"
> + };
> +
> + if (proto_mpeg != -1)
> + return;
> +
> + proto_mpeg = proto_register_protocol(
> + "Moving Picture Experts Group", "MPEG", "mpeg");
> + proto_register_field_array(proto_mpeg, hf, array_length(hf));
> + proto_register_subtree_array(ett, array_length(ett));
> +}
> +
> +void
> +proto_reg_handoff_mpeg(void)
> +{
> + dissector_handle_t mpeg_handle = create_dissector_handle(
> + dissect_mpeg, proto_mpeg);
> + dissector_add("wtap_encap", WTAP_ENCAP_MPEG, mpeg_handle);
> +}
>
>
- Follow-Ups:
- Re: [Wireshark-dev] asn1: New MPEG dissector
- From: ronnie sahlberg
- Re: [Wireshark-dev] asn1: New MPEG dissector
- References:
- [Wireshark-dev] [PATCH 2/2] asn1: New MPEG dissector
- From: Shaun Jackman
- Re: [Wireshark-dev] asn1: New MPEG dissector
- From: ronnie sahlberg
- [Wireshark-dev] [PATCH 2/2] asn1: New MPEG dissector
- Prev by Date: Re: [Wireshark-dev] asn1: New MPEG dissector
- Next by Date: Re: [Wireshark-dev] asn1: New MPEG dissector
- Previous by thread: Re: [Wireshark-dev] asn1: New MPEG dissector
- Next by thread: Re: [Wireshark-dev] asn1: New MPEG dissector
- Index(es):