The TS_BITMAP_DATA_EX structure is used to encapsulate encoded bitmap data.
 private TS_BITMAP_DATA_EX Create_TS_BITMAP_DATA_EX(TSBitmapDataExFlags_Values flags, byte codecId)
 {
     TS_BITMAP_DATA_EX tsBitmapDataEx = new TS_BITMAP_DATA_EX();
     tsBitmapDataEx.bpp = 32; // Hard code
     tsBitmapDataEx.flags = flags;
     tsBitmapDataEx.reserved = 0; // It Must be set to zero.
     tsBitmapDataEx.codecID = codecId;
     tsBitmapDataEx.width = 0;
     tsBitmapDataEx.height = 0;
     // bitmapDataLength and bitmapData was handled in call method.
     if(flags.HasFlag(TSBitmapDataExFlags_Values.EX_COMPRESSED_BITMAP_HEADER_PRESENT))
     {
         tsBitmapDataEx.exBitmapDataHeader = Create_TS_COMPRESSED_BITMAP_HEADER_EX();
     }
     return tsBitmapDataEx;
 }
        /// <summary>
        /// Parse TS_BITMAP_DATA_EX
        /// (parser index is updated according to parsed length)
        /// </summary>
        /// <param name="data">data to be parsed</param>
        /// <param name="currentIndex">current parser index</param>
        /// <returns>TS_BITMAP_DATA_EX</returns>
        private TS_BITMAP_DATA_EX ParseTsBitmapDataEx(byte[] data, ref int currentIndex)
        {
            TS_BITMAP_DATA_EX bitmapDataEx = new TS_BITMAP_DATA_EX();

            // TS_BITMAP_DATA_EX: bpp
            bitmapDataEx.bpp = ParseByte(data, ref currentIndex);

            // TS_BITMAP_DATA_EX: flags
            bitmapDataEx.flags = (TSBitmapDataExFlags_Values)ParseByte(data, ref currentIndex);

            // TS_BITMAP_DATA_EX: reserved
            bitmapDataEx.reserved = ParseByte(data, ref currentIndex);

            // TS_BITMAP_DATA_EX: codecID
            bitmapDataEx.codecID = ParseByte(data, ref currentIndex);

            // TS_BITMAP_DATA_EX: width
            bitmapDataEx.width = ParseUInt16(data, ref currentIndex, false);

            // TS_BITMAP_DATA_EX: height
            bitmapDataEx.height = ParseUInt16(data, ref currentIndex, false);

            // TS_BITMAP_DATA_EX: bitmapDataLength
            bitmapDataEx.bitmapDataLength = ParseUInt32(data, ref currentIndex, false);

            if (IsFlagExist((byte)bitmapDataEx.flags, (byte)TSBitmapDataExFlags_Values.EX_COMPRESSED_BITMAP_HEADER_PRESENT))
            {
                bitmapDataEx.exBitmapDataHeader = ParseExBitmapdataHeader(data, ref currentIndex);
            }

            // TS_BITMAP_DATA_EX: bitmapData
            bitmapDataEx.bitmapData = GetBytes(data, ref currentIndex, (int)bitmapDataEx.bitmapDataLength);

            return bitmapDataEx;
        }
        /// <summary>
        /// Parse TS_BITMAP_DATA_EX
        /// (parser index is updated according to parsed length)
        /// </summary>
        /// <param name="data">data to be parsed</param>
        /// <param name="currentIndex">current parser index</param>
        /// <returns>TS_BITMAP_DATA_EX</returns>
        private TS_BITMAP_DATA_EX ParseTsBitmapDataEx(byte[] data, ref int currentIndex)
        {
            TS_BITMAP_DATA_EX bitmapDataEx = new TS_BITMAP_DATA_EX();

            // TS_BITMAP_DATA_EX: bpp
            bitmapDataEx.bpp = ParseByte(data, ref currentIndex);

            // TS_BITMAP_DATA_EX: reserved1
            bitmapDataEx.reserved1 = ParseByte(data, ref currentIndex);

            // TS_BITMAP_DATA_EX: reserved2
            bitmapDataEx.reserved2 = ParseByte(data, ref currentIndex);

            // TS_BITMAP_DATA_EX: codecID
            bitmapDataEx.codecID = ParseByte(data, ref currentIndex);

            // TS_BITMAP_DATA_EX: width
            bitmapDataEx.width = ParseUInt16(data, ref currentIndex, false);

            // TS_BITMAP_DATA_EX: height
            bitmapDataEx.height = ParseUInt16(data, ref currentIndex, false);

            // TS_BITMAP_DATA_EX: bitmapDataLength
            bitmapDataEx.bitmapDataLength = ParseUInt32(data, ref currentIndex, false);

            // TS_BITMAP_DATA_EX: bitmapData
            bitmapDataEx.bitmapData = GetBytes(data, ref currentIndex, (int)bitmapDataEx.bitmapDataLength);

            return bitmapDataEx;
        }