Commit d3538dd2 authored by rcombs's avatar rcombs

lavf/spdifdec: support EAC3

Parsing should probably be enabled for all codecs, at least for headers,
but e.g. the AAC parser produces 1-byte packets of zero padding with it,
so I'm just enabling it for EAC3 for the moment.
parent 6161eacc
......@@ -31,6 +31,7 @@
#include "libavcodec/adts_parser.h"
#include "avformat.h"
#include "internal.h"
#include "spdif.h"
static int spdif_get_offset_and_codec(AVFormatContext *s,
......@@ -93,6 +94,10 @@ static int spdif_get_offset_and_codec(AVFormatContext *s,
*offset = 8192;
*codec = AV_CODEC_ID_DTS;
break;
case IEC61937_EAC3:
*offset = 24576;
*codec = AV_CODEC_ID_EAC3;
break;
default:
if (s) { /* be silent during a probe */
avpriv_request_sample(s, "Data type 0x%04x in IEC 61937",
......@@ -170,6 +175,16 @@ static int spdif_read_header(AVFormatContext *s)
return 0;
}
static int spdif_get_pkt_size_bits(int type, int code)
{
switch (type & 0xff) {
case IEC61937_EAC3:
return code << 3;
default:
return code;
}
}
int ff_spdif_read_packet(AVFormatContext *s, AVPacket *pkt)
{
AVIOContext *pb = s->pb;
......@@ -185,7 +200,7 @@ int ff_spdif_read_packet(AVFormatContext *s, AVPacket *pkt)
}
data_type = avio_rl16(pb);
pkt_size_bits = avio_rl16(pb);
pkt_size_bits = spdif_get_pkt_size_bits(data_type, avio_rl16(pb));
if (pkt_size_bits % 16)
avpriv_request_sample(s, "Packet not ending at a 16-bit boundary");
......@@ -218,6 +233,8 @@ int ff_spdif_read_packet(AVFormatContext *s, AVPacket *pkt)
}
st->codecpar->codec_type = AVMEDIA_TYPE_AUDIO;
st->codecpar->codec_id = codec_id;
if (codec_id == AV_CODEC_ID_EAC3)
ffstream(st)->need_parsing = AVSTREAM_PARSE_FULL;
} else if (codec_id != s->streams[0]->codecpar->codec_id) {
avpriv_report_missing_feature(s, "Codec change in IEC 61937");
return AVERROR_PATCHWELCOME;
......
......@@ -24,6 +24,9 @@ fate-spdif-dca-master-core: CMD = md5 -i $(TARGET_SAMPLES)/dts/master_audio_7.1_
FATE_SPDIF-$(call DEMMUX, EAC3, SPDIF) += fate-spdif-eac3
fate-spdif-eac3: CMD = md5 -i $(TARGET_SAMPLES)/eac3/csi_miami_stereo_128_spx.eac3 -c copy -f spdif
FATE_SPDIF_REMUX-$(call ALLYES, EAC3_DEMUXER EAC3_DECODER SPDIF_MUXER SPDIF_DEMUXER) += fate-spdif-eac3-remux
fate-spdif-eac3-remux: CMD = transcode eac3 $(TARGET_SAMPLES)/eac3/csi_miami_stereo_128_spx.eac3 spdif "-c copy" "-c copy"
FATE_SPDIF-$(call DEMMUX, MLP, SPDIF) += fate-spdif-mlp
fate-spdif-mlp: CMD = md5 -i $(TARGET_SAMPLES)/lossless-audio/luckynight-partial.mlp -c copy -f spdif
......
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment