On Fri, Jul 17, 2015 at 1:11 PM, Tom Butterworth <[email protected]> wrote:
> Some uses of Snappy require uncompressing to positions within an existing 
> buffer. Also adds a function to get the uncompressed length of Snappy data.
> ---
>  libavcodec/hapdec.c |  7 ++++++-
>  libavcodec/snappy.c | 24 +++++++++++++++++-------
>  libavcodec/snappy.h | 19 ++++++++++++++-----
>  3 files changed, 37 insertions(+), 13 deletions(-)
>
> diff --git a/libavcodec/hapdec.c b/libavcodec/hapdec.c
> index 324a43a..5733baf 100644
> --- a/libavcodec/hapdec.c
> +++ b/libavcodec/hapdec.c
> @@ -107,8 +107,13 @@ static int setup_texture(AVCodecContext *avctx, size_t 
> length)
>          compressorstr = "none";
>          break;
>      case HAP_COMP_SNAPPY:
> +        snappy_size = ff_snappy_peek_uncompressed_length(gbc);
> +        ret = av_reallocp(&ctx->snappied, snappy_size);
> +        if (ret < 0) {
> +            return ret;
> +        }
>          /* Uncompress the frame */
> -        ret = ff_snappy_uncompress(gbc, &ctx->snappied, &snappy_size);
> +        ret = ff_snappy_uncompress(gbc, ctx->snappied, &snappy_size);
>          if (ret < 0) {
>               av_log(avctx, AV_LOG_ERROR, "Snappy uncompress error\n");
>               return ret;
> diff --git a/libavcodec/snappy.c b/libavcodec/snappy.c
> index 13ef1ec..df6c6b3 100644
> --- a/libavcodec/snappy.c
> +++ b/libavcodec/snappy.c
> @@ -128,7 +128,17 @@ static int64_t decode_len(GetByteContext *gb)
>      return len;
>  }
>
> -int ff_snappy_uncompress(GetByteContext *gb, uint8_t **buf, int64_t *size)
> +int64_t ff_snappy_peek_uncompressed_length(GetByteContext *gb)
> +{
> +    int pos = bytestream2_get_bytes_left(gb);
> +    int64_t len = decode_len(gb);
> +
> +    bytestream2_seek(gb, -pos, SEEK_END);
> +
> +    return len;
> +}
> +
> +int ff_snappy_uncompress(GetByteContext *gb, uint8_t *buf, int64_t *size)
>  {
>      int64_t len = decode_len(gb);
>      int ret     = 0;
> @@ -137,11 +147,11 @@ int ff_snappy_uncompress(GetByteContext *gb, uint8_t 
> **buf, int64_t *size)
>      if (len < 0)
>          return len;
>
> -    if ((ret = av_reallocp(buf, len)) < 0)
> -        return AVERROR(ENOMEM);
> +    if (len > *size)
> +        return AVERROR_BUG;
>
>      *size = len;
> -    p     = *buf;
> +    p     = buf;
>
>      while (bytestream2_get_bytes_left(gb) > 0) {
>          uint8_t s = bytestream2_get_byte(gb);
> @@ -152,13 +162,13 @@ int ff_snappy_uncompress(GetByteContext *gb, uint8_t 
> **buf, int64_t *size)
>              ret = snappy_literal(gb, p, len, val);
>              break;
>          case SNAPPY_COPY_1:
> -            ret = snappy_copy1(gb, *buf, p, len, val);
> +            ret = snappy_copy1(gb, buf, p, len, val);
>              break;
>          case SNAPPY_COPY_2:
> -            ret = snappy_copy2(gb, *buf, p, len, val);
> +            ret = snappy_copy2(gb, buf, p, len, val);
>              break;
>          case SNAPPY_COPY_4:
> -            ret = snappy_copy4(gb, *buf, p, len, val);
> +            ret = snappy_copy4(gb, buf, p, len, val);
>              break;
>          }
>
> diff --git a/libavcodec/snappy.h b/libavcodec/snappy.h
> index 96666a8..8d365c0 100644
> --- a/libavcodec/snappy.h
> +++ b/libavcodec/snappy.h
> @@ -38,14 +38,23 @@
>  #include "bytestream.h"
>
>  /**
> - * Decompress an input buffer using Snappy algorithm. Caller is
> - * responsible of freeing the memory allocated in buf.
> + * Get the uncompressed length of an input buffer compressed using the Snappy
> + * algorithm. The GetByteContext is not advanced.
>   *
>   * @param gb    input GetByteContext.
> - * @param buf   output buffer pointer.
> - * @param size  output buffer size.
> + * @return      A positive length on success, AVERROR otherwise.
> + */
> + int64_t ff_snappy_peek_uncompressed_length(GetByteContext *gb);
> +
> +/**
> + * Decompress an input buffer using Snappy algorithm.
> + *
> + * @param gb    input GetByteContext.
> + * @param buf   input buffer pointer.
> + * @param size  input/output on input, the size of buffer, on output, the 
> size
> + *              of the uncompressed data.
>   * @return      0 if success, AVERROR otherwise.
>   */
> -int ff_snappy_uncompress(GetByteContext *gb, uint8_t **buf, int64_t *size);
> +int ff_snappy_uncompress(GetByteContext *gb, uint8_t *buf, int64_t *size);
>
>  #endif /* AVCODEC_SNAPPY_H */

This looks nice, let's wait for Luca if he's got any comments
-- 
Vittorio
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to