VLC interface rc加入frame-next功能。
----------
目的:项目需要,扩展rc接口的功能。
----------
思路:1.0.0git版本,Qt界面已经有frame-by-frame功能。(通过“工具-高级控制" 打开),所以可以直接参考Qt代码
vlc/modules/gui/qt4/actions_manager.cpp :line 167
void ActionsManager::frame()
{
input_thread_t *p_input = THEMIM->getInput();
if( p_input )
var_TriggerCallback( p_input, "frame-next" );
}
说明该版本的VLC已经包含这个功能的接口。我们可以直接在rc.c中调用 var_TriggerCallback( p_input, "frame-next" );
---
其实这个回掉函数是位于:vlc/src/input/var.c:line 814
static int FrameNextCallback( vlc_object_t *p_this, char const *psz_cmd,
vlc_value_t oldval, vlc_value_t newval,
void *p_data )
----------
rc.c的diff文件如下:git version:fee06a9254bd51f982a840ccb66ecb918ca9120c
diff --git a/modules/control/rc.c b/modules/control/rc.c
index e1edcaf..430dc8b 100644
--- a/modules/control/rc.c
+++ b/modules/control/rc.c
@@ -412,6 +412,7 @@ static void RegisterCallbacks( intf_thread_t *p_intf )
ADD( "faster", VOID, Input )
ADD( "slower", VOID, Input )
ADD( "normal", VOID, Input )
+ ADD( "frame", VOID, Input )
ADD( "atrack", STRING, Input )
ADD( "vtrack", STRING, Input )
@@ -514,6 +515,7 @@ static void Run( intf_thread_t *p_intf )
var_AddCallback( p_input, "rate", RateChanged, p_intf );
var_AddCallback( p_input, "time-offset", TimeOffsetChanged,
p_intf );
+ var_AddCallback( p_input, "frame-next", RateChanged, p_intf );
}
}
else if( p_input->b_dead )
@@ -524,6 +526,7 @@ static void Run( intf_thread_t *p_intf )
var_DelCallback( p_input, "rate", RateChanged, p_intf );
var_DelCallback( p_input, "time-offset", TimeOffsetChanged,
p_intf );
+ var_DelCallback( p_input, "frame-next", RateChanged, p_intf );
vlc_object_release( p_input );
p_input = NULL;
@@ -818,6 +821,7 @@ static void Run( intf_thread_t *p_intf )
var_DelCallback( p_input, "rate-slower", RateChanged, p_intf );
var_DelCallback( p_input, "rate", RateChanged, p_intf );
var_DelCallback( p_input, "time-offset", TimeOffsetChanged, p_intf );
+ var_DelCallback( p_input, "frame-next", RateChanged, p_intf );
vlc_object_release( p_input );
}
@@ -858,6 +862,7 @@ static void Help( intf_thread_t *p_intf, bool b_longhelp)
msg_rc("%s", _("| faster . . . . . . . . . . faster playing of stream"));
msg_rc("%s", _("| slower . . . . . . . . . . slower playing of stream"));
msg_rc("%s", _("| normal . . . . . . . . . . normal playing of stream"));
+ msg_rc("%s", _("| frame. . . . . . . . . . play frame by frame"));
msg_rc("%s", _("| f [on|off] . . . . . . . . . . . . toggle fullscreen"));
msg_rc("%s", _("| info . . . . . information about the current stream"));
msg_rc("%s", _("| stats . . . . . . . . show statistical information"));
@@ -1030,7 +1035,7 @@ static int Input( vlc_object_t *p_this, char const *psz_cmd,
int state = var_GetInteger( p_input, "state" );
if( ( state == PAUSE_S ) &&
- ( strcmp( psz_cmd, "pause" ) != 0 ) )
+ ( strcmp( psz_cmd, "pause" ) != 0 ) && (strcmp( psz_cmd,"frame") != 0 ) )
{
msg_rc( "%s", _("Press menu select or pause to continue.") );
}
@@ -1099,6 +1104,11 @@ static int Input( vlc_object_t *p_this, char const *psz_cmd,
var_SetInteger( p_input, "rate", INPUT_RATE_DEFAULT );
i_error = VLC_SUCCESS;
}
+ else if ( !strcmp( psz_cmd, "frame" ) )
+ {
+ var_TriggerCallback( p_input, "frame-next" );
+ i_error = VLC_SUCCESS;
+ }
else if( !strcmp( psz_cmd, "chapter" ) ||
!strcmp( psz_cmd, "chapter_n" ) ||
!strcmp( psz_cmd, "chapter_p" ) )