mirror of https://git.ffmpeg.org/ffmpeg.git
lavc/hevcdec: factor decoding a slice NALU out of decode_nal_unit()
This commit is contained in:
parent
90e75c4ec9
commit
edb6a471c4
|
@ -3065,10 +3065,60 @@ static int hevc_frame_end(HEVCContext *s)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int decode_slice(HEVCContext *s, const H2645NAL *nal, GetBitContext *gb)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = hls_slice_header(&s->sh, s, gb);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
if ((s->avctx->skip_frame >= AVDISCARD_BIDIR && s->sh.slice_type == HEVC_SLICE_B) ||
|
||||||
|
(s->avctx->skip_frame >= AVDISCARD_NONINTRA && s->sh.slice_type != HEVC_SLICE_I) ||
|
||||||
|
(s->avctx->skip_frame >= AVDISCARD_NONKEY && !IS_IRAP(s)) ||
|
||||||
|
((s->nal_unit_type == HEVC_NAL_RASL_R || s->nal_unit_type == HEVC_NAL_RASL_N) &&
|
||||||
|
s->no_rasl_output_flag)) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (s->sh.first_slice_in_pic_flag) {
|
||||||
|
if (s->cur_frame) {
|
||||||
|
av_log(s->avctx, AV_LOG_ERROR, "Two slices reporting being the first in the same frame.\n");
|
||||||
|
return AVERROR_INVALIDDATA;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = hevc_frame_start(s);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
} else if (!s->cur_frame) {
|
||||||
|
av_log(s->avctx, AV_LOG_ERROR, "First slice in a frame missing.\n");
|
||||||
|
return AVERROR_INVALIDDATA;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (s->nal_unit_type != s->first_nal_type) {
|
||||||
|
av_log(s->avctx, AV_LOG_ERROR,
|
||||||
|
"Non-matching NAL types of the VCL NALUs: %d %d\n",
|
||||||
|
s->first_nal_type, s->nal_unit_type);
|
||||||
|
return AVERROR_INVALIDDATA;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = decode_slice_data(s, nal, gb);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
if (ret >= s->cur_frame->ctb_count) {
|
||||||
|
ret = hevc_frame_end(s);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
s->is_decoded = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int decode_nal_unit(HEVCContext *s, const H2645NAL *nal)
|
static int decode_nal_unit(HEVCContext *s, const H2645NAL *nal)
|
||||||
{
|
{
|
||||||
GetBitContext gb = nal->gb;
|
GetBitContext gb = nal->gb;
|
||||||
int ctb_addr_ts, ret;
|
int ret;
|
||||||
|
|
||||||
s->nal_unit_type = nal->type;
|
s->nal_unit_type = nal->type;
|
||||||
s->temporal_id = nal->temporal_id;
|
s->temporal_id = nal->temporal_id;
|
||||||
|
@ -3124,52 +3174,9 @@ static int decode_nal_unit(HEVCContext *s, const H2645NAL *nal)
|
||||||
case HEVC_NAL_RADL_R:
|
case HEVC_NAL_RADL_R:
|
||||||
case HEVC_NAL_RASL_N:
|
case HEVC_NAL_RASL_N:
|
||||||
case HEVC_NAL_RASL_R:
|
case HEVC_NAL_RASL_R:
|
||||||
ret = hls_slice_header(&s->sh, s, &gb);
|
ret = decode_slice(s, nal, &gb);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
|
||||||
|
|
||||||
if ((s->avctx->skip_frame >= AVDISCARD_BIDIR && s->sh.slice_type == HEVC_SLICE_B) ||
|
|
||||||
(s->avctx->skip_frame >= AVDISCARD_NONINTRA && s->sh.slice_type != HEVC_SLICE_I) ||
|
|
||||||
(s->avctx->skip_frame >= AVDISCARD_NONKEY && !IS_IRAP(s)) ||
|
|
||||||
((s->nal_unit_type == HEVC_NAL_RASL_R || s->nal_unit_type == HEVC_NAL_RASL_N) &&
|
|
||||||
s->no_rasl_output_flag)) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (s->sh.first_slice_in_pic_flag) {
|
|
||||||
if (s->cur_frame) {
|
|
||||||
av_log(s->avctx, AV_LOG_ERROR, "Two slices reporting being the first in the same frame.\n");
|
|
||||||
ret = AVERROR_INVALIDDATA;
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = hevc_frame_start(s);
|
|
||||||
if (ret < 0)
|
|
||||||
return ret;
|
|
||||||
} else if (!s->cur_frame) {
|
|
||||||
av_log(s->avctx, AV_LOG_ERROR, "First slice in a frame missing.\n");
|
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
|
||||||
|
|
||||||
if (s->nal_unit_type != s->first_nal_type) {
|
|
||||||
av_log(s->avctx, AV_LOG_ERROR,
|
|
||||||
"Non-matching NAL types of the VCL NALUs: %d %d\n",
|
|
||||||
s->first_nal_type, s->nal_unit_type);
|
|
||||||
return AVERROR_INVALIDDATA;
|
|
||||||
}
|
|
||||||
|
|
||||||
ctb_addr_ts = decode_slice_data(s, nal, &gb);
|
|
||||||
if (ctb_addr_ts >= s->cur_frame->ctb_count) {
|
|
||||||
ret = hevc_frame_end(s);
|
|
||||||
if (ret < 0)
|
|
||||||
goto fail;
|
|
||||||
s->is_decoded = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ctb_addr_ts < 0) {
|
|
||||||
ret = ctb_addr_ts;
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case HEVC_NAL_EOS_NUT:
|
case HEVC_NAL_EOS_NUT:
|
||||||
case HEVC_NAL_EOB_NUT:
|
case HEVC_NAL_EOB_NUT:
|
||||||
|
|
Loading…
Reference in New Issue