On 2016-03-21 15:00:21 +0100, Anton Khirnov wrote:
> This is required by h264.
> ---
>  libavcodec/h2645_parse.c | 38 +++++++++++++++++++++++++++++++++++---
>  libavcodec/h2645_parse.h |  6 ++++++
>  2 files changed, 41 insertions(+), 3 deletions(-)
> 
> diff --git a/libavcodec/h2645_parse.c b/libavcodec/h2645_parse.c
> index 6be79ac..88eb78a 100644
> --- a/libavcodec/h2645_parse.c
> +++ b/libavcodec/h2645_parse.c
> @@ -22,13 +22,12 @@
>  
>  #include "config.h"
>  
> +#include "libavutil/intmath.h"
>  #include "libavutil/intreadwrite.h"
>  #include "libavutil/mem.h"
>  
>  #include "h2645_parse.h"
>  
> -/* FIXME: This is adapted from ff_h264_decode_nal, avoiding duplication
> - * between these functions would be nice. */
>  int ff_h2645_extract_rbsp(const uint8_t *src, int length,
>                            H2645NAL *nal)
>  {
> @@ -128,6 +127,30 @@ nsc:
>      return si;
>  }
>  
> +static int get_bit_length(H2645NAL *nal, int skip_padding_zeros)
> +{
> +    int size = nal->size;
> +    int v;
> +
> +    while (skip_padding_zeros && size > 0 && nal->data[size - 1] == 0)
> +        size--;
> +
> +    if (!size)
> +        return 0;
> +
> +    v = nal->data[size - 1];
> +
> +    if (size > INT_MAX / 8)
> +        return AVERROR(ERANGE);
> +    size *= 8;
> +
> +    /* remove the stop bit and following trailing zeros */

maybe add "or nothing for damaged bitstreams". the 'if (v)' is a little 
too tricky for my taste. It also limits the av_ctz() to 8.

> +    if (v)
> +        size -= av_ctz(v) + 1;
> +
> +    return size;
> +}
> +
>  /**
>   * @return AVERROR_INVALIDDATA if the packet is not a valid NAL unit,
>   * 0 if the unit should be skipped, 1 otherwise
> @@ -181,6 +204,7 @@ int ff_h2645_packet_split(H2645Packet *pkt, const uint8_t 
> *buf, int length,
>      while (length >= 4) {
>          H2645NAL *nal;
>          int extract_length = 0;
> +        int skip_trailing_zeros = 1;

is there a reason to use two different names for the same thing?

>  
>          if (is_nalff) {
>              int i;
> @@ -224,7 +248,15 @@ int ff_h2645_packet_split(H2645Packet *pkt, const 
> uint8_t *buf, int length,
>          if (consumed < 0)
>              return consumed;
>  
> -        ret = init_get_bits8(&nal->gb, nal->data, nal->size);
> +        /* see commit 3566042a0 */
> +        if (consumed < length - 3 &&
> +            buf[consumed]     == 0x00 && buf[consumed + 1] == 0x00 &&
> +            buf[consumed + 2] == 0x01 && buf[consumed + 3] == 0xE0)
> +            skip_trailing_zeros = 0;
> +
> +        nal->size_bits = get_bit_length(nal, skip_trailing_zeros);
> +
> +        ret = init_get_bits(&nal->gb, nal->data, nal->size_bits);
>          if (ret < 0)
>              return ret;
>  
> diff --git a/libavcodec/h2645_parse.h b/libavcodec/h2645_parse.h
> index 148ccf3..651cf26 100644
> --- a/libavcodec/h2645_parse.h
> +++ b/libavcodec/h2645_parse.h
> @@ -33,6 +33,12 @@ typedef struct H2645NAL {
>      int size;
>      const uint8_t *data;
>  
> +    /**
> +     * Size, in bits, of just the data, excluding the stop bit and any 
> trailing
> +     * padding. I.e. what HEVC calls SODB.
> +     */
> +    int size_bits;
> +
>      int raw_size;
>      const uint8_t *raw_data;
>  

Janne
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to