Video Codec Yol Haritasi ve Performans Optimizasyonu

Synchro (Synchro) - Teknik Strateji ve Uygulama Rehberi

Ozet

Bu belge, Synchro (Synchro) projesinin video pipeline optimizasyonu icin kapsamli bir yol haritasi sunar.

Mevcut durum: Synchro, video_codec.rs modulu araciligiyla zstd (varsayilan) ve zlib (legacy) destegi saglamaktadir. Codec abstraksiyon katmani ve prefix tabanli multiplexing altyapisi tamamlanmistir.

Hedef: Bant genisligi tuketimini %60-90 azaltmak, kullanici deneyimini olculebilir sekilde iyilestirmek.

Strateji: Uc asamali yaklasim - once dusuk riskli optimizasyonlar (dirty-rect), sonra codec genislemesi (OpenH264), son olarak donanim hizlandirma.

Temel Sayilar

MetrikMevcutHedef (Faz 2 Sonrasi)Iyilesme
Bant genisligi (ofis)5-8 Mbps0.5-1.5 Mbps%80+
Bant genisligi (video)8-15 Mbps2-5 Mbps%65+
Ortalama FPS16-2025-30%50+
Host CPU kullanimi%35-45%20-30%30+
Giris gecikmesi (LAN)80-120 ms40-80 ms%40+

Mevcut Mimari Analizi

SynchroVideo Pipeline (Simdiki Durum)

Synchro'nun video pipeline'i su adimlardan olusur:

Ekran Yakalama (scrap)
    |
    v
BGRA -> RGB Donusumu (capture.rs)
    |
    v
Downscale (nearest/average filtre)
    |
    v
Codec Encode (video_codec.rs)
    |
    v
BinaryFrame Paketleme (protocol.rs - RD1F magic)
    |
    v
WebSocket Relay (Cloudflare Workers)
    |
    v
BinaryFrame Cozumleme (viewer)
    |
    v
Codec Decode (video_codec.rs)
    |
    v
RGB -> egui::ColorImage (gui.rs)

Codec Abstraksiyon Katmani (Tamamlandi)

video_codec.rs modulu halihazirda su ozellikleri icermektedir:

  • Prefix tabanli multiplexing: Her frame'in ilk byte'i 0xF0 | codec_id formatindadir
  • Otomatik codec algilama: Decode sirasinda prefix varsa ilgili codec, yoksa legacy fallback
  • Cevre degiskeni ile secim: SYNCHRO_VIDEO_CODEC=zstd|zlib|h264|vp9|av1
  • Geriye uyumluluk: Prefix'siz eski frame'ler otomatik zstd/zlib olarak denenir
  • Gelecek codec yer tutuculari: H.264, VP9, AV1 id'leri tanimli (henuz implementasyon yok)

Frame Paket Formati

[1 byte: 0xF0|codec_id][N byte: codec-specific compressed data]

codec_id degerleri:
  1 = zlib
  2 = zstd (varsayilan)
  3 = H.264 (gelecek)
  4 = VP9 (gelecek)
  5 = AV1 (gelecek)

Guclue Yanlar

  • Codec degisimi tek noktadan (VideoCodecConfig::detect_from_env)
  • Geriye uyumlu decode (eski istemcilerle calismaya devam eder)
  • zstd varsayilani zlib'e gore ~2-3x daha hizli encode, ~5x daha hizli decode

Eksik Yanlar

  • Dirty-rect algilama yok: Her frame tam ekran olarak gonderiliyor
  • Adaptif kalite yok: Ag kosullarina gore FPS/bitrate ayarlama yok
  • Video codec yok: Hareketli icerikte zstd/zlib yetersiz kaliyor
  • Delta frame yok: is_delta alani protokolde var ama kullanilmiyor

Rakiplerle Karsilastirma

Codec Stratejileri

UrunVideo CodecStatik EkranOzel Teknoloji
TeamViewerOzel codecAdaptifRemote control protokolu
AnyDeskDeskRT (ozel)Dirty-rectGoruntu algilama tabanli
RustDeskVP9 + H.264Dirty-rectlibvpx + ffmpeg
Synchrozstd/zlibTam frameCodec abstraksiyon hazir

