@stefanmartin/expo-video-watermark 0.4.0 → 0.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -19,7 +19,7 @@ android {
19
19
  }
20
20
 
21
21
  dependencies {
22
- def media3_version = "1.9.1"
22
+ def media3_version = "1.8.0"
23
23
 
24
24
  // Core Editing & Transformation
25
25
  api "androidx.media3:media3-transformer:$media3_version"
@@ -19,6 +19,8 @@ import androidx.media3.effect.StaticOverlaySettings
19
19
  import androidx.media3.effect.TextureOverlay
20
20
  import androidx.media3.transformer.Composition
21
21
  import androidx.media3.transformer.EditedMediaItem
22
+ import androidx.media3.transformer.EditedMediaItemSequence
23
+ import androidx.media3.common.C
22
24
  import androidx.media3.transformer.Effects
23
25
  import androidx.media3.transformer.ExportException
24
26
  import androidx.media3.transformer.ExportResult
@@ -329,27 +331,33 @@ class ExpoVideoWatermarkModule : Module() {
329
331
  // Step 13: Create media item from video
330
332
  val mediaItem = MediaItem.fromUri("file://$cleanVideoPath")
331
333
 
332
- // Step 14: Create edited media item, requesting HDR to SDR tone-mapping if needed.
333
- // This is the modern API for handling HDR in Media3, replacing the deprecated setHdrMode.
334
+ // Step 14: Create edited media item (HDR mode is set on Composition, not EditedMediaItem in 1.9.1+)
334
335
  val editedMediaItem = try {
335
- val builder = EditedMediaItem.Builder(mediaItem).setEffects(effects)
336
- if (isHdr) {
337
- Log.d(TAG, "[Step 14] HDR video detected. Requesting tone-mapping.")
338
- builder.setForceHdrToSdrToneMap(true)
339
- } else {
340
- Log.d(TAG, "[Step 14] SDR video detected. No tone-mapping needed.")
341
- }
342
- builder.build()
336
+ EditedMediaItem.Builder(mediaItem)
337
+ .setEffects(effects)
338
+ .build()
343
339
  } catch (e: Exception) {
344
340
  scaledWatermark.recycle()
345
341
  promise.reject("STEP14_EDITED_MEDIA_ERROR", "[Step 14] Failed to create edited media item: ${e.message}", e)
346
342
  return
347
343
  }
348
344
 
349
- // Step 14b: Create composition
345
+ // Step 14b: Create composition with EditedMediaItemSequence (required in Media3 1.9.1+)
350
346
  val composition = try {
351
- Composition.Builder(listOf(editedMediaItem))
347
+ // Wrap EditedMediaItem in a sequence (must specify track types in 1.9.1+)
348
+ val sequence = EditedMediaItemSequence.Builder(setOf(C.TRACK_TYPE_VIDEO, C.TRACK_TYPE_AUDIO))
349
+ .addItem(editedMediaItem)
352
350
  .build()
351
+
352
+ // Build composition with HDR mode if needed
353
+ val compositionBuilder = Composition.Builder(sequence)
354
+ if (isHdr) {
355
+ Log.d(TAG, "[Step 14b] HDR video detected. Applying tone-mapping to composition.")
356
+ compositionBuilder.setHdrMode(Composition.HDR_MODE_TONE_MAP_HDR_TO_SDR_USING_MEDIACODEC)
357
+ } else {
358
+ Log.d(TAG, "[Step 14b] SDR video detected. No tone-mapping needed.")
359
+ }
360
+ compositionBuilder.build()
353
361
  } catch (e: Exception) {
354
362
  scaledWatermark.recycle()
355
363
  promise.reject("STEP14B_COMPOSITION_ERROR", "[Step 14b] Failed to create composition: ${e.message}", e)
@@ -375,7 +383,7 @@ class ExpoVideoWatermarkModule : Module() {
375
383
  .addListener(object : Transformer.Listener {
376
384
  override fun onCompleted(composition: Composition, exportResult: ExportResult) {
377
385
  Log.d(TAG, "[Step 15] Transform completed successfully")
378
- Log.d(TAG, "[Step 15] Export result - durationMs: ${exportResult.durationMs}, " +
386
+ Log.d(TAG, "[Step 15] Export result - durationMillis: ${exportResult.durationMillis}, " +
379
387
  "fileSizeBytes: ${exportResult.fileSizeBytes}, " +
380
388
  "averageAudioBitrate: ${exportResult.averageAudioBitrate}, " +
381
389
  "averageVideoBitrate: ${exportResult.averageVideoBitrate}, " +
@@ -411,7 +419,7 @@ class ExpoVideoWatermarkModule : Module() {
411
419
  .addListener(object : Transformer.Listener {
412
420
  override fun onCompleted(composition: Composition, hevcExportResult: ExportResult) {
413
421
  Log.d(TAG, "[Step 16] H.265 re-encode completed successfully")
414
- Log.d(TAG, "[Step 16] Export result - durationMs: ${hevcExportResult.durationMs}, " +
422
+ Log.d(TAG, "[Step 16] Export result - durationMillis: ${hevcExportResult.durationMillis}, " +
415
423
  "fileSizeBytes: ${hevcExportResult.fileSizeBytes}, " +
416
424
  "averageAudioBitrate: ${hevcExportResult.averageAudioBitrate}, " +
417
425
  "averageVideoBitrate: ${hevcExportResult.averageVideoBitrate}, " +
@@ -501,7 +509,7 @@ class ExpoVideoWatermarkModule : Module() {
501
509
  appendLine()
502
510
  appendLine("--- Output Info ---")
503
511
  appendLine("Output path: $cleanOutputPath")
504
- appendLine("Partial export result - durationMs: ${exportResult.durationMs}, " +
512
+ appendLine("Partial export result - durationMillis: ${exportResult.durationMillis}, " +
505
513
  "fileSizeBytes: ${exportResult.fileSizeBytes}")
506
514
  appendLine()
507
515
  appendLine("--- Full Stack Trace ---")
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stefanmartin/expo-video-watermark",
3
- "version": "0.4.0",
3
+ "version": "0.4.2",
4
4
  "description": "Creating video watermarks on locally stored videos",
5
5
  "main": "build/index.js",
6
6
  "types": "build/index.d.ts",