When this function returns, the fragment is never reset, so current_frag->data_ref is never unref-ed, which ends up leaking it. We call ff_cbs_fragment_reset to release the reference on its buffer.
Unified · Split
| @@ -1679,8 +1679,6 @@ static int vp9_decode_frame(AVCodecContext *avctx, AVFrame *frame, · 1678 unmodified lines | |||
| 1679 | &s->s.frames[CUR_FRAME] : &s->s.ref_frames[i]); | 1679 | &s->s.frames[CUR_FRAME] : &s->s.ref_frames[i]); |
| 1680 | } | 1680 | } |
| 1681 | 1681 | ||
| 1682 | ff_cbs_fragment_reset(&s->current_frag); | ||
| 1683 | |||
| 1684 | goto finish; | 1682 | goto finish; |
| 1685 | } | 1683 | } |
| 1686 | 1684 | ||
| @@ -1805,6 +1803,8 @@ static int vp9_decode_frame(AVCodecContext *avctx, AVFrame *frame, · 118 unmodified lines | |||
| 1805 | } | 1803 | } |
| 1806 | 1804 | ||
| 1807 | finish: | 1805 | finish: |
| 1806 | ff_cbs_fragment_reset(&s->current_frag); | ||
| 1807 | |||
| 1808 | ff_progress_frame_report(&s->s.frames[CUR_FRAME].tf, INT_MAX); | 1808 | ff_progress_frame_report(&s->s.frames[CUR_FRAME].tf, INT_MAX); |
| 1809 | // ref frame setup | 1809 | // ref frame setup |
| 1810 | for (int i = 0; i < 8; i++) | 1810 | for (int i = 0; i < 8; i++) |