|
|
|
@@ -103,6 +103,7 @@ typedef struct ShortenContext { |
|
|
|
int bitindex; |
|
|
|
int32_t lpcqoffset; |
|
|
|
int got_header; |
|
|
|
int got_quit_command; |
|
|
|
} ShortenContext; |
|
|
|
|
|
|
|
static av_cold int shorten_decode_init(AVCodecContext * avctx) |
|
|
|
@@ -425,13 +426,15 @@ static int shorten_decode_frame(AVCodecContext *avctx, |
|
|
|
memmove(s->bitstream, &s->bitstream[s->bitstream_index], s->bitstream_size); |
|
|
|
s->bitstream_index=0; |
|
|
|
} |
|
|
|
memcpy(&s->bitstream[s->bitstream_index + s->bitstream_size], buf, buf_size); |
|
|
|
if (buf) |
|
|
|
memcpy(&s->bitstream[s->bitstream_index + s->bitstream_size], buf, buf_size); |
|
|
|
buf= &s->bitstream[s->bitstream_index]; |
|
|
|
buf_size += s->bitstream_size; |
|
|
|
s->bitstream_size= buf_size; |
|
|
|
|
|
|
|
/* do not decode until buffer has at least max_framesize bytes */ |
|
|
|
if(buf_size < s->max_framesize){ |
|
|
|
/* do not decode until buffer has at least max_framesize bytes or |
|
|
|
the end of the file has been reached */ |
|
|
|
if (buf_size < s->max_framesize && avpkt->data) { |
|
|
|
*data_size = 0; |
|
|
|
return input_buf_size; |
|
|
|
} |
|
|
|
@@ -445,20 +448,31 @@ static int shorten_decode_frame(AVCodecContext *avctx, |
|
|
|
if ((ret = read_header(s)) < 0) |
|
|
|
return ret; |
|
|
|
*data_size = 0; |
|
|
|
goto finish_frame; |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
|
|
|
|
/* if quit command was read previously, don't decode anything */ |
|
|
|
if (s->got_quit_command) { |
|
|
|
*data_size = 0; |
|
|
|
return avpkt->size; |
|
|
|
} |
|
|
|
|
|
|
|
s->cur_chan = 0; |
|
|
|
while (s->cur_chan < s->channels) { |
|
|
|
int cmd; |
|
|
|
int len; |
|
|
|
|
|
|
|
if (get_bits_left(&s->gb) < 3+FNSIZE) { |
|
|
|
*data_size = 0; |
|
|
|
break; |
|
|
|
} |
|
|
|
|
|
|
|
cmd = get_ur_golomb_shorten(&s->gb, FNSIZE); |
|
|
|
|
|
|
|
if (cmd > FN_VERBATIM) { |
|
|
|
av_log(avctx, AV_LOG_ERROR, "unknown shorten function %d\n", cmd); |
|
|
|
if (s->bitstream_size > 0) { |
|
|
|
s->bitstream_index++; |
|
|
|
s->bitstream_size--; |
|
|
|
} |
|
|
|
return -1; |
|
|
|
*data_size = 0; |
|
|
|
break; |
|
|
|
} |
|
|
|
|
|
|
|
if (!is_audio_command[cmd]) { |
|
|
|
@@ -488,9 +502,13 @@ static int shorten_decode_frame(AVCodecContext *avctx, |
|
|
|
break; |
|
|
|
} |
|
|
|
case FN_QUIT: |
|
|
|
s->got_quit_command = 1; |
|
|
|
break; |
|
|
|
} |
|
|
|
*data_size = 0; |
|
|
|
if (cmd == FN_BLOCKSIZE || cmd == FN_QUIT) { |
|
|
|
*data_size = 0; |
|
|
|
break; |
|
|
|
} |
|
|
|
} else { |
|
|
|
/* process audio command */ |
|
|
|
int residual_size = 0; |
|
|
|
@@ -559,14 +577,14 @@ static int shorten_decode_frame(AVCodecContext *avctx, |
|
|
|
return AVERROR(EINVAL); |
|
|
|
} |
|
|
|
samples = interleave_buffer(samples, s->channels, s->blocksize, s->decoded); |
|
|
|
s->cur_chan = 0; |
|
|
|
*data_size = out_size; |
|
|
|
} else { |
|
|
|
*data_size = 0; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
if (s->cur_chan < s->channels) |
|
|
|
*data_size = 0; |
|
|
|
|
|
|
|
finish_frame: |
|
|
|
s->bitindex = get_bits_count(&s->gb) - 8*((get_bits_count(&s->gb))/8); |
|
|
|
i= (get_bits_count(&s->gb))/8; |
|
|
|
if (i > buf_size) { |
|
|
|
@@ -606,5 +624,6 @@ AVCodec ff_shorten_decoder = { |
|
|
|
.init = shorten_decode_init, |
|
|
|
.close = shorten_decode_close, |
|
|
|
.decode = shorten_decode_frame, |
|
|
|
.capabilities = CODEC_CAP_DELAY, |
|
|
|
.long_name= NULL_IF_CONFIG_SMALL("Shorten"), |
|
|
|
}; |