author | Peng Yixin <yixin.peng@amlogic.com> | 2020-03-03 02:12:15 (GMT) |
---|---|---|
committer | Hui Zhang <hui.zhang@amlogic.com> | 2020-03-13 09:02:07 (GMT) |
commit | 9e41e3ceae4e852a89905da6e7070a2087261f13 (patch) | |
tree | 9a267a82f339e6138f85db7720d0792caaa99ac8 | |
parent | 1e9dc7326a8cf1290030732b3a81c0c2cf7dfa7f (diff) | |
download | media_modules-9e41e3ceae4e852a89905da6e7070a2087261f13.zip media_modules-9e41e3ceae4e852a89905da6e7070a2087261f13.tar.gz media_modules-9e41e3ceae4e852a89905da6e7070a2087261f13.tar.bz2 |
media_modules: H265 seek operation crash [1/1]
PD#SWPL-21997
Problem:
H265 video file seek operation crash.
1.Memory freed is still being used
2.The number of buffers calculated by the
decoder driver and v4l2 is inconsistent.
Solution:
1.Free memory correctly
2.The number of buffers calculated by the
decoder driver and v4l2 stay the same.
Verify:
AC214
Change-Id: Idaee66c8a4e0dbf63d493555e224b15c131dcb64
Signed-off-by: Peng Yixin <yixin.peng@amlogic.com>
-rw-r--r-- | drivers/amvdec_ports/decoder/vdec_hevc_if.c | 2 | ||||
-rw-r--r-- | drivers/frame_provider/decoder/h265/vh265.c | 13 |
2 files changed, 11 insertions, 4 deletions
diff --git a/drivers/amvdec_ports/decoder/vdec_hevc_if.c b/drivers/amvdec_ports/decoder/vdec_hevc_if.c index 19bb2a8..4d2649c 100644 --- a/drivers/amvdec_ports/decoder/vdec_hevc_if.c +++ b/drivers/amvdec_ports/decoder/vdec_hevc_if.c @@ -292,7 +292,7 @@ static int refer_buffer_num(struct h265_SPS_t *sps) used_buf_num = sps->temporal_layer[0].num_reorder_pics; sps_pic_buf_diff = sps->temporal_layer[0].max_dec_pic_buffering - - sps->temporal_layer[0].num_reorder_pics + 1; + sps->temporal_layer[0].num_reorder_pics - 1; if (sps_pic_buf_diff >= 4) used_buf_num += 1; diff --git a/drivers/frame_provider/decoder/h265/vh265.c b/drivers/frame_provider/decoder/h265/vh265.c index 154fbf0..ebaf5b8 100644 --- a/drivers/frame_provider/decoder/h265/vh265.c +++ b/drivers/frame_provider/decoder/h265/vh265.c @@ -7546,9 +7546,6 @@ static void hevc_local_uninit(struct hevc_state_s *hevc) } //pr_err("[%s line %d] hevc->gvs=0x%p operation\n",__func__, __LINE__, hevc->gvs); - if (hevc->gvs) - kfree(hevc->gvs); - hevc->gvs = NULL; } static int hevc_local_init(struct hevc_state_s *hevc) @@ -11817,6 +11814,10 @@ static int vmh265_stop(struct hevc_state_s *hevc) hevc_local_uninit(hevc); + if (hevc->gvs) + kfree(hevc->gvs); + hevc->gvs = NULL; + if (use_cma) { hevc->uninit_list = 1; reset_process_time(hevc); @@ -12859,6 +12860,9 @@ static int amvdec_h265_probe(struct platform_device *pdev) hevc_print(hevc, 0, "\namvdec_h265 init failed.\n"); hevc_local_uninit(hevc); + if (hevc->gvs) + kfree(hevc->gvs); + hevc->gvs = NULL; uninit_mmu_buffers(hevc); vfree(hevc); pdata->dec_status = NULL; @@ -13307,6 +13311,9 @@ static int ammvdec_h265_probe(struct platform_device *pdev) hevc_print(hevc, 0, "\namvdec_h265 init failed.\n"); hevc_local_uninit(hevc); + if (hevc->gvs) + kfree(hevc->gvs); + hevc->gvs = NULL; uninit_mmu_buffers(hevc); /* devm_kfree(&pdev->dev, (void *)hevc); */ if (hevc) |