Move compression thresholds to a feature-local constants file
Per Frontend Spec (A2.4 pre-merge note): MAX_UPLOAD_SIZE was hardcoded to 100 MB and would force-compress 100-300 MB files that should skip. Reads from VIDEO_MAX_SIZE now. Pulled the target/passthrough bitrate and max dimension out of compress.ts into src/lib/media/video/constants.ts so the compression contract lives in one place without bloating the global constants file.
This commit is contained in:
@@ -1,14 +1,19 @@
|
|||||||
import {type ImagePickerAsset} from 'expo-image-picker'
|
import {type ImagePickerAsset} from 'expo-image-picker'
|
||||||
|
|
||||||
import {SUPPORTED_MIME_TYPES, type SupportedMimeTypes} from '#/lib/constants'
|
import {
|
||||||
|
SUPPORTED_MIME_TYPES,
|
||||||
|
type SupportedMimeTypes,
|
||||||
|
VIDEO_MAX_SIZE,
|
||||||
|
} from '#/lib/constants'
|
||||||
import {logger} from '#/logger'
|
import {logger} from '#/logger'
|
||||||
import {compress, probe} from '../../../../modules/expo-bluesky-video-compress'
|
import {compress, probe} from '../../../../modules/expo-bluesky-video-compress'
|
||||||
|
import {
|
||||||
|
COMPRESSION_MAX_DIMENSION,
|
||||||
|
COMPRESSION_PASSTHROUGH_BITRATE,
|
||||||
|
COMPRESSION_TARGET_BITRATE,
|
||||||
|
} from './constants'
|
||||||
import {type CompressedVideo} from './types'
|
import {type CompressedVideo} from './types'
|
||||||
|
|
||||||
const PASSTHROUGH_BITRATE = 5_000_000
|
|
||||||
const PASSTHROUGH_MAX_DIMENSION = 1920
|
|
||||||
const MAX_UPLOAD_SIZE = 100 * 1000 * 1000
|
|
||||||
|
|
||||||
export async function compressVideo(
|
export async function compressVideo(
|
||||||
file: ImagePickerAsset,
|
file: ImagePickerAsset,
|
||||||
opts?: {
|
opts?: {
|
||||||
@@ -49,8 +54,8 @@ export async function compressVideo(
|
|||||||
const result = await compress(
|
const result = await compress(
|
||||||
file.uri,
|
file.uri,
|
||||||
{
|
{
|
||||||
targetBitrate: 3_000_000,
|
targetBitrate: COMPRESSION_TARGET_BITRATE,
|
||||||
maxSize: PASSTHROUGH_MAX_DIMENSION,
|
maxSize: COMPRESSION_MAX_DIMENSION,
|
||||||
codec: 'h264',
|
codec: 'h264',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -92,14 +97,14 @@ function shouldCompress(
|
|||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
if (metadata.fileSize > MAX_UPLOAD_SIZE) {
|
if (metadata.fileSize > VIDEO_MAX_SIZE) {
|
||||||
logger.debug(`shouldCompress: yes (file too large: ${sizeMB}MB)`)
|
logger.debug(`shouldCompress: yes (file too large: ${sizeMB}MB)`)
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
if (
|
if (
|
||||||
metadata.bitrate <= PASSTHROUGH_BITRATE &&
|
metadata.bitrate <= COMPRESSION_PASSTHROUGH_BITRATE &&
|
||||||
maxDimension <= PASSTHROUGH_MAX_DIMENSION
|
maxDimension <= COMPRESSION_MAX_DIMENSION
|
||||||
) {
|
) {
|
||||||
logger.debug(
|
logger.debug(
|
||||||
`shouldCompress: no (${bitrateKbps}kbps, ${maxDimension}px, ${sizeMB}MB)`,
|
`shouldCompress: no (${bitrateKbps}kbps, ${maxDimension}px, ${sizeMB}MB)`,
|
||||||
@@ -107,7 +112,7 @@ function shouldCompress(
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
if (metadata.bitrate > PASSTHROUGH_BITRATE) {
|
if (metadata.bitrate > COMPRESSION_PASSTHROUGH_BITRATE) {
|
||||||
logger.debug(`shouldCompress: yes (bitrate ${bitrateKbps}kbps)`)
|
logger.debug(`shouldCompress: yes (bitrate ${bitrateKbps}kbps)`)
|
||||||
} else {
|
} else {
|
||||||
logger.debug(`shouldCompress: yes (dimension ${maxDimension}px)`)
|
logger.debug(`shouldCompress: yes (dimension ${maxDimension}px)`)
|
||||||
|
|||||||
@@ -0,0 +1,8 @@
|
|||||||
|
// Target encode bitrate when we do compress. Matches the web path.
|
||||||
|
export const COMPRESSION_TARGET_BITRATE = 3_000_000 // 3mbps
|
||||||
|
// Source files at or under this bitrate skip compression (paired with
|
||||||
|
// COMPRESSION_MAX_DIMENSION). Slightly above the encode target so we
|
||||||
|
// don't re-encode files that are already close to what we'd produce.
|
||||||
|
export const COMPRESSION_PASSTHROUGH_BITRATE = 5_000_000 // 5mbps
|
||||||
|
// Output dimension cap when compressing, and skip threshold for source files.
|
||||||
|
export const COMPRESSION_MAX_DIMENSION = 1920
|
||||||
Reference in New Issue
Block a user