Repository files navigation

AndroidVideoStreamer

Simple android app that can connect to a specified address and stream data to it

Connection protocol

Application uses ultra-modern communication protocol SDTUDTP3K (SDevTeam Ultra Data Transfer Protocol 3000). Here is its specification:

Commands

Server and client exchange with raw binary data (not strings!). Commands may be of 2 types: control command and data command. Control command is one single byte of data with following values (INPORTANT! Following constants are of type signed byte, sbyte, char in C++ or byte in Java):

(client can send following commands):

  • 0x1E: "Hello server" message;
  • 0x31: client is to change data command length (IMPORTANT! This command is followed with 4 bytes of length!);
  • 0x3F: "Fone reset" command;
  • 0x45: "Goodbye server" message;

(server can send following commands):

  • 0x1A: "Hello client" message;
  • 0x2D: "Data received" server response;
  • 0x3E: "Command executed" message;
  • 0x4C: "Goodbye client" message;

(both server and client can send following commands):

  • 0x66: some error occured;

Data command is a bulk array of image data bytes, following the single byte with value 0x00 (to differ data command from control command). First 2 bytes of this array represent image width (as a Java short variable), and second ones represent image height. This type of command can be sent only from client side. See more in part Data Format

Communication

  1. Handshaking:
  2. Client (who starts the connection) sends "Hello server" message (0x1E).
  3. Server sends "Hello client" message (0x1A).
  4. Client sends 4 bytes that represent data command data length (without considering 0x00 byte!).

NOTICE: there is a SDTUDTP3Km version of protocol, which does not includes data sending into handshake, but the first command after handshake is always length change command (0x31), that is followed with 4 bytes of value of new data length.

  1. After handshaking, data exchange starts:

  2. Client sends data command.

  3. Server sends "Data received" (0x2D) message.

  4. Can be repeated till the end of days.

  5. If client answers with not a data command (first byte is not zero), it is a control command:

  6. Client sends a command (see list above).

  7. Server executes the command and sends "Command executed" message (0x3E) if succeeded.

  8. Server sends error message (0x66) if some error has occured while executing the command. Communication SHOULD NOT stop in this case.

  9. Closing the connection:

  10. Client is always the initiator of closing the connection.

  11. Client sends "Goodbye server" message (0x45).

  12. Server sends "Goodbye client" message (0x4C).

  13. Server closes the connection (socket).

  14. Error handling:

  15. If server has some internal error (important: not during execution of client command (3.2)), it sends error message 0x66.

  16. If client has some internal error, it sends error message 0x66.

  17. Crashed device doesn't have to close socket or send any other data. The other device should properly handle this situation.

  18. If client crashes, server returns to "wait mode", awaiting a client to connect.

  19. If server crashes, client returns to "connect" screen and should be ready for further attempts to connect to server.

Data Format

Image is sent as raw byte sequence in format YUV NV_21. For an appropriate conversion from it to RGB, see this class (the last method in the file).

Raw image data follows 4 bytes representing image width and height, 2 bytes per value. They are stored as signed short integers (short in Java).

About

Simple android app that can connect to a specified address and stream data to it

Resources

Stars

0 stars

Watchers

5 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

AndroidVideoStreamer

Simple android app that can connect to a specified address and stream data to it

Connection protocol

Application uses ultra-modern communication protocol SDTUDTP3K (SDevTeam Ultra Data Transfer Protocol 3000). Here is its specification:

Commands

Server and client exchange with raw binary data (not strings!). Commands may be of 2 types: control command and data command. Control command is one single byte of data with following values (INPORTANT! Following constants are of type signed byte, sbyte, char in C++ or byte in Java):

(client can send following commands):

  • 0x1E: "Hello server" message;
  • 0x31: client is to change data command length (IMPORTANT! This command is followed with 4 bytes of length!);
  • 0x3F: "Fone reset" command;
  • 0x45: "Goodbye server" message;

(server can send following commands):

  • 0x1A: "Hello client" message;
  • 0x2D: "Data received" server response;
  • 0x3E: "Command executed" message;
  • 0x4C: "Goodbye client" message;

(both server and client can send following commands):

  • 0x66: some error occured;

