mirror of
https://github.com/moonlight-stream/moonlight-android.git
synced 2025-07-01 15:25:59 +00:00
Add some other files that weren't migrated with the project
This commit is contained in:
parent
d84b4bcf9a
commit
18f7bfab7f
62
LuaScripts/NALParser.lua
Normal file
62
LuaScripts/NALParser.lua
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
-- H264 NAL Parser
|
||||||
|
-- Version: 1.0
|
||||||
|
-- Cameron Gutman
|
||||||
|
|
||||||
|
-- NAL header
|
||||||
|
local nal_start = ProtoField.bytes("nal.start", "H264 NAL Start Sequence") -- 4 Byte Start
|
||||||
|
local nal_type = ProtoField.uint8("nal.type", "H264 NAL Type") -- 1 byte NAL type
|
||||||
|
local nal_data = ProtoField.bytes("nal.data", "H264 NAL Data") -- variable byte NAL data
|
||||||
|
|
||||||
|
p_h264raw = Proto("h264raw", "H264 Raw NAL Parser")
|
||||||
|
p_h264raw.fields = {
|
||||||
|
nal_start,
|
||||||
|
nal_type,
|
||||||
|
nal_data
|
||||||
|
}
|
||||||
|
|
||||||
|
function p_h264raw.dissector(buf, pkt, root)
|
||||||
|
pkt.cols.protocol = p_h264raw.name
|
||||||
|
subtree = root:add(p_h264raw, buf(0))
|
||||||
|
|
||||||
|
local i = 0
|
||||||
|
local data_start = -1
|
||||||
|
while i < buf:len do
|
||||||
|
-- Make sure we have a potential start sequence and type
|
||||||
|
if buf:len() - i < 5 then
|
||||||
|
-- We need more data
|
||||||
|
pkt.desegment_len = DESEGMENT_ONE_MORE_SEGMENT
|
||||||
|
pkt.desegment_offset = 0
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Check for start sequence
|
||||||
|
start = buf(i, 4):uint()
|
||||||
|
if start == 1 then
|
||||||
|
if data_start ~= -1 then
|
||||||
|
-- End the last NAL
|
||||||
|
subtree:add(nal_data, buf(data_start, i-data_start))
|
||||||
|
end
|
||||||
|
-- This is the start of a NAL
|
||||||
|
subtree:add(nal_start, buf(i, 4))
|
||||||
|
i = i + 4
|
||||||
|
-- Next byte is NAL type
|
||||||
|
subtree:add(nal_type, buf(i, 1), buf(i, 1):uint8())
|
||||||
|
i = i + 1
|
||||||
|
-- Data begins here
|
||||||
|
data_start = i
|
||||||
|
else
|
||||||
|
-- This must be a data byte
|
||||||
|
i = i + 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function p_h264raw.init()
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
local udp_dissector_table = DissectorTable.get("rtp.pt")
|
||||||
|
udp_dissector_table:add(96, p_h264raw)
|
||||||
|
|
||||||
|
|
||||||
|
|
89
LuaScripts/NVStreamVideoPacket.lua
Normal file
89
LuaScripts/NVStreamVideoPacket.lua
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
-- Nvidia Streaming Video Packet Dissector
|
||||||
|
-- Version: 1.0
|
||||||
|
-- Diego Waxemberg
|
||||||
|
|
||||||
|
-- video header
|
||||||
|
local nvHeader_frame = ProtoField.uint32("nv.frame", "Frame", base.HEX) -- 4 bytes
|
||||||
|
local nvHeader_pindex = ProtoField.uint16("nv.pindex", "Packet Index", base.HEX) -- 2 bytes
|
||||||
|
local nvHeader_empty = ProtoField.uint16("nv.empty", "Empty?", base.HEX) -- 2 bytes
|
||||||
|
local nvHeader_pframe = ProtoField.uint16("nv.pframe", "Packets in Frame", base.HEX) -- 2 bytes
|
||||||
|
local nvHeader_garbage = ProtoField.bytes("nv.garbage", "Garbage") -- 6 bytes
|
||||||
|
local nvHeader_length = ProtoField.uint16("nv.length", "Length", base.HEX) -- 2 bytes
|
||||||
|
local nvHeader_moregarbage = ProtoField.bytes("nv.moregarbage", "More Garbage") --23 bytes
|
||||||
|
local nvHeader_start = ProtoField.uint32("nv.start", "Start", base.HEX) -- 4 bytes
|
||||||
|
|
||||||
|
-- video data
|
||||||
|
local nvVideo_data = ProtoField.bytes("nv.data", "Data") -- rest
|
||||||
|
|
||||||
|
p_nv = Proto("nv", "Nvidia Video Stream Protocol")
|
||||||
|
p_nv.fields = {
|
||||||
|
nvHeader_frame,
|
||||||
|
nvHeader_pindex,
|
||||||
|
nvHeader_empty,
|
||||||
|
nvHeader_pframe,
|
||||||
|
nvHeader_garbage,
|
||||||
|
nvHeader_length,
|
||||||
|
nvHeader_moregarbage,
|
||||||
|
nvHeader_start,
|
||||||
|
nvVideo_data
|
||||||
|
}
|
||||||
|
|
||||||
|
function p_nv.dissector(buf, pkt, root)
|
||||||
|
pkt.cols.protocol = p_nv.name
|
||||||
|
subtree = root:add(p_nv, buf(0))
|
||||||
|
|
||||||
|
i = 0
|
||||||
|
-- frame
|
||||||
|
frame = buf(i, 4):le_uint()
|
||||||
|
subtree:add(nvHeader_frame, buf(i, 4), frame)
|
||||||
|
i = i + 4
|
||||||
|
|
||||||
|
--pindex
|
||||||
|
pindex = buf(i, 2):le_uint()
|
||||||
|
subtree:add(nvHeader_pindex, buf(i, 2), pindex)
|
||||||
|
i = i + 2
|
||||||
|
|
||||||
|
--empty
|
||||||
|
empty = buf(i, 2):le_uint()
|
||||||
|
subtree:add(nvHeader_empty, buf(i, 2), empty)
|
||||||
|
i = i + 2
|
||||||
|
|
||||||
|
--pframe
|
||||||
|
pframe = buf(i, 2):le_uint()
|
||||||
|
subtree:add(nvHeader_pframe, buf(i, 2), pframe)
|
||||||
|
i = i + 2
|
||||||
|
|
||||||
|
-- garbage
|
||||||
|
garbage = buf(i, 6):bytes()
|
||||||
|
subtree:add(nvHeader_garbage, buf(i, 6))
|
||||||
|
i = i + 6
|
||||||
|
|
||||||
|
-- length
|
||||||
|
length = buf(i, 2):le_uint()
|
||||||
|
subtree:add(nvHeader_length, buf(i, 2), length)
|
||||||
|
i = i + 2
|
||||||
|
|
||||||
|
-- moregarbage
|
||||||
|
moregarbage = buf(i, 23):bytes()
|
||||||
|
subtree:add(nvHeader_moregarbage, buf(i, 23))
|
||||||
|
i = i + 23
|
||||||
|
|
||||||
|
-- start
|
||||||
|
start = buf(i, 4):uint()
|
||||||
|
subtree:add(nvHeader_start, buf(i, 4), start)
|
||||||
|
i = i + 4
|
||||||
|
|
||||||
|
-- data
|
||||||
|
data = buf(i, buf:len()-i):bytes()
|
||||||
|
subtree:add(nvVideo_data, buf(i, buf:len()-i))
|
||||||
|
end
|
||||||
|
|
||||||
|
function p_nv.init()
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
local udp_dissector_table = DissectorTable.get("rtp.pt")
|
||||||
|
udp_dissector_table:add(96, p_nv)
|
||||||
|
|
||||||
|
|
||||||
|
|
86
LuaScripts/gridctl.lua
Normal file
86
LuaScripts/gridctl.lua
Normal file
@ -0,0 +1,86 @@
|
|||||||
|
local pf_type = ProtoField.uint16("gridctl.type", "Packet Type", base.HEX)
|
||||||
|
local pf_paylen = ProtoField.uint32("gridctl.paylen", "Payload Length", base.DEC)
|
||||||
|
local pf_payload = ProtoField.bytes("gridctl.payload", "Payload bytes")
|
||||||
|
local pf_payload32 = ProtoField.uint32("gridctl.payload32", "Payload as 32-bit LE integer", base.DEC)
|
||||||
|
local pf_payload16 = ProtoField.uint16("gridctl.payload16", "Payload as 16-bit LE integer", base.HEX)
|
||||||
|
local pf_response = ProtoField.uint16("gridctl.response", "Response code", base.HEX)
|
||||||
|
local pf_origtype = ProtoField.uint16("gridctl.origtype", "Original request type", base.HEX)
|
||||||
|
|
||||||
|
p_gridctl = Proto ("GridCtl", "Nvidia GRID Control Protocol")
|
||||||
|
|
||||||
|
p_gridctl.fields = {
|
||||||
|
pf_type,
|
||||||
|
pf_paylen,
|
||||||
|
pf_payload,
|
||||||
|
pf_payload16,
|
||||||
|
pf_payload32,
|
||||||
|
pf_response,
|
||||||
|
pf_origtype
|
||||||
|
}
|
||||||
|
|
||||||
|
function p_gridctl.dissector(buf, pkt, root)
|
||||||
|
pkt.cols.protocol = p_gridctl.name
|
||||||
|
|
||||||
|
subtree = root:add(p_gridctl, buf(0))
|
||||||
|
|
||||||
|
-- We can have multiple GRID control packets in one TCP datagram
|
||||||
|
i = 0
|
||||||
|
while i < buf:len() do
|
||||||
|
-- Make sure we have a full header
|
||||||
|
if buf:len() - i < 4 then
|
||||||
|
-- We need more data
|
||||||
|
pkt.desegment_len = DESEGMENT_ONE_MORE_SEGMENT
|
||||||
|
pkt.desegment_offset = 0
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Read the packet type field
|
||||||
|
ptype = buf(i, 2):le_uint()
|
||||||
|
subtree:add(pf_type, buf(i, 2), ptype)
|
||||||
|
i = i + 2
|
||||||
|
|
||||||
|
-- Read the payload length field
|
||||||
|
paylen = buf(i, 2):le_uint()
|
||||||
|
subtree:add(pf_paylen, buf(i, 2), paylen)
|
||||||
|
i = i + 2
|
||||||
|
|
||||||
|
-- Make sure we have the full payload
|
||||||
|
if buf:len() - i < paylen then
|
||||||
|
-- We need more data
|
||||||
|
pkt.desegment_len = DESEGMENT_ONE_MORE_SEGMENT
|
||||||
|
pkt.desegment_offset = 0
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Decode responses differently
|
||||||
|
if ptype == 0x0204 then
|
||||||
|
origtype = buf(i, 2):le_uint()
|
||||||
|
subtree:add(pf_origtype, buf(i, 2), origtype)
|
||||||
|
i = i + 2
|
||||||
|
response = buf(i, 2):le_uint()
|
||||||
|
subtree:add(pf_response, buf(i, 2), response)
|
||||||
|
i = i + 2
|
||||||
|
else
|
||||||
|
if paylen == 4 then
|
||||||
|
-- Display the payload as a uint32 (LE)
|
||||||
|
payload32 = buf(i, 4):le_uint()
|
||||||
|
subtree:add(pf_payload32, buf(i, 4), payload32)
|
||||||
|
elseif paylen == 2 then
|
||||||
|
-- Display the payload as a uint16 (LE)
|
||||||
|
payload16 = buf(i, 2):le_uint()
|
||||||
|
subtree:add(pf_payload16, buf(i, 2), payload16)
|
||||||
|
elseif paylen ~= 0 then
|
||||||
|
subtree:add(pf_payload, buf(i, paylen))
|
||||||
|
end
|
||||||
|
i = i + paylen
|
||||||
|
end
|
||||||
|
|
||||||
|
if i ~= buf:len() then
|
||||||
|
subtree:add("")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function p_gridctl.init()
|
||||||
|
end
|
||||||
|
|
||||||
|
local tcp_dissector_table = DissectorTable.get("tcp.port")
|
||||||
|
tcp_dissector_table:add(47995, p_gridctl)
|
61
README.md
Normal file
61
README.md
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
#Limelight
|
||||||
|
|
||||||
|
Limelight is an open source implementation of NVIDIA's GameStream, as used by the NVIDIA Shield.
|
||||||
|
We reverse engineered the Shield streaming software and created a version that can be run on any Android device.
|
||||||
|
|
||||||
|
Limelight will allow you to stream your full collection of games from your Windows PC to your Android device,
|
||||||
|
whether in your own home or over the internet.
|
||||||
|
|
||||||
|
[Limelight-pc](https://github.com/limelight-stream/limelight-pc) is also currently in development for Windows, OS X and Linux. Versions for [iOS](https://github.com/limelight-stream/limelight-ios) and [Windows and Windows Phone](https://github.com/limelight-stream/limelight-windows) are also in development.
|
||||||
|
|
||||||
|
##Features
|
||||||
|
|
||||||
|
* Streams any of your games from your PC to your Android device
|
||||||
|
* Full gamepad support for MOGA, Xbox 360, PS3, OUYA, and Shield
|
||||||
|
* Automatically finds GameStream-compatible PCs on your network
|
||||||
|
|
||||||
|
##Features in development
|
||||||
|
* Keyboard input
|
||||||
|
|
||||||
|
##Installation
|
||||||
|
|
||||||
|
* Download and install Limelight for Android from
|
||||||
|
[Google Play](https://play.google.com/store/apps/details?id=com.limelight)
|
||||||
|
* Download [GeForce Experience](http://www.geforce.com/geforce-experience) and install on your Windows PC
|
||||||
|
|
||||||
|
##Requirements
|
||||||
|
|
||||||
|
* [GameStream compatible](http://shield.nvidia.com/play-pc-games/) computer with GTX 600/700 series GPU
|
||||||
|
* Android device running 4.1 (Jelly Bean) or higher
|
||||||
|
* High-end wireless router (802.11n dual-band recommended)
|
||||||
|
* Exynos/Snapdragon SoC __OR__ Quad-Core 1.4 GHz Cortex-A9 or higher (Tegra 3)
|
||||||
|
|
||||||
|
##Usage
|
||||||
|
|
||||||
|
* Turn on GameStream in the GFE settings
|
||||||
|
* If you are connecting from outside the same network, turn on internet
|
||||||
|
streaming
|
||||||
|
* When on the same network as your PC, open Limelight and tap on your PC in the list
|
||||||
|
* Accept the pairing confirmation on your PC
|
||||||
|
* Tap your PC again to view the list of apps to stream
|
||||||
|
* Play games!
|
||||||
|
|
||||||
|
##Contribute
|
||||||
|
|
||||||
|
This project is being actively developed at [XDA Developers](http://forum.xda-developers.com/showthread.php?t=2505510)
|
||||||
|
|
||||||
|
1. Fork us
|
||||||
|
2. Write code
|
||||||
|
3. Send Pull Requests
|
||||||
|
|
||||||
|
Check out our [website](http://limelight-stream.com) for project links and information.
|
||||||
|
|
||||||
|
##Authors
|
||||||
|
|
||||||
|
* [Cameron Gutman](https://github.com/cgutman)
|
||||||
|
* [Diego Waxemberg](https://github.com/dwaxemberg)
|
||||||
|
* [Aaron Neyer](https://github.com/Aaronneyer)
|
||||||
|
* [Andrew Hennessy](https://github.com/yetanothername)
|
||||||
|
|
||||||
|
Limelight is the work of students at [Case Western](http://case.edu) and was
|
||||||
|
started as a project at [MHacks](http://mhacks.org).
|
19
decoder-errata.txt
Normal file
19
decoder-errata.txt
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
This file serves to document some of the decoder errata when using MediaCodec hardware decoders on certain devices.
|
||||||
|
|
||||||
|
1. num_ref_frames is set to 16 by NVENC which causes decoders to allocate 16+ buffers. This can cause an error or lag on some devices.
|
||||||
|
- Affected decoders: TI OMAP4, Allwinner A20
|
||||||
|
|
||||||
|
2. Some decoders have a huge per-frame latency with the unmodified SPS sent from NVENC. Setting max_dec_frame_buffering fixes this latency issue.
|
||||||
|
- Affected decoders: NVIDIA Tegra 3 and 4
|
||||||
|
|
||||||
|
3. Some decoders strictly require that you pass BUFFER_FLAG_CODEC_CONFIG and crash upon the IDR frame if you don't
|
||||||
|
- Affected decoders: TI OMAP4
|
||||||
|
|
||||||
|
4. Some decoders require num_ref_frames=1 and max_dec_frame_buffering=1 to avoid crashing on SPS or first I-frame
|
||||||
|
- Affected decoders: Qualcomm in GS3 on 4.3+, Exynos 4 at 1080p only
|
||||||
|
|
||||||
|
5. Some decoders will hang if max_dec_frame_buffering is not present
|
||||||
|
- Affected decoders: MediaTek decoder in Fire HD 7 (2014)
|
||||||
|
|
||||||
|
6. Some decoders will hang if max_dec_frame_buffering IS present
|
||||||
|
- Affected decoders: Exynos 5 in Galaxy Note 10.1 (2014)
|
Loading…
x
Reference in New Issue
Block a user