Performans Etkisi (Tipik Ofis Senaryosu)

MetrikSynchro(simdi)RustDeskAnyDeskTeamViewer
Bant genisligi5-8 Mbps1-3 Mbps0.5-2 Mbps1-3 Mbps
CPU (host)%35-45%15-25%10-20%15-25
Frame latency80-120 ms30-60 ms15-40 ms30-60 ms

Ana farkin kaynagi: Synchroher frame'de tum ekrani gonderiyor. Rakipler yalnizca degisen bolgeleri gonderiyor (dirty-rect).

Bu, codec turunden bagimsiz olarak en buyuk performans farkidir.


Codec Secenekleri Karsilastirmasi

Teknik Degerlendirme Tablosu

CodecSikistirmaCPU (SW)CPU (HW)GecikmeLisansRust Crate
zlib2-3xDusuk-<5msMITflate2
zstd3-4xCok dusuk-<3msBSDzstd
H.26410-20x*OrtaCok dusuk5-20msBSD**openh264
VP915-25x*YuksekOrta10-30msUcretsizlibvpx-sys
AV120-35x*Cok yuksekYeni GPU20-50msUcretsizrav1e
H.26520-30x*YuksekDusuk5-20msPatent!Kisitli

* Video icerigi icin oranlar. Statik ekran icerigi icin zstd/zlib daha verimli olabilir. ** Cisco'nun OpenH264 implementasyonu BSD lisansli, MPEG-LA patent bedeli Cisco tarafindan odenliyor.

Icerik Tipine Gore Verimlilik

Bu tablo kritik bir noktayi gosterir: Video codec'ler her durumda ustun degildir.

Icerik TipizlibzstdH.264Aciklama
Statik masaustu (metin, IDE)5-8x8-12x3-5xzstd daha iyi
Karisik (browser, scroll)2-3x3-4x8-15xH.264 daha iyi
Video oynatma1.5-2x2-3x15-30xH.264 cok ustun
Slayt sunumu3-5x5-8x5-10xBenzer

Sonuc: Tek bir codec tum senaryolarda optimal degildir. Hibrit/adaptif yaklasim zorunludur.

Onerilen Codec Secimi

Birincil: H.264 (OpenH264)

  • Neden: En genis donanim destegi, olgun Rust crate, BSD lisans
  • Profil: Baseline (dusuk gecikme, B-frame yok, remote desktop icin ideal)
  • Donanim: Intel QuickSync, NVIDIA NVENC, AMD VCE, Apple VideoToolbox
  • Crate: openh264 = "0.6" - Cisco'nun referans implementasyonu

Gelecekte: AV1

  • Neden: En iyi sikistirma, royalty-free, industri destegi buyuyor
  • Simdilik neden degil: Encode CPU maliyeti cok yuksek, rav1e crate hala beta
  • Ne zaman: Donanim encode yayginlastiginda (Intel Arc, NVIDIA RTX 40xx+, Apple M3+)

Kacinilmasi gereken: H.265/HEVC

  • Neden kacinmali: 3 farkli patent havuzu (MPEG-LA, HEVC Advance, Technicolor)
  • Risk: Acik kaynak projeler icin hukuki belirsizlik
  • Alternatif: AV1 ayni verimliligti patent riski olmadan sunuyor

Uygulama Yol Haritasi

Genel Bakis

Faz 0: Dirty-Rect Algilama        [3-5 gun]  -> %70-90 bant tasarrufu (statik)
Faz 1: OpenH264 Entegrasyonu      [1-2 hafta] -> Video icerikte buyuk iyilesme
Faz 2: Adaptif Codec Secimi       [1 hafta]   -> Otomatik optimizasyon
Faz 3: Donanim Hizlandirma        [2-3 hafta] -> CPU %2'ye duser

Onemli: Fazlar birbirine bagimli degildir. Faz 0 tek basina en buyuk kazanici saglar.


Faz 0: Dirty-Rect Algilama (En Yuksek Oncelik)

Neden Bu Ilk?

