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? {