Fix SequenceAssetLoader incorrectly reporting MediaItem change
Before this CL, if all the video (resp. audio) samples were fed before the audio (resp. video) output format was reported, the SequenceAssetLoader was incorrectly reporting a MediaItem change with a null format. PiperOrigin-RevId: 625978268
This commit is contained in:
parent
4aa2fb883f
commit
34c31b0a33
@ -82,12 +82,13 @@ import java.util.concurrent.atomic.AtomicInteger;
|
|||||||
private final Map<Integer, OnMediaItemChangedListener> mediaItemChangedListenersByTrackType;
|
private final Map<Integer, OnMediaItemChangedListener> mediaItemChangedListenersByTrackType;
|
||||||
|
|
||||||
private final ImmutableList.Builder<ExportResult.ProcessedInput> processedInputsBuilder;
|
private final ImmutableList.Builder<ExportResult.ProcessedInput> processedInputsBuilder;
|
||||||
private final AtomicInteger nonEndedTracks;
|
private final AtomicInteger reportedTrackCount;
|
||||||
|
private final AtomicInteger nonEndedTrackCount;
|
||||||
|
|
||||||
private boolean isCurrentAssetFirstAsset;
|
private boolean isCurrentAssetFirstAsset;
|
||||||
private int currentMediaItemIndex;
|
private int currentMediaItemIndex;
|
||||||
private AssetLoader currentAssetLoader;
|
private AssetLoader currentAssetLoader;
|
||||||
private boolean trackCountReported;
|
private boolean isTrackCountReported;
|
||||||
private boolean decodeAudio;
|
private boolean decodeAudio;
|
||||||
private boolean decodeVideo;
|
private boolean decodeVideo;
|
||||||
private int sequenceLoopCount;
|
private int sequenceLoopCount;
|
||||||
@ -118,7 +119,8 @@ import java.util.concurrent.atomic.AtomicInteger;
|
|||||||
sampleConsumersByTrackType = new HashMap<>();
|
sampleConsumersByTrackType = new HashMap<>();
|
||||||
mediaItemChangedListenersByTrackType = new HashMap<>();
|
mediaItemChangedListenersByTrackType = new HashMap<>();
|
||||||
processedInputsBuilder = new ImmutableList.Builder<>();
|
processedInputsBuilder = new ImmutableList.Builder<>();
|
||||||
nonEndedTracks = new AtomicInteger();
|
reportedTrackCount = new AtomicInteger();
|
||||||
|
nonEndedTrackCount = new AtomicInteger();
|
||||||
isCurrentAssetFirstAsset = true;
|
isCurrentAssetFirstAsset = true;
|
||||||
// It's safe to use "this" because we don't start the AssetLoader before exiting the
|
// It's safe to use "this" because we don't start the AssetLoader before exiting the
|
||||||
// constructor.
|
// constructor.
|
||||||
@ -217,12 +219,12 @@ import java.util.concurrent.atomic.AtomicInteger;
|
|||||||
return isAudio ? decodeAudio : decodeVideo;
|
return isAudio ? decodeAudio : decodeVideo;
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean addForcedAudioTrack = forceAudioTrack && nonEndedTracks.get() == 1 && !isAudio;
|
boolean addForcedAudioTrack = forceAudioTrack && reportedTrackCount.get() == 1 && !isAudio;
|
||||||
|
|
||||||
if (!trackCountReported) {
|
if (!isTrackCountReported) {
|
||||||
int trackCount = nonEndedTracks.get() + (addForcedAudioTrack ? 1 : 0);
|
int trackCount = reportedTrackCount.get() + (addForcedAudioTrack ? 1 : 0);
|
||||||
sequenceAssetLoaderListener.onTrackCount(trackCount);
|
sequenceAssetLoaderListener.onTrackCount(trackCount);
|
||||||
trackCountReported = true;
|
isTrackCountReported = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean decodeOutput =
|
boolean decodeOutput =
|
||||||
@ -257,7 +259,7 @@ import java.util.concurrent.atomic.AtomicInteger;
|
|||||||
sampleConsumer = new SampleConsumerWrapper(wrappedSampleConsumer);
|
sampleConsumer = new SampleConsumerWrapper(wrappedSampleConsumer);
|
||||||
sampleConsumersByTrackType.put(trackType, sampleConsumer);
|
sampleConsumersByTrackType.put(trackType, sampleConsumer);
|
||||||
|
|
||||||
if (forceAudioTrack && nonEndedTracks.get() == 1 && trackType == C.TRACK_TYPE_VIDEO) {
|
if (forceAudioTrack && reportedTrackCount.get() == 1 && trackType == C.TRACK_TYPE_VIDEO) {
|
||||||
SampleConsumer wrappedAudioSampleConsumer =
|
SampleConsumer wrappedAudioSampleConsumer =
|
||||||
checkStateNotNull(
|
checkStateNotNull(
|
||||||
sequenceAssetLoaderListener.onOutputFormat(
|
sequenceAssetLoaderListener.onOutputFormat(
|
||||||
@ -272,7 +274,7 @@ import java.util.concurrent.atomic.AtomicInteger;
|
|||||||
} else {
|
} else {
|
||||||
// TODO(b/270533049): Remove the check below when implementing blank video frames generation.
|
// TODO(b/270533049): Remove the check below when implementing blank video frames generation.
|
||||||
boolean videoTrackDisappeared =
|
boolean videoTrackDisappeared =
|
||||||
nonEndedTracks.get() == 1
|
reportedTrackCount.get() == 1
|
||||||
&& trackType == C.TRACK_TYPE_AUDIO
|
&& trackType == C.TRACK_TYPE_AUDIO
|
||||||
&& sampleConsumersByTrackType.size() == 2;
|
&& sampleConsumersByTrackType.size() == 2;
|
||||||
checkState(
|
checkState(
|
||||||
@ -290,7 +292,7 @@ import java.util.concurrent.atomic.AtomicInteger;
|
|||||||
trackType));
|
trackType));
|
||||||
}
|
}
|
||||||
onMediaItemChanged(trackType, format);
|
onMediaItemChanged(trackType, format);
|
||||||
if (nonEndedTracks.get() == 1 && sampleConsumersByTrackType.size() == 2) {
|
if (reportedTrackCount.get() == 1 && sampleConsumersByTrackType.size() == 2) {
|
||||||
for (Map.Entry<Integer, SampleConsumerWrapper> entry :
|
for (Map.Entry<Integer, SampleConsumerWrapper> entry :
|
||||||
sampleConsumersByTrackType.entrySet()) {
|
sampleConsumersByTrackType.entrySet()) {
|
||||||
int outputTrackType = entry.getKey();
|
int outputTrackType = entry.getKey();
|
||||||
@ -352,7 +354,8 @@ import java.util.concurrent.atomic.AtomicInteger;
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onTrackCount(int trackCount) {
|
public void onTrackCount(int trackCount) {
|
||||||
nonEndedTracks.set(trackCount);
|
reportedTrackCount.set(trackCount);
|
||||||
|
nonEndedTrackCount.set(trackCount);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -392,17 +395,17 @@ import java.util.concurrent.atomic.AtomicInteger;
|
|||||||
// SampleConsumer so there is no need to handle the case where the sample wasn't queued.
|
// SampleConsumer so there is no need to handle the case where the sample wasn't queued.
|
||||||
checkState(sampleConsumer.queueInputBuffer());
|
checkState(sampleConsumer.queueInputBuffer());
|
||||||
audioLoopingEnded = true;
|
audioLoopingEnded = true;
|
||||||
nonEndedTracks.decrementAndGet();
|
nonEndedTrackCount.decrementAndGet();
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (inputBuffer.isEndOfStream()) {
|
if (inputBuffer.isEndOfStream()) {
|
||||||
nonEndedTracks.decrementAndGet();
|
nonEndedTrackCount.decrementAndGet();
|
||||||
if (currentMediaItemIndex < editedMediaItems.size() - 1 || isLooping) {
|
if (currentMediaItemIndex < editedMediaItems.size() - 1 || isLooping) {
|
||||||
inputBuffer.clear();
|
inputBuffer.clear();
|
||||||
inputBuffer.timeUs = 0;
|
inputBuffer.timeUs = 0;
|
||||||
if (nonEndedTracks.get() == 0) {
|
if (nonEndedTrackCount.get() == 0) {
|
||||||
switchAssetLoader();
|
switchAssetLoader();
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
@ -487,12 +490,12 @@ import java.util.concurrent.atomic.AtomicInteger;
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void signalEndOfVideoInput() {
|
public void signalEndOfVideoInput() {
|
||||||
nonEndedTracks.decrementAndGet();
|
nonEndedTrackCount.decrementAndGet();
|
||||||
boolean videoEnded =
|
boolean videoEnded =
|
||||||
isLooping ? videoLoopingEnded : currentMediaItemIndex == editedMediaItems.size() - 1;
|
isLooping ? videoLoopingEnded : currentMediaItemIndex == editedMediaItems.size() - 1;
|
||||||
if (videoEnded) {
|
if (videoEnded) {
|
||||||
sampleConsumer.signalEndOfVideoInput();
|
sampleConsumer.signalEndOfVideoInput();
|
||||||
} else if (nonEndedTracks.get() == 0) {
|
} else if (nonEndedTrackCount.get() == 0) {
|
||||||
switchAssetLoader();
|
switchAssetLoader();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user