Masaustu kullanimda ekranin %90-95'i cogu zaman degismiyor. Sadece degisen bolgeleri gondermek, herhangi bir codec'ten bagimsiz olarak en buyuk kazanici saglar.

Nasil Calisir

Onceki Frame (bellekte)    Yeni Frame (capture)
      |                         |
      +---------> Piksel Karsilastirma <--------+
                        |
              Degisen Bolgeler (rects)
                        |
          +-------------+-------------+
          |                           |
    Degisim < %5               Degisim > %5
    (Statik ekran)            (Aktif ekran)
          |                           |
    Sadece degisen               Tam frame
    rect'leri gonder             gonder

Teknik Detaylar

Yeni dosya: app/src/dirty_rect.rs

Algoritma:

  1. Onceki frame'i bellekte tut (RGB buffer)
  2. Yeni frame ile piksel bazinda karsilastir (16x16 blok grid)
  3. Degisen bloklari bounding-rect olarak birlesir
  4. Sadece degisen bolgeleri encode et ve gonder
  5. Viewer tarafinda ilgili bolgeleri mevcut frame uzerine yaz

Protokol Genislemesi:

Mevcut BinaryFrame yapisina opsiyonel rect bilgisi eklenir:

is_delta = true ise:
  Frame verisi sadece degisen bolgeyi icerir
  Ek header: rect_x, rect_y, rect_w, rect_h (4x u32)

Beklenen Kazanc:

SenaryoMevcut BantDirty-Rect SonrasiTasarruf
IDE'de kod yazma5-8 Mbps0.3-0.8 Mbps%85-95
Belge okuma4-6 Mbps0.5-1.5 Mbps%75-85
Browser scrolling6-10 Mbps2-4 Mbps%50-60
Video oynatma8-15 Mbps7-13 Mbps%10-15

Uygulama Adimlari

  1. dirty_rect.rs modulu olustur - blok bazli karsilastirma
  2. capture.rs icinde onceki frame buffer'i tut
  3. host.rs icinde delta frame gonderimine karar ver
  4. protocol.rs icinde rect bilgisini BinaryFrame'e ekle
  5. gui.rs (viewer) icinde delta frame'leri mevcut goruntu uzerine birlestir

Riskler ve Onlemler

RiskEtkiOnlem
Yanlis negatif (degisim algilanamaz)Goruntu bozulmasiPeriyodik keyframe (her 2-3 sn)
Bellek kullanimi artisi+1 frame buffer1920x1080x3 = ~6MB (ihmal edilebilir)
Kucuk degisimler cok rect uretirOverheadMinimum rect boyutu esligi (orn. 32x32)
Viewer senkronizasyon kaybiGoruntu bozulmasiKeyframe isteme mekanizmasi

Faz 1: OpenH264 Entegrasyonu

Hedef

Hareketli icerik (video oynatma, oyun, animasyon) icin H.264 encode/decode eklemek.

Bagimlilik

# app/Cargo.toml
openh264 = "0.6"

Not: openh264 crate'i, Cisco'nun C kutuphanesini otomatik indirir ve derler. Ek sistem bagimliligi gerektirmez.

Konfigurrasyon

ParametreDegerAciklama
ProfileBaselineDusuk gecikme, B-frame yok
Rate ControlCBRWebSocket relay icin ongorulebilir boyut
Target Bitrate2-5 Mbps1080p30 icin
Max Frame Rate30Remote desktop icin yeterli
IDR Interval60-120 frame2-4 sn, baglanti kaybina dayanikli
ComplexityLowEncode hizi oncelikli

Uygulama Adimlari

  1. video_codec.rs icinde VideoCodecConfig::H264 varyantini aktiflestir
  2. OpenH264 encoder/decoder wrapper fonksiyonlari ekle
  3. encode() ve decode() fonksiyonlarinda H.264 yolunu ac
  4. Frame formatinda RGB -> YUV420 donusumu ekle (H.264 gerekliligi)
  5. Test: encode -> decode -> piksel karsilastirma

