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]] |
| |- | | |- |
| | 100 || [5.0.0+] GetAlbumFileCountEx0 | | | 100 || [5.0.0+] GetAlbumFileCountEx0 |
| |- | | |- |
| | 101 || [5.0.0+] GetAlbumFileListEx0 | | | 101 || [5.0.0+] GetAlbumFileListEx0 |
| + | |- |
| + | | 110 || [15.0.0+] |
| + | |- |
| + | | 120 || [17.0.0+] |
| + | |- |
| + | | 130 || [17.0.0+] |
| + | |- |
| + | | 140 || [17.0.0+] |
| + | |- |
| + | | 141 || [18.0.0+] |
| + | |- |
| + | | 150 || [17.0.0+] |
| + | |- |
| + | | 151 || [18.0.0+] |
| + | |- |
| + | | 160 || [18.0.0+] |
| |- | | |- |
| | 202 || [1.0.0-2.3.0] SaveEditedScreenShot | | | 202 || [1.0.0-2.3.0] SaveEditedScreenShot |
Line 60: |
Line 78: |
| | 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 80: |
Line 98: |
| | 50000 || [6.0.0+] LoadMakerNoteInfoForDebug | | | 50000 || [6.0.0+] LoadMakerNoteInfoForDebug |
| |- | | |- |
− | | 60002 || [4.0.0+] OpenAccessorSession | + | | 60002 || [4.0.0+] [[#OpenAccessorSession]] |
| |} | | |} |
| | | |
− | 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.
| + | == 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. |
| | | |
− | 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 111: |
Line 137: |
| |- | | |- |
| | 2008 || ReadFileAttributeFromAlbumMovieReadStream | | | 2008 || ReadFileAttributeFromAlbumMovieReadStream |
| + | |- |
| + | | 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" |
Line 171: |
Line 201: |
| {| class="wikitable" border="1" | | {| class="wikitable" border="1" |
| |- | | |- |
− | ! Cmd || Name || Notes | + | ! Cmd || Name |
| + | |- |
| + | | 2001 || OpenAlbumMovieReadStream |
| + | |- |
| + | | 2002 || CloseAlbumMovieReadStream |
| |- | | |- |
− | | 2001 || OpenAlbumMovieReadStream || | + | | 2003 || GetAlbumMovieReadStreamMovieDataSize |
| |- | | |- |
− | | 2002 || CloseAlbumMovieReadStream || | + | | 2004 || ReadMovieDataFromAlbumMovieReadStream |
| |- | | |- |
− | | 2003 || GetAlbumMovieReadStreamMovieDataSize || | + | | 2005 || GetAlbumMovieReadStreamBrokenReason |
| |- | | |- |
− | | 2004 || ReadMovieDataFromAlbumMovieReadStream || | + | | 2006 || GetAlbumMovieReadStreamImageDataSize |
| |- | | |- |
− | | 2005 || GetAlbumMovieReadStreamBrokenReason || | + | | 2007 || ReadImageDataFromAlbumMovieReadStream |
| |- | | |- |
− | | 2006 || GetAlbumMovieReadStreamImageDataSize || | + | | 2008 || ReadFileAttributeFromAlbumMovieReadStream |
| |- | | |- |
− | | 2007 || ReadImageDataFromAlbumMovieReadStream || | + | | 2345 || [18.0.0+] |
| |- | | |- |
− | | 2008 || ReadFileAttributeFromAlbumMovieReadStream || | + | | 2401 || OpenAlbumMovieWriteStream |
| |- | | |- |
− | | 2401 || OpenAlbumMovieWriteStream || | + | | 2402 || FinishAlbumMovieWriteStream |
| |- | | |- |
− | | 2402 || FinishAlbumMovieWriteStream || | + | | 2403 || CommitAlbumMovieWriteStream |
| |- | | |- |
− | | 2403 || CommitAlbumMovieWriteStream || | + | | 2404 || DiscardAlbumMovieWriteStream |
| |- | | |- |
− | | 2404 || DiscardAlbumMovieWriteStream || | + | | 2405 || DiscardAlbumMovieWriteStreamNoDelete |
| |- | | |- |
− | | 2405 || DiscardAlbumMovieWriteStreamNoDelete || | + | | 2406 || [7.0.0+] CommitAlbumMovieWriteStreamEx |
| |- | | |- |
− | | 2406 || [7.0.0+] || | + | | 2411 || StartAlbumMovieWriteStreamDataSection |
| |- | | |- |
− | | 2411 || StartAlbumMovieWriteStreamDataSection || | + | | 2412 || EndAlbumMovieWriteStreamDataSection |
| |- | | |- |
− | | 2412 || EndAlbumMovieWriteStreamDataSection || | + | | 2413 || StartAlbumMovieWriteStreamMetaSection |
| |- | | |- |
− | | 2413 || StartAlbumMovieWriteStreamMetaSection || | + | | 2414 || EndAlbumMovieWriteStreamMetaSection |
| |- | | |- |
− | | 2414 || EndAlbumMovieWriteStreamMetaSection || | + | | 2421 || ReadDataFromAlbumMovieWriteStream |
| |- | | |- |
− | | 2421 || ReadDataFromAlbumMovieWriteStream || | + | | 2422 || WriteDataToAlbumMovieWriteStream |
| |- | | |- |
− | | 2422 || WriteDataToAlbumMovieWriteStream || | + | | 2424 || WriteMetaToAlbumMovieWriteStream |
| |- | | |- |
− | | 2424 || WriteMetaToAlbumMovieWriteStream || | + | | 2431 || GetAlbumMovieWriteStreamBrokenReason |
| |- | | |- |
− | | 2431 || GetAlbumMovieWriteStreamBrokenReason || | + | | 2433 || GetAlbumMovieWriteStreamDataSize |
| |- | | |- |
− | | 2433 || GetAlbumMovieWriteStreamDataSize || | + | | 2434 || SetAlbumMovieWriteStreamDataSize |
| |- | | |- |
− | | 2434 || SetAlbumMovieWriteStreamDataSize || | + | | 5000 || [18.0.0+] |
| |} | | |} |
| | | |
Line 256: |
Line 290: |
| |- | | |- |
| | 143 || [7.0.0+] [[#GetAlbumFileList4AaeUidAruid]] | | | 143 || [7.0.0+] [[#GetAlbumFileList4AaeUidAruid]] |
| + | |- |
| + | | 144 || [11.0.0+] GetAllAlbumFileList3AaeAruid |
| + | |- |
| + | | 145 || [17.0.0+] |
| + | |- |
| + | | 146 || [17.0.0+] |
| + | |- |
| + | | 147 || [17.0.0+] |
| + | |- |
| + | | 148 || [18.0.0+] |
| |- | | |- |
| | 60002 || [[#OpenAccessorSessionForApplication]] | | | 60002 || [[#OpenAccessorSessionForApplication]] |
Line 264: |
Line 308: |
| | | |
| == 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. | + | 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. | | The two s64s are the start/end PosixTime. |
Line 297: |
Line 341: |
| | | |
| == 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. | + | 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. | | 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. | + | 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. | | 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. | + | 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. | | 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. | + | 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. | | The first [[#AlbumFileDateTime]] is the start_DateTime, the second [[#AlbumFileDateTime]] is the end_DateTime. In the IPC rawdata, these use 2-byte alignment. |
Line 323: |
Line 367: |
| | | |
| 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 328: |
Line 374: |
| ! 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-8.1.0] This is value 1. | + | [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. |
Line 371: |
Line 440: |
| ! Description | | ! Description |
| |- | | |- |
− | | 0 || Unknown. | + | | 0 || Don't display the screenshot-taken Overlay-applet notification. |
− | |-
| |
− | | 1 || Unknown.
| |
− | |-
| |
− | | 2 || Unknown.
| |
| |- | | |- |
− | | 3 || Unknown. | + | | 1 || Display the screenshot-taken Overlay notification. |
| |} | | |} |
| | | |
Line 393: |
Line 458: |
| |- | | |- |
| | 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 === |
| + | {| class="wikitable" border="1" |
| + | |- |
| + | ! Value |
| + | ! Description |
| + | |- |
| + | | 0 || Nand. ImageDirectory on the USER partition. |
| + | |- |
| + | | 1 || Sd. ImageDirectory on the Sd card |
| |} | | |} |
| | | |
Line 424: |
Line 500: |
| ! Offset || Size || Description | | ! Offset || Size || Description |
| |- | | |- |
− | | 0x0 || 0x8 || Unknown | + | | 0x0 || 0x8 || Size of the entry. |
| |- | | |- |
− | | 0x8 || 0x8 || titleID | + | | 0x8 || 0x8 || ApplicationId |
| |- | | |- |
| | 0x10 || 0x8 || [[#AlbumFileDateTime]] | | | 0x10 || 0x8 || [[#AlbumFileDateTime]] |
| |- | | |- |
− | | 0x18 || 0x1 || Unknown | + | | 0x18 || 0x1 || [[#AlbumStorage]] |
| |- | | |- |
− | | 0x19 || 0x1 || Unknown | + | | 0x19 || 0x1 || [[#ContentType]] |
| |- | | |- |
− | | 0x1A || 0x6 || Padding? | + | | 0x1A || 0x6 || Padding. |
| |} | | |} |
| | | |
Line 447: |
Line 523: |
| ! Offset || Size || Description | | ! Offset || Size || Description |
| |- | | |- |
− | | 0x0 || 0x8 || Unknown. | + | | 0x0 || 0x8 || Size of the entry. |
| |- | | |- |
− | | 0x8 || 0x8 || Unknown. | + | | 0x8 || 0x8 || AES256 with hardcoded key over AlbumEntry. |
| |- | | |- |
| | 0x10 || 0x8 || [[#AlbumFileDateTime]] | | | 0x10 || 0x8 || [[#AlbumFileDateTime]] |
| |- | | |- |
− | | 0x18 || 0x8 || Unknown. | + | | 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 has a different format. | + | 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). |
Line 528: |
Line 610: |
| ! Offset || Size || Description | | ! Offset || Size || Description |
| |- | | |- |
− | | 0x0 || 0x8 || Width | + | | 0x0 || 0x8 || s64 Width. Official sw copies this to a s32 output field. |
| |- | | |- |
− | | 0x8 || 0x8 || Height | + | | 0x8 || 0x8 || s64 Height. Official sw copies this to a s32 output field. |
| |- | | |- |
| | 0x10 || 0x40 || [[#ScreenShotAttributeForApplication]] | | | 0x10 || 0x40 || [[#ScreenShotAttributeForApplication]] |
Line 553: |
Line 635: |
| | 0x0 || 0x4 || Unknown. | | | 0x0 || 0x4 || Unknown. |
| |- | | |- |
− | | 0x4 || 0x3C || Unused by official sw. | + | | 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. | | 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]]. | + | 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 = |
Line 571: |
Line 681: |
| | | |
| This is "nn::album::AlbumFileAttribute". This is a 0x10-byte struct. See also [[#ScreenShotAttributeForApplication]]. | | 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 = |
Line 581: |
Line 696: |
| == 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]] |