avsX: CB2 report sar and dar information. [1/1]

PD#SWPL-193942

Problem:
Need report avsX sar and dar information.

Solution:
Report avsX sar and dar information.

Verify:
S905X4

Change-Id: I6e0d4fcaca6ea686be14a9cecb5e22654aec9367
Signed-off-by: yuna.liu <yuna.liu@amlogic.com>
diff --git a/drivers/frame_provider/decoder_v4l/avs2/vavs2.c b/drivers/frame_provider/decoder_v4l/avs2/vavs2.c
index 346c084..450991a 100644
--- a/drivers/frame_provider/decoder_v4l/avs2/vavs2.c
+++ b/drivers/frame_provider/decoder_v4l/avs2/vavs2.c
@@ -854,6 +854,7 @@
 	u32 lcu_percentage_threshold;
 	struct completion complete;
 	struct mmu_copy mmu_copy_array[BUF_FBC_NUM_MAX];
+	u32 last_dur;
 };
 
 static int  compute_losless_comp_body_size(
@@ -861,6 +862,7 @@
 		bool is_bit_depth_10);
 
 static void put_un_used_mv_bufs(struct AVS2Decoder_s *dec);
+static void v4l_avs2_collect_stream_info(struct vdec_s * vdec,	struct AVS2Decoder_s *dec);
 
 static int avs2_debug(struct AVS2Decoder_s *dec,
 	int flag, const char *fmt, ...)
@@ -4502,6 +4504,14 @@
 	vf->duration = vf_dur ? vf_dur : dec->frame_dur;
 	vf->duration_pulldown = 0;
 	vf->flag = 0;
+
+	if (dec->last_dur != dec->frame_dur) {
+		avs2_print(dec, 0,
+			"decoder duration change old: %d new: %d\n", dec->last_dur, dec->frame_dur);
+		dec->last_dur = dec->frame_dur;
+		v4l_avs2_collect_stream_info(hw_to_vdec(dec), dec);
+	}
+
 	vf->prop.master_display_colour = dec->vf_dp;
 	if (dec->hdr_flag & HDR_CUVA_MASK)
 		dec->video_signal_type |= 1 << 31;
@@ -5971,14 +5981,44 @@
 	str_info->error_handle_policy = error_handle_policy;
 	str_info->bit_depth = 8;
 	str_info->fence_enable = 0;
-	str_info->ratio_size.sar_width = -1;
-	str_info->ratio_size.sar_height = -1;
-	str_info->ratio_size.dar_width = -1;
-	str_info->ratio_size.dar_height = -1;
+
+	if (dec->avs2_dec.param.p.aspect_ratio_information == 0) {
+		str_info->ratio_size.dar_width = -1;
+		str_info->ratio_size.dar_height = -1;
+		str_info->ratio_size.sar_width = -1;
+		str_info->ratio_size.sar_height = -1;
+	} else {
+		str_info->ratio_size.sar_width = -1;
+		str_info->ratio_size.sar_height = -1;
+		switch (dec->avs2_dec.param.p.aspect_ratio_information) {
+		case 1:
+			str_info->ratio_size.dar_width = -1;
+			str_info->ratio_size.dar_height = -1;
+			str_info->ratio_size.sar_width = 1;
+			str_info->ratio_size.sar_height = 1;
+			break;
+		case 2:
+			str_info->ratio_size.dar_width = 4;
+			str_info->ratio_size.dar_height = 3;
+			break;
+		case 3:
+			str_info->ratio_size.dar_width = 16;
+			str_info->ratio_size.dar_height = 9;
+			break;
+		case 4:
+			str_info->ratio_size.dar_width = 221;
+			str_info->ratio_size.dar_height = 100;
+			break;
+		default:
+			break;
+		}
+	}
+
 	str_info->trick_mode = dec->i_only;
-	if (dec->frame_dur != 0)
-		str_info->frame_rate = ((96000 * 10 / dec->frame_dur) % 10) < 5 ?
-				96000 / dec->frame_dur : (96000 / dec->frame_dur +1);
+	str_info->frame_dur = dec->last_dur;
+	if (str_info->frame_dur != 0)
+		str_info->frame_rate = ((96000 * 10 / str_info->frame_dur) % 10) < 5 ?
+				96000 / str_info->frame_dur : (96000 / str_info->frame_dur +1);
 	else
 		str_info->frame_rate = -1;
 	ctx->dec_intf.decinfo_event_report(ctx, AML_DECINFO_EVENT_STREAM, NULL);
