diff --git a/CHANGELOG.md b/CHANGELOG.md
index 7fbf820f1..b0fb08d7e 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -8,6 +8,10 @@ All notable changes to this project will be documented in this file.
- support for Samsung HEIC motion photos embedding video in sefd box
+### Fixed
+
+- opening motion photo embedded video when video track is not the first one
+
## [v1.12.3] - 2025-02-06
### Added
diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/metadata/MultiPage.kt b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/MultiPage.kt
index adf3e5643..fdb535a30 100644
--- a/android/app/src/main/kotlin/deckers/thibault/aves/metadata/MultiPage.kt
+++ b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/MultiPage.kt
@@ -354,20 +354,23 @@ object MultiPage {
}
private fun getEmbedVideoInfo(context: Context, uri: Uri, videoOffset: Long, videoSize: Long): MediaFormat? {
- var format: MediaFormat? = null
val extractor = MediaExtractor()
var pfd: ParcelFileDescriptor? = null
try {
pfd = context.contentResolver.openFileDescriptor(uri, "r")
pfd?.fileDescriptor?.let { fd ->
extractor.setDataSource(fd, videoOffset, videoSize)
- if (extractor.trackCount > 0) {
- // only consider the first track to represent the appended video
- val trackIndex = 0
+ // video track may be after an audio track
+ for (trackIndex in 0 until extractor.trackCount) {
try {
- format = extractor.getTrackFormat(trackIndex)
+ val format = extractor.getTrackFormat(trackIndex)
+ format.getString(MediaFormat.KEY_MIME)?.let {
+ if (MimeTypes.isVideo(it)) {
+ return format
+ }
+ }
} catch (e: Exception) {
- Log.w(LOG_TAG, "failed to get motion photo track information for uri=$uri, track num=$trackIndex", e)
+ Log.w(LOG_TAG, "failed to get track information for uri=$uri, track num=$trackIndex", e)
}
}
}
@@ -377,7 +380,7 @@ object MultiPage {
extractor.release()
pfd?.close()
}
- return format
+ return null
}
fun getMotionPhotoVideoSizing(context: Context, uri: Uri, mimeType: String, sizeBytes: Long): Pair? {