summaryrefslogtreecommitdiff
authorRong Zhang <rong.zhang@amlogic.com>2019-01-23 05:48:05 (GMT)
committer Luan Yuan <luan.yuan@amlogic.com>2019-01-25 11:39:07 (GMT)
commit3aee14ddbb88f8f2ac62375a92c54ed75b695609 (patch)
tree22c34bcee845ecc3b7d694af1abef5f5764a436c
parent355b5ee7c759921f983b603a175d1623186a1f67 (diff)
downloadmedia_modules-3aee14ddbb88f8f2ac62375a92c54ed75b695609.zip
media_modules-3aee14ddbb88f8f2ac62375a92c54ed75b695609.tar.gz
media_modules-3aee14ddbb88f8f2ac62375a92c54ed75b695609.tar.bz2
media_module: h265 [1/1]
PD#SWPL-3926 Problem: parse metadata error while playing some dovi files Solution: Whether the aux data is avaible or not should be checked before reading it. Verify: Verified U212 Change-Id: I4be646ea1506497f7951ae6c0be1bb55c99d7e60 Signed-off-by: Rong Zhang <rong.zhang@amlogic.com>
Diffstat
-rw-r--r--drivers/frame_provider/decoder/h265/vh265.c29
1 files changed, 20 insertions, 9 deletions
diff --git a/drivers/frame_provider/decoder/h265/vh265.c b/drivers/frame_provider/decoder/h265/vh265.c
index c51c010..48cf1e4 100644
--- a/drivers/frame_provider/decoder/h265/vh265.c
+++ b/drivers/frame_provider/decoder/h265/vh265.c
@@ -4104,13 +4104,24 @@ static void config_title_hw(struct hevc_state_s *hevc, int sao_vb_size,
WRITE_VREG(HEVC_SAO_VB, hevc->work_space_buf->sao_vb.buf_start);
}
+static u32 init_aux_size;
+static int aux_data_is_avaible(struct hevc_state_s *hevc)
+{
+ u32 reg_val;
+
+ reg_val = READ_VREG(HEVC_AUX_DATA_SIZE);
+ if (reg_val != 0 && reg_val != init_aux_size)
+ return 1;
+ else
+ return 0;
+}
+
static void config_aux_buf(struct hevc_state_s *hevc)
{
WRITE_VREG(HEVC_AUX_ADR, hevc->aux_phy_addr);
- WRITE_VREG(HEVC_AUX_DATA_SIZE,
- ((hevc->prefix_aux_size >> 4) << 16) |
- (hevc->suffix_aux_size >> 4)
- );
+ init_aux_size = ((hevc->prefix_aux_size >> 4) << 16) |
+ (hevc->suffix_aux_size >> 4);
+ WRITE_VREG(HEVC_AUX_DATA_SIZE, init_aux_size);
}
static void config_mpred_hw(struct hevc_state_s *hevc)
@@ -4920,7 +4931,7 @@ static void set_aux_data(struct hevc_state_s *hevc,
READ_VREG(HEVC_AUX_DATA_SIZE);
unsigned int aux_count = 0;
int aux_size = 0;
- if (pic == NULL)
+ if (pic == NULL || 0 == aux_data_is_avaible(hevc))
return;
if (hevc->aux_data_dirty ||
@@ -8239,7 +8250,7 @@ pic_done:
hevc->dec_result = DEC_RESULT_DONE;
amhevc_stop();
reset_process_time(hevc);
- if (READ_VREG(HEVC_AUX_DATA_SIZE) != 0)
+ if (aux_data_is_avaible(hevc))
dolby_get_meta(hevc);
vdec_schedule_work(&hevc->work);
@@ -8285,7 +8296,7 @@ pic_done:
hevc_print(hevc, 0, "get NAL_UNIT_EOS, flush output\n");
#ifdef CONFIG_AMLOGIC_MEDIA_ENHANCEMENT_DOLBYVISION
if ((vdec->master || vdec->slave) &&
- READ_VREG(HEVC_AUX_DATA_SIZE) != 0) {
+ aux_data_is_avaible(hevc)) {
if (hevc->decoding_pic)
dolby_get_meta(hevc);
}
@@ -8518,7 +8529,7 @@ pic_done:
vdec->master == NULL &&
vdec->slave == NULL &&
#endif
- READ_VREG(HEVC_AUX_DATA_SIZE) != 0
+ aux_data_is_avaible(hevc)
) {
dma_sync_single_for_cpu(
amports_get_dma_device(),
@@ -10173,7 +10184,7 @@ static void vh265_work(struct work_struct *work)
hevc->eos = 1;
#ifdef CONFIG_AMLOGIC_MEDIA_ENHANCEMENT_DOLBYVISION
if ((vdec->master || vdec->slave) &&
- READ_VREG(HEVC_AUX_DATA_SIZE) != 0)
+ aux_data_is_avaible(hevc))
dolby_get_meta(hevc);
#endif
check_pic_decoded_error(hevc,