Message ID | 20240205151802.85193-1-post@frankplowman.com |
---|---|
State | New |
Headers | show |
Series | [FFmpeg-devel,v2] lavc/vvc: Validate alf_list indexes | expand |
Context | Check | Description |
---|---|---|
yinshiyou/make_loongarch64 | success | Make finished |
yinshiyou/make_fate_loongarch64 | success | Make fate finished |
andriy/make_x86 | success | Make finished |
andriy/make_fate_x86 | success | Make fate finished |
Applied. Thank you On Mon, Feb 5, 2024 at 11:18 PM <post@frankplowman.com> wrote: > From: Frank Plowman <post@frankplowman.com> > > Signed-off-by: Frank Plowman <post@frankplowman.com> > --- > libavcodec/vvc/vvc_ps.c | 37 +++++++++++++++++++++++++++++++++++++ > 1 file changed, 37 insertions(+) > > diff --git a/libavcodec/vvc/vvc_ps.c b/libavcodec/vvc/vvc_ps.c > index 4ef8f9f9b9..9c4a74fc9c 100644 > --- a/libavcodec/vvc/vvc_ps.c > +++ b/libavcodec/vvc/vvc_ps.c > @@ -1005,6 +1005,39 @@ int ff_vvc_decode_aps(VVCParamSets *ps, const > CodedBitstreamUnit *unit) > return ret; > } > > +static int sh_alf_aps(VVCSH *sh, const VVCFrameParamSets *fps) > +{ > + if (!sh->r->sh_alf_enabled_flag) > + return 0; > + > + for (int i = 0; i < sh->r->sh_num_alf_aps_ids_luma; i++) { > + const VVCALF * alf_aps_luma = > fps->alf_list[sh->r->sh_alf_aps_id_luma[i]]; > + if (!alf_aps_luma) > + return AVERROR_INVALIDDATA; > + } > + > + if (sh->r->sh_alf_cb_enabled_flag || sh->r->sh_alf_cr_enabled_flag) { > + const VVCALF* alf_aps_chroma = > fps->alf_list[sh->r->sh_alf_aps_id_chroma]; > + if (!alf_aps_chroma) > + return AVERROR_INVALIDDATA; > + } > + > + if (fps->sps->r->sps_ccalf_enabled_flag) { > + if (sh->r->sh_alf_cc_cb_enabled_flag) { > + const VVCALF *alf_aps_cc_cr = > fps->alf_list[sh->r->sh_alf_cc_cb_aps_id]; > + if (!alf_aps_cc_cr) > + return AVERROR_INVALIDDATA; > + } > + if (sh->r->sh_alf_cc_cr_enabled_flag) { > + const VVCALF *alf_aps_cc_cr = > fps->alf_list[sh->r->sh_alf_cc_cr_aps_id]; > + if (!alf_aps_cc_cr) > + return AVERROR_INVALIDDATA; > + } > + } > + > + return 0; > +} > + > static void sh_slice_address(VVCSH *sh, const H266RawSPS *sps, const > VVCPPS *pps) > { > const int slice_address = sh->r->sh_slice_address; > @@ -1123,8 +1156,12 @@ static int sh_derive(VVCSH *sh, const > VVCFrameParamSets *fps) > const H266RawSPS *sps = fps->sps->r; > const H266RawPPS *pps = fps->pps->r; > const H266RawPictureHeader *ph = fps->ph.r; > + int ret; > > sh_slice_address(sh, sps, fps->pps); > + ret = sh_alf_aps(sh, fps); > + if (ret < 0) > + return ret; > sh_inter(sh, sps, pps); > sh_qp_y(sh, pps, ph); > sh_deblock_offsets(sh); > -- > 2.43.0 > > _______________________________________________ > ffmpeg-devel mailing list > ffmpeg-devel@ffmpeg.org > https://ffmpeg.org/mailman/listinfo/ffmpeg-devel > > To unsubscribe, visit link above, or email > ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe". >
diff --git a/libavcodec/vvc/vvc_ps.c b/libavcodec/vvc/vvc_ps.c index 4ef8f9f9b9..9c4a74fc9c 100644 --- a/libavcodec/vvc/vvc_ps.c +++ b/libavcodec/vvc/vvc_ps.c @@ -1005,6 +1005,39 @@ int ff_vvc_decode_aps(VVCParamSets *ps, const CodedBitstreamUnit *unit) return ret; } +static int sh_alf_aps(VVCSH *sh, const VVCFrameParamSets *fps) +{ + if (!sh->r->sh_alf_enabled_flag) + return 0; + + for (int i = 0; i < sh->r->sh_num_alf_aps_ids_luma; i++) { + const VVCALF * alf_aps_luma = fps->alf_list[sh->r->sh_alf_aps_id_luma[i]]; + if (!alf_aps_luma) + return AVERROR_INVALIDDATA; + } + + if (sh->r->sh_alf_cb_enabled_flag || sh->r->sh_alf_cr_enabled_flag) { + const VVCALF* alf_aps_chroma = fps->alf_list[sh->r->sh_alf_aps_id_chroma]; + if (!alf_aps_chroma) + return AVERROR_INVALIDDATA; + } + + if (fps->sps->r->sps_ccalf_enabled_flag) { + if (sh->r->sh_alf_cc_cb_enabled_flag) { + const VVCALF *alf_aps_cc_cr = fps->alf_list[sh->r->sh_alf_cc_cb_aps_id]; + if (!alf_aps_cc_cr) + return AVERROR_INVALIDDATA; + } + if (sh->r->sh_alf_cc_cr_enabled_flag) { + const VVCALF *alf_aps_cc_cr = fps->alf_list[sh->r->sh_alf_cc_cr_aps_id]; + if (!alf_aps_cc_cr) + return AVERROR_INVALIDDATA; + } + } + + return 0; +} + static void sh_slice_address(VVCSH *sh, const H266RawSPS *sps, const VVCPPS *pps) { const int slice_address = sh->r->sh_slice_address; @@ -1123,8 +1156,12 @@ static int sh_derive(VVCSH *sh, const VVCFrameParamSets *fps) const H266RawSPS *sps = fps->sps->r; const H266RawPPS *pps = fps->pps->r; const H266RawPictureHeader *ph = fps->ph.r; + int ret; sh_slice_address(sh, sps, fps->pps); + ret = sh_alf_aps(sh, fps); + if (ret < 0) + return ret; sh_inter(sh, sps, pps); sh_qp_y(sh, pps, ph); sh_deblock_offsets(sh);