aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnders Broman <anders.broman@ericsson.com>2008-11-11 20:42:47 +0000
committerAnders Broman <anders.broman@ericsson.com>2008-11-11 20:42:47 +0000
commit93b9635a4126c828b35bee20fed89ea5758b7611 (patch)
tree7180b845efd8842f533e3e405c31844b1206ae74
parent23e9b1de65d95ab6e3685fa82bc73a242df06935 (diff)
Dissect part ofconfiguration parameter in SDP for MP4V-ES.
svn path=/trunk/; revision=26754
-rw-r--r--epan/dissectors/Makefile.common1
-rw-r--r--epan/dissectors/packet-mp4ves.c388
-rw-r--r--epan/dissectors/packet-mp4ves.h32
-rw-r--r--epan/dissectors/packet-sdp.c146
4 files changed, 451 insertions, 116 deletions
diff --git a/epan/dissectors/Makefile.common b/epan/dissectors/Makefile.common
index 233ba82430..ea70cdf590 100644
--- a/epan/dissectors/Makefile.common
+++ b/epan/dissectors/Makefile.common
@@ -1027,6 +1027,7 @@ DISSECTOR_INCLUDES = \
packet-mip6.h \
packet-mms.h \
packet-mount.h \
+ packet-mp4ves.h \
packet-mpls.h \
packet-mq.h \
packet-mrdisc.h \
diff --git a/epan/dissectors/packet-mp4ves.c b/epan/dissectors/packet-mp4ves.c
index 43d84dff3f..339d5ef04f 100644
--- a/epan/dissectors/packet-mp4ves.c
+++ b/epan/dissectors/packet-mp4ves.c
@@ -50,6 +50,12 @@ static int hf_mp4ves_config = -1;
static int hf_mp4ves_start_code_prefix = -1;
static int hf_mp4ves_start_code = -1;
static int hf_mp4ves_vop_coding_type = -1;
+static int hf_mp4ves_profile_and_level_indication = -1;
+static int hf_mp4ves_is_visual_object_identifier = -1;
+static int hf_mp4ves_visual_object_type = -1;
+static int hf_mp4ves_video_signal_type = -1;
+static int hf_mp4ves_stuffing = -1;
+static int hf_mp4ves_video_object_type_indication = -1;
/* Initialize the subtree pointers */
static int ett_mp4ves = -1;
@@ -64,7 +70,7 @@ static guint global_dynamic_payload_type = 0;
14496-2, Annex G, Table G-1.
Table G-1 FLC table for profile_and_level_indication Profile/Level Code
*/
-static const value_string mp4ves_level_indication_vals[] =
+const value_string mp4ves_level_indication_vals[] =
{
{ 0, "Reserved" },
{ 1, "Simple Profile/Level 1" },
@@ -150,7 +156,7 @@ static const value_string mp4ves_level_indication_vals[] =
{ 0, NULL },
};
static const range_string mp4ves_startcode_vals[] = {
- { 0, 0x1f, "video_object_start_code" },
+ { 0x00, 0x1f, "video_object_start_code" },
{ 0x20, 0x2f, "video_object_layer_start_code" },
{ 0x30, 0xaf, "reserved" },
{ 0xb0, 0xb0, "visual_object_sequence_start_code" },
@@ -205,9 +211,295 @@ static const value_string mp4ves_video_object_type_vals[] = {
{ 0xe, "Simple FBA" },
{ 0, NULL }
};
+/* Visual object type */
+static const value_string mp4ves_visual_object_type_vals[] = {
+ { 0x0, "reserved" },
+ { 0x1, "video ID" },
+ { 0x2, "still texture ID" },
+ { 0x3, "mesh ID" },
+ { 0x4, "FBA ID" },
+ { 0x5, "3D mesh ID" },
+ { 0x6, "reserved" },
+ { 0x7, "reserved" },
+ { 0x8, "reserved" },
+ { 0x9, "reserved" },
+ { 0xa, "reserved" },
+ { 0xb, "reserved" },
+ { 0xc, "reserved" },
+ { 0xd, "reserved" },
+ { 0xe, "reserved" },
+ { 0xf, "reserved" },
+ { 0, NULL }
+};
+
+static const value_string mp4ves_video_object_type_indication_vals[] = {
+ { 0x0, "Reserved" },
+ { 0x1, "Simple Object Type" },
+ { 0x2, "Simple Scalable Object Type" },
+ { 0x3, "Core Object Type" },
+ { 0x4, "Main Object Type" },
+ { 0x5, "N-bit Object Type" },
+ { 0x6, "Basic Anim. 2D Texture" },
+ { 0x7, "Anim. 2D Mesh" },
+ { 0x8, "Simple Face" },
+ { 0x9, "Still Scalable Texture" },
+ { 0xa, "Advanced Real Time Simple" },
+ { 0xb, "Core Scalable" },
+ { 0xc, "Advanced Coding Efficiency" },
+ { 0xd, "Advanced Scalable Texture" },
+ { 0xe, "Simple FBA" },
+ { 0xf, "Reserved" },
+ /* Reserved 00001111 – 11111111 */
+ { 0, NULL }
+};
+/* 6.2.2.1 User data */
+static int
+dissect_mp4ves_user_data(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int bit_offset)
+{
+ int start_bit_offset;
+
+ /* user_data_start_code */
+ proto_tree_add_bits_item(tree, hf_mp4ves_start_code_prefix, tvb, bit_offset, 24, FALSE);
+ bit_offset+=24;
+ proto_tree_add_bits_item(tree, hf_mp4ves_start_code, tvb, bit_offset, 8, FALSE);
+ bit_offset+=8;
+ start_bit_offset = bit_offset;
+ /* while( next_bits() != ‘0000 0000 0000 0000 0000 0001’ ) { */
+ while ( tvb_get_bits32(tvb,bit_offset, 24, FALSE) != 1){
+ bit_offset+=8;
+ /* user_data 8 bits */
+ }
+ proto_tree_add_text(tree, tvb, start_bit_offset>>3, (bit_offset - start_bit_offset)>>2, "User data");
+
+ return bit_offset;
+}
+/*
+next_start_code() {
+zero_bit
+while (!bytealigned())
+one_bit
+}
+*/
+static int
+dissect_mp4ves_next_start_code(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int bit_offset)
+{
+ guint8 zero_bit;
+ int start_bit_offset;
+
+ start_bit_offset = bit_offset;
+
+ zero_bit = tvb_get_bits8(tvb,bit_offset,1);
+ if (zero_bit != 0){
+ /* Error */
+ }
+ bit_offset++;
+
+ /* zero stuffing bits */
+ if(bit_offset %8 == 0)
+ return bit_offset;
+
+ while(bit_offset %8 != 0){
+ bit_offset++;
+ }
+
+ proto_tree_add_bits_item(tree, hf_mp4ves_stuffing, tvb, start_bit_offset, bit_offset-start_bit_offset, FALSE);
+
+ return bit_offset;
+}
+
+/*
+video_signal_type() {
+ video_signal_type
+ if (video_signal_type) {
+ video_format 3 uimsbf
+ video_range 1 bslbf
+ colour_description 1 bslbf
+ if (colour_description) {
+ colour_primaries 8 uimsbf
+ transfer_characteristics 8 uimsbf
+ matrix_coefficients 8 uimsbf
+ }
+ }
+}
+*/
+static int
+dissect_mp4ves_visual_object_type(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int bit_offset)
+{
+ guint8 video_signal_type, colour_description;
+
+ video_signal_type = tvb_get_bits8(tvb,bit_offset,1);
+ proto_tree_add_bits_item(tree, hf_mp4ves_video_signal_type, tvb, bit_offset, 1, FALSE);
+ bit_offset++;
+ if (video_signal_type) {
+ /* video_format 3 bits */
+ bit_offset+=3;
+ /* video_range 1 bit */
+ bit_offset++;
+ /* colour_description 1 bit */
+ colour_description = tvb_get_bits8(tvb,bit_offset,1);
+ if (colour_description) {
+ /* colour_primaries 8 bits */
+ bit_offset+=8;
+ /* transfer_characteristics 8 bits */
+ bit_offset+=8;
+ /* matrix_coefficients 8 bits*/
+ bit_offset+=8;
+ }
+ }
-#if 0
-To be called from packet-sdp.c
+ return bit_offset;
+}
+/*
+ * 6.2.3 Video Object Layer
+ */
+static int
+dissect_mp4ves_VideoObjectLayer(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int bit_offset)
+{
+ guint32 dword;
+ guint8 octet;
+
+ /* if(next_bits() == video_object_layer_start_code) { */
+ dword = tvb_get_bits32(tvb,bit_offset, 24, FALSE);
+ if (dword != 1){
+ return bit_offset;
+ }
+ octet = tvb_get_bits8(tvb,bit_offset+24, 8);
+ if((octet>=0x20)&&(octet<=0x2f)){
+ /* Continue */
+ }else{
+ return -1;
+ }
+ /* video_object_layer_start_code */
+ proto_tree_add_bits_item(tree, hf_mp4ves_start_code_prefix, tvb, bit_offset, 24, FALSE);
+ bit_offset+=24;
+ proto_tree_add_bits_item(tree, hf_mp4ves_start_code, tvb, bit_offset, 8, FALSE);
+ bit_offset+= 8;
+
+ /* short_video_header = 0 */
+ /* random_accessible_vol 1 */
+ bit_offset++;
+ /* video_object_type_indication 8 */
+ proto_tree_add_bits_item(tree, hf_mp4ves_video_object_type_indication, tvb, bit_offset, 8, FALSE);
+ bit_offset+= 8;
+ /* is_object_layer_identifier 1 */
+ bit_offset++;
+ /* if (is_object_layer_identifier) { */
+ /* video_object_layer_verid 4 uimsbf */
+ /* video_object_layer_priority 3 uimsbf */
+ /* }
+ /* aspect_ratio_info 4 uimsbf */
+ /* if (aspect_ratio_info == “extended_PAR”) { */
+ /* par_width 8 uimsbf */
+ /* par_height 8 uimsbf */
+ /* } */
+ /* vol_control_parameters 1 bslbf */
+ /* if (vol_control_parameters) { */
+ /* chroma_format 2 uimsbf */
+ /* low_delay 1 uimsbf */
+ /* vbv_parameters 1 blsbf */
+
+
+ return bit_offset;
+}
+/* Visual object */
+/*
+VisualObject() {
+ visual_object_start_code
+ is_visual_object_identifier
+ if (is_visual_object_identifier) {
+ visual_object_verid
+ visual_object_priority
+ }
+ visual_object_type
+ if (visual_object_type == “video ID” || visual_object_type == “still textureID“) {
+ video_signal_type()
+ }
+ next_start_code()
+ while ( next_bits()== user_data_start_code){
+ user_data()
+ }
+ if (visual_object_type == “video ID”) {
+ video_object_start_code
+ VideoObjectLayer()
+ }
+ else if (visual_object_type == “still texture ID”) {
+ StillTextureObject()
+ }
+ else if (visual_object_type == “mesh ID”) {
+ MeshObject()
+ }
+ else if (visual_object_type == “FBA ID”) {
+ FBAObject()
+ }
+ else if (visual_object_type == “3D mesh ID”) {
+ 3D_Mesh_Object()
+ }
+ if (next_bits() != “0000 0000 0000 0000 0000 0001”)
+ next_start_code()
+}
+*/
+static int
+dissect_mp4ves_VisualObject(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int bit_offset)
+{
+ guint8 is_visual_object_identifier, visual_object_type;
+ guint32 dword;
+ guint8 octet;
+
+ is_visual_object_identifier = tvb_get_bits8(tvb,bit_offset,1);
+ proto_tree_add_bits_item(tree, hf_mp4ves_is_visual_object_identifier, tvb, bit_offset, 1, FALSE);
+ bit_offset++;
+ if(is_visual_object_identifier){
+ /* visual_object_verid 4 bits*/
+ bit_offset+=4;
+ /* visual_object_priority 3 bits*/
+ bit_offset+=3;
+ }
+ /* visual_object_type 4 bits*/
+ visual_object_type = tvb_get_bits8(tvb,bit_offset,4);
+ proto_tree_add_bits_item(tree, hf_mp4ves_visual_object_type, tvb, bit_offset, 4, FALSE);
+ bit_offset+=4;
+ if ((visual_object_type == 1/*“video ID”*/) || (visual_object_type == 2/*“still textureID“*/)) {
+ /* video_signal_type() */
+ bit_offset = dissect_mp4ves_visual_object_type(tvb, pinfo, tree, bit_offset);
+ }
+ /* next_start_code() */
+ bit_offset = dissect_mp4ves_next_start_code(tvb, pinfo, tree, bit_offset);
+ dword = tvb_get_bits32(tvb,bit_offset, 32, FALSE);
+/*
+ while ( next_bits()== user_data_start_code){
+ user_data()
+ }
+*/
+ while(dword==0x1b2){
+ bit_offset = dissect_mp4ves_user_data(tvb, pinfo, tree, bit_offset);
+ dword = tvb_get_bits32(tvb,bit_offset, 32, FALSE);
+ }
+ if (visual_object_type == 1/*“video ID”*/) {
+ /*
+ * video_object_start_code
+ */
+ dword = tvb_get_bits32(tvb,bit_offset, 24, FALSE);
+ if (dword != 1){
+ /* no start code */
+ return -1;
+ }
+ octet = tvb_get_bits8(tvb,bit_offset+24, 8);
+ if(octet>0x20){
+ /* Error */
+ return -1;
+ }
+ proto_tree_add_bits_item(tree, hf_mp4ves_start_code_prefix, tvb, bit_offset, 24, FALSE);
+ bit_offset+=24;
+ proto_tree_add_bits_item(tree, hf_mp4ves_start_code, tvb, bit_offset, 8, FALSE);
+ bit_offset+= 8;
+ /*
+ VideoObjectLayer()
+ */
+ bit_offset = dissect_mp4ves_VideoObjectLayer(tvb, pinfo, tree, bit_offset);
+ }
+
+ return bit_offset;
+}
void
dissect_mp4ves_config(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
{
@@ -219,25 +511,60 @@ dissect_mp4ves_config(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
item = proto_tree_add_item(tree, hf_mp4ves_config, tvb, 0, -1, FALSE);
mp4ves_tree = proto_item_add_subtree(item, ett_mp4ves_config);
- /* Get start code prefix */
- dword = tvb_get_bits32(tvb,bit_offset, 24, FALSE);
- if (dword == 1){
+ /*VisualObjectSequence() {
+ do {
+ visual_object_sequence_start_code
+ */
- }else{
+ /* Get start code prefix */
+ dword = tvb_get_bits32(tvb,bit_offset, 32, FALSE);
+ if ((dword & 0x00000100) != 0x00000100){
/* No start code prefix */
return;
}
-
proto_tree_add_bits_item(tree, hf_mp4ves_start_code_prefix, tvb, bit_offset, 24, FALSE);
- bit_offset = bit_offset+24;
+ bit_offset+= 24;
- /* We are byte aligned no stuffing */
- dword = tvb_get_bits8(tvb,bit_offset, 8);
proto_tree_add_bits_item(tree, hf_mp4ves_start_code, tvb, bit_offset, 8, FALSE);
+ bit_offset+= 8;
+ /* Expect visual_object_sequence_start_code */
+ if(dword != 0x1b0)
+ return;
+ /* profile_and_level_indication */
+ proto_tree_add_bits_item(tree, hf_mp4ves_profile_and_level_indication, tvb, bit_offset, 8, FALSE);
+ bit_offset+= 8;
+ /* while ( next_bits()== user_data_start_code){
+ user_data()
+ }
+ */
+ dword = tvb_get_bits32(tvb,bit_offset, 32, FALSE);
+ bit_offset+= 32;
+ if ((dword & 0x00000100) != 0x00000100){
+ /* No start code prefix */
+ return;
+ }
+ if(dword==0x1b2){
+ /*
+ * user_data_start_code
+ * XXX call user data dissection here
+ */
+ return;
+ }
+ if(dword==0x1b5){
+ /*
+ * VisualObject()
+ */
+ bit_offset = dissect_mp4ves_VisualObject(tvb, pinfo, tree, bit_offset);
+ }
+ /*
+ } while ( next_bits() != visual_object_sequence_end_code)
+ visual_object_sequence_end_code
+}
+*/
}
-#endif
+
void
dissect_mp4ves(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
@@ -384,6 +711,9 @@ static mp4ves_capability_t mp4ves_capability_tab[] = {
/* ITU-T H.245 capabilities ISO/IEC 14496-2(m*/
{ "GenericCapability/0.0.8.245.1.0.0/nonCollapsing/0", "profileAndLevel", dissect_mp4ves_par_profile },
{ "GenericCapability/0.0.8.245.1.0.0/nonCollapsing/1", "object", dissect_mp4ves_par_video_object_type },
+ { "GenericCapability/0.0.8.245.1.0.0/nonCollapsing/2", "decoderConfigurationInformation", NULL },
+ { "GenericCapability/0.0.8.245.1.0.0/nonCollapsing/3", "drawingOrder", NULL },
+ { "GenericCapability/0.0.8.245.1.0.0/collapsing/4", "visualBackChannelHandle", NULL },
{ NULL, NULL, NULL },
};
@@ -469,7 +799,7 @@ proto_register_mp4ves(void)
},
{ &hf_mp4ves_start_code,
{ "Start code", "mp4ves.start_code",
- FT_UINT32, BASE_HEX, RVALS(&mp4ves_startcode_vals), 0x0,
+ FT_UINT8, BASE_RANGE_STRING|BASE_HEX, RVALS(&mp4ves_startcode_vals), 0x0,
"Start code", HFILL }
},
{ &hf_mp4ves_vop_coding_type,
@@ -477,6 +807,36 @@ proto_register_mp4ves(void)
FT_UINT8, BASE_DEC, VALS(mp4ves_vop_coding_type_vals), 0x0,
"Start code", HFILL }
},
+ {&hf_mp4ves_profile_and_level_indication,
+ { "profile_and_level_indication", "mp4ves.profile_and_level_indication",
+ FT_UINT8, BASE_DEC,VALS(mp4ves_level_indication_vals), 0x0,
+ "profile_and_level_indication", HFILL }
+ },
+ { &hf_mp4ves_is_visual_object_identifier,
+ { "visual_object_identifier", "mp4ves.visual_object_identifier",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ "visual_object_identifier", HFILL }
+ },
+ { &hf_mp4ves_visual_object_type,
+ { "visual_object_type", "mp4ves.visual_object_type",
+ FT_UINT32, BASE_DEC, VALS(mp4ves_visual_object_type_vals), 0x0,
+ "visual_object_type", HFILL }
+ },
+ { &hf_mp4ves_video_signal_type,
+ { "video_signal_type", "mp4ves.video_signal_type",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ "video_signal_type", HFILL }
+ },
+ { &hf_mp4ves_stuffing,
+ { "Stuffing", "mp4ves.stuffing",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ "Stuffing", HFILL }
+ },
+ { &hf_mp4ves_video_object_type_indication,
+ { "video_object_type_indication", "mp4ves.video_object_type_indication",
+ FT_UINT8, BASE_DEC, VALS(mp4ves_video_object_type_indication_vals), 0x0,
+ "video_object_type_indication", HFILL }
+ },
};
/* Setup protocol subtree array */
diff --git a/epan/dissectors/packet-mp4ves.h b/epan/dissectors/packet-mp4ves.h
new file mode 100644
index 0000000000..2a45d61e09
--- /dev/null
+++ b/epan/dissectors/packet-mp4ves.h
@@ -0,0 +1,32 @@
+/* packet-mp4ves.h
+ *
+ * $Id$
+ *
+ * Copyright 2008, Anders Broman <anders.broman[at]ericsson.com>
+ *
+ * Wireshark - Network traffic analyzer
+ * By Gerald Combs <gerald@wireshark.org>
+ * Copyright 1998 Gerald Combs
+ *
+ * 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.
+ */
+
+#ifndef PACKET_MP4VES_H
+#define PACKET_MP4VES_H
+
+extern const value_string mp4ves_level_indication_vals[];
+
+void dissect_mp4ves_config(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree);
+#endif /* PACKET_MP4VES_H */ \ No newline at end of file
diff --git a/epan/dissectors/packet-sdp.c b/epan/dissectors/packet-sdp.c
index 9bb54ecd89..a71b8a8b84 100644
--- a/epan/dissectors/packet-sdp.c
+++ b/epan/dissectors/packet-sdp.c
@@ -73,12 +73,14 @@
#include "packet-per.h"
#include "packet-h245.h"
#include "packet-h264.h"
+#include "packet-mp4ves.h"
static dissector_handle_t rtp_handle=NULL;
static dissector_handle_t rtcp_handle=NULL;
static dissector_handle_t t38_handle=NULL;
static dissector_handle_t msrp_handle=NULL;
static dissector_handle_t h264_handle = NULL;
+static dissector_handle_t mp4ves_handle = NULL;
static int sdp_tap = -1;
@@ -1213,95 +1215,7 @@ tvbuff_t *ascii_bytes_to_tvb(tvbuff_t *tvb, packet_info *pinfo, gint len, gchar
}
return NULL;
}
-/*
-14496-2, Annex G, Table G-1.
-Table G-1 FLC table for profile_and_level_indication Profile/Level Code
-*/
-static const value_string mpeg4es_level_indication_vals[] =
-{
- { 0, "Reserved" },
- { 1, "Simple Profile/Level 1" },
- { 2, "Simple Profile/Level 2" },
- { 3, "Reserved" },
- { 4, "Reserved" },
- { 5, "Reserved" },
- { 6, "Reserved" },
- { 7, "Reserved" },
- { 8, "Simple Profile/Level 0" },
- { 9, "Simple Profile/Level 0b" },
- /* Reserved 00001001 - 00010000 */
- { 0x11, "Simple Scalable Profile/Level 1" },
- { 0x12, "Simple Scalable Profile/Level 2" },
- /* Reserved 00010011 - 00100000 */
- { 0x21, "Core Profile/Level 1" },
- { 0x22, "Core Profile/Level 2" },
- /* Reserved 00100011 - 00110001 */
- { 0x32, "Main Profile/Level 2" },
- { 0x33, "Main Profile/Level 3" },
- { 0x34, "Main Profile/Level 4" },
- /* Reserved 00110101 - 01000001 */
- { 0x42, "N-bit Profile/Level 2" },
- /* Reserved 01000011 - 01010000 */
- { 0x51, "Scalable Texture Profile/Level 1" },
- /* Reserved 01010010 - 01100000 */
- { 0x61, "Simple Face Animation Profile/Level 1" },
- { 0x62, "Simple Face Animation Profile/Level 2" },
- { 0x63, "Simple FBA Profile/Level 1" },
- { 0x64, "Simple FBA Profile/Level 2" },
- /* Reserved 01100101 - 01110000 */
- { 0x71, "Basic Animated Texture Profile/Level 1" },
- { 0x72, "Basic Animated Texture Profile/Level 2" },
- /* Reserved 01110011 - 10000000 */
- { 0x81, "Hybrid Profile/Level 1" },
- { 0x82, "Hybrid Profile/Level 2" },
- /* Reserved 10000011 - 10010000 */
- { 0x91, "Advanced Real Time Simple Profile/Level 1" },
- { 0x92, "Advanced Real Time Simple Profile/Level 2" },
- { 0x93, "Advanced Real Time Simple Profile/Level 3" },
- { 0x94, "Advanced Real Time Simple Profile/Level 4" },
- /* Reserved 10010101 - 10100000 */
- { 0xa1, "Core Scalable Profile/Level 1" },
- { 0xa2, "Core Scalable Profile/Level 2" },
- { 0xa3, "Core Scalable Profile/Level 3" },
- /* Reserved 10100100 - 10110000 */
- { 0xb1, "Advanced Coding Efficiency Profile/Level 1" },
- { 0xb2, "Advanced Coding Efficiency Profile/Level 2" },
- { 0xb3, "Advanced Coding Efficiency Profile/Level 3" },
- { 0xb4, "Advanced Coding Efficiency Profile/Level 4" },
- /* Reserved 10110101 - 11000000 */
- { 0xc1, "Advanced Core Profile/Level 1" },
- { 0xc2, "Advanced Core Profile/Level 2" },
- /* Reserved 11000011 - 11010000 */
- { 0xd1, "Advanced Scalable Texture/Level 1" },
- { 0xd2, "Advanced Scalable Texture/Level 2" },
- { 0xd3, "Advanced Scalable Texture/Level 3" },
- /* Reserved 11010100 - 11100000 */
- { 0xe1, "Simple Studio Profile/Level 1" },
- { 0xe2, "Simple Studio Profile/Level 2" },
- { 0xe3, "Simple Studio Profile/Level 3" },
- { 0xe4, "Simple Studio Profile/Level 4" },
- { 0xe5, "Core Studio Profile/Level 1" },
- { 0xe6, "Core Studio Profile/Level 2" },
- { 0xe7, "Core Studio Profile/Level 3" },
- { 0xe8, "Core Studio Profile/Level 4" },
- /* Reserved 11101001 - 11101111 */
- { 0xf0, "Advanced Simple Profile/Level 0" },
- { 0xf1, "Advanced Simple Profile/Level 1" },
- { 0xf2, "Advanced Simple Profile/Level 2" },
- { 0xf3, "Advanced Simple Profile/Level 3" },
- { 0xf4, "Advanced Simple Profile/Level 4" },
- { 0xf5, "Advanced Simple Profile/Level 5" },
- /* Reserved 11110110 - 11110111 */
- { 0xf8, "Fine Granularity Scalable Profile/Level 0" },
- { 0xf9, "Fine Granularity Scalable Profile/Level 1" },
- { 0xfa, "Fine Granularity Scalable Profile/Level 2" },
- { 0xfb, "Fine Granularity Scalable Profile/Level 3" },
- { 0xfc, "Fine Granularity Scalable Profile/Level 4" },
- { 0xfd, "Fine Granularity Scalable Profile/Level 5" },
- { 0xfe, "Reserved" },
- { 0xff, "Reserved for Escape" },
- { 0, NULL },
-};
+
/* Annex X Profiles and levels definition */
static const value_string h263_profile_vals[] =
{
@@ -1363,7 +1277,16 @@ decode_sdp_fmtp(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint offset
item = proto_tree_add_uint(tree, hf_sdp_fmtp_mpeg4_profile_level_id, tvb, offset, tokenlen,
atol((char*)format_specific_parameter));
PROTO_ITEM_SET_GENERATED(item);
- }
+ }else if(strcmp((char*)field_name, "config") == 0) {
+ /* String including "=" */
+ tokenlen = end_offset - offset;
+ format_specific_parameter = tvb_get_ephemeral_string(tvb, offset, tokenlen);
+ /* ascii_bytes_to_tvb requires the "=" to be in the buffer */
+ data_tvb = ascii_bytes_to_tvb(tvb, pinfo, tokenlen, format_specific_parameter);
+ if(mp4ves_handle && data_tvb){
+ dissect_mp4ves_config(data_tvb, pinfo, tree);
+ }
+ }
}
/* Dissect the H263-2000 profile parameter if present */
@@ -1379,16 +1302,34 @@ decode_sdp_fmtp(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint offset
}
- /* Dissect the H264 profile-level-id parameter */
+ /* Dissect the H264 profile-level-id parameter
+ * RFC 3984:
+ * A base16 [6] (hexadecimal) representation of
+ * the following three bytes in the sequence
+ * parameter set NAL unit specified in [1]: 1)
+ * profile_idc, 2) a byte herein referred to as
+ * profile-iop, composed of the values of
+ * constraint_set0_flag, constraint_set1_flag,
+ * constraint_set2_flag, and reserved_zero_5bits
+ * in bit-significance order, starting from the
+ * most significant bit, and 3) level_idc.
+ */
if (mime_type != NULL && strcmp(mime_type, "H264") == 0) {
if (strcmp(field_name, "profile-level-id") == 0) {
+ int length;
- /* Length includes "=" */
+ /* Length includes "=" as it's required by ascii_bytes_to_tvb()*/
tokenlen = end_offset - offset;
format_specific_parameter = tvb_get_ephemeral_string(tvb, offset, tokenlen);
data_tvb = ascii_bytes_to_tvb(tvb, pinfo, tokenlen, format_specific_parameter);
- if(h264_handle && data_tvb){
- dissect_h264_profile(data_tvb, pinfo, tree);
+ length = tvb_length(data_tvb);
+ if (length == 3){
+ if(h264_handle && data_tvb){
+ dissect_h264_profile(data_tvb, pinfo, tree);
+ }
+ }else{
+ item = proto_tree_add_text(tree, tvb, offset, tokenlen, "Incorrectly coded, must be three bytes");
+ PROTO_ITEM_SET_GENERATED(item);
}
}else if (strcmp(field_name, "packetization-mode") == 0) {
offset++;
@@ -1399,13 +1340,13 @@ decode_sdp_fmtp(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint offset
}else if (strcmp(field_name, "sprop-parameter-sets") == 0) {
/* The value of the parameter is the
- base64 [6] representation of the initial
- parameter set NAL units as specified in
- sections 7.3.2.1 and 7.3.2.2 of [1]. The
- parameter sets are conveyed in decoding order,
- and no framing of the parameter set NAL units
- takes place. A comma is used to separate any
- pair of parameter sets in the list.
+ base64 [6] representation of the initial
+ parameter set NAL units as specified in
+ sections 7.3.2.1 and 7.3.2.2 of [1]. The
+ parameter sets are conveyed in decoding order,
+ and no framing of the parameter set NAL units
+ takes place. A comma is used to separate any
+ pair of parameter sets in the list.
*/
gchar *data = NULL;
gint comma_offset;
@@ -1935,7 +1876,7 @@ proto_register_sdp(void)
"IPBCP Command Type", HFILL }},
{&hf_sdp_fmtp_mpeg4_profile_level_id,
{ "Level Code",
- "sdp.fmtp.profile_level_id",FT_UINT32, BASE_DEC,VALS(mpeg4es_level_indication_vals), 0x0,
+ "sdp.fmtp.profile_level_id",FT_UINT32, BASE_DEC,VALS(mp4ves_level_indication_vals), 0x0,
"Level Code", HFILL }},
{ &hf_sdp_fmtp_h263_profile,
{ "Profile",
@@ -2022,6 +1963,7 @@ proto_reg_handoff_sdp(void)
msrp_handle = find_dissector("msrp");
t38_handle = find_dissector("t38");
h264_handle = find_dissector("h264");
+ mp4ves_handle = find_dissector("mp4ves");
sdp_handle = find_dissector("sdp");
dissector_add_string("media_type", "application/sdp", sdp_handle);