Line 8: |
Line 8: |
| {| class="wikitable" border="1" | | {| class="wikitable" border="1" |
| |- | | |- |
− | ! Cmd || Name || Notes | + | ! Cmd || Name |
| |- | | |- |
− | | 1 || OpenContinuousRecorder || Takes a total of 0x28-bytes of input and a handle, returns an [[#IContinuousRecorder]]. | + | | 1 || [[#OpenContinuousRecorder]] |
| |- | | |- |
− | | 2 || OpenGameMovieTrimmer || Takes an input u64 and a handle, returns an [[#IGameMovieTrimmer]]. | + | | 2 || [[#OpenGameMovieTrimmer]] |
| |- | | |- |
− | | 3 || [5.0.0+] || Takes a total of 0x8-bytes of input and a handle, returns an [[#IOffscreenRecorder]]. | + | | 3 || [5.0.0+] [[#OpenOffscreenRecorder]] |
| |- | | |- |
− | | 101 || [5.0.0+] || Takes a total of 0x10-bytes of input, returns an [[#IMovieMaker]]. | + | | 101 || [5.0.0+] [[#CreateMovieMaker]] |
| |- | | |- |
− | | 9903 || [5.0.0+] || Takes 8-bytes of input, no output. | + | | 9903 || [5.0.0+] [[#SetOffscreenRecordingMarker]] |
| |} | | |} |
| | | |
− | [5.0.0+] OpenContinuousRecorder now takes an additional 0x20-bytes of input. | + | == OpenContinuousRecorder == |
| + | Takes a total of 0x28-bytes of input and a handle, returns an [[#IContinuousRecorder]]. |
| + | |
| + | [5.0.0+] Now takes an additional 0x20-bytes of input. |
| + | |
| + | == OpenGameMovieTrimmer == |
| + | Takes an input u64 and a handle, returns an [[#IGameMovieTrimmer]]. |
| + | |
| + | == OpenOffscreenRecorder == |
| + | Takes a total of 0x8-bytes of input and a handle, returns an [[#IOffscreenRecorder]]. |
| + | |
| + | == CreateMovieMaker == |
| + | Takes a total of 0x10-bytes of input, returns an [[#IMovieMaker]]. |
| + | |
| + | == SetOffscreenRecordingMarker == |
| + | Takes 8-bytes of input, no output. |
| + | |
| + | Affects the behavior of [[#CompleteOffscreenRecordingFinish]], [[#CompleteOffscreenRecordingFinishEx0]] and [[#CompleteOffscreenRecordingFinishEx1]], forcing them to stop at different stages. |
| | | |
| == IContinuousRecorder == | | == IContinuousRecorder == |
Line 88: |
Line 105: |
| This is "nn::grcsrv::IRemoteVideoTransfer". | | This is "nn::grcsrv::IRemoteVideoTransfer". |
| | | |
− | Added with [[6.0.0]].
| + | This was added with [[6.0.0]]. |
| | | |
− | The max sessions for this service is 4, and there's 2 IPC handler threads. | + | The max sessions for this service is 4, and it uses 2 IPC handler threads. |
| | | |
| {| class="wikitable" border="1" | | {| class="wikitable" border="1" |
| |- | | |- |
− | ! Cmd || Name || Notes | + | ! Cmd || Name |
| |- | | |- |
− | | 1 || || No input/output. | + | | 1 || [[#Initialize]] |
| |- | | |- |
− | | 2 || || Takes an input u32 (must be value 0-1) and a type-0x6 output buffer, returns a total of 0x10-bytes of output. | + | | 2 || [[#Transfer]] |
| |} | | |} |
| | | |
− | == Cmd1 == | + | == Initialize == |
| + | No input/output. |
| + | |
| Begins video stream. This must not be used more than once, even from a different service session: otherwise the sysmodule will assert. | | Begins video stream. This must not be used more than once, even from a different service session: otherwise the sysmodule will assert. |
| | | |
− | == Cmd2 == | + | == Transfer == |
− | Retrieves stream data, from the video recording being done of the currently running game title. Takes u32 "stream" (0: video, 1: audio), returns u32 (num_frames?), u32 data_size, u64 (start_timestamp?). Video stream writes H.264 NAL units to the output buffer (try <code>ffplay -f h264</code>). Audio stream is PCM16, 2 channels, and sample-rate = 48000Hz. Official code uses buffer size 0x32000 for video, 0x1000 for audio, and multiple threads to read out both streams at the same time.
| + | Takes an u32 '''stream''' (0: video, 1: audio) and a type-0x6 output buffer, returns 2 u32s '''num_frames''' and '''data_size''' and an u64 '''start_timestamp'''. |
| + | |
| + | Retrieves stream data from the continuous recorder in use. Video stream writes H.264 NAL units to the output buffer (try <code>ffplay -f h264</code>). Audio stream is PCM16, 2 channels, and sample-rate = 48000Hz. Official code uses buffer size 0x32000 for video, 0x1000 for audio, and multiple threads to read out both streams at the same time. |
| | | |
| This will block until data is available. This will hang if there is no game title running which has video capture enabled. | | This will block until data is available. This will hang if there is no game title running which has video capture enabled. |
Line 235: |
Line 256: |
| | | |
| = OffscreenRecordingParameter = | | = OffscreenRecordingParameter = |
| + | This is "nn::grcsrv::OffscreenRecordingParameter". |
| + | |
| + | This is a 0x80-byte struct. "nn::grc::OffscreenRecordingParameter" and "nn::album::MovieMakerMovieParameter" are identical to this. |
| + | |
| {| class="wikitable" border="1" | | {| class="wikitable" border="1" |
| |- | | |- |
Line 265: |
Line 290: |
| | 0x3C || 0x44 || ? || 0 | | | 0x3C || 0x44 || ? || 0 |
| |} | | |} |
− |
| |
− | This is "nn::grcsrv::OffscreenRecordingParameter". This is a 0x80-byte struct. "nn::grc::OffscreenRecordingParameter" and "nn::album::MovieMakerMovieParameter" are identical to this.
| |
| | | |
| The above default values are initialized by the official user-process via sdk-nso funcs "nn::album::MovieMakerMovieParameter::GetDefaultValue()" / "nn::album::MovieMakerMovieParameter::MovieMakerMovieParameter()" (both funcs are identical). | | The above default values are initialized by the official user-process via sdk-nso funcs "nn::album::MovieMakerMovieParameter::GetDefaultValue()" / "nn::album::MovieMakerMovieParameter::MovieMakerMovieParameter()" (both funcs are identical). |
| | | |
| = GameMovieId = | | = GameMovieId = |
| + | This is "nn::grcsrv::GameMovieId". |
| + | |
| + | This is a 0x40-byte struct. |
| + | |
| {| class="wikitable" border="1" | | {| class="wikitable" border="1" |
| |- | | |- |
Line 279: |
Line 306: |
| | 0x18 || 0x28 || Unused, always zero. | | | 0x18 || 0x28 || Unused, always zero. |
| |} | | |} |
− |
| |
− | This is "nn::grcsrv::GameMovieId". This is a 0x40-byte struct.
| |
| | | |
| = IHOSBinderDriver = | | = IHOSBinderDriver = |