Wo wir gerade so schön dabei sind, wie wäre es mit HDR für Video?
[softhddevice-drm-gles] Raspberry 4 und 5
-
-
Hah
Das steht erstmal gaaaanz hinten. Da sehe ich für mich überhaupt keinen Bedarf und das wird wohl nicht so einfach. Da müsste mir erstmal jemand auf die Sprünge helfen, worum es da eigentlich geht und welche Hardware das überhaupt kann.
Ich vermute, man müsste dafür das Plugin so umschreiben, dass die Videos auf OpenGL Surfaces gerendert werden auf die man dann Scaler anwenden kann. Aber das Fass werde ich so schnell nicht aufmachen...
softhdcuvid hat das, oder?
-
Im VDR-Bereich weiß ich das nicht, aber der Raspberry Pi 4 kann das mit LibreELEC. Ist aber auch eher, wie Du richtig schreibst, nicht so wichtig. Meines Wissens gibt es keine Sender, die HDR übertragen. Aber für MKVs abspielen wäre es natürlich sehr geil. Dann könnte ich mir den extra Raspberry Pi mit LibreELEC sparen.
-
Im VDR-Bereich weiß ich das nicht, aber der Raspberry Pi 4 kann das mit LibreELEC. Ist aber auch eher, wie Du richtig schreibst, nicht so wichtig. Meines Wissens gibt es keine Sender, die HDR übertragen. Aber für MKVs abspielen wäre es natürlich sehr geil. Dann könnte ich mir den extra Raspberry Pi mit LibreELEC sparen.
Für den Anwendungsfall kann man ja dann ganz einfach Kodi einsetzen... Den zweiten RPI sparst du dir, wenn du VDR*ELEC aufsetzt...
-
rell Ich habe nochmal einen Pull Request erstellt mit ein paar Übersetzungen, auch für den Medienplayer. Ich bin aber nicht sicher, ob das so einfach richtig ist?!?
Weiterhin ist mir aufgefallen, dass der Medienplayer als Directory das Videoverzeichnis des VDR verwendet:
Ich werde mal versuchen, das umzubauen, so dasss man ein Videoverzeichnis für den Videoplayer angeben kann. Ich entschuldige mich bereits jetzt für meinen Unsinn, den ich da verzapfen werde
-
Hast du DTS schon ausprobiert?
-
Hast du DTS schon ausprobiert?
Nein, gleich, wenn ich zu Hause bin.
-
Läuft perfekt:
-
Was nicht läuft, ist Dolby TrueHD. Wird nur als PCM 2.0 ausgegeben.
-
Schön
-
E-AC3 (Dolby Digital+) funktioniert auch:
-
Was nicht läuft, ist Dolby TrueHD. Wird nur als PCM 2.0 ausgegeben.
Das müsste dann einer einbauen...
-
Das müsste dann einer einbauen...
Ich hätte da jemanden im Auge
-
Hier steht wies geht: https://github.com/xbmc/xbmc/blob…EC61937.cpp#L89
Und da müsste das rein: https://github.com/rellla/vdr-plu…_audio.cpp#L141
Wenn du den Code mit den anderen "Verpackungen" vergleichst, findest du vielleicht die Lösung
-
-
Sowas?
Diff
Display Morediff --git a/codec_audio.cpp b/codec_audio.cpp index 202f63b..7a80b86 100644 --- a/codec_audio.cpp +++ b/codec_audio.cpp @@ -167,7 +167,34 @@ int cAudioDecoder::DecodePassthrough(const AVPacket * avpkt, AVFrame *frame) AudioEnqueueSpdif(AudioCtx, spdif, spdif_sz, frame); return 1; } +// TrueHD passthrough +if (PassthroughMask & CodecTrueHD && AudioCtx->codec_id == AV_CODEC_ID_TRUEHD) { + uint16_t *spdif; + int spdif_sz; + + spdif = Spdif; + spdif_sz = 61424; + // build SPDIF header and append A52 audio to it + // avpkt is the original data + if (spdif_sz < avpkt->size + 8) { + Error("cAudioDecoder::DecodePassthrough: decoded data smaller than encoded"); + return -1; + } + spdif[0] = htole16(0xF872); // iec 61937 sync word + spdif[1] = htole16(0x4E1F); + spdif[2] = htole16(IEC61937_AC3 | (avpkt->data[5] & 0x07) << 8); + spdif[3] = htole16(avpkt->size * 8); + // copy original data for output + // FIXME: not 100% sure, if endian is correct on not intel hardware + swab(avpkt->data, spdif + 4, avpkt->size); + // FIXME: don't need to clear always + memset(spdif + 4 + avpkt->size / 2, 0, spdif_sz - 8 - avpkt->size); + // don't play with the ac-3 samples + AudioEnqueueSpdif(AudioCtx, spdif, spdif_sz, frame); + return 1; + } + // EAC3 passthrough if (PassthroughMask & CodecEAC3 && AudioCtx->codec_id == AV_CODEC_ID_EAC3) { uint16_t *spdif;
Ich bin mir nicht sicher, was für Daten vor das Audiopaket kommen bei TrueHD?
Code+ spdif[0] = htole16(0xF872); // iec 61937 sync word + spdif[1] = htole16(0x4E1F); + spdif[2] = htole16(IEC61937_AC3 | (avpkt->data[5] & 0x07) << 8); + spdif[3] = htole16(avpkt->size * 8);
spdif0 bleibt sehr wahrscheinlich, aber bei 1 und 2 blick ich nicht durch. Oder bin ich hier komplett auf dem Holzweg?
-
https://github.com/xbmc/xbmc/blob…EC61937.cpp#L96
Das entspricht spdif[0] bis spdif[3]
Dein 2 stimmt nicht. Schau in den headern, was da hin muss.
https://github.com/rellla/vdr-plu…dec_audio.h#L55
Ist gleich
-
Als Patch zu vorherigem Patch. Ich bin zu doof, ein gesamtes Diff zu erstellen.
Diff
Display Morediff --git a/codec_audio.cpp b/codec_audio.cpp index 7a80b86..e4ec445 100644 --- a/codec_audio.cpp +++ b/codec_audio.cpp @@ -183,7 +183,7 @@ if (PassthroughMask & CodecTrueHD && AudioCtx->codec_id == AV_CODEC_ID_TRUEHD) { } spdif[0] = htole16(0xF872); // iec 61937 sync word spdif[1] = htole16(0x4E1F); - spdif[2] = htole16(IEC61937_AC3 | (avpkt->data[5] & 0x07) << 8); + spdif[2] = htole16(IEC61937_TRUEHD | (avpkt->data[5] & 0x07) << 8); spdif[3] = htole16(avpkt->size * 8); // copy original data for output // FIXME: not 100% sure, if endian is correct on not intel hardware
Diff
Display Morediff --git a/codec_audio.h b/codec_audio.h index 5e3c63a..05d9cb0 100644 --- a/codec_audio.h +++ b/codec_audio.h @@ -31,11 +31,12 @@ // Defines //---------------------------------------------------------------------------- -#define CodecPCM 0x01 ///< PCM bit mask -#define CodecMPA 0x02 ///< MPA bit mask (planned) -#define CodecAC3 0x04 ///< AC-3 bit mask -#define CodecEAC3 0x08 ///< E-AC-3 bit mask -#define CodecDTS 0x10 ///< DTS bit mask (planned) +#define CodecPCM 0x01 ///< PCM bit mask +#define CodecMPA 0x02 ///< MPA bit mask (planned) +#define CodecAC3 0x04 ///< AC-3 bit mask +#define CodecEAC3 0x08 ///< E-AC-3 bit mask +#define CodecDTS 0x10 ///< DTS bit mask (planned) +#define CodecTrueHD 0x16 ///< TrueHD bit mask //---------------------------------------------------------------------------- // Variables and enums
-
Fehlt noch das:
Diff
Display Morediff --git a/softhddevice-drm-gles.cpp b/softhddevice-drm-gles.cpp index 78448c4..c7e184e 100644 --- a/softhddevice-drm-gles.cpp +++ b/softhddevice-drm-gles.cpp @@ -642,6 +642,8 @@ void cMenuSetupSoft::Create(void) &AudioPassthroughEAC3, trVDR("no"), trVDR("yes"))); Add(new cMenuEditBoolItem(tr("\040\040DTS pass-through"), &AudioPassthroughDTS, trVDR("no"), trVDR("yes"))); + Add(new cMenuEditBoolItem(tr("\040\040TrueHD pass-through"), + &AudioPassthroughTrueHD, trVDR("no"), trVDR("yes"))); Add(new cMenuEditBoolItem(tr("Enable automatic AES"), &AudioAutoAES, trVDR("no"), trVDR("yes"))); }
Und das:
Diff
Display Morediff --git a/softhddevice-drm-gles.h b/softhddevice-drm-gles.h index 39f15cf..8647057 100644 --- a/softhddevice-drm-gles.h +++ b/softhddevice-drm-gles.h @@ -200,6 +200,7 @@ class cMenuSetupSoft:public cMenuSetupPage int AudioPassthroughAC3; int AudioPassthroughEAC3; int AudioPassthroughDTS; + int AudioPassthroughTrueHD; int AudioDownmix; int AudioSoftvol; int AudioNormalize;
Was vergessen?
-
Code
- spdif[2] = htole16(IEC61937_AC3 | (avpkt->data[5] & 0x07) << 8); + spdif[2] = htole16(IEC61937_TRUEHD);
reicht, siehe https://github.com/xbmc/xbmc/blob…EC61937.cpp#L98
Und bitte
Das sind einzelne bits. Hier 100000, also das 6.
Ansonsten mache doch in deinem git Verzeichnis einfach mal ein
Dann findest du alle Stellen, an denen du TrueHD ergänzen musst. Ich weiß nicht, ob die oben genannten alle sind.
Falls du mit git arbeitest, schau dir git rebase und git commit --amend an, dann kommst du am Ende mit einem Patch aus...
Ich kanns dir leider so schnell nicht coden und einchecken, das müsstest du selbst machen - oder einen getesten PR stellen. Oder eben warten ...
-
Participate now!
Don’t have an account yet? Register yourself now and be a part of our community!