frame_sync: optimize AV SYNC procession.

PD#165368: frame_sync: optimize AV SYNC procession.

Change-Id: Ib9f11c059b9c2985878f83f428cebc5f70bdd0fd
Signed-off-by: manhao liang <manhao.liang@amlogic.com>
This commit is contained in:
manhao liang
2018-05-24 14:37:23 +08:00
committed by Yixun Lan
parent d409afc9a5
commit b208d6cc7f
20 changed files with 666 additions and 735 deletions

View File

@@ -695,12 +695,14 @@
clocks = <&clkc CLKID_DOS_PARSER
&clkc CLKID_DEMUX
&clkc CLKID_DOS
&clkc CLKID_CLK81
&clkc CLKID_VDEC_MUX
&clkc CLKID_HCODEC_MUX
&clkc CLKID_HEVC_MUX>;
clock-names = "parser_top",
"demux",
"vdec",
"clk_81",
"clk_vdec_mux",
"clk_hcodec_mux",
"clk_hevc_mux";

View File

@@ -684,12 +684,14 @@
clocks = <&clkc CLKID_DOS_PARSER
&clkc CLKID_DEMUX
&clkc CLKID_DOS
&clkc CLKID_CLK81
&clkc CLKID_VDEC_MUX
&clkc CLKID_HCODEC_MUX
&clkc CLKID_HEVC_MUX>;
clock-names = "parser_top",
"demux",
"vdec",
"clk_81",
"clk_vdec_mux",
"clk_hcodec_mux",
"clk_hevc_mux";

View File

@@ -695,12 +695,14 @@
clocks = <&clkc CLKID_DOS_PARSER
&clkc CLKID_DEMUX
&clkc CLKID_DOS
&clkc CLKID_CLK81
&clkc CLKID_VDEC_MUX
&clkc CLKID_HCODEC_MUX
&clkc CLKID_HEVC_MUX>;
clock-names = "parser_top",
"demux",
"vdec",
"clk_81",
"clk_vdec_mux",
"clk_hcodec_mux",
"clk_hevc_mux";

View File

@@ -460,12 +460,14 @@
clocks = <&clkc CLKID_DOS_PARSER
&clkc CLKID_DEMUX
&clkc CLKID_DOS
&clkc CLKID_CLK81
&clkc CLKID_VDEC_MUX
&clkc CLKID_HCODEC_MUX
&clkc CLKID_HEVC_MUX>;
clock-names = "parser_top",
"demux",
"vdec",
"clk_81",
"clk_vdec_mux",
"clk_hcodec_mux",
"clk_hevc_mux";

View File

@@ -442,12 +442,14 @@
clocks = <&clkc CLKID_DOS_PARSER
&clkc CLKID_DEMUX
&clkc CLKID_DOS
&clkc CLKID_CLK81
&clkc CLKID_VDEC_MUX
&clkc CLKID_HCODEC_MUX
&clkc CLKID_HEVC_MUX>;
clock-names = "parser_top",
"demux",
"vdec",
"clk_81",
"clk_vdec_mux",
"clk_hcodec_mux",
"clk_hevc_mux";

View File

@@ -457,12 +457,14 @@
clocks = <&clkc CLKID_DOS_PARSER
&clkc CLKID_DEMUX
&clkc CLKID_DOS
&clkc CLKID_CLK81
&clkc CLKID_VDEC_MUX
&clkc CLKID_HCODEC_MUX
&clkc CLKID_HEVC_MUX>;
clock-names = "parser_top",
"demux",
"vdec",
"clk_81",
"clk_vdec_mux",
"clk_hcodec_mux",
"clk_hevc_mux";

View File

@@ -448,12 +448,14 @@
clocks = <&clkc CLKID_DOS_PARSER
&clkc CLKID_DEMUX
&clkc CLKID_DOS
&clkc CLKID_CLK81
&clkc CLKID_VDEC_MUX
&clkc CLKID_HCODEC_MUX
&clkc CLKID_HEVC_MUX>;
clock-names = "parser_top",
"demux",
"vdec",
"clk_81",
"clk_vdec_mux",
"clk_hcodec_mux",
"clk_hevc_mux";

