summaryrefslogtreecommitdiff
authorPeng 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)
commit9e41e3ceae4e852a89905da6e7070a2087261f13 (patch)
tree9a267a82f339e6138f85db7720d0792caaa99ac8
parent1e9dc7326a8cf1290030732b3a81c0c2cf7dfa7f (diff)
downloadmedia_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>
Diffstat
-rw-r--r--drivers/amvdec_ports/decoder/vdec_hevc_if.c2
-rw-r--r--drivers/frame_provider/decoder/h265/vh265.c13
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)