aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-h264.c
diff options
context:
space:
mode:
authorAnders Broman <anders.broman@ericsson.com>2007-12-10 21:25:32 +0000
committerAnders Broman <anders.broman@ericsson.com>2007-12-10 21:25:32 +0000
commit92e1ee3721634b4849219b047209fcef0c921256 (patch)
tree54cb739a25672fdfca7910d9231720a3df967754 /epan/dissectors/packet-h264.c
parent9a3eeab4ee35892ec6d2cc4f3e1124e969082544 (diff)
Decode more of H264 info in SDP.
svn path=/trunk/; revision=23832
Diffstat (limited to 'epan/dissectors/packet-h264.c')
-rw-r--r--epan/dissectors/packet-h264.c284
1 files changed, 270 insertions, 14 deletions
diff --git a/epan/dissectors/packet-h264.c b/epan/dissectors/packet-h264.c
index d40232d68d..0d306850a0 100644
--- a/epan/dissectors/packet-h264.c
+++ b/epan/dissectors/packet-h264.c
@@ -44,7 +44,7 @@
/* Initialize the protocol and registered fields */
static int proto_h264 = -1;
-static int hf_h264_nal_unit_type = -1;
+static int hf_h264_type = -1;
static int hf_h264_nal_f_bit = -1;
static int hf_h264_nal_nri = -1;
static int hf_h264_profile = -1;
@@ -55,12 +55,16 @@ static int hf_h264_constraint_set2_flag = -1;
static int hf_h264_constraint_set3_flag = -1;
static int hf_h264_reserved_zero_4bits = -1;
static int hf_h264_level_idc = -1;
-
+static int hf_h264_nal_unit = -1;
+static int hf_h264_forbidden_zero_bit = -1;
+static int hf_h264_nal_ref_idc = -1;
+static int hf_h264_nal_unit_type = -1;
/* Initialize the subtree pointers */
static int ett_h264 = -1;
static int ett_h264_profile = -1;
static int ett_h264_nal = -1;
+static int ett_h264_nal_unit = -1;
/* The dynamic payload type which will be dissected as H.264 */
@@ -73,7 +77,7 @@ static const true_false_string h264_f_bit_vals = {
};
-static const value_string h264_nal_unit_type_values[] = {
+static const value_string h264_type_values[] = {
{ 0, "Undefined" },
{ 1, "NAL unit" }, /* Single NAL unit packet per H.264 */
{ 2, "NAL unit" },
@@ -85,7 +89,7 @@ static const value_string h264_nal_unit_type_values[] = {
{ 8, "NAL unit" },
{ 9, "NAL unit" },
{ 10, "NAL unit" },
- { 11, "NAL unit" }, /* Single NAL unit packet per H.264 */
+ { 11, "NAL unit" },
{ 12, "NAL unit" },
{ 13, "NAL unit" },
{ 14, "NAL unit" },
@@ -95,7 +99,7 @@ static const value_string h264_nal_unit_type_values[] = {
{ 18, "NAL unit" },
{ 19, "NAL unit" },
{ 20, "NAL unit" },
- { 21, "NAL unit" }, /* Single NAL unit packet per H.264 */
+ { 21, "NAL unit" },
{ 22, "NAL unit" },
{ 23, "NAL unit" },
{ 24, "STAP-A" }, /* Single-time aggregation packet */
@@ -121,6 +125,43 @@ static const value_string h264_profile_idc_values[] = {
{ 0, NULL }
};
+static const value_string h264_nal_unit_type_vals[] = {
+ { 0, "Unspecified" },
+ { 1, "Coded slice of a non-IDR picture" },
+ { 2, "Coded slice data partition A" },
+ { 3, "Coded slice data partition B" },
+ { 4, "Coded slice data partition C" },
+ { 5, "Coded slice of an IDR picture" },
+ { 6, "Supplemental enhancement information (SEI)" },
+ { 7, "Sequence parameter set" },
+ { 8, "Picture parameter set" },
+ { 9, "Access unit delimiter" },
+ { 10, "End of sequence" },
+ { 11, "End of stream" },
+ { 12, "Filler data" },
+ { 13, "Sequence parameter set extension" },
+ { 14, "Reserved" },
+ { 15, "Reserved" },
+ { 16, "Reserved" },
+ { 17, "Reserved" },
+ { 18, "Reserved" },
+ { 19, "Coded slice of an auxiliary coded picture without partitioning" },
+ { 20, "Reserved" },
+ { 21, "Reserved" },
+ { 22, "Reserved" },
+ { 23, "Reserved" },
+ { 24, "Unspecified" },
+ { 25, "Unspecified" },
+ { 26, "Unspecified" },
+ { 27, "Unspecified" },
+ { 28, "Unspecified" },
+ { 29, "Unspecified" },
+ { 30, "Unspecified" },
+ { 31, "Unspecified" },
+ { 0, NULL }
+};
+
+/* Used To dissect SDP parameter (H.264)profile */
void
dissect_h264_profile(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
{
@@ -150,6 +191,201 @@ dissect_h264_profile(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
proto_tree_add_item(h264_profile_tree, hf_h264_level_idc, tvb, offset, 1, FALSE);
}
+
+
+static void
+dissect_h264_slice_layer_without_partitioning_rbsp(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint offset)
+{
+ proto_tree_add_text(tree, tvb, offset, -1, "Not decoded yet");
+
+}
+
+static void
+dissect_h264_slice_data_partition_a_layer_rbsp(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint offset)
+{
+ proto_tree_add_text(tree, tvb, offset, -1, "Not decoded yet");
+
+}
+
+static void
+dissect_h264_slice_data_partition_b_layer_rbsp(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint offset)
+{
+ proto_tree_add_text(tree, tvb, offset, -1, "Not decoded yet");
+
+}
+
+static void
+dissect_h264_slice_data_partition_c_layer_rbsp(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint offset)
+{
+ proto_tree_add_text(tree, tvb, offset, -1, "Not decoded yet");
+
+}
+
+
+static void
+dissect_h264_sei_rbsp(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint offset)
+{
+ proto_tree_add_text(tree, tvb, offset, -1, "Not decoded yet");
+
+}
+
+/* Ref 7.3.2.1 Sequence parameter set RBSP syntax */
+static void
+dissect_h264_seq_parameter_set_rbsp(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint offset)
+{
+ /* profile_idc 0 u(8) */
+ proto_tree_add_item(tree, hf_h264_profile_idc, tvb, offset, 1, FALSE);
+ offset++;
+ /* constraint_set0_flag 0 u(1) */
+ proto_tree_add_item(tree, hf_h264_constraint_set0_flag, tvb, offset, 1, FALSE);
+ /* constraint_set1_flag 0 u(1) */
+ proto_tree_add_item(tree, hf_h264_constraint_set1_flag, tvb, offset, 1, FALSE);
+ /* constraint_set2_flag 0 u(1) */
+ proto_tree_add_item(tree, hf_h264_constraint_set2_flag, tvb, offset, 1, FALSE);
+ /* constraint_set3_flag 0 u(1) */
+ proto_tree_add_item(tree, hf_h264_constraint_set3_flag, tvb, offset, 1, FALSE);
+ /* reserved_zero_4bits equal to 0 0 u(4)*/
+ proto_tree_add_item(tree, hf_h264_reserved_zero_4bits, tvb, offset, 1, FALSE);
+ offset++;
+ /* level_idc 0 u(8) */
+ proto_tree_add_item(tree, hf_h264_level_idc, tvb, offset, 1, FALSE);
+ offset;
+ /* seq_parameter_set_id 0 ue(v)
+ * ue(v): unsigned integer Exp-Golomb-coded syntax element with the left bit first.
+ * The parsing process for this descriptor is specified in subclause 9.1.
+ */
+ proto_tree_add_text(tree, tvb, offset, -1, "Not decoded yet");
+
+
+ offset++;
+
+}
+
+static void
+dissect_h264_pic_parameter_set_rbsp(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint offset)
+{
+ proto_tree_add_text(tree, tvb, offset, -1, "Not decoded yet");
+
+}
+
+static void
+dissect_h264_access_unit_delimiter_rbsp(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint offset)
+{
+ proto_tree_add_text(tree, tvb, offset, -1, "Not decoded yet");
+
+}
+
+static void
+dissect_h264_end_of_seq_rbsp(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint offset)
+{
+ proto_tree_add_text(tree, tvb, offset, -1, "Not decoded yet");
+
+}
+
+static void
+dissect_h264_end_of_stream_rbsp(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint offset)
+{
+ proto_tree_add_text(tree, tvb, offset, -1, "Not decoded yet");
+
+}
+
+static void
+dissect_h264_filler_data_rbsp(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint offset)
+{
+ proto_tree_add_text(tree, tvb, offset, -1, "Not decoded yet");
+
+}
+
+static void
+dissect_h264_seq_parameter_set_extension_rbsp(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint offset)
+{
+ proto_tree_add_text(tree, tvb, offset, -1, "Not decoded yet");
+
+}
+
+
+/* Dissect NAL unit as recived in sprop-parameter-sets of SDP */
+void
+dissect_h264_nal_unit(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
+{
+ proto_item *item;
+ proto_tree *h264_nal_tree;
+ gint offset = 0;
+ guint8 nal_unit_type;
+ item = proto_tree_add_item(tree, hf_h264_nal_unit, tvb, offset, -1, FALSE);
+ h264_nal_tree = proto_item_add_subtree(item, ett_h264_nal_unit);
+
+ /* Ref: 7.3.1 NAL unit syntax */
+ nal_unit_type = tvb_get_guint8(tvb,offset) & 0x1f;
+
+ /* forbidden_zero_bit All f(1) */
+ proto_tree_add_item(h264_nal_tree, hf_h264_forbidden_zero_bit, tvb, offset, 1, FALSE);
+ /* nal_ref_idc All u(2) */
+ proto_tree_add_item(h264_nal_tree, hf_h264_nal_ref_idc, tvb, offset, 1, FALSE);
+ /* nal_unit_type All u(5) */
+ proto_tree_add_item(h264_nal_tree, hf_h264_nal_unit_type, tvb, offset, 1, FALSE);
+ offset++;
+
+ switch(nal_unit_type){
+ case 0: /* Unspecified */
+ proto_tree_add_text(h264_nal_tree, tvb, offset, -1, "Unspecified NAL unit type");
+ break;
+ case 1: /* Coded slice of a non-IDR picture */
+ dissect_h264_slice_layer_without_partitioning_rbsp(tree, tvb, pinfo, offset);
+ break;
+ case 2: /* Coded slice data partition A */
+ dissect_h264_slice_data_partition_a_layer_rbsp(tree, tvb, pinfo, offset);
+ break;
+ case 3: /* Coded slice data partition B */
+ dissect_h264_slice_data_partition_b_layer_rbsp(tree, tvb, pinfo, offset);
+ break;
+ case 4: /* Coded slice data partition C */
+ dissect_h264_slice_data_partition_c_layer_rbsp(tree, tvb, pinfo, offset);
+ break;
+ case 5: /* Coded slice of an IDR picture */
+ dissect_h264_slice_layer_without_partitioning_rbsp(tree, tvb, pinfo, offset);
+ break;
+ case 6: /* Supplemental enhancement information (SEI) */
+ dissect_h264_sei_rbsp(tree, tvb, pinfo, offset);
+ break;
+ case 7: /* Sequence parameter set*/
+ dissect_h264_seq_parameter_set_rbsp(tree, tvb, pinfo, offset);
+ break;
+ case 8: /* Picture parameter set */
+ dissect_h264_pic_parameter_set_rbsp(tree, tvb, pinfo, offset);
+ break;
+ case 9: /* Access unit delimiter */
+ dissect_h264_access_unit_delimiter_rbsp(tree, tvb, pinfo, offset);
+ break;
+ case 10: /* End of sequence */
+ dissect_h264_end_of_seq_rbsp(tree, tvb, pinfo, offset);
+ break;
+ case 11: /* End of stream */
+ dissect_h264_end_of_stream_rbsp(tree, tvb, pinfo, offset);
+ break;
+ case 12: /* Filler data */
+ dissect_h264_filler_data_rbsp(tree, tvb, pinfo, offset);
+ break;
+ case 13: /* Sequence parameter set extension */
+ dissect_h264_seq_parameter_set_extension_rbsp(tree, tvb, pinfo, offset);
+ break;
+ case 14: /* Reserved */
+ case 15: /* Reserved */
+ case 16: /* Reserved */
+ case 17: /* Reserved */
+ case 18: /* Reserved */
+ proto_tree_add_text(h264_nal_tree, tvb, offset, -1, "Reserved NAL unit type");
+ break;
+ case 19: /* Coded slice of an auxiliary coded picture without partitioning */
+ dissect_h264_slice_layer_without_partitioning_rbsp(tree, tvb, pinfo, offset);
+ break;
+ default:
+ /* 24..31 Unspecified */
+ proto_tree_add_text(h264_nal_tree, tvb, offset, -1, "Unspecified NAL unit type");
+ break;
+ }
+
+}
/* Code to actually dissect the packets */
static void
dissect_h264(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
@@ -184,7 +420,7 @@ dissect_h264(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
*/
proto_tree_add_item(h264_nal_tree, hf_h264_nal_f_bit, tvb, offset, 1, FALSE);
proto_tree_add_item(h264_nal_tree, hf_h264_nal_nri, tvb, offset, 1, FALSE);
- proto_tree_add_item(h264_nal_tree, hf_h264_nal_unit_type, tvb, offset, 1, FALSE);
+ proto_tree_add_item(h264_nal_tree, hf_h264_type, tvb, offset, 1, FALSE);
offset++;
proto_tree_add_text(h264_tree, tvb, offset, -1, "H264 bitstream");
}/* if tree */
@@ -243,9 +479,9 @@ proto_register_h264(void)
FT_UINT8, BASE_DEC, NULL, 0x60,
"NRI", HFILL }
},
- { &hf_h264_nal_unit_type,
+ { &hf_h264_type,
{ "NAL unit type", "h264.nal_unit_hdr",
- FT_UINT8, BASE_DEC, VALS(h264_nal_unit_type_values), 0x1f,
+ FT_UINT8, BASE_DEC, VALS(h264_type_values), 0x1f,
"NAL unit type", HFILL }
},
{ &hf_h264_profile,
@@ -260,27 +496,27 @@ proto_register_h264(void)
},
{ &hf_h264_constraint_set0_flag,
{ "Constraint_set0_flag", "h264.constraint_set0_flag",
- FT_UINT8, BASE_DEC, NULL, 0x01,
+ FT_UINT8, BASE_DEC, NULL, 0x80,
"Constraint_set0_flag", HFILL }
},
{ &hf_h264_constraint_set1_flag,
{ "Constraint_set1_flag", "h264.constraint_set1_flag",
- FT_UINT8, BASE_DEC, NULL, 0x02,
+ FT_UINT8, BASE_DEC, NULL, 0x40,
"Constraint_set1_flag", HFILL }
},
{ &hf_h264_constraint_set2_flag,
{ "Constraint_set1_flag", "h264.constraint_set2_flag",
- FT_UINT8, BASE_DEC, NULL, 0x04,
+ FT_UINT8, BASE_DEC, NULL, 0x20,
"NRI", HFILL }
},
{ &hf_h264_constraint_set3_flag,
{ "Constraint_set3_flag", "h264.constraint_set3_flag",
- FT_UINT8, BASE_DEC, NULL, 0x08,
+ FT_UINT8, BASE_DEC, NULL, 0x10,
"Constraint_set3_flag", HFILL }
},
{ &hf_h264_reserved_zero_4bits,
{ "Reserved_zero_4bits", "h264.reserved_zero_4bits",
- FT_UINT8, BASE_DEC, NULL, 0xf0,
+ FT_UINT8, BASE_DEC, NULL, 0x0f,
"Reserved_zero_4bits", HFILL }
},
{ &hf_h264_level_idc,
@@ -288,7 +524,26 @@ proto_register_h264(void)
FT_UINT8, BASE_DEC, NULL, 0x0,
"Level_id", HFILL }
},
-
+ { &hf_h264_nal_unit,
+ { "NAL unit", "h264.nal_unit",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "NAL unit", HFILL }
+ },
+ { &hf_h264_forbidden_zero_bit,
+ { "Forbidden_zero_bit", "h264.forbidden_zero_bit",
+ FT_UINT8, BASE_DEC, NULL, 0x80,
+ "forbidden_zero_bit", HFILL }
+ },
+ { &hf_h264_nal_ref_idc,
+ { "Nal_ref_idc", "h264.nal_ref_idc",
+ FT_UINT8, BASE_DEC, NULL, 0x60,
+ "nal_ref_idc", HFILL }
+ },
+ {&hf_h264_nal_unit_type,
+ { "Nal_unit_type", "h264.nal_unit_type",
+ FT_UINT8, BASE_DEC, VALS(h264_nal_unit_type_vals), 0x1f,
+ "nal_unit_type", HFILL }
+ },
};
/* Setup protocol subtree array */
@@ -296,6 +551,7 @@ proto_register_h264(void)
&ett_h264,
&ett_h264_profile,
&ett_h264_nal,
+ &ett_h264_nal_unit,
};
/* Register the protocol name and description */