Capture services: Difference between revisions

Behemoth (talk | contribs)
caps:a: add note about Cmd18's usage
No edit summary
 
(19 intermediate revisions by 3 users not shown)
Line 42: Line 42:
| 17 || [4.0.0+] GetAlbumUsage16
| 17 || [4.0.0+] GetAlbumUsage16
|-
|-
| 18 || [6.0.0+]
| 18 || [6.0.0+] [[#GetAppletProgramIdTable]]
|-
| 19 || [11.0.0+] [[#GetAlbumFileName]]
|-
| 20 || [20.0.0+]
|-
|-
| 100 || [5.0.0+] GetAlbumFileCountEx0
| 100 || [5.0.0+] GetAlbumFileCountEx0
|-
|-
| 101 || [5.0.0+] GetAlbumFileListEx0
| 101 || [5.0.0+] GetAlbumFileListEx0
|-
| 110 || [15.0.0+] GetAlbumFileListEx1
|-
| 120 || [17.0.0+] GetAlbumFileListEx2
|-
| 121 || [20.0.0+]
|-
| 122 || [20.0.0+]
|-
| 123 || [20.0.0+]
|-
| 130 || [17.0.0+] LoadAlbumFileRawData
|-
| 140 || [17.0.0+] GetAlbumFileCreatedEvent
|-
| 141 || [18.0.0+]
|-
| 150 || [17.0.0+] LoadAlbumSystemReservedInfo
|-
| 151 || [18.0.0+]
|-
| 160 || [18.0.0+]
|-
| 170 || [20.0.0+]
|-
| 171 || [20.0.0+]
|-
| 172 || [20.0.0+]
|-
|-
| 202 || [1.0.0-2.3.0] SaveEditedScreenShot
| 202 || [1.0.0-2.3.0] SaveEditedScreenShot
Line 57: Line 89:
|-
|-
| 501 || GetRequiredStorageSpaceSizeToCopyAll
| 501 || GetRequiredStorageSpaceSizeToCopyAll
|-
| 502 || [20.0.0+]
|-
| 600 || [20.0.0+]
|-
|-
| 1001 || [3.0.0+] LoadAlbumScreenShotThumbnailImageEx0
| 1001 || [3.0.0+] LoadAlbumScreenShotThumbnailImageEx0
|-
|-
| 1002 || [3.0.0+] LoadAlbumScreenShotImageEx1
| 1002 || [3.0.0+] [[#LoadAlbumScreenShotImageEx1]]
|-
|-
| 1003 || [4.0.0+] LoadAlbumScreenShotThumbnailImageEx1
| 1003 || [4.0.0+] LoadAlbumScreenShotThumbnailImageEx1
Line 75: Line 111:
|-
|-
| 8021 || [2.0.0+] GetAlbumEntryFromApplicationAlbumEntryAruid
| 8021 || [2.0.0+] GetAlbumEntryFromApplicationAlbumEntryAruid
|-
| 8022 || [19.0.0+]
|-
| 8031 || [20.0.0+]
|-
| 8032 || [20.0.0+]
|-
|-
| 10011 || SetInternalErrorConversionEnabled
| 10011 || SetInternalErrorConversionEnabled
Line 80: Line 122:
| 50000 || [6.0.0+] LoadMakerNoteInfoForDebug
| 50000 || [6.0.0+] LoadMakerNoteInfoForDebug
|-
|-
| 60002 || [4.0.0+] OpenAccessorSession
| 50001 || [19.0.0+]
|-
| 50011 || [19.0.0+] GetAlbumAccessResultForDebug
|-
| 50012 || [19.0.0+] [[#SetAlbumAccessResultForDebug]]
|-
| 50021 || [20.0.0+]
|-
| 50022 || [20.0.0+]
|-
| 50023 || [20.0.0+]
|-
| 50024 || [20.0.0+]
|-
| 50031 || [20.0.0+]
|-
| 50032 || [20.0.0+]
|-
| 60002 || [4.0.0+] [[#OpenAccessorSession]]
|}
|}


Cmd18: Takes a type-70 buffer and returns a bool. If the buffer is sufficient it writes two application ID's to the buffer (0x100000000001000 and 0x100000000001fff) and returns true. This is used by photoViewer to group all screenshots of applets.
== GetAppletProgramIdTable ==
Takes a type-70 buffer and returns a bool. If the buffer is sufficient it writes two application ID's to the buffer (0x100000000001000 and 0x100000000001fff) and returns true. This is used by photoViewer to group all screenshots of applets.
 
== GetAlbumFileName ==
Takes an input [[#AlbumFileId]] and a type-0x6 output buffer. Writes the filename of the corresponding file to the buffer.
 
== LoadAlbumScreenShotImageEx1 ==
Takes a total of 0x38-bytes of input, two type-0x5 input buffers, and returns 0x20-bytes of output. [4.0.0+] No longer returns output, and now takes the following buffers instead: type-0x16, type-0x46, and type-0x6.


Cmd1002: Takes a total of 0x38-bytes of input, two type-0x5 input buffers, and returns 0x20-bytes of output. [4.0.0+] No longer returns output, and now takes the following buffers instead: type-0x16, type-0x46, and type-0x6.
== SetAlbumAccessResultForDebug ==
Allows setting a result code that will make following access functions fail with:  
GetAlbumFileCount, GetAlbumFileCountEx0, GetAlbumFileList, GetAlbumFileListEx0, GetAlbumFileListEx1, GetAlbumFileListEx2, LoadAlbumFile, DeleteAlbumFile, StorageCopyAlbumFile, LoadAlbumFileThumbnail, LoadAlbumScreenShotImage, LoadAlbumScreenShotImageEx, LoadAlbumScreenShotImageEx0, LoadAlbumScreenShotImageEx1, LoadAlbumScreenShotThumbnailImage, LoadAlbumScreenShotThumbnailImageEx, LoadAlbumScreenShotThumbnailImageEx0, LoadAlbumScreenShotThumbnailImageEx1, OpenAlbumMovieReadStream
The raw code can be read by caps:c 2501 and caps:a 50011, which themselves return the result code 0.


Cmd60002: Takes a total of 8-bytes of input, a PID, and returns an [[#IAlbumAccessorSession]].
== OpenAccessorSession ==
Takes a total of 8-bytes of input, a PID, and returns an [[#IAlbumAccessorSession]].


== IAlbumAccessorSession ==
== IAlbumAccessorSession ==
Line 113: Line 184:
|-
|-
| 2008 || ReadFileAttributeFromAlbumMovieReadStream
| 2008 || ReadFileAttributeFromAlbumMovieReadStream
|-
| 2009 || [19.0.0+]
|-
| 5000 || [18.0.0+]
|}
|}


= caps:c =
= caps:c =
This is "nn::capsrv::sf::IAlbumControlService", previously "nn::capsrv::sf::ICaptureControllerService" with [1.0.0].
This is "nn::capsrv::sf::ICaptureControllerService".
 
[2.0.0+] This is "nn::capsrv::sf::IAlbumControlService".


{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
! Cmd || Name || Notes
! Cmd || Name
|-
| 1 || [1.0.0] CaptureRawImage
|-
|-
| [1.0.0] 1 || CaptureRawImage ||
| 2 || [1.0.0] CaptureRawImageWithTimeout
|-
|-
| [1.0.0] 2 || CaptureRawImageWithTimeout ||
| 33 || [7.0.0+] [[#SetApplicationShimLibraryVersion]]
|-
|-
| 33 || [7.0.0+] ||
| 1001 || [1.0.0] RequestTakingScreenShot
|-
|-
| [1.0.0] 1001 || RequestTakingScreenShot ||
| 1002 || [1.0.0] RequestTakingScreenShotWithTimeout
|-
|-
| [1.0.0] 1002 || RequestTakingScreenShotWithTimeout ||
| 1011 || [1.0.0] NotifyTakingScreenShotRefused
|-
|-
| [1.0.0] 1011 || NotifyTakingScreenShotRefused ||  
| 2001 || NotifyAlbumStorageIsAvailable
|-
|-
| 2001 || NotifyAlbumStorageIsAvailable ||  
| 2002 || NotifyAlbumStorageIsUnavailable
|-
|-
| 2002 || NotifyAlbumStorageIsUnavailable ||  
| 2011 || [2.0.0+] [[#RegisterAppletResourceUserId]]
|-
|-
| 2011 || [2.0.0+] RegisterAppletResourceUserId ||
| 2012 || [2.0.0+] [[#UnregisterAppletResourceUserId]]
|-
|-
| 2012 || [2.0.0+] UnregisterAppletResourceUserId ||
| 2013 || [2.0.0+] [[#GetApplicationIdFromAruid]]
|-
|-
| 2013 || [2.0.0+] GetApplicationIdFromAruid ||
| 2014 || [2.0.0+] CheckApplicationIdRegistered
|-
|-
| 2014 || [2.0.0+] CheckApplicationIdRegistered ||
| 2015 || [20.0.0+]  
|-
|-
| 2101 || [2.0.0+] GenerateCurrentAlbumFileId || Takes an input u8 and u64, returns a 0x18-byte struct.
| 2016 || [20.0.0+]  
|-
|-
| 2102 || [2.0.0+] GenerateApplicationAlbumEnrty ||
| 2101 || [2.0.0+] [[#GenerateCurrentAlbumFileId]]
|-
|-
| [2.0.0-3.0.2] 2201 || SaveAlbumScreenShotFile ||
| 2102 || [2.0.0+] GenerateApplicationAlbumEnrty
|-
|-
| 2202 || [4.0.0+] SaveAlbumScreenShotFileEx ||
| 2103 || [19.0.0+]
|-
|-
| 2301 || [2.0.0+] SetOverlayScreenShotThumbnailData ||
| 2104 || [19.0.0+]
|-
|-
| 2302 || [4.0.0+] SetOverlayMovieThumbnailData ||
| 2201 || [2.0.0-3.0.2] SaveAlbumScreenShotFile
|-
|-
| 60001 || [4.0.0+] OpenControlSession || Takes a total of 8-bytes of input and a PID, returns an [[#IAlbumControlSession]].
| 2202 || [4.0.0+] [[#SaveAlbumScreenShotFileEx|SaveAlbumScreenShotFileEx]]
|-
| 2301 || [2.0.0+] SetOverlayScreenShotThumbnailData
|-
| 2302 || [4.0.0+] SetOverlayMovieThumbnailData
|-
| 2401 || [19.0.0+]
|-
| 2501 || [19.0.0+] GetAlbumAccessResultForDebug
|-
| 60001 || [4.0.0+] [[#OpenControlSession]]
|}
|}


=== Cmd33 ===
=== SetApplicationShimLibraryVersion ===
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.


This is used by [[Applet_Manager_services|caps:su]] SetShimLibraryVersion.
This is used by [[Applet_Manager_services|caps:su]] SetShimLibraryVersion.
=== RegisterAppletResourceUserId ===
Takes an input u64 and an u64. No output.
[19.0.0+] The second u64 is now a 0x10-byte struct.
=== UnregisterAppletResourceUserId ===
Takes an input u64 and an u64. No output.
[19.0.0+] The second u64 is now a 0x10-byte struct.
The struct is ignored.
=== GetApplicationIdFromAruid ===
Takes a total of 8-bytes of input. Returns an u64.
[19.0.0+] The output u64 is now a 0x10-byte struct.
=== GenerateCurrentAlbumFileId ===
Takes an input u8 and an u64, returns a 0x18-byte struct.
[19.0.0+] The input u64 is now a 0x10-byte struct.
=== SaveAlbumScreenShotFileEx ===
[20.0.0+] Now takes a total of 0x70-bytes of input instead of 0x30-bytes.
=== OpenControlSession ===
Takes a total of 8-bytes of input and a PID, returns an [[#IAlbumControlSession]].


== IAlbumControlSession ==
== IAlbumControlSession ==
Line 173: Line 290:
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
! Cmd || Name || Notes
! Cmd || Name
|-
|-
| 2001 || OpenAlbumMovieReadStream ||
| 2001 || OpenAlbumMovieReadStream
|-
|-
| 2002 || CloseAlbumMovieReadStream ||
| 2002 || CloseAlbumMovieReadStream
|-
|-
| 2003 || GetAlbumMovieReadStreamMovieDataSize ||
| 2003 || GetAlbumMovieReadStreamMovieDataSize
|-
|-
| 2004 || ReadMovieDataFromAlbumMovieReadStream ||
| 2004 || ReadMovieDataFromAlbumMovieReadStream
|-
|-
| 2005 || GetAlbumMovieReadStreamBrokenReason ||
| 2005 || GetAlbumMovieReadStreamBrokenReason
|-
|-
| 2006 || GetAlbumMovieReadStreamImageDataSize ||
| 2006 || GetAlbumMovieReadStreamImageDataSize
|-
|-
| 2007 || ReadImageDataFromAlbumMovieReadStream ||  
| 2007 || ReadImageDataFromAlbumMovieReadStream
|-
| 2008 || ReadFileAttributeFromAlbumMovieReadStream
|-
| 2009 || [19.0.0+]
|-
| 2345 || [18.0.0+]
|-
| 2401 || OpenAlbumMovieWriteStream
|-
|-
| 2008 || ReadFileAttributeFromAlbumMovieReadStream ||  
| 2402 || FinishAlbumMovieWriteStream
|-
|-
| 2401 || OpenAlbumMovieWriteStream ||  
| 2403 || CommitAlbumMovieWriteStream
|-
|-
| 2402 || FinishAlbumMovieWriteStream ||  
| 2404 || DiscardAlbumMovieWriteStream
|-
|-
| 2403 || CommitAlbumMovieWriteStream ||  
| 2405 || DiscardAlbumMovieWriteStreamNoDelete
|-
|-
| 2404 || DiscardAlbumMovieWriteStream ||  
| 2406 || [7.0.0+] CommitAlbumMovieWriteStreamEx
|-
|-
| 2405 || DiscardAlbumMovieWriteStreamNoDelete ||  
| 2411 || StartAlbumMovieWriteStreamDataSection
|-
|-
| 2406 || [7.0.0+] CommitAlbumMovieWriteStreamEx ||  
| 2412 || EndAlbumMovieWriteStreamDataSection
|-
|-
| 2411 || StartAlbumMovieWriteStreamDataSection ||  
| 2413 || StartAlbumMovieWriteStreamMetaSection
|-
|-
| 2412 || EndAlbumMovieWriteStreamDataSection ||  
| 2414 || EndAlbumMovieWriteStreamMetaSection
|-
|-
| 2413 || StartAlbumMovieWriteStreamMetaSection ||  
| 2421 || ReadDataFromAlbumMovieWriteStream
|-
|-
| 2414 || EndAlbumMovieWriteStreamMetaSection ||  
| 2422 || WriteDataToAlbumMovieWriteStream
|-
|-
| 2421 || ReadDataFromAlbumMovieWriteStream ||  
| 2424 || WriteMetaToAlbumMovieWriteStream
|-
|-
| 2422 || WriteDataToAlbumMovieWriteStream ||  
| 2431 || GetAlbumMovieWriteStreamBrokenReason
|-
|-
| 2424 || WriteMetaToAlbumMovieWriteStream ||  
| 2433 || GetAlbumMovieWriteStreamDataSize
|-
|-
| 2431 || GetAlbumMovieWriteStreamBrokenReason ||  
| 2434 || SetAlbumMovieWriteStreamDataSize
|-
|-
| 2433 || GetAlbumMovieWriteStreamDataSize ||  
| 2436 || [20.0.0+]
|-
|-
| 2434 || SetAlbumMovieWriteStreamDataSize ||  
| 5000 || [18.0.0+]
|}
|}


Line 255: Line 380:
| 141 || [6.0.0+] [[#GetAlbumFileList2AafeUidAruidDeprecated]]
| 141 || [6.0.0+] [[#GetAlbumFileList2AafeUidAruidDeprecated]]
|-
|-
| 142 || [7.0.0+] [[#GetAlbumFileList3AaeAruid]]
| 142 || [17.0.0+] GetAlbumFileList3AaeAruidDeprecated ([7.0.0-16.1.0] [[#GetAlbumFileList3AaeAruid]])
|-
| 143 || [17.0.0+] GetAlbumFileList4AaeUidAruidDeprecated ([7.0.0-16.1.0] [[#GetAlbumFileList4AaeUidAruid]])
|-
|-
| 143 || [7.0.0+] [[#GetAlbumFileList4AaeUidAruid]]
| 144 || [17.0.0+] GetAllAlbumFileList3AaeAruidDeprecated ([11.0.0-16.1.0] GetAllAlbumFileList3AaeAruid)
|-
| 145 || [17.0.0+] GetAlbumFileList5AaeAruid
|-
| 146 || [17.0.0+] GetAlbumFileList6AaeUidAruid
|-
| 147 || [17.0.0+] GetAllAlbumFileList5AaeAruid
|-
| 148 || [18.0.0+]  
|-
|-
| 60002 || [[#OpenAccessorSessionForApplication]]
| 60002 || [[#OpenAccessorSessionForApplication]]
Line 266: Line 401:


== GetAlbumFileList0AafeAruidDeprecated ==
== 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).
Takes a type-0x6 output buffer containing an array of [[#ApplicationAlbumFileEntry]], a PID, an u8 [[#AlbumFileContents]], 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.
The two s64s are the start/end PosixTime.


== DeleteAlbumFileByAruid ==
== DeleteAlbumFileByAruid ==
Takes a PID, an input u8 [[#ContentType]], an [[#ApplicationAlbumFileEntry]], an [[Applet_Manager_services#AppletResourceUserId|AppletResourceUserId]], and no output.
Takes a PID, an input u8 [[#AlbumFileContents]], an [[#ApplicationAlbumFileEntry]], an [[Applet_Manager_services#AppletResourceUserId|AppletResourceUserId]], and no output.


The [[#ContentType]] must match 3.
The [[#AlbumFileContents]] must match 3.


== GetAlbumFileSizeByAruid ==
== GetAlbumFileSizeByAruid ==
Line 296: Line 431:


== PrecheckToCreateContentsByAruid ==
== PrecheckToCreateContentsByAruid ==
Takes a PID, an input u8 [[#ContentType]], an u64, an [[Applet_Manager_services#AppletResourceUserId|AppletResourceUserId]], and no output.
Takes a PID, an input u8 [[#AlbumFileContents]], an u64, an [[Applet_Manager_services#AppletResourceUserId|AppletResourceUserId]], and no output.


== GetAlbumFileList1AafeAruidDeprecated ==
== 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).
Takes a type-0x6 output buffer containing an array of [[#ApplicationAlbumFileEntry]], a PID, an u8 [[#AlbumFileContents]], 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.
The first [[#AlbumFileDateTime]] is the start_DateTime, the second [[#AlbumFileDateTime]] is the end_DateTime. In the IPC rawdata, these use 2-byte alignment.


== GetAlbumFileList2AafeUidAruidDeprecated ==
== 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).
Takes a type-0x6 output buffer containing an array of [[#ApplicationAlbumFileEntry]], a PID, an u8 [[#AlbumFileContents]], 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.
The first [[#AlbumFileDateTime]] is the start_DateTime, the second [[#AlbumFileDateTime]] is the end_DateTime. In the IPC rawdata, these use 2-byte alignment.


== GetAlbumFileList3AaeAruid ==
== 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).
Takes a type-0x6 output buffer containing an array of [[#ApplicationAlbumEntry]], a PID, an u8 [[#AlbumFileContents]], 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.
The first [[#AlbumFileDateTime]] is the start_DateTime, the second [[#AlbumFileDateTime]] is the end_DateTime. In the IPC rawdata, these use 2-byte alignment.


== GetAlbumFileList4AaeUidAruid ==
== 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).
Takes a type-0x6 output buffer containing an array of [[#ApplicationAlbumEntry]], a PID, an u8 [[#AlbumFileContents]], 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.
The first [[#AlbumFileDateTime]] is the start_DateTime, the second [[#AlbumFileDateTime]] is the end_DateTime. In the IPC rawdata, these use 2-byte alignment.
Line 373: Line 508:
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 =
This is "nn::album::ImageOrientation".


=== AlbumImageOrientation ===
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
Line 381: Line 516:
!  Description
!  Description
|-
|-
| 0 || Unknown.
| 0 ||  
|-
|-
| 1 || Unknown.
| 1 ||  
|-
|-
| 2 || Unknown.
| 2 ||  
|-
|-
| 3 || Unknown.
| 3 ||  
|}
|}


This is "nn::album::ImageOrientation".
= AlbumReportOption =
This is "nn::album::AlbumReportOption".


=== AlbumReportOption ===
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
Line 403: Line 538:
|}
|}


This is "nn::album::AlbumReportOption".
= AlbumFileContents =
This is "nn::capsrv::AlbumFileContents".


=== ContentType ===
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
Line 411: Line 546:
!  Description
!  Description
|-
|-
| 0 || Screenshot. Album screenshots.
| 0 || Screenshot (album screenshots)
|-
|-
| 1 || Movie. Album videos.
| 1 || Movie (album videos)
|-
|-
| 3 || ExtraMovie. Videos recorded by the current Application title via [[GRC_services#IMovieMaker|GRC MovieMaker]].
| 3 || ExtraMovie (videos recorded by the current Application title via [[GRC_services#IMovieMaker|GRC MovieMaker]])
|}
|}


=== AlbumStorage ===
= AlbumStorage =
This is "nn::capsrv::AlbumStorage".
 
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
Line 424: Line 561:
!  Description
!  Description
|-
|-
| 0 || Nand. ImageDirectory on the USER partition.
| 0 || Nand (ImageDirectory on the USER partition)
|-
|-
| 1 || Sd. ImageDirectory on the Sd card
| 1 || Sd (ImageDirectory on the Sd card)
|}
|}


= AlbumFileDateTime =
= AlbumFileDateTime =
This is "nn::capsrv::AlbumFileDateTime". This is a 0x8-byte struct.
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
Line 446: Line 585:
| 0x6 || 0x1 || Second
| 0x6 || 0x1 || Second
|-
|-
| 0x7 || 0x1 || Unique ID for when there's multiple Album files with the same timestamp.
| 0x7 || 0x1 || Id (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>.
This corresponds to each field in the Album entry filename, prior to the "-": <code>YYYYMMDDHHMMSSII</code>.


= AlbumEntry =
= AlbumEntry =
This is "nn::capsrv::AlbumEntry". This is a 0x20-byte struct.
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
! Offset || Size || Description
! Offset || Size || Description
|-
|-
| 0x0 || 0x8 || Size of the entry.
| 0x0 || 0x8 || Size
|-
|-
| 0x8 || 0x8 || ApplicationId
| 0x8 || 0x18 || [[#AlbumFileId|FileId]]
|}
 
= AlbumFileId =
This is "nn::capsrv::AlbumFileId". This is a 0x18-byte struct.
 
{| class="wikitable" border="1"
|-
|-
| 0x10 || 0x8 || [[#AlbumFileDateTime]]
! Offset || Size || Description
|-
|-
| 0x18 || 0x1 || [[#AlbumStorage]]
| 0x0 || 0x8 || [[NCM_services#ApplicationId|ApplicationId]]
|-
|-
| 0x19 || 0x1 || [[#ContentType]]
| 0x8 || 0x8 || [[#AlbumFileDateTime|Time]]
|-
|-
| 0x1A || 0x6 || Padding.
| 0x10 || 0x1 || [[#AlbumStorage|Storage]]
|-
| 0x11 || 0x1 || [[#AlbumFileContents|Contents]]
|-
| 0x12 || 0x1 || [19.0.0+]
|-
| 0x13 || 0x1 || [19.0.0+]
|-
| 0x14 || 0x4 || Reserved
|}
|}


This is "nn::capsrv::AlbumEntry". This is a 0x20-byte struct.
[19.0.0+] [[#GenerateCurrentAlbumFileId|GenerateCurrentAlbumFileId]] copies the two u8s from instruct+0x8 to AlbumFileId+0x12.


= AlbumFileEntry =
= AlbumFileEntry =
Line 477: Line 630:


= ApplicationAlbumEntry =
= ApplicationAlbumEntry =
This is "nn::capsrv::ApplicationAlbumEntry". This is a 0x20-byte struct.
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
! Offset || Size || Description
! Offset || Size || Description
|-
|-
| 0x0 || 0x8 || Size of the entry.
| 0x0 || 0x8 || Size
|-
|-
| 0x8 || 0x8 || AES256 with hardcoded key over AlbumEntry.
| 0x8 || 0x8 || AES256 with hardcoded key over AlbumEntry  
|-
|-
| 0x10 || 0x8 || [[#AlbumFileDateTime]]
| 0x10 || 0x8 || [[#AlbumFileDateTime|Time]]
|-
|-
| 0x18 || 0x1 || [[#AlbumStorage]]
| 0x18 || 0x1 || [[#AlbumStorage|Storage]]
|-
|-
| 0x19 || 0x1 || [[#ContentType]]
| 0x19 || 0x1 || [[#AlbumFileContents|Contents]]
|-
|-
| 0x1a || 0x5 || Padding.
| 0x1A || 0x5 || Reserved
|-
|-
| 0x1f || 0x1 || Unknown. Set to 1 by official software.
| 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 was a plain AES256 with a random key generated at application launch.
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 =
This is "nn::capsrv::ApplicationAlbumFileEntry". This is a 0x30-byte struct.
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
Line 509: Line 666:
| 0x20 || 0x8 || [[#AlbumFileDateTime]]
| 0x20 || 0x8 || [[#AlbumFileDateTime]]
|-
|-
| 0x28 || 0x8 || Unknown.
| 0x28 || 0x8 || Unknown
|}
|}
This is "nn::capsrv::ApplicationAlbumFileEntry". This is a 0x30-byte struct.


On newer versions where official sw uses [[#ApplicationAlbumEntry]], [[#ApplicationAlbumEntry]] is converted to ApplicationAlbumFileEntry when using cmds which need it with:
On newer versions where official sw uses [[#ApplicationAlbumEntry]], [[#ApplicationAlbumEntry]] is converted to ApplicationAlbumFileEntry when using cmds which need it with:
Line 520: Line 675:


= ScreenShotAttribute =
= ScreenShotAttribute =
This is "nn::capsrv::detail::ScreenShotAttributeEx0" / "nn::capsrv::ScreenShotAttribute". This is a 0x40-byte struct.
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
Line 535: Line 692:
|}
|}


This is "nn::capsrv::detail::ScreenShotAttributeEx0" / "nn::capsrv::ScreenShotAttribute". This is a 0x40-byte struct.
= ApplicationData =
This is "nn::capsrv::ApplicationData". This is a 0x404-byte struct.


= ApplicationData =
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
Line 547: Line 704:
|}
|}


This is "nn::capsrv::ApplicationData". This is a 0x404-byte struct.
= UserIdList =
This is "nn::capsrv::UserIdList". This is a 0x88-byte struct.


= UserIdList =
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
Line 561: Line 718:
|}
|}


This is "nn::capsrv::UserIdList". This is a 0x88-byte struct.
= LoadAlbumScreenShotImageOutputForApplication =
This is "nn::capsrv::sf::LoadAlbumScreenShotImageOutputForApplication". This is a 0x500-byte struct.


= LoadAlbumScreenShotImageOutputForApplication =
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
Line 578: Line 735:
| 0x454 || 0xAC || Unused
| 0x454 || 0xAC || Unused
|}
|}
This is "nn::capsrv::sf::LoadAlbumScreenShotImageOutputForApplication". This is a 0x500-byte struct.


= ScreenShotDecodeOption =
= ScreenShotDecodeOption =
Line 587: Line 742:


= ScreenShotAttributeForApplication =
= ScreenShotAttributeForApplication =
This is "nn::capsrv::ScreenShotAttributeForApplication". This is a 0x40-byte struct.
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
! Offset || Size || Description
! Offset || Size || Description
|-
|-
| 0x0 || 0x4 || Unknown.
| 0x0 || 0x4 ||  
|-
|-
| 0x4 || 0x1 || Unknown.
| 0x4 || 0x1 ||  
|-
|-
| 0x5 || 0x1 || Unknown.
| 0x5 || 0x1 ||  
|-
|-
| 0x6 || 0x1 || Unknown.
| 0x6 || 0x1 ||  
|-
|-
| 0x7 || 0x1 || Padding.
| 0x7 || 0x1 ||  
|-
|-
| 0x8 || 0x4 || Unknown.
| 0x8 || 0x4 ||  
|-
|-
| 0xC || 0x4 || Unknown.
| 0xC || 0x4 ||  
|-
|-
| 0x10 || 0x4 || Unknown.
| 0x10 || 0x4 ||  
|-
|-
| 0x14 || 0x4 || Unknown.
| 0x14 || 0x4 ||  
|-
|-
| 0x18 || 0x4 || Unknown.
| 0x18 || 0x4 ||  
|-
|-
| 0x1C || 0x4 || Unknown.
| 0x1C || 0x4 ||  
|-
|-
| 0x20 || 0x2 || Unknown.
| 0x20 || 0x2 ||  
|-
|-
| 0x22 || 0x2 || Unknown.
| 0x22 || 0x2 ||  
|-
|-
| 0x24 || 0x2 || Unknown.
| 0x24 || 0x2 ||  
|-
|-
| 0x26 || 0x2 || Unknown.
| 0x26 || 0x2 ||  
|-
|-
| 0x28 || 0x18 || Always zero.
| 0x28 || 0x18 || Reserved
|}
|}
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).
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 =
= AlbumFileAttribute =
This is "nn::album::AlbumFileAttribute". This is a 0x10-byte struct.
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
Line 638: Line 795:
|}
|}


This is "nn::album::AlbumFileAttribute". This is a 0x10-byte struct. See also [[#ScreenShotAttributeForApplication]].
See also [[#ScreenShotAttributeForApplication]].


= AlbumMovieReadStreamHandle =
= AlbumMovieReadStreamHandle =
Line 654: Line 811:
== Videos ==
== Videos ==
[[4.0.0]] includes video playback etc support in Album via mp4. These include a JPEG thumbnail, which is used for video "validation". The EXIF is also much larger: the MakerNote is 0x498-bytes, with encrypted data starting at offset +0x8. This encryption uses AES-CTR with hardcoded key/ctr. MAC calculation works the same way as the [[3.0.0]]+ JPEG MAC calculation, except with a different movie_kek_source/movie_key_source.
[[4.0.0]] includes video playback etc support in Album via mp4. These include a JPEG thumbnail, which is used for video "validation". The EXIF is also much larger: the MakerNote is 0x498-bytes, with encrypted data starting at offset +0x8. This encryption uses AES-CTR with hardcoded key/ctr. MAC calculation works the same way as the [[3.0.0]]+ JPEG MAC calculation, except with a different movie_kek_source/movie_key_source.
Each 0x40000-byte chunk in the Movie data stream is validated with a SHA256 hash table, where hash_index=offset>>18. Whether an error is thrown on mismatch is controlled by [[System_Settings|system-setting]] "capsrv!enable_album_movie_filehash_verification".


Note: the Album process itself uses libstagefright for video playback.
Note: the Album process itself uses libstagefright for video playback.


[[Category:Services]]
[[Category:Services]]