diff --git a/drivers/frame_provider/decoder_v4l/avs2_fb/vavs2_fb_v4l.c b/drivers/frame_provider/decoder_v4l/avs2_fb/vavs2_fb_v4l.c
index 9623cc7..18fa014 100644
--- a/drivers/frame_provider/decoder_v4l/avs2_fb/vavs2_fb_v4l.c
+++ b/drivers/frame_provider/decoder_v4l/avs2_fb/vavs2_fb_v4l.c
@@ -966,6 +966,7 @@
 	u32 lcu_percentage_threshold;
 	struct completion complete;
 	struct mmu_copy mmu_copy_array[BUF_FBC_NUM_MAX];
+	u32 last_dur;
 };
 
 static int  compute_losless_comp_body_size(
@@ -976,6 +977,7 @@
 	int w, int h, int bit_depth_10);
 
 static void put_un_used_mv_bufs(struct AVS2Decoder_s *dec);
+static void v4l_avs2_collect_stream_info(struct vdec_s * vdec,	struct AVS2Decoder_s *dec);
 
 static int avs2_debug(struct AVS2Decoder_s *dec,
 	int flag, const char *fmt, ...)
@@ -4916,6 +4918,14 @@
 	vf->duration = vf_dur ? vf_dur : dec->frame_dur;
 	vf->duration_pulldown = 0;
 	vf->flag = 0;
+
+	if (dec->last_dur != dec->frame_dur) {
+		avs2_print(dec, 0,
+			"decoder duration change old: %d new: %d\n", dec->last_dur, dec->frame_dur);
+		dec->last_dur = dec->frame_dur;
+		v4l_avs2_collect_stream_info(hw_to_vdec(dec), dec);
+	}
+
 	vf->prop.master_display_colour = dec->vf_dp;
 	if (dec->hdr_flag & HDR_CUVA_MASK)
 		dec->video_signal_type |= 1 << 31;
@@ -6501,14 +6511,44 @@
 	str_info->error_handle_policy = error_handle_policy;
 	str_info->bit_depth = 8;
 	str_info->fence_enable = 0;
-	str_info->ratio_size.sar_width = -1;
-	str_info->ratio_size.sar_height = -1;
-	str_info->ratio_size.dar_width = -1;
-	str_info->ratio_size.dar_height = -1;
+
+	if (dec->avs2_dec.param.p.aspect_ratio_information == 0) {
+		str_info->ratio_size.dar_width = -1;
+		str_info->ratio_size.dar_height = -1;
+		str_info->ratio_size.sar_width = -1;
+		str_info->ratio_size.sar_height = -1;
+	} else {
+		str_info->ratio_size.sar_width = -1;
+		str_info->ratio_size.sar_height = -1;
+		switch (dec->avs2_dec.param.p.aspect_ratio_information) {
+		case 1:
+			str_info->ratio_size.dar_width = -1;
+			str_info->ratio_size.dar_height = -1;
+			str_info->ratio_size.sar_width = 1;
+			str_info->ratio_size.sar_height = 1;
+			break;
+		case 2:
+			str_info->ratio_size.dar_width = 4;
+			str_info->ratio_size.dar_height = 3;
+			break;
+		case 3:
+			str_info->ratio_size.dar_width = 16;
+			str_info->ratio_size.dar_height = 9;
+			break;
+		case 4:
+			str_info->ratio_size.dar_width = 221;
+			str_info->ratio_size.dar_height = 100;
+			break;
+		default:
+			break;
+		}
+	}
+
 	str_info->trick_mode = dec->i_only;
-	if (dec->frame_dur != 0)
-		str_info->frame_rate = ((96000 * 10 / dec->frame_dur) % 10) < 5 ?
-				96000 / dec->frame_dur : (96000 / dec->frame_dur +1);
+	str_info->frame_dur = dec->last_dur;
+	if (str_info->frame_dur != 0)
+		str_info->frame_rate = ((96000 * 10 / str_info->frame_dur) % 10) < 5 ?
+				96000 / str_info->frame_dur : (96000 / str_info->frame_dur +1);
 	else
 		str_info->frame_rate = -1;
 	ctx->dec_intf.decinfo_event_report(ctx, AML_DECINFO_EVENT_STREAM, NULL);
