diff options
Diffstat (limited to 'ffmpeg/doc/swscale.txt')
| -rw-r--r-- | ffmpeg/doc/swscale.txt | 98 |
1 files changed, 0 insertions, 98 deletions
diff --git a/ffmpeg/doc/swscale.txt b/ffmpeg/doc/swscale.txt deleted file mode 100644 index 2066009..0000000 --- a/ffmpeg/doc/swscale.txt +++ /dev/null @@ -1,98 +0,0 @@ - The official guide to swscale for confused developers. - ======================================================== - -Current (simplified) Architecture: ---------------------------------- - Input - v - _______OR_________ - / \ - / \ - special converter [Input to YUV converter] - | | - | (8bit YUV 4:4:4 / 4:2:2 / 4:2:0 / 4:0:0 ) - | | - | v - | Horizontal scaler - | | - | (15bit YUV 4:4:4 / 4:2:2 / 4:2:0 / 4:1:1 / 4:0:0 ) - | | - | v - | Vertical scaler and output converter - | | - v v - output - - -Swscale has 2 scaler paths. Each side must be capable of handling -slices, that is, consecutive non-overlapping rectangles of dimension -(0,slice_top) - (picture_width, slice_bottom). - -special converter - These generally are unscaled converters of common - formats, like YUV 4:2:0/4:2:2 -> RGB12/15/16/24/32. Though it could also - in principle contain scalers optimized for specific common cases. - -Main path - The main path is used when no special converter can be used. The code - is designed as a destination line pull architecture. That is, for each - output line the vertical scaler pulls lines from a ring buffer. When - the ring buffer does not contain the wanted line, then it is pulled from - the input slice through the input converter and horizontal scaler. - The result is also stored in the ring buffer to serve future vertical - scaler requests. - When no more output can be generated because lines from a future slice - would be needed, then all remaining lines in the current slice are - converted, horizontally scaled and put in the ring buffer. - [This is done for luma and chroma, each with possibly different numbers - of lines per picture.] - -Input to YUV Converter - When the input to the main path is not planar 8 bits per component YUV or - 8-bit gray, it is converted to planar 8-bit YUV. Two sets of converters - exist for this currently: One performs horizontal downscaling by 2 - before the conversion, the other leaves the full chroma resolution, - but is slightly slower. The scaler will try to preserve full chroma - when the output uses it. It is possible to force full chroma with - SWS_FULL_CHR_H_INP even for cases where the scaler thinks it is useless. - -Horizontal scaler - There are several horizontal scalers. A special case worth mentioning is - the fast bilinear scaler that is made of runtime-generated MMXEXT code - using specially tuned pshufw instructions. - The remaining scalers are specially-tuned for various filter lengths. - They scale 8-bit unsigned planar data to 16-bit signed planar data. - Future >8 bits per component inputs will need to add a new horizontal - scaler that preserves the input precision. - -Vertical scaler and output converter - There is a large number of combined vertical scalers + output converters. - Some are: - * unscaled output converters - * unscaled output converters that average 2 chroma lines - * bilinear converters (C, MMX and accurate MMX) - * arbitrary filter length converters (C, MMX and accurate MMX) - And - * Plain C 8-bit 4:2:2 YUV -> RGB converters using LUTs - * Plain C 17-bit 4:4:4 YUV -> RGB converters using multiplies - * MMX 11-bit 4:2:2 YUV -> RGB converters - * Plain C 16-bit Y -> 16-bit gray - ... - - RGB with less than 8 bits per component uses dither to improve the - subjective quality and low-frequency accuracy. - - -Filter coefficients: --------------------- -There are several different scalers (bilinear, bicubic, lanczos, area, -sinc, ...). Their coefficients are calculated in initFilter(). -Horizontal filter coefficients have a 1.0 point at 1 << 14, vertical ones at -1 << 12. The 1.0 points have been chosen to maximize precision while leaving -a little headroom for convolutional filters like sharpening filters and -minimizing SIMD instructions needed to apply them. -It would be trivial to use a different 1.0 point if some specific scaler -would benefit from it. -Also, as already hinted at, initFilter() accepts an optional convolutional -filter as input that can be used for contrast, saturation, blur, sharpening -shift, chroma vs. luma shift, ... |
