mirror of
https://github.com/immich-app/immich.git
synced 2024-12-28 22:51: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:
parent
f0ea99cea9
commit
87a7825cbc
2 changed files with 27 additions and 11 deletions
|
@ -1799,7 +1799,7 @@ describe(MediaService.name, () => {
|
|||
'/original/path.ext',
|
||||
'upload/encoded-video/user-id/as/se/asset-id.mp4',
|
||||
{
|
||||
inputOptions: [],
|
||||
inputOptions: ['-hwaccel rkmpp', '-hwaccel_output_format drm_prime', '-afbc rga'],
|
||||
outputOptions: [
|
||||
`-c:v hevc_rkmpp`,
|
||||
'-c:a copy',
|
||||
|
@ -1810,9 +1810,9 @@ describe(MediaService.name, () => {
|
|||
'-g 256',
|
||||
'-tag:v hvc1',
|
||||
'-v verbose',
|
||||
'-vf scale=-2:720,format=yuv420p',
|
||||
'-vf scale_rkrga=-2:720:format=nv12:afbc=1',
|
||||
'-level 153',
|
||||
'-rc_mode 3',
|
||||
'-rc_mode AVBR',
|
||||
'-b:v 10000k',
|
||||
],
|
||||
twoPass: false,
|
||||
|
@ -1834,7 +1834,7 @@ describe(MediaService.name, () => {
|
|||
'/original/path.ext',
|
||||
'upload/encoded-video/user-id/as/se/asset-id.mp4',
|
||||
{
|
||||
inputOptions: [],
|
||||
inputOptions: ['-hwaccel rkmpp', '-hwaccel_output_format drm_prime', '-afbc rga'],
|
||||
outputOptions: [
|
||||
`-c:v h264_rkmpp`,
|
||||
'-c:a copy',
|
||||
|
@ -1844,9 +1844,9 @@ describe(MediaService.name, () => {
|
|||
'-map 0:1',
|
||||
'-g 256',
|
||||
'-v verbose',
|
||||
'-vf scale=-2:720,format=yuv420p',
|
||||
'-vf scale_rkrga=-2:720:format=nv12:afbc=1',
|
||||
'-level 51',
|
||||
'-rc_mode 2',
|
||||
'-rc_mode CQP',
|
||||
'-qp_init 30',
|
||||
],
|
||||
twoPass: false,
|
||||
|
|
|
@ -14,7 +14,7 @@ class BaseConfig implements VideoCodecSWConfig {
|
|||
|
||||
getOptions(target: TranscodeTarget, videoStream: VideoStreamInfo, audioStream?: AudioStreamInfo) {
|
||||
const options = {
|
||||
inputOptions: this.getBaseInputOptions(),
|
||||
inputOptions: this.getBaseInputOptions(videoStream),
|
||||
outputOptions: [...this.getBaseOutputOptions(target, videoStream, audioStream), '-v verbose'],
|
||||
twoPass: this.eligibleForTwoPass(),
|
||||
} as TranscodeOptions;
|
||||
|
@ -30,7 +30,8 @@ class BaseConfig implements VideoCodecSWConfig {
|
|||
return options;
|
||||
}
|
||||
|
||||
getBaseInputOptions(): string[] {
|
||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||
getBaseInputOptions(videoStream: VideoStreamInfo): string[] {
|
||||
return [];
|
||||
}
|
||||
|
||||
|
@ -611,10 +612,25 @@ export class RKMPPConfig extends BaseHWConfig {
|
|||
return false;
|
||||
}
|
||||
|
||||
getBaseInputOptions() {
|
||||
getBaseInputOptions(videoStream: VideoStreamInfo) {
|
||||
if (this.devices.length === 0) {
|
||||
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 [];
|
||||
}
|
||||
|
||||
|
@ -638,10 +654,10 @@ export class RKMPPConfig extends BaseHWConfig {
|
|||
const bitrate = this.getMaxBitrateValue();
|
||||
if (bitrate > 0) {
|
||||
// -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
|
||||
return ['-rc_mode 2', `-qp_init ${this.config.crf}`];
|
||||
return ['-rc_mode CQP', `-qp_init ${this.config.crf}`];
|
||||
}
|
||||
|
||||
getSupportedCodecs() {
|
||||
|
|
Loading…
Reference in a new issue