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