Dikkat Edilecek Noktalar

  • OpenH264 sinirlamasi: Yalnizca Baseline Profile destekler. High Profile ozellikleri (CABAC, 8x8 transform) yoktur.
  • YUV donusum maliyeti: RGB -> YUV420 donusumu ek CPU gerektirir (~2-3ms/frame)
  • Keyframe boyutu: IDR frame'ler P-frame'lerin 5-10x buyuklugundedir. Ag spike'larina dikkat.

Beklenen Kazanc (Video Icerigi)

Metrikzstd (simdi)H.264 SonrasiIyilesme
Bant genisligi8-15 Mbps2-5 Mbps%65-75
Frame kalitesiKayipsizKayipli (yuksek)Fark edilmez
Encode suresi1-3ms5-15msYavaslar
Decode suresi1-2ms2-5msYavaslar

Faz 2: Adaptif Codec Secimi

Hedef

Frame icerigine gore otomatik olarak en uygun codec'i secmek.

Karar Algoritmasi

Her frame icin:
  1. Dirty-rect analizi yap
  2. Degisen piksel oranini hesapla (change_ratio)

  Eger change_ratio < 0.05:
    -> Delta frame (zstd ile sadece degisen rect)

  Eger change_ratio 0.05-0.30:
    -> Tam frame (zstd)

  Eger change_ratio > 0.30 VE H.264 aktif:
    -> Tam frame (H.264)

  Ag kotu ise (packet loss > %3 VEYA RTT > 200ms):
    -> FPS'i dusur (30 -> 15 -> 10)
    -> Downscale artir
    -> H.264 bitrate'i dusur

Metrik Toplama

Frame header'ina su bilgiler eklenir:

AlanTipAciklama
change_ratiof32Degisen piksel yuzde orani
codec_idu8Kullanilan codec
encode_msu16Encode suresi (ms)

Bu metrikler viewer tarafinda toplanarak host'a geri bildirim gonderilebilir (opsiyonel).

Uygulama Adimlari

  1. capture.rs icinde frame degisim oranini hesapla
  2. host.rs icinde codec secim mantigi ekle
  3. video_codec.rs icinde adaptif konfigurrasyon desteigni ac
  4. Viewer tarafinda codec gecislerini sorunsuz handle et

Faz 3: Donanim Hizlandirma (Ileri Duzey)

Hedef

GPU tabanli encode/decode ile CPU kullanimini minimuma indirmek.

Platform Destegi

PlatformAPIGPURust Erisimi
WindowsNVENCNVIDIAffmpeg-next
WindowsAMFAMDffmpeg-next
WindowsQuickSyncIntelffmpeg-next
macOSVideoToolboxApple Siliconobjc2-*
LinuxVAAPIIntel/AMDffmpeg-next
LinuxNVENCNVIDIAffmpeg-next

Performans Farki

Yazilim EncodeDonanim Encode
1080p30 CPU kullanimi%15-30<%2
Encode gecikmesi10-20ms1-3ms
Guc tuketimiYuksekMinimal
Kalite kontrolHassasPlatform bagli

Teknik Yaklasim

Iki secenek vardir:

Secenek A: ffmpeg-next crate (Onerilir)

  • Tum platformlari tek API ile kapsar
  • Dezavantaj: Agir bagimlilik (~50MB), karmasik build

Secenek B: Platform bazli dogrudan binding

  • Daha hafif, ama her platform icin ayri kod
  • macOS: core-video-rs, Windows: windows-rs, Linux: VAAPI

Onerilen Yaklasim

  1. Oncelikle yazilim OpenH264 ile Faz 1'i tamamla
  2. Donanim hizlandirmayi opsiyonel feature flag olarak ekle
  3. cargo build --features hw-accel ile etkinlestir
  4. Runtime'da GPU mevcut mu kontrol et, yoksa yazilim fallback

Guvenlik Degerlendirmesi

Codec degisiklikleri yeni guvenlik yuzeyler acar. Asagidaki riskler degerlendirilmistir.

Kritik Riskler

#RiskAciklamaOnlem
1Bozuk frame payloadManipule edilmis frame ile bellek tasmaBoyut dogrulama + safe Rust
2Codec confusionYanlis codec_id ile decode denemesiPrefix dogrulama + fallback