Data command is a bulk array of image data bytes, following the single byte with value 0x00 (to differ data command from control command). First 2 bytes of this array represent image width (as a Java short variable), and second ones represent image height. This type of command can be sent only from client side. See more in part Data Format

Communication

  1. Handshaking:
  2. Client (who starts the connection) sends "Hello server" message (0x1E).
  3. Server sends "Hello client" message (0x1A).
  4. Client sends 4 bytes that represent data command data length (without considering 0x00 byte!).

NOTICE: there is a SDTUDTP3Km version of protocol, which does not includes data sending into handshake, but the first command after handshake is always length change command (0x31), that is followed with 4 bytes of value of new data length.

  1. After handshaking, data exchange starts:

  2. Client sends data command.

  3. Server sends "Data received" (0x2D) message.

  4. Can be repeated till the end of days.

  5. If client answers with not a data command (first byte is not zero), it is a control command:

  6. Client sends a command (see list above).

  7. Server executes the command and sends "Command executed" message (0x3E) if succeeded.

  8. Server sends error message (0x66) if some error has occured while executing the command. Communication SHOULD NOT stop in this case.

  9. Closing the connection:

  10. Client is always the initiator of closing the connection.

  11. Client sends "Goodbye server" message (0x45).

  12. Server sends "Goodbye client" message (0x4C).

  13. Server closes the connection (socket).

  14. Error handling:

  15. If server has some internal error (important: not during execution of client command (3.2)), it sends error message 0x66.

  16. If client has some internal error, it sends error message 0x66.

  17. Crashed device doesn't have to close socket or send any other data. The other device should properly handle this situation.

  18. If client crashes, server returns to "wait mode", awaiting a client to connect.

  19. If server crashes, client returns to "connect" screen and should be ready for further attempts to connect to server.

Data Format

Image is sent as raw byte sequence in format YUV NV_21. For an appropriate conversion from it to RGB, see this class (the last method in the file).

Raw image data follows 4 bytes representing image width and height, 2 bytes per value. They are stored as signed short integers (short in Java).

About

Simple android app that can connect to a specified address and stream data to it

Resources

Stars

0 stars

Watchers

5 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

AndroidVideoStreamer

Simple android app that can connect to a specified address and stream data to it

Connection protocol

Application uses ultra-modern communication protocol SDTUDTP3K (SDevTeam Ultra Data Transfer Protocol 3000). Here is its specification:

Commands

Server and client exchange with raw binary data (not strings!). Commands may be of 2 types: control command and data command. Control command is one single byte of data with following values (INPORTANT! Following constants are of type signed byte, sbyte, char in C++ or byte in Java):

(client can send following commands):

  • 0x1E: "Hello server" message;
  • 0x31: client is to change data command length (IMPORTANT! This command is followed with 4 bytes of length!);
  • 0x3F: "Fone reset" command;
  • 0x45: "Goodbye server" message;

(server can send following commands):

  • 0x1A: "Hello client" message;
  • 0x2D: "Data received" server response;
  • 0x3E: "Command executed" message;
  • 0x4C: "Goodbye client" message;

(both server and client can send following commands):

  • 0x66: some error occured;

Data command is a bulk array of image data bytes, following the single byte with value 0x00 (to differ data command from control command). First 2 bytes of this array represent image width (as a Java short variable), and second ones represent image height. This type of command can be sent only from client side. See more in part Data Format

Communication

  1. Handshaking:
  2. Client (who starts the connection) sends "Hello server" message (0x1E).
  3. Server sends "Hello client" message (0x1A).
  4. Client sends 4 bytes that represent data command data length (without considering 0x00 byte!).

