Şu anda, FFmpeg kaynak kodundan LZW sıkıştırma ve dekompresyon yöntemlerini projemde uygulamak için çalışıyorum. Tökezlediğim şey, çıktı tamponunun (sıkıştırılmış verilerin saklanacağı) boyutunun, sıkıştırmak istediğimiz girdi tamponunun boyutundan daha büyük olması gerektiğidir. Bu, sıkıştırmanın kendisiyle çelişmiyor mu?Sıkıştırılmış arabellek neden LZW sıkıştırmasında giriş arabelleğinden daha büyük olmalıdır?
Kodun sonraki kısmı, lzwenc.c kaynak dosyasının bir parçası olan ff_lzw_encode() işlevinde bulunur. benim özel Örneğin
if (insize * 3 > (s->bufsize - s->output_bytes) * 2)
{
printf("Size of output buffer is too small!\n");
return -1;
}
i yerel göndermeden önce ham video karelerini sıkıştırmak için çalışıyorum. Ama
(insize * 3)/2
(sıkıştırılmış veri depolanacak) boyutu olan bir arabellek için bellek ayırırsanız,
insize
boyutundaki ham arabelleği göndermek yerine
send()
işlevini kullanarak göndermek için daha fazla zaman gerekmiyor mu?
Evet, doğrudur. Çoğunlukla "yeşil" piksellerden (çoğu filmde ve film fragmanında ilk kare) oluşan çerçeveyi sıkıştırmaya çalıştım ve ayrılmış belleğin yalnızca% 4.87'si sıkıştırılmış veriler tarafından işgal edildi. Tamponun% 95.13'lük belleğinden kurtulmak için yaptığım şey, sadece% 4.87'lik önemli verileri göndermekti ve istemci tarafında sıkıştırdı. Dekompresyon yapıldıktan sonra, veriler bir dosyaya yazıldı ve InfraView ile önizlendi. Ve işe yaradı! Ben sunucu tarafında olduğu gibi ben istemci tarafında aynı bende (belki de% 100 aynı ben biraz karşılaştırmak değil) aynı var. –