memvid--memvid
163 行
5.5 KiB
Python
163 行
5.5 KiB
Python
"""
|
||
Configuration defaults and constants for Memvid
|
||
"""
|
||
|
||
from typing import Dict, Any
|
||
|
||
# QR Code settings
|
||
QR_VERSION = 35 # 1-40, higher = more data capacity https://www.qrcode.com/en/about/version.html
|
||
QR_ERROR_CORRECTION = 'M' # L, M, Q, H
|
||
QR_BOX_SIZE = 5 # QR_BOX_SIZE * QR_VERSION dimensions (1 = 21 x 21, 20 = 97 x 97, 40 = 177×177) + QR_BORDER must be < frame height/width
|
||
QR_BORDER = 3
|
||
QR_FILL_COLOR = "black"
|
||
QR_BACK_COLOR = "white"
|
||
|
||
# Chunking settings - SIMPLIFIED
|
||
DEFAULT_CHUNK_SIZE = 1024
|
||
DEFAULT_OVERLAP = 32
|
||
|
||
# Codec Settings
|
||
VIDEO_CODEC = 'h265' # Valid options are: mpv4, h265 or hevc, h264 or avc, and av1
|
||
MP4V_PARAMETERS= {"video_file_type": "mp4",
|
||
"video_fps": 15,
|
||
"frame_height": 256,
|
||
"frame_width": 256,
|
||
"video_crf": 18, # Constant Rate Factor (0-51, lower = better quality, 18 is visually lossless)
|
||
"video_preset": "medium", # ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow
|
||
"video_profile": "high", # baseline, main, high (baseline for max compatibility)
|
||
"pix_fmt": "yuv420p",
|
||
"extra_ffmpeg_args": "-x265-params keyint=1:tune=stillimage"}
|
||
|
||
H265_PARAMETERS = {"video_file_type": "mkv", # AKA HEVC
|
||
"video_fps": 30,
|
||
"video_crf": 28,
|
||
"frame_height": 256,
|
||
"frame_width": 256,
|
||
"video_preset": "slower",
|
||
"video_profile": "mainstillpicture",
|
||
"pix_fmt": "yuv420p",
|
||
"extra_ffmpeg_args": "-x265-params keyint=1:tune=stillimage:no-scenecut:strong-intra-smoothing:constrained-intra:rect:amp"}
|
||
|
||
H264_PARAMETERS = {"video_file_type": "mkv", # AKA AVC
|
||
"video_fps": 30,
|
||
"video_crf": 28,
|
||
"frame_height": 256,
|
||
"frame_width": 256,
|
||
"video_preset": "slower",
|
||
"video_profile": "main",
|
||
"pix_fmt": "yuv420p",
|
||
"extra_ffmpeg_args": "-x265-params keyint=1:tune=stillimage:no-scenecut:strong-intra-smoothing:constrained-intra:rect:amp"}
|
||
|
||
AV1_PARAMETERS = {"video_file_type": "mkv",
|
||
"video_crf": 28,
|
||
"video_fps": 60,
|
||
"frame_height": 720,
|
||
"frame_width": 720,
|
||
"video_preset": "slower",
|
||
"video_profile": "mainstillpicture",
|
||
"pix_fmt": "yuv420p",
|
||
"extra_ffmpeg_args": "-x265-params keyint=1:tune=stillimage"}
|
||
|
||
codec_parameters = {"mp4v": MP4V_PARAMETERS,
|
||
"h265": H265_PARAMETERS, "hevc": H265_PARAMETERS,
|
||
"h264": H264_PARAMETERS, "avc": H264_PARAMETERS,
|
||
"av1": AV1_PARAMETERS}
|
||
|
||
# Retrieval settings
|
||
DEFAULT_TOP_K = 5
|
||
BATCH_SIZE = 100
|
||
MAX_WORKERS = 4 # For parallel processing
|
||
CACHE_SIZE = 1000 # Number of frames to cache
|
||
|
||
# Embedding settings
|
||
EMBEDDING_MODEL = "all-MiniLM-L6-v2" # Fast and good quality
|
||
EMBEDDING_DIMENSION = 384
|
||
|
||
# Index settings
|
||
INDEX_TYPE = "Flat" # Can be "IVF" for larger datasets, otherwise use Flat
|
||
NLIST = 100 # Number of clusters for IVF index
|
||
|
||
# LLM settings
|
||
DEFAULT_LLM_PROVIDER = "google" # google, openai, anthropic
|
||
DEFAULT_LLM_MODELS = {
|
||
"google": "gemini-2.0-flash-exp",
|
||
"openai": "gpt-4o",
|
||
"anthropic": "claude-3-5-sonnet-20241022"
|
||
}
|
||
|
||
MAX_TOKENS = 8192
|
||
TEMPERATURE = 0.1
|
||
CONTEXT_WINDOW = 32000
|
||
|
||
# Chat settings
|
||
MAX_HISTORY_LENGTH = 10
|
||
CONTEXT_CHUNKS_PER_QUERY = 5
|
||
|
||
# Performance settings
|
||
PREFETCH_FRAMES = 50
|
||
DECODE_TIMEOUT = 10 # seconds
|
||
|
||
def get_default_config() -> Dict[str, Any]:
|
||
"""Get default configuration dictionary"""
|
||
return {
|
||
"qr": {
|
||
"version": QR_VERSION,
|
||
"error_correction": QR_ERROR_CORRECTION,
|
||
"box_size": QR_BOX_SIZE,
|
||
"border": QR_BORDER,
|
||
"fill_color": QR_FILL_COLOR,
|
||
"back_color": QR_BACK_COLOR,
|
||
},
|
||
"codec": VIDEO_CODEC,
|
||
"chunking": {
|
||
"chunk_size": DEFAULT_CHUNK_SIZE,
|
||
"overlap": DEFAULT_OVERLAP,
|
||
},
|
||
"retrieval": {
|
||
"top_k": DEFAULT_TOP_K,
|
||
"batch_size": BATCH_SIZE,
|
||
"max_workers": MAX_WORKERS,
|
||
"cache_size": CACHE_SIZE,
|
||
},
|
||
"embedding": {
|
||
"model": EMBEDDING_MODEL,
|
||
"dimension": EMBEDDING_DIMENSION,
|
||
},
|
||
"index": {
|
||
"type": INDEX_TYPE,
|
||
"nlist": NLIST,
|
||
},
|
||
"llm": {
|
||
"model": DEFAULT_LLM_MODELS[DEFAULT_LLM_PROVIDER],
|
||
"max_tokens": MAX_TOKENS,
|
||
"temperature": TEMPERATURE,
|
||
"context_window": CONTEXT_WINDOW,
|
||
},
|
||
"chat": {
|
||
"max_history": MAX_HISTORY_LENGTH,
|
||
"context_chunks": CONTEXT_CHUNKS_PER_QUERY,
|
||
},
|
||
"performance": {
|
||
"prefetch_frames": PREFETCH_FRAMES,
|
||
"decode_timeout": DECODE_TIMEOUT,
|
||
}
|
||
}
|
||
|
||
def get_codec_parameters(codec_name=None):
|
||
"""
|
||
Get codec parameters for specified codec or all codecs
|
||
|
||
Args:
|
||
codec_name (str, optional): Specific codec name. If None, returns all.
|
||
|
||
Returns:
|
||
dict: Codec parameters
|
||
"""
|
||
if codec_name is None:
|
||
return codec_parameters
|
||
|
||
if codec_name not in codec_parameters:
|
||
raise ValueError(f"Unsupported codec: {codec_name}. Available: {list(codec_parameters.keys())}")
|
||
|
||
return codec_parameters[codec_name]
|