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) {