mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-08 11:50:43 +09:00
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:
@@ -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";
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user