mirror of https://code.videolan.org/videolan/vlc
player: medialib: save track StrIds instead of legacy int
Co-authored-by Thomas Guillem <thomas@gllm.fr> Signed-off-by: Thomas Guillem <thomas@gllm.fr>
This commit is contained in:
parent
67f1568b88
commit
008920ff9c
|
@ -506,9 +506,9 @@ typedef struct vlc_ml_playback_states_all
|
||||||
float rate;
|
float rate;
|
||||||
float zoom;
|
float zoom;
|
||||||
int current_title;
|
int current_title;
|
||||||
int current_video_track;
|
char* current_video_track;
|
||||||
int current_audio_track;
|
char* current_audio_track;
|
||||||
int current_subtitle_track;
|
char *current_subtitle_track;
|
||||||
char* aspect_ratio;
|
char* aspect_ratio;
|
||||||
char* crop;
|
char* crop;
|
||||||
char* deinterlace;
|
char* deinterlace;
|
||||||
|
|
|
@ -1057,7 +1057,7 @@ int MediaLibrary::getMeta( const medialibrary::IMedia& media,
|
||||||
res->current_title = -1;
|
res->current_title = -1;
|
||||||
// For tracks, -1 means disabled, so we can't use it for "unset"
|
// For tracks, -1 means disabled, so we can't use it for "unset"
|
||||||
res->current_video_track = res->current_audio_track =
|
res->current_video_track = res->current_audio_track =
|
||||||
res->current_subtitle_track = -2;
|
res->current_subtitle_track = nullptr;
|
||||||
res->aspect_ratio = res->crop = res->deinterlace =
|
res->aspect_ratio = res->crop = res->deinterlace =
|
||||||
res->video_filter = nullptr;
|
res->video_filter = nullptr;
|
||||||
for ( const auto& meta : metas )
|
for ( const auto& meta : metas )
|
||||||
|
@ -1077,7 +1077,7 @@ int MediaLibrary::getMeta( const medialibrary::IMedia& media,
|
||||||
res->current_title = atoi( meta.second.c_str() );
|
res->current_title = atoi( meta.second.c_str() );
|
||||||
break;
|
break;
|
||||||
case medialibrary::IMedia::MetadataType::VideoTrack:
|
case medialibrary::IMedia::MetadataType::VideoTrack:
|
||||||
res->current_video_track = atoi( meta.second.c_str() );
|
COPY_META( current_video_track );
|
||||||
break;
|
break;
|
||||||
case medialibrary::IMedia::MetadataType::AspectRatio:
|
case medialibrary::IMedia::MetadataType::AspectRatio:
|
||||||
COPY_META( aspect_ratio );
|
COPY_META( aspect_ratio );
|
||||||
|
@ -1095,10 +1095,10 @@ int MediaLibrary::getMeta( const medialibrary::IMedia& media,
|
||||||
COPY_META( video_filter );
|
COPY_META( video_filter );
|
||||||
break;
|
break;
|
||||||
case medialibrary::IMedia::MetadataType::AudioTrack:
|
case medialibrary::IMedia::MetadataType::AudioTrack:
|
||||||
res->current_audio_track = atoi( meta.second.c_str() );
|
COPY_META( current_audio_track );
|
||||||
break;
|
break;
|
||||||
case medialibrary::IMedia::MetadataType::SubtitleTrack:
|
case medialibrary::IMedia::MetadataType::SubtitleTrack:
|
||||||
res->current_subtitle_track = atoi( meta.second.c_str() );
|
COPY_META( current_subtitle_track );
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
@ -1141,12 +1141,12 @@ int MediaLibrary::setMeta( medialibrary::IMedia& media,
|
||||||
metas[MT::Deinterlace] = values->deinterlace;
|
metas[MT::Deinterlace] = values->deinterlace;
|
||||||
if ( values->video_filter != nullptr )
|
if ( values->video_filter != nullptr )
|
||||||
metas[MT::VideoFilter] = values->video_filter;
|
metas[MT::VideoFilter] = values->video_filter;
|
||||||
if ( values->current_video_track != -2 )
|
if ( values->current_video_track != nullptr )
|
||||||
metas[MT::VideoTrack] = std::to_string( values->current_video_track );
|
metas[MT::VideoTrack] = values->current_video_track;
|
||||||
if ( values->current_audio_track != -2 )
|
if ( values->current_audio_track != nullptr )
|
||||||
metas[MT::AudioTrack] = std::to_string( values->current_audio_track );
|
metas[MT::AudioTrack] = values->current_audio_track;
|
||||||
if ( values->current_subtitle_track != -2 )
|
if ( values->current_subtitle_track != nullptr )
|
||||||
metas[MT::SubtitleTrack] = std::to_string( values->current_subtitle_track );
|
metas[MT::SubtitleTrack] = values->current_subtitle_track;
|
||||||
|
|
||||||
if ( media.setMetadata( std::move( metas ) ) == false )
|
if ( media.setMetadata( std::move( metas ) ) == false )
|
||||||
return VLC_EGENERIC;
|
return VLC_EGENERIC;
|
||||||
|
|
|
@ -339,6 +339,9 @@ void vlc_ml_entry_point_list_release( vlc_ml_entry_point_list_t* p_list )
|
||||||
|
|
||||||
void vlc_ml_playback_states_all_release( vlc_ml_playback_states_all* prefs )
|
void vlc_ml_playback_states_all_release( vlc_ml_playback_states_all* prefs )
|
||||||
{
|
{
|
||||||
|
free( prefs->current_video_track );
|
||||||
|
free( prefs->current_audio_track );
|
||||||
|
free( prefs->current_subtitle_track );
|
||||||
free( prefs->aspect_ratio );
|
free( prefs->aspect_ratio );
|
||||||
free( prefs->crop );
|
free( prefs->crop );
|
||||||
free( prefs->deinterlace );
|
free( prefs->deinterlace );
|
||||||
|
|
|
@ -438,35 +438,6 @@ vlc_player_input_HandleEsEvent(struct vlc_player_input *input,
|
||||||
}
|
}
|
||||||
vlc_player_SendEvent(player, on_track_list_changed,
|
vlc_player_SendEvent(player, on_track_list_changed,
|
||||||
VLC_PLAYER_LIST_ADDED, &trackpriv->t);
|
VLC_PLAYER_LIST_ADDED, &trackpriv->t);
|
||||||
switch (ev->fmt->i_cat)
|
|
||||||
{
|
|
||||||
case VIDEO_ES:
|
|
||||||
/* If we need to restore a specific track, let's do it upon
|
|
||||||
* insertion. The initialization of the default track when
|
|
||||||
* we don't have a value will be done when the first track
|
|
||||||
* gets selected */
|
|
||||||
if (input->ml.restore_states &&
|
|
||||||
input->ml.states.current_video_track != -2 &&
|
|
||||||
input->ml.states.current_video_track == ev->fmt->i_id)
|
|
||||||
vlc_player_SelectTrack(input->player, &trackpriv->t,
|
|
||||||
VLC_PLAYER_SELECT_EXCLUSIVE);
|
|
||||||
break;
|
|
||||||
case AUDIO_ES:
|
|
||||||
if (input->ml.restore_states &&
|
|
||||||
input->ml.states.current_audio_track != -2 &&
|
|
||||||
input->ml.states.current_audio_track == ev->fmt->i_id)
|
|
||||||
vlc_player_SelectTrack(input->player, &trackpriv->t,
|
|
||||||
VLC_PLAYER_SELECT_EXCLUSIVE);
|
|
||||||
break;
|
|
||||||
case SPU_ES:
|
|
||||||
if (input->ml.restore_states &&
|
|
||||||
input->ml.states.current_subtitle_track != -2 &&
|
|
||||||
input->ml.states.current_subtitle_track == ev->fmt->i_id)
|
|
||||||
vlc_player_SelectTrack(input->player, &trackpriv->t,
|
|
||||||
VLC_PLAYER_SELECT_EXCLUSIVE);
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case VLC_INPUT_ES_DELETED:
|
case VLC_INPUT_ES_DELETED:
|
||||||
{
|
{
|
||||||
|
@ -499,26 +470,6 @@ vlc_player_input_HandleEsEvent(struct vlc_player_input *input,
|
||||||
vlc_player_SendEvent(player, on_track_selection_changed,
|
vlc_player_SendEvent(player, on_track_selection_changed,
|
||||||
NULL, trackpriv->t.es_id);
|
NULL, trackpriv->t.es_id);
|
||||||
}
|
}
|
||||||
switch (ev->fmt->i_cat)
|
|
||||||
{
|
|
||||||
/* Save the default selected track to know if it changed
|
|
||||||
* when the playback stops, in order to save the user's
|
|
||||||
* explicitely selected track */
|
|
||||||
case VIDEO_ES:
|
|
||||||
if (input->ml.default_video_track == -2)
|
|
||||||
input->ml.default_video_track = ev->fmt->i_id;
|
|
||||||
break;
|
|
||||||
case AUDIO_ES:
|
|
||||||
if (input->ml.default_audio_track == -2)
|
|
||||||
input->ml.default_audio_track = ev->fmt->i_id;
|
|
||||||
break;
|
|
||||||
case SPU_ES:
|
|
||||||
if (input->ml.default_subtitle_track == -2)
|
|
||||||
input->ml.default_subtitle_track = ev->fmt->i_id;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case VLC_INPUT_ES_UNSELECTED:
|
case VLC_INPUT_ES_UNSELECTED:
|
||||||
trackpriv = vlc_player_track_vector_FindById(vec, ev->id, NULL);
|
trackpriv = vlc_player_track_vector_FindById(vec, ev->id, NULL);
|
||||||
|
@ -921,9 +872,7 @@ vlc_player_input_New(vlc_player_t *player, input_item_t *item)
|
||||||
input->ml.states.current_title = -1;
|
input->ml.states.current_title = -1;
|
||||||
input->ml.states.current_video_track =
|
input->ml.states.current_video_track =
|
||||||
input->ml.states.current_audio_track =
|
input->ml.states.current_audio_track =
|
||||||
input->ml.states.current_subtitle_track =
|
input->ml.states.current_subtitle_track = -2;
|
||||||
input->ml.default_video_track = input->ml.default_audio_track =
|
|
||||||
input->ml.default_subtitle_track = -2;
|
|
||||||
input->ml.states.progress = -1.f;
|
input->ml.states.progress = -1.f;
|
||||||
input->ml.restore = VLC_RESTOREPOINT_NONE;
|
input->ml.restore = VLC_RESTOREPOINT_NONE;
|
||||||
input->ml.restore_states = false;
|
input->ml.restore_states = false;
|
||||||
|
|
|
@ -75,34 +75,20 @@ vlc_player_input_RestoreMlStates(struct vlc_player_input* input, bool force_pos)
|
||||||
if (input->ml.states.rate != .0f)
|
if (input->ml.states.rate != .0f)
|
||||||
vlc_player_ChangeRate(player, input->ml.states.rate);
|
vlc_player_ChangeRate(player, input->ml.states.rate);
|
||||||
|
|
||||||
/* Tracks are restored upon insertion, except when explicitely disabled */
|
|
||||||
if (input->ml.states.current_video_track == -1)
|
const char *video_track_ids = input->ml.states.current_video_track;
|
||||||
{
|
const char *audio_track_ids = input->ml.states.current_audio_track;
|
||||||
input->ml.default_video_track = -1;
|
const char *subtitle_track_ids = input->ml.states.current_subtitle_track;
|
||||||
input_ControlSync(input->thread, INPUT_CONTROL_SET_ES_AUTOSELECT,
|
|
||||||
&(input_control_param_t) {
|
if (video_track_ids)
|
||||||
.es_autoselect.cat = VIDEO_ES,
|
vlc_player_input_SelectTracksByStringIds(input, VIDEO_ES,
|
||||||
.es_autoselect.enabled = false,
|
video_track_ids);
|
||||||
});
|
if (audio_track_ids)
|
||||||
}
|
vlc_player_input_SelectTracksByStringIds(input, AUDIO_ES,
|
||||||
if (input->ml.states.current_audio_track == -1)
|
audio_track_ids);
|
||||||
{
|
if (subtitle_track_ids)
|
||||||
input->ml.default_audio_track = -1;
|
vlc_player_input_SelectTracksByStringIds(input, SPU_ES,
|
||||||
input_ControlSync(input->thread, INPUT_CONTROL_SET_ES_AUTOSELECT,
|
subtitle_track_ids);
|
||||||
&(input_control_param_t) {
|
|
||||||
.es_autoselect.cat = AUDIO_ES,
|
|
||||||
.es_autoselect.enabled = false,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
if (input->ml.states.current_subtitle_track == -1)
|
|
||||||
{
|
|
||||||
input->ml.default_subtitle_track = -1;
|
|
||||||
input_ControlSync(input->thread, INPUT_CONTROL_SET_ES_AUTOSELECT,
|
|
||||||
&(input_control_param_t) {
|
|
||||||
.es_autoselect.cat = SPU_ES,
|
|
||||||
.es_autoselect.enabled = false,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
vout_thread_t* vout = vlc_player_vout_Hold(player);
|
vout_thread_t* vout = vlc_player_vout_Hold(player);
|
||||||
if (vout != NULL)
|
if (vout != NULL)
|
||||||
|
@ -313,34 +299,23 @@ vlc_player_UpdateMLStates(vlc_player_t *player, struct vlc_player_input* input)
|
||||||
input->ml.states.zoom = -1.f;
|
input->ml.states.zoom = -1.f;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (input->ml.default_video_track != -2)
|
char *video_track_ids =
|
||||||
{
|
vlc_player_input_GetSelectedTrackStringIds(input, VIDEO_ES);
|
||||||
int current_video_track = vlc_player_GetFirstSelectedTrackId(&input->video_track_vector);
|
char *audio_track_ids =
|
||||||
if (input->ml.default_video_track != current_video_track)
|
vlc_player_input_GetSelectedTrackStringIds(input, AUDIO_ES);
|
||||||
input->ml.states.current_video_track = current_video_track;
|
char *subtitle_track_ids =
|
||||||
else
|
vlc_player_input_GetSelectedTrackStringIds(input, SPU_ES);
|
||||||
input->ml.states.current_video_track = -2;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (input->ml.default_audio_track != -2)
|
vlc_player_CompareAssignState(&input->ml.states.current_video_track, &video_track_ids);
|
||||||
{
|
vlc_player_CompareAssignState(&input->ml.states.current_audio_track, &audio_track_ids);
|
||||||
int current_audio_track = vlc_player_GetFirstSelectedTrackId(&input->audio_track_vector);
|
vlc_player_CompareAssignState(&input->ml.states.current_subtitle_track, &subtitle_track_ids);
|
||||||
if (input->ml.default_audio_track != current_audio_track)
|
|
||||||
input->ml.states.current_audio_track = current_audio_track;
|
|
||||||
else
|
|
||||||
input->ml.states.current_audio_track = -2;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (input->ml.default_subtitle_track != -2)
|
free(video_track_ids);
|
||||||
{
|
free(audio_track_ids);
|
||||||
int current_subtitle_track = vlc_player_GetFirstSelectedTrackId(&input->spu_track_vector);
|
free(subtitle_track_ids);
|
||||||
if (input->ml.default_subtitle_track != current_subtitle_track)
|
|
||||||
input->ml.states.current_subtitle_track = current_subtitle_track;
|
|
||||||
else
|
|
||||||
input->ml.states.current_subtitle_track = -2;
|
|
||||||
}
|
|
||||||
|
|
||||||
vlc_ml_media_set_all_playback_states(ml, media->i_id, &input->ml.states);
|
vlc_ml_media_set_all_playback_states(ml, media->i_id, &input->ml.states);
|
||||||
|
|
||||||
vlc_ml_release(&input->ml.states);
|
vlc_ml_release(&input->ml.states);
|
||||||
vlc_ml_release(media);
|
vlc_ml_release(media);
|
||||||
}
|
}
|
||||||
|
|
|
@ -108,9 +108,6 @@ struct vlc_player_input
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
vlc_ml_playback_states_all states;
|
vlc_ml_playback_states_all states;
|
||||||
int default_video_track;
|
|
||||||
int default_audio_track;
|
|
||||||
int default_subtitle_track;
|
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
VLC_RESTOREPOINT_TITLE,
|
VLC_RESTOREPOINT_TITLE,
|
||||||
|
|
Loading…
Reference in New Issue