Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
SDK
/
exoplayer
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Wiki
Snippets
Settings
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit
9f7abd4f
authored
Apr 07, 2022
by
Ian Baker
Browse files
Options
_('Browse Files')
Download
Plain Diff
Merge pull request #10047 from LuGO0:9432/added-filtering-for-forced-text-tracks
PiperOrigin-RevId: 439262085
parents
bba102a4
c9ce23a1
Show whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
84 additions
and
65 deletions
library/common/src/main/java/com/google/android/exoplayer2/trackselection/TrackSelectionParameters.java
library/common/src/test/java/com/google/android/exoplayer2/trackselection/TrackSelectionParametersTest.java
library/core/src/main/java/com/google/android/exoplayer2/trackselection/DefaultTrackSelector.java
library/core/src/test/java/com/google/android/exoplayer2/trackselection/DefaultTrackSelectorTest.java
library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlView.java
library/common/src/main/java/com/google/android/exoplayer2/trackselection/TrackSelectionParameters.java
View file @
9f7abd4f
...
@@ -98,6 +98,7 @@ public class TrackSelectionParameters implements Bundleable {
...
@@ -98,6 +98,7 @@ public class TrackSelectionParameters implements Bundleable {
// Text
// Text
private
ImmutableList
<
String
>
preferredTextLanguages
;
private
ImmutableList
<
String
>
preferredTextLanguages
;
private
@C
.
RoleFlags
int
preferredTextRoleFlags
;
private
@C
.
RoleFlags
int
preferredTextRoleFlags
;
private
@C
.
SelectionFlags
int
ignoredTextSelectionFlags
;
private
boolean
selectUndeterminedTextLanguage
;
private
boolean
selectUndeterminedTextLanguage
;
// General
// General
private
boolean
forceLowestBitrate
;
private
boolean
forceLowestBitrate
;
...
@@ -130,6 +131,7 @@ public class TrackSelectionParameters implements Bundleable {
...
@@ -130,6 +131,7 @@ public class TrackSelectionParameters implements Bundleable {
// Text
// Text
preferredTextLanguages
=
ImmutableList
.
of
();
preferredTextLanguages
=
ImmutableList
.
of
();
preferredTextRoleFlags
=
0
;
preferredTextRoleFlags
=
0
;
ignoredTextSelectionFlags
=
0
;
selectUndeterminedTextLanguage
=
false
;
selectUndeterminedTextLanguage
=
false
;
// General
// General
forceLowestBitrate
=
false
;
forceLowestBitrate
=
false
;
...
@@ -228,6 +230,10 @@ public class TrackSelectionParameters implements Bundleable {
...
@@ -228,6 +230,10 @@ public class TrackSelectionParameters implements Bundleable {
bundle
.
getInt
(
bundle
.
getInt
(
keyForField
(
FIELD_PREFERRED_TEXT_ROLE_FLAGS
),
keyForField
(
FIELD_PREFERRED_TEXT_ROLE_FLAGS
),
DEFAULT_WITHOUT_CONTEXT
.
preferredTextRoleFlags
);
DEFAULT_WITHOUT_CONTEXT
.
preferredTextRoleFlags
);
ignoredTextSelectionFlags
=
bundle
.
getInt
(
keyForField
(
FIELD_IGNORED_TEXT_SELECTION_FLAGS
),
DEFAULT_WITHOUT_CONTEXT
.
ignoredTextSelectionFlags
);
selectUndeterminedTextLanguage
=
selectUndeterminedTextLanguage
=
bundle
.
getBoolean
(
bundle
.
getBoolean
(
keyForField
(
FIELD_SELECT_UNDETERMINED_TEXT_LANGUAGE
),
keyForField
(
FIELD_SELECT_UNDETERMINED_TEXT_LANGUAGE
),
...
@@ -291,6 +297,7 @@ public class TrackSelectionParameters implements Bundleable {
...
@@ -291,6 +297,7 @@ public class TrackSelectionParameters implements Bundleable {
// Text
// Text
preferredTextLanguages
=
parameters
.
preferredTextLanguages
;
preferredTextLanguages
=
parameters
.
preferredTextLanguages
;
preferredTextRoleFlags
=
parameters
.
preferredTextRoleFlags
;
preferredTextRoleFlags
=
parameters
.
preferredTextRoleFlags
;
ignoredTextSelectionFlags
=
parameters
.
ignoredTextSelectionFlags
;
selectUndeterminedTextLanguage
=
parameters
.
selectUndeterminedTextLanguage
;
selectUndeterminedTextLanguage
=
parameters
.
selectUndeterminedTextLanguage
;
// General
// General
forceLowestBitrate
=
parameters
.
forceLowestBitrate
;
forceLowestBitrate
=
parameters
.
forceLowestBitrate
;
...
@@ -614,6 +621,18 @@ public class TrackSelectionParameters implements Bundleable {
...
@@ -614,6 +621,18 @@ public class TrackSelectionParameters implements Bundleable {
}
}
/**
/**
* Sets a bitmask of selection flags that are ignored for text track selections.
*
* @param ignoredTextSelectionFlags A bitmask of {@link C.SelectionFlags} that are ignored for
* text track selections.
* @return This builder.
*/
public
Builder
setIgnoredTextSelectionFlags
(
@C
.
SelectionFlags
int
ignoredTextSelectionFlags
)
{
this
.
ignoredTextSelectionFlags
=
ignoredTextSelectionFlags
;
return
this
;
}
/**
* Sets whether a text track with undetermined language should be selected if no track with
* Sets whether a text track with undetermined language should be selected if no track with
* {@link #setPreferredTextLanguages(String...) a preferred language} is available, or if the
* {@link #setPreferredTextLanguages(String...) a preferred language} is available, or if the
* preferred language is unset.
* preferred language is unset.
...
@@ -896,6 +915,11 @@ public class TrackSelectionParameters implements Bundleable {
...
@@ -896,6 +915,11 @@ public class TrackSelectionParameters implements Bundleable {
*/
*/
public
final
@C
.
RoleFlags
int
preferredTextRoleFlags
;
public
final
@C
.
RoleFlags
int
preferredTextRoleFlags
;
/**
/**
* Bitmask of selection flags that are ignored for text track selections. See {@link
* C.SelectionFlags}. The default value is {@code 0} (i.e., no flags are ignored).
*/
public
final
@C
.
SelectionFlags
int
ignoredTextSelectionFlags
;
/**
* Whether a text track with undetermined language should be selected if no track with {@link
* Whether a text track with undetermined language should be selected if no track with {@link
* #preferredTextLanguages} is available, or if {@link #preferredTextLanguages} is unset. The
* #preferredTextLanguages} is available, or if {@link #preferredTextLanguages} is unset. The
* default value is {@code false}.
* default value is {@code false}.
...
@@ -947,6 +971,7 @@ public class TrackSelectionParameters implements Bundleable {
...
@@ -947,6 +971,7 @@ public class TrackSelectionParameters implements Bundleable {
// Text
// Text
this
.
preferredTextLanguages
=
builder
.
preferredTextLanguages
;
this
.
preferredTextLanguages
=
builder
.
preferredTextLanguages
;
this
.
preferredTextRoleFlags
=
builder
.
preferredTextRoleFlags
;
this
.
preferredTextRoleFlags
=
builder
.
preferredTextRoleFlags
;
this
.
ignoredTextSelectionFlags
=
builder
.
ignoredTextSelectionFlags
;
this
.
selectUndeterminedTextLanguage
=
builder
.
selectUndeterminedTextLanguage
;
this
.
selectUndeterminedTextLanguage
=
builder
.
selectUndeterminedTextLanguage
;
// General
// General
this
.
forceLowestBitrate
=
builder
.
forceLowestBitrate
;
this
.
forceLowestBitrate
=
builder
.
forceLowestBitrate
;
...
@@ -990,8 +1015,10 @@ public class TrackSelectionParameters implements Bundleable {
...
@@ -990,8 +1015,10 @@ public class TrackSelectionParameters implements Bundleable {
&&
maxAudioChannelCount
==
other
.
maxAudioChannelCount
&&
maxAudioChannelCount
==
other
.
maxAudioChannelCount
&&
maxAudioBitrate
==
other
.
maxAudioBitrate
&&
maxAudioBitrate
==
other
.
maxAudioBitrate
&&
preferredAudioMimeTypes
.
equals
(
other
.
preferredAudioMimeTypes
)
&&
preferredAudioMimeTypes
.
equals
(
other
.
preferredAudioMimeTypes
)
// Text
&&
preferredTextLanguages
.
equals
(
other
.
preferredTextLanguages
)
&&
preferredTextLanguages
.
equals
(
other
.
preferredTextLanguages
)
&&
preferredTextRoleFlags
==
other
.
preferredTextRoleFlags
&&
preferredTextRoleFlags
==
other
.
preferredTextRoleFlags
&&
ignoredTextSelectionFlags
==
other
.
ignoredTextSelectionFlags
&&
selectUndeterminedTextLanguage
==
other
.
selectUndeterminedTextLanguage
&&
selectUndeterminedTextLanguage
==
other
.
selectUndeterminedTextLanguage
// General
// General
&&
forceLowestBitrate
==
other
.
forceLowestBitrate
&&
forceLowestBitrate
==
other
.
forceLowestBitrate
...
@@ -1026,6 +1053,7 @@ public class TrackSelectionParameters implements Bundleable {
...
@@ -1026,6 +1053,7 @@ public class TrackSelectionParameters implements Bundleable {
// Text
// Text
result
=
31
*
result
+
preferredTextLanguages
.
hashCode
();
result
=
31
*
result
+
preferredTextLanguages
.
hashCode
();
result
=
31
*
result
+
preferredTextRoleFlags
;
result
=
31
*
result
+
preferredTextRoleFlags
;
result
=
31
*
result
+
ignoredTextSelectionFlags
;
result
=
31
*
result
+
(
selectUndeterminedTextLanguage
?
1
:
0
);
result
=
31
*
result
+
(
selectUndeterminedTextLanguage
?
1
:
0
);
// General
// General
result
=
31
*
result
+
(
forceLowestBitrate
?
1
:
0
);
result
=
31
*
result
+
(
forceLowestBitrate
?
1
:
0
);
...
@@ -1040,11 +1068,7 @@ public class TrackSelectionParameters implements Bundleable {
...
@@ -1040,11 +1068,7 @@ public class TrackSelectionParameters implements Bundleable {
@Documented
@Documented
@Retention
(
RetentionPolicy
.
SOURCE
)
@Retention
(
RetentionPolicy
.
SOURCE
)
@IntDef
({
@IntDef
({
FIELD_PREFERRED_AUDIO_LANGUAGES
,
// Video
FIELD_PREFERRED_AUDIO_ROLE_FLAGS
,
FIELD_PREFERRED_TEXT_LANGUAGES
,
FIELD_PREFERRED_TEXT_ROLE_FLAGS
,
FIELD_SELECT_UNDETERMINED_TEXT_LANGUAGE
,
FIELD_MAX_VIDEO_WIDTH
,
FIELD_MAX_VIDEO_WIDTH
,
FIELD_MAX_VIDEO_HEIGHT
,
FIELD_MAX_VIDEO_HEIGHT
,
FIELD_MAX_VIDEO_FRAMERATE
,
FIELD_MAX_VIDEO_FRAMERATE
,
...
@@ -1057,14 +1081,23 @@ public class TrackSelectionParameters implements Bundleable {
...
@@ -1057,14 +1081,23 @@ public class TrackSelectionParameters implements Bundleable {
FIELD_VIEWPORT_HEIGHT
,
FIELD_VIEWPORT_HEIGHT
,
FIELD_VIEWPORT_ORIENTATION_MAY_CHANGE
,
FIELD_VIEWPORT_ORIENTATION_MAY_CHANGE
,
FIELD_PREFERRED_VIDEO_MIMETYPES
,
FIELD_PREFERRED_VIDEO_MIMETYPES
,
FIELD_PREFERRED_VIDEO_ROLE_FLAGS
,
// Audio
FIELD_PREFERRED_AUDIO_LANGUAGES
,
FIELD_PREFERRED_AUDIO_ROLE_FLAGS
,
FIELD_MAX_AUDIO_CHANNEL_COUNT
,
FIELD_MAX_AUDIO_CHANNEL_COUNT
,
FIELD_MAX_AUDIO_BITRATE
,
FIELD_MAX_AUDIO_BITRATE
,
FIELD_PREFERRED_AUDIO_MIME_TYPES
,
FIELD_PREFERRED_AUDIO_MIME_TYPES
,
// Text
FIELD_PREFERRED_TEXT_LANGUAGES
,
FIELD_PREFERRED_TEXT_ROLE_FLAGS
,
FIELD_IGNORED_TEXT_SELECTION_FLAGS
,
FIELD_SELECT_UNDETERMINED_TEXT_LANGUAGE
,
// General
FIELD_FORCE_LOWEST_BITRATE
,
FIELD_FORCE_LOWEST_BITRATE
,
FIELD_FORCE_HIGHEST_SUPPORTED_BITRATE
,
FIELD_FORCE_HIGHEST_SUPPORTED_BITRATE
,
FIELD_SELECTION_OVERRIDES
,
FIELD_SELECTION_OVERRIDES
,
FIELD_DISABLED_TRACK_TYPE
,
FIELD_DISABLED_TRACK_TYPE
,
FIELD_PREFERRED_VIDEO_ROLE_FLAGS
})
})
private
@interface
FieldNumber
{}
private
@interface
FieldNumber
{}
...
@@ -1093,6 +1126,7 @@ public class TrackSelectionParameters implements Bundleable {
...
@@ -1093,6 +1126,7 @@ public class TrackSelectionParameters implements Bundleable {
private
static
final
int
FIELD_SELECTION_OVERRIDES
=
23
;
private
static
final
int
FIELD_SELECTION_OVERRIDES
=
23
;
private
static
final
int
FIELD_DISABLED_TRACK_TYPE
=
24
;
private
static
final
int
FIELD_DISABLED_TRACK_TYPE
=
24
;
private
static
final
int
FIELD_PREFERRED_VIDEO_ROLE_FLAGS
=
25
;
private
static
final
int
FIELD_PREFERRED_VIDEO_ROLE_FLAGS
=
25
;
private
static
final
int
FIELD_IGNORED_TEXT_SELECTION_FLAGS
=
26
;
@Override
@Override
public
Bundle
toBundle
()
{
public
Bundle
toBundle
()
{
...
@@ -1129,6 +1163,7 @@ public class TrackSelectionParameters implements Bundleable {
...
@@ -1129,6 +1163,7 @@ public class TrackSelectionParameters implements Bundleable {
bundle
.
putStringArray
(
bundle
.
putStringArray
(
keyForField
(
FIELD_PREFERRED_TEXT_LANGUAGES
),
preferredTextLanguages
.
toArray
(
new
String
[
0
]));
keyForField
(
FIELD_PREFERRED_TEXT_LANGUAGES
),
preferredTextLanguages
.
toArray
(
new
String
[
0
]));
bundle
.
putInt
(
keyForField
(
FIELD_PREFERRED_TEXT_ROLE_FLAGS
),
preferredTextRoleFlags
);
bundle
.
putInt
(
keyForField
(
FIELD_PREFERRED_TEXT_ROLE_FLAGS
),
preferredTextRoleFlags
);
bundle
.
putInt
(
keyForField
(
FIELD_IGNORED_TEXT_SELECTION_FLAGS
),
ignoredTextSelectionFlags
);
bundle
.
putBoolean
(
bundle
.
putBoolean
(
keyForField
(
FIELD_SELECT_UNDETERMINED_TEXT_LANGUAGE
),
selectUndeterminedTextLanguage
);
keyForField
(
FIELD_SELECT_UNDETERMINED_TEXT_LANGUAGE
),
selectUndeterminedTextLanguage
);
// General
// General
...
...
library/common/src/test/java/com/google/android/exoplayer2/trackselection/TrackSelectionParametersTest.java
View file @
9f7abd4f
...
@@ -60,6 +60,7 @@ public final class TrackSelectionParametersTest {
...
@@ -60,6 +60,7 @@ public final class TrackSelectionParametersTest {
assertThat
(
parameters
.
preferredAudioMimeTypes
).
isEmpty
();
assertThat
(
parameters
.
preferredAudioMimeTypes
).
isEmpty
();
assertThat
(
parameters
.
preferredTextLanguages
).
isEmpty
();
assertThat
(
parameters
.
preferredTextLanguages
).
isEmpty
();
assertThat
(
parameters
.
preferredTextRoleFlags
).
isEqualTo
(
0
);
assertThat
(
parameters
.
preferredTextRoleFlags
).
isEqualTo
(
0
);
assertThat
(
parameters
.
ignoredTextSelectionFlags
).
isEqualTo
(
0
);
assertThat
(
parameters
.
selectUndeterminedTextLanguage
).
isFalse
();
assertThat
(
parameters
.
selectUndeterminedTextLanguage
).
isFalse
();
// General
// General
assertThat
(
parameters
.
forceLowestBitrate
).
isFalse
();
assertThat
(
parameters
.
forceLowestBitrate
).
isFalse
();
...
@@ -102,6 +103,7 @@ public final class TrackSelectionParametersTest {
...
@@ -102,6 +103,7 @@ public final class TrackSelectionParametersTest {
// Text
// Text
.
setPreferredTextLanguages
(
"de"
,
"en"
)
.
setPreferredTextLanguages
(
"de"
,
"en"
)
.
setPreferredTextRoleFlags
(
C
.
ROLE_FLAG_CAPTION
)
.
setPreferredTextRoleFlags
(
C
.
ROLE_FLAG_CAPTION
)
.
setIgnoredTextSelectionFlags
(
C
.
SELECTION_FLAG_AUTOSELECT
)
.
setSelectUndeterminedTextLanguage
(
true
)
.
setSelectUndeterminedTextLanguage
(
true
)
// General
// General
.
setForceLowestBitrate
(
false
)
.
setForceLowestBitrate
(
false
)
...
@@ -145,6 +147,7 @@ public final class TrackSelectionParametersTest {
...
@@ -145,6 +147,7 @@ public final class TrackSelectionParametersTest {
// Text
// Text
assertThat
(
parameters
.
preferredTextLanguages
).
containsExactly
(
"de"
,
"en"
).
inOrder
();
assertThat
(
parameters
.
preferredTextLanguages
).
containsExactly
(
"de"
,
"en"
).
inOrder
();
assertThat
(
parameters
.
preferredTextRoleFlags
).
isEqualTo
(
C
.
ROLE_FLAG_CAPTION
);
assertThat
(
parameters
.
preferredTextRoleFlags
).
isEqualTo
(
C
.
ROLE_FLAG_CAPTION
);
assertThat
(
parameters
.
ignoredTextSelectionFlags
).
isEqualTo
(
C
.
SELECTION_FLAG_AUTOSELECT
);
assertThat
(
parameters
.
selectUndeterminedTextLanguage
).
isTrue
();
assertThat
(
parameters
.
selectUndeterminedTextLanguage
).
isTrue
();
// General
// General
assertThat
(
parameters
.
forceLowestBitrate
).
isFalse
();
assertThat
(
parameters
.
forceLowestBitrate
).
isFalse
();
...
...
library/core/src/main/java/com/google/android/exoplayer2/trackselection/DefaultTrackSelector.java
View file @
9f7abd4f
...
@@ -114,13 +114,11 @@ public class DefaultTrackSelector extends MappingTrackSelector {
...
@@ -114,13 +114,11 @@ public class DefaultTrackSelector extends MappingTrackSelector {
private
boolean
allowAudioMixedSampleRateAdaptiveness
;
private
boolean
allowAudioMixedSampleRateAdaptiveness
;
private
boolean
allowAudioMixedChannelCountAdaptiveness
;
private
boolean
allowAudioMixedChannelCountAdaptiveness
;
private
boolean
allowAudioMixedDecoderSupportAdaptiveness
;
private
boolean
allowAudioMixedDecoderSupportAdaptiveness
;
// Text
private
@C
.
SelectionFlags
int
disabledTextTrackSelectionFlags
;
// General
// General
private
boolean
exceedRendererCapabilitiesIfNecessary
;
private
boolean
exceedRendererCapabilitiesIfNecessary
;
private
boolean
tunnelingEnabled
;
private
boolean
tunnelingEnabled
;
private
boolean
allowMultipleAdaptiveSelections
;
private
boolean
allowMultipleAdaptiveSelections
;
// Overrides
private
final
SparseArray
<
Map
<
TrackGroupArray
,
@NullableType
SelectionOverride
>>
private
final
SparseArray
<
Map
<
TrackGroupArray
,
@NullableType
SelectionOverride
>>
selectionOverrides
;
selectionOverrides
;
private
final
SparseBooleanArray
rendererDisabledFlags
;
private
final
SparseBooleanArray
rendererDisabledFlags
;
...
@@ -156,8 +154,6 @@ public class DefaultTrackSelector extends MappingTrackSelector {
...
@@ -156,8 +154,6 @@ public class DefaultTrackSelector extends MappingTrackSelector {
*/
*/
private
ParametersBuilder
(
Parameters
initialValues
)
{
private
ParametersBuilder
(
Parameters
initialValues
)
{
super
(
initialValues
);
super
(
initialValues
);
// Text
disabledTextTrackSelectionFlags
=
initialValues
.
disabledTextTrackSelectionFlags
;
// Video
// Video
exceedVideoConstraintsIfNecessary
=
initialValues
.
exceedVideoConstraintsIfNecessary
;
exceedVideoConstraintsIfNecessary
=
initialValues
.
exceedVideoConstraintsIfNecessary
;
allowVideoMixedMimeTypeAdaptiveness
=
initialValues
.
allowVideoMixedMimeTypeAdaptiveness
;
allowVideoMixedMimeTypeAdaptiveness
=
initialValues
.
allowVideoMixedMimeTypeAdaptiveness
;
...
@@ -225,11 +221,6 @@ public class DefaultTrackSelector extends MappingTrackSelector {
...
@@ -225,11 +221,6 @@ public class DefaultTrackSelector extends MappingTrackSelector {
Parameters
.
keyForField
(
Parameters
.
keyForField
(
Parameters
.
FIELD_ALLOW_AUDIO_MIXED_DECODER_SUPPORT_ADAPTIVENESS
),
Parameters
.
FIELD_ALLOW_AUDIO_MIXED_DECODER_SUPPORT_ADAPTIVENESS
),
defaultValue
.
allowAudioMixedDecoderSupportAdaptiveness
));
defaultValue
.
allowAudioMixedDecoderSupportAdaptiveness
));
// Text
setDisabledTextTrackSelectionFlags
(
bundle
.
getInt
(
Parameters
.
keyForField
(
Parameters
.
FIELD_DISABLED_TEXT_TRACK_SELECTION_FLAGS
),
defaultValue
.
disabledTextTrackSelectionFlags
));
// General
// General
setExceedRendererCapabilitiesIfNecessary
(
setExceedRendererCapabilitiesIfNecessary
(
bundle
.
getBoolean
(
bundle
.
getBoolean
(
...
@@ -243,10 +234,9 @@ public class DefaultTrackSelector extends MappingTrackSelector {
...
@@ -243,10 +234,9 @@ public class DefaultTrackSelector extends MappingTrackSelector {
bundle
.
getBoolean
(
bundle
.
getBoolean
(
Parameters
.
keyForField
(
Parameters
.
FIELD_ALLOW_MULTIPLE_ADAPTIVE_SELECTIONS
),
Parameters
.
keyForField
(
Parameters
.
FIELD_ALLOW_MULTIPLE_ADAPTIVE_SELECTIONS
),
defaultValue
.
allowMultipleAdaptiveSelections
));
defaultValue
.
allowMultipleAdaptiveSelections
));
// Overrides
selectionOverrides
=
new
SparseArray
<>();
selectionOverrides
=
new
SparseArray
<>();
setSelectionOverridesFromBundle
(
bundle
);
setSelectionOverridesFromBundle
(
bundle
);
rendererDisabledFlags
=
rendererDisabledFlags
=
makeSparseBooleanArrayFromTrueKeys
(
makeSparseBooleanArrayFromTrueKeys
(
bundle
.
getIntArray
(
bundle
.
getIntArray
(
...
@@ -556,6 +546,13 @@ public class DefaultTrackSelector extends MappingTrackSelector {
...
@@ -556,6 +546,13 @@ public class DefaultTrackSelector extends MappingTrackSelector {
}
}
@Override
@Override
public
ParametersBuilder
setIgnoredTextSelectionFlags
(
@C
.
SelectionFlags
int
ignoredTextSelectionFlags
)
{
super
.
setIgnoredTextSelectionFlags
(
ignoredTextSelectionFlags
);
return
this
;
}
@Override
public
ParametersBuilder
setSelectUndeterminedTextLanguage
(
public
ParametersBuilder
setSelectUndeterminedTextLanguage
(
boolean
selectUndeterminedTextLanguage
)
{
boolean
selectUndeterminedTextLanguage
)
{
super
.
setSelectUndeterminedTextLanguage
(
selectUndeterminedTextLanguage
);
super
.
setSelectUndeterminedTextLanguage
(
selectUndeterminedTextLanguage
);
...
@@ -563,16 +560,12 @@ public class DefaultTrackSelector extends MappingTrackSelector {
...
@@ -563,16 +560,12 @@ public class DefaultTrackSelector extends MappingTrackSelector {
}
}
/**
/**
* Sets a bitmask of selection flags that are disabled for text track selections.
* @deprecated Use {@link #setIgnoredTextSelectionFlags}.
*
* @param disabledTextTrackSelectionFlags A bitmask of {@link C.SelectionFlags} that are
* disabled for text track selections.
* @return This builder.
*/
*/
@Deprecated
public
ParametersBuilder
setDisabledTextTrackSelectionFlags
(
public
ParametersBuilder
setDisabledTextTrackSelectionFlags
(
@C
.
SelectionFlags
int
disabledTextTrackSelectionFlags
)
{
@C
.
SelectionFlags
int
disabledTextTrackSelectionFlags
)
{
this
.
disabledTextTrackSelectionFlags
=
disabledTextTrackSelectionFlags
;
return
setIgnoredTextSelectionFlags
(
disabledTextTrackSelectionFlags
);
return
this
;
}
}
// General
// General
...
@@ -824,8 +817,6 @@ public class DefaultTrackSelector extends MappingTrackSelector {
...
@@ -824,8 +817,6 @@ public class DefaultTrackSelector extends MappingTrackSelector {
allowAudioMixedSampleRateAdaptiveness
=
false
;
allowAudioMixedSampleRateAdaptiveness
=
false
;
allowAudioMixedChannelCountAdaptiveness
=
false
;
allowAudioMixedChannelCountAdaptiveness
=
false
;
allowAudioMixedDecoderSupportAdaptiveness
=
false
;
allowAudioMixedDecoderSupportAdaptiveness
=
false
;
// Text
disabledTextTrackSelectionFlags
=
0
;
// General
// General
exceedRendererCapabilitiesIfNecessary
=
true
;
exceedRendererCapabilitiesIfNecessary
=
true
;
tunnelingEnabled
=
false
;
tunnelingEnabled
=
false
;
...
@@ -913,12 +904,6 @@ public class DefaultTrackSelector extends MappingTrackSelector {
...
@@ -913,12 +904,6 @@ public class DefaultTrackSelector extends MappingTrackSelector {
*/
*/
@Deprecated
public
static
final
Parameters
DEFAULT
=
DEFAULT_WITHOUT_CONTEXT
;
@Deprecated
public
static
final
Parameters
DEFAULT
=
DEFAULT_WITHOUT_CONTEXT
;
/**
* Bitmask of selection flags that are disabled for text track selections. See {@link
* C.SelectionFlags}. The default value is {@code 0} (i.e. no flags).
*/
public
final
@C
.
SelectionFlags
int
disabledTextTrackSelectionFlags
;
/** Returns an instance configured with default values. */
/** Returns an instance configured with default values. */
public
static
Parameters
getDefaults
(
Context
context
)
{
public
static
Parameters
getDefaults
(
Context
context
)
{
return
new
ParametersBuilder
(
context
).
build
();
return
new
ParametersBuilder
(
context
).
build
();
...
@@ -1016,8 +1001,6 @@ public class DefaultTrackSelector extends MappingTrackSelector {
...
@@ -1016,8 +1001,6 @@ public class DefaultTrackSelector extends MappingTrackSelector {
allowAudioMixedSampleRateAdaptiveness
=
builder
.
allowAudioMixedSampleRateAdaptiveness
;
allowAudioMixedSampleRateAdaptiveness
=
builder
.
allowAudioMixedSampleRateAdaptiveness
;
allowAudioMixedChannelCountAdaptiveness
=
builder
.
allowAudioMixedChannelCountAdaptiveness
;
allowAudioMixedChannelCountAdaptiveness
=
builder
.
allowAudioMixedChannelCountAdaptiveness
;
allowAudioMixedDecoderSupportAdaptiveness
=
builder
.
allowAudioMixedDecoderSupportAdaptiveness
;
allowAudioMixedDecoderSupportAdaptiveness
=
builder
.
allowAudioMixedDecoderSupportAdaptiveness
;
// Text
disabledTextTrackSelectionFlags
=
builder
.
disabledTextTrackSelectionFlags
;
// General
// General
exceedRendererCapabilitiesIfNecessary
=
builder
.
exceedRendererCapabilitiesIfNecessary
;
exceedRendererCapabilitiesIfNecessary
=
builder
.
exceedRendererCapabilitiesIfNecessary
;
tunnelingEnabled
=
builder
.
tunnelingEnabled
;
tunnelingEnabled
=
builder
.
tunnelingEnabled
;
...
@@ -1105,8 +1088,6 @@ public class DefaultTrackSelector extends MappingTrackSelector {
...
@@ -1105,8 +1088,6 @@ public class DefaultTrackSelector extends MappingTrackSelector {
==
other
.
allowAudioMixedChannelCountAdaptiveness
==
other
.
allowAudioMixedChannelCountAdaptiveness
&&
allowAudioMixedDecoderSupportAdaptiveness
&&
allowAudioMixedDecoderSupportAdaptiveness
==
other
.
allowAudioMixedDecoderSupportAdaptiveness
==
other
.
allowAudioMixedDecoderSupportAdaptiveness
// Text
&&
disabledTextTrackSelectionFlags
==
other
.
disabledTextTrackSelectionFlags
// General
// General
&&
exceedRendererCapabilitiesIfNecessary
==
other
.
exceedRendererCapabilitiesIfNecessary
&&
exceedRendererCapabilitiesIfNecessary
==
other
.
exceedRendererCapabilitiesIfNecessary
&&
tunnelingEnabled
==
other
.
tunnelingEnabled
&&
tunnelingEnabled
==
other
.
tunnelingEnabled
...
@@ -1131,8 +1112,6 @@ public class DefaultTrackSelector extends MappingTrackSelector {
...
@@ -1131,8 +1112,6 @@ public class DefaultTrackSelector extends MappingTrackSelector {
result
=
31
*
result
+
(
allowAudioMixedSampleRateAdaptiveness
?
1
:
0
);
result
=
31
*
result
+
(
allowAudioMixedSampleRateAdaptiveness
?
1
:
0
);
result
=
31
*
result
+
(
allowAudioMixedChannelCountAdaptiveness
?
1
:
0
);
result
=
31
*
result
+
(
allowAudioMixedChannelCountAdaptiveness
?
1
:
0
);
result
=
31
*
result
+
(
allowAudioMixedDecoderSupportAdaptiveness
?
1
:
0
);
result
=
31
*
result
+
(
allowAudioMixedDecoderSupportAdaptiveness
?
1
:
0
);
// Text
result
=
31
*
result
+
disabledTextTrackSelectionFlags
;
// General
// General
result
=
31
*
result
+
(
exceedRendererCapabilitiesIfNecessary
?
1
:
0
);
result
=
31
*
result
+
(
exceedRendererCapabilitiesIfNecessary
?
1
:
0
);
result
=
31
*
result
+
(
tunnelingEnabled
?
1
:
0
);
result
=
31
*
result
+
(
tunnelingEnabled
?
1
:
0
);
...
@@ -1147,23 +1126,26 @@ public class DefaultTrackSelector extends MappingTrackSelector {
...
@@ -1147,23 +1126,26 @@ public class DefaultTrackSelector extends MappingTrackSelector {
@Retention
(
RetentionPolicy
.
SOURCE
)
@Retention
(
RetentionPolicy
.
SOURCE
)
@Target
(
TYPE_USE
)
@Target
(
TYPE_USE
)
@IntDef
({
@IntDef
({
// Video
FIELD_EXCEED_VIDEO_CONSTRAINTS_IF_NECESSARY
,
FIELD_EXCEED_VIDEO_CONSTRAINTS_IF_NECESSARY
,
FIELD_ALLOW_VIDEO_MIXED_MIME_TYPE_ADAPTIVENESS
,
FIELD_ALLOW_VIDEO_MIXED_MIME_TYPE_ADAPTIVENESS
,
FIELD_ALLOW_VIDEO_NON_SEAMLESS_ADAPTIVENESS
,
FIELD_ALLOW_VIDEO_NON_SEAMLESS_ADAPTIVENESS
,
FIELD_ALLOW_VIDEO_MIXED_DECODER_SUPPORT_ADAPTIVENESS
,
// Audio
FIELD_EXCEED_AUDIO_CONSTRAINTS_IF_NCESSARY
,
FIELD_EXCEED_AUDIO_CONSTRAINTS_IF_NCESSARY
,
FIELD_ALLOW_AUDIO_MIXED_MIME_TYPE_ADAPTIVENESS
,
FIELD_ALLOW_AUDIO_MIXED_MIME_TYPE_ADAPTIVENESS
,
FIELD_ALLOW_AUDIO_MIXED_SAMPLE_RATE_ADAPTIVENESS
,
FIELD_ALLOW_AUDIO_MIXED_SAMPLE_RATE_ADAPTIVENESS
,
FIELD_ALLOW_AUDIO_MIXED_CHANNEL_COUNT_ADAPTIVENESS
,
FIELD_ALLOW_AUDIO_MIXED_CHANNEL_COUNT_ADAPTIVENESS
,
FIELD_DISABLED_TEXT_TRACK_SELECTION_FLAGS
,
FIELD_ALLOW_AUDIO_MIXED_DECODER_SUPPORT_ADAPTIVENESS
,
// General
FIELD_EXCEED_RENDERER_CAPABILITIES_IF_NECESSARY
,
FIELD_EXCEED_RENDERER_CAPABILITIES_IF_NECESSARY
,
FIELD_TUNNELING_ENABLED
,
FIELD_TUNNELING_ENABLED
,
FIELD_ALLOW_MULTIPLE_ADAPTIVE_SELECTIONS
,
FIELD_ALLOW_MULTIPLE_ADAPTIVE_SELECTIONS
,
// Overrides
FIELD_SELECTION_OVERRIDES_RENDERER_INDICES
,
FIELD_SELECTION_OVERRIDES_RENDERER_INDICES
,
FIELD_SELECTION_OVERRIDES_TRACK_GROUP_ARRAYS
,
FIELD_SELECTION_OVERRIDES_TRACK_GROUP_ARRAYS
,
FIELD_SELECTION_OVERRIDES
,
FIELD_SELECTION_OVERRIDES
,
FIELD_RENDERER_DISABLED_INDICES
,
FIELD_RENDERER_DISABLED_INDICES
,
FIELD_ALLOW_VIDEO_MIXED_DECODER_SUPPORT_ADAPTIVENESS
,
FIELD_ALLOW_AUDIO_MIXED_DECODER_SUPPORT_ADAPTIVENESS
})
})
private
@interface
FieldNumber
{}
private
@interface
FieldNumber
{}
...
@@ -1175,16 +1157,15 @@ public class DefaultTrackSelector extends MappingTrackSelector {
...
@@ -1175,16 +1157,15 @@ public class DefaultTrackSelector extends MappingTrackSelector {
private
static
final
int
FIELD_ALLOW_AUDIO_MIXED_MIME_TYPE_ADAPTIVENESS
=
1004
;
private
static
final
int
FIELD_ALLOW_AUDIO_MIXED_MIME_TYPE_ADAPTIVENESS
=
1004
;
private
static
final
int
FIELD_ALLOW_AUDIO_MIXED_SAMPLE_RATE_ADAPTIVENESS
=
1005
;
private
static
final
int
FIELD_ALLOW_AUDIO_MIXED_SAMPLE_RATE_ADAPTIVENESS
=
1005
;
private
static
final
int
FIELD_ALLOW_AUDIO_MIXED_CHANNEL_COUNT_ADAPTIVENESS
=
1006
;
private
static
final
int
FIELD_ALLOW_AUDIO_MIXED_CHANNEL_COUNT_ADAPTIVENESS
=
1006
;
private
static
final
int
FIELD_DISABLED_TEXT_TRACK_SELECTION_FLAGS
=
1007
;
private
static
final
int
FIELD_EXCEED_RENDERER_CAPABILITIES_IF_NECESSARY
=
1007
;
private
static
final
int
FIELD_EXCEED_RENDERER_CAPABILITIES_IF_NECESSARY
=
1008
;
private
static
final
int
FIELD_TUNNELING_ENABLED
=
1008
;
private
static
final
int
FIELD_TUNNELING_ENABLED
=
1009
;
private
static
final
int
FIELD_ALLOW_MULTIPLE_ADAPTIVE_SELECTIONS
=
1009
;
private
static
final
int
FIELD_ALLOW_MULTIPLE_ADAPTIVE_SELECTIONS
=
1010
;
private
static
final
int
FIELD_SELECTION_OVERRIDES_RENDERER_INDICES
=
1010
;
private
static
final
int
FIELD_SELECTION_OVERRIDES_RENDERER_INDICES
=
1011
;
private
static
final
int
FIELD_SELECTION_OVERRIDES_TRACK_GROUP_ARRAYS
=
1011
;
private
static
final
int
FIELD_SELECTION_OVERRIDES_TRACK_GROUP_ARRAYS
=
1012
;
private
static
final
int
FIELD_SELECTION_OVERRIDES
=
1012
;
private
static
final
int
FIELD_SELECTION_OVERRIDES
=
1013
;
private
static
final
int
FIELD_RENDERER_DISABLED_INDICES
=
1013
;
private
static
final
int
FIELD_RENDERER_DISABLED_INDICES
=
1014
;
private
static
final
int
FIELD_ALLOW_VIDEO_MIXED_DECODER_SUPPORT_ADAPTIVENESS
=
1014
;
private
static
final
int
FIELD_ALLOW_VIDEO_MIXED_DECODER_SUPPORT_ADAPTIVENESS
=
1015
;
private
static
final
int
FIELD_ALLOW_AUDIO_MIXED_DECODER_SUPPORT_ADAPTIVENESS
=
1015
;
private
static
final
int
FIELD_ALLOW_AUDIO_MIXED_DECODER_SUPPORT_ADAPTIVENESS
=
1016
;
@Override
@Override
public
Bundle
toBundle
()
{
public
Bundle
toBundle
()
{
...
@@ -1219,9 +1200,6 @@ public class DefaultTrackSelector extends MappingTrackSelector {
...
@@ -1219,9 +1200,6 @@ public class DefaultTrackSelector extends MappingTrackSelector {
bundle
.
putBoolean
(
bundle
.
putBoolean
(
keyForField
(
FIELD_ALLOW_AUDIO_MIXED_DECODER_SUPPORT_ADAPTIVENESS
),
keyForField
(
FIELD_ALLOW_AUDIO_MIXED_DECODER_SUPPORT_ADAPTIVENESS
),
allowAudioMixedDecoderSupportAdaptiveness
);
allowAudioMixedDecoderSupportAdaptiveness
);
// Text
bundle
.
putInt
(
keyForField
(
FIELD_DISABLED_TEXT_TRACK_SELECTION_FLAGS
),
disabledTextTrackSelectionFlags
);
// General
// General
bundle
.
putBoolean
(
bundle
.
putBoolean
(
keyForField
(
FIELD_EXCEED_RENDERER_CAPABILITIES_IF_NECESSARY
),
keyForField
(
FIELD_EXCEED_RENDERER_CAPABILITIES_IF_NECESSARY
),
...
@@ -2738,8 +2716,7 @@ public class DefaultTrackSelector extends MappingTrackSelector {
...
@@ -2738,8 +2716,7 @@ public class DefaultTrackSelector extends MappingTrackSelector {
super
(
rendererIndex
,
trackGroup
,
trackIndex
);
super
(
rendererIndex
,
trackGroup
,
trackIndex
);
isWithinRendererCapabilities
=
isWithinRendererCapabilities
=
isSupported
(
trackFormatSupport
,
/* allowExceedsCapabilities= */
false
);
isSupported
(
trackFormatSupport
,
/* allowExceedsCapabilities= */
false
);
int
maskedSelectionFlags
=
int
maskedSelectionFlags
=
format
.
selectionFlags
&
~
parameters
.
ignoredTextSelectionFlags
;
format
.
selectionFlags
&
~
parameters
.
disabledTextTrackSelectionFlags
;
isDefault
=
(
maskedSelectionFlags
&
C
.
SELECTION_FLAG_DEFAULT
)
!=
0
;
isDefault
=
(
maskedSelectionFlags
&
C
.
SELECTION_FLAG_DEFAULT
)
!=
0
;
isForced
=
(
maskedSelectionFlags
&
C
.
SELECTION_FLAG_FORCED
)
!=
0
;
isForced
=
(
maskedSelectionFlags
&
C
.
SELECTION_FLAG_FORCED
)
!=
0
;
int
bestLanguageIndex
=
Integer
.
MAX_VALUE
;
int
bestLanguageIndex
=
Integer
.
MAX_VALUE
;
...
...
library/core/src/test/java/com/google/android/exoplayer2/trackselection/DefaultTrackSelectorTest.java
View file @
9f7abd4f
...
@@ -1129,7 +1129,7 @@ public final class DefaultTrackSelectorTest {
...
@@ -1129,7 +1129,7 @@ public final class DefaultTrackSelectorTest {
// selected.
// selected.
trackGroups
=
wrapFormats
(
defaultOnly
,
noFlag
,
forcedOnly
,
forcedDefault
);
trackGroups
=
wrapFormats
(
defaultOnly
,
noFlag
,
forcedOnly
,
forcedDefault
);
trackSelector
.
setParameters
(
trackSelector
.
setParameters
(
defaultParameters
.
buildUpon
().
set
DisabledTextTrack
SelectionFlags
(
C
.
SELECTION_FLAG_DEFAULT
));
defaultParameters
.
buildUpon
().
set
IgnoredText
SelectionFlags
(
C
.
SELECTION_FLAG_DEFAULT
));
result
=
trackSelector
.
selectTracks
(
textRendererCapabilities
,
trackGroups
,
periodId
,
TIMELINE
);
result
=
trackSelector
.
selectTracks
(
textRendererCapabilities
,
trackGroups
,
periodId
,
TIMELINE
);
assertNoSelection
(
result
.
selections
[
0
]);
assertNoSelection
(
result
.
selections
[
0
]);
...
@@ -1140,8 +1140,7 @@ public final class DefaultTrackSelectorTest {
...
@@ -1140,8 +1140,7 @@ public final class DefaultTrackSelectorTest {
trackSelector
trackSelector
.
getParameters
()
.
getParameters
()
.
buildUpon
()
.
buildUpon
()
.
setDisabledTextTrackSelectionFlags
(
.
setIgnoredTextSelectionFlags
(
C
.
SELECTION_FLAG_DEFAULT
|
C
.
SELECTION_FLAG_FORCED
));
C
.
SELECTION_FLAG_DEFAULT
|
C
.
SELECTION_FLAG_FORCED
));
result
=
trackSelector
.
selectTracks
(
textRendererCapabilities
,
trackGroups
,
periodId
,
TIMELINE
);
result
=
trackSelector
.
selectTracks
(
textRendererCapabilities
,
trackGroups
,
periodId
,
TIMELINE
);
assertNoSelection
(
result
.
selections
[
0
]);
assertNoSelection
(
result
.
selections
[
0
]);
...
@@ -1159,7 +1158,7 @@ public final class DefaultTrackSelectorTest {
...
@@ -1159,7 +1158,7 @@ public final class DefaultTrackSelectorTest {
trackSelector
trackSelector
.
getParameters
()
.
getParameters
()
.
buildUpon
()
.
buildUpon
()
.
set
DisabledTextTrack
SelectionFlags
(
C
.
SELECTION_FLAG_DEFAULT
));
.
set
IgnoredText
SelectionFlags
(
C
.
SELECTION_FLAG_DEFAULT
));
result
=
trackSelector
.
selectTracks
(
textRendererCapabilities
,
trackGroups
,
periodId
,
TIMELINE
);
result
=
trackSelector
.
selectTracks
(
textRendererCapabilities
,
trackGroups
,
periodId
,
TIMELINE
);
assertFixedSelection
(
result
.
selections
[
0
],
trackGroups
,
noFlag
);
assertFixedSelection
(
result
.
selections
[
0
],
trackGroups
,
noFlag
);
}
}
...
@@ -2370,7 +2369,7 @@ public final class DefaultTrackSelectorTest {
...
@@ -2370,7 +2369,7 @@ public final class DefaultTrackSelectorTest {
.
setPreferredTextLanguages
(
"de"
,
"en"
)
.
setPreferredTextLanguages
(
"de"
,
"en"
)
.
setPreferredTextRoleFlags
(
C
.
ROLE_FLAG_CAPTION
)
.
setPreferredTextRoleFlags
(
C
.
ROLE_FLAG_CAPTION
)
.
setSelectUndeterminedTextLanguage
(
true
)
.
setSelectUndeterminedTextLanguage
(
true
)
.
set
DisabledTextTrack
SelectionFlags
(
C
.
SELECTION_FLAG_AUTOSELECT
)
.
set
IgnoredText
SelectionFlags
(
C
.
SELECTION_FLAG_AUTOSELECT
)
// General
// General
.
setForceLowestBitrate
(
false
)
.
setForceLowestBitrate
(
false
)
.
setForceHighestSupportedBitrate
(
true
)
.
setForceHighestSupportedBitrate
(
true
)
...
...
library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlView.java
View file @
9f7abd4f
...
@@ -59,6 +59,7 @@ import androidx.recyclerview.widget.LinearLayoutManager;
...
@@ -59,6 +59,7 @@ import androidx.recyclerview.widget.LinearLayoutManager;
import
androidx.recyclerview.widget.RecyclerView
;
import
androidx.recyclerview.widget.RecyclerView
;
import
com.google.android.exoplayer2.C
;
import
com.google.android.exoplayer2.C
;
import
com.google.android.exoplayer2.ExoPlayerLibraryInfo
;
import
com.google.android.exoplayer2.ExoPlayerLibraryInfo
;
import
com.google.android.exoplayer2.Format
;
import
com.google.android.exoplayer2.ForwardingPlayer
;
import
com.google.android.exoplayer2.ForwardingPlayer
;
import
com.google.android.exoplayer2.Player
;
import
com.google.android.exoplayer2.Player
;
import
com.google.android.exoplayer2.Player.Events
;
import
com.google.android.exoplayer2.Player.Events
;
...
@@ -1130,8 +1131,11 @@ public class StyledPlayerControlView extends FrameLayout {
...
@@ -1130,8 +1131,11 @@ public class StyledPlayerControlView extends FrameLayout {
if
(!
trackGroupInfo
.
isTrackSupported
(
trackIndex
))
{
if
(!
trackGroupInfo
.
isTrackSupported
(
trackIndex
))
{
continue
;
continue
;
}
}
String
trackName
=
Format
trackFormat
=
trackGroupInfo
.
getTrackFormat
(
trackIndex
);
trackNameProvider
.
getTrackName
(
trackGroupInfo
.
getTrackFormat
(
trackIndex
));
if
((
trackFormat
.
selectionFlags
&
C
.
SELECTION_FLAG_FORCED
)
!=
0
)
{
continue
;
}
String
trackName
=
trackNameProvider
.
getTrackName
(
trackFormat
);
tracks
.
add
(
new
TrackInformation
(
tracksInfo
,
trackGroupIndex
,
trackIndex
,
trackName
));
tracks
.
add
(
new
TrackInformation
(
tracksInfo
,
trackGroupIndex
,
trackIndex
,
trackName
));
}
}
}
}
...
@@ -1870,7 +1874,8 @@ public class StyledPlayerControlView extends FrameLayout {
...
@@ -1870,7 +1874,8 @@ public class StyledPlayerControlView extends FrameLayout {
player
.
setTrackSelectionParameters
(
player
.
setTrackSelectionParameters
(
trackSelectionParameters
trackSelectionParameters
.
buildUpon
()
.
buildUpon
()
.
setTrackTypeDisabled
(
C
.
TRACK_TYPE_TEXT
,
/* disabled= */
true
)
.
clearOverridesOfType
(
C
.
TRACK_TYPE_TEXT
)
.
setIgnoredTextSelectionFlags
(~
C
.
SELECTION_FLAG_FORCED
)
.
build
());
.
build
());
settingsWindow
.
dismiss
();
settingsWindow
.
dismiss
();
}
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment