@stefanmartin/expo-video-watermark 0.3.3 → 0.4.0
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.
|
@@ -228,6 +228,9 @@ class ExpoVideoWatermarkModule : Module() {
|
|
|
228
228
|
val frameRate = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_CAPTURE_FRAMERATE)?.toFloatOrNull() ?: 0f
|
|
229
229
|
val colorStandard = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_COLOR_STANDARD) ?: "unknown"
|
|
230
230
|
val colorTransfer = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_COLOR_TRANSFER) ?: "unknown"
|
|
231
|
+
val colorTransferInt = colorTransfer.toIntOrNull()
|
|
232
|
+
// Check for HDR color transfer characteristics. 6 = PQ (ST2084), 7 = HLG. See MediaFormat constants.
|
|
233
|
+
val isHdr = colorTransferInt == 6 || colorTransferInt == 7
|
|
231
234
|
retriever.release()
|
|
232
235
|
|
|
233
236
|
// Build comprehensive video info string for debugging
|
|
@@ -237,7 +240,7 @@ class ExpoVideoWatermarkModule : Module() {
|
|
|
237
240
|
append("duration=${duration}ms, ")
|
|
238
241
|
append("frameRate=$frameRate, ")
|
|
239
242
|
append("colorStandard=$colorStandard, ")
|
|
240
|
-
append("colorTransfer=$colorTransfer")
|
|
243
|
+
append("colorTransfer=$colorTransfer (isHdr=$isHdr)")
|
|
241
244
|
}
|
|
242
245
|
Log.d(TAG, "[Step 6] Video metadata: $videoInfo")
|
|
243
246
|
|
|
@@ -310,7 +313,8 @@ class ExpoVideoWatermarkModule : Module() {
|
|
|
310
313
|
// Step 11: Create overlay effect with proper typing
|
|
311
314
|
val overlayEffect = try {
|
|
312
315
|
OverlayEffect(ImmutableList.of<TextureOverlay>(bitmapOverlay))
|
|
313
|
-
}
|
|
316
|
+
}
|
|
317
|
+
catch (e: Exception) {
|
|
314
318
|
scaledWatermark.recycle()
|
|
315
319
|
promise.reject("STEP11_OVERLAY_EFFECT_ERROR", "[Step 11] Failed to create overlay effect: ${e.message}", e)
|
|
316
320
|
return
|
|
@@ -325,29 +329,33 @@ class ExpoVideoWatermarkModule : Module() {
|
|
|
325
329
|
// Step 13: Create media item from video
|
|
326
330
|
val mediaItem = MediaItem.fromUri("file://$cleanVideoPath")
|
|
327
331
|
|
|
328
|
-
// Step 14: Create edited media item
|
|
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.
|
|
329
334
|
val editedMediaItem = try {
|
|
330
|
-
EditedMediaItem.Builder(mediaItem)
|
|
331
|
-
|
|
332
|
-
.
|
|
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()
|
|
333
343
|
} catch (e: Exception) {
|
|
334
344
|
scaledWatermark.recycle()
|
|
335
345
|
promise.reject("STEP14_EDITED_MEDIA_ERROR", "[Step 14] Failed to create edited media item: ${e.message}", e)
|
|
336
346
|
return
|
|
337
347
|
}
|
|
338
348
|
|
|
339
|
-
// Step 14b: Create composition
|
|
340
|
-
// Use MediaCodec-based tone mapping (avoids OpenGL frame processing issues on some devices)
|
|
349
|
+
// Step 14b: Create composition
|
|
341
350
|
val composition = try {
|
|
342
351
|
Composition.Builder(listOf(editedMediaItem))
|
|
343
|
-
.setHdrMode(Composition.HDR_MODE_TONE_MAP_HDR_TO_SDR_USING_MEDIACODEC)
|
|
344
352
|
.build()
|
|
345
353
|
} catch (e: Exception) {
|
|
346
354
|
scaledWatermark.recycle()
|
|
347
355
|
promise.reject("STEP14B_COMPOSITION_ERROR", "[Step 14b] Failed to create composition: ${e.message}", e)
|
|
348
356
|
return
|
|
349
357
|
}
|
|
350
|
-
Log.d(TAG, "[Step 14b]
|
|
358
|
+
Log.d(TAG, "[Step 14b] Composition created successfully.")
|
|
351
359
|
|
|
352
360
|
// Handler for main thread callbacks
|
|
353
361
|
val mainHandler = Handler(Looper.getMainLooper())
|