aboutsummaryrefslogtreecommitdiffstats
path: root/libavformat/spdifenc.c
diff options
context:
space:
mode:
authorHendrik Leppkes <h.leppkes@gmail.com>2018-04-03 12:35:27 +0200
committerHendrik Leppkes <h.leppkes@gmail.com>2018-04-11 11:37:05 +0200
commit3e9d676192fc6ef719a904f8a2d114efec03d7c1 (patch)
tree74ddeb6f680cb196bf4bf589fda32da4a42e1c3a /libavformat/spdifenc.c
parent9825f77ac7ab102783aad4d2e0c42584a0dde466 (diff)
downloadffmpeg-3e9d676192fc6ef719a904f8a2d114efec03d7c1.tar.gz
spdifenc: support ac3 core+eac3 dependent streams
Such streams are found on Blu-ray, and identified as EAC3 type in avformat, while the bitstream of the core stream is actually a pure AC3 frame. Adjust the parsing accordingly, since AC3 frames always hold 6 blocks and the numblkscod syntax element is not present.
Diffstat (limited to 'libavformat/spdifenc.c')
-rw-r--r--libavformat/spdifenc.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/libavformat/spdifenc.c b/libavformat/spdifenc.c
index 3a50aebbef..9514ff8e10 100644
--- a/libavformat/spdifenc.c
+++ b/libavformat/spdifenc.c
@@ -118,7 +118,8 @@ static int spdif_header_eac3(AVFormatContext *s, AVPacket *pkt)
static const uint8_t eac3_repeat[4] = {6, 3, 2, 1};
int repeat = 1;
- if ((pkt->data[4] & 0xc0) != 0xc0) /* fscod */
+ int bsid = pkt->data[5] >> 3;
+ if (bsid > 10 && (pkt->data[4] & 0xc0) != 0xc0) /* fscod */
repeat = eac3_repeat[(pkt->data[4] & 0x30) >> 4]; /* numblkscod */
ctx->hd_buf = av_fast_realloc(ctx->hd_buf, &ctx->hd_buf_size, ctx->hd_buf_filled + pkt->size);