|
|
|
@@ -193,11 +193,8 @@ static inline int parse_nal_units(AVCodecParserContext *s, const uint8_t *buf, |
|
|
|
SliceHeader *sh = &h->sh; |
|
|
|
HEVCParamSets *ps = &h->ps; |
|
|
|
HEVCSEIContext *sei = &h->sei; |
|
|
|
H2645Packet *pkt = &ctx->pkt; |
|
|
|
const uint8_t *buf_end = buf + buf_size; |
|
|
|
int state = -1, i; |
|
|
|
H2645NAL *nal; |
|
|
|
int is_global = buf == avctx->extradata; |
|
|
|
int i, ret; |
|
|
|
|
|
|
|
if (!h->HEVClc) |
|
|
|
h->HEVClc = av_mallocz(sizeof(HEVCLocalContext)); |
|
|
|
@@ -215,44 +212,18 @@ static inline int parse_nal_units(AVCodecParserContext *s, const uint8_t *buf, |
|
|
|
|
|
|
|
ff_hevc_reset_sei(sei); |
|
|
|
|
|
|
|
if (!buf_size) |
|
|
|
return 0; |
|
|
|
|
|
|
|
if (pkt->nals_allocated < 1) { |
|
|
|
H2645NAL *tmp = av_realloc_array(pkt->nals, 1, sizeof(*tmp)); |
|
|
|
if (!tmp) |
|
|
|
return AVERROR(ENOMEM); |
|
|
|
pkt->nals = tmp; |
|
|
|
memset(pkt->nals, 0, sizeof(*tmp)); |
|
|
|
pkt->nals_allocated = 1; |
|
|
|
} |
|
|
|
|
|
|
|
nal = &pkt->nals[0]; |
|
|
|
ret = ff_h2645_packet_split(&ctx->pkt, buf, buf_size, avctx, 0, 0, |
|
|
|
AV_CODEC_ID_HEVC, 1); |
|
|
|
if (ret < 0) |
|
|
|
return ret; |
|
|
|
|
|
|
|
for (;;) { |
|
|
|
int src_length, consumed; |
|
|
|
int ret; |
|
|
|
for (i = 0; i < ctx->pkt.nb_nals; i++) { |
|
|
|
H2645NAL *nal = &ctx->pkt.nals[i]; |
|
|
|
int num = 0, den = 0; |
|
|
|
buf = avpriv_find_start_code(buf, buf_end, &state); |
|
|
|
if (--buf + 2 >= buf_end) |
|
|
|
break; |
|
|
|
src_length = buf_end - buf; |
|
|
|
|
|
|
|
h->nal_unit_type = (*buf >> 1) & 0x3f; |
|
|
|
h->temporal_id = (*(buf + 1) & 0x07) - 1; |
|
|
|
if (h->nal_unit_type <= HEVC_NAL_CRA_NUT) { |
|
|
|
// Do not walk the whole buffer just to decode slice segment header |
|
|
|
if (src_length > 20) |
|
|
|
src_length = 20; |
|
|
|
} |
|
|
|
|
|
|
|
consumed = ff_h2645_extract_rbsp(buf, src_length, nal, 1); |
|
|
|
if (consumed < 0) |
|
|
|
return consumed; |
|
|
|
|
|
|
|
ret = init_get_bits8(gb, nal->data + 2, nal->size); |
|
|
|
if (ret < 0) |
|
|
|
return ret; |
|
|
|
h->nal_unit_type = nal->type; |
|
|
|
h->temporal_id = nal->temporal_id; |
|
|
|
*gb = nal->gb; |
|
|
|
|
|
|
|
switch (h->nal_unit_type) { |
|
|
|
case HEVC_NAL_VPS: |
|
|
|
@@ -395,7 +366,6 @@ static inline int parse_nal_units(AVCodecParserContext *s, const uint8_t *buf, |
|
|
|
|
|
|
|
return 0; /* no need to evaluate the rest */ |
|
|
|
} |
|
|
|
buf += consumed; |
|
|
|
} |
|
|
|
/* didn't find a picture! */ |
|
|
|
if (!is_global) |
|
|
|
|