Anton Khirnov: "The size is constant, just keep it in the context"
Signed-off-by: Oleksij Rempel <[email protected]> --- libavformat/dss.c | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/libavformat/dss.c b/libavformat/dss.c index 8990786..89f9554 100644 --- a/libavformat/dss.c +++ b/libavformat/dss.c @@ -52,6 +52,7 @@ typedef struct DSSDemuxContext { int counter; int swap; int dsssp_swap_byte; + int8_t *dss_sp_buf; } DSSDemuxContext; static int dss_probe(AVProbeData *p) @@ -121,9 +122,6 @@ static int dss_read_header(AVFormatContext *s) AVIOContext *pb = s->pb; int ret; - if (avio_size(pb) <= DSS_HEADER_SIZE) - return AVERROR(EINVAL); - st = avformat_new_stream(s, NULL); if (!st) return AVERROR(ENOMEM); @@ -172,6 +170,11 @@ static int dss_read_header(AVFormatContext *s) priv->counter = 0; priv->swap = 0; + /* theoretically dss contrainer can */ + priv->dss_sp_buf = av_malloc(DSS_SP_FRAME_SIZE + 1); + if (!priv->dss_sp_buf) + return AVERROR(ENOMEM); + return 0; } @@ -211,7 +214,6 @@ static int dss_sp_read_packet(AVFormatContext *s, AVPacket *pkt) { DSSDemuxContext *priv = s->priv_data; int read_size, ret, offset = 0, buff_offset = 0; - int8_t *buff; if (priv->counter == 0) dss_skip_audio_header(s, pkt); @@ -226,10 +228,6 @@ static int dss_sp_read_packet(AVFormatContext *s, AVPacket *pkt) priv->counter -= read_size; - buff = av_malloc(DSS_SP_FRAME_SIZE + 1); - if (!buff) - return AVERROR_EOF; - ret = av_new_packet(pkt, DSS_SP_FRAME_SIZE); if (ret < 0) return ret; @@ -240,7 +238,7 @@ static int dss_sp_read_packet(AVFormatContext *s, AVPacket *pkt) if (priv->counter < 0) { int size2 = priv->counter + read_size; - ret = avio_read(s->pb, buff + offset + buff_offset, + ret = avio_read(s->pb, priv->dss_sp_buf + offset + buff_offset, size2 - offset); if (ret < size2 - offset) goto error_eof; @@ -249,17 +247,15 @@ static int dss_sp_read_packet(AVFormatContext *s, AVPacket *pkt) offset = size2; } - ret = avio_read(s->pb, buff + offset + buff_offset, + ret = avio_read(s->pb, priv->dss_sp_buf + offset + buff_offset, read_size - offset); if (ret < read_size - offset) goto error_eof; - dss_sp_byte_swap(priv, pkt->data, buff); - av_free(buff); + dss_sp_byte_swap(priv, pkt->data, priv->dss_sp_buf); return pkt->size; error_eof: - av_free(buff); av_free_packet(pkt); return ret < 0 ? ret : AVERROR_EOF; } @@ -323,6 +319,15 @@ static int dss_read_packet(AVFormatContext *s, AVPacket *pkt) return dss_723_1_read_packet(s, pkt); } +static int dss_read_close(AVFormatContext *s) +{ + DSSDemuxContext *priv = s->priv_data; + + av_free(priv->dss_sp_buf); + + return 0; +} + AVInputFormat ff_dss_demuxer = { .name = "dss", .long_name = NULL_IF_CONFIG_SMALL("DSS"), @@ -330,5 +335,6 @@ AVInputFormat ff_dss_demuxer = { .read_probe = dss_probe, .read_header = dss_read_header, .read_packet = dss_read_packet, + .read_close = dss_read_close, .extensions = "dss" }; -- 1.9.1 _______________________________________________ libav-devel mailing list [email protected] https://lists.libav.org/mailman/listinfo/libav-devel