NOTICE: there is a SDTUDTP3Km version of protocol, which does not includes data sending into handshake, but the first command after handshake is always length change command (0x31), that is followed with 4 bytes of value of new data length.

  1. After handshaking, data exchange starts:

  2. Client sends data command.

  3. Server sends "Data received" (0x2D) message.

  4. Can be repeated till the end of days.

  5. If client answers with not a data command (first byte is not zero), it is a control command:

  6. Client sends a command (see list above).

  7. Server executes the command and sends "Command executed" message (0x3E) if succeeded.

  8. Server sends error message (0x66) if some error has occured while executing the command. Communication SHOULD NOT stop in this case.

  9. Closing the connection:

  10. Client is always the initiator of closing the connection.

  11. Client sends "Goodbye server" message (0x45).

  12. Server sends "Goodbye client" message (0x4C).

  13. Server closes the connection (socket).

  14. Error handling:

  15. If server has some internal error (important: not during execution of client command (3.2)), it sends error message 0x66.

  16. If client has some internal error, it sends error message 0x66.

  17. Crashed device doesn't have to close socket or send any other data. The other device should properly handle this situation.

  18. If client crashes, server returns to "wait mode", awaiting a client to connect.

  19. If server crashes, client returns to "connect" screen and should be ready for further attempts to connect to server.

Data Format

Image is sent as raw byte sequence in format YUV NV_21. For an appropriate conversion from it to RGB, see this class (the last method in the file).

Raw image data follows 4 bytes representing image width and height, 2 bytes per value. They are stored as signed short integers (short in Java).

About

Simple android app that can connect to a specified address and stream data to it

Resources

Stars

0 stars

Watchers

5 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

AndroidVideoStreamer

Simple android app that can connect to a specified address and stream data to it

Connection protocol

Application uses ultra-modern communication protocol SDTUDTP3K (SDevTeam Ultra Data Transfer Protocol 3000). Here is its specification:

Commands

Server and client exchange with raw binary data (not strings!). Commands may be of 2 types: control command and data command. Control command is one single byte of data with following values (INPORTANT! Following constants are of type signed byte, sbyte, char in C++ or byte in Java):

(client can send following commands):

  • 0x1E: "Hello server" message;
  • 0x31: client is to change data command length (IMPORTANT! This command is followed with 4 bytes of length!);
  • 0x3F: "Fone reset" command;
  • 0x45: "Goodbye server" message;

(server can send following commands):

  • 0x1A: "Hello client" message;
  • 0x2D: "Data received" server response;
  • 0x3E: "Command executed" message;
  • 0x4C: "Goodbye client" message;

(both server and client can send following commands):

  • 0x66: some error occured;

Data command is a bulk array of image data bytes, following the single byte with value 0x00 (to differ data command from control command). First 2 bytes of this array represent image width (as a Java short variable), and second ones represent image height. This type of command can be sent only from client side. See more in part Data Format

Communication

  1. Handshaking:
  2. Client (who starts the connection) sends "Hello server" message (0x1E).
  3. Server sends "Hello client" message (0x1A).
  4. Client sends 4 bytes that represent data command data length (without considering 0x00 byte!).

NOTICE: there is a SDTUDTP3Km version of protocol, which does not includes data sending into handshake, but the first command after handshake is always length change command (0x31), that is followed with 4 bytes of value of new data length.

  1. After handshaking, data exchange starts:

  2. Client sends data command.

  3. Server sends "Data received" (0x2D) message.

  4. Can be repeated till the end of days.

  5. If client answers with not a data command (first byte is not zero), it is a control command:

  6. Client sends a command (see list above).

  7. Server executes the command and sends "Command executed" message (0x3E) if succeeded.

  8. Server sends error message (0x66) if some error has occured while executing the command. Communication SHOULD NOT stop in this case.

  9. Closing the connection:

  10. Client is always the initiator of closing the connection.

  11. Client sends "Goodbye server" message (0x45).

  12. Server sends "Goodbye client" message (0x4C).

  13. Server closes the connection (socket).

  14. Error handling:

  15. If server has some internal error (important: not during execution of client command (3.2)), it sends error message 0x66.

  16. If client has some internal error, it sends error message 0x66.

  17. Crashed device doesn't have to close socket or send any other data. The other device should properly handle this situation.

  18. If client crashes, server returns to "wait mode", awaiting a client to connect.

  19. If server crashes, client returns to "connect" screen and should be ready for further attempts to connect to server.

Data Format

Image is sent as raw byte sequence in format YUV NV_21. For an appropriate conversion from it to RGB, see this class (the last method in the file).

Raw image data follows 4 bytes representing image width and height, 2 bytes per value. They are stored as signed short integers (short in Java).

About

Simple android app that can connect to a specified address and stream data to it

Resources

Stars

0 stars

Watchers

5 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

AndroidVideoStreamer

