Add audio/video sample mime type in ExportResult

PiperOrigin-RevId: 603013441
This commit is contained in:
sheenachhabra 2024-01-31 04:57:22 -08:00 committed by Copybara-Service
parent 45bd5c6f0a
commit 5147eb1a65
3 changed files with 68 additions and 7 deletions

View file

@ -925,8 +925,8 @@ public class TransformerEndToEndTest {
} }
@Test @Test
public void transcode_withOutputMimeTypeAv1_completesSuccessfully() throws Exception { public void transcode_withOutputVideoMimeTypeAv1_completesSuccessfully() throws Exception {
String testId = "transcode_withOutputMimeTypeAv1_completesSuccessfully"; String testId = "transcode_withOutputVideoMimeTypeAv1_completesSuccessfully";
if (AndroidTestUtil.skipAndLogIfFormatsUnsupported( if (AndroidTestUtil.skipAndLogIfFormatsUnsupported(
context, context,
testId, testId,
@ -943,13 +943,36 @@ public class TransformerEndToEndTest {
Transformer transformer = Transformer transformer =
new Transformer.Builder(context).setVideoMimeType(MimeTypes.VIDEO_AV1).build(); new Transformer.Builder(context).setVideoMimeType(MimeTypes.VIDEO_AV1).build();
ExportTestResult exportTestResult = ExportResult exportResult =
new TransformerAndroidTestRunner.Builder(context, transformer) new TransformerAndroidTestRunner.Builder(context, transformer)
.build() .build()
.run(testId, editedMediaItem); .run(testId, editedMediaItem)
.exportResult;
// TODO: b/322813915 - Assert on output mime type. // TODO: b/322954582 - Also assert by probing output file.
assertThat(exportTestResult.exportResult.exportException).isNull(); assertThat(exportResult.exportException).isNull();
assertThat(exportResult.durationMs).isGreaterThan(0);
assertThat(exportResult.videoMimeType).isEqualTo(MimeTypes.VIDEO_AV1);
}
@Test
public void transcode_withOutputAudioMimeTypeAac_completesSuccessfully() throws Exception {
String testId = "transcode_withOutputAudioMimeTypeAac_completesSuccessfully";
MediaItem mediaItem = MediaItem.fromUri(Uri.parse(MP3_ASSET_URI_STRING));
EditedMediaItem editedMediaItem = new EditedMediaItem.Builder(mediaItem).build();
Transformer transformer =
new Transformer.Builder(context).setAudioMimeType(MimeTypes.AUDIO_AAC).build();
ExportResult exportResult =
new TransformerAndroidTestRunner.Builder(context, transformer)
.build()
.run(testId, editedMediaItem)
.exportResult;
// TODO: b/322954582 - Also assert by probing output file.
assertThat(exportResult.exportException).isNull();
assertThat(exportResult.durationMs).isGreaterThan(0);
assertThat(exportResult.audioMimeType).isEqualTo(MimeTypes.AUDIO_AAC);
} }
private static AudioProcessor createSonic(float pitch) { private static AudioProcessor createSonic(float pitch) {

View file

@ -23,6 +23,7 @@ import androidx.annotation.Nullable;
import androidx.media3.common.C; import androidx.media3.common.C;
import androidx.media3.common.ColorInfo; import androidx.media3.common.ColorInfo;
import androidx.media3.common.MediaItem; import androidx.media3.common.MediaItem;
import androidx.media3.common.MimeTypes;
import androidx.media3.common.util.UnstableApi; import androidx.media3.common.util.UnstableApi;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import com.google.errorprone.annotations.CanIgnoreReturnValue; import com.google.errorprone.annotations.CanIgnoreReturnValue;
@ -46,12 +47,14 @@ public final class ExportResult {
private int channelCount; private int channelCount;
private int sampleRate; private int sampleRate;
@Nullable private String audioEncoderName; @Nullable private String audioEncoderName;
@Nullable private String audioMimeType;
private int averageVideoBitrate; private int averageVideoBitrate;
@Nullable private ColorInfo colorInfo; @Nullable private ColorInfo colorInfo;
private int height; private int height;
private int width; private int width;
private int videoFrameCount; private int videoFrameCount;
@Nullable private String videoEncoderName; @Nullable private String videoEncoderName;
@Nullable private String videoMimeType;
private @OptimizationResult int optimizationResult; private @OptimizationResult int optimizationResult;
@Nullable private ExportException exportException; @Nullable private ExportException exportException;
@ -137,6 +140,13 @@ public final class ExportResult {
return this; return this;
} }
/** Sets the output audio {@linkplain androidx.media3.common.MimeTypes mime type}. */
@CanIgnoreReturnValue
public Builder setAudioMimeType(@Nullable String audioMimeType) {
this.audioMimeType = audioMimeType;
return this;
}
/** /**
* Sets the average video bitrate. * Sets the average video bitrate.
* *
@ -199,6 +209,13 @@ public final class ExportResult {
return this; return this;
} }
/** Sets the output video {@linkplain androidx.media3.common.MimeTypes mime type}. */
@CanIgnoreReturnValue
public Builder setVideoMimeType(@Nullable String videoMimeType) {
this.videoMimeType = videoMimeType;
return this;
}
/** /**
* Sets {@link OptimizationResult} to indicate an optimization as been successful, or has failed * Sets {@link OptimizationResult} to indicate an optimization as been successful, or has failed
* and normal export proceeded instead. * and normal export proceeded instead.
@ -231,12 +248,14 @@ public final class ExportResult {
channelCount, channelCount,
sampleRate, sampleRate,
audioEncoderName, audioEncoderName,
audioMimeType,
averageVideoBitrate, averageVideoBitrate,
colorInfo, colorInfo,
height, height,
width, width,
videoFrameCount, videoFrameCount,
videoEncoderName, videoEncoderName,
videoMimeType,
optimizationResult, optimizationResult,
exportException); exportException);
} }
@ -382,6 +401,9 @@ public final class ExportResult {
/** The name of the audio encoder used, or {@code null} if none were used. */ /** The name of the audio encoder used, or {@code null} if none were used. */
@Nullable public final String audioEncoderName; @Nullable public final String audioEncoderName;
/** The output audio {@linkplain MimeTypes mime type}, or {@code null} if unset or unknown. */
@Nullable public final String audioMimeType;
/** /**
* The average bitrate of the video track data, or {@link C#RATE_UNSET_INT} if unset or unknown. * The average bitrate of the video track data, or {@link C#RATE_UNSET_INT} if unset or unknown.
*/ */
@ -402,6 +424,9 @@ public final class ExportResult {
/** The name of the video encoder used, or {@code null} if none were used. */ /** The name of the video encoder used, or {@code null} if none were used. */
@Nullable public final String videoEncoderName; @Nullable public final String videoEncoderName;
/** The output video {@linkplain MimeTypes mime type}, or {@code null} if unset or unknown. */
@Nullable public final String videoMimeType;
/** The result of any requested optimizations. */ /** The result of any requested optimizations. */
public final @OptimizationResult int optimizationResult; public final @OptimizationResult int optimizationResult;
@ -419,12 +444,14 @@ public final class ExportResult {
int channelCount, int channelCount,
int sampleRate, int sampleRate,
@Nullable String audioEncoderName, @Nullable String audioEncoderName,
@Nullable String audioMimeType,
int averageVideoBitrate, int averageVideoBitrate,
@Nullable ColorInfo colorInfo, @Nullable ColorInfo colorInfo,
int height, int height,
int width, int width,
int videoFrameCount, int videoFrameCount,
@Nullable String videoEncoderName, @Nullable String videoEncoderName,
@Nullable String videoMimeType,
@OptimizationResult int optimizationResult, @OptimizationResult int optimizationResult,
@Nullable ExportException exportException) { @Nullable ExportException exportException) {
this.processedInputs = processedInputs; this.processedInputs = processedInputs;
@ -434,12 +461,14 @@ public final class ExportResult {
this.channelCount = channelCount; this.channelCount = channelCount;
this.sampleRate = sampleRate; this.sampleRate = sampleRate;
this.audioEncoderName = audioEncoderName; this.audioEncoderName = audioEncoderName;
this.audioMimeType = audioMimeType;
this.averageVideoBitrate = averageVideoBitrate; this.averageVideoBitrate = averageVideoBitrate;
this.colorInfo = colorInfo; this.colorInfo = colorInfo;
this.height = height; this.height = height;
this.width = width; this.width = width;
this.videoFrameCount = videoFrameCount; this.videoFrameCount = videoFrameCount;
this.videoEncoderName = videoEncoderName; this.videoEncoderName = videoEncoderName;
this.videoMimeType = videoMimeType;
this.optimizationResult = optimizationResult; this.optimizationResult = optimizationResult;
this.exportException = exportException; this.exportException = exportException;
} }
@ -453,12 +482,14 @@ public final class ExportResult {
.setChannelCount(channelCount) .setChannelCount(channelCount)
.setSampleRate(sampleRate) .setSampleRate(sampleRate)
.setAudioEncoderName(audioEncoderName) .setAudioEncoderName(audioEncoderName)
.setAudioMimeType(audioMimeType)
.setAverageVideoBitrate(averageVideoBitrate) .setAverageVideoBitrate(averageVideoBitrate)
.setColorInfo(colorInfo) .setColorInfo(colorInfo)
.setHeight(height) .setHeight(height)
.setWidth(width) .setWidth(width)
.setVideoFrameCount(videoFrameCount) .setVideoFrameCount(videoFrameCount)
.setVideoEncoderName(videoEncoderName) .setVideoEncoderName(videoEncoderName)
.setVideoMimeType(videoMimeType)
.setOptimizationResult(optimizationResult) .setOptimizationResult(optimizationResult)
.setExportException(exportException); .setExportException(exportException);
} }
@ -479,12 +510,14 @@ public final class ExportResult {
&& channelCount == result.channelCount && channelCount == result.channelCount
&& sampleRate == result.sampleRate && sampleRate == result.sampleRate
&& Objects.equals(audioEncoderName, result.audioEncoderName) && Objects.equals(audioEncoderName, result.audioEncoderName)
&& Objects.equals(audioMimeType, result.audioMimeType)
&& averageVideoBitrate == result.averageVideoBitrate && averageVideoBitrate == result.averageVideoBitrate
&& Objects.equals(colorInfo, result.colorInfo) && Objects.equals(colorInfo, result.colorInfo)
&& height == result.height && height == result.height
&& width == result.width && width == result.width
&& videoFrameCount == result.videoFrameCount && videoFrameCount == result.videoFrameCount
&& Objects.equals(videoEncoderName, result.videoEncoderName) && Objects.equals(videoEncoderName, result.videoEncoderName)
&& Objects.equals(videoMimeType, result.videoMimeType)
&& optimizationResult == result.optimizationResult && optimizationResult == result.optimizationResult
&& Objects.equals(exportException, result.exportException); && Objects.equals(exportException, result.exportException);
} }
@ -498,12 +531,14 @@ public final class ExportResult {
result = 31 * result + channelCount; result = 31 * result + channelCount;
result = 31 * result + sampleRate; result = 31 * result + sampleRate;
result = 31 * result + Objects.hashCode(audioEncoderName); result = 31 * result + Objects.hashCode(audioEncoderName);
result = 31 * result + Objects.hashCode(audioMimeType);
result = 31 * result + averageVideoBitrate; result = 31 * result + averageVideoBitrate;
result = 31 * result + Objects.hashCode(colorInfo); result = 31 * result + Objects.hashCode(colorInfo);
result = 31 * result + height; result = 31 * result + height;
result = 31 * result + width; result = 31 * result + width;
result = 31 * result + videoFrameCount; result = 31 * result + videoFrameCount;
result = 31 * result + Objects.hashCode(videoEncoderName); result = 31 * result + Objects.hashCode(videoEncoderName);
result = 31 * result + Objects.hashCode(videoMimeType);
result = 31 * result + optimizationResult; result = 31 * result + optimizationResult;
result = 31 * result + Objects.hashCode(exportException); result = 31 * result + Objects.hashCode(exportException);
return result; return result;

View file

@ -1643,7 +1643,9 @@ public final class Transformer {
public void onTrackEnded( public void onTrackEnded(
@C.TrackType int trackType, Format format, int averageBitrate, int sampleCount) { @C.TrackType int trackType, Format format, int averageBitrate, int sampleCount) {
if (trackType == C.TRACK_TYPE_AUDIO) { if (trackType == C.TRACK_TYPE_AUDIO) {
exportResultBuilder.setAverageAudioBitrate(averageBitrate); exportResultBuilder
.setAudioMimeType(format.sampleMimeType)
.setAverageAudioBitrate(averageBitrate);
if (format.channelCount != Format.NO_VALUE) { if (format.channelCount != Format.NO_VALUE) {
exportResultBuilder.setChannelCount(format.channelCount); exportResultBuilder.setChannelCount(format.channelCount);
} }
@ -1652,6 +1654,7 @@ public final class Transformer {
} }
} else if (trackType == C.TRACK_TYPE_VIDEO) { } else if (trackType == C.TRACK_TYPE_VIDEO) {
exportResultBuilder exportResultBuilder
.setVideoMimeType(format.sampleMimeType)
.setAverageVideoBitrate(averageBitrate) .setAverageVideoBitrate(averageBitrate)
.setColorInfo(format.colorInfo) .setColorInfo(format.colorInfo)
.setVideoFrameCount(sampleCount); .setVideoFrameCount(sampleCount);