On 2016-03-21 15:00:20 +0100, Anton Khirnov wrote:
> ---
>  libavcodec/h2645_parse.c | 22 ++++++++++++++++++++--
>  libavcodec/h2645_parse.h | 15 ++++++++++++++-
>  libavcodec/hevc.c        |  2 +-
>  libavcodec/hevc_parser.c |  3 ++-
>  4 files changed, 37 insertions(+), 5 deletions(-)
> 
> diff --git a/libavcodec/h2645_parse.c b/libavcodec/h2645_parse.c
> index 57a78e9..6be79ac 100644
> --- a/libavcodec/h2645_parse.c
> +++ b/libavcodec/h2645_parse.c
> @@ -154,9 +154,26 @@ static int hevc_parse_nal_header(H2645NAL *nal, void 
> *logctx)
>      return nuh_layer_id == 0;
>  }
>  
> +static int h264_parse_nal_header(H2645NAL *nal, void *logctx)
> +{
> +    GetBitContext *gb = &nal->gb;
> +
> +    if (get_bits1(gb) != 0)
> +        return AVERROR_INVALIDDATA;
> +
> +    nal->ref_idc = get_bits(gb, 2);
> +    nal->type    = get_bits(gb, 5);
> +
> +    av_log(logctx, AV_LOG_DEBUG,
> +           "nal_unit_type: %d, nal_ref_idc: %d\n",
> +           nal->type, nal->ref_idc);
> +
> +    return 1;
> +}
>  
>  int ff_h2645_packet_split(H2645Packet *pkt, const uint8_t *buf, int length,
> -                          void *logctx, int is_nalff, int nal_length_size)
> +                          void *logctx, int is_nalff, int nal_length_size,
> +                          enum AVCodecID codec_id)
>  {
>      int consumed, ret = 0;
>  
> @@ -211,7 +228,8 @@ int ff_h2645_packet_split(H2645Packet *pkt, const uint8_t 
> *buf, int length,
>          if (ret < 0)
>              return ret;
>  
> -        ret = hevc_parse_nal_header(nal, logctx);
> +        ret = (codec_id == AV_CODEC_ID_HEVC) ? hevc_parse_nal_header(nal, 
> logctx) :
> +                                               h264_parse_nal_header(nal, 
> logctx);

if/else if/else or switch with an error for codec_ids != h264/h265 would 
be nicer

>          if (ret <= 0) {
>              if (ret < 0) {
>                  av_log(logctx, AV_LOG_ERROR, "Invalid NAL unit %d, 
> skipping.\n",
> diff --git a/libavcodec/h2645_parse.h b/libavcodec/h2645_parse.h
> index db98007..148ccf3 100644
> --- a/libavcodec/h2645_parse.h
> +++ b/libavcodec/h2645_parse.h
> @@ -38,8 +38,20 @@ typedef struct H2645NAL {
>  
>      GetBitContext gb;
>  
> +    /**
> +     * NAL unit type
> +     */
>      int type;
> +
> +    /**
> +     * HEVC only, nuh_temporal_id_plus_1 - 1
> +     */
>      int temporal_id;
> +
> +    /**
> +     * H264 only, nal_ref_idc
> +     */
> +    int ref_idc;
>  } H2645NAL;
>  
>  /* an input packet split into unescaped NAL units */
> @@ -59,7 +71,8 @@ int ff_h2645_extract_rbsp(const uint8_t *src, int length,
>   * Split an input packet into NAL units.
>   */
>  int ff_h2645_packet_split(H2645Packet *pkt, const uint8_t *buf, int length,
> -                          void *logctx, int is_nalff, int nal_length_size);
> +                          void *logctx, int is_nalff, int nal_length_size,
> +                          enum AVCodecID codec_id);
>  
>  /**
>   * Free all the allocated memory in the packet.
> diff --git a/libavcodec/hevc.c b/libavcodec/hevc.c
> index 72dea5a..3bc730a 100644
> --- a/libavcodec/hevc.c
> +++ b/libavcodec/hevc.c
> @@ -2582,7 +2582,7 @@ static int decode_nal_units(HEVCContext *s, const 
> uint8_t *buf, int length)
>      /* split the input packet into NAL units, so we know the upper bound on 
> the
>       * number of slices in the frame */
>      ret = ff_h2645_packet_split(&s->pkt, buf, length, s->avctx, s->is_nalff,
> -                                s->nal_length_size);
> +                                s->nal_length_size, s->avctx->codec_id);
>      if (ret < 0) {
>          av_log(s->avctx, AV_LOG_ERROR,
>                 "Error splitting the input into NAL units.\n");
> diff --git a/libavcodec/hevc_parser.c b/libavcodec/hevc_parser.c
> index 5c1fbc3..dc5fffc 100644
> --- a/libavcodec/hevc_parser.c
> +++ b/libavcodec/hevc_parser.c
> @@ -82,7 +82,8 @@ static int parse_nal_units(AVCodecParserContext *s, const 
> uint8_t *buf,
>      HEVCParserContext *ctx = s->priv_data;
>      int ret, i;
>  
> -    ret = ff_h2645_packet_split(&ctx->pkt, buf, buf_size, avctx, 0, 0);
> +    ret = ff_h2645_packet_split(&ctx->pkt, buf, buf_size, avctx, 0, 0,
> +                                AV_CODEC_ID_HEVC);
>      if (ret < 0)
>          return ret;

ok otherwise

Janne

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

Reply via email to