|
|
@@ -139,6 +139,7 @@ static int pcm_bluray_decode_frame(AVCodecContext *avctx, void *data, |
|
|
const uint8_t *src = avpkt->data; |
|
|
const uint8_t *src = avpkt->data; |
|
|
int buf_size = avpkt->size; |
|
|
int buf_size = avpkt->size; |
|
|
PCMBRDecode *s = avctx->priv_data; |
|
|
PCMBRDecode *s = avctx->priv_data; |
|
|
|
|
|
GetByteContext gb; |
|
|
int num_source_channels, channel, retval; |
|
|
int num_source_channels, channel, retval; |
|
|
int sample_size, samples; |
|
|
int sample_size, samples; |
|
|
int16_t *dst16; |
|
|
int16_t *dst16; |
|
|
@@ -154,6 +155,8 @@ static int pcm_bluray_decode_frame(AVCodecContext *avctx, void *data, |
|
|
src += 4; |
|
|
src += 4; |
|
|
buf_size -= 4; |
|
|
buf_size -= 4; |
|
|
|
|
|
|
|
|
|
|
|
bytestream2_init(&gb, src, buf_size); |
|
|
|
|
|
|
|
|
/* There's always an even number of channels in the source */ |
|
|
/* There's always an even number of channels in the source */ |
|
|
num_source_channels = FFALIGN(avctx->channels, 2); |
|
|
num_source_channels = FFALIGN(avctx->channels, 2); |
|
|
sample_size = (num_source_channels * (avctx->sample_fmt == AV_SAMPLE_FMT_S16 ? 16 : 24)) >> 3; |
|
|
sample_size = (num_source_channels * (avctx->sample_fmt == AV_SAMPLE_FMT_S16 ? 16 : 24)) >> 3; |
|
|
@@ -177,15 +180,15 @@ static int pcm_bluray_decode_frame(AVCodecContext *avctx, void *data, |
|
|
samples *= num_source_channels; |
|
|
samples *= num_source_channels; |
|
|
if (AV_SAMPLE_FMT_S16 == avctx->sample_fmt) { |
|
|
if (AV_SAMPLE_FMT_S16 == avctx->sample_fmt) { |
|
|
#if HAVE_BIGENDIAN |
|
|
#if HAVE_BIGENDIAN |
|
|
memcpy(dst16, src, buf_size); |
|
|
|
|
|
|
|
|
bytestream2_get_buffer(&gb, dst16, buf_size); |
|
|
#else |
|
|
#else |
|
|
do { |
|
|
do { |
|
|
*dst16++ = bytestream_get_be16(&src); |
|
|
|
|
|
|
|
|
*dst16++ = bytestream2_get_be16u(&gb); |
|
|
} while (--samples); |
|
|
} while (--samples); |
|
|
#endif |
|
|
#endif |
|
|
} else { |
|
|
} else { |
|
|
do { |
|
|
do { |
|
|
*dst32++ = bytestream_get_be24(&src) << 8; |
|
|
|
|
|
|
|
|
*dst32++ = bytestream2_get_be24u(&gb) << 8; |
|
|
} while (--samples); |
|
|
} while (--samples); |
|
|
} |
|
|
} |
|
|
break; |
|
|
break; |
|
|
@@ -197,24 +200,23 @@ static int pcm_bluray_decode_frame(AVCodecContext *avctx, void *data, |
|
|
if (AV_SAMPLE_FMT_S16 == avctx->sample_fmt) { |
|
|
if (AV_SAMPLE_FMT_S16 == avctx->sample_fmt) { |
|
|
do { |
|
|
do { |
|
|
#if HAVE_BIGENDIAN |
|
|
#if HAVE_BIGENDIAN |
|
|
memcpy(dst16, src, avctx->channels * 2); |
|
|
|
|
|
|
|
|
bytestream2_get_buffer(&gb, dst16, avctx->channels * 2); |
|
|
dst16 += avctx->channels; |
|
|
dst16 += avctx->channels; |
|
|
src += sample_size; |
|
|
|
|
|
#else |
|
|
#else |
|
|
channel = avctx->channels; |
|
|
channel = avctx->channels; |
|
|
do { |
|
|
do { |
|
|
*dst16++ = bytestream_get_be16(&src); |
|
|
|
|
|
|
|
|
*dst16++ = bytestream2_get_be16u(&gb); |
|
|
} while (--channel); |
|
|
} while (--channel); |
|
|
src += 2; |
|
|
|
|
|
#endif |
|
|
#endif |
|
|
|
|
|
bytestream2_skip(&gb, 2); |
|
|
} while (--samples); |
|
|
} while (--samples); |
|
|
} else { |
|
|
} else { |
|
|
do { |
|
|
do { |
|
|
channel = avctx->channels; |
|
|
channel = avctx->channels; |
|
|
do { |
|
|
do { |
|
|
*dst32++ = bytestream_get_be24(&src) << 8; |
|
|
|
|
|
|
|
|
*dst32++ = bytestream2_get_be24u(&gb) << 8; |
|
|
} while (--channel); |
|
|
} while (--channel); |
|
|
src += 3; |
|
|
|
|
|
|
|
|
bytestream2_skip(&gb, 3); |
|
|
} while (--samples); |
|
|
} while (--samples); |
|
|
} |
|
|
} |
|
|
break; |
|
|
break; |
|
|
@@ -222,22 +224,22 @@ static int pcm_bluray_decode_frame(AVCodecContext *avctx, void *data, |
|
|
case AV_CH_LAYOUT_5POINT1: |
|
|
case AV_CH_LAYOUT_5POINT1: |
|
|
if (AV_SAMPLE_FMT_S16 == avctx->sample_fmt) { |
|
|
if (AV_SAMPLE_FMT_S16 == avctx->sample_fmt) { |
|
|
do { |
|
|
do { |
|
|
dst16[0] = bytestream_get_be16(&src); |
|
|
|
|
|
dst16[1] = bytestream_get_be16(&src); |
|
|
|
|
|
dst16[2] = bytestream_get_be16(&src); |
|
|
|
|
|
dst16[4] = bytestream_get_be16(&src); |
|
|
|
|
|
dst16[5] = bytestream_get_be16(&src); |
|
|
|
|
|
dst16[3] = bytestream_get_be16(&src); |
|
|
|
|
|
|
|
|
dst16[0] = bytestream2_get_be16u(&gb); |
|
|
|
|
|
dst16[1] = bytestream2_get_be16u(&gb); |
|
|
|
|
|
dst16[2] = bytestream2_get_be16u(&gb); |
|
|
|
|
|
dst16[4] = bytestream2_get_be16u(&gb); |
|
|
|
|
|
dst16[5] = bytestream2_get_be16u(&gb); |
|
|
|
|
|
dst16[3] = bytestream2_get_be16u(&gb); |
|
|
dst16 += 6; |
|
|
dst16 += 6; |
|
|
} while (--samples); |
|
|
} while (--samples); |
|
|
} else { |
|
|
} else { |
|
|
do { |
|
|
do { |
|
|
dst32[0] = bytestream_get_be24(&src) << 8; |
|
|
|
|
|
dst32[1] = bytestream_get_be24(&src) << 8; |
|
|
|
|
|
dst32[2] = bytestream_get_be24(&src) << 8; |
|
|
|
|
|
dst32[4] = bytestream_get_be24(&src) << 8; |
|
|
|
|
|
dst32[5] = bytestream_get_be24(&src) << 8; |
|
|
|
|
|
dst32[3] = bytestream_get_be24(&src) << 8; |
|
|
|
|
|
|
|
|
dst32[0] = bytestream2_get_be24u(&gb) << 8; |
|
|
|
|
|
dst32[1] = bytestream2_get_be24u(&gb) << 8; |
|
|
|
|
|
dst32[2] = bytestream2_get_be24u(&gb) << 8; |
|
|
|
|
|
dst32[4] = bytestream2_get_be24u(&gb) << 8; |
|
|
|
|
|
dst32[5] = bytestream2_get_be24u(&gb) << 8; |
|
|
|
|
|
dst32[3] = bytestream2_get_be24u(&gb) << 8; |
|
|
dst32 += 6; |
|
|
dst32 += 6; |
|
|
} while (--samples); |
|
|
} while (--samples); |
|
|
} |
|
|
} |
|
|
@@ -246,27 +248,27 @@ static int pcm_bluray_decode_frame(AVCodecContext *avctx, void *data, |
|
|
case AV_CH_LAYOUT_7POINT0: |
|
|
case AV_CH_LAYOUT_7POINT0: |
|
|
if (AV_SAMPLE_FMT_S16 == avctx->sample_fmt) { |
|
|
if (AV_SAMPLE_FMT_S16 == avctx->sample_fmt) { |
|
|
do { |
|
|
do { |
|
|
dst16[0] = bytestream_get_be16(&src); |
|
|
|
|
|
dst16[1] = bytestream_get_be16(&src); |
|
|
|
|
|
dst16[2] = bytestream_get_be16(&src); |
|
|
|
|
|
dst16[5] = bytestream_get_be16(&src); |
|
|
|
|
|
dst16[3] = bytestream_get_be16(&src); |
|
|
|
|
|
dst16[4] = bytestream_get_be16(&src); |
|
|
|
|
|
dst16[6] = bytestream_get_be16(&src); |
|
|
|
|
|
|
|
|
dst16[0] = bytestream2_get_be16u(&gb); |
|
|
|
|
|
dst16[1] = bytestream2_get_be16u(&gb); |
|
|
|
|
|
dst16[2] = bytestream2_get_be16u(&gb); |
|
|
|
|
|
dst16[5] = bytestream2_get_be16u(&gb); |
|
|
|
|
|
dst16[3] = bytestream2_get_be16u(&gb); |
|
|
|
|
|
dst16[4] = bytestream2_get_be16u(&gb); |
|
|
|
|
|
dst16[6] = bytestream2_get_be16u(&gb); |
|
|
dst16 += 7; |
|
|
dst16 += 7; |
|
|
src += 2; |
|
|
|
|
|
|
|
|
bytestream2_skip(&gb, 2); |
|
|
} while (--samples); |
|
|
} while (--samples); |
|
|
} else { |
|
|
} else { |
|
|
do { |
|
|
do { |
|
|
dst32[0] = bytestream_get_be24(&src) << 8; |
|
|
|
|
|
dst32[1] = bytestream_get_be24(&src) << 8; |
|
|
|
|
|
dst32[2] = bytestream_get_be24(&src) << 8; |
|
|
|
|
|
dst32[5] = bytestream_get_be24(&src) << 8; |
|
|
|
|
|
dst32[3] = bytestream_get_be24(&src) << 8; |
|
|
|
|
|
dst32[4] = bytestream_get_be24(&src) << 8; |
|
|
|
|
|
dst32[6] = bytestream_get_be24(&src) << 8; |
|
|
|
|
|
|
|
|
dst32[0] = bytestream2_get_be24u(&gb) << 8; |
|
|
|
|
|
dst32[1] = bytestream2_get_be24u(&gb) << 8; |
|
|
|
|
|
dst32[2] = bytestream2_get_be24u(&gb) << 8; |
|
|
|
|
|
dst32[5] = bytestream2_get_be24u(&gb) << 8; |
|
|
|
|
|
dst32[3] = bytestream2_get_be24u(&gb) << 8; |
|
|
|
|
|
dst32[4] = bytestream2_get_be24u(&gb) << 8; |
|
|
|
|
|
dst32[6] = bytestream2_get_be24u(&gb) << 8; |
|
|
dst32 += 7; |
|
|
dst32 += 7; |
|
|
src += 3; |
|
|
|
|
|
|
|
|
bytestream2_skip(&gb, 3); |
|
|
} while (--samples); |
|
|
} while (--samples); |
|
|
} |
|
|
} |
|
|
break; |
|
|
break; |
|
|
@@ -274,26 +276,26 @@ static int pcm_bluray_decode_frame(AVCodecContext *avctx, void *data, |
|
|
case AV_CH_LAYOUT_7POINT1: |
|
|
case AV_CH_LAYOUT_7POINT1: |
|
|
if (AV_SAMPLE_FMT_S16 == avctx->sample_fmt) { |
|
|
if (AV_SAMPLE_FMT_S16 == avctx->sample_fmt) { |
|
|
do { |
|
|
do { |
|
|
dst16[0] = bytestream_get_be16(&src); |
|
|
|
|
|
dst16[1] = bytestream_get_be16(&src); |
|
|
|
|
|
dst16[2] = bytestream_get_be16(&src); |
|
|
|
|
|
dst16[6] = bytestream_get_be16(&src); |
|
|
|
|
|
dst16[4] = bytestream_get_be16(&src); |
|
|
|
|
|
dst16[5] = bytestream_get_be16(&src); |
|
|
|
|
|
dst16[7] = bytestream_get_be16(&src); |
|
|
|
|
|
dst16[3] = bytestream_get_be16(&src); |
|
|
|
|
|
|
|
|
dst16[0] = bytestream2_get_be16u(&gb); |
|
|
|
|
|
dst16[1] = bytestream2_get_be16u(&gb); |
|
|
|
|
|
dst16[2] = bytestream2_get_be16u(&gb); |
|
|
|
|
|
dst16[6] = bytestream2_get_be16u(&gb); |
|
|
|
|
|
dst16[4] = bytestream2_get_be16u(&gb); |
|
|
|
|
|
dst16[5] = bytestream2_get_be16u(&gb); |
|
|
|
|
|
dst16[7] = bytestream2_get_be16u(&gb); |
|
|
|
|
|
dst16[3] = bytestream2_get_be16u(&gb); |
|
|
dst16 += 8; |
|
|
dst16 += 8; |
|
|
} while (--samples); |
|
|
} while (--samples); |
|
|
} else { |
|
|
} else { |
|
|
do { |
|
|
do { |
|
|
dst32[0] = bytestream_get_be24(&src) << 8; |
|
|
|
|
|
dst32[1] = bytestream_get_be24(&src) << 8; |
|
|
|
|
|
dst32[2] = bytestream_get_be24(&src) << 8; |
|
|
|
|
|
dst32[6] = bytestream_get_be24(&src) << 8; |
|
|
|
|
|
dst32[4] = bytestream_get_be24(&src) << 8; |
|
|
|
|
|
dst32[5] = bytestream_get_be24(&src) << 8; |
|
|
|
|
|
dst32[7] = bytestream_get_be24(&src) << 8; |
|
|
|
|
|
dst32[3] = bytestream_get_be24(&src) << 8; |
|
|
|
|
|
|
|
|
dst32[0] = bytestream2_get_be24u(&gb) << 8; |
|
|
|
|
|
dst32[1] = bytestream2_get_be24u(&gb) << 8; |
|
|
|
|
|
dst32[2] = bytestream2_get_be24u(&gb) << 8; |
|
|
|
|
|
dst32[6] = bytestream2_get_be24u(&gb) << 8; |
|
|
|
|
|
dst32[4] = bytestream2_get_be24u(&gb) << 8; |
|
|
|
|
|
dst32[5] = bytestream2_get_be24u(&gb) << 8; |
|
|
|
|
|
dst32[7] = bytestream2_get_be24u(&gb) << 8; |
|
|
|
|
|
dst32[3] = bytestream2_get_be24u(&gb) << 8; |
|
|
dst32 += 8; |
|
|
dst32 += 8; |
|
|
} while (--samples); |
|
|
} while (--samples); |
|
|
} |
|
|
} |
|
|
@@ -304,7 +306,7 @@ static int pcm_bluray_decode_frame(AVCodecContext *avctx, void *data, |
|
|
*got_frame_ptr = 1; |
|
|
*got_frame_ptr = 1; |
|
|
*(AVFrame *)data = s->frame; |
|
|
*(AVFrame *)data = s->frame; |
|
|
|
|
|
|
|
|
retval = src - avpkt->data; |
|
|
|
|
|
|
|
|
retval = bytestream2_tell(&gb); |
|
|
if (avctx->debug & FF_DEBUG_BITSTREAM) |
|
|
if (avctx->debug & FF_DEBUG_BITSTREAM) |
|
|
av_dlog(avctx, "pcm_bluray_decode_frame: decoded %d -> %d bytes\n", |
|
|
av_dlog(avctx, "pcm_bluray_decode_frame: decoded %d -> %d bytes\n", |
|
|
retval, buf_size); |
|
|
retval, buf_size); |
|
|
|