Capture services: Difference between revisions
(41 intermediate revisions by 2 users not shown) | |||
Line 199: | Line 199: | ||
| 2405 || DiscardAlbumMovieWriteStreamNoDelete || | | 2405 || DiscardAlbumMovieWriteStreamNoDelete || | ||
|- | |- | ||
| 2406 || [7.0.0+] || | | 2406 || [7.0.0+] CommitAlbumMovieWriteStreamEx || | ||
|- | |- | ||
| 2411 || StartAlbumMovieWriteStreamDataSection || | | 2411 || StartAlbumMovieWriteStreamDataSection || | ||
Line 226: | Line 226: | ||
This was added with [5.0.0+]. | This was added with [5.0.0+]. | ||
Official sw via the <code>nn::album</code> wrappers uses start_DateTime = YYYY-MM-DD 1970-01-01 with the rest set to all-zero, end_DateTime is the same except year = 3000. With [[#GetAlbumFileList0AafeAruidDeprecated]], start_PosixTime = UTC 1999-12-31 00:00 (0x386BF200), and end_PosixTime = UTC 2100-01-01 00:00 (0xF4865700). | |||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
Line 233: | Line 235: | ||
| 32 || [7.0.0+] [[#SetShimLibraryVersion]] | | 32 || [7.0.0+] [[#SetShimLibraryVersion]] | ||
|- | |- | ||
| 102 || GetAlbumFileList0AafeAruidDeprecated | | 102 || [[#GetAlbumFileList0AafeAruidDeprecated]] | ||
|- | |- | ||
| 103 || DeleteAlbumFileByAruid | | 103 || [[#DeleteAlbumFileByAruid]] | ||
|- | |- | ||
| 104 || GetAlbumFileSizeByAruid | | 104 || [[#GetAlbumFileSizeByAruid]] | ||
|- | |- | ||
| 105 || DeleteAlbumFileByAruidForDebug | | 105 || [[#DeleteAlbumFileByAruidForDebug]] | ||
|- | |- | ||
| 110 || LoadAlbumScreenShotImageByAruid | | 110 || [[#LoadAlbumScreenShotImageByAruid]] | ||
|- | |- | ||
| 120 || LoadAlbumScreenShotThumbnailImageByAruid | | 120 || [[#LoadAlbumScreenShotThumbnailImageByAruid]] | ||
|- | |- | ||
| 130 || PrecheckToCreateContentsByAruid | | 130 || [[#PrecheckToCreateContentsByAruid]] | ||
|- | |- | ||
| 140 || [6.0.0+] GetAlbumFileList1AafeAruidDeprecated | | 140 || [6.0.0+] [[#GetAlbumFileList1AafeAruidDeprecated]] | ||
|- | |- | ||
| 141 || [6.0.0+] GetAlbumFileList2AafeUidAruidDeprecated | | 141 || [6.0.0+] [[#GetAlbumFileList2AafeUidAruidDeprecated]] | ||
|- | |- | ||
| 142 || [7.0.0+] GetAlbumFileList3AaeAruid | | 142 || [7.0.0+] [[#GetAlbumFileList3AaeAruid]] | ||
|- | |- | ||
| 143 || [7.0.0+] GetAlbumFileList4AaeUidAruid | | 143 || [7.0.0+] [[#GetAlbumFileList4AaeUidAruid]] | ||
|- | |- | ||
| 60002 || OpenAccessorSessionForApplication | | 60002 || [[#OpenAccessorSessionForApplication]] | ||
|} | |} | ||
== SetShimLibraryVersion == | == SetShimLibraryVersion == | ||
Takes an input u64 [[#ShimLibraryVersion]], an u64 [[Applet_Manager_services#AppletResourceUserId|AppletResourceUserId]], and a PID, no output. | Takes an input u64 [[#ShimLibraryVersion]], an u64 [[Applet_Manager_services#AppletResourceUserId|AppletResourceUserId]], and a PID, no output. | ||
== GetAlbumFileList0AafeAruidDeprecated == | |||
Takes a type-0x6 output buffer containing an array of [[#ApplicationAlbumFileEntry]], a PID, an u8 [[#ContentType]], two s64s, and an u64 [[Applet_Manager_services#AppletResourceUserId|AppletResourceUserId]]. Returns an output u64 for total output entries (which is copied to a s32 by official sw). | |||
The two s64s are the start/end PosixTime. | |||
== DeleteAlbumFileByAruid == | |||
Takes a PID, an input u8 [[#ContentType]], an [[#ApplicationAlbumFileEntry]], an [[Applet_Manager_services#AppletResourceUserId|AppletResourceUserId]], and no output. | |||
The [[#ContentType]] must match 3. | |||
== GetAlbumFileSizeByAruid == | |||
Takes a PID, an input [[#ApplicationAlbumFileEntry]], an [[Applet_Manager_services#AppletResourceUserId|AppletResourceUserId]], and returns an output u64. | |||
This gets the filesize for the entire specified Album file. | |||
== DeleteAlbumFileByAruidForDebug == | |||
Takes a PID, an [[#ApplicationAlbumFileEntry]], an [[Applet_Manager_services#AppletResourceUserId|AppletResourceUserId]], and no output. | |||
The cached value loaded from [[Settings_services#GetDebugModeFlag]] must be 1, otherwise an error is returned. | |||
== LoadAlbumScreenShotImageByAruid == | |||
Takes a PID, a type-0x16 output buffer containing a [[#LoadAlbumScreenShotImageOutputForApplication]], a type-0x46 output buffer, a type-0x6 output buffer, an [[#ApplicationAlbumFileEntry]], a [[#ScreenShotDecodeOption]], and no output. | |||
The type-0x46 buffer contains the RGBA8 image data. The type-0x6 buffer is a work buffer used for reading the entire AlbumFile, the buffer size must be at least the AlbumFile filesize (cleared before the cmd returns). | |||
== LoadAlbumScreenShotThumbnailImageByAruid == | |||
Takes a PID, a type-0x16 output buffer containing a [[#LoadAlbumScreenShotImageOutputForApplication]], a type-0x46 output buffer, a type-0x6 output buffer, an [[#ApplicationAlbumFileEntry]], a [[#ScreenShotDecodeOption]], and no output. | |||
The type-0x46 buffer contains the RGBA8 image data. The type-0x6 buffer is a work buffer used for reading the entire AlbumFile, the buffer size must be at least the AlbumFile filesize (cleared before the cmd returns). | |||
== PrecheckToCreateContentsByAruid == | |||
Takes a PID, an input u8 [[#ContentType]], an u64, an [[Applet_Manager_services#AppletResourceUserId|AppletResourceUserId]], and no output. | |||
== GetAlbumFileList1AafeAruidDeprecated == | |||
Takes a type-0x6 output buffer containing an array of [[#ApplicationAlbumFileEntry]], a PID, an u8 [[#ContentType]], two [[#AlbumFileDateTime]], and an u64 [[Applet_Manager_services#AppletResourceUserId|AppletResourceUserId]]. Returns an output u64 for total output entries (which is copied to a s32 by official sw). | |||
The first [[#AlbumFileDateTime]] is the start_DateTime, the second [[#AlbumFileDateTime]] is the end_DateTime. In the IPC rawdata, these use 2-byte alignment. | |||
== GetAlbumFileList2AafeUidAruidDeprecated == | |||
Takes a type-0x6 output buffer containing an array of [[#ApplicationAlbumFileEntry]], a PID, an u8 [[#ContentType]], two [[#AlbumFileDateTime]], an u128 userID, and an u64 [[Applet_Manager_services#AppletResourceUserId|AppletResourceUserId]]. Returns an output u64 for total output entries (which is copied to a s32 by official sw). | |||
The first [[#AlbumFileDateTime]] is the start_DateTime, the second [[#AlbumFileDateTime]] is the end_DateTime. In the IPC rawdata, these use 2-byte alignment. | |||
== GetAlbumFileList3AaeAruid == | |||
Takes a type-0x6 output buffer containing an array of [[#ApplicationAlbumEntry]], a PID, an u8 [[#ContentType]], two [[#AlbumFileDateTime]], and an u64 [[Applet_Manager_services#AppletResourceUserId|AppletResourceUserId]]. Returns an output u64 for total output entries (which is copied to a s32 by official sw). | |||
The first [[#AlbumFileDateTime]] is the start_DateTime, the second [[#AlbumFileDateTime]] is the end_DateTime. In the IPC rawdata, these use 2-byte alignment. | |||
== GetAlbumFileList4AaeUidAruid == | |||
Takes a type-0x6 output buffer containing an array of [[#ApplicationAlbumEntry]], a PID, an u8 [[#ContentType]], two [[#AlbumFileDateTime]], an u128 userID, and an u64 [[Applet_Manager_services#AppletResourceUserId|AppletResourceUserId]]. Returns an output u64 for total output entries (which is copied to a s32 by official sw). | |||
The first [[#AlbumFileDateTime]] is the start_DateTime, the second [[#AlbumFileDateTime]] is the end_DateTime. In the IPC rawdata, these use 2-byte alignment. | |||
== OpenAccessorSessionForApplication == | |||
Takes a PID, an input [[#ApplicationAlbumFileEntry]], an u64 [[Applet_Manager_services#AppletResourceUserId|AppletResourceUserId]], and returns an output [[#IAlbumAccessorApplicationSession]]. | |||
== IAlbumAccessorApplicationSession == | == IAlbumAccessorApplicationSession == | ||
Line 265: | Line 323: | ||
This was added with [5.0.0+]. | This was added with [5.0.0+]. | ||
This is opened prior to using [[#OpenAlbumMovieReadStream]], when it previously wasn't opened. Official sw only closes this session when closing caps:u, not when using [[#CloseAlbumMovieReadStream]]. | |||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
Line 270: | Line 330: | ||
! Cmd || Name | ! Cmd || Name | ||
|- | |- | ||
| 2001 || OpenAlbumMovieReadStream | | 2001 || [[#OpenAlbumMovieReadStream]] | ||
|- | |- | ||
| 2002 || CloseAlbumMovieReadStream | | 2002 || [[#CloseAlbumMovieReadStream]] | ||
|- | |- | ||
| 2003 || GetAlbumMovieReadStreamMovieDataSize | | 2003 || [[#GetAlbumMovieReadStreamMovieDataSize]] | ||
|- | |- | ||
| 2004 || ReadMovieDataFromAlbumMovieReadStream | | 2004 || [[#ReadMovieDataFromAlbumMovieReadStream]] | ||
|- | |- | ||
| 2005 || GetAlbumMovieReadStreamBrokenReason | | 2005 || [[#GetAlbumMovieReadStreamBrokenReason]] | ||
|} | |} | ||
=== OpenAlbumMovieReadStream === | |||
Takes a PID, an input [[#ApplicationAlbumFileEntry]], an u64 [[Applet_Manager_services#AppletResourceUserId|AppletResourceUserId]], and returns an output u64 [[#AlbumMovieReadStreamHandle]]. | |||
Up to 4 streams can be open at the same time. Multiple streams can be open at the same time for the same [[#ApplicationAlbumFileEntry]]. | |||
=== CloseAlbumMovieReadStream === | |||
Takes an input u64 [[#AlbumMovieReadStreamHandle]], no output. | |||
=== GetAlbumMovieReadStreamMovieDataSize === | |||
Takes an input u64 [[#AlbumMovieReadStreamHandle]], returns an output u64. | |||
This gets the size of the actual MP4, without the JPEG at the end. | |||
=== ReadMovieDataFromAlbumMovieReadStream === | |||
Takes a type-0x6 output buffer, an input u64 [[#AlbumMovieReadStreamHandle]], an input s64 offset, and returns an output u64 actual_size. | |||
offset(+size) must not be negative. offset and size must be aligned to 0x40000-bytes. When offset(+size) goes beyond the size from [[#GetAlbumMovieReadStreamMovieDataSize]], the regions of the buffer which goes beyond that are cleared to 0, and actual_size is still set to the input size. | |||
=== GetAlbumMovieReadStreamBrokenReason === | |||
Takes an input u64 [[#AlbumMovieReadStreamHandle]], no output. | |||
Unused by official sw. | |||
= ShimLibraryVersion = | = ShimLibraryVersion = | ||
This is a version field. Official sw uses func <code>nn::capsrv::GetShimLibraryVersion()</code> to load this from a global var, which is then used with various commands (the input for those cmds must match value 1). | This is a version field. Official sw uses func <code>nn::capsrv::GetShimLibraryVersion()</code> to load this from a global var, which is then used with various commands (the input for those cmds must match value 1). | ||
[7.0.0- | [7.0.0-9.0.0] This is value 1. | ||
Controls which struct version to use for [[#ApplicationAlbumEntry]] / [[#AlbumFileEntry]]. However, the struct size for the newer version is used regardless on [7.0.0+] for the actual cmds. | Controls which struct version to use for [[#ApplicationAlbumEntry]] / [[#AlbumFileEntry]]. However, the struct size for the newer version is used regardless on [7.0.0+] for the actual cmds. | ||
= | = Enums = | ||
=== AlbumImageOrientation === | |||
{| class="wikitable" border="1" | |||
|- | |||
! Value | |||
! Description | |||
|- | |||
| 0 || Unknown. | |||
|- | |||
| 1 || Unknown. | |||
|- | |||
| 2 || Unknown. | |||
|- | |||
| 3 || Unknown. | |||
|} | |||
This is "nn::album::ImageOrientation". | |||
=== AlbumReportOption === | |||
{| class="wikitable" border="1" | |||
|- | |||
! Value | |||
! Description | |||
|- | |||
| 0 || Don't display the screenshot-taken Overlay-applet notification. | |||
|- | |||
| 1 || Display the screenshot-taken Overlay notification. | |||
|} | |||
This is "nn::album::AlbumReportOption". | |||
=== ContentType === | |||
{| class="wikitable" border="1" | |||
|- | |||
! Value | |||
! Description | |||
|- | |||
| 0 || Screenshot. Album screenshots. | |||
|- | |||
| 1 || Movie. Album videos. | |||
|- | |||
| 3 || ExtraMovie. Videos recorded by the current Application title via [[GRC_services#IMovieMaker|GRC MovieMaker]]. | |||
|} | |||
=== AlbumStorage === | |||
{| class="wikitable" border="1" | |||
|- | |||
! Value | |||
! Description | |||
|- | |||
| 0 || Nand. ImageDirectory on the USER partition. | |||
|- | |||
| 1 || Sd. ImageDirectory on the Sd card | |||
|} | |||
= AlbumFileDateTime = | |||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
! Offset || Size || Description | ! Offset || Size || Description | ||
|- | |- | ||
| 0x0 || | | 0x0 || 0x2 || Year | ||
|- | |||
| 0x2 || 0x1 || Month | |||
|- | |||
| 0x3 || 0x1 || Day | |||
|- | |- | ||
| | | 0x4 || 0x1 || Hour | ||
|- | |- | ||
| | | 0x5 || 0x1 || Minute | ||
|- | |- | ||
| | | 0x6 || 0x1 || Second | ||
|- | |- | ||
| | | 0x7 || 0x1 || Unique ID for when there's multiple Album files with the same timestamp. | ||
|} | |||
This is "nn::capsrv::AlbumFileDateTime". This is a 0x8-byte struct. | |||
This corresponds to each field in the Album entry filename, prior to the "-": <code>YYYYMMDDHHMMSSII</code>. | |||
= AlbumEntry = | |||
{| class="wikitable" border="1" | |||
|- | |- | ||
| | ! Offset || Size || Description | ||
|- | |- | ||
| | | 0x0 || 0x8 || Size of the entry. | ||
|- | |- | ||
| | | 0x8 || 0x8 || ApplicationId | ||
|- | |- | ||
| | | 0x10 || 0x8 || [[#AlbumFileDateTime]] | ||
|- | |- | ||
| 0x18 || 0x1 || | | 0x18 || 0x1 || [[#AlbumStorage]] | ||
|- | |- | ||
| 0x19 || 0x1 || | | 0x19 || 0x1 || [[#ContentType]] | ||
|- | |- | ||
| 0x1A || 0x6 || Padding | | 0x1A || 0x6 || Padding. | ||
|} | |} | ||
This is "nn::capsrv::AlbumEntry". This is a 0x20-byte struct. | This is "nn::capsrv::AlbumEntry". This is a 0x20-byte struct. | ||
= AlbumFileEntry = | = AlbumFileEntry = | ||
Line 330: | Line 479: | ||
! Offset || Size || Description | ! Offset || Size || Description | ||
|- | |- | ||
| 0x0 || | | 0x0 || 0x8 || Size of the entry. | ||
|- | |||
| 0x8 || 0x8 || AES256 with hardcoded key over AlbumEntry. | |||
|- | |||
| 0x10 || 0x8 || [[#AlbumFileDateTime]] | |||
|- | |||
| 0x18 || 0x1 || [[#AlbumStorage]] | |||
|- | |||
| 0x19 || 0x1 || [[#ContentType]] | |||
|- | |||
| 0x1a || 0x5 || Padding. | |||
|- | |||
| 0x1f || 0x1 || Unknown. Set to 1 by official software. | |||
|} | |} | ||
This is "nn::capsrv::ApplicationAlbumEntry". This is a 0x20-byte struct. On older versions where [[#ShimLibraryVersion]] is 0, this | This is "nn::capsrv::ApplicationAlbumEntry". This is a 0x20-byte struct. On older versions where [[#ShimLibraryVersion]] is 0, this was a plain AES256 with a random key generated at application launch. | ||
With the output from [[Applet_Manager_services#caps:su|caps:su]] sdk-nso only uses this for the [[Internet_Browser|Share-applet]] (when the output is used at all), with everything else it's used as an [[#AlbumFileEntry]]. In those cases with the <code>nn::album</code> wrapper funcs, it's "converted" by just copying the struct (arrays are "converted" by just returning a ptr to the input array). | With the output from [[Applet_Manager_services#caps:su|caps:su]] sdk-nso only uses this for the [[Internet_Browser|Share-applet]] (when the output is used at all), with everything else it's used as an [[#AlbumFileEntry]]. In those cases with the <code>nn::album</code> wrapper funcs, it's "converted" by just copying the struct (arrays are "converted" by just returning a ptr to the input array). | ||
= ApplicationAlbumFileEntry = | = ApplicationAlbumFileEntry = | ||
{| class="wikitable" border="1" | |||
|- | |||
! Offset || Size || Description | |||
|- | |||
| 0x0 || 0x20 || [[#ApplicationAlbumEntry]] | |||
|- | |||
| 0x20 || 0x8 || [[#AlbumFileDateTime]] | |||
|- | |||
| 0x28 || 0x8 || Unknown. | |||
|} | |||
This is "nn::capsrv::ApplicationAlbumFileEntry". This is a 0x30-byte struct. | This is "nn::capsrv::ApplicationAlbumFileEntry". This is a 0x30-byte struct. | ||
Line 344: | Line 516: | ||
* u64 ApplicationAlbumFileEntry+0x20 = [[#ApplicationAlbumEntry]]+0x10. | * u64 ApplicationAlbumFileEntry+0x20 = [[#ApplicationAlbumEntry]]+0x10. | ||
* Last 8-bytes = 0. | * Last 8-bytes = 0. | ||
= ScreenShotAttribute = | |||
{| class="wikitable" border="1" | |||
|- | |||
! Offset || Size || Description | |||
|- | |||
| 0x0 || 0x4 || Always set to 0 by official sw. | |||
|- | |||
| 0x4 || 0x4 || [[#AlbumImageOrientation]] | |||
|- | |||
| 0x8 || 0x4 || Always set to 0 by official sw. | |||
|- | |||
| 0xC || 0x4 || Always set to 1 by official sw. | |||
|- | |||
| 0x10 || 0x30 || Always set to 0 by official sw. | |||
|} | |||
This is "nn::capsrv::detail::ScreenShotAttributeEx0" / "nn::capsrv::ScreenShotAttribute". This is a 0x40-byte struct. | |||
= ApplicationData = | |||
{| class="wikitable" border="1" | |||
|- | |||
! Offset || Size || Description | |||
|- | |||
| 0x0 || 0x400 || UserData | |||
|- | |||
| 0x400 || 0x4 || UserData size. | |||
|} | |||
This is "nn::capsrv::ApplicationData". This is a 0x404-byte struct. | |||
= UserIdList = | |||
{| class="wikitable" border="1" | |||
|- | |||
! Offset || Size || Description | |||
|- | |||
| 0x0 || 0x80 || u128 userIDs | |||
|- | |||
| 0x80 || 0x1 || Total userIDs. | |||
|- | |||
| 0x81 || 0x7 || Padding. | |||
|} | |||
This is "nn::capsrv::UserIdList". This is a 0x88-byte struct. | |||
= LoadAlbumScreenShotImageOutputForApplication = | |||
{| class="wikitable" border="1" | |||
|- | |||
! Offset || Size || Description | |||
|- | |||
| 0x0 || 0x8 || s64 Width. Official sw copies this to a s32 output field. | |||
|- | |||
| 0x8 || 0x8 || s64 Height. Official sw copies this to a s32 output field. | |||
|- | |||
| 0x10 || 0x40 || [[#ScreenShotAttributeForApplication]] | |||
|- | |||
| 0x50 || 0x404 || [[#ApplicationData]] | |||
|- | |||
| 0x454 || 0xAC || Unused | |||
|} | |||
This is "nn::capsrv::sf::LoadAlbumScreenShotImageOutputForApplication". This is a 0x500-byte struct. | |||
= ScreenShotDecodeOption = | |||
This is "nn::capsrv::ScreenShotDecodeOption". This is a 0x20-byte struct. | |||
Official sw sets this to all-zero with the input for [[#LoadAlbumScreenShotImageByAruid]]/[[#LoadAlbumScreenShotThumbnailImageByAruid]]. | |||
= ScreenShotAttributeForApplication = | |||
{| class="wikitable" border="1" | |||
|- | |||
! Offset || Size || Description | |||
|- | |||
| 0x0 || 0x4 || Unknown. | |||
|- | |||
| 0x4 || 0x1 || Unknown. | |||
|- | |||
| 0x5 || 0x1 || Unknown. | |||
|- | |||
| 0x6 || 0x1 || Unknown. | |||
|- | |||
| 0x7 || 0x1 || Padding. | |||
|- | |||
| 0x8 || 0x4 || Unknown. | |||
|- | |||
| 0xC || 0x4 || Unknown. | |||
|- | |||
| 0x10 || 0x4 || Unknown. | |||
|- | |||
| 0x14 || 0x4 || Unknown. | |||
|- | |||
| 0x18 || 0x4 || Unknown. | |||
|- | |||
| 0x1C || 0x4 || Unknown. | |||
|- | |||
| 0x20 || 0x2 || Unknown. | |||
|- | |||
| 0x22 || 0x2 || Unknown. | |||
|- | |||
| 0x24 || 0x2 || Unknown. | |||
|- | |||
| 0x26 || 0x2 || Unknown. | |||
|- | |||
| 0x28 || 0x18 || Always zero. | |||
|} | |||
This is "nn::capsrv::ScreenShotAttributeForApplication". This is a 0x40-byte struct. | |||
Official sw only uses this in <code>nn::album</code> funcs which convert this to [[#AlbumFileAttribute]], with the output from [[#LoadAlbumScreenShotImageByAruid]]/[[#LoadAlbumScreenShotThumbnailImageByAruid]] (only the first u32 is used). | |||
= AlbumFileAttribute = | |||
{| class="wikitable" border="1" | |||
|- | |||
! Offset || Size || Description | |||
|- | |||
| 0x0 || 0x8 || The <code>nn::album</code> funcs referenced by [[#ScreenShotAttributeForApplication]] set this to: <code>ScreenShotAttributeForApplication.first_u32 == 2</code>. | |||
|- | |||
| 0x8 || 0x8 || Set to zero by official sw. | |||
|} | |||
This is "nn::album::AlbumFileAttribute". This is a 0x10-byte struct. See also [[#ScreenShotAttributeForApplication]]. | |||
= AlbumMovieReadStreamHandle = | |||
This is "nn::capsrv::AlbumMovieReadStreamHandle" / "nn::album::MovieStreamHandle". | |||
This is an u64 stream handle. | |||
= Notes = | = Notes = |