Simple android app that can connect to a specified address and stream data to it

Connection protocol

Application uses ultra-modern communication protocol SDTUDTP3K (SDevTeam Ultra Data Transfer Protocol 3000). Here is its specification:

Commands

Server and client exchange with raw binary data (not strings!). Commands may be of 2 types: control command and data command. Control command is one single byte of data with following values (INPORTANT! Following constants are of type signed byte, sbyte, char in C++ or byte in Java):

(client can send following commands):

  • 0x1E: "Hello server" message;
  • 0x31: client is to change data command length (IMPORTANT! This command is followed with 4 bytes of length!);
  • 0x3F: "Fone reset" command;
  • 0x45: "Goodbye server" message;

(server can send following commands):

  • 0x1A: "Hello client" message;
  • 0x2D: "Data received" server response;
  • 0x3E: "Command executed" message;
  • 0x4C: "Goodbye client" message;

(both server and client can send following commands):

  • 0x66: some error occured;

Data command is a bulk array of image data bytes, following the single byte with value 0x00 (to differ data command from control command). First 2 bytes of this array represent image width (as a Java short variable), and second ones represent image height. This type of command can be sent only from client side. See more in part Data Format

Communication

  1. Handshaking:
  2. Client (who starts the connection) sends "Hello server" message (0x1E).
  3. Server sends "Hello client" message (0x1A).
  4. Client sends 4 bytes that represent data command data length (without considering 0x00 byte!).

NOTICE: there is a SDTUDTP3Km version of protocol, which does not includes data sending into handshake, but the first command after handshake is always length change command (0x31), that is followed with 4 bytes of value of new data length.

  1. After handshaking, data exchange starts:

  2. Client sends data command.

  3. Server sends "Data received" (0x2D) message.

  4. Can be repeated till the end of days.

  5. If client answers with not a data command (first byte is not zero), it is a control command:

  6. Client sends a command (see list above).

  7. Server executes the command and sends "Command executed" message (0x3E) if succeeded.

  8. Server sends error message (0x66) if some error has occured while executing the command. Communication SHOULD NOT stop in this case.

  9. Closing the connection:

  10. Client is always the initiator of closing the connection.

  11. Client sends "Goodbye server" message (0x45).

  12. Server sends "Goodbye client" message (0x4C).

  13. Server closes the connection (socket).

  14. Error handling:

  15. If server has some internal error (important: not during execution of client command (3.2)), it sends error message 0x66.

  16. If client has some internal error, it sends error message 0x66.

  17. Crashed device doesn't have to close socket or send any other data. The other device should properly handle this situation.

  18. If client crashes, server returns to "wait mode", awaiting a client to connect.

  19. If server crashes, client returns to "connect" screen and should be ready for further attempts to connect to server.

Data Format

Image is sent as raw byte sequence in format YUV NV_21. For an appropriate conversion from it to RGB, see this class (the last method in the file).

Raw image data follows 4 bytes representing image width and height, 2 bytes per value. They are stored as signed short integers (short in Java).

About

Simple android app that can connect to a specified address and stream data to it

Resources

Stars

0 stars

Watchers

5 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

AndroidVideoStreamer

Simple android app that can connect to a specified address and stream data to it

Connection protocol

Application uses ultra-modern communication protocol SDTUDTP3K (SDevTeam Ultra Data Transfer Protocol 3000). Here is its specification:

Commands

Server and client exchange with raw binary data (not strings!). Commands may be of 2 types: control command and data command. Control command is one single byte of data with following values (INPORTANT! Following constants are of type signed byte, sbyte, char in C++ or byte in Java):

(client can send following commands):

  • 0x1E: "Hello server" message;
  • 0x31: client is to change data command length (IMPORTANT! This command is followed with 4 bytes of length!);
  • 0x3F: "Fone reset" command;
  • 0x45: "Goodbye server" message;

(server can send following commands):

  • 0x1A: "Hello client" message;
  • 0x2D: "Data received" server response;
  • 0x3E: "Command executed" message;
  • 0x4C: "Goodbye client" message;

(both server and client can send following commands):

  • 0x66: some error occured;

