diff options
author | Anders Broman <anders.broman@ericsson.com> | 2005-03-22 15:36:33 +0000 |
---|---|---|
committer | Anders Broman <anders.broman@ericsson.com> | 2005-03-22 15:36:33 +0000 |
commit | a17d3c60ba3a1626091cdf16db00cab06d603bc1 (patch) | |
tree | 731d411340470b85f89a7cd8b2da4bfff2eadace /epan/dissectors/packet-h263.c | |
parent | c728f022df53346b371290f3acedcf5a8a8f3a2f (diff) |
Dissect part of the payload.
svn path=/trunk/; revision=13862
Diffstat (limited to 'epan/dissectors/packet-h263.c')
-rw-r--r-- | epan/dissectors/packet-h263.c | 201 |
1 files changed, 194 insertions, 7 deletions
diff --git a/epan/dissectors/packet-h263.c b/epan/dissectors/packet-h263.c index d0ede9b47b..b44e11dc29 100644 --- a/epan/dissectors/packet-h263.c +++ b/epan/dissectors/packet-h263.c @@ -75,8 +75,17 @@ static int hf_h263_hmv2 = -1; static int hf_h263_vmv2 = -1; /* Fields for the data section */ static int hf_h263_psc = -1; +static int hf_h263_gbsc = -1; static int hf_h263_TR =-1; - +static int hf_h263_split_screen_indicator = -1; +static int hf_h263_document_camera_indicator = -1; +static int hf_h263_full_picture_freeze_release = -1; +static int hf_h263_source_format = -1; +static int hf_h263_payload_picture_coding_type = -1; +static int hf_h263_opt_unres_motion_vector_mode = -1; +static int hf_h263_syntax_based_arithmetic_coding_mode = -1; +static int hf_h263_optional_advanced_prediction_mode = -1; +static int hf_h263_PB_frames_mode = -1; static int hf_h263_data = -1; /* Source format types */ @@ -98,6 +107,20 @@ static const value_string srcformat_vals[] = { 0, NULL }, }; +static const true_false_string on_off_flg = { + "On", + "Off" +}; +static const true_false_string picture_coding_type_flg = { + "INTER (P-picture)", + "INTRA (I-picture)" +}; + +static const true_false_string PB_frames_mode_flg = { + "PB-frame", + "Normal I- or P-picture" +}; + /* H.263 fields defining a sub tree */ static gint ett_h263 = -1; static gint ett_h263_payload = -1; @@ -111,6 +134,7 @@ dissect_h263( tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree ) unsigned int offset = 0; unsigned int h263_version = 0; guint32 data; + guint8 octet; h263_version = (tvb_get_guint8( tvb, offset ) & 0xc0 ) >> 6; @@ -253,13 +277,56 @@ dissect_h263( tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree ) /* Check for PSC, PSC is a word of 22 bits. Its value is 0000 0000 0000 0000' 1000 00xx xxxx xxxx. */ data = tvb_get_ntohl(tvb, offset); - if (( data & 0xfffffc00) == 0x00008000 ) { /* PSC found */ - proto_tree_add_uint(h263_payload_tree, hf_h263_psc,tvb, offset,3,data); - offset = offset + 2; - proto_tree_add_uint(h263_payload_tree, hf_h263_TR,tvb, offset,2,data); - + + if (( data & 0xffff8000) == 0x00008000 ) { /* PSC or Group of Block Start Code (GBSC) found */ + if (( data & 0xfffffc00) == 0x00008000 ) { /* PSC found */ + proto_tree_add_uint(h263_payload_tree, hf_h263_psc,tvb, offset,3,data); + offset = offset + 2; + proto_tree_add_uint(h263_payload_tree, hf_h263_TR,tvb, offset,2,data); + /* Last two bits in the 32 bits fetched + * Bit 1: Always "1", in order to avoid start code emulation. + * Bit 2: Always "0", for distinction with Recommendation H.261. + */ + offset = offset + 2; + /* Bit 3: Split screen indicator, "0" off, "1" on. */ + proto_tree_add_item( h263_payload_tree, hf_h263_split_screen_indicator, tvb, offset, 1, FALSE ); + /* Bit 4: Document camera indicator, */ + proto_tree_add_item( h263_payload_tree, hf_h263_document_camera_indicator, tvb, offset, 1, FALSE ); + /* Bit 5: Full Picture Freeze Release, "0" off, "1" on. */ + proto_tree_add_item( h263_payload_tree, hf_h263_full_picture_freeze_release, tvb, offset, 1, FALSE ); + /* Bits 6-8: Source Format, "000" forbidden, "001" sub-QCIF, "010" QCIF, "011" CIF, + * "100" 4CIF, "101" 16CIF, "110" reserved, "111" extended PTYPE. + */ + proto_tree_add_item( h263_payload_tree, hf_h263_source_format, tvb, offset, 1, TRUE ); + octet = tvb_get_guint8(tvb,offset); + if (( octet & 0x1c) != 0x1c){ + /* Not extended PTYPE */ + /* Bit 9: Picture Coding Type, "0" INTRA (I-picture), "1" INTER (P-picture). */ + proto_tree_add_item( h263_payload_tree, hf_h263_payload_picture_coding_type, tvb, offset, 1, FALSE ); + /* Bit 10: Optional Unrestricted Motion Vector mode (see Annex D), "0" off, "1" on. */ + proto_tree_add_item( h263_payload_tree, hf_h263_opt_unres_motion_vector_mode, tvb, offset, 1, FALSE ); + offset++; + /* Bit 11: Optional Syntax-based Arithmetic Coding mode (see Annex E), "0" off, "1" on.*/ + proto_tree_add_item( h263_payload_tree, hf_h263_syntax_based_arithmetic_coding_mode, tvb, offset, 1, FALSE ); + /* Bit 12: Optional Advanced Prediction mode (see Annex F), "0" off, "1" on.*/ + proto_tree_add_item( h263_payload_tree, hf_h263_optional_advanced_prediction_mode, tvb, offset, 1, FALSE ); + /* Bit 13: Optional PB-frames mode (see Annex G), "0" normal I- or P-picture, "1" PB-frame.*/ + proto_tree_add_item( h263_payload_tree, hf_h263_PB_frames_mode, tvb, offset, 1, FALSE ); + } + }else{ + if ((data & 0x00007c00)!= 0) { /* GBSC found */ + + /* Group of Block Start Code (GBSC) (17 bits) + * A word of 17 bits. Its value is 0000 0000 0000 0000 1. GOB start codes may be byte aligned. This + * can be achieved by inserting GSTUF before the start code such that the first bit of the start code is + * the first (most significant) bit of a byte. + * + */ + proto_tree_add_uint(h263_payload_tree, hf_h263_gbsc,tvb, offset,3,data); + offset = offset + 2; + } + } } - proto_tree_add_item( h263_payload_tree, hf_h263_data, tvb, offset, -1, FALSE ); } } @@ -545,6 +612,17 @@ proto_register_h263(void) "Picture start Code, PSC", HFILL } }, + { &hf_h263_gbsc, + { + "H.263 Group of Block Start Code", + "h263.gbsc", + FT_UINT32, + BASE_HEX, + NULL, + 0xffff8000, + "Group of Block Start Code", HFILL + } + }, { &hf_h263_TR, { @@ -557,6 +635,115 @@ proto_register_h263(void) "Temporal Reference, TR", HFILL } }, + { + &hf_h263_split_screen_indicator, + { + "H.263 Split screen indicator", + "h263.split_screen_indicator", + FT_BOOLEAN, + 8, + TFS(&on_off_flg), + 0x80, + "Split screen indicator", HFILL + } + }, + { + &hf_h263_document_camera_indicator, + { + "H.263 Document camera indicator", + "h263.document_camera_indicator", + FT_BOOLEAN, + 8, + TFS(&on_off_flg), + 0x40, + "Document camera indicator", HFILL + } + }, + { + &hf_h263_full_picture_freeze_release, + { + "H.263 Full Picture Freeze Release", + "h263.split_screen_indicator", + FT_BOOLEAN, + 8, + TFS(&on_off_flg), + 0x20, + "Full Picture Freeze Release", HFILL + } + }, + { + &hf_h263_source_format, + { + "H.263 Source Format", + "h263.split_screen_indicator", + FT_UINT8, + BASE_HEX, + VALS(srcformat_vals), + 0x1c, + "Source Format", HFILL + } + }, + { + &hf_h263_payload_picture_coding_type, + { + "H.263 Picture Coding Type", + "h263.picture_coding_type", + FT_BOOLEAN, + 8, + TFS(&picture_coding_type_flg), + 0x02, + "Picture Coding Typet", HFILL + } + }, + { + &hf_h263_opt_unres_motion_vector_mode, + { + "H.263 Optional Unrestricted Motion Vector mode", + "h263.opt_unres_motion_vector_mode", + FT_BOOLEAN, + 8, + TFS(&on_off_flg), + 0x01, + "Optional Unrestricted Motion Vector mode", HFILL + } + }, + { + &hf_h263_syntax_based_arithmetic_coding_mode, + { + "H.263 Optional Syntax-based Arithmetic Coding mode", + "h263.syntax_based_arithmetic_coding_mode", + FT_BOOLEAN, + 8, + TFS(&on_off_flg), + 0x80, + "Optional Syntax-based Arithmetic Coding mode", HFILL + } + }, + { + &hf_h263_optional_advanced_prediction_mode, + { + "H.263 Optional Advanced Prediction mode", + "h263.optional_advanced_prediction_mode", + FT_BOOLEAN, + 8, + TFS(&on_off_flg), + 0x40, + "Optional Advanced Prediction mode", HFILL + } + }, + { + &hf_h263_PB_frames_mode, + { + "H.263 Optional PB-frames mode", + "h263.PB_frames_mode", + FT_BOOLEAN, + 8, + TFS(&PB_frames_mode_flg), + 0x20, + "Optional PB-frames mode", HFILL + } + }, + }; static gint *ett[] = |