/* 5.1.1 Picture Start Code (PSC) (22 bits) PSC is a word of 22 bits. Its value is 0000 0000 0000 0000 1 00000. All picture start codes shall be byte aligned. ( 1000 00xx) End Of Sequence (EOS) (22 bits) A codeword of 22 bits. Its value is 0000 0000 0000 0000 1 11111. ( 1111 11xx ) Group of Block Start Code (GBSC) (17 bits) A word of 17 bits. Its value is 0000 0000 0000 0000 1. ( 1xxx xxxx ) End Of Sub-Bitstream code (EOSBS) (23 bits) The EOSBS code is a codeword of 23 bits. Its value is 0000 0000 0000 0000 1 11110 0. ( 1111 100x ) Slice Start Code (SSC) (17 bits) A word of 17 bits. Its value is 0000 0000 0000 0000 1. ( 1xxx xxxx ) */ static void dissect_h263_data( tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree ) { guint offset = 0; proto_item *h263_payload_item = NULL; proto_tree *h263_payload_tree = NULL; guint32 data; guint8 startcode; col_append_str( pinfo->cinfo, COL_INFO, "H263 payload "); if( tree ) { h263_payload_item = proto_tree_add_item( tree, proto_h263_data, tvb, offset, -1, FALSE ); h263_payload_tree = proto_item_add_subtree( h263_payload_item, ett_h263_payload ); } /* 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 & 0xffff8000) == 0x00008000 ) { /* Start Code found * * Startc code holds bit 17 -23 of the codeword */ startcode = tvb_get_guint8(tvb,offset+2)&0xfe; if (startcode & 0x80){ switch(startcode){ case 0xf8: /* End Of Sub-Bitstream code (EOSBS) * ( 1111 100. ) */ break; case 0x80: case 0x82: /* Picture Start Code (PSC) * ( 1000 00x.) */ col_append_str( pinfo->cinfo, COL_INFO, "(PSC) "); offset = dissect_h263_picture_layer( tvb, pinfo, h263_payload_tree, offset, -1, FALSE); break; case 0xfc: case 0xfe: /* End Of Sequence (EOS) * ( 1111 11x. ) */ default: /* Group of Block Start Code (GBSC) or * Slice Start Code (SSC) */ col_append_str( pinfo->cinfo, COL_INFO, "(GBSC) "); offset = dissect_h263_group_of_blocks_layer( tvb, h263_payload_tree, offset,FALSE); break; } }else{ /* Error */ } } if( tree ) proto_tree_add_item( h263_payload_tree, hf_h263_data, tvb, offset, -1, FALSE ); }
/* RFC 4629 */ static void dissect_h263P( tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree ) { proto_item *ti = NULL; proto_item *data_item = NULL; proto_item *extra_hdr_item = NULL; proto_tree *h263P_tree = NULL; proto_tree *h263P_extr_hdr_tree = NULL; proto_tree *h263P_data_tree = NULL; unsigned int offset = 0; guint16 data16, plen; guint8 startcode; /* tvbuff_t *next_tvb; */ col_set_str(pinfo->cinfo, COL_PROTOCOL, "H.263 RFC4629 "); if ( tree ) { ti = proto_tree_add_item( tree, proto_h263P, tvb, offset, -1, ENC_NA ); h263P_tree = proto_item_add_subtree( ti, ett_h263P ); data16 = tvb_get_ntohs(tvb,offset); proto_tree_add_item( h263P_tree, hf_h263P_rr, tvb, offset, 2, ENC_BIG_ENDIAN ); proto_tree_add_item( h263P_tree, hf_h263P_pbit, tvb, offset, 2, ENC_BIG_ENDIAN ); proto_tree_add_item( h263P_tree, hf_h263P_vbit, tvb, offset, 2, ENC_BIG_ENDIAN ); proto_tree_add_item( h263P_tree, hf_h263P_plen, tvb, offset, 2, ENC_BIG_ENDIAN ); proto_tree_add_item( h263P_tree, hf_h263P_pebit, tvb, offset, 2, ENC_BIG_ENDIAN ); offset = offset +2; /* * V: 1 bit * * Indicates the presence of an 8-bit field containing information * for Video Redundancy Coding (VRC), which follows immediately after * the initial 16 bits of the payload header, if present. For syntax * and semantics of that 8-bit VRC field, see Section 5.2. */ if ((data16&0x0200)==0x0200){ /* V bit = 1 * The format of the VRC header extension is as follows: * * 0 1 2 3 4 5 6 7 * +-+-+-+-+-+-+-+-+ * | TID | Trun |S| * +-+-+-+-+-+-+-+-+ * * TID: 3 bits * * Thread ID. Up to 7 threads are allowed. Each frame of H.263+ VRC * data will use as reference information only sync frames or frames * within the same thread. By convention, thread 0 is expected to be * the "canonical" thread, which is the thread from which the sync frame * should ideally be used. In the case of corruption or loss of the * thread 0 representation, a representation of the sync frame with a * higher thread number can be used by the decoder. Lower thread * numbers are expected to contain representations of the sync frames * equal to or better than higher thread numbers in the absence of data * corruption or loss. See [Vredun] for a detailed discussion of VRC. * * Trun: 4 bits * * Monotonically increasing (modulo 16) 4-bit number counting the packet * number within each thread. * * S: 1 bit * * A bit that indicates that the packet content is for a sync frame. * : */ proto_tree_add_item( h263P_tree, hf_h263P_tid, tvb, offset, 1, ENC_BIG_ENDIAN ); proto_tree_add_item( h263P_tree, hf_h263P_trun, tvb, offset, 1, ENC_BIG_ENDIAN ); proto_tree_add_item( h263P_tree, hf_h263P_s, tvb, offset, 1, ENC_BIG_ENDIAN ); offset++; } /* Length, in bytes, of the extra picture header. */ plen = (data16 & 0x01f8) >> 3; if (plen != 0){ extra_hdr_item = proto_tree_add_item( h263P_tree, hf_h263P_extra_hdr, tvb, offset, plen, ENC_NA ); h263P_extr_hdr_tree = proto_item_add_subtree( extra_hdr_item, ett_h263P_extra_hdr ); dissect_h263_picture_layer( tvb, pinfo, h263P_extr_hdr_tree, offset, plen, TRUE); offset += plen; } if ((data16&0x0400)!=0){ /* P bit = 1 */ data_item = proto_tree_add_item( h263P_tree, hf_h263P_payload, tvb, offset, -1, ENC_NA ); h263P_data_tree = proto_item_add_subtree( data_item, ett_h263P_data ); /* Startc code holds bit 17 -23 of the codeword */ startcode = tvb_get_guint8(tvb,offset)&0xfe; if (startcode & 0x80){ /* All picture, slice, and EOSBS start codes * shall be byte aligned, and GOB and EOS start codes may be byte aligned. */ switch(startcode){ case 0xf8: /* End Of Sub-Bitstream code (EOSBS) * EOSBS codes shall be byte aligned * ( 1111 100. ) */ break; case 0x80: case 0x82: /* Picture Start Code (PSC) * ( 1000 00x.) */ col_append_str( pinfo->cinfo, COL_INFO, "(PSC) "); dissect_h263_picture_layer( tvb, pinfo, h263P_data_tree, offset, -1, TRUE); break; case 0xfc: case 0xfe: /* End Of Sequence (EOS) * ( 1111 11x. ) */ default: /* Group of Block Start Code (GBSC) or * Slice Start Code (SSC) */ col_append_str( pinfo->cinfo, COL_INFO, "(GBSC) "); dissect_h263_group_of_blocks_layer( tvb, h263P_data_tree, offset,TRUE); break; } }else{ /* Error */ } return; } proto_tree_add_item( h263P_tree, hf_h263P_payload, tvb, offset, -1, ENC_NA ); } }