Commit cc6c0c7b authored by Anssi Hannula's avatar Anssi Hannula Committed by Carl Eugen Hoyos

Do not add the preamble if the DTS stream is already padded, like DTS in

wav. In that case, DTS can be transmitted through S/PDIF without
the IEC 61937 headers.

Patch by Anssi Hannula, anssi d hannula a iki d fi

Originally committed as revision 26160 to svn://svn.ffmpeg.org/ffmpeg/trunk
parent 720ea2d5
......@@ -60,6 +60,7 @@ typedef struct IEC61937Context {
uint8_t *out_buf; ///< pointer to the outgoing data before byte-swapping
int out_bytes; ///< amount of outgoing bytes
int use_preamble; ///< preamble enabled (disabled for exactly pre-padded DTS)
int extra_bswap; ///< extra bswap for payload (for LE DTS => standard BE DTS)
uint8_t *hd_buf; ///< allocated buffer to concatenate hd audio frames
......@@ -153,6 +154,13 @@ static int spdif_header_dts(AVFormatContext *s, AVPacket *pkt)
}
ctx->pkt_offset = blocks << 7;
if (ctx->out_bytes == ctx->pkt_offset) {
/* The DTS stream fits exactly into the output stream, so skip the
* preamble as it would not fit in there. This is the case for dts
* discs and dts-in-wav. */
ctx->use_preamble = 0;
}
return 0;
}
......@@ -330,6 +338,7 @@ static int spdif_write_packet(struct AVFormatContext *s, AVPacket *pkt)
ctx->out_buf = pkt->data;
ctx->out_bytes = pkt->size;
ctx->length_code = FFALIGN(pkt->size, 2) << 3;
ctx->use_preamble = 1;
ctx->extra_bswap = 0;
ret = ctx->header_info(s, pkt);
......@@ -338,16 +347,18 @@ static int spdif_write_packet(struct AVFormatContext *s, AVPacket *pkt)
if (!ctx->pkt_offset)
return 0;
padding = (ctx->pkt_offset - BURST_HEADER_SIZE - ctx->out_bytes) >> 1;
padding = (ctx->pkt_offset - ctx->use_preamble * BURST_HEADER_SIZE - ctx->out_bytes) >> 1;
if (padding < 0) {
av_log(s, AV_LOG_ERROR, "bitrate is too high\n");
return AVERROR(EINVAL);
}
if (ctx->use_preamble) {
put_le16(s->pb, SYNCWORD1); //Pa
put_le16(s->pb, SYNCWORD2); //Pb
put_le16(s->pb, ctx->data_type); //Pc
put_le16(s->pb, ctx->length_code);//Pd
}
if (HAVE_BIGENDIAN ^ ctx->extra_bswap) {
put_buffer(s->pb, ctx->out_buf, ctx->out_bytes & ~1);
......
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