View File

@@ -452,12 +452,14 @@
clocks = <&clkc CLKID_DOS_PARSER
&clkc CLKID_DEMUX
&clkc CLKID_DOS
&clkc CLKID_CLK81
&clkc CLKID_VDEC_MUX
&clkc CLKID_HCODEC_MUX
&clkc CLKID_HEVC_MUX>;
clock-names = "parser_top",
"demux",
"vdec",
"clk_81",
"clk_vdec_mux",
"clk_hcodec_mux",
"clk_hevc_mux";

View File

@@ -438,12 +438,14 @@
clocks = <&clkc CLKID_DOS_PARSER
&clkc CLKID_DEMUX
&clkc CLKID_DOS
&clkc CLKID_CLK81
&clkc CLKID_VDEC_MUX
&clkc CLKID_HCODEC_MUX
&clkc CLKID_HEVC_MUX>;
clock-names = "parser_top",
"demux",
"vdec",
"clk_81",
"clk_vdec_mux",
"clk_hcodec_mux",
"clk_hevc_mux";

View File

@@ -313,12 +313,14 @@
clocks = <&clkc CLKID_DOS_PARSER
&clkc CLKID_DEMUX
&clkc CLKID_DOS
&clkc CLKID_CLK81
&clkc CLKID_VDEC_MUX
&clkc CLKID_HCODEC_MUX
&clkc CLKID_HEVC_MUX>;
clock-names = "parser_top",
"demux",
"vdec",
"clk_81",
"clk_vdec_mux",
"clk_hcodec_mux",
"clk_hevc_mux";

View File

@@ -314,12 +314,14 @@
clocks = <&clkc CLKID_DOS_PARSER
&clkc CLKID_DEMUX
&clkc CLKID_DOS
&clkc CLKID_CLK81
&clkc CLKID_VDEC_MUX
&clkc CLKID_HCODEC_MUX
&clkc CLKID_HEVC_MUX>;
clock-names = "parser_top",
"demux",
"vdec",
"clk_81",
"clk_vdec_mux",
"clk_hcodec_mux",
"clk_hevc_mux";

View File

@@ -314,12 +314,14 @@
clocks = <&clkc CLKID_DOS_PARSER
&clkc CLKID_DEMUX
&clkc CLKID_DOS
&clkc CLKID_CLK81
&clkc CLKID_VDEC_MUX
&clkc CLKID_HCODEC_MUX
&clkc CLKID_HEVC_MUX>;
clock-names = "parser_top",
"demux",
"vdec",
"clk_81",
"clk_vdec_mux",
"clk_hcodec_mux",
"clk_hevc_mux";

View File

@@ -313,12 +313,14 @@
clocks = <&clkc CLKID_DOS_PARSER
&clkc CLKID_DEMUX
&clkc CLKID_DOS
&clkc CLKID_CLK81
&clkc CLKID_VDEC_MUX
&clkc CLKID_HCODEC_MUX
&clkc CLKID_HEVC_MUX>;
clock-names = "parser_top",
"demux",
"vdec",
"clk_81",
"clk_vdec_mux",
"clk_hcodec_mux",
"clk_hevc_mux";

View File

@@ -1,4 +1,7 @@
obj-$(CONFIG_AMLOGIC_MEDIA_VIDEO) += frame_sync.o
ccflags-y = -DMODIFY_TIMESTAMP_INC_WITH_PLL -DCALC_CACHED_TIME #-DUSE_VMASTER_MODE
frame_sync-objs += ptsserv.o
frame_sync-objs += timestamp.o
frame_sync-objs += tsync.o

View File

