Mercurial > libavcodec.hg
changeset 9528:dad1c3ed61f1 libavcodec
Implement a write_line() function.
author | stefano |
---|---|
date | Tue, 21 Apr 2009 19:15:21 +0000 |
parents | b687da895962 |
children | e885f6298a7a |
files | pixdesc.h |
diffstat | 1 files changed, 51 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/pixdesc.h Tue Apr 21 17:52:52 2009 +0000 +++ b/pixdesc.h Tue Apr 21 19:15:21 2009 +0000 @@ -137,3 +137,54 @@ } } } + +/** + * Writes the values from src to the pixel format component c of an + * image line. + * + * @param src array containing the values to write + * @param data the array containing the pointers to the planes of the + * image to write into. It is supposed to be zeroed. + * @param linesizes the array containing the linesizes of the image + * @param desc the pixel format descriptor for the image + * @param x the horizontal coordinate of the first pixel to write + * @param y the vertical coordinate of the first pixel to write + * @param w the width of the line to write, that is the number of + * values to write to the image line + */ +static inline void write_line(const uint16_t *src, uint8_t *data[4], const int linesize[4], + const AVPixFmtDescriptor *desc, int x, int y, int c, int w) +{ + AVComponentDescriptor comp = desc->comp[c]; + int plane = comp.plane; + int depth = comp.depth_minus1+1; + int step = comp.step_minus1+1; + int flags = desc->flags; + + if (flags & PIX_FMT_BITSTREAM) { + int skip = x*step + comp.offset_plus1-1; + uint8_t *p = data[plane] + y*linesize[plane] + (skip>>3); + int shift = 8 - depth - (skip&7); + + while (w--) { + *p |= *src++ << shift; + shift -= step; + p -= shift>>3; + shift &= 7; + } + } else { + int shift = comp.shift; + uint8_t *p = data[plane]+ y*linesize[plane] + x*step + comp.offset_plus1-1; + + while (w--) { + if (flags & PIX_FMT_BE) { + uint16_t val = AV_RB16(p) | (*src++<<shift); + AV_WB16(p, val); + } else { + uint16_t val = AV_RL16(p) | (*src++<<shift); + AV_WL16(p, val); + } + p+= step; + } + } +}