Yuksek Riskler

#RiskAciklamaOnlem
3H.264 parser aciklariOpenH264 C koduunda buffer overflowGuncel versiyon + fuzz test
4Frame boyut saldirisiDev frame ile bellek tukenmesiMax frame boyutu limiti

Orta Riskler

#RiskAciklamaOnlem
5Keyframe manipulasyonuYanlis IDR frame ile goruntu bozmaPeriyodik keyframe zorlama
6Codec downgradeGuvensiz codec'e gecis zorlamaMinimum codec seviyesi

Onlemler Ozeti

  • Tum decode islemleri anyhow::Result ile hata yonetimi
  • Frame boyutu ustsiniri: MAX_FRAME_SIZE = 16 * 1024 * 1024 (16MB)
  • Bilinmeyen codec_id icin sessizce drop (crash yok)
  • OpenH264 C kutuphanesi icin fuzz testleri planlandi

Test Plani

Birim Testleri

TestAciklamaBeklenen Sonuc
TC-01zstd encode -> decode dongusuBit-perfect eslesme
TC-02zlib encode -> decode dongusuBit-perfect eslesme
TC-03H.264 encode -> decode dongusuPSNR > 35dB
TC-04Prefix'li frame decodeDogru codec secimi
TC-05Prefix'siz (legacy) frame decodezstd/zlib fallback
TC-06Bozuk frame decodeHata donusu, crash yok
TC-07Bos frame decodeHata donusu, crash yok
TC-08Codec gecisi (zstd -> H.264 -> zstd)Sorunsuz gecis

Entegrasyon Testleri

TestAciklamaBeklenen Sonuc
TC-10Host(zstd) -> Viewer(decode)Frame gorunur
TC-11Host(H.264) -> Viewer(decode)Frame gorunur
TC-12Dirty-rect: statik ekranBant %80+ dusuyor
TC-13Dirty-rect: video oynatmaTam frame gonderimi
TC-14Adaptif gecis esigiDogru codec secimi
TC-15Baglanti kopmasi -> yeniden baglantiKeyframe ile toparlanma

Performans Testleri

TestMetrikKabul Kriteri
PT-01Encode suresi (zstd, 1080p)< 5ms
PT-02Encode suresi (H.264, 1080p)< 20ms
PT-03Decode suresi (zstd)< 3ms
PT-04Decode suresi (H.264)< 8ms
PT-05Dirty-rect karsilastirma suresi< 2ms
PT-06Bellek kullanimi artisi< 50MB

Kabul Kriterleri

  • Kritik regresyon: %0 (hicbir mevcut ozellik bozulmamali)
  • Guvenlik testleri: %100 pass
  • Ortalama gecikme:
    • LAN: < 100 ms
    • Wi-Fi: < 150 ms
    • 4G: < 250 ms

Kullanici Etkisi Simulasyonu

Senaryo Tanimlari

KodSenaryoHareket DuzeyiTipik Kullanim
S1IDE'de kod yazmaCok dusukYazilimci gunluk is
S2Browser'da belge okumaDusukOfis calisan
S3Terminal + scrollOrtaDevOps / sistem yonetici
S4Slayt sunumuOrta (bolgesel)Toplanti / egitim
S5Video oynatmaYuksekMedya / destek
S6Coklu islem (chat + dosya + fare)KarisikUzaktan destek

Tahmini Performans Iyilesmesi

Faz 0 Sonrasi (Dirty-Rect)

MetrikOncesiSonrasiDegisim
Bant (S1-S2)5-8 Mbps0.3-1.0 Mbps-%85
Bant (S3-S4)6-10 Mbps1.5-4 Mbps-%55
Bant (S5)8-15 Mbps7-13 Mbps-%15
FPS (S1-S4)16-2025-30+%50
Host CPU%35-45%25-35-%25

Faz 1 Sonrasi (+ H.264)

MetrikOncesiSonrasiDegisim
Bant (S5, video)7-13 Mbps2-5 Mbps-%65
Bant (S3, scroll)1.5-4 Mbps0.8-2 Mbps-%50
Goruntu kalitesi (S5)Piksel-perfectPSNR > 38dBFark edilmez