diff --git a/drivers/frame_provider/decoder_v4l/avs3/vavs3.c b/drivers/frame_provider/decoder_v4l/avs3/vavs3.c
index 034377c..bcc9583 100644
--- a/drivers/frame_provider/decoder_v4l/avs3/vavs3.c
+++ b/drivers/frame_provider/decoder_v4l/avs3/vavs3.c
@@ -992,6 +992,7 @@
 	u32 lcu_percentage_threshold;
 	struct completion complete;
 	struct mmu_copy mmu_copy_array[BUF_FBC_NUM_MAX];
+	u32 last_dur;
 };
 
 static int  compute_losless_comp_body_size(
@@ -1002,6 +1003,7 @@
 	int pic_width, int pic_height, int is_bit_depth_10);
 
 static void avs3_work_implement(struct AVS3Decoder_s *dec);
+static void v4l_avs3_collect_stream_info(struct vdec_s *vdec,	struct AVS3Decoder_s *dec);
 
 #undef pr_info
 #define pr_info printk
@@ -5106,6 +5108,14 @@
 	vf->duration = vf_dur ? vf_dur : dec->frame_dur;
 	vf->duration_pulldown = 0;
 	vf->flag = 0;
+
+	if (dec->last_dur != dec->frame_dur) {
+		avs3_print(dec, 0,
+			"decoder duration change old: %d new: %d\n", dec->last_dur, dec->frame_dur);
+		dec->last_dur = dec->frame_dur;
+		v4l_avs3_collect_stream_info(hw_to_vdec(dec), dec);
+	}
+
 	vf->prop.master_display_colour = dec->vf_dp;
 	if (dec->hdr_flag & HDR_CUVA_MASK)
 		dec->video_signal_type |= 1 << 31;
@@ -7185,14 +7195,44 @@
 	str_info->error_handle_policy = dec->error_handle_policy;
 	str_info->bit_depth = 8;
 	str_info->fence_enable = 0;
-	str_info->ratio_size.sar_width = -1;
-	str_info->ratio_size.sar_height = -1;
-	str_info->ratio_size.dar_width = -1;
-	str_info->ratio_size.dar_height = -1;
+
+
+	if (dec->avs3_dec.param.p.sqh_aspect_ratio == 0) {
+		str_info->ratio_size.dar_width = -1;
+		str_info->ratio_size.dar_height = -1;
+		str_info->ratio_size.sar_width = -1;
+		str_info->ratio_size.sar_height = -1;
+	} else {
+		str_info->ratio_size.sar_width = -1;
+		str_info->ratio_size.sar_height = -1;
+		switch (dec->avs3_dec.param.p.sqh_aspect_ratio) {
+		case 1:
+			str_info->ratio_size.dar_width = -1;
+			str_info->ratio_size.dar_height = -1;
+			str_info->ratio_size.sar_width = 1;
+			str_info->ratio_size.sar_height = 1;
+			break;
+		case 2:
+			str_info->ratio_size.dar_width = 4;
+			str_info->ratio_size.dar_height = 3;
+			break;
+		case 3:
+			str_info->ratio_size.dar_width = 16;
+			str_info->ratio_size.dar_height = 9;
+			break;
+		case 4:
+			str_info->ratio_size.dar_width = 221;
+			str_info->ratio_size.dar_height = 100;
+			break;
+		default:
+			break;
+		}
+	}
 	str_info->trick_mode = dec->i_only;
-	if (dec->frame_dur != 0)
-		str_info->frame_rate = ((96000 * 10 / dec->frame_dur) % 10) < 5 ?
-				96000 / dec->frame_dur : (96000 / dec->frame_dur +1);
+	str_info->frame_dur = dec->last_dur;
+	if (str_info->frame_dur != 0)
+		str_info->frame_rate = ((96000 * 10 / str_info->frame_dur) % 10) < 5 ?
+				96000 / str_info->frame_dur : (96000 / str_info->frame_dur +1);
 	else
 		str_info->frame_rate = -1;
 	ctx->dec_intf.decinfo_event_report(ctx, AML_DECINFO_EVENT_STREAM, NULL);
