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
2cb4e3d7
authored
Jan 19, 2023
by
kimvde
Committed by
christosts
Jan 23, 2023
Browse files
Options
_('Browse Files')
Download
Email Patches
Plain Diff
Remove usages of deprecated startTransformation
PiperOrigin-RevId: 503138745
parent
f15b7525
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
315 additions
and
203 deletions
demos/transformer/src/main/java/androidx/media3/demo/transformer/TransformerActivity.java
libraries/transformer/src/androidTest/java/androidx/media3/transformer/TransformerAndroidTestRunner.java
libraries/transformer/src/androidTest/java/androidx/media3/transformer/TransformerEndToEndTest.java
libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/HdrEditingTest.java
libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/RepeatedTranscodeTest.java
libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/ToneMapHdrToSdrUsingMediaCodecTest.java
libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/TransformationTest.java
libraries/transformer/src/test/java/androidx/media3/transformer/TransformerEndToEndTest.java
demos/transformer/src/main/java/androidx/media3/demo/transformer/TransformerActivity.java
View file @
2cb4e3d7
...
@@ -74,6 +74,8 @@ import androidx.media3.exoplayer.audio.SilenceSkippingAudioProcessor;
...
@@ -74,6 +74,8 @@ import androidx.media3.exoplayer.audio.SilenceSkippingAudioProcessor;
import
androidx.media3.exoplayer.util.DebugTextViewHelper
;
import
androidx.media3.exoplayer.util.DebugTextViewHelper
;
import
androidx.media3.transformer.DefaultEncoderFactory
;
import
androidx.media3.transformer.DefaultEncoderFactory
;
import
androidx.media3.transformer.DefaultMuxer
;
import
androidx.media3.transformer.DefaultMuxer
;
import
androidx.media3.transformer.EditedMediaItem
;
import
androidx.media3.transformer.Effects
;
import
androidx.media3.transformer.ProgressHolder
;
import
androidx.media3.transformer.ProgressHolder
;
import
androidx.media3.transformer.TransformationException
;
import
androidx.media3.transformer.TransformationException
;
import
androidx.media3.transformer.TransformationRequest
;
import
androidx.media3.transformer.TransformationRequest
;
...
@@ -207,8 +209,9 @@ public final class TransformerActivity extends AppCompatActivity {
...
@@ -207,8 +209,9 @@ public final class TransformerActivity extends AppCompatActivity {
MediaItem
mediaItem
=
createMediaItem
(
bundle
,
uri
);
MediaItem
mediaItem
=
createMediaItem
(
bundle
,
uri
);
try
{
try
{
Transformer
transformer
=
createTransformer
(
bundle
,
filePath
);
Transformer
transformer
=
createTransformer
(
bundle
,
filePath
);
EditedMediaItem
editedMediaItem
=
createEditedMediaItem
(
mediaItem
,
bundle
);
transformationStopwatch
.
start
();
transformationStopwatch
.
start
();
transformer
.
startTransformation
(
m
ediaItem
,
filePath
);
transformer
.
startTransformation
(
editedM
ediaItem
,
filePath
);
this
.
transformer
=
transformer
;
this
.
transformer
=
transformer
;
}
catch
(
PackageManager
.
NameNotFoundException
e
)
{
}
catch
(
PackageManager
.
NameNotFoundException
e
)
{
throw
new
IllegalStateException
(
e
);
throw
new
IllegalStateException
(
e
);
...
@@ -265,8 +268,7 @@ public final class TransformerActivity extends AppCompatActivity {
...
@@ -265,8 +268,7 @@ public final class TransformerActivity extends AppCompatActivity {
"progressViewGroup"
,
"progressViewGroup"
,
"debugFrame"
,
"debugFrame"
,
})
})
private
Transformer
createTransformer
(
@Nullable
Bundle
bundle
,
String
filePath
)
private
Transformer
createTransformer
(
@Nullable
Bundle
bundle
,
String
filePath
)
{
throws
PackageManager
.
NameNotFoundException
{
Transformer
.
Builder
transformerBuilder
=
new
Transformer
.
Builder
(
/* context= */
this
);
Transformer
.
Builder
transformerBuilder
=
new
Transformer
.
Builder
(
/* context= */
this
);
if
(
bundle
!=
null
)
{
if
(
bundle
!=
null
)
{
TransformationRequest
.
Builder
requestBuilder
=
new
TransformationRequest
.
Builder
();
TransformationRequest
.
Builder
requestBuilder
=
new
TransformationRequest
.
Builder
();
...
@@ -283,29 +285,6 @@ public final class TransformerActivity extends AppCompatActivity {
...
@@ -283,29 +285,6 @@ public final class TransformerActivity extends AppCompatActivity {
requestBuilder
.
setHdrMode
(
bundle
.
getInt
(
ConfigurationActivity
.
HDR_MODE
));
requestBuilder
.
setHdrMode
(
bundle
.
getInt
(
ConfigurationActivity
.
HDR_MODE
));
transformerBuilder
.
setTransformationRequest
(
requestBuilder
.
build
());
transformerBuilder
.
setTransformationRequest
(
requestBuilder
.
build
());
transformerBuilder
.
setAudioProcessors
(
createAudioProcessorsFromBundle
(
bundle
));
ImmutableList
.
Builder
<
Effect
>
effectsListBuilder
=
new
ImmutableList
.
Builder
<
Effect
>().
addAll
(
createVideoEffectsFromBundle
(
bundle
));
float
scaleX
=
bundle
.
getFloat
(
ConfigurationActivity
.
SCALE_X
,
/* defaultValue= */
1
);
float
scaleY
=
bundle
.
getFloat
(
ConfigurationActivity
.
SCALE_Y
,
/* defaultValue= */
1
);
float
rotateDegrees
=
bundle
.
getFloat
(
ConfigurationActivity
.
ROTATE_DEGREES
,
/* defaultValue= */
0
);
if
(
scaleX
!=
1
f
||
scaleY
!=
1
f
||
rotateDegrees
!=
0
f
)
{
effectsListBuilder
.
add
(
new
ScaleToFitTransformation
.
Builder
()
.
setScale
(
scaleX
,
scaleY
)
.
setRotationDegrees
(
rotateDegrees
)
.
build
());
}
int
resolutionHeight
=
bundle
.
getInt
(
ConfigurationActivity
.
RESOLUTION_HEIGHT
,
/* defaultValue= */
C
.
LENGTH_UNSET
);
if
(
resolutionHeight
!=
C
.
LENGTH_UNSET
)
{
effectsListBuilder
.
add
(
Presentation
.
createForHeight
(
resolutionHeight
));
}
transformerBuilder
.
setVideoEffects
(
effectsListBuilder
.
build
());
transformerBuilder
transformerBuilder
.
setRemoveAudio
(
bundle
.
getBoolean
(
ConfigurationActivity
.
SHOULD_REMOVE_AUDIO
))
.
setRemoveAudio
(
bundle
.
getBoolean
(
ConfigurationActivity
.
SHOULD_REMOVE_AUDIO
))
.
setRemoveVideo
(
bundle
.
getBoolean
(
ConfigurationActivity
.
SHOULD_REMOVE_VIDEO
))
.
setRemoveVideo
(
bundle
.
getBoolean
(
ConfigurationActivity
.
SHOULD_REMOVE_VIDEO
))
...
@@ -358,6 +337,24 @@ public final class TransformerActivity extends AppCompatActivity {
...
@@ -358,6 +337,24 @@ public final class TransformerActivity extends AppCompatActivity {
return
file
;
return
file
;
}
}
@RequiresNonNull
({
"inputCardView"
,
"outputPlayerView"
,
"transformationStopwatch"
,
"progressViewGroup"
,
})
private
EditedMediaItem
createEditedMediaItem
(
MediaItem
mediaItem
,
@Nullable
Bundle
bundle
)
throws
PackageManager
.
NameNotFoundException
{
if
(
bundle
==
null
)
{
return
new
EditedMediaItem
(
mediaItem
);
}
ImmutableList
<
AudioProcessor
>
audioProcessors
=
createAudioProcessorsFromBundle
(
bundle
);
ImmutableList
<
Effect
>
videoEffects
=
createVideoEffectsFromBundle
(
bundle
);
Effects
effects
=
new
Effects
(
audioProcessors
,
videoEffects
);
return
new
EditedMediaItem
(
mediaItem
,
effects
);
}
private
ImmutableList
<
AudioProcessor
>
createAudioProcessorsFromBundle
(
Bundle
bundle
)
{
private
ImmutableList
<
AudioProcessor
>
createAudioProcessorsFromBundle
(
Bundle
bundle
)
{
@Nullable
@Nullable
boolean
[]
selectedAudioEffects
=
boolean
[]
selectedAudioEffects
=
...
@@ -518,6 +515,24 @@ public final class TransformerActivity extends AppCompatActivity {
...
@@ -518,6 +515,24 @@ public final class TransformerActivity extends AppCompatActivity {
effects
.
add
(
overlayEffect
);
effects
.
add
(
overlayEffect
);
}
}
float
scaleX
=
bundle
.
getFloat
(
ConfigurationActivity
.
SCALE_X
,
/* defaultValue= */
1
);
float
scaleY
=
bundle
.
getFloat
(
ConfigurationActivity
.
SCALE_Y
,
/* defaultValue= */
1
);
float
rotateDegrees
=
bundle
.
getFloat
(
ConfigurationActivity
.
ROTATE_DEGREES
,
/* defaultValue= */
0
);
if
(
scaleX
!=
1
f
||
scaleY
!=
1
f
||
rotateDegrees
!=
0
f
)
{
effects
.
add
(
new
ScaleToFitTransformation
.
Builder
()
.
setScale
(
scaleX
,
scaleY
)
.
setRotationDegrees
(
rotateDegrees
)
.
build
());
}
int
resolutionHeight
=
bundle
.
getInt
(
ConfigurationActivity
.
RESOLUTION_HEIGHT
,
/* defaultValue= */
C
.
LENGTH_UNSET
);
if
(
resolutionHeight
!=
C
.
LENGTH_UNSET
)
{
effects
.
add
(
Presentation
.
createForHeight
(
resolutionHeight
));
}
return
effects
.
build
();
return
effects
.
build
();
}
}
...
...
libraries/transformer/src/androidTest/java/androidx/media3/transformer/TransformerAndroidTestRunner.java
View file @
2cb4e3d7
...
@@ -183,12 +183,26 @@ public class TransformerAndroidTestRunner {
...
@@ -183,12 +183,26 @@ public class TransformerAndroidTestRunner {
* @throws Exception The cause of the transformation not completing.
* @throws Exception The cause of the transformation not completing.
*/
*/
public
TransformationTestResult
run
(
String
testId
,
MediaItem
mediaItem
)
throws
Exception
{
public
TransformationTestResult
run
(
String
testId
,
MediaItem
mediaItem
)
throws
Exception
{
return
run
(
testId
,
new
EditedMediaItem
(
mediaItem
));
}
/**
* Transforms the {@link EditedMediaItem}, saving a summary of the transformation to the
* application cache.
*
* @param testId A unique identifier for the transformer test run.
* @param editedMediaItem The {@link EditedMediaItem} to transform.
* @return The {@link TransformationTestResult}.
* @throws Exception The cause of the transformation not completing.
*/
public
TransformationTestResult
run
(
String
testId
,
EditedMediaItem
editedMediaItem
)
throws
Exception
{
JSONObject
resultJson
=
new
JSONObject
();
JSONObject
resultJson
=
new
JSONObject
();
if
(
inputValues
!=
null
)
{
if
(
inputValues
!=
null
)
{
resultJson
.
put
(
"inputValues"
,
JSONObject
.
wrap
(
inputValues
));
resultJson
.
put
(
"inputValues"
,
JSONObject
.
wrap
(
inputValues
));
}
}
try
{
try
{
TransformationTestResult
transformationTestResult
=
runInternal
(
testId
,
m
ediaItem
);
TransformationTestResult
transformationTestResult
=
runInternal
(
testId
,
editedM
ediaItem
);
resultJson
.
put
(
"transformationResult"
,
transformationTestResult
.
asJsonObject
());
resultJson
.
put
(
"transformationResult"
,
transformationTestResult
.
asJsonObject
());
if
(
transformationTestResult
.
testException
!=
null
)
{
if
(
transformationTestResult
.
testException
!=
null
)
{
throw
transformationTestResult
.
testException
;
throw
transformationTestResult
.
testException
;
...
@@ -208,17 +222,18 @@ public class TransformerAndroidTestRunner {
...
@@ -208,17 +222,18 @@ public class TransformerAndroidTestRunner {
}
}
/**
/**
* Transforms the {@link MediaItem}.
* Transforms the {@link
Edited
MediaItem}.
*
*
* @param testId An identifier for the test.
* @param testId An identifier for the test.
* @param
mediaItem The {@link
MediaItem} to transform.
* @param
editedMediaItem The {@link Edited
MediaItem} to transform.
* @return The {@link TransformationTestResult}.
* @return The {@link TransformationTestResult}.
* @throws InterruptedException If the thread is interrupted whilst waiting for transformer to
* @throws InterruptedException If the thread is interrupted whilst waiting for transformer to
* complete.
* complete.
* @throws IOException If an error occurs opening the output file for writing.
* @throws IOException If an error occurs opening the output file for writing.
*/
*/
private
TransformationTestResult
runInternal
(
String
testId
,
MediaItem
m
ediaItem
)
private
TransformationTestResult
runInternal
(
String
testId
,
EditedMediaItem
editedM
ediaItem
)
throws
InterruptedException
,
IOException
{
throws
InterruptedException
,
IOException
{
MediaItem
mediaItem
=
editedMediaItem
.
mediaItem
;
if
(!
mediaItem
.
clippingConfiguration
.
equals
(
MediaItem
.
ClippingConfiguration
.
UNSET
)
if
(!
mediaItem
.
clippingConfiguration
.
equals
(
MediaItem
.
ClippingConfiguration
.
UNSET
)
&&
requestCalculateSsim
)
{
&&
requestCalculateSsim
)
{
throw
new
UnsupportedOperationException
(
throw
new
UnsupportedOperationException
(
...
@@ -293,7 +308,8 @@ public class TransformerAndroidTestRunner {
...
@@ -293,7 +308,8 @@ public class TransformerAndroidTestRunner {
.
runOnMainSync
(
.
runOnMainSync
(
()
->
{
()
->
{
try
{
try
{
testTransformer
.
startTransformation
(
mediaItem
,
outputVideoFile
.
getAbsolutePath
());
testTransformer
.
startTransformation
(
editedMediaItem
,
outputVideoFile
.
getAbsolutePath
());
// Catch all exceptions to report. Exceptions thrown here and not caught will NOT
// Catch all exceptions to report. Exceptions thrown here and not caught will NOT
// propagate.
// propagate.
}
catch
(
Exception
e
)
{
}
catch
(
Exception
e
)
{
...
...
libraries/transformer/src/androidTest/java/androidx/media3/transformer/TransformerEndToEndTest.java
View file @
2cb4e3d7
...
@@ -22,6 +22,7 @@ import static org.junit.Assert.assertThrows;
...
@@ -22,6 +22,7 @@ import static org.junit.Assert.assertThrows;
import
android.content.Context
;
import
android.content.Context
;
import
android.net.Uri
;
import
android.net.Uri
;
import
androidx.media3.common.Effect
;
import
androidx.media3.common.Format
;
import
androidx.media3.common.Format
;
import
androidx.media3.common.MediaItem
;
import
androidx.media3.common.MediaItem
;
import
androidx.media3.effect.Presentation
;
import
androidx.media3.effect.Presentation
;
...
@@ -44,10 +45,13 @@ public class TransformerEndToEndTest {
...
@@ -44,10 +45,13 @@ public class TransformerEndToEndTest {
public
void
videoEditing_completesWithConsistentFrameCount
()
throws
Exception
{
public
void
videoEditing_completesWithConsistentFrameCount
()
throws
Exception
{
Transformer
transformer
=
Transformer
transformer
=
new
Transformer
.
Builder
(
context
)
new
Transformer
.
Builder
(
context
)
.
setVideoEffects
(
ImmutableList
.
of
(
Presentation
.
createForHeight
(
480
)))
.
setEncoderFactory
(
.
setEncoderFactory
(
new
DefaultEncoderFactory
.
Builder
(
context
).
setEnableFallback
(
false
).
build
())
new
DefaultEncoderFactory
.
Builder
(
context
).
setEnableFallback
(
false
).
build
())
.
build
();
.
build
();
MediaItem
mediaItem
=
MediaItem
.
fromUri
(
Uri
.
parse
(
MP4_ASSET_URI_STRING
));
ImmutableList
<
Effect
>
videoEffects
=
ImmutableList
.
of
(
Presentation
.
createForHeight
(
480
));
Effects
effects
=
new
Effects
(
/* audioProcessors= */
ImmutableList
.
of
(),
videoEffects
);
EditedMediaItem
editedMediaItem
=
new
EditedMediaItem
(
mediaItem
,
effects
);
// Result of the following command:
// Result of the following command:
// ffprobe -count_frames -select_streams v:0 -show_entries stream=nb_read_frames sample.mp4
// ffprobe -count_frames -select_streams v:0 -show_entries stream=nb_read_frames sample.mp4
int
expectedFrameCount
=
30
;
int
expectedFrameCount
=
30
;
...
@@ -55,9 +59,7 @@ public class TransformerEndToEndTest {
...
@@ -55,9 +59,7 @@ public class TransformerEndToEndTest {
TransformationTestResult
result
=
TransformationTestResult
result
=
new
TransformerAndroidTestRunner
.
Builder
(
context
,
transformer
)
new
TransformerAndroidTestRunner
.
Builder
(
context
,
transformer
)
.
build
()
.
build
()
.
run
(
.
run
(
/* testId= */
"videoEditing_completesWithConsistentFrameCount"
,
editedMediaItem
);
/* testId= */
"videoEditing_completesWithConsistentFrameCount"
,
MediaItem
.
fromUri
(
Uri
.
parse
(
MP4_ASSET_URI_STRING
)));
assertThat
(
result
.
transformationResult
.
videoFrameCount
).
isEqualTo
(
expectedFrameCount
);
assertThat
(
result
.
transformationResult
.
videoFrameCount
).
isEqualTo
(
expectedFrameCount
);
}
}
...
@@ -67,18 +69,19 @@ public class TransformerEndToEndTest {
...
@@ -67,18 +69,19 @@ public class TransformerEndToEndTest {
Transformer
transformer
=
Transformer
transformer
=
new
Transformer
.
Builder
(
context
)
new
Transformer
.
Builder
(
context
)
.
setRemoveAudio
(
true
)
.
setRemoveAudio
(
true
)
.
setVideoEffects
(
ImmutableList
.
of
(
Presentation
.
createForHeight
(
480
)))
.
setEncoderFactory
(
.
setEncoderFactory
(
new
DefaultEncoderFactory
.
Builder
(
context
).
setEnableFallback
(
false
).
build
())
new
DefaultEncoderFactory
.
Builder
(
context
).
setEnableFallback
(
false
).
build
())
.
build
();
.
build
();
MediaItem
mediaItem
=
MediaItem
.
fromUri
(
Uri
.
parse
(
MP4_ASSET_URI_STRING
));
ImmutableList
<
Effect
>
videoEffects
=
ImmutableList
.
of
(
Presentation
.
createForHeight
(
480
));
Effects
effects
=
new
Effects
(
/* audioProcessors= */
ImmutableList
.
of
(),
videoEffects
);
EditedMediaItem
editedMediaItem
=
new
EditedMediaItem
(
mediaItem
,
effects
);
long
expectedDurationMs
=
967
;
long
expectedDurationMs
=
967
;
TransformationTestResult
result
=
TransformationTestResult
result
=
new
TransformerAndroidTestRunner
.
Builder
(
context
,
transformer
)
new
TransformerAndroidTestRunner
.
Builder
(
context
,
transformer
)
.
build
()
.
build
()
.
run
(
.
run
(
/* testId= */
"videoOnly_completesWithConsistentDuration"
,
editedMediaItem
);
/* testId= */
"videoOnly_completesWithConsistentDuration"
,
MediaItem
.
fromUri
(
Uri
.
parse
(
MP4_ASSET_URI_STRING
)));
assertThat
(
result
.
transformationResult
.
durationMs
).
isEqualTo
(
expectedDurationMs
);
assertThat
(
result
.
transformationResult
.
durationMs
).
isEqualTo
(
expectedDurationMs
);
}
}
...
...
libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/HdrEditingTest.java
View file @
2cb4e3d7
...
@@ -28,10 +28,13 @@ import android.content.Context;
...
@@ -28,10 +28,13 @@ import android.content.Context;
import
android.net.Uri
;
import
android.net.Uri
;
import
androidx.media3.common.C
;
import
androidx.media3.common.C
;
import
androidx.media3.common.ColorInfo
;
import
androidx.media3.common.ColorInfo
;
import
androidx.media3.common.Effect
;
import
androidx.media3.common.MediaItem
;
import
androidx.media3.common.MediaItem
;
import
androidx.media3.common.util.Log
;
import
androidx.media3.common.util.Log
;
import
androidx.media3.common.util.Util
;
import
androidx.media3.common.util.Util
;
import
androidx.media3.effect.ScaleToFitTransformation
;
import
androidx.media3.effect.ScaleToFitTransformation
;
import
androidx.media3.transformer.EditedMediaItem
;
import
androidx.media3.transformer.Effects
;
import
androidx.media3.transformer.EncoderUtil
;
import
androidx.media3.transformer.EncoderUtil
;
import
androidx.media3.transformer.TransformationException
;
import
androidx.media3.transformer.TransformationException
;
import
androidx.media3.transformer.TransformationRequest
;
import
androidx.media3.transformer.TransformationRequest
;
...
@@ -79,7 +82,6 @@ public class HdrEditingTest {
...
@@ -79,7 +82,6 @@ public class HdrEditingTest {
.
run
(
testId
,
MediaItem
.
fromUri
(
Uri
.
parse
(
MP4_ASSET_1080P_4_SECOND_HDR10
)));
.
run
(
testId
,
MediaItem
.
fromUri
(
Uri
.
parse
(
MP4_ASSET_1080P_4_SECOND_HDR10
)));
Log
.
i
(
TAG
,
"Transformed."
);
Log
.
i
(
TAG
,
"Transformed."
);
assertFileHasColorTransfer
(
transformationTestResult
.
filePath
,
C
.
COLOR_TRANSFER_ST2084
);
assertFileHasColorTransfer
(
transformationTestResult
.
filePath
,
C
.
COLOR_TRANSFER_ST2084
);
return
;
}
catch
(
TransformationException
exception
)
{
}
catch
(
TransformationException
exception
)
{
Log
.
i
(
TAG
,
checkNotNull
(
exception
.
getCause
()).
toString
());
Log
.
i
(
TAG
,
checkNotNull
(
exception
.
getCause
()).
toString
());
assertThat
(
exception
).
hasCauseThat
().
isInstanceOf
(
IllegalArgumentException
.
class
);
assertThat
(
exception
).
hasCauseThat
().
isInstanceOf
(
IllegalArgumentException
.
class
);
...
@@ -102,7 +104,6 @@ public class HdrEditingTest {
...
@@ -102,7 +104,6 @@ public class HdrEditingTest {
.
run
(
testId
,
MediaItem
.
fromUri
(
Uri
.
parse
(
MP4_ASSET_1080P_5_SECOND_HLG10
)));
.
run
(
testId
,
MediaItem
.
fromUri
(
Uri
.
parse
(
MP4_ASSET_1080P_5_SECOND_HLG10
)));
Log
.
i
(
TAG
,
"Transformed."
);
Log
.
i
(
TAG
,
"Transformed."
);
assertFileHasColorTransfer
(
transformationTestResult
.
filePath
,
C
.
COLOR_TRANSFER_HLG
);
assertFileHasColorTransfer
(
transformationTestResult
.
filePath
,
C
.
COLOR_TRANSFER_HLG
);
return
;
}
catch
(
TransformationException
exception
)
{
}
catch
(
TransformationException
exception
)
{
Log
.
i
(
TAG
,
checkNotNull
(
exception
.
getCause
()).
toString
());
Log
.
i
(
TAG
,
checkNotNull
(
exception
.
getCause
()).
toString
());
assertThat
(
exception
).
hasCauseThat
().
isInstanceOf
(
IllegalArgumentException
.
class
);
assertThat
(
exception
).
hasCauseThat
().
isInstanceOf
(
IllegalArgumentException
.
class
);
...
@@ -121,17 +122,17 @@ public class HdrEditingTest {
...
@@ -121,17 +122,17 @@ public class HdrEditingTest {
return
;
return
;
}
}
Transformer
transformer
=
Transformer
transformer
=
new
Transformer
.
Builder
(
context
).
build
();
new
Transformer
.
Builder
(
context
)
MediaItem
mediaItem
=
MediaItem
.
fromUri
(
Uri
.
parse
(
MP4_ASSET_1080P_4_SECOND_HDR10
));
.
setVideoEffects
(
ImmutableList
<
Effect
>
videoEffects
=
ImmutableList
.
of
(
ImmutableList
.
of
(
new
ScaleToFitTransformation
.
Builder
().
setRotationDegrees
(
180
).
build
());
new
ScaleToFitTransformation
.
Builder
().
setRotationDegrees
(
180
).
build
()))
Effects
effects
=
new
Effects
(
/* audioProcessors= */
ImmutableList
.
of
(),
videoEffects
);
.
build
(
);
EditedMediaItem
editedMediaItem
=
new
EditedMediaItem
(
mediaItem
,
effects
);
TransformationTestResult
transformationTestResult
=
TransformationTestResult
transformationTestResult
=
new
TransformerAndroidTestRunner
.
Builder
(
context
,
transformer
)
new
TransformerAndroidTestRunner
.
Builder
(
context
,
transformer
)
.
build
()
.
build
()
.
run
(
testId
,
MediaItem
.
fromUri
(
Uri
.
parse
(
MP4_ASSET_1080P_4_SECOND_HDR10
))
);
.
run
(
testId
,
editedMediaItem
);
assertFileHasColorTransfer
(
transformationTestResult
.
filePath
,
C
.
COLOR_TRANSFER_ST2084
);
assertFileHasColorTransfer
(
transformationTestResult
.
filePath
,
C
.
COLOR_TRANSFER_ST2084
);
}
}
...
@@ -145,17 +146,17 @@ public class HdrEditingTest {
...
@@ -145,17 +146,17 @@ public class HdrEditingTest {
return
;
return
;
}
}
Transformer
transformer
=
Transformer
transformer
=
new
Transformer
.
Builder
(
context
).
build
();
new
Transformer
.
Builder
(
context
)
MediaItem
mediaItem
=
MediaItem
.
fromUri
(
Uri
.
parse
(
MP4_ASSET_1080P_5_SECOND_HLG10
));
.
setVideoEffects
(
ImmutableList
<
Effect
>
videoEffects
=
ImmutableList
.
of
(
ImmutableList
.
of
(
new
ScaleToFitTransformation
.
Builder
().
setRotationDegrees
(
180
).
build
());
new
ScaleToFitTransformation
.
Builder
().
setRotationDegrees
(
180
).
build
()))
Effects
effects
=
new
Effects
(
/* audioProcessors= */
ImmutableList
.
of
(),
videoEffects
);
.
build
(
);
EditedMediaItem
editedMediaItem
=
new
EditedMediaItem
(
mediaItem
,
effects
);
TransformationTestResult
transformationTestResult
=
TransformationTestResult
transformationTestResult
=
new
TransformerAndroidTestRunner
.
Builder
(
context
,
transformer
)
new
TransformerAndroidTestRunner
.
Builder
(
context
,
transformer
)
.
build
()
.
build
()
.
run
(
testId
,
MediaItem
.
fromUri
(
Uri
.
parse
(
MP4_ASSET_1080P_5_SECOND_HLG10
))
);
.
run
(
testId
,
editedMediaItem
);
assertFileHasColorTransfer
(
transformationTestResult
.
filePath
,
C
.
COLOR_TRANSFER_HLG
);
assertFileHasColorTransfer
(
transformationTestResult
.
filePath
,
C
.
COLOR_TRANSFER_HLG
);
}
}
...
@@ -173,9 +174,6 @@ public class HdrEditingTest {
...
@@ -173,9 +174,6 @@ public class HdrEditingTest {
AtomicBoolean
isToneMappingFallbackApplied
=
new
AtomicBoolean
();
AtomicBoolean
isToneMappingFallbackApplied
=
new
AtomicBoolean
();
Transformer
transformer
=
Transformer
transformer
=
new
Transformer
.
Builder
(
context
)
new
Transformer
.
Builder
(
context
)
.
setVideoEffects
(
ImmutableList
.
of
(
new
ScaleToFitTransformation
.
Builder
().
setRotationDegrees
(
180
).
build
()))
.
addListener
(
.
addListener
(
new
Transformer
.
Listener
()
{
new
Transformer
.
Listener
()
{
@Override
@Override
...
@@ -192,12 +190,17 @@ public class HdrEditingTest {
...
@@ -192,12 +190,17 @@ public class HdrEditingTest {
}
}
})
})
.
build
();
.
build
();
MediaItem
mediaItem
=
MediaItem
.
fromUri
(
Uri
.
parse
(
MP4_ASSET_1080P_4_SECOND_HDR10
));
ImmutableList
<
Effect
>
videoEffects
=
ImmutableList
.
of
(
new
ScaleToFitTransformation
.
Builder
().
setRotationDegrees
(
180
).
build
());
Effects
effects
=
new
Effects
(
/* audioProcessors= */
ImmutableList
.
of
(),
videoEffects
);
EditedMediaItem
editedMediaItem
=
new
EditedMediaItem
(
mediaItem
,
effects
);
try
{
try
{
TransformationTestResult
transformationTestResult
=
TransformationTestResult
transformationTestResult
=
new
TransformerAndroidTestRunner
.
Builder
(
context
,
transformer
)
new
TransformerAndroidTestRunner
.
Builder
(
context
,
transformer
)
.
build
()
.
build
()
.
run
(
testId
,
MediaItem
.
fromUri
(
Uri
.
parse
(
MP4_ASSET_1080P_4_SECOND_HDR10
))
);
.
run
(
testId
,
editedMediaItem
);
Log
.
i
(
TAG
,
"Tone mapped."
);
Log
.
i
(
TAG
,
"Tone mapped."
);
assertThat
(
isToneMappingFallbackApplied
.
get
()).
isTrue
();
assertThat
(
isToneMappingFallbackApplied
.
get
()).
isTrue
();
assertFileHasColorTransfer
(
transformationTestResult
.
filePath
,
C
.
COLOR_TRANSFER_SDR
);
assertFileHasColorTransfer
(
transformationTestResult
.
filePath
,
C
.
COLOR_TRANSFER_SDR
);
...
@@ -209,7 +212,6 @@ public class HdrEditingTest {
...
@@ -209,7 +212,6 @@ public class HdrEditingTest {
TransformationException
.
ERROR_CODE_HDR_ENCODING_UNSUPPORTED
,
TransformationException
.
ERROR_CODE_HDR_ENCODING_UNSUPPORTED
,
TransformationException
.
ERROR_CODE_DECODING_FORMAT_UNSUPPORTED
);
TransformationException
.
ERROR_CODE_DECODING_FORMAT_UNSUPPORTED
);
assertThat
(
isFallbackListenerInvoked
.
get
()).
isFalse
();
assertThat
(
isFallbackListenerInvoked
.
get
()).
isFalse
();
return
;
}
}
}
}
...
@@ -227,9 +229,6 @@ public class HdrEditingTest {
...
@@ -227,9 +229,6 @@ public class HdrEditingTest {
AtomicBoolean
isToneMappingFallbackApplied
=
new
AtomicBoolean
();
AtomicBoolean
isToneMappingFallbackApplied
=
new
AtomicBoolean
();
Transformer
transformer
=
Transformer
transformer
=
new
Transformer
.
Builder
(
context
)
new
Transformer
.
Builder
(
context
)
.
setVideoEffects
(
ImmutableList
.
of
(
new
ScaleToFitTransformation
.
Builder
().
setRotationDegrees
(
180
).
build
()))
.
addListener
(
.
addListener
(
new
Transformer
.
Listener
()
{
new
Transformer
.
Listener
()
{
@Override
@Override
...
@@ -246,12 +245,17 @@ public class HdrEditingTest {
...
@@ -246,12 +245,17 @@ public class HdrEditingTest {
}
}
})
})
.
build
();
.
build
();
MediaItem
mediaItem
=
MediaItem
.
fromUri
(
Uri
.
parse
(
MP4_ASSET_1080P_5_SECOND_HLG10
));
ImmutableList
<
Effect
>
videoEffects
=
ImmutableList
.
of
(
new
ScaleToFitTransformation
.
Builder
().
setRotationDegrees
(
180
).
build
());
Effects
effects
=
new
Effects
(
/* audioProcessors= */
ImmutableList
.
of
(),
videoEffects
);
EditedMediaItem
editedMediaItem
=
new
EditedMediaItem
(
mediaItem
,
effects
);
try
{
try
{
TransformationTestResult
transformationTestResult
=
TransformationTestResult
transformationTestResult
=
new
TransformerAndroidTestRunner
.
Builder
(
context
,
transformer
)
new
TransformerAndroidTestRunner
.
Builder
(
context
,
transformer
)
.
build
()
.
build
()
.
run
(
testId
,
MediaItem
.
fromUri
(
Uri
.
parse
(
MP4_ASSET_1080P_5_SECOND_HLG10
))
);
.
run
(
testId
,
editedMediaItem
);
Log
.
i
(
TAG
,
"Tone mapped."
);
Log
.
i
(
TAG
,
"Tone mapped."
);
assertThat
(
isToneMappingFallbackApplied
.
get
()).
isTrue
();
assertThat
(
isToneMappingFallbackApplied
.
get
()).
isTrue
();
assertFileHasColorTransfer
(
transformationTestResult
.
filePath
,
C
.
COLOR_TRANSFER_SDR
);
assertFileHasColorTransfer
(
transformationTestResult
.
filePath
,
C
.
COLOR_TRANSFER_SDR
);
...
...
libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/RepeatedTranscodeTest.java
View file @
2cb4e3d7
...
@@ -20,9 +20,12 @@ import static com.google.common.truth.Truth.assertWithMessage;
...
@@ -20,9 +20,12 @@ import static com.google.common.truth.Truth.assertWithMessage;
import
android.content.Context
;
import
android.content.Context
;
import
android.net.Uri
;
import
android.net.Uri
;
import
androidx.media3.common.Effect
;
import
androidx.media3.common.MediaItem
;
import
androidx.media3.common.MediaItem
;
import
androidx.media3.effect.ScaleToFitTransformation
;
import
androidx.media3.effect.ScaleToFitTransformation
;
import
androidx.media3.transformer.AndroidTestUtil
;
import
androidx.media3.transformer.AndroidTestUtil
;
import
androidx.media3.transformer.EditedMediaItem
;
import
androidx.media3.transformer.Effects
;
import
androidx.media3.transformer.TransformationRequest
;
import
androidx.media3.transformer.TransformationRequest
;
import
androidx.media3.transformer.TransformationTestResult
;
import
androidx.media3.transformer.TransformationTestResult
;
import
androidx.media3.transformer.Transformer
;
import
androidx.media3.transformer.Transformer
;
...
@@ -48,20 +51,22 @@ public final class RepeatedTranscodeTest {
...
@@ -48,20 +51,22 @@ public final class RepeatedTranscodeTest {
new
TransformerAndroidTestRunner
.
Builder
(
new
TransformerAndroidTestRunner
.
Builder
(
context
,
context
,
new
Transformer
.
Builder
(
context
)
new
Transformer
.
Builder
(
context
)
.
setVideoEffects
(
ImmutableList
.
of
(
new
ScaleToFitTransformation
.
Builder
().
setRotationDegrees
(
45
).
build
()))
.
setEncoderFactory
(
new
AndroidTestUtil
.
ForceEncodeEncoderFactory
(
context
))
.
setEncoderFactory
(
new
AndroidTestUtil
.
ForceEncodeEncoderFactory
(
context
))
.
build
())
.
build
())
.
build
();
.
build
();
MediaItem
mediaItem
=
MediaItem
.
fromUri
(
Uri
.
parse
(
AndroidTestUtil
.
MP4_REMOTE_10_SECONDS_URI_STRING
));
ImmutableList
<
Effect
>
videoEffects
=
ImmutableList
.
of
(
new
ScaleToFitTransformation
.
Builder
().
setRotationDegrees
(
45
).
build
());
Effects
effects
=
new
Effects
(
/* audioProcessors= */
ImmutableList
.
of
(),
videoEffects
);
EditedMediaItem
editedMediaItem
=
new
EditedMediaItem
(
mediaItem
,
effects
);
Set
<
Long
>
differentOutputSizesBytes
=
new
HashSet
<>();
Set
<
Long
>
differentOutputSizesBytes
=
new
HashSet
<>();
for
(
int
i
=
0
;
i
<
TRANSCODE_COUNT
;
i
++)
{
for
(
int
i
=
0
;
i
<
TRANSCODE_COUNT
;
i
++)
{
// Use a long video in case an error occurs a while after the start of the video.
// Use a long video in case an error occurs a while after the start of the video.
TransformationTestResult
testResult
=
TransformationTestResult
testResult
=
transformerRunner
.
run
(
transformerRunner
.
run
(
/* testId= */
"repeatedTranscode_givesConsistentLengthOutput_"
+
i
,
/* testId= */
"repeatedTranscode_givesConsistentLengthOutput_"
+
i
,
editedMediaItem
);
MediaItem
.
fromUri
(
Uri
.
parse
(
AndroidTestUtil
.
MP4_REMOTE_10_SECONDS_URI_STRING
)));
differentOutputSizesBytes
.
add
(
checkNotNull
(
testResult
.
transformationResult
.
fileSizeBytes
));
differentOutputSizesBytes
.
add
(
checkNotNull
(
testResult
.
transformationResult
.
fileSizeBytes
));
}
}
...
@@ -79,12 +84,15 @@ public final class RepeatedTranscodeTest {
...
@@ -79,12 +84,15 @@ public final class RepeatedTranscodeTest {
context
,
context
,
new
Transformer
.
Builder
(
context
)
new
Transformer
.
Builder
(
context
)
.
setRemoveAudio
(
true
)
.
setRemoveAudio
(
true
)
.
setVideoEffects
(
ImmutableList
.
of
(
new
ScaleToFitTransformation
.
Builder
().
setRotationDegrees
(
45
).
build
()))
.
setEncoderFactory
(
new
AndroidTestUtil
.
ForceEncodeEncoderFactory
(
context
))
.
setEncoderFactory
(
new
AndroidTestUtil
.
ForceEncodeEncoderFactory
(
context
))
.
build
())
.
build
())
.
build
();
.
build
();
MediaItem
mediaItem
=
MediaItem
.
fromUri
(
Uri
.
parse
(
AndroidTestUtil
.
MP4_REMOTE_10_SECONDS_URI_STRING
));
ImmutableList
<
Effect
>
videoEffects
=
ImmutableList
.
of
(
new
ScaleToFitTransformation
.
Builder
().
setRotationDegrees
(
45
).
build
());
Effects
effects
=
new
Effects
(
/* audioProcessors= */
ImmutableList
.
of
(),
videoEffects
);
EditedMediaItem
editedMediaItem
=
new
EditedMediaItem
(
mediaItem
,
effects
);
Set
<
Long
>
differentOutputSizesBytes
=
new
HashSet
<>();
Set
<
Long
>
differentOutputSizesBytes
=
new
HashSet
<>();
for
(
int
i
=
0
;
i
<
TRANSCODE_COUNT
;
i
++)
{
for
(
int
i
=
0
;
i
<
TRANSCODE_COUNT
;
i
++)
{
...
@@ -92,7 +100,7 @@ public final class RepeatedTranscodeTest {
...
@@ -92,7 +100,7 @@ public final class RepeatedTranscodeTest {
TransformationTestResult
testResult
=
TransformationTestResult
testResult
=
transformerRunner
.
run
(
transformerRunner
.
run
(
/* testId= */
"repeatedTranscodeNoAudio_givesConsistentLengthOutput_"
+
i
,
/* testId= */
"repeatedTranscodeNoAudio_givesConsistentLengthOutput_"
+
i
,
MediaItem
.
fromUri
(
Uri
.
parse
(
AndroidTestUtil
.
MP4_REMOTE_10_SECONDS_URI_STRING
))
);
editedMediaItem
);
differentOutputSizesBytes
.
add
(
checkNotNull
(
testResult
.
transformationResult
.
fileSizeBytes
));
differentOutputSizesBytes
.
add
(
checkNotNull
(
testResult
.
transformationResult
.
fileSizeBytes
));
}
}
...
...
libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/ToneMapHdrToSdrUsingMediaCodecTest.java
View file @
2cb4e3d7
...
@@ -24,9 +24,12 @@ import static com.google.common.truth.Truth.assertThat;
...
@@ -24,9 +24,12 @@ import static com.google.common.truth.Truth.assertThat;
import
android.content.Context
;
import
android.content.Context
;
import
android.net.Uri
;
import
android.net.Uri
;
import
androidx.media3.common.C
;
import
androidx.media3.common.C
;
import
androidx.media3.common.Effect
;
import
androidx.media3.common.MediaItem
;
import
androidx.media3.common.MediaItem
;
import
androidx.media3.common.util.Log
;
import
androidx.media3.common.util.Log
;
import
androidx.media3.effect.ScaleToFitTransformation
;
import
androidx.media3.effect.ScaleToFitTransformation
;
import
androidx.media3.transformer.EditedMediaItem
;
import
androidx.media3.transformer.Effects
;
import
androidx.media3.transformer.TransformationException
;
import
androidx.media3.transformer.TransformationException
;
import
androidx.media3.transformer.TransformationRequest
;
import
androidx.media3.transformer.TransformationRequest
;
import
androidx.media3.transformer.TransformationTestResult
;
import
androidx.media3.transformer.TransformationTestResult
;
...
@@ -80,7 +83,6 @@ public class ToneMapHdrToSdrUsingMediaCodecTest {
...
@@ -80,7 +83,6 @@ public class ToneMapHdrToSdrUsingMediaCodecTest {
.
run
(
testId
,
MediaItem
.
fromUri
(
Uri
.
parse
(
MP4_ASSET_1080P_4_SECOND_HDR10
)));
.
run
(
testId
,
MediaItem
.
fromUri
(
Uri
.
parse
(
MP4_ASSET_1080P_4_SECOND_HDR10
)));
Log
.
i
(
TAG
,
"Tone mapped."
);
Log
.
i
(
TAG
,
"Tone mapped."
);
assertFileHasColorTransfer
(
transformationTestResult
.
filePath
,
C
.
COLOR_TRANSFER_SDR
);
assertFileHasColorTransfer
(
transformationTestResult
.
filePath
,
C
.
COLOR_TRANSFER_SDR
);
return
;
}
catch
(
TransformationException
exception
)
{
}
catch
(
TransformationException
exception
)
{
Log
.
i
(
TAG
,
checkNotNull
(
exception
.
getCause
()).
toString
());
Log
.
i
(
TAG
,
checkNotNull
(
exception
.
getCause
()).
toString
());
assertThat
(
exception
).
hasCauseThat
().
isInstanceOf
(
IllegalArgumentException
.
class
);
assertThat
(
exception
).
hasCauseThat
().
isInstanceOf
(
IllegalArgumentException
.
class
);
...
@@ -88,7 +90,6 @@ public class ToneMapHdrToSdrUsingMediaCodecTest {
...
@@ -88,7 +90,6 @@ public class ToneMapHdrToSdrUsingMediaCodecTest {
.
isAnyOf
(
.
isAnyOf
(
TransformationException
.
ERROR_CODE_HDR_ENCODING_UNSUPPORTED
,
TransformationException
.
ERROR_CODE_HDR_ENCODING_UNSUPPORTED
,
TransformationException
.
ERROR_CODE_DECODING_FORMAT_UNSUPPORTED
);
TransformationException
.
ERROR_CODE_DECODING_FORMAT_UNSUPPORTED
);
return
;
}
}
}
}
...
@@ -125,7 +126,6 @@ public class ToneMapHdrToSdrUsingMediaCodecTest {
...
@@ -125,7 +126,6 @@ public class ToneMapHdrToSdrUsingMediaCodecTest {
.
run
(
testId
,
MediaItem
.
fromUri
(
Uri
.
parse
(
MP4_ASSET_1080P_5_SECOND_HLG10
)));
.
run
(
testId
,
MediaItem
.
fromUri
(
Uri
.
parse
(
MP4_ASSET_1080P_5_SECOND_HLG10
)));
Log
.
i
(
TAG
,
"Tone mapped."
);
Log
.
i
(
TAG
,
"Tone mapped."
);
assertFileHasColorTransfer
(
transformationTestResult
.
filePath
,
C
.
COLOR_TRANSFER_SDR
);
assertFileHasColorTransfer
(
transformationTestResult
.
filePath
,
C
.
COLOR_TRANSFER_SDR
);
return
;
}
catch
(
TransformationException
exception
)
{
}
catch
(
TransformationException
exception
)
{
Log
.
i
(
TAG
,
checkNotNull
(
exception
.
getCause
()).
toString
());
Log
.
i
(
TAG
,
checkNotNull
(
exception
.
getCause
()).
toString
());
assertThat
(
exception
).
hasCauseThat
().
isInstanceOf
(
IllegalArgumentException
.
class
);
assertThat
(
exception
).
hasCauseThat
().
isInstanceOf
(
IllegalArgumentException
.
class
);
...
@@ -133,7 +133,6 @@ public class ToneMapHdrToSdrUsingMediaCodecTest {
...
@@ -133,7 +133,6 @@ public class ToneMapHdrToSdrUsingMediaCodecTest {
.
isAnyOf
(
.
isAnyOf
(
TransformationException
.
ERROR_CODE_HDR_ENCODING_UNSUPPORTED
,
TransformationException
.
ERROR_CODE_HDR_ENCODING_UNSUPPORTED
,
TransformationException
.
ERROR_CODE_DECODING_FORMAT_UNSUPPORTED
);
TransformationException
.
ERROR_CODE_DECODING_FORMAT_UNSUPPORTED
);
return
;
}
}
}
}
...
@@ -148,9 +147,6 @@ public class ToneMapHdrToSdrUsingMediaCodecTest {
...
@@ -148,9 +147,6 @@ public class ToneMapHdrToSdrUsingMediaCodecTest {
new
TransformationRequest
.
Builder
()
new
TransformationRequest
.
Builder
()
.
setHdrMode
(
TransformationRequest
.
HDR_MODE_TONE_MAP_HDR_TO_SDR_USING_MEDIACODEC
)
.
setHdrMode
(
TransformationRequest
.
HDR_MODE_TONE_MAP_HDR_TO_SDR_USING_MEDIACODEC
)
.
build
())
.
build
())
.
setVideoEffects
(
ImmutableList
.
of
(
new
ScaleToFitTransformation
.
Builder
().
setRotationDegrees
(
180
).
build
()))
.
addListener
(
.
addListener
(
new
Transformer
.
Listener
()
{
new
Transformer
.
Listener
()
{
@Override
@Override
...
@@ -165,15 +161,19 @@ public class ToneMapHdrToSdrUsingMediaCodecTest {
...
@@ -165,15 +161,19 @@ public class ToneMapHdrToSdrUsingMediaCodecTest {
}
}
})
})
.
build
();
.
build
();
MediaItem
mediaItem
=
MediaItem
.
fromUri
(
Uri
.
parse
(
MP4_ASSET_1080P_4_SECOND_HDR10
));
ImmutableList
<
Effect
>
videoEffects
=
ImmutableList
.
of
(
new
ScaleToFitTransformation
.
Builder
().
setRotationDegrees
(
180
).
build
());
Effects
effects
=
new
Effects
(
/* audioProcessors= */
ImmutableList
.
of
(),
videoEffects
);
EditedMediaItem
editedMediaItem
=
new
EditedMediaItem
(
mediaItem
,
effects
);
try
{
try
{
TransformationTestResult
transformationTestResult
=
TransformationTestResult
transformationTestResult
=
new
TransformerAndroidTestRunner
.
Builder
(
context
,
transformer
)
new
TransformerAndroidTestRunner
.
Builder
(
context
,
transformer
)
.
build
()
.
build
()
.
run
(
testId
,
MediaItem
.
fromUri
(
Uri
.
parse
(
MP4_ASSET_1080P_4_SECOND_HDR10
))
);
.
run
(
testId
,
editedMediaItem
);
Log
.
i
(
TAG
,
"Tone mapped."
);
Log
.
i
(
TAG
,
"Tone mapped."
);
assertFileHasColorTransfer
(
transformationTestResult
.
filePath
,
C
.
COLOR_TRANSFER_SDR
);
assertFileHasColorTransfer
(
transformationTestResult
.
filePath
,
C
.
COLOR_TRANSFER_SDR
);
return
;
}
catch
(
TransformationException
exception
)
{
}
catch
(
TransformationException
exception
)
{
Log
.
i
(
TAG
,
checkNotNull
(
exception
.
getCause
()).
toString
());
Log
.
i
(
TAG
,
checkNotNull
(
exception
.
getCause
()).
toString
());
assertThat
(
exception
).
hasCauseThat
().
isInstanceOf
(
IllegalArgumentException
.
class
);
assertThat
(
exception
).
hasCauseThat
().
isInstanceOf
(
IllegalArgumentException
.
class
);
...
@@ -181,7 +181,6 @@ public class ToneMapHdrToSdrUsingMediaCodecTest {
...
@@ -181,7 +181,6 @@ public class ToneMapHdrToSdrUsingMediaCodecTest {
.
isAnyOf
(
.
isAnyOf
(
TransformationException
.
ERROR_CODE_HDR_ENCODING_UNSUPPORTED
,
TransformationException
.
ERROR_CODE_HDR_ENCODING_UNSUPPORTED
,
TransformationException
.
ERROR_CODE_DECODING_FORMAT_UNSUPPORTED
);
TransformationException
.
ERROR_CODE_DECODING_FORMAT_UNSUPPORTED
);
return
;
}
}
}
}
...
@@ -196,9 +195,6 @@ public class ToneMapHdrToSdrUsingMediaCodecTest {
...
@@ -196,9 +195,6 @@ public class ToneMapHdrToSdrUsingMediaCodecTest {
new
TransformationRequest
.
Builder
()
new
TransformationRequest
.
Builder
()
.
setHdrMode
(
TransformationRequest
.
HDR_MODE_TONE_MAP_HDR_TO_SDR_USING_MEDIACODEC
)
.
setHdrMode
(
TransformationRequest
.
HDR_MODE_TONE_MAP_HDR_TO_SDR_USING_MEDIACODEC
)
.
build
())
.
build
())
.
setVideoEffects
(
ImmutableList
.
of
(
new
ScaleToFitTransformation
.
Builder
().
setRotationDegrees
(
180
).
build
()))
.
addListener
(
.
addListener
(
new
Transformer
.
Listener
()
{
new
Transformer
.
Listener
()
{
@Override
@Override
...
@@ -213,15 +209,19 @@ public class ToneMapHdrToSdrUsingMediaCodecTest {
...
@@ -213,15 +209,19 @@ public class ToneMapHdrToSdrUsingMediaCodecTest {
}
}
})
})
.
build
();
.
build
();
MediaItem
mediaItem
=
MediaItem
.
fromUri
(
Uri
.
parse
(
MP4_ASSET_1080P_5_SECOND_HLG10
));
ImmutableList
<
Effect
>
videoEffects
=
ImmutableList
.
of
(
new
ScaleToFitTransformation
.
Builder
().
setRotationDegrees
(
180
).
build
());
Effects
effects
=
new
Effects
(
/* audioProcessors= */
ImmutableList
.
of
(),
videoEffects
);
EditedMediaItem
editedMediaItem
=
new
EditedMediaItem
(
mediaItem
,
effects
);
try
{
try
{
TransformationTestResult
transformationTestResult
=
TransformationTestResult
transformationTestResult
=
new
TransformerAndroidTestRunner
.
Builder
(
context
,
transformer
)
new
TransformerAndroidTestRunner
.
Builder
(
context
,
transformer
)
.
build
()
.
build
()
.
run
(
testId
,
MediaItem
.
fromUri
(
Uri
.
parse
(
MP4_ASSET_1080P_5_SECOND_HLG10
))
);
.
run
(
testId
,
editedMediaItem
);
Log
.
i
(
TAG
,
"Tone mapped."
);
Log
.
i
(
TAG
,
"Tone mapped."
);
assertFileHasColorTransfer
(
transformationTestResult
.
filePath
,
C
.
COLOR_TRANSFER_SDR
);
assertFileHasColorTransfer
(
transformationTestResult
.
filePath
,
C
.
COLOR_TRANSFER_SDR
);
return
;
}
catch
(
TransformationException
exception
)
{
}
catch
(
TransformationException
exception
)
{
Log
.
i
(
TAG
,
checkNotNull
(
exception
.
getCause
()).
toString
());
Log
.
i
(
TAG
,
checkNotNull
(
exception
.
getCause
()).
toString
());
assertThat
(
exception
).
hasCauseThat
().
isInstanceOf
(
IllegalArgumentException
.
class
);
assertThat
(
exception
).
hasCauseThat
().
isInstanceOf
(
IllegalArgumentException
.
class
);
...
@@ -229,7 +229,6 @@ public class ToneMapHdrToSdrUsingMediaCodecTest {
...
@@ -229,7 +229,6 @@ public class ToneMapHdrToSdrUsingMediaCodecTest {
.
isAnyOf
(
.
isAnyOf
(
TransformationException
.
ERROR_CODE_HDR_ENCODING_UNSUPPORTED
,
TransformationException
.
ERROR_CODE_HDR_ENCODING_UNSUPPORTED
,
TransformationException
.
ERROR_CODE_DECODING_FORMAT_UNSUPPORTED
);
TransformationException
.
ERROR_CODE_DECODING_FORMAT_UNSUPPORTED
);
return
;
}
}
}
}
}
}
libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/TransformationTest.java
View file @
2cb4e3d7
...
@@ -26,12 +26,15 @@ import static androidx.media3.transformer.AndroidTestUtil.recordTestSkipped;
...
@@ -26,12 +26,15 @@ import static androidx.media3.transformer.AndroidTestUtil.recordTestSkipped;
import
android.content.Context
;
import
android.content.Context
;
import
android.net.Uri
;
import
android.net.Uri
;
import
androidx.media3.common.Effect
;
import
androidx.media3.common.MediaItem
;
import
androidx.media3.common.MediaItem
;
import
androidx.media3.common.util.Util
;
import
androidx.media3.common.util.Util
;
import
androidx.media3.effect.ScaleToFitTransformation
;
import
androidx.media3.effect.ScaleToFitTransformation
;
import
androidx.media3.transformer.AndroidTestUtil
;
import
androidx.media3.transformer.AndroidTestUtil
;
import
androidx.media3.transformer.AndroidTestUtil.ForceEncodeEncoderFactory
;
import
androidx.media3.transformer.AndroidTestUtil.ForceEncodeEncoderFactory
;
import
androidx.media3.transformer.DefaultEncoderFactory
;
import
androidx.media3.transformer.DefaultEncoderFactory
;
import
androidx.media3.transformer.EditedMediaItem
;
import
androidx.media3.transformer.Effects
;
import
androidx.media3.transformer.TransformationRequest
;
import
androidx.media3.transformer.TransformationRequest
;
import
androidx.media3.transformer.Transformer
;
import
androidx.media3.transformer.Transformer
;
import
androidx.media3.transformer.TransformerAndroidTestRunner
;
import
androidx.media3.transformer.TransformerAndroidTestRunner
;
...
@@ -195,17 +198,16 @@ public class TransformationTest {
...
@@ -195,17 +198,16 @@ public class TransformationTest {
String
testId
=
TAG
+
"_transformFrameRotation"
;
String
testId
=
TAG
+
"_transformFrameRotation"
;
Context
context
=
ApplicationProvider
.
getApplicationContext
();
Context
context
=
ApplicationProvider
.
getApplicationContext
();
Transformer
transformer
=
Transformer
transformer
=
new
Transformer
.
Builder
(
context
).
build
();
new
Transformer
.
Builder
(
context
)
MediaItem
mediaItem
=
.
setVideoEffects
(
MediaItem
.
fromUri
(
Uri
.
parse
(
MP4_ASSET_WITH_INCREASING_TIMESTAMPS_URI_STRING
));
ImmutableList
.
of
(
ImmutableList
<
Effect
>
videoEffects
=
new
ScaleToFitTransformation
.
Builder
().
setRotationDegrees
(
45
).
build
()))
ImmutableList
.
of
(
new
ScaleToFitTransformation
.
Builder
().
setRotationDegrees
(
45
).
build
());
.
build
();
Effects
effects
=
new
Effects
(
/* audioProcessors= */
ImmutableList
.
of
(),
videoEffects
);
EditedMediaItem
editedMediaItem
=
new
EditedMediaItem
(
mediaItem
,
effects
);
new
TransformerAndroidTestRunner
.
Builder
(
context
,
transformer
)
new
TransformerAndroidTestRunner
.
Builder
(
context
,
transformer
)
.
build
()
.
build
()
.
run
(
.
run
(
/* testId= */
testId
,
editedMediaItem
);
/* testId= */
testId
,
MediaItem
.
fromUri
(
Uri
.
parse
(
MP4_ASSET_WITH_INCREASING_TIMESTAMPS_URI_STRING
)));
}
}
}
}
libraries/transformer/src/test/java/androidx/media3/transformer/TransformerEndToEndTest.java
View file @
2cb4e3d7
...
@@ -47,6 +47,7 @@ import androidx.media3.common.Effect;
...
@@ -47,6 +47,7 @@ import androidx.media3.common.Effect;
import
androidx.media3.common.Format
;
import
androidx.media3.common.Format
;
import
androidx.media3.common.MediaItem
;
import
androidx.media3.common.MediaItem
;
import
androidx.media3.common.MimeTypes
;
import
androidx.media3.common.MimeTypes
;
import
androidx.media3.common.audio.AudioProcessor
;
import
androidx.media3.common.audio.SonicAudioProcessor
;
import
androidx.media3.common.audio.SonicAudioProcessor
;
import
androidx.media3.common.util.Util
;
import
androidx.media3.common.util.Util
;
import
androidx.media3.effect.Presentation
;
import
androidx.media3.effect.Presentation
;
...
@@ -129,9 +130,10 @@ public final class TransformerEndToEndTest {
...
@@ -129,9 +130,10 @@ public final class TransformerEndToEndTest {
@Test
@Test
public
void
startTransformation_videoOnlyPassthrough_completesSuccessfully
()
throws
Exception
{
public
void
startTransformation_videoOnlyPassthrough_completesSuccessfully
()
throws
Exception
{
Transformer
transformer
=
createTransformerBuilder
(
/* enableFallback= */
false
).
build
();
Transformer
transformer
=
createTransformerBuilder
(
/* enableFallback= */
false
).
build
();
MediaItem
mediaItem
=
MediaItem
.
fromUri
(
ASSET_URI_PREFIX
+
FILE_VIDEO_ONLY
);
EditedMediaItem
editedMediaItem
=
new
EditedMediaItem
(
MediaItem
.
fromUri
(
ASSET_URI_PREFIX
+
FILE_VIDEO_ONLY
));
transformer
.
startTransformation
(
m
ediaItem
,
outputPath
);
transformer
.
startTransformation
(
editedM
ediaItem
,
outputPath
);
TransformerTestRunner
.
runLooper
(
transformer
);
TransformerTestRunner
.
runLooper
(
transformer
);
DumpFileAsserts
.
assertOutput
(
context
,
testMuxer
,
getDumpFileName
(
FILE_VIDEO_ONLY
));
DumpFileAsserts
.
assertOutput
(
context
,
testMuxer
,
getDumpFileName
(
FILE_VIDEO_ONLY
));
...
@@ -140,10 +142,11 @@ public final class TransformerEndToEndTest {
...
@@ -140,10 +142,11 @@ public final class TransformerEndToEndTest {
@Test
@Test
public
void
startTransformation_audioOnlyPassthrough_completesSuccessfully
()
throws
Exception
{
public
void
startTransformation_audioOnlyPassthrough_completesSuccessfully
()
throws
Exception
{
Transformer
transformer
=
createTransformerBuilder
(
/* enableFallback= */
false
).
build
();
Transformer
transformer
=
createTransformerBuilder
(
/* enableFallback= */
false
).
build
();
EditedMediaItem
editedMediaItem
=
new
EditedMediaItem
(
MediaItem
.
fromUri
(
ASSET_URI_PREFIX
+
FILE_AUDIO_UNSUPPORTED_BY_ENCODER
));
MediaItem
mediaItem
=
MediaItem
.
fromUri
(
ASSET_URI_PREFIX
+
FILE_AUDIO_UNSUPPORTED_BY_ENCODER
);
transformer
.
startTransformation
(
editedMediaItem
,
outputPath
);
transformer
.
startTransformation
(
mediaItem
,
outputPath
);
TransformerTestRunner
.
runLooper
(
transformer
);
TransformerTestRunner
.
runLooper
(
transformer
);
DumpFileAsserts
.
assertOutput
(
DumpFileAsserts
.
assertOutput
(
...
@@ -159,9 +162,11 @@ public final class TransformerEndToEndTest {
...
@@ -159,9 +162,11 @@ public final class TransformerEndToEndTest {
.
setAudioMimeType
(
MimeTypes
.
AUDIO_AAC
)
// supported by encoder and muxer
.
setAudioMimeType
(
MimeTypes
.
AUDIO_AAC
)
// supported by encoder and muxer
.
build
())
.
build
())
.
build
();
.
build
();
MediaItem
mediaItem
=
MediaItem
.
fromUri
(
ASSET_URI_PREFIX
+
FILE_AUDIO_UNSUPPORTED_BY_ENCODER
);
EditedMediaItem
editedMediaItem
=
new
EditedMediaItem
(
MediaItem
.
fromUri
(
ASSET_URI_PREFIX
+
FILE_AUDIO_UNSUPPORTED_BY_ENCODER
));
transformer
.
startTransformation
(
m
ediaItem
,
outputPath
);
transformer
.
startTransformation
(
editedM
ediaItem
,
outputPath
);
TransformerTestRunner
.
runLooper
(
transformer
);
TransformerTestRunner
.
runLooper
(
transformer
);
DumpFileAsserts
.
assertOutput
(
DumpFileAsserts
.
assertOutput
(
...
@@ -171,9 +176,10 @@ public final class TransformerEndToEndTest {
...
@@ -171,9 +176,10 @@ public final class TransformerEndToEndTest {
@Test
@Test
public
void
startTransformation_audioAndVideo_completesSuccessfully
()
throws
Exception
{
public
void
startTransformation_audioAndVideo_completesSuccessfully
()
throws
Exception
{
Transformer
transformer
=
createTransformerBuilder
(
/* enableFallback= */
false
).
build
();
Transformer
transformer
=
createTransformerBuilder
(
/* enableFallback= */
false
).
build
();
MediaItem
mediaItem
=
MediaItem
.
fromUri
(
ASSET_URI_PREFIX
+
FILE_AUDIO_VIDEO
);
EditedMediaItem
editedMediaItem
=
new
EditedMediaItem
(
MediaItem
.
fromUri
(
ASSET_URI_PREFIX
+
FILE_AUDIO_VIDEO
));
transformer
.
startTransformation
(
m
ediaItem
,
outputPath
);
transformer
.
startTransformation
(
editedM
ediaItem
,
outputPath
);
TransformerTestRunner
.
runLooper
(
transformer
);
TransformerTestRunner
.
runLooper
(
transformer
);
DumpFileAsserts
.
assertOutput
(
context
,
testMuxer
,
getDumpFileName
(
FILE_AUDIO_VIDEO
));
DumpFileAsserts
.
assertOutput
(
context
,
testMuxer
,
getDumpFileName
(
FILE_AUDIO_VIDEO
));
...
@@ -193,8 +199,9 @@ public final class TransformerEndToEndTest {
...
@@ -193,8 +199,9 @@ public final class TransformerEndToEndTest {
.
setStartsAtKeyFrame
(
true
)
.
setStartsAtKeyFrame
(
true
)
.
build
())
.
build
())
.
build
();
.
build
();
EditedMediaItem
editedMediaItem
=
new
EditedMediaItem
(
mediaItem
);
transformer
.
startTransformation
(
m
ediaItem
,
outputPath
);
transformer
.
startTransformation
(
editedM
ediaItem
,
outputPath
);
TransformerTestRunner
.
runLooper
(
transformer
);
TransformerTestRunner
.
runLooper
(
transformer
);
DumpFileAsserts
.
assertOutput
(
DumpFileAsserts
.
assertOutput
(
...
@@ -210,9 +217,10 @@ public final class TransformerEndToEndTest {
...
@@ -210,9 +217,10 @@ public final class TransformerEndToEndTest {
.
setTransformationRequest
(
.
setTransformationRequest
(
new
TransformationRequest
.
Builder
().
setAudioMimeType
(
MimeTypes
.
AUDIO_AAC
).
build
())
new
TransformationRequest
.
Builder
().
setAudioMimeType
(
MimeTypes
.
AUDIO_AAC
).
build
())
.
build
();
.
build
();
MediaItem
mediaItem
=
MediaItem
.
fromUri
(
ASSET_URI_PREFIX
+
FILE_WITH_SUBTITLES
);
EditedMediaItem
editedMediaItem
=
new
EditedMediaItem
(
MediaItem
.
fromUri
(
ASSET_URI_PREFIX
+
FILE_WITH_SUBTITLES
));
transformer
.
startTransformation
(
m
ediaItem
,
outputPath
);
transformer
.
startTransformation
(
editedM
ediaItem
,
outputPath
);
TransformerTestRunner
.
runLooper
(
transformer
);
TransformerTestRunner
.
runLooper
(
transformer
);
DumpFileAsserts
.
assertOutput
(
context
,
testMuxer
,
getDumpFileName
(
FILE_WITH_SUBTITLES
));
DumpFileAsserts
.
assertOutput
(
context
,
testMuxer
,
getDumpFileName
(
FILE_WITH_SUBTITLES
));
...
@@ -222,15 +230,16 @@ public final class TransformerEndToEndTest {
...
@@ -222,15 +230,16 @@ public final class TransformerEndToEndTest {
public
void
startTransformation_successiveTransformations_completesSuccessfully
()
public
void
startTransformation_successiveTransformations_completesSuccessfully
()
throws
Exception
{
throws
Exception
{
Transformer
transformer
=
createTransformerBuilder
(
/* enableFallback= */
false
).
build
();
Transformer
transformer
=
createTransformerBuilder
(
/* enableFallback= */
false
).
build
();
MediaItem
mediaItem
=
MediaItem
.
fromUri
(
ASSET_URI_PREFIX
+
FILE_AUDIO_VIDEO
);
EditedMediaItem
editedMediaItem
=
new
EditedMediaItem
(
MediaItem
.
fromUri
(
ASSET_URI_PREFIX
+
FILE_AUDIO_VIDEO
));
// Transform first media item.
// Transform first media item.
transformer
.
startTransformation
(
m
ediaItem
,
outputPath
);
transformer
.
startTransformation
(
editedM
ediaItem
,
outputPath
);
TransformerTestRunner
.
runLooper
(
transformer
);
TransformerTestRunner
.
runLooper
(
transformer
);
Files
.
delete
(
Paths
.
get
(
outputPath
));
Files
.
delete
(
Paths
.
get
(
outputPath
));
// Transform second media item.
// Transform second media item.
transformer
.
startTransformation
(
m
ediaItem
,
outputPath
);
transformer
.
startTransformation
(
editedM
ediaItem
,
outputPath
);
TransformerTestRunner
.
runLooper
(
transformer
);
TransformerTestRunner
.
runLooper
(
transformer
);
DumpFileAsserts
.
assertOutput
(
context
,
testMuxer
,
getDumpFileName
(
FILE_AUDIO_VIDEO
));
DumpFileAsserts
.
assertOutput
(
context
,
testMuxer
,
getDumpFileName
(
FILE_AUDIO_VIDEO
));
...
@@ -239,21 +248,24 @@ public final class TransformerEndToEndTest {
...
@@ -239,21 +248,24 @@ public final class TransformerEndToEndTest {
@Test
@Test
public
void
startTransformation_concurrentTransformations_throwsError
()
{
public
void
startTransformation_concurrentTransformations_throwsError
()
{
Transformer
transformer
=
createTransformerBuilder
(
/* enableFallback= */
false
).
build
();
Transformer
transformer
=
createTransformerBuilder
(
/* enableFallback= */
false
).
build
();
MediaItem
mediaItem
=
MediaItem
.
fromUri
(
ASSET_URI_PREFIX
+
FILE_VIDEO_ONLY
);
EditedMediaItem
editedMediaItem
=
new
EditedMediaItem
(
MediaItem
.
fromUri
(
ASSET_URI_PREFIX
+
FILE_VIDEO_ONLY
));
transformer
.
startTransformation
(
m
ediaItem
,
outputPath
);
transformer
.
startTransformation
(
editedM
ediaItem
,
outputPath
);
assertThrows
(
assertThrows
(
IllegalStateException
.
class
,
()
->
transformer
.
startTransformation
(
mediaItem
,
outputPath
));
IllegalStateException
.
class
,
()
->
transformer
.
startTransformation
(
editedMediaItem
,
outputPath
));
}
}
@Test
@Test
public
void
startTransformation_removeAudio_completesSuccessfully
()
throws
Exception
{
public
void
startTransformation_removeAudio_completesSuccessfully
()
throws
Exception
{
Transformer
transformer
=
Transformer
transformer
=
createTransformerBuilder
(
/* enableFallback= */
false
).
setRemoveAudio
(
true
).
build
();
createTransformerBuilder
(
/* enableFallback= */
false
).
setRemoveAudio
(
true
).
build
();
MediaItem
mediaItem
=
MediaItem
.
fromUri
(
ASSET_URI_PREFIX
+
FILE_AUDIO_VIDEO
);
EditedMediaItem
editedMediaItem
=
new
EditedMediaItem
(
MediaItem
.
fromUri
(
ASSET_URI_PREFIX
+
FILE_AUDIO_VIDEO
));
transformer
.
startTransformation
(
m
ediaItem
,
outputPath
);
transformer
.
startTransformation
(
editedM
ediaItem
,
outputPath
);
TransformerTestRunner
.
runLooper
(
transformer
);
TransformerTestRunner
.
runLooper
(
transformer
);
DumpFileAsserts
.
assertOutput
(
DumpFileAsserts
.
assertOutput
(
...
@@ -264,9 +276,10 @@ public final class TransformerEndToEndTest {
...
@@ -264,9 +276,10 @@ public final class TransformerEndToEndTest {
public
void
startTransformation_removeVideo_completesSuccessfully
()
throws
Exception
{
public
void
startTransformation_removeVideo_completesSuccessfully
()
throws
Exception
{
Transformer
transformer
=
Transformer
transformer
=
createTransformerBuilder
(
/* enableFallback= */
false
).
setRemoveVideo
(
true
).
build
();
createTransformerBuilder
(
/* enableFallback= */
false
).
setRemoveVideo
(
true
).
build
();
MediaItem
mediaItem
=
MediaItem
.
fromUri
(
ASSET_URI_PREFIX
+
FILE_AUDIO_VIDEO
);
EditedMediaItem
editedMediaItem
=
new
EditedMediaItem
(
MediaItem
.
fromUri
(
ASSET_URI_PREFIX
+
FILE_AUDIO_VIDEO
));
transformer
.
startTransformation
(
m
ediaItem
,
outputPath
);
transformer
.
startTransformation
(
editedM
ediaItem
,
outputPath
);
TransformerTestRunner
.
runLooper
(
transformer
);
TransformerTestRunner
.
runLooper
(
transformer
);
DumpFileAsserts
.
assertOutput
(
DumpFileAsserts
.
assertOutput
(
...
@@ -279,9 +292,11 @@ public final class TransformerEndToEndTest {
...
@@ -279,9 +292,11 @@ public final class TransformerEndToEndTest {
createTransformerBuilder
(
/* enableFallback= */
false
)
createTransformerBuilder
(
/* enableFallback= */
false
)
.
experimentalSetGenerateSilentAudio
(
true
)
.
experimentalSetGenerateSilentAudio
(
true
)
.
build
();
.
build
();
MediaItem
mediaItem
=
MediaItem
.
fromUri
(
ASSET_URI_PREFIX
+
FILE_AUDIO_UNSUPPORTED_BY_ENCODER
);
EditedMediaItem
editedMediaItem
=
new
EditedMediaItem
(
MediaItem
.
fromUri
(
ASSET_URI_PREFIX
+
FILE_AUDIO_UNSUPPORTED_BY_ENCODER
));
transformer
.
startTransformation
(
m
ediaItem
,
outputPath
);
transformer
.
startTransformation
(
editedM
ediaItem
,
outputPath
);
TransformerTestRunner
.
runLooper
(
transformer
);
TransformerTestRunner
.
runLooper
(
transformer
);
DumpFileAsserts
.
assertOutput
(
DumpFileAsserts
.
assertOutput
(
...
@@ -294,9 +309,10 @@ public final class TransformerEndToEndTest {
...
@@ -294,9 +309,10 @@ public final class TransformerEndToEndTest {
createTransformerBuilder
(
/* enableFallback= */
false
)
createTransformerBuilder
(
/* enableFallback= */
false
)
.
experimentalSetGenerateSilentAudio
(
true
)
.
experimentalSetGenerateSilentAudio
(
true
)
.
build
();
.
build
();
MediaItem
mediaItem
=
MediaItem
.
fromUri
(
ASSET_URI_PREFIX
+
FILE_AUDIO_VIDEO
);
EditedMediaItem
editedMediaItem
=
new
EditedMediaItem
(
MediaItem
.
fromUri
(
ASSET_URI_PREFIX
+
FILE_AUDIO_VIDEO
));
transformer
.
startTransformation
(
m
ediaItem
,
outputPath
);
transformer
.
startTransformation
(
editedM
ediaItem
,
outputPath
);
TransformerTestRunner
.
runLooper
(
transformer
);
TransformerTestRunner
.
runLooper
(
transformer
);
DumpFileAsserts
.
assertOutput
(
context
,
testMuxer
,
getDumpFileName
(
FILE_AUDIO_VIDEO
));
DumpFileAsserts
.
assertOutput
(
context
,
testMuxer
,
getDumpFileName
(
FILE_AUDIO_VIDEO
));
...
@@ -309,9 +325,10 @@ public final class TransformerEndToEndTest {
...
@@ -309,9 +325,10 @@ public final class TransformerEndToEndTest {
.
experimentalSetGenerateSilentAudio
(
true
)
.
experimentalSetGenerateSilentAudio
(
true
)
.
setRemoveAudio
(
true
)
.
setRemoveAudio
(
true
)
.
build
();
.
build
();
MediaItem
mediaItem
=
MediaItem
.
fromUri
(
ASSET_URI_PREFIX
+
FILE_AUDIO_VIDEO
);
EditedMediaItem
editedMediaItem
=
new
EditedMediaItem
(
MediaItem
.
fromUri
(
ASSET_URI_PREFIX
+
FILE_AUDIO_VIDEO
));
transformer
.
startTransformation
(
m
ediaItem
,
outputPath
);
transformer
.
startTransformation
(
editedM
ediaItem
,
outputPath
);
TransformerTestRunner
.
runLooper
(
transformer
);
TransformerTestRunner
.
runLooper
(
transformer
);
DumpFileAsserts
.
assertOutput
(
DumpFileAsserts
.
assertOutput
(
...
@@ -325,9 +342,10 @@ public final class TransformerEndToEndTest {
...
@@ -325,9 +342,10 @@ public final class TransformerEndToEndTest {
.
experimentalSetGenerateSilentAudio
(
true
)
.
experimentalSetGenerateSilentAudio
(
true
)
.
setRemoveVideo
(
true
)
.
setRemoveVideo
(
true
)
.
build
();
.
build
();
MediaItem
mediaItem
=
MediaItem
.
fromUri
(
ASSET_URI_PREFIX
+
FILE_AUDIO_VIDEO
);
EditedMediaItem
editedMediaItem
=
new
EditedMediaItem
(
MediaItem
.
fromUri
(
ASSET_URI_PREFIX
+
FILE_AUDIO_VIDEO
));
transformer
.
startTransformation
(
m
ediaItem
,
outputPath
);
transformer
.
startTransformation
(
editedM
ediaItem
,
outputPath
);
TransformerTestRunner
.
runLooper
(
transformer
);
TransformerTestRunner
.
runLooper
(
transformer
);
DumpFileAsserts
.
assertOutput
(
DumpFileAsserts
.
assertOutput
(
context
,
testMuxer
,
getDumpFileName
(
FILE_AUDIO_VIDEO
+
".novideo"
));
context
,
testMuxer
,
getDumpFileName
(
FILE_AUDIO_VIDEO
+
".novideo"
));
...
@@ -339,9 +357,10 @@ public final class TransformerEndToEndTest {
...
@@ -339,9 +357,10 @@ public final class TransformerEndToEndTest {
createTransformerBuilder
(
/* enableFallback= */
false
)
createTransformerBuilder
(
/* enableFallback= */
false
)
.
experimentalSetGenerateSilentAudio
(
true
)
.
experimentalSetGenerateSilentAudio
(
true
)
.
build
();
.
build
();
MediaItem
mediaItem
=
MediaItem
.
fromUri
(
ASSET_URI_PREFIX
+
FILE_VIDEO_ONLY
);
EditedMediaItem
editedMediaItem
=
new
EditedMediaItem
(
MediaItem
.
fromUri
(
ASSET_URI_PREFIX
+
FILE_VIDEO_ONLY
));
transformer
.
startTransformation
(
m
ediaItem
,
outputPath
);
transformer
.
startTransformation
(
editedM
ediaItem
,
outputPath
);
TransformerTestRunner
.
runLooper
(
transformer
);
TransformerTestRunner
.
runLooper
(
transformer
);
DumpFileAsserts
.
assertOutput
(
DumpFileAsserts
.
assertOutput
(
...
@@ -352,13 +371,13 @@ public final class TransformerEndToEndTest {
...
@@ -352,13 +371,13 @@ public final class TransformerEndToEndTest {
public
void
startTransformation_adjustSampleRate_completesSuccessfully
()
throws
Exception
{
public
void
startTransformation_adjustSampleRate_completesSuccessfully
()
throws
Exception
{
SonicAudioProcessor
sonicAudioProcessor
=
new
SonicAudioProcessor
();
SonicAudioProcessor
sonicAudioProcessor
=
new
SonicAudioProcessor
();
sonicAudioProcessor
.
setOutputSampleRateHz
(
48000
);
sonicAudioProcessor
.
setOutputSampleRateHz
(
48000
);
Transformer
transformer
=
Transformer
transformer
=
createTransformerBuilder
(
/* enableFallback= */
false
).
build
();
createTransformerBuilder
(
/* enableFallback= */
false
)
.
setAudioProcessors
(
ImmutableList
.
of
(
sonicAudioProcessor
))
.
build
();
MediaItem
mediaItem
=
MediaItem
.
fromUri
(
ASSET_URI_PREFIX
+
FILE_AUDIO_VIDEO
);
MediaItem
mediaItem
=
MediaItem
.
fromUri
(
ASSET_URI_PREFIX
+
FILE_AUDIO_VIDEO
);
ImmutableList
<
AudioProcessor
>
audioProcessors
=
ImmutableList
.
of
(
sonicAudioProcessor
);
Effects
effects
=
new
Effects
(
audioProcessors
,
/* videoEffects= */
ImmutableList
.
of
());
EditedMediaItem
editedMediaItem
=
new
EditedMediaItem
(
mediaItem
,
effects
);
transformer
.
startTransformation
(
m
ediaItem
,
outputPath
);
transformer
.
startTransformation
(
editedM
ediaItem
,
outputPath
);
TransformerTestRunner
.
runLooper
(
transformer
);
TransformerTestRunner
.
runLooper
(
transformer
);
DumpFileAsserts
.
assertOutput
(
DumpFileAsserts
.
assertOutput
(
...
@@ -376,14 +395,15 @@ public final class TransformerEndToEndTest {
...
@@ -376,14 +395,15 @@ public final class TransformerEndToEndTest {
.
addListener
(
mockListener2
)
.
addListener
(
mockListener2
)
.
addListener
(
mockListener3
)
.
addListener
(
mockListener3
)
.
build
();
.
build
();
MediaItem
mediaItem
=
MediaItem
.
fromUri
(
ASSET_URI_PREFIX
+
FILE_AUDIO_VIDEO
);
EditedMediaItem
editedMediaItem
=
new
EditedMediaItem
(
MediaItem
.
fromUri
(
ASSET_URI_PREFIX
+
FILE_AUDIO_VIDEO
));
transformer
.
startTransformation
(
m
ediaItem
,
outputPath
);
transformer
.
startTransformation
(
editedM
ediaItem
,
outputPath
);
TransformerTestRunner
.
runLooper
(
transformer
);
TransformerTestRunner
.
runLooper
(
transformer
);
verify
(
mockListener1
).
onTransformationCompleted
(
eq
(
mediaItem
),
any
());
verify
(
mockListener1
).
onTransformationCompleted
(
eq
(
editedMediaItem
.
mediaItem
),
any
());
verify
(
mockListener2
).
onTransformationCompleted
(
eq
(
mediaItem
),
any
());
verify
(
mockListener2
).
onTransformationCompleted
(
eq
(
editedMediaItem
.
mediaItem
),
any
());
verify
(
mockListener3
).
onTransformationCompleted
(
eq
(
mediaItem
),
any
());
verify
(
mockListener3
).
onTransformationCompleted
(
eq
(
editedMediaItem
.
mediaItem
),
any
());
}
}
@Test
@Test
...
@@ -399,16 +419,21 @@ public final class TransformerEndToEndTest {
...
@@ -399,16 +419,21 @@ public final class TransformerEndToEndTest {
.
setTransformationRequest
(
// Request transcoding so that decoder is used.
.
setTransformationRequest
(
// Request transcoding so that decoder is used.
new
TransformationRequest
.
Builder
().
setAudioMimeType
(
MimeTypes
.
AUDIO_AAC
).
build
())
new
TransformationRequest
.
Builder
().
setAudioMimeType
(
MimeTypes
.
AUDIO_AAC
).
build
())
.
build
();
.
build
();
MediaItem
mediaItem
=
MediaItem
.
fromUri
(
ASSET_URI_PREFIX
+
FILE_AUDIO_UNSUPPORTED_BY_DECODER
);
EditedMediaItem
editedMediaItem
=
new
EditedMediaItem
(
MediaItem
.
fromUri
(
ASSET_URI_PREFIX
+
FILE_AUDIO_UNSUPPORTED_BY_DECODER
));
transformer
.
startTransformation
(
m
ediaItem
,
outputPath
);
transformer
.
startTransformation
(
editedM
ediaItem
,
outputPath
);
TransformationException
exception
=
TransformationException
exception
=
assertThrows
(
assertThrows
(
TransformationException
.
class
,
()
->
TransformerTestRunner
.
runLooper
(
transformer
));
TransformationException
.
class
,
()
->
TransformerTestRunner
.
runLooper
(
transformer
));
verify
(
mockListener1
).
onTransformationError
(
eq
(
mediaItem
),
any
(),
eq
(
exception
));
verify
(
mockListener1
)
verify
(
mockListener2
).
onTransformationError
(
eq
(
mediaItem
),
any
(),
eq
(
exception
));
.
onTransformationError
(
eq
(
editedMediaItem
.
mediaItem
),
any
(),
eq
(
exception
));
verify
(
mockListener3
).
onTransformationError
(
eq
(
mediaItem
),
any
(),
eq
(
exception
));
verify
(
mockListener2
)
.
onTransformationError
(
eq
(
editedMediaItem
.
mediaItem
),
any
(),
eq
(
exception
));
verify
(
mockListener3
)
.
onTransformationError
(
eq
(
editedMediaItem
.
mediaItem
),
any
(),
eq
(
exception
));
}
}
@Test
@Test
...
@@ -426,17 +451,27 @@ public final class TransformerEndToEndTest {
...
@@ -426,17 +451,27 @@ public final class TransformerEndToEndTest {
.
addListener
(
mockListener2
)
.
addListener
(
mockListener2
)
.
addListener
(
mockListener3
)
.
addListener
(
mockListener3
)
.
build
();
.
build
();
MediaItem
mediaItem
=
MediaItem
.
fromUri
(
ASSET_URI_PREFIX
+
FILE_AUDIO_UNSUPPORTED_BY_MUXER
);
EditedMediaItem
editedMediaItem
=
new
EditedMediaItem
(
MediaItem
.
fromUri
(
ASSET_URI_PREFIX
+
FILE_AUDIO_UNSUPPORTED_BY_MUXER
));
transformer
.
startTransformation
(
m
ediaItem
,
outputPath
);
transformer
.
startTransformation
(
editedM
ediaItem
,
outputPath
);
TransformerTestRunner
.
runLooper
(
transformer
);
TransformerTestRunner
.
runLooper
(
transformer
);
verify
(
mockListener1
)
verify
(
mockListener1
)
.
onFallbackApplied
(
mediaItem
,
originalTransformationRequest
,
fallbackTransformationRequest
);
.
onFallbackApplied
(
editedMediaItem
.
mediaItem
,
originalTransformationRequest
,
fallbackTransformationRequest
);
verify
(
mockListener2
)
verify
(
mockListener2
)
.
onFallbackApplied
(
mediaItem
,
originalTransformationRequest
,
fallbackTransformationRequest
);
.
onFallbackApplied
(
editedMediaItem
.
mediaItem
,
originalTransformationRequest
,
fallbackTransformationRequest
);
verify
(
mockListener3
)
verify
(
mockListener3
)
.
onFallbackApplied
(
mediaItem
,
originalTransformationRequest
,
fallbackTransformationRequest
);
.
onFallbackApplied
(
editedMediaItem
.
mediaItem
,
originalTransformationRequest
,
fallbackTransformationRequest
);
}
}
@Test
@Test
...
@@ -452,14 +487,15 @@ public final class TransformerEndToEndTest {
...
@@ -452,14 +487,15 @@ public final class TransformerEndToEndTest {
.
addListener
(
mockListener3
)
.
addListener
(
mockListener3
)
.
build
();
.
build
();
Transformer
transformer2
=
transformer1
.
buildUpon
().
removeListener
(
mockListener2
).
build
();
Transformer
transformer2
=
transformer1
.
buildUpon
().
removeListener
(
mockListener2
).
build
();
MediaItem
mediaItem
=
MediaItem
.
fromUri
(
ASSET_URI_PREFIX
+
FILE_AUDIO_VIDEO
);
EditedMediaItem
editedMediaItem
=
new
EditedMediaItem
(
MediaItem
.
fromUri
(
ASSET_URI_PREFIX
+
FILE_AUDIO_VIDEO
));
transformer2
.
startTransformation
(
m
ediaItem
,
outputPath
);
transformer2
.
startTransformation
(
editedM
ediaItem
,
outputPath
);
TransformerTestRunner
.
runLooper
(
transformer2
);
TransformerTestRunner
.
runLooper
(
transformer2
);
verify
(
mockListener1
).
onTransformationCompleted
(
eq
(
mediaItem
),
any
());
verify
(
mockListener1
).
onTransformationCompleted
(
eq
(
editedMediaItem
.
mediaItem
),
any
());
verify
(
mockListener2
,
never
()).
onTransformationCompleted
(
eq
(
mediaItem
),
any
());
verify
(
mockListener2
,
never
()).
onTransformationCompleted
(
eq
(
editedMediaItem
.
mediaItem
),
any
());
verify
(
mockListener3
).
onTransformationCompleted
(
eq
(
mediaItem
),
any
());
verify
(
mockListener3
).
onTransformationCompleted
(
eq
(
editedMediaItem
.
mediaItem
),
any
());
}
}
@Test
@Test
...
@@ -469,9 +505,10 @@ public final class TransformerEndToEndTest {
...
@@ -469,9 +505,10 @@ public final class TransformerEndToEndTest {
.
setTransformationRequest
(
.
setTransformationRequest
(
new
TransformationRequest
.
Builder
().
setFlattenForSlowMotion
(
true
).
build
())
new
TransformationRequest
.
Builder
().
setFlattenForSlowMotion
(
true
).
build
())
.
build
();
.
build
();
MediaItem
mediaItem
=
MediaItem
.
fromUri
(
ASSET_URI_PREFIX
+
FILE_WITH_SEF_SLOW_MOTION
);
EditedMediaItem
editedMediaItem
=
new
EditedMediaItem
(
MediaItem
.
fromUri
(
ASSET_URI_PREFIX
+
FILE_WITH_SEF_SLOW_MOTION
));
transformer
.
startTransformation
(
m
ediaItem
,
outputPath
);
transformer
.
startTransformation
(
editedM
ediaItem
,
outputPath
);
TransformerTestRunner
.
runLooper
(
transformer
);
TransformerTestRunner
.
runLooper
(
transformer
);
DumpFileAsserts
.
assertOutput
(
context
,
testMuxer
,
getDumpFileName
(
FILE_WITH_SEF_SLOW_MOTION
));
DumpFileAsserts
.
assertOutput
(
context
,
testMuxer
,
getDumpFileName
(
FILE_WITH_SEF_SLOW_MOTION
));
...
@@ -480,9 +517,10 @@ public final class TransformerEndToEndTest {
...
@@ -480,9 +517,10 @@ public final class TransformerEndToEndTest {
@Test
@Test
public
void
startTransformation_completesWithValidBitrate
()
throws
Exception
{
public
void
startTransformation_completesWithValidBitrate
()
throws
Exception
{
Transformer
transformer
=
createTransformerBuilder
(
/* enableFallback= */
false
).
build
();
Transformer
transformer
=
createTransformerBuilder
(
/* enableFallback= */
false
).
build
();
MediaItem
mediaItem
=
MediaItem
.
fromUri
(
ASSET_URI_PREFIX
+
FILE_AUDIO_VIDEO
);
EditedMediaItem
editedMediaItem
=
new
EditedMediaItem
(
MediaItem
.
fromUri
(
ASSET_URI_PREFIX
+
FILE_AUDIO_VIDEO
));
transformer
.
startTransformation
(
m
ediaItem
,
outputPath
);
transformer
.
startTransformation
(
editedM
ediaItem
,
outputPath
);
TransformationResult
result
=
TransformerTestRunner
.
runLooper
(
transformer
);
TransformationResult
result
=
TransformerTestRunner
.
runLooper
(
transformer
);
assertThat
(
result
.
averageAudioBitrate
).
isGreaterThan
(
0
);
assertThat
(
result
.
averageAudioBitrate
).
isGreaterThan
(
0
);
...
@@ -499,9 +537,10 @@ public final class TransformerEndToEndTest {
...
@@ -499,9 +537,10 @@ public final class TransformerEndToEndTest {
MimeTypes
.
AUDIO_AMR_NB
)
// unsupported by encoder, supported by muxer
MimeTypes
.
AUDIO_AMR_NB
)
// unsupported by encoder, supported by muxer
.
build
())
.
build
())
.
build
();
.
build
();
MediaItem
mediaItem
=
MediaItem
.
fromUri
(
ASSET_URI_PREFIX
+
FILE_AUDIO_UNSUPPORTED_BY_MUXER
);
EditedMediaItem
editedMediaItem
=
new
EditedMediaItem
(
MediaItem
.
fromUri
(
ASSET_URI_PREFIX
+
FILE_AUDIO_UNSUPPORTED_BY_MUXER
));
transformer
.
startTransformation
(
m
ediaItem
,
outputPath
);
transformer
.
startTransformation
(
editedM
ediaItem
,
outputPath
);
TransformationException
exception
=
TransformationException
exception
=
assertThrows
(
assertThrows
(
TransformationException
.
class
,
()
->
TransformerTestRunner
.
runLooper
(
transformer
));
TransformationException
.
class
,
()
->
TransformerTestRunner
.
runLooper
(
transformer
));
...
@@ -519,9 +558,11 @@ public final class TransformerEndToEndTest {
...
@@ -519,9 +558,11 @@ public final class TransformerEndToEndTest {
.
setAudioMimeType
(
MimeTypes
.
AUDIO_AAC
)
// supported by encoder and muxer
.
setAudioMimeType
(
MimeTypes
.
AUDIO_AAC
)
// supported by encoder and muxer
.
build
())
.
build
())
.
build
();
.
build
();
MediaItem
mediaItem
=
MediaItem
.
fromUri
(
ASSET_URI_PREFIX
+
FILE_AUDIO_UNSUPPORTED_BY_DECODER
);
EditedMediaItem
editedMediaItem
=
new
EditedMediaItem
(
MediaItem
.
fromUri
(
ASSET_URI_PREFIX
+
FILE_AUDIO_UNSUPPORTED_BY_DECODER
));
transformer
.
startTransformation
(
m
ediaItem
,
outputPath
);
transformer
.
startTransformation
(
editedM
ediaItem
,
outputPath
);
TransformationException
exception
=
TransformationException
exception
=
assertThrows
(
assertThrows
(
TransformationException
.
class
,
()
->
TransformerTestRunner
.
runLooper
(
transformer
));
TransformationException
.
class
,
()
->
TransformerTestRunner
.
runLooper
(
transformer
));
...
@@ -533,9 +574,10 @@ public final class TransformerEndToEndTest {
...
@@ -533,9 +574,10 @@ public final class TransformerEndToEndTest {
@Test
@Test
public
void
startTransformation_withIoError_completesWithError
()
{
public
void
startTransformation_withIoError_completesWithError
()
{
Transformer
transformer
=
createTransformerBuilder
(
/* enableFallback= */
false
).
build
();
Transformer
transformer
=
createTransformerBuilder
(
/* enableFallback= */
false
).
build
();
MediaItem
mediaItem
=
MediaItem
.
fromUri
(
"asset:///non-existing-path.mp4"
);
EditedMediaItem
editedMediaItem
=
new
EditedMediaItem
(
MediaItem
.
fromUri
(
"asset:///non-existing-path.mp4"
));
transformer
.
startTransformation
(
m
ediaItem
,
outputPath
);
transformer
.
startTransformation
(
editedM
ediaItem
,
outputPath
);
TransformationException
exception
=
TransformationException
exception
=
assertThrows
(
assertThrows
(
TransformationException
.
class
,
()
->
TransformerTestRunner
.
runLooper
(
transformer
));
TransformationException
.
class
,
()
->
TransformerTestRunner
.
runLooper
(
transformer
));
...
@@ -554,15 +596,19 @@ public final class TransformerEndToEndTest {
...
@@ -554,15 +596,19 @@ public final class TransformerEndToEndTest {
new
TransformationRequest
.
Builder
().
setAudioMimeType
(
MimeTypes
.
AUDIO_AAC
).
build
();
new
TransformationRequest
.
Builder
().
setAudioMimeType
(
MimeTypes
.
AUDIO_AAC
).
build
();
Transformer
transformer
=
Transformer
transformer
=
createTransformerBuilder
(
/* enableFallback= */
false
).
addListener
(
mockListener
).
build
();
createTransformerBuilder
(
/* enableFallback= */
false
).
addListener
(
mockListener
).
build
();
MediaItem
mediaItem
=
MediaItem
.
fromUri
(
ASSET_URI_PREFIX
+
FILE_AUDIO_UNSUPPORTED_BY_MUXER
);
EditedMediaItem
editedMediaItem
=
new
EditedMediaItem
(
MediaItem
.
fromUri
(
ASSET_URI_PREFIX
+
FILE_AUDIO_UNSUPPORTED_BY_MUXER
));
transformer
.
startTransformation
(
m
ediaItem
,
outputPath
);
transformer
.
startTransformation
(
editedM
ediaItem
,
outputPath
);
TransformerTestRunner
.
runLooper
(
transformer
);
TransformerTestRunner
.
runLooper
(
transformer
);
DumpFileAsserts
.
assertOutput
(
DumpFileAsserts
.
assertOutput
(
context
,
testMuxer
,
getDumpFileName
(
FILE_AUDIO_UNSUPPORTED_BY_MUXER
+
".fallback"
));
context
,
testMuxer
,
getDumpFileName
(
FILE_AUDIO_UNSUPPORTED_BY_MUXER
+
".fallback"
));
verify
(
mockListener
)
verify
(
mockListener
)
.
onFallbackApplied
(
mediaItem
,
originalTransformationRequest
,
fallbackTransformationRequest
);
.
onFallbackApplied
(
editedMediaItem
.
mediaItem
,
originalTransformationRequest
,
fallbackTransformationRequest
);
}
}
@Test
@Test
...
@@ -575,15 +621,19 @@ public final class TransformerEndToEndTest {
...
@@ -575,15 +621,19 @@ public final class TransformerEndToEndTest {
new
TransformationRequest
.
Builder
().
setAudioMimeType
(
MimeTypes
.
AUDIO_AAC
).
build
();
new
TransformationRequest
.
Builder
().
setAudioMimeType
(
MimeTypes
.
AUDIO_AAC
).
build
();
Transformer
transformer
=
Transformer
transformer
=
createTransformerBuilder
(
/* enableFallback= */
true
).
addListener
(
mockListener
).
build
();
createTransformerBuilder
(
/* enableFallback= */
true
).
addListener
(
mockListener
).
build
();
MediaItem
mediaItem
=
MediaItem
.
fromUri
(
ASSET_URI_PREFIX
+
FILE_AUDIO_UNSUPPORTED_BY_MUXER
);
EditedMediaItem
editedMediaItem
=
new
EditedMediaItem
(
MediaItem
.
fromUri
(
ASSET_URI_PREFIX
+
FILE_AUDIO_UNSUPPORTED_BY_MUXER
));
transformer
.
startTransformation
(
m
ediaItem
,
outputPath
);
transformer
.
startTransformation
(
editedM
ediaItem
,
outputPath
);
TransformerTestRunner
.
runLooper
(
transformer
);
TransformerTestRunner
.
runLooper
(
transformer
);
DumpFileAsserts
.
assertOutput
(
DumpFileAsserts
.
assertOutput
(
context
,
testMuxer
,
getDumpFileName
(
FILE_AUDIO_UNSUPPORTED_BY_MUXER
+
".fallback"
));
context
,
testMuxer
,
getDumpFileName
(
FILE_AUDIO_UNSUPPORTED_BY_MUXER
+
".fallback"
));
verify
(
mockListener
)
verify
(
mockListener
)
.
onFallbackApplied
(
mediaItem
,
originalTransformationRequest
,
fallbackTransformationRequest
);
.
onFallbackApplied
(
editedMediaItem
.
mediaItem
,
originalTransformationRequest
,
fallbackTransformationRequest
);
}
}
@Test
@Test
...
@@ -600,9 +650,10 @@ public final class TransformerEndToEndTest {
...
@@ -600,9 +650,10 @@ public final class TransformerEndToEndTest {
.
setAssetLoaderFactory
(
assetLoaderFactory
)
.
setAssetLoaderFactory
(
assetLoaderFactory
)
.
setMuxerFactory
(
muxerFactory
)
.
setMuxerFactory
(
muxerFactory
)
.
build
();
.
build
();
MediaItem
mediaItem
=
MediaItem
.
fromUri
(
ASSET_URI_PREFIX
+
FILE_AUDIO_VIDEO
);
EditedMediaItem
editedMediaItem
=
new
EditedMediaItem
(
MediaItem
.
fromUri
(
ASSET_URI_PREFIX
+
FILE_AUDIO_VIDEO
));
transformer
.
startTransformation
(
m
ediaItem
,
outputPath
);
transformer
.
startTransformation
(
editedM
ediaItem
,
outputPath
);
TransformationException
exception
=
TransformationException
exception
=
assertThrows
(
assertThrows
(
TransformationException
.
class
,
()
->
TransformerTestRunner
.
runLooper
(
transformer
));
TransformationException
.
class
,
()
->
TransformerTestRunner
.
runLooper
(
transformer
));
...
@@ -616,9 +667,10 @@ public final class TransformerEndToEndTest {
...
@@ -616,9 +667,10 @@ public final class TransformerEndToEndTest {
Muxer
.
Factory
muxerFactory
=
new
TestMuxerFactory
(
/* maxDelayBetweenSamplesMs= */
C
.
TIME_UNSET
);
Muxer
.
Factory
muxerFactory
=
new
TestMuxerFactory
(
/* maxDelayBetweenSamplesMs= */
C
.
TIME_UNSET
);
Transformer
transformer
=
Transformer
transformer
=
createTransformerBuilder
(
/* enableFallback= */
false
).
setMuxerFactory
(
muxerFactory
).
build
();
createTransformerBuilder
(
/* enableFallback= */
false
).
setMuxerFactory
(
muxerFactory
).
build
();
MediaItem
mediaItem
=
MediaItem
.
fromUri
(
ASSET_URI_PREFIX
+
FILE_AUDIO_VIDEO
);
EditedMediaItem
editedMediaItem
=
new
EditedMediaItem
(
MediaItem
.
fromUri
(
ASSET_URI_PREFIX
+
FILE_AUDIO_VIDEO
));
transformer
.
startTransformation
(
m
ediaItem
,
outputPath
);
transformer
.
startTransformation
(
editedM
ediaItem
,
outputPath
);
TransformerTestRunner
.
runLooper
(
transformer
);
TransformerTestRunner
.
runLooper
(
transformer
);
DumpFileAsserts
.
assertOutput
(
context
,
testMuxer
,
getDumpFileName
(
FILE_AUDIO_VIDEO
));
DumpFileAsserts
.
assertOutput
(
context
,
testMuxer
,
getDumpFileName
(
FILE_AUDIO_VIDEO
));
...
@@ -627,14 +679,15 @@ public final class TransformerEndToEndTest {
...
@@ -627,14 +679,15 @@ public final class TransformerEndToEndTest {
@Test
@Test
public
void
startTransformation_afterCancellation_completesSuccessfully
()
throws
Exception
{
public
void
startTransformation_afterCancellation_completesSuccessfully
()
throws
Exception
{
Transformer
transformer
=
createTransformerBuilder
(
/* enableFallback= */
false
).
build
();
Transformer
transformer
=
createTransformerBuilder
(
/* enableFallback= */
false
).
build
();
MediaItem
mediaItem
=
MediaItem
.
fromUri
(
ASSET_URI_PREFIX
+
FILE_AUDIO_VIDEO
);
EditedMediaItem
editedMediaItem
=
new
EditedMediaItem
(
MediaItem
.
fromUri
(
ASSET_URI_PREFIX
+
FILE_AUDIO_VIDEO
));
transformer
.
startTransformation
(
m
ediaItem
,
outputPath
);
transformer
.
startTransformation
(
editedM
ediaItem
,
outputPath
);
transformer
.
cancel
();
transformer
.
cancel
();
Files
.
delete
(
Paths
.
get
(
outputPath
));
Files
.
delete
(
Paths
.
get
(
outputPath
));
// This would throw if the previous transformation had not been cancelled.
// This would throw if the previous transformation had not been cancelled.
transformer
.
startTransformation
(
m
ediaItem
,
outputPath
);
transformer
.
startTransformation
(
editedM
ediaItem
,
outputPath
);
TransformationResult
transformationResult
=
TransformerTestRunner
.
runLooper
(
transformer
);
TransformationResult
transformationResult
=
TransformerTestRunner
.
runLooper
(
transformer
);
// TODO(b/264974805): Make transformation output deterministic and check it against dump file.
// TODO(b/264974805): Make transformation output deterministic and check it against dump file.
...
@@ -648,7 +701,8 @@ public final class TransformerEndToEndTest {
...
@@ -648,7 +701,8 @@ public final class TransformerEndToEndTest {
Looper
looper
=
anotherThread
.
getLooper
();
Looper
looper
=
anotherThread
.
getLooper
();
Transformer
transformer
=
Transformer
transformer
=
createTransformerBuilder
(
/* enableFallback= */
false
).
setLooper
(
looper
).
build
();
createTransformerBuilder
(
/* enableFallback= */
false
).
setLooper
(
looper
).
build
();
MediaItem
mediaItem
=
MediaItem
.
fromUri
(
ASSET_URI_PREFIX
+
FILE_AUDIO_VIDEO
);
EditedMediaItem
editedMediaItem
=
new
EditedMediaItem
(
MediaItem
.
fromUri
(
ASSET_URI_PREFIX
+
FILE_AUDIO_VIDEO
));
AtomicReference
<
Exception
>
exception
=
new
AtomicReference
<>();
AtomicReference
<
Exception
>
exception
=
new
AtomicReference
<>();
CountDownLatch
countDownLatch
=
new
CountDownLatch
(
1
);
CountDownLatch
countDownLatch
=
new
CountDownLatch
(
1
);
...
@@ -656,7 +710,7 @@ public final class TransformerEndToEndTest {
...
@@ -656,7 +710,7 @@ public final class TransformerEndToEndTest {
.
post
(
.
post
(
()
->
{
()
->
{
try
{
try
{
transformer
.
startTransformation
(
m
ediaItem
,
outputPath
);
transformer
.
startTransformation
(
editedM
ediaItem
,
outputPath
);
TransformerTestRunner
.
runLooper
(
transformer
);
TransformerTestRunner
.
runLooper
(
transformer
);
}
catch
(
Exception
e
)
{
}
catch
(
Exception
e
)
{
exception
.
set
(
e
);
exception
.
set
(
e
);
...
@@ -673,7 +727,8 @@ public final class TransformerEndToEndTest {
...
@@ -673,7 +727,8 @@ public final class TransformerEndToEndTest {
@Test
@Test
public
void
startTransformation_fromWrongThread_throwsError
()
throws
Exception
{
public
void
startTransformation_fromWrongThread_throwsError
()
throws
Exception
{
Transformer
transformer
=
createTransformerBuilder
(
/* enableFallback= */
false
).
build
();
Transformer
transformer
=
createTransformerBuilder
(
/* enableFallback= */
false
).
build
();
MediaItem
mediaItem
=
MediaItem
.
fromUri
(
ASSET_URI_PREFIX
+
FILE_AUDIO_VIDEO
);
EditedMediaItem
editedMediaItem
=
new
EditedMediaItem
(
MediaItem
.
fromUri
(
ASSET_URI_PREFIX
+
FILE_AUDIO_VIDEO
));
HandlerThread
anotherThread
=
new
HandlerThread
(
"AnotherThread"
);
HandlerThread
anotherThread
=
new
HandlerThread
(
"AnotherThread"
);
AtomicReference
<
IllegalStateException
>
illegalStateException
=
new
AtomicReference
<>();
AtomicReference
<
IllegalStateException
>
illegalStateException
=
new
AtomicReference
<>();
CountDownLatch
countDownLatch
=
new
CountDownLatch
(
1
);
CountDownLatch
countDownLatch
=
new
CountDownLatch
(
1
);
...
@@ -683,7 +738,7 @@ public final class TransformerEndToEndTest {
...
@@ -683,7 +738,7 @@ public final class TransformerEndToEndTest {
.
post
(
.
post
(
()
->
{
()
->
{
try
{
try
{
transformer
.
startTransformation
(
m
ediaItem
,
outputPath
);
transformer
.
startTransformation
(
editedM
ediaItem
,
outputPath
);
}
catch
(
IllegalStateException
e
)
{
}
catch
(
IllegalStateException
e
)
{
illegalStateException
.
set
(
e
);
illegalStateException
.
set
(
e
);
}
finally
{
}
finally
{
...
@@ -704,9 +759,10 @@ public final class TransformerEndToEndTest {
...
@@ -704,9 +759,10 @@ public final class TransformerEndToEndTest {
.
setAssetLoaderFactory
(
.
setAssetLoaderFactory
(
new
FakeAssetLoader
.
Factory
(
SUPPORTED_OUTPUT_TYPE_DECODED
,
sampleConsumerRef
))
new
FakeAssetLoader
.
Factory
(
SUPPORTED_OUTPUT_TYPE_DECODED
,
sampleConsumerRef
))
.
build
();
.
build
();
MediaItem
mediaItem
=
MediaItem
.
fromUri
(
ASSET_URI_PREFIX
+
FILE_AUDIO_VIDEO
);
EditedMediaItem
editedMediaItem
=
new
EditedMediaItem
(
MediaItem
.
fromUri
(
ASSET_URI_PREFIX
+
FILE_AUDIO_VIDEO
));
transformer
.
startTransformation
(
m
ediaItem
,
outputPath
);
transformer
.
startTransformation
(
editedM
ediaItem
,
outputPath
);
runLooperUntil
(
transformer
.
getApplicationLooper
(),
()
->
sampleConsumerRef
.
get
()
!=
null
);
runLooperUntil
(
transformer
.
getApplicationLooper
(),
()
->
sampleConsumerRef
.
get
()
!=
null
);
assertThat
(
sampleConsumerRef
.
get
().
expectsDecodedData
()).
isTrue
();
assertThat
(
sampleConsumerRef
.
get
().
expectsDecodedData
()).
isTrue
();
...
@@ -716,14 +772,16 @@ public final class TransformerEndToEndTest {
...
@@ -716,14 +772,16 @@ public final class TransformerEndToEndTest {
public
void
startTransformation_withAssetLoaderNotDecodingAndDecodingNeeded_completesWithError
()
{
public
void
startTransformation_withAssetLoaderNotDecodingAndDecodingNeeded_completesWithError
()
{
Transformer
transformer
=
Transformer
transformer
=
createTransformerBuilder
(
/* enableFallback= */
false
)
createTransformerBuilder
(
/* enableFallback= */
false
)
.
setAudioProcessors
(
ImmutableList
.
of
(
new
SonicAudioProcessor
()))
.
setAssetLoaderFactory
(
.
setAssetLoaderFactory
(
new
FakeAssetLoader
.
Factory
(
new
FakeAssetLoader
.
Factory
(
SUPPORTED_OUTPUT_TYPE_ENCODED
,
/* sampleConsumerRef= */
null
))
SUPPORTED_OUTPUT_TYPE_ENCODED
,
/* sampleConsumerRef= */
null
))
.
build
();
.
build
();
MediaItem
mediaItem
=
MediaItem
.
fromUri
(
ASSET_URI_PREFIX
+
FILE_AUDIO_VIDEO
);
MediaItem
mediaItem
=
MediaItem
.
fromUri
(
ASSET_URI_PREFIX
+
FILE_AUDIO_VIDEO
);
ImmutableList
<
AudioProcessor
>
audioProcessors
=
ImmutableList
.
of
(
new
SonicAudioProcessor
());
Effects
effects
=
new
Effects
(
audioProcessors
,
/* videoEffects= */
ImmutableList
.
of
());
EditedMediaItem
editedMediaItem
=
new
EditedMediaItem
(
mediaItem
,
effects
);
transformer
.
startTransformation
(
m
ediaItem
,
outputPath
);
transformer
.
startTransformation
(
editedM
ediaItem
,
outputPath
);
TransformationException
transformationException
=
TransformationException
transformationException
=
assertThrows
(
assertThrows
(
TransformationException
.
class
,
()
->
TransformerTestRunner
.
runLooper
(
transformer
));
TransformationException
.
class
,
()
->
TransformerTestRunner
.
runLooper
(
transformer
));
...
@@ -733,15 +791,17 @@ public final class TransformerEndToEndTest {
...
@@ -733,15 +791,17 @@ public final class TransformerEndToEndTest {
@Test
@Test
public
void
startTransformation_withNoOpEffects_transmuxes
()
throws
Exception
{
public
void
startTransformation_withNoOpEffects_transmuxes
()
throws
Exception
{
Transformer
transformer
=
createTransformerBuilder
(
/* enableFallback= */
false
).
build
();
MediaItem
mediaItem
=
MediaItem
.
fromUri
(
ASSET_URI_PREFIX
+
FILE_VIDEO_ONLY
);
MediaItem
mediaItem
=
MediaItem
.
fromUri
(
ASSET_URI_PREFIX
+
FILE_VIDEO_ONLY
);
int
mediaItemHeightPixels
=
720
;
int
mediaItemHeightPixels
=
720
;
List
<
Effect
>
videoEffects
=
new
ArrayList
<>();
ImmutableList
<
Effect
>
videoEffects
=
videoEffects
.
add
(
Presentation
.
createForHeight
(
mediaItemHeightPixels
));
ImmutableList
.
of
(
videoEffects
.
add
(
new
ScaleToFitTransformation
.
Builder
().
build
());
Presentation
.
createForHeight
(
mediaItemHeightPixels
),
Transformer
transformer
=
new
ScaleToFitTransformation
.
Builder
().
build
());
createTransformerBuilder
(
/* enableFallback= */
false
).
setVideoEffects
(
videoEffects
).
build
();
Effects
effects
=
new
Effects
(
ImmutableList
.
of
(),
videoEffects
);
EditedMediaItem
editedMediaItem
=
new
EditedMediaItem
(
mediaItem
,
effects
);
transformer
.
startTransformation
(
mediaItem
,
outputPath
);
transformer
.
startTransformation
(
editedMediaItem
,
outputPath
);
TransformerTestRunner
.
runLooper
(
transformer
);
TransformerTestRunner
.
runLooper
(
transformer
);
// Video transcoding in unit tests is not supported.
// Video transcoding in unit tests is not supported.
...
@@ -751,7 +811,8 @@ public final class TransformerEndToEndTest {
...
@@ -751,7 +811,8 @@ public final class TransformerEndToEndTest {
@Test
@Test
public
void
getProgress_knownDuration_returnsConsistentStates
()
throws
Exception
{
public
void
getProgress_knownDuration_returnsConsistentStates
()
throws
Exception
{
Transformer
transformer
=
createTransformerBuilder
(
/* enableFallback= */
false
).
build
();
Transformer
transformer
=
createTransformerBuilder
(
/* enableFallback= */
false
).
build
();
MediaItem
mediaItem
=
MediaItem
.
fromUri
(
ASSET_URI_PREFIX
+
FILE_VIDEO_ONLY
);
EditedMediaItem
editedMediaItem
=
new
EditedMediaItem
(
MediaItem
.
fromUri
(
ASSET_URI_PREFIX
+
FILE_VIDEO_ONLY
));
AtomicInteger
previousProgressState
=
AtomicInteger
previousProgressState
=
new
AtomicInteger
(
PROGRESS_STATE_WAITING_FOR_AVAILABILITY
);
new
AtomicInteger
(
PROGRESS_STATE_WAITING_FOR_AVAILABILITY
);
AtomicBoolean
foundInconsistentState
=
new
AtomicBoolean
();
AtomicBoolean
foundInconsistentState
=
new
AtomicBoolean
();
...
@@ -787,7 +848,7 @@ public final class TransformerEndToEndTest {
...
@@ -787,7 +848,7 @@ public final class TransformerEndToEndTest {
}
}
};
};
transformer
.
startTransformation
(
m
ediaItem
,
outputPath
);
transformer
.
startTransformation
(
editedM
ediaItem
,
outputPath
);
progressHandler
.
sendEmptyMessage
(
0
);
progressHandler
.
sendEmptyMessage
(
0
);
TransformerTestRunner
.
runLooper
(
transformer
);
TransformerTestRunner
.
runLooper
(
transformer
);
...
@@ -797,7 +858,8 @@ public final class TransformerEndToEndTest {
...
@@ -797,7 +858,8 @@ public final class TransformerEndToEndTest {
@Test
@Test
public
void
getProgress_knownDuration_givesIncreasingPercentages
()
throws
Exception
{
public
void
getProgress_knownDuration_givesIncreasingPercentages
()
throws
Exception
{
Transformer
transformer
=
createTransformerBuilder
(
/* enableFallback= */
false
).
build
();
Transformer
transformer
=
createTransformerBuilder
(
/* enableFallback= */
false
).
build
();
MediaItem
mediaItem
=
MediaItem
.
fromUri
(
ASSET_URI_PREFIX
+
FILE_VIDEO_ONLY
);
EditedMediaItem
editedMediaItem
=
new
EditedMediaItem
(
MediaItem
.
fromUri
(
ASSET_URI_PREFIX
+
FILE_VIDEO_ONLY
));
List
<
Integer
>
progresses
=
new
ArrayList
<>();
List
<
Integer
>
progresses
=
new
ArrayList
<>();
Handler
progressHandler
=
Handler
progressHandler
=
new
Handler
(
Looper
.
myLooper
())
{
new
Handler
(
Looper
.
myLooper
())
{
...
@@ -816,7 +878,7 @@ public final class TransformerEndToEndTest {
...
@@ -816,7 +878,7 @@ public final class TransformerEndToEndTest {
}
}
};
};
transformer
.
startTransformation
(
m
ediaItem
,
outputPath
);
transformer
.
startTransformation
(
editedM
ediaItem
,
outputPath
);
progressHandler
.
sendEmptyMessage
(
0
);
progressHandler
.
sendEmptyMessage
(
0
);
TransformerTestRunner
.
runLooper
(
transformer
);
TransformerTestRunner
.
runLooper
(
transformer
);
...
@@ -832,10 +894,11 @@ public final class TransformerEndToEndTest {
...
@@ -832,10 +894,11 @@ public final class TransformerEndToEndTest {
@Test
@Test
public
void
getProgress_noCurrentTransformation_returnsNoTransformation
()
throws
Exception
{
public
void
getProgress_noCurrentTransformation_returnsNoTransformation
()
throws
Exception
{
Transformer
transformer
=
createTransformerBuilder
(
/* enableFallback= */
false
).
build
();
Transformer
transformer
=
createTransformerBuilder
(
/* enableFallback= */
false
).
build
();
MediaItem
mediaItem
=
MediaItem
.
fromUri
(
ASSET_URI_PREFIX
+
FILE_VIDEO_ONLY
);
EditedMediaItem
editedMediaItem
=
new
EditedMediaItem
(
MediaItem
.
fromUri
(
ASSET_URI_PREFIX
+
FILE_VIDEO_ONLY
));
@Transformer
.
ProgressState
int
stateBeforeTransform
=
transformer
.
getProgress
(
progressHolder
);
@Transformer
.
ProgressState
int
stateBeforeTransform
=
transformer
.
getProgress
(
progressHolder
);
transformer
.
startTransformation
(
m
ediaItem
,
outputPath
);
transformer
.
startTransformation
(
editedM
ediaItem
,
outputPath
);
TransformerTestRunner
.
runLooper
(
transformer
);
TransformerTestRunner
.
runLooper
(
transformer
);
@Transformer
.
ProgressState
int
stateAfterTransform
=
transformer
.
getProgress
(
progressHolder
);
@Transformer
.
ProgressState
int
stateAfterTransform
=
transformer
.
getProgress
(
progressHolder
);
...
@@ -846,7 +909,8 @@ public final class TransformerEndToEndTest {
...
@@ -846,7 +909,8 @@ public final class TransformerEndToEndTest {
@Test
@Test
public
void
getProgress_unknownDuration_returnsConsistentStates
()
throws
Exception
{
public
void
getProgress_unknownDuration_returnsConsistentStates
()
throws
Exception
{
Transformer
transformer
=
createTransformerBuilder
(
/* enableFallback= */
false
).
build
();
Transformer
transformer
=
createTransformerBuilder
(
/* enableFallback= */
false
).
build
();
MediaItem
mediaItem
=
MediaItem
.
fromUri
(
ASSET_URI_PREFIX
+
FILE_UNKNOWN_DURATION
);
EditedMediaItem
editedMediaItem
=
new
EditedMediaItem
(
MediaItem
.
fromUri
(
ASSET_URI_PREFIX
+
FILE_UNKNOWN_DURATION
));
AtomicInteger
previousProgressState
=
AtomicInteger
previousProgressState
=
new
AtomicInteger
(
PROGRESS_STATE_WAITING_FOR_AVAILABILITY
);
new
AtomicInteger
(
PROGRESS_STATE_WAITING_FOR_AVAILABILITY
);
AtomicBoolean
foundInconsistentState
=
new
AtomicBoolean
();
AtomicBoolean
foundInconsistentState
=
new
AtomicBoolean
();
...
@@ -879,7 +943,7 @@ public final class TransformerEndToEndTest {
...
@@ -879,7 +943,7 @@ public final class TransformerEndToEndTest {
}
}
};
};
transformer
.
startTransformation
(
m
ediaItem
,
outputPath
);
transformer
.
startTransformation
(
editedM
ediaItem
,
outputPath
);
progressHandler
.
sendEmptyMessage
(
0
);
progressHandler
.
sendEmptyMessage
(
0
);
TransformerTestRunner
.
runLooper
(
transformer
);
TransformerTestRunner
.
runLooper
(
transformer
);
...
@@ -913,9 +977,10 @@ public final class TransformerEndToEndTest {
...
@@ -913,9 +977,10 @@ public final class TransformerEndToEndTest {
@Test
@Test
public
void
cancel_afterCompletion_doesNotThrow
()
throws
Exception
{
public
void
cancel_afterCompletion_doesNotThrow
()
throws
Exception
{
Transformer
transformer
=
createTransformerBuilder
(
/* enableFallback= */
false
).
build
();
Transformer
transformer
=
createTransformerBuilder
(
/* enableFallback= */
false
).
build
();
MediaItem
mediaItem
=
MediaItem
.
fromUri
(
ASSET_URI_PREFIX
+
FILE_VIDEO_ONLY
);
EditedMediaItem
editedMediaItem
=
new
EditedMediaItem
(
MediaItem
.
fromUri
(
ASSET_URI_PREFIX
+
FILE_VIDEO_ONLY
));
transformer
.
startTransformation
(
m
ediaItem
,
outputPath
);
transformer
.
startTransformation
(
editedM
ediaItem
,
outputPath
);
TransformerTestRunner
.
runLooper
(
transformer
);
TransformerTestRunner
.
runLooper
(
transformer
);
transformer
.
cancel
();
transformer
.
cancel
();
}
}
...
...
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