Data command is a bulk array of image data bytes, following the single byte with value 0x00 (to differ data command from control command). First 2 bytes of this array represent image width (as a Java short variable), and second ones represent image height. This type of command can be sent only from client side. See more in part Data Format

Communication

  1. Handshaking:
  2. Client (who starts the connection) sends "Hello server" message (0x1E).
  3. Server sends "Hello client" message (0x1A).
  4. Client sends 4 bytes that represent data command data length (without considering 0x00 byte!).

NOTICE: there is a SDTUDTP3Km version of protocol, which does not includes data sending into handshake, but the first command after handshake is always length change command (0x31), that is followed with 4 bytes of value of new data length.

  1. After handshaking, data exchange starts:

  2. Client sends data command.

  3. Server sends "Data received" (0x2D) message.

  4. Can be repeated till the end of days.

  5. If client answers with not a data command (first byte is not zero), it is a control command:

  6. Client sends a command (see list above).

  7. Server executes the command and sends "Command executed" message (0x3E) if succeeded.

  8. Server sends error message (0x66) if some error has occured while executing the command. Communication SHOULD NOT stop in this case.

  9. Closing the connection:

  10. Client is always the initiator of closing the connection.

  11. Client sends "Goodbye server" message (0x45).

  12. Server sends "Goodbye client" message (0x4C).

  13. Server closes the connection (socket).

  14. Error handling:

  15. If server has some internal error (important: not during execution of client command (3.2)), it sends error message 0x66.

  16. If client has some internal error, it sends error message 0x66.

  17. Crashed device doesn't have to close socket or send any other data. The other device should properly handle this situation.

  18. If client crashes, server returns to "wait mode", awaiting a client to connect.

  19. If server crashes, client returns to "connect" screen and should be ready for further attempts to connect to server.

Data Format

Image is sent as raw byte sequence in format YUV NV_21. For an appropriate conversion from it to RGB, see this class (the last method in the file).

Raw image data follows 4 bytes representing image width and height, 2 bytes per value. They are stored as signed short integers (short in Java).

About

Simple android app that can connect to a specified address and stream data to it

Resources

Stars

0 stars

Watchers

5 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

AndroidVideoStreamer

Simple android app that can connect to a specified address and stream data to it

Connection protocol

Application uses ultra-modern communication protocol SDTUDTP3K (SDevTeam Ultra Data Transfer Protocol 3000). Here is its specification:

Commands

Server and client exchange with raw binary data (not strings!). Commands may be of 2 types: control command and data command. Control command is one single byte of data with following values (INPORTANT! Following constants are of type signed byte, sbyte, char in C++ or byte in Java):

(client can send following commands):

  • 0x1E: "Hello server" message;
  • 0x31: client is to change data command length (IMPORTANT! This command is followed with 4 bytes of length!);
  • 0x3F: "Fone reset" command;
  • 0x45: "Goodbye server" message;

(server can send following commands):

  • 0x1A: "Hello client" message;
  • 0x2D: "Data received" server response;
  • 0x3E: "Command executed" message;
  • 0x4C: "Goodbye client" message;

(both server and client can send following commands):

  • 0x66: some error occured;

Data command is a bulk array of image data bytes, following the single byte with value 0x00 (to differ data command from control command). First 2 bytes of this array represent image width (as a Java short variable), and second ones represent image height. This type of command can be sent only from client side. See more in part Data Format

Communication

  1. Handshaking:
  2. Client (who starts the connection) sends "Hello server" message (0x1E).
  3. Server sends "Hello client" message (0x1A).
  4. Client sends 4 bytes that represent data command data length (without considering 0x00 byte!).

NOTICE: there is a SDTUDTP3Km version of protocol, which does not includes data sending into handshake, but the first command after handshake is always length change command (0x31), that is followed with 4 bytes of value of new data length.

  1. After handshaking, data exchange starts:

  2. Client sends data command.

  3. Server sends "Data received" (0x2D) message.

  4. Can be repeated till the end of days.

  5. If client answers with not a data command (first byte is not zero), it is a control command:

  6. Client sends a command (see list above).

  7. Server executes the command and sends "Command executed" message (0x3E) if succeeded.

  8. Server sends error message (0x66) if some error has occured while executing the command. Communication SHOULD NOT stop in this case.

  9. Closing the connection:

  10. Client is always the initiator of closing the connection.

  11. Client sends "Goodbye server" message (0x45).

  12. Server sends "Goodbye client" message (0x4C).

  13. Server closes the connection (socket).

  14. Error handling:

  15. If server has some internal error (important: not during execution of client command (3.2)), it sends error message 0x66.

  16. If client has some internal error, it sends error message 0x66.

  17. Crashed device doesn't have to close socket or send any other data. The other device should properly handle this situation.

  18. If client crashes, server returns to "wait mode", awaiting a client to connect.

  19. If server crashes, client returns to "connect" screen and should be ready for further attempts to connect to server.