diff --git a/drivers/frame_provider/decoder_v4l/avs_multi/avs_multi.c b/drivers/frame_provider/decoder_v4l/avs_multi/avs_multi.c
index dc7cff1..4dc2df1 100644
--- a/drivers/frame_provider/decoder_v4l/avs_multi/avs_multi.c
+++ b/drivers/frame_provider/decoder_v4l/avs_multi/avs_multi.c
@@ -548,6 +548,7 @@
 	bool force_interlaced_frame;
 	bool need_recycle_buf;
 	int tvp_flag;
+	u32 last_dur;
 };
 
 static void reset_process_time(struct vdec_avs_hw_s *hw);
@@ -1079,6 +1080,7 @@
 {
 	struct aml_vcodec_ctx *ctx = hw->v4l2_ctx;
 	struct dec_stream_info_s *str_info = NULL;
+	unsigned int pixel_ratio;
 
 	if (ctx == NULL) {
 		pr_info("param invalid\n");
@@ -1100,17 +1102,47 @@
 	str_info->crop_left= 0;
 	str_info->crop_right = 0;
 	str_info->double_write_mode = 0;
-	str_info->ratio_size.dar_height = 0;
-	str_info->ratio_size.dar_width = 0;
-	str_info->ratio_size.sar_height = 0;
-	str_info->ratio_size.sar_width = 0;
 	str_info->error_handle_policy = error_handle_policy;
 	str_info->bit_depth = 8;
 
+	pixel_ratio = READ_VREG(AVS_PIC_RATIO);
+	if (pixel_ratio == 0) {
+		str_info->ratio_size.dar_width = -1;
+		str_info->ratio_size.dar_height = -1;
+		str_info->ratio_size.sar_width = -1;
+		str_info->ratio_size.sar_height = -1;
+	} else {
+		str_info->ratio_size.sar_width = -1;
+		str_info->ratio_size.sar_height = -1;
+		switch (pixel_ratio) {
+		case 1:
+			str_info->ratio_size.dar_width = -1;
+			str_info->ratio_size.dar_height = -1;
+			str_info->ratio_size.sar_width = 1;
+			str_info->ratio_size.sar_height = 1;
+			break;
+		case 2:
+			str_info->ratio_size.dar_width = 4;
+			str_info->ratio_size.dar_height = 3;
+			break;
+		case 3:
+			str_info->ratio_size.dar_width = 16;
+			str_info->ratio_size.dar_height = 9;
+			break;
+		case 4:
+			str_info->ratio_size.dar_width = 221;
+			str_info->ratio_size.dar_height = 100;
+			break;
+		default:
+			break;
+		}
+	}
+
 	str_info->trick_mode = 0;
-	if (hw->frame_dur != 0)
-		str_info->frame_rate = ((96000 * 10 / hw->frame_dur) % 10) < 5 ?
-				96000 / hw->frame_dur : (96000 / hw->frame_dur +1);
+	str_info->frame_dur = hw->last_dur;
+	if (str_info->frame_dur != 0)
+		str_info->frame_rate = ((96000 * 10 / str_info->frame_dur) % 10) < 5 ?
+				96000 / str_info->frame_dur : (96000 / str_info->frame_dur +1);
 	else
 		str_info->frame_rate = -1;
 	ctx->dec_intf.decinfo_event_report(ctx, AML_DECINFO_EVENT_STREAM, NULL);
@@ -1171,6 +1203,12 @@
 	{
 		*duration = frame_rate_tab[READ_VREG(AVS_FRAME_RATE) & 0xf];
 		hw->frame_dur = *duration;
+		if (hw->last_dur != hw->frame_dur) {
+			debug_print(hw, 0,
+				"decoder duration change old: %d new: %d\n", hw->last_dur, hw->frame_dur);
+			hw->last_dur = hw->frame_dur;
+			v4l_avs_collect_stream_info(hw_to_vdec(hw), hw);
+		}
 	}
 
 	if (hw->vavs_ratio == 0) {