diff options
-rw-r--r-- | dxr3audiodecoder.c | 31 | ||||
-rw-r--r-- | dxr3audiodecoder.h | 1 | ||||
-rw-r--r-- | dxr3device.c | 2 |
3 files changed, 33 insertions, 1 deletions
diff --git a/dxr3audiodecoder.c b/dxr3audiodecoder.c index 71196fa..d28fe5c 100644 --- a/dxr3audiodecoder.c +++ b/dxr3audiodecoder.c @@ -30,6 +30,7 @@ #include "dxr3audiodecoder.h" #include "dxr3pesframe.h" #include "dxr3audio.h" +#include "settings.h" // ================================== const int LPCM_HEADER_LENGTH = 7; @@ -142,6 +143,36 @@ void cDxr3AudioDecoder::decode(cDxr3PesFrame *frame, iAudio *audio) } } +void cDxr3AudioDecoder::ac3dts(cDxr3PesFrame *frame, iAudio *audio) +{ + if (cSettings::instance()->ac3AudioMode() == PCM_ENCAPSULATION) { + + uint8_t *buf = (uint8_t *)frame->payload(); + int length = frame->payloadSize(); + + ac3dtsDecoder.Check(buf, length, (uint8_t *)frame->pesStart()); + ac3dtsDecoder.Encapsulate(buf, length); + + cFrame* pFrame = 0; + while ((pFrame = rbuf.Get())) { + if (pFrame && pFrame->Count()) { + cDxr3PesFrame tempPes; + tempPes.parse(pFrame->Data(), pFrame->Count()); + int pesHeaderLength = (int) (tempPes.payload() - tempPes.pesStart()); + uint8_t* pData = pFrame->Data() + pesHeaderLength + LPCM_HEADER_LENGTH; + + for (int i = 0; i < pFrame->Count() - pesHeaderLength - LPCM_HEADER_LENGTH; i += 2) { + std::swap(pData[i], pData[i + 1]); + } + + audio->write(pFrame->Data() + pesHeaderLength + LPCM_HEADER_LENGTH, pFrame->Count() - pesHeaderLength - 7); + if (pFrame) + rbuf.Drop(pFrame); + } + } + } +} + #if 0 // ================================== //! decode lpcm diff --git a/dxr3audiodecoder.h b/dxr3audiodecoder.h index f52305a..67682bc 100644 --- a/dxr3audiodecoder.h +++ b/dxr3audiodecoder.h @@ -43,6 +43,7 @@ public: ~cDxr3AudioDecoder(); void decode(cDxr3PesFrame *frame, iAudio *audio); + void ac3dts(cDxr3PesFrame *frame, iAudio *audio); /* void DecodeLpcm(cDxr3PesFrame *frame, uint32_t pts, cDxr3SyncBuffer &aBuf); void DecodeAc3Dts(cDxr3PesFrame *frame, uint32_t pts, cDxr3SyncBuffer &aBuf); diff --git a/dxr3device.c b/dxr3device.c index 68f1a33..1f8be19 100644 --- a/dxr3device.c +++ b/dxr3device.c @@ -277,7 +277,7 @@ int cDxr3Device::PlayAudio(const uchar *Data, int Length, uchar Id) if (!isAc3) { aDecoder->decode(&frame, audioOut); } else { - isyslog("[dxr3-device] ac3 is not supported"); + aDecoder->ac3dts(&frame, audioOut); } return Length; |