Merge branch 'develop'

This commit is contained in:
Thibault Deckers 2022-11-11 22:14:26 +01:00
commit e8bf12ee4a
10 changed files with 39 additions and 13 deletions

View file

@ -4,7 +4,7 @@ All notable changes to this project will be documented in this file.
## <a id="unreleased"></a>[Unreleased] ## <a id="unreleased"></a>[Unreleased]
## <a id="v1.7.3"></a>[v1.7.3] - 2022-11-11 ## <a id="v1.7.4"></a>[v1.7.4] - 2022-11-11
### Added ### Added
@ -28,6 +28,8 @@ All notable changes to this project will be documented in this file.
- launch crash on Android KitKat - launch crash on Android KitKat
- ExifInterface: producing invalid WebP files - ExifInterface: producing invalid WebP files
## <a id="v1.7.3"></a>[v1.7.3] - 2022-11-11 [YANKED AGAIN!]
## <a id="v1.7.2"></a>[v1.7.2] - 2022-11-11 [YANKED] ## <a id="v1.7.2"></a>[v1.7.2] - 2022-11-11 [YANKED]
## <a id="v1.7.1"></a>[v1.7.1] - 2022-10-09 ## <a id="v1.7.1"></a>[v1.7.1] - 2022-10-09

View file

@ -41,8 +41,11 @@ import kotlinx.coroutines.SupervisorJob
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import org.beyka.tiffbitmapfactory.TiffBitmapFactory import org.beyka.tiffbitmapfactory.TiffBitmapFactory
import org.mp4parser.IsoFile import org.mp4parser.IsoFile
import org.mp4parser.PropertyBoxParserImpl
import org.mp4parser.boxes.iso14496.part12.MediaDataBox
import org.mp4parser.boxes.iso14496.part12.SampleTableBox
import java.io.FileInputStream
import java.io.IOException import java.io.IOException
import java.nio.channels.Channels
class DebugHandler(private val context: Context) : MethodCallHandler { class DebugHandler(private val context: Context) : MethodCallHandler {
private val ioScope = CoroutineScope(SupervisorJob() + Dispatchers.IO) private val ioScope = CoroutineScope(SupervisorJob() + Dispatchers.IO)
@ -335,10 +338,19 @@ class DebugHandler(private val context: Context) : MethodCallHandler {
val sb = StringBuilder() val sb = StringBuilder()
if (mimeType == MimeTypes.MP4) { if (mimeType == MimeTypes.MP4) {
try { try {
StorageUtils.openInputStream(context, uri)?.use { input -> // we can skip uninteresting boxes with a seekable data source
Channels.newChannel(input).use { channel -> val pfd = StorageUtils.openInputFileDescriptor(context, uri) ?: throw Exception("failed to open file descriptor for uri=$uri")
IsoFile(channel).use { isoFile -> pfd.use {
isoFile.dumpBoxes(sb) FileInputStream(it.fileDescriptor).use { stream ->
stream.channel.use { channel ->
val boxParser = PropertyBoxParserImpl().apply {
// parsing `MediaDataBox` can take a long time
// parsing `SampleTableBox` may yield OOM
skippingBoxes(MediaDataBox.TYPE, SampleTableBox.TYPE)
}
IsoFile(channel, boxParser).use { isoFile ->
isoFile.dumpBoxes(sb)
}
} }
} }
} }

View file

@ -22,6 +22,8 @@ object Mp4ParserHelper {
FileInputStream(it.fileDescriptor).use { stream -> FileInputStream(it.fileDescriptor).use { stream ->
stream.channel.use { channel -> stream.channel.use { channel ->
val boxParser = PropertyBoxParserImpl().apply { val boxParser = PropertyBoxParserImpl().apply {
// parsing `MediaDataBox` can take a long time
// do not skip anything inside `MovieBox` as it will be parsed and rewritten for editing
skippingBoxes(MediaDataBox.TYPE) skippingBoxes(MediaDataBox.TYPE)
} }
// creating `IsoFile` with a `File` or a `File.inputStream()` yields `No such device` // creating `IsoFile` with a `File` or a `File.inputStream()` yields `No such device`

View file

@ -23,6 +23,7 @@ import org.mp4parser.IsoFile
import org.mp4parser.PropertyBoxParserImpl import org.mp4parser.PropertyBoxParserImpl
import org.mp4parser.boxes.UserBox import org.mp4parser.boxes.UserBox
import org.mp4parser.boxes.iso14496.part12.MediaDataBox import org.mp4parser.boxes.iso14496.part12.MediaDataBox
import org.mp4parser.boxes.iso14496.part12.SampleTableBox
import java.io.FileInputStream import java.io.FileInputStream
import java.util.* import java.util.*
@ -142,7 +143,9 @@ object XMP {
FileInputStream(it.fileDescriptor).use { stream -> FileInputStream(it.fileDescriptor).use { stream ->
stream.channel.use { channel -> stream.channel.use { channel ->
val boxParser = PropertyBoxParserImpl().apply { val boxParser = PropertyBoxParserImpl().apply {
skippingBoxes(MediaDataBox.TYPE) // parsing `MediaDataBox` can take a long time
// parsing `SampleTableBox` may yield OOM
skippingBoxes(MediaDataBox.TYPE, SampleTableBox.TYPE)
} }
// creating `IsoFile` with a `File` or a `File.inputStream()` yields `No such device` // creating `IsoFile` with a `File` or a `File.inputStream()` yields `No such device`
IsoFile(channel, boxParser).use { isoFile -> IsoFile(channel, boxParser).use { isoFile ->

View file

@ -597,8 +597,10 @@ abstract class ImageProvider {
mimeType = mimeType, mimeType = mimeType,
uri = uri, uri = uri,
path = path, path = path,
// do not truncate // do not truncate with "t"
mode = "w", // "w" is enough on API 29+, but it will yield an empty file on API <29
// so "r" is necessary for backward compatibility
mode = "rw",
) ?: throw Exception("failed to open file descriptor for uri=$uri path=$path") ) ?: throw Exception("failed to open file descriptor for uri=$uri path=$path")
pfd.use { pfd.use {
FileOutputStream(it.fileDescriptor).use { outputStream -> FileOutputStream(it.fileDescriptor).use { outputStream ->

View file

@ -0,0 +1,5 @@
In v1.7.4:
- tag your MP4, rate your MP4, date your MP4, locate your MP4, rotate your MP4
- give media management access (on Android 12+) to skip some confirmation dialogs
- enjoy higher quality thumbnails
Full changelog available on GitHub

View file

@ -748,7 +748,7 @@ class AvesEntry {
bool get isBurst => burstEntries?.isNotEmpty == true; bool get isBurst => burstEntries?.isNotEmpty == true;
// for backwards compatibility // for backward compatibility
bool get _isMotionPhotoLegacy => isMultiPage && !isBurst && mimeType == MimeTypes.jpeg; bool get _isMotionPhotoLegacy => isMultiPage && !isBurst && mimeType == MimeTypes.jpeg;
bool get isMotionPhoto => (_catalogMetadata?.isMotionPhoto ?? false) || _isMotionPhotoLegacy; bool get isMotionPhoto => (_catalogMetadata?.isMotionPhoto ?? false) || _isMotionPhotoLegacy;

View file

@ -182,7 +182,7 @@ class _SettingsPageState extends State<SettingsPage> with FeedbackMixin {
final version = allJsonMap[exportVersionKey]; final version = allJsonMap[exportVersionKey];
final importable = <AppExportItem, dynamic>{}; final importable = <AppExportItem, dynamic>{};
if (version == null) { if (version == null) {
// backwards compatibility before versioning // backward compatibility before versioning
importable[AppExportItem.settings] = allJsonMap; importable[AppExportItem.settings] = allJsonMap;
} else { } else {
if (allJsonMap is! Map) { if (allJsonMap is! Map) {

View file

@ -6,7 +6,7 @@ repository: https://github.com/deckerst/aves
# - github changelog: /CHANGELOG.md # - github changelog: /CHANGELOG.md
# - play changelog: /whatsnew/whatsnew-en-US # - play changelog: /whatsnew/whatsnew-en-US
# - izzy changelog: /fastlane/metadata/android/en-US/changelogs/1XXX.txt # - izzy changelog: /fastlane/metadata/android/en-US/changelogs/1XXX.txt
version: 1.7.3+83 version: 1.7.4+84
publish_to: none publish_to: none
environment: environment:

View file

@ -1,4 +1,4 @@
In v1.7.3: In v1.7.4:
- tag your MP4, rate your MP4, date your MP4, locate your MP4, rotate your MP4 - tag your MP4, rate your MP4, date your MP4, locate your MP4, rotate your MP4
- give media management access (on Android 12+) to skip some confirmation dialogs - give media management access (on Android 12+) to skip some confirmation dialogs
- enjoy higher quality thumbnails - enjoy higher quality thumbnails