|
|
|
@@ -50,7 +50,6 @@ typedef struct DSSDemuxContext { |
|
|
|
int counter; |
|
|
|
int swap; |
|
|
|
int dss_sp_swap_byte; |
|
|
|
int8_t dss_sp_buf[DSS_FRAME_SIZE + 1]; |
|
|
|
|
|
|
|
int packet_size; |
|
|
|
int dss_header_size; |
|
|
|
@@ -182,26 +181,23 @@ static void dss_skip_audio_header(AVFormatContext *s, AVPacket *pkt) |
|
|
|
ctx->counter += DSS_BLOCK_SIZE - DSS_AUDIO_BLOCK_HEADER_SIZE; |
|
|
|
} |
|
|
|
|
|
|
|
static void dss_sp_byte_swap(DSSDemuxContext *ctx, |
|
|
|
uint8_t *dst, const uint8_t *src) |
|
|
|
static void dss_sp_byte_swap(DSSDemuxContext *ctx, uint8_t *data) |
|
|
|
{ |
|
|
|
int i; |
|
|
|
|
|
|
|
if (ctx->swap) { |
|
|
|
for (i = 3; i < DSS_FRAME_SIZE; i += 2) |
|
|
|
dst[i] = src[i]; |
|
|
|
|
|
|
|
for (i = 0; i < DSS_FRAME_SIZE - 2; i += 2) |
|
|
|
dst[i] = src[i + 4]; |
|
|
|
data[i] = data[i + 4]; |
|
|
|
|
|
|
|
dst[1] = ctx->dss_sp_swap_byte; |
|
|
|
/* Zero the padding. */ |
|
|
|
data[DSS_FRAME_SIZE] = 0; |
|
|
|
data[1] = ctx->dss_sp_swap_byte; |
|
|
|
} else { |
|
|
|
memcpy(dst, src, DSS_FRAME_SIZE); |
|
|
|
ctx->dss_sp_swap_byte = src[DSS_FRAME_SIZE - 2]; |
|
|
|
ctx->dss_sp_swap_byte = data[DSS_FRAME_SIZE - 2]; |
|
|
|
} |
|
|
|
|
|
|
|
/* make sure byte 40 is always 0 */ |
|
|
|
dst[DSS_FRAME_SIZE - 2] = 0; |
|
|
|
data[DSS_FRAME_SIZE - 2] = 0; |
|
|
|
ctx->swap ^= 1; |
|
|
|
} |
|
|
|
|
|
|
|
@@ -229,7 +225,7 @@ static int dss_sp_read_packet(AVFormatContext *s, AVPacket *pkt) |
|
|
|
pkt->stream_index = 0; |
|
|
|
|
|
|
|
if (ctx->counter < read_size) { |
|
|
|
ret = avio_read(s->pb, ctx->dss_sp_buf + buff_offset, |
|
|
|
ret = avio_read(s->pb, pkt->data + buff_offset, |
|
|
|
ctx->counter); |
|
|
|
if (ret < ctx->counter) |
|
|
|
goto error_eof; |
|
|
|
@@ -239,12 +235,13 @@ static int dss_sp_read_packet(AVFormatContext *s, AVPacket *pkt) |
|
|
|
} |
|
|
|
ctx->counter -= read_size; |
|
|
|
|
|
|
|
ret = avio_read(s->pb, ctx->dss_sp_buf + offset + buff_offset, |
|
|
|
/* This will write one byte into pkt's padding if buff_offset == 3 */ |
|
|
|
ret = avio_read(s->pb, pkt->data + offset + buff_offset, |
|
|
|
read_size - offset); |
|
|
|
if (ret < read_size - offset) |
|
|
|
goto error_eof; |
|
|
|
|
|
|
|
dss_sp_byte_swap(ctx, pkt->data, ctx->dss_sp_buf); |
|
|
|
dss_sp_byte_swap(ctx, pkt->data); |
|
|
|
|
|
|
|
if (ctx->dss_sp_swap_byte < 0) { |
|
|
|
return AVERROR(EAGAIN); |
|
|
|
|