1
0
Fork 0
mirror of https://github.com/immich-app/immich.git synced 2025-01-01 08:31:59 +00:00

feat(server): rkmpp hardware decoding scaling (#7472)

* feat(server): RKMPP hardware decode & scaling

* disable hardware decoding for HDR
This commit is contained in:
Fynn Petersen-Frey 2024-02-28 02:32:07 +01:00 committed by GitHub
parent f0ea99cea9
commit 87a7825cbc
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 27 additions and 11 deletions

View file

@ -1799,7 +1799,7 @@ describe(MediaService.name, () => {
'/original/path.ext', '/original/path.ext',
'upload/encoded-video/user-id/as/se/asset-id.mp4', 'upload/encoded-video/user-id/as/se/asset-id.mp4',
{ {
inputOptions: [], inputOptions: ['-hwaccel rkmpp', '-hwaccel_output_format drm_prime', '-afbc rga'],
outputOptions: [ outputOptions: [
`-c:v hevc_rkmpp`, `-c:v hevc_rkmpp`,
'-c:a copy', '-c:a copy',
@ -1810,9 +1810,9 @@ describe(MediaService.name, () => {
'-g 256', '-g 256',
'-tag:v hvc1', '-tag:v hvc1',
'-v verbose', '-v verbose',
'-vf scale=-2:720,format=yuv420p', '-vf scale_rkrga=-2:720:format=nv12:afbc=1',
'-level 153', '-level 153',
'-rc_mode 3', '-rc_mode AVBR',
'-b:v 10000k', '-b:v 10000k',
], ],
twoPass: false, twoPass: false,
@ -1834,7 +1834,7 @@ describe(MediaService.name, () => {
'/original/path.ext', '/original/path.ext',
'upload/encoded-video/user-id/as/se/asset-id.mp4', 'upload/encoded-video/user-id/as/se/asset-id.mp4',
{ {
inputOptions: [], inputOptions: ['-hwaccel rkmpp', '-hwaccel_output_format drm_prime', '-afbc rga'],
outputOptions: [ outputOptions: [
`-c:v h264_rkmpp`, `-c:v h264_rkmpp`,
'-c:a copy', '-c:a copy',
@ -1844,9 +1844,9 @@ describe(MediaService.name, () => {
'-map 0:1', '-map 0:1',
'-g 256', '-g 256',
'-v verbose', '-v verbose',
'-vf scale=-2:720,format=yuv420p', '-vf scale_rkrga=-2:720:format=nv12:afbc=1',
'-level 51', '-level 51',
'-rc_mode 2', '-rc_mode CQP',
'-qp_init 30', '-qp_init 30',
], ],
twoPass: false, twoPass: false,

View file

@ -14,7 +14,7 @@ class BaseConfig implements VideoCodecSWConfig {
getOptions(target: TranscodeTarget, videoStream: VideoStreamInfo, audioStream?: AudioStreamInfo) { getOptions(target: TranscodeTarget, videoStream: VideoStreamInfo, audioStream?: AudioStreamInfo) {
const options = { const options = {
inputOptions: this.getBaseInputOptions(), inputOptions: this.getBaseInputOptions(videoStream),
outputOptions: [...this.getBaseOutputOptions(target, videoStream, audioStream), '-v verbose'], outputOptions: [...this.getBaseOutputOptions(target, videoStream, audioStream), '-v verbose'],
twoPass: this.eligibleForTwoPass(), twoPass: this.eligibleForTwoPass(),
} as TranscodeOptions; } as TranscodeOptions;
@ -30,7 +30,8 @@ class BaseConfig implements VideoCodecSWConfig {
return options; return options;
} }
getBaseInputOptions(): string[] { // eslint-disable-next-line @typescript-eslint/no-unused-vars
getBaseInputOptions(videoStream: VideoStreamInfo): string[] {
return []; return [];
} }
@ -611,10 +612,25 @@ export class RKMPPConfig extends BaseHWConfig {
return false; return false;
} }
getBaseInputOptions() { getBaseInputOptions(videoStream: VideoStreamInfo) {
if (this.devices.length === 0) { if (this.devices.length === 0) {
throw new Error('No RKMPP device found'); throw new Error('No RKMPP device found');
} }
if (this.shouldToneMap(videoStream)) {
// disable hardware decoding
return [];
}
return ['-hwaccel rkmpp', '-hwaccel_output_format drm_prime', '-afbc rga'];
}
getFilterOptions(videoStream: VideoStreamInfo) {
if (this.shouldToneMap(videoStream)) {
// use software filter options
return super.getFilterOptions(videoStream);
}
if (this.shouldScale(videoStream)) {
return [`scale_rkrga=${this.getScaling(videoStream)}:format=nv12:afbc=1`];
}
return []; return [];
} }
@ -638,10 +654,10 @@ export class RKMPPConfig extends BaseHWConfig {
const bitrate = this.getMaxBitrateValue(); const bitrate = this.getMaxBitrateValue();
if (bitrate > 0) { if (bitrate > 0) {
// -b:v specifies max bitrate, average bitrate is derived automatically... // -b:v specifies max bitrate, average bitrate is derived automatically...
return ['-rc_mode 3', `-b:v ${bitrate}${this.getBitrateUnit()}`]; return ['-rc_mode AVBR', `-b:v ${bitrate}${this.getBitrateUnit()}`];
} }
// use CRF value as QP value // use CRF value as QP value
return ['-rc_mode 2', `-qp_init ${this.config.crf}`]; return ['-rc_mode CQP', `-qp_init ${this.config.crf}`];
} }
getSupportedCodecs() { getSupportedCodecs() {