Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -29,4 +29,6 @@ tmp/
vmaf/
services/scoring/vmaf
services/upscaling/models/
test.py
test.py
ignore/
test_outputs/
23 changes: 13 additions & 10 deletions neurons/miner.py
Original file line number Diff line number Diff line change
Expand Up @@ -62,30 +62,33 @@ async def forward_compression_requests(self, synapse: VideoCompressionProtocol)
Processes a video compression request by downloading, compressing,
uploading, and returning a sharing link.
"""

start_time = time.time()

payload_url: str = synapse.miner_payload.reference_video_url
vmaf_threshold: float = synapse.miner_payload.vmaf_threshold
target_codec: str = getattr(synapse.miner_payload, 'target_codec', 'av1')
codec_mode: str = getattr(synapse.miner_payload, 'codec_mode', 'CRF')
target_bitrate: float = getattr(synapse.miner_payload, 'target_bitrate', 10.0)
validator_uid: int = self.metagraph.hotkeys.index(synapse.dendrite.hotkey)
logger.info(f"🛜🛜🛜 Receiving CompressionRequest from validator: {synapse.dendrite.hotkey} with uid: {validator_uid} 🛜🛜🛜")

logger.info(f"🛜🛜🛜 Receiving CompressionRequest from validator: {synapse.dendrite.hotkey} with uid: {validator_uid} | VMAF: {vmaf_threshold} | Codec: {target_codec} | Mode: {codec_mode} | Bitrate: {target_bitrate} Mbps 🛜🛜🛜")

check_version(synapse.version)

try:
processed_video_url = await video_compressor(payload_url, vmaf_threshold)
processed_video_url = await video_compressor(payload_url, vmaf_threshold, target_codec, codec_mode, target_bitrate)

if processed_video_url is None:
logger.info(f"💔 Failed to compress video 💔")
return synapse

synapse.miner_response.optimized_video_url = processed_video_url

processed_time = time.time() - start_time

logger.info(f"💜 Returning Response, Processed in {processed_time:.2f} seconds 💜")

return synapse

except Exception as e:
Expand Down
8 changes: 4 additions & 4 deletions requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ numpy==2.0.2
minio==7.2.16
opencv-python==4.12.0.88
loguru==0.7.3
bittensor==9.9.0
bittensor>=9.9.0
redis==6.4.0
sqlalchemy==2.0.43
pandas==2.3.2
Expand All @@ -23,8 +23,8 @@ wandb==0.22.0
apscheduler==3.11.0
boto3==1.40.34
google-auth-oauthlib==1.2.2
google-auth==2.40.3
google-api-python-client==2.182.0
google-auth>=2.40.3
google-api-python-client>=2.182.0
yt-dlp==2025.9.5
selenium==4.35.0
scikit-learn==1.7.2
Expand All @@ -33,7 +33,7 @@ scipy==1.16.2
torch==2.8.0
torchvision==0.23.0
torchaudio==2.8.0
tensorflow==2.19.1
tensorflow>=2.19.1
tensorboard==2.19.0

# Video and Image Processing
Expand Down
40 changes: 31 additions & 9 deletions services/compress/encoder.py
Original file line number Diff line number Diff line change
Expand Up @@ -581,21 +581,39 @@ def safe_positive_float(value, default=1.0):
target_vmaf = safe_float(target_vmaf or original_video_metadata.get('target_vmaf') or
config.get('video_processing', {}).get('target_vmaf', 0.0), 0.0)

original_codec = original_video_metadata.get('original_codec', 'unknown')
# Get codec from config (set by the request)
# Priority: config['video_processing']['target_codec'] > metadata > fallback
target_codec_from_config = config.get('video_processing', {}).get('target_codec')
target_codec_from_part1 = original_video_metadata.get('target_codec', 'auto')
original_codec = original_video_metadata.get('original_codec', 'unknown')
current_codec = original_video_metadata.get('codec', original_codec)
config_codec = config.get('video_processing', {}).get('codec', 'auto')

if target_codec_from_part1 and target_codec_from_part1 != 'auto':

# Use target_codec from config (highest priority - comes from the request)
if target_codec_from_config and target_codec_from_config != 'auto':
codec = target_codec_from_config
if logging_enabled:
print(f" 🎯 Using target codec from request: {codec}")
# Fallback to Part 1 metadata
elif target_codec_from_part1 and target_codec_from_part1 != 'auto':
codec = target_codec_from_part1
elif config_codec != 'auto':
codec = config_codec
if logging_enabled:
print(f" 📋 Using target codec from metadata: {codec}")
# Final fallback to upgrade map
else:
codec_upgrade_map = {'h264': 'av1_nvenc', 'hevc': 'av1_nvenc', 'vp9': 'av1_nvenc', 'av1': 'av1_nvenc'}
codec = codec_upgrade_map.get(current_codec.lower(), 'av1_nvenc')
if logging_enabled:
print(f" ⚡ Using fallback codec mapping: {current_codec} → {codec}")

if logging_enabled:
print(f" 🎥 Final Selected Codec: {codec}")

# Get codec_mode and target_bitrate from config (set by the request)
codec_mode = config.get('video_processing', {}).get('codec_mode', 'CRF')
target_bitrate = config.get('video_processing', {}).get('target_bitrate', 10.0)

if logging_enabled:
print(f" 🎥 Selected Codec: {codec}")
print(f" ⚙️ Codec Mode: {codec_mode}, Target Bitrate: {target_bitrate} Mbps")

# STEP 1: BASIC ANALYSIS - Classify scene and extract video features in one call
if logging_enabled:
Expand Down Expand Up @@ -741,7 +759,9 @@ def safe_positive_float(value, default=1.0):
codec=codec,
adjusted_cq=final_cq,
content_type=scene_type,
contrast_value=0.5,
contrast_value=0.5,
codec_mode=codec_mode,
target_bitrate=target_bitrate,
max_retries=max_encoding_retries,
logging_enabled=logging_enabled
)
Expand All @@ -758,7 +778,9 @@ def safe_positive_float(value, default=1.0):
codec=codec,
rate=final_cq,
scene_type=scene_type,
contrast_value=0.5, # Default contrast
contrast_value=0.5, # Default contrast
codec_mode=codec_mode,
target_bitrate=target_bitrate,
logging_enabled=logging_enabled
)
encoded_path = output_scene_path
Expand Down
Loading