@@ -231,49 +231,55 @@ int calculation_stream_delayed_ms(u8 type, u32 *latestbitrate,
outtime = pTable->last_checkout_pts;
timestampe_delayed = (pTable->last_checkin_pts - outtime) / 90;
pTable->last_pts_delay_ms = timestampe_delayed;
#if 0
if ((timestampe_delayed < 10
|| abs(pTable->last_pts_delay_ms - timestampe_delayed) > 3000)
&& pTable->last_avg_bitrate > 0) {
int diff =
pTable->last_checkin_offset -
if (get_buf_by_type_cb && stbuf_level_cb && stbuf_space_cb) {
if ((timestampe_delayed < 10)
|| ((abs(pTable->last_pts_delay_ms - timestampe_delayed)
> 3000) && (pTable->last_avg_bitrate > 0))) {
int diff = pTable->last_checkin_offset -
pTable->last_checkout_offset;
int diff2;
int delay_ms;
/* #if MESON_CPU_TYPE >= MESON_CPU_TYPE_MESON8 */
if (has_hevc_vdec()) {
if (pTable->hevc) {
diff2 =
stbuf_level(get_buf_by_type(
if (pTable->hevc)
diff2 = stbuf_level_cb
(get_buf_by_type_cb(
PTS_TYPE_HEVC));
} else
diff2 = stbuf_level(get_buf_by_type(type));
} else
else
diff2 = stbuf_level_cb
(get_buf_by_type_cb(type));
} else{
/* #endif */
diff2 = stbuf_level(get_buf_by_type(type));
diff2 = stbuf_level_cb
(get_buf_by_type_cb(type));
}
/* #if MESON_CPU_TYPE >= MESON_CPU_TYPE_MESON8 */
if (has_hevc_vdec()) {
if (pTable->hevc) {
if (diff2 >
stbuf_space(get_buf_by_type(
if (has_hevc_vdec() == 1) {
if (pTable->hevc > 0) {
if (diff2 > stbuf_space_cb(
get_buf_by_type_cb(
PTS_TYPE_HEVC)))
diff = diff2;
} else {
if (diff2 > stbuf_space(get_buf_by_type(type)))
if (diff2 > stbuf_space_cb(
get_buf_by_type_cb(
type)))
diff = diff2;
}
} else
/* #endif */
{
if (diff2 > stbuf_space(get_buf_by_type(type)))
if (diff2 > stbuf_space_cb(
get_buf_by_type_cb(
type)))
diff = diff2;
}
delay_ms = diff * 1000 / (1 + pTable->last_avg_bitrate / 8);
if (timestampe_delayed < 10
|| (abs(timestampe_delayed - delay_ms) > 3 * 1000
&& delay_ms > 1000)) {
if ((timestampe_delayed < 10) ||
((abs
(timestampe_delayed - delay_ms) > (3 * 1000))
&& (delay_ms > 1000))) {
/*
*pr_info
*("%d:recalculated ptsdelay=%dms bitratedelay=%d ",
@@ -285,7 +291,8 @@ int calculation_stream_delayed_ms(u8 type, u32 *latestbitrate,
timestampe_delayed = delay_ms;
}
}
#endif
}
if (latestbitrate)
*latestbitrate = pTable->last_bitrate;
@@ -1343,9 +1350,6 @@ int pts_start(u8 type)
ulong flags;
struct pts_table_s *pTable;
/*tsync init.*/
tsync_init();
if (type >= PTS_TYPE_MAX)
return -EINVAL;
/* #if MESON_CPU_TYPE >= MESON_CPU_TYPE_MESON8 */
@@ -1492,10 +1496,6 @@ int pts_stop(u8 type)
if (type == PTS_TYPE_AUDIO)
timestamp_apts_set(-1);
if (type == PTS_TYPE_VIDEO || type == PTS_TYPE_HEVC)
timestamp_checkin_firstvpts_set(0xffffffff);
tsync_mode_reinit();
return 0;

View File

@@ -18,6 +18,7 @@
#define DEBUG
#include <linux/module.h>
#include <linux/amlogic/media/frame_sync/tsync.h>
#include <linux/amlogic/media/frame_sync/tsync_pcr.h>
#include <linux/amlogic/media/utils/vdec_reg.h>
#include <linux/amlogic/media/registers/register.h>
#include <linux/amlogic/media/vout/vout_notify.h>
@@ -34,8 +35,9 @@ static u32 system_time_up;
static u32 audio_pts_up;
static u32 audio_pts_started;
static u32 first_vpts;
static u32 first_checkin_vpts = 0xffffffff;
static u32 first_checkin_vpts;
static u32 first_apts;
static u32 pcrscr_lantcy = 800*90;
static u32 system_time_scale_base = 1;
static u32 system_time_scale_remainder;
@@ -112,6 +114,17 @@ EXPORT_SYMBOL(timestamp_apts_started);
u32 timestamp_pcrscr_get(void)
{
if (tsdemux_pcrscr_valid_cb && tsdemux_pcrscr_valid_cb()) {
if (tsync_pcr_demux_pcr_used() == 0) {
return system_time;
}
else {
if (tsdemux_pcrscr_get_cb)
return tsdemux_pcrscr_get_cb()-pcrscr_lantcy;
else
return system_time;
}
} else
return system_time;
}
EXPORT_SYMBOL(timestamp_pcrscr_get);
@@ -125,7 +138,7 @@ EXPORT_SYMBOL(timestamp_pcrscr_set);
void timestamp_firstvpts_set(u32 pts)
{
first_vpts = pts;
pr_debug("video first pts = %x\n", first_vpts);
pr_info("video first pts = %x\n", first_vpts);
}
EXPORT_SYMBOL(timestamp_firstvpts_set);
@@ -138,7 +151,7 @@ EXPORT_SYMBOL(timestamp_firstvpts_get);
void timestamp_checkin_firstvpts_set(u32 pts)
{
first_checkin_vpts = pts;
pr_debug("video first checkin pts = %x\n", first_checkin_vpts);
pr_info("video first checkin pts = %x\n", first_checkin_vpts);
}
EXPORT_SYMBOL(timestamp_checkin_firstvpts_set);

View File

@@ -153,6 +153,34 @@ static int vpause_flag;
static int apause_flag;
static bool dobly_avsync_test;
static int slowsync_enable;
pfun_tsdemux_pcrscr_valid tsdemux_pcrscr_valid_cb;
EXPORT_SYMBOL(tsdemux_pcrscr_valid_cb);
pfun_tsdemux_pcrscr_get tsdemux_pcrscr_get_cb;
EXPORT_SYMBOL(tsdemux_pcrscr_get_cb);
pfun_tsdemux_first_pcrscr_get tsdemux_first_pcrscr_get_cb;
EXPORT_SYMBOL(tsdemux_first_pcrscr_get_cb);
pfun_tsdemux_pcraudio_valid tsdemux_pcraudio_valid_cb;
EXPORT_SYMBOL(tsdemux_pcraudio_valid_cb);
pfun_tsdemux_pcrvideo_valid tsdemux_pcrvideo_valid_cb;
EXPORT_SYMBOL(tsdemux_pcrvideo_valid_cb);
pfun_get_buf_by_type get_buf_by_type_cb;
EXPORT_SYMBOL(get_buf_by_type_cb);
pfun_stbuf_level stbuf_level_cb;
EXPORT_SYMBOL(stbuf_level_cb);
pfun_stbuf_space stbuf_space_cb;
EXPORT_SYMBOL(stbuf_space_cb);
pfun_stbuf_size stbuf_size_cb;
EXPORT_SYMBOL(stbuf_size_cb);
/*
*used to set player start sync mode, 0-none; 1-smoothsync; 2-droppcm;
*default drop pcm
@@ -637,8 +665,8 @@ static void tsync_state_switch_timer_fun(unsigned long arg)
&& abs(timestamp_apts_get() -
timestamp_pcrscr_get()) >
(TIME_UNIT90K * 50 / 1000)) {
timestamp_pcrscr_set(timestamp_apts_get
());
timestamp_pcrscr_set(
timestamp_apts_get());
}
}
}
@@ -678,7 +706,6 @@ void tsync_avevent_locked(enum avevent_e event, u32 param)
*by avpts-diff too much
*threshold 120s is an arbitrary value
*/
#if 0//DEBUG_TMP
if (tsync_enable && !get_vsync_pts_inc_mode())
tsync_mode = TSYNC_MODE_AMASTER;
else {
@@ -686,7 +713,7 @@ void tsync_avevent_locked(enum avevent_e event, u32 param)
if (get_vsync_pts_inc_mode())
tsync_stat = TSYNC_STAT_PCRSCR_SETUP_NONE;
}
#endif
if (tsync_dec_reset_flag)
tsync_dec_reset_video_start = 1;
@@ -697,9 +724,9 @@ void tsync_avevent_locked(enum avevent_e event, u32 param)
if (tsync_stat == TSYNC_STAT_PCRSCR_SETUP_NONE) {
if (tsync_syncthresh
&& (tsync_mode == TSYNC_MODE_AMASTER)) {
if (param > VIDEO_HOLD_THRESHOLD)
param -= VIDEO_HOLD_THRESHOLD;
}
timestamp_pcrscr_set(param -
VIDEO_HOLD_THRESHOLD);
} else
timestamp_pcrscr_set(param);
tsync_stat = TSYNC_STAT_PCRSCR_SETUP_VIDEO;
}
@@ -758,7 +785,7 @@ void tsync_avevent_locked(enum avevent_e event, u32 param)
*"VIDEO_TSTAMP_DISCONTINUITY, 0x%x, 0x%x\n", t, param);
*/
if ((abs(param - oldpts) > tsync_av_threshold_min)
/*&& (!get_vsync_pts_inc_mode())*/) {
&& (!get_vsync_pts_inc_mode())) {
vpts_discontinue = 1;
vpts_discontinue_diff = abs(param - t);
tsync_mode_switch('V', abs(param - t),
@@ -794,7 +821,7 @@ void tsync_avevent_locked(enum avevent_e event, u32 param)
"AUDIO_TSTAMP_DISCONTINUITY, 0x%x, 0x%x\n",
t, param);
if ((abs(param - oldpts) > tsync_av_threshold_min)
/*&& (!get_vsync_pts_inc_mode())*/) {
&& (!get_vsync_pts_inc_mode())) {
apts_discontinue = 1;
apts_discontinue_diff = abs(param - t);
tsync_mode_switch('A', abs(param - t),
@@ -1070,19 +1097,16 @@ int tsync_set_apts(unsigned int pts)
t = timestamp_vpts_get();
else
t = timestamp_pcrscr_get();
/* do not switch tsync mode until first video toggled. */
if ((abs(oldpts - pts) > tsync_av_threshold_min) &&
(timestamp_firstvpts_get() > 0)
/*&&*/
/*(!get_vsync_pts_inc_mode())*//*DEBUG_TMP*/) {/* is discontinue */
(!get_vsync_pts_inc_mode())) { /* is discontinue */
apts_discontinue = 1;
tsync_mode_switch('A', abs(pts - t),
pts - oldpts); /*if in VMASTER ,just wait */
}
timestamp_apts_set(pts);
/*if (get_vsync_pts_inc_mode() && (tsync_mode != TSYNC_MODE_VMASTER))*/
/*tsync_mode = TSYNC_MODE_VMASTER;*//*DEBUG_TMP*/
if (get_vsync_pts_inc_mode() && (tsync_mode != TSYNC_MODE_VMASTER))
tsync_mode = TSYNC_MODE_VMASTER;
if (tsync_mode == TSYNC_MODE_AMASTER)
t = timestamp_pcrscr_get();
@@ -1133,41 +1157,12 @@ int tsync_set_apts(unsigned int pts)
timestamp_pcrscr_set(pts);
}
}
} else if (oldmod != tsync_mode && tsync_mode == TSYNC_MODE_VMASTER)
} else if ((oldmod != tsync_mode) && (tsync_mode == TSYNC_MODE_VMASTER))
timestamp_pcrscr_set(timestamp_vpts_get());
return 0;
}
EXPORT_SYMBOL(tsync_set_apts);
void tsync_init(void)
{
if (tsync_flag & TSYNC_INIT_STATE)
return;
tsync_flag |= TSYNC_INIT_STATE;
/* init audio pts to -1, others to 0 */
timestamp_apts_set(-1);
timestamp_vpts_set(0);
timestamp_pcrscr_set(0);
init_timer(&tsync_pcr_recover_timer);
tsync_pcr_recover_timer.function = tsync_pcr_recover_timer_func;
tsync_pcr_recover_timer.expires = jiffies + PCR_CHECK_INTERVAL;
pcr_sync_stat = PCR_SYNC_UNSET;
pcr_recover_trigger = 0;
add_timer(&tsync_pcr_recover_timer);
init_timer(&tsync_state_switch_timer);
tsync_state_switch_timer.function = tsync_state_switch_timer_fun;
tsync_state_switch_timer.expires = jiffies + msecs_to_jiffies(10);
add_timer(&tsync_state_switch_timer);
}
/*********************************************************/
static ssize_t show_pcr_recover(struct class *class,
@@ -2087,22 +2082,34 @@ static int __init tsync_module_init(void)
return r;
}
tsync_pcr_init();
/* init audio pts to -1, others to 0 */
timestamp_apts_set(-1);
timestamp_vpts_set(0);
timestamp_pcrscr_set(0);
init_timer(&tsync_pcr_recover_timer);
tsync_pcr_recover_timer.function = tsync_pcr_recover_timer_func;
tsync_pcr_recover_timer.expires = jiffies + PCR_CHECK_INTERVAL;
pcr_sync_stat = PCR_SYNC_UNSET;
pcr_recover_trigger = 0;
add_timer(&tsync_pcr_recover_timer);
init_timer(&tsync_state_switch_timer);
tsync_state_switch_timer.function = tsync_state_switch_timer_fun;
tsync_state_switch_timer.expires = jiffies + 1;
add_timer(&tsync_state_switch_timer);
REG_PATH_CONFIGS("media.tsync", tsync_configs);
return 0;
}
static void __exit tsync_module_exit(void)
{
if (tsync_flag & TSYNC_INIT_STATE) {
del_timer_sync(&tsync_pcr_recover_timer);
del_timer_sync(&tsync_state_switch_timer);
}
class_unregister(&tsync_class);
tsync_pcr_exit();
}
module_init(tsync_module_init);

File diff suppressed because it is too large Load Diff

View File

@@ -46,6 +46,33 @@ enum tsync_mode_e {
extern bool disable_slow_sync;
typedef u8 (*pfun_tsdemux_pcrscr_valid)(void);
extern pfun_tsdemux_pcrscr_valid tsdemux_pcrscr_valid_cb;
typedef u32 (*pfun_tsdemux_pcrscr_get)(void);
extern pfun_tsdemux_pcrscr_get tsdemux_pcrscr_get_cb;
typedef u32 (*pfun_tsdemux_first_pcrscr_get)(void);
extern pfun_tsdemux_first_pcrscr_get tsdemux_first_pcrscr_get_cb;
typedef u8 (*pfun_tsdemux_pcraudio_valid)(void);
extern pfun_tsdemux_pcraudio_valid tsdemux_pcraudio_valid_cb;
typedef u8 (*pfun_tsdemux_pcrvideo_valid)(void);
extern pfun_tsdemux_pcrvideo_valid tsdemux_pcrvideo_valid_cb;
typedef struct stream_buf_s *(*pfun_get_buf_by_type)(u32 type);
extern pfun_get_buf_by_type get_buf_by_type_cb;
typedef u32 (*pfun_stbuf_level)(struct stream_buf_s *buf);
extern pfun_stbuf_level stbuf_level_cb;
typedef u32 (*pfun_stbuf_space)(struct stream_buf_s *buf);
extern pfun_stbuf_space stbuf_space_cb;
typedef u32 (*pfun_stbuf_size)(struct stream_buf_s *buf);
extern pfun_stbuf_size stbuf_size_cb;
#ifdef MODIFY_TIMESTAMP_INC_WITH_PLL
extern void set_timestamp_inc_factor(u32 factor);
#endif

View File

@@ -30,4 +30,6 @@ extern int get_vsync_pts_inc_mode(void);
int tsync_pcr_init(void);
void tsync_pcr_exit(void);
extern int tsync_pcr_demux_pcr_used(void);
#endif