[FFmpeg-cvslog] r18646 - trunk/libavcodec/pixdesc.h
stefano
subversion
Tue Apr 21 21:15:21 CEST 2009
Author: stefano
Date: Tue Apr 21 21:15:21 2009
New Revision: 18646
Log:
Implement a write_line() function.
Modified:
trunk/libavcodec/pixdesc.h
Modified: trunk/libavcodec/pixdesc.h
==============================================================================
--- trunk/libavcodec/pixdesc.h Tue Apr 21 21:08:49 2009 (r18645)
+++ trunk/libavcodec/pixdesc.h Tue Apr 21 21:15:21 2009 (r18646)
@@ -137,3 +137,54 @@ static inline void read_line(uint16_t *d
}
}
}
+
+/**
+ * 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;
+ }
+ }
+}
More information about the ffmpeg-cvslog
mailing list