Data Format

Image is sent as raw byte sequence in format YUV NV_21. For an appropriate conversion from it to RGB, see this class (the last method in the file).

Raw image data follows 4 bytes representing image width and height, 2 bytes per value. They are stored as signed short integers (short in Java).

About

Simple android app that can connect to a specified address and stream data to it

Resources

Stars

0 stars

Watchers

5 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

AndroidVideoStreamer

Simple android app that can connect to a specified address and stream data to it

Connection protocol

Application uses ultra-modern communication protocol SDTUDTP3K (SDevTeam Ultra Data Transfer Protocol 3000). Here is its specification:

Commands

Server and client exchange with raw binary data (not strings!). Commands may be of 2 types: control command and data command. Control command is one single byte of data with following values (INPORTANT! Following constants are of type signed byte, sbyte, char in C++ or byte in Java):

(client can send following commands):

  • 0x1E: "Hello server" message;
  • 0x31: client is to change data command length (IMPORTANT! This command is followed with 4 bytes of length!);
  • 0x3F: "Fone reset" command;
  • 0x45: "Goodbye server" message;

(server can send following commands):

  • 0x1A: "Hello client" message;
  • 0x2D: "Data received" server response;
  • 0x3E: "Command executed" message;
  • 0x4C: "Goodbye client" message;

(both server and client can send following commands):

  • 0x66: some error occured;

Data command is a bulk array of image data bytes, following the single byte with value 0x00 (to differ data command from control command). First 2 bytes of this array represent image width (as a Java short variable), and second ones represent image height. This type of command can be sent only from client side. See more in part Data Format

Communication

  1. Handshaking:
  2. Client (who starts the connection) sends "Hello server" message (0x1E).
  3. Server sends "Hello client" message (0x1A).
  4. Client sends 4 bytes that represent data command data length (without considering 0x00 byte!).

NOTICE: there is a SDTUDTP3Km version of protocol, which does not includes data sending into handshake, but the first command after handshake is always length change command (0x31), that is followed with 4 bytes of value of new data length.

  1. After handshaking, data exchange starts:

  2. Client sends data command.

  3. Server sends "Data received" (0x2D) message.

  4. Can be repeated till the end of days.

  5. If client answers with not a data command (first byte is not zero), it is a control command:

  6. Client sends a command (see list above).

  7. Server executes the command and sends "Command executed" message (0x3E) if succeeded.

  8. Server sends error message (0x66) if some error has occured while executing the command. Communication SHOULD NOT stop in this case.

  9. Closing the connection:

  10. Client is always the initiator of closing the connection.

  11. Client sends "Goodbye server" message (0x45).

  12. Server sends "Goodbye client" message (0x4C).

  13. Server closes the connection (socket).

  14. Error handling:

  15. If server has some internal error (important: not during execution of client command (3.2)), it sends error message 0x66.

  16. If client has some internal error, it sends error message 0x66.

  17. Crashed device doesn't have to close socket or send any other data. The other device should properly handle this situation.

  18. If client crashes, server returns to "wait mode", awaiting a client to connect.

  19. If server crashes, client returns to "connect" screen and should be ready for further attempts to connect to server.

Data Format

Image is sent as raw byte sequence in format YUV NV_21. For an appropriate conversion from it to RGB, see this class (the last method in the file).

Raw image data follows 4 bytes representing image width and height, 2 bytes per value. They are stored as signed short integers (short in Java).

About

Simple android app that can connect to a specified address and stream data to it

Resources

Stars

0 stars

Watchers

5 watching

Forks

Releases

Packages

Contributors

Languages