7 ms·
Really breaking new ground here. What should FFmpeg have been written in? I can think of a few candidates, but I think they share a number of those "wonders".
by vinkelhake 13y ago
Really breaking new ground here. What should FFmpeg have been written in? I can think of a few candidates, but I think they share a number of those "wonders".
- lmm 13y agoThe only options I could think of that're mature enough are OCaml and Haskell. I'm aware of video transcoders in both, though nothing with anything like the format support of ffmpeg.
- colanderman 13y agoOCaml I know doesn't support SIMD acceleration. Not sure about Haskell. You need SIMD support to get anything decently fast in the field of video/audio manipulation.
- pjmlp 13y agoThat is a compiler issue, not language. ISO/ANSI C also don't support SIMD, you have to go down to Assembly when writing portable code across C compilers.
- x0x0 13y agoif we're willing to posit the existence of unwritten software that makes simd work from ocaml or haskell, we could also just assume the existence of C that checks memory accesses for zero cost also, I think you may be able to do reasonably well with icc and not much assembly
- colanderman 13y agoYa, it's definitely a language issue; barring super-intelligent compilers that can vectorize things on their own (which GCC does for certain cases), you need a means to express vectorizable operations. You don't need to work at the assembly level for this; you just need a language that can express vector operations in a way that doesn't require a compiler to solve the halting problem, and you need a compiler that knows how to compile such operations to SIMD. Yes, ANSI C doesn't have such a construct, but GNU C (which I'd bet 95% of open-source code uses anyway) does.
- astrange 13y agoNearly all SIMD in ffmpeg/libav/x264 is just written in assembly. Back in the day, gcc's code generation for even x86 SIMD intrinsic functions was too poor to consider using it. (Plus x86's intrinsics are just plain ugly. It's easier to read asm.) As for the architecture-independent SIMD in GNU C, it's something, but not quite flexible enough. Even C is really not a good enough language to consider implementing this in, because it has an overly-conservative memory model when it comes to char *, which aliases all other memory. For a library dedicated to parsing things which come in the form of bytestreams and 8-bit pixels, this means that most compiler optimizations are defeated right in the inner loops where you'd need them.
- nitrogen 13y agoIsn't that what the restrict keyword is for?
- panzi 13y agoYes, but how long does this exist? My guess would be that it isn't really used (yet) in ffmpeg.
- anon1385 13y agoSince C99 so 15 years, which is older than ffmpeg.
- panzi 13y agoWhat I meant is how long is it supported by compilers. I know its by GCC, but I think it's not by MSCV. Is it possible to compile ffmpeg with MSVC? But ok, one could use it and just #define it away for crappy compilers.
- jasomill 13y agoAccording to MSDN, Visual C++ has supported the equivalent __restrict keyword since at least 2005 [1], and according to the ffmpeg documentation [2], "FFmpeg can be built with MSVC 2012 or earlier using a C99-to-C89 conversion utility and wrapper, or with MSVC 2013 and ICL natively." [1] http://msdn.microsoft.com/en-us/library/5ft82fed(v=vs.80).aspx http://msdn.microsoft.com/en-us/library/5ft82fed(v=vs.80).as... [2] http://www.ffmpeg.org/platform.html http://www.ffmpeg.org/platform.html
- trobertson 13y agoHaskell's GHC is working on it [1]. It's not primetime (not even close, really), but it does work with modified libraries and compiling to llvm. There is also Intel Lab's HRC (Haskell Research Compiler) that does have SIMD capabilities [2]. Unfortunately, there isn't a public release of HRC yet. --- [1]: https://ghc.haskell.org/trac/ghc/wiki/SIMD https://ghc.haskell.org/trac/ghc/wiki/SIMD [2]: http://dorchard.wordpress.com/2013/10/14/automatic-simd-vectorization-for-haskell-and-icfp-2013/ http://dorchard.wordpress.com/2013/10/14/automatic-simd-vect...
- pjmlp 13y agoBefore C escaped UNIX, there used to be safer system programming languages like Modula-2, just to cite an example. But Modula-2 had Lilith to offer, while C had UNIX.
- vinkelhake 13y agoThere are other things to consider as well. Compiler support across various platforms: are there compilers available and do they generate good code? Mindshare: how big is the intersection of people who know the language and have the domain knowledge to contribute to the project?
- pjmlp 13y agoWhen C was UNIX only, the generated code quality also had a lot to be desired.
- vinkelhake 13y agoSorry, I don't get what you're arguing here. Are you saying the C-compilers generated poor code when the FFmpeg project was started back in 2000? Are you arguing that if the FFmpeg project had used Modula-2, this would have sparked more work on Modula-2 compilers? Or are you perhaps just wishing that history had taken a different turn?
- Crito 13y agoThe initial release of FFmpeg was in 2000, well after that stage in C's life.
- sliverstorm 13y agoClearly the whole project should be scrapped and rewritten in Ruby ;)
- Perseids 13y agoOn the 30C3 there was a talk about a C Compiler (actually an llvm optimization plugin) that can eliminate nearly every memory management related vulnerability by adding memory checks. The penalty is only a 100% increase in runtime. > If you're a C programmer and somebody says like: I've that optimization that makes your program 3% faster you go: wow! Then you come and say: well, now I make it half as fast you go: w00t?! But then you remember that people actually use ruby to serve web pages. I'd say this would be actually worth it for a far more secure FFmpeg. https://www.youtube.com/watch?v=2ybcByjNlq8 https://www.youtube.com/watch?v=2ybcByjNlq8
- StavrosK 13y agoThe difference is that FFMpeg is very, very CPU-bound, taking four hours instead of two to encode a movie is a big hassle. On the other hand, not many people use a world-facing FFmpeg instance to submit jobs to. I don't see why security should trump speed here.
- Perseids 13y agoYou mean, not many people use VLC? https://www.videolan.org/developers/vlc.html#thirdparty https://www.videolan.org/developers/vlc.html#thirdparty
- Crito 13y agoFor realtime playback locally sure. I don't think there are many/any public-facing systems backed by VLC. Presumably VLC prioritizes speed over security.
- Perseids 13y agoOh, that was the point being made. My view is that VLC essentially is a public facing system, in the same sense that my browser is a public facing system. Sure, it is not as easy to do a targeted attack against my VLC as against my mail client (or against the nginx on my server). But it is fed a lot of untrusted data. The same goes for Chrome, which also uses FFmpeg according to the article.
- Raphael_Amiard 13y agoAda would have been a good one, and mature enough. :)
- lhgaghl 13y agoA) Ada isn't sexy and unproven B) Most people who do mad algorithmz don't give a fuck if they introduce security vulns (even if they do, they don't know that other languages exist other than C), nor do they care about other languages (probably are put off by the facts that 1. other mainstream languages don't support mad algorithmz (Ada isn't mainstream) 2. if you look up any mainstream programming language you get nothing but dogma)
- dgesang 13y ago> What should FFmpeg have been written in? There'll be a HN topic A FFmpeg reimplementation in JavaScript soon enough ...
- morsch 13y agoProcess videos in browser using FFmpeg compiled to JavaScript (56 days ago) https://news.ycombinator.com/item?id=6739582 https://news.ycombinator.com/item?id=6739582