@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
- } catch (e: Exception) {
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 with effects
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
- .setEffects(effects)
332
- .build()
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 with HDR to SDR tone mapping
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] Created composition with HDR_MODE_TONE_MAP_HDR_TO_SDR_USING_MEDIACODEC")
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())
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stefanmartin/expo-video-watermark",
3
- "version": "0.3.3",
3
+ "version": "0.4.0",
4
4
  "description": "Creating video watermarks on locally stored videos",
5
5
  "main": "build/index.js",
6
6
  "types": "build/index.d.ts",