summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--dxr3audiodecoder.c28
-rw-r--r--dxr3audiodecoder.h1
2 files changed, 29 insertions, 0 deletions
diff --git a/dxr3audiodecoder.c b/dxr3audiodecoder.c
index f3dd0ca..8c7e6e1 100644
--- a/dxr3audiodecoder.c
+++ b/dxr3audiodecoder.c
@@ -108,6 +108,7 @@ void cDxr3AudioDecoder::Decode(cDxr3PesFrame *frame, uint32_t pts, cDxr3SyncBuff
}
}
+#if LIBAVCODEC_VERSION_INT < AV_VERSION_INT(52, 26, 0)
uint8_t *ptr = const_cast<uint8_t *>(buf);
while (length > 0) {
@@ -136,6 +137,33 @@ void cDxr3AudioDecoder::Decode(cDxr3PesFrame *frame, uint32_t pts, cDxr3SyncBuff
length -= len;
ptr += len;
}
+#else
+ avpkt.data = const_cast<uint8_t *>(buf);
+ avpkt.size = length;
+
+ while (avpkt.size > 0) {
+ out_size = AVCODEC_MAX_AUDIO_FRAME_SIZE;
+
+ len = avcodec_decode_audio3(contextAudio, (short *)(&pcmbuf), &out_size, &avpkt);
+
+ if (len < 0) {
+ esyslog("[dxr3-decoder] failed to decode audio");
+ return;
+ }
+
+ if (out_size) {
+ cFixedLengthFrame* pTempFrame = aBuf.Push(pcmbuf,
+ out_size, pts);
+ if (pTempFrame) {
+ pTempFrame->SetChannelCount(contextAudio->channels);
+ pTempFrame->SetSampleRate(contextAudio->sample_rate);
+ }
+ }
+
+ avpkt.size -= len;
+ avpkt.data += len;
+ }
+#endif
}
// ==================================
diff --git a/dxr3audiodecoder.h b/dxr3audiodecoder.h
index 3888f07..3221cb3 100644
--- a/dxr3audiodecoder.h
+++ b/dxr3audiodecoder.h
@@ -61,6 +61,7 @@ private:
AVCodec *audio;
AVCodecContext *contextAudio;
+ AVPacket avpkt;
cRingBufferFrame rbuf;
cMultichannelAudio ac3dtsDecoder;