mirror of
https://projects.vdr-developer.org/git/vdr-plugin-softhddevice.git
synced 2023-10-10 19:16:51 +02:00
Find AC3 (Dolby Digital) inside PES packet.
This commit is contained in:
parent
4331692ee5
commit
919428cb80
@ -1,5 +1,6 @@
|
|||||||
User johns
|
User johns
|
||||||
|
|
||||||
|
Find AC3 (Dolby Digital) inside PES packet.
|
||||||
Fix bug: audio increments invalid audio PTS.
|
Fix bug: audio increments invalid audio PTS.
|
||||||
Fix bug: dvd plugin not working.
|
Fix bug: dvd plugin not working.
|
||||||
Fix bug: used frame-> instead of video_ctx-> for old libav/ffmpeg.
|
Fix bug: used frame-> instead of video_ctx-> for old libav/ffmpeg.
|
||||||
|
100
softhddev.c
100
softhddev.c
@ -193,6 +193,89 @@ static int FindAudioSync(const AVPacket * avpkt)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
** Possible AC3 frame sizes.
|
||||||
|
**
|
||||||
|
** from ATSC A/52 table 5.18 frame size code table.
|
||||||
|
*/
|
||||||
|
const uint16_t Ac3FrameSizeTable[38][3] = {
|
||||||
|
{64, 69, 96},
|
||||||
|
{64, 70, 96},
|
||||||
|
{80, 87, 120},
|
||||||
|
{80, 88, 120},
|
||||||
|
{96, 104, 144},
|
||||||
|
{96, 105, 144},
|
||||||
|
{112, 121, 168},
|
||||||
|
{112, 122, 168},
|
||||||
|
{128, 139, 192},
|
||||||
|
{128, 140, 192},
|
||||||
|
{160, 174, 240},
|
||||||
|
{160, 175, 240},
|
||||||
|
{192, 208, 288},
|
||||||
|
{192, 209, 288},
|
||||||
|
{224, 243, 336},
|
||||||
|
{224, 244, 336},
|
||||||
|
{256, 278, 384},
|
||||||
|
{256, 279, 384},
|
||||||
|
{320, 348, 480},
|
||||||
|
{320, 349, 480},
|
||||||
|
{384, 417, 576},
|
||||||
|
{384, 418, 576},
|
||||||
|
{448, 487, 672},
|
||||||
|
{448, 488, 672},
|
||||||
|
{512, 557, 768},
|
||||||
|
{512, 558, 768},
|
||||||
|
{640, 696, 960},
|
||||||
|
{640, 697, 960},
|
||||||
|
{768, 835, 1152},
|
||||||
|
{768, 836, 1152},
|
||||||
|
{896, 975, 1344},
|
||||||
|
{896, 976, 1344},
|
||||||
|
{1024, 1114, 1536},
|
||||||
|
{1024, 1115, 1536},
|
||||||
|
{1152, 1253, 1728},
|
||||||
|
{1152, 1254, 1728},
|
||||||
|
{1280, 1393, 1920},
|
||||||
|
{1280, 1394, 1920},
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
** Find dolby sync in audio packet.
|
||||||
|
**
|
||||||
|
** @param avpkt audio packet
|
||||||
|
*/
|
||||||
|
static int FindDolbySync(const AVPacket * avpkt)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
const uint8_t *data;
|
||||||
|
|
||||||
|
i = 0;
|
||||||
|
data = avpkt->data;
|
||||||
|
while (i < avpkt->size - 5) {
|
||||||
|
if (data[i] == 0x0B && data[i + 1] == 0x77) {
|
||||||
|
int fscod;
|
||||||
|
int frmsizcod;
|
||||||
|
int frame_size;
|
||||||
|
|
||||||
|
// crc1 crc1 fscod|frmsizcod
|
||||||
|
fscod = data[i + 4] >> 6;
|
||||||
|
frmsizcod = data[i + 4] & 0x3F;
|
||||||
|
frame_size = Ac3FrameSizeTable[frmsizcod][fscod] * 2;
|
||||||
|
|
||||||
|
// check if after this frame a new ac-3 frame starts
|
||||||
|
if (i + frame_size < avpkt->size - 5
|
||||||
|
&& data[i + frame_size] == 0x0B
|
||||||
|
&& data[i + frame_size + 1] == 0x77) {
|
||||||
|
Debug(3, "audio: ac-3 found at %d\n", i);
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
// no valid frame size or no continuation, try next
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
** Play audio packet.
|
** Play audio packet.
|
||||||
**
|
**
|
||||||
@ -297,6 +380,9 @@ int PlayAudio(const uint8_t * data, int size, uint8_t id)
|
|||||||
AudioCodecID = CODEC_ID_AAC_LATM;
|
AudioCodecID = CODEC_ID_AAC_LATM;
|
||||||
}
|
}
|
||||||
// Private stream + LPCM ID
|
// Private stream + LPCM ID
|
||||||
|
} else if (data[-n - 9 + 3] == 0xBD && data[0] == 0x80) {
|
||||||
|
Debug(3, "[softhddev]%s: DVD Audio %d\n", __FUNCTION__, id);
|
||||||
|
// Private stream + LPCM ID
|
||||||
} else if (data[-n - 9 + 3] == 0xBD && data[0] == 0xA0) {
|
} else if (data[-n - 9 + 3] == 0xBD && data[0] == 0xA0) {
|
||||||
if (AudioCodecID != CODEC_ID_PCM_DVD) {
|
if (AudioCodecID != CODEC_ID_PCM_DVD) {
|
||||||
static int samplerates[] = { 48000, 96000, 44100, 32000 };
|
static int samplerates[] = { 48000, 96000, 44100, 32000 };
|
||||||
@ -338,19 +424,27 @@ int PlayAudio(const uint8_t * data, int size, uint8_t id)
|
|||||||
// FIXME: otherwise it takes too long until sound appears
|
// FIXME: otherwise it takes too long until sound appears
|
||||||
|
|
||||||
if (AudioCodecID == CODEC_ID_NONE) {
|
if (AudioCodecID == CODEC_ID_NONE) {
|
||||||
|
int id;
|
||||||
|
|
||||||
Debug(3, "[softhddev]%s: ??? %d\n", __FUNCTION__, id);
|
Debug(3, "[softhddev]%s: ??? %d\n", __FUNCTION__, id);
|
||||||
avpkt->data = (void *)data;
|
avpkt->data = (void *)data;
|
||||||
avpkt->size = size;
|
avpkt->size = size;
|
||||||
|
if (AudioChannelID == 0xBD) {
|
||||||
|
n = FindDolbySync(avpkt);
|
||||||
|
id = CODEC_ID_AC3;
|
||||||
|
} else {
|
||||||
n = FindAudioSync(avpkt);
|
n = FindAudioSync(avpkt);
|
||||||
|
id = CODEC_ID_MP2;
|
||||||
|
}
|
||||||
if (n < 0) {
|
if (n < 0) {
|
||||||
return osize;
|
return osize;
|
||||||
}
|
}
|
||||||
|
|
||||||
avpkt->pts = AV_NOPTS_VALUE;
|
CodecAudioOpen(MyAudioDecoder, NULL, id);
|
||||||
CodecAudioOpen(MyAudioDecoder, NULL, CODEC_ID_MP2);
|
AudioCodecID = id;
|
||||||
AudioCodecID = CODEC_ID_MP2;
|
|
||||||
data += n;
|
data += n;
|
||||||
size -= n;
|
size -= n;
|
||||||
|
avpkt->pts = AV_NOPTS_VALUE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// still no decoder or codec known
|
// still no decoder or codec known
|
||||||
|
Loading…
Reference in New Issue
Block a user