Faz 2 Sonrasi (+ Adaptif)

MetrikOncesiSonrasiDegisim
Kullanici memnuniyeti2.8/54.2/5+%50
4G uzerinde kullanilabilirlikZorKabul edilebilirBuyuk fark
Toplam bant (karisik)5-15 Mbps1-4 Mbps-%75

Rakiplerle Puanlama Karsilastirmasi

Agirlikli Puanlama Metodolojisi

10 kategori uzerinden 1-10 olcekli puanlama. Agirliklar kullanim senaryosuna gore degisir.

Varsayilan Agirliklar

KategoriAgirlikRustDeskAnyDeskTeamViewerSynchro(simdi)Synchro(Faz2)
Kurulum/Operasyon%127.59.09.09.09.0
Kod Kalitesi%107.02.03.08.58.5
Performans%207.59.09.56.58.0
Platform%1010.010.010.06.06.0
Ozellik Zenginligi%208.09.510.07.57.5
Guvenlik%127.58.59.07.58.0
Altyapi/Olcek%810.08.59.09.59.5
Build/CI%48.03.04.09.09.0
Ekosistem%39.08.09.02.53.0
Bakim%17.07.08.08.08.0

Agirlikli Skor Sonuclari

UrunMevcut SkorFaz 2 Sonrasi
TeamViewer~%82~%82
AnyDesk~%79~%79
RustDesk~%77~%77
Synchro~%71~%76

Synchro Faz 2 sonrasi performans kategorisinde %65 -> %80'e cikar, genel skorda RustDesk seviyesine yaklasir.

Senaryoya Gore Siralama

Bireysel Kullanici (Performans + Kurulum Oncelikli)

SiraUrunSkor
1AnyDesk%81
2TeamViewer%79
3Synchro (Faz 2)%76
4RustDesk%75

Kurumsal Kullanici (Ozellik + Guvenlik Oncelikli)

SiraUrunSkor
1TeamViewer%86
2AnyDesk%83
3RustDesk%78
4Synchro (Faz 2)%72

Gelistirici / DevOps (Kod + Altyapi Oncelikli)

SiraUrunSkor
1Synchro (Faz 2)%82
2RustDesk%79
3TeamViewer%71
4AnyDesk%68

Sonuc ve Oneriler

Oncelik Sirasi

OncelikEylemSureEtkiRisk
1Dirty-rect algilama3-5 gunCok yuksekDusuk
2OpenH264 entegrasyonu1-2 haftaYuksekOrta
3Adaptif codec secimi1 haftaOrtaDusuk
4Donanim hizlandirma2-3 haftaYuksekYuksek

Kritik Mesajlar

  1. Dirty-rect, codec'ten onemlidir. En buyuk performans kazanci video codec degisikliginden degil, gereksiz piksel gonderiminin onlenmesinden gelir.

  2. Hibrit yaklasim zorunludur. Tek bir codec tum senaryolarda optimal degildir. Statik ekranlarda zstd, hareketli icerikte H.264 kullanimali.

  3. Fazlar bagimsiz uygulanabilir. Her faz kendi basina deger uretir. Faz 0 tek basina uygulandiginda bile kullanici deneyiminde belirgin fark yaratir.

  4. Guvenlik paralel yurutulmelidir. Codec degisiklikleri yeni saldiri yuzeyler acar. Test plani ile birlikte ilerlenmelidir.

  5. Mevcut altyapi hazirdir. video_codec.rs modulu prefix tabanli multiplexing ve geriye uyumlu decode ile yeni codec'lerin eklenmesini kolaylastirir.

Beklenen Genel Etki

AlanMevcutFaz 2 Sonrasi
Bant genisligi (tipik)5-15 Mbps1-4 Mbps
FPS (ofis kullanimi)16-2025-30
Kullanici memnuniyeti2.8/54.2/5
Rekabet pozisyonu4. sirada2-3. sirada

Bu belge, Synchro projesinin surekli gelisen teknik stratejisinin bir parcasidir. Guncelleme tarihi: 2026-02-26.