annotate pixdesc.h @ 9473:e38284cd69dc libavcodec

Use memcpy instead of the very inefficient bytecopy where both are correct (i.e. no overlap of src and dst is possible).
author reimar
date Fri, 17 Apr 2009 17:20:48 +0000
parents e806d2145e72
children dad1c3ed61f1
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
9018
98995efdf3aa Pixel Format descriptor, try #1.
michael
parents:
diff changeset
1 /*
9043
47e456d3f15b spelling/wording/grammar cosmetics
diego
parents: 9019
diff changeset
2 * pixel format descriptor
9018
98995efdf3aa Pixel Format descriptor, try #1.
michael
parents:
diff changeset
3 * Copyright (c) 2009 Michael Niedermayer <michaelni@gmx.at>
98995efdf3aa Pixel Format descriptor, try #1.
michael
parents:
diff changeset
4 *
98995efdf3aa Pixel Format descriptor, try #1.
michael
parents:
diff changeset
5 * This file is part of FFmpeg.
98995efdf3aa Pixel Format descriptor, try #1.
michael
parents:
diff changeset
6 *
98995efdf3aa Pixel Format descriptor, try #1.
michael
parents:
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
98995efdf3aa Pixel Format descriptor, try #1.
michael
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
98995efdf3aa Pixel Format descriptor, try #1.
michael
parents:
diff changeset
9 * License as published by the Free Software Foundation; either
98995efdf3aa Pixel Format descriptor, try #1.
michael
parents:
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
98995efdf3aa Pixel Format descriptor, try #1.
michael
parents:
diff changeset
11 *
98995efdf3aa Pixel Format descriptor, try #1.
michael
parents:
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
98995efdf3aa Pixel Format descriptor, try #1.
michael
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
98995efdf3aa Pixel Format descriptor, try #1.
michael
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
98995efdf3aa Pixel Format descriptor, try #1.
michael
parents:
diff changeset
15 * Lesser General Public License for more details.
98995efdf3aa Pixel Format descriptor, try #1.
michael
parents:
diff changeset
16 *
98995efdf3aa Pixel Format descriptor, try #1.
michael
parents:
diff changeset
17 * You should have received a copy of the GNU Lesser General Public
98995efdf3aa Pixel Format descriptor, try #1.
michael
parents:
diff changeset
18 * License along with FFmpeg; if not, write to the Free Software
98995efdf3aa Pixel Format descriptor, try #1.
michael
parents:
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
98995efdf3aa Pixel Format descriptor, try #1.
michael
parents:
diff changeset
20 */
98995efdf3aa Pixel Format descriptor, try #1.
michael
parents:
diff changeset
21
98995efdf3aa Pixel Format descriptor, try #1.
michael
parents:
diff changeset
22 #include <inttypes.h>
98995efdf3aa Pixel Format descriptor, try #1.
michael
parents:
diff changeset
23
98995efdf3aa Pixel Format descriptor, try #1.
michael
parents:
diff changeset
24 #include "libavutil/intreadwrite.h"
9430
e806d2145e72 Do not use full include path for get_bits.h, since the header is in
stefano
parents: 9428
diff changeset
25 #include "get_bits.h"
9018
98995efdf3aa Pixel Format descriptor, try #1.
michael
parents:
diff changeset
26
98995efdf3aa Pixel Format descriptor, try #1.
michael
parents:
diff changeset
27 typedef struct AVComponentDescriptor{
98995efdf3aa Pixel Format descriptor, try #1.
michael
parents:
diff changeset
28 uint16_t plane :2; ///< which of the 4 planes contains the component
9323
f347365f2da4 Make the step and offset fields of the component descriptor express a
stefano
parents: 9321
diff changeset
29
f347365f2da4 Make the step and offset fields of the component descriptor express a
stefano
parents: 9321
diff changeset
30 /**
f347365f2da4 Make the step and offset fields of the component descriptor express a
stefano
parents: 9321
diff changeset
31 * Number of elements between 2 horizontally consecutive pixels minus 1.
f347365f2da4 Make the step and offset fields of the component descriptor express a
stefano
parents: 9321
diff changeset
32 * Elements are bits for bitstream formats, bytes otherwise.
f347365f2da4 Make the step and offset fields of the component descriptor express a
stefano
parents: 9321
diff changeset
33 */
f347365f2da4 Make the step and offset fields of the component descriptor express a
stefano
parents: 9321
diff changeset
34 uint16_t step_minus1 :3;
f347365f2da4 Make the step and offset fields of the component descriptor express a
stefano
parents: 9321
diff changeset
35
f347365f2da4 Make the step and offset fields of the component descriptor express a
stefano
parents: 9321
diff changeset
36 /**
f347365f2da4 Make the step and offset fields of the component descriptor express a
stefano
parents: 9321
diff changeset
37 * Number of elements before the component of the first pixel plus 1.
f347365f2da4 Make the step and offset fields of the component descriptor express a
stefano
parents: 9321
diff changeset
38 * Elements are bits for bitstream formats, bytes otherwise.
f347365f2da4 Make the step and offset fields of the component descriptor express a
stefano
parents: 9321
diff changeset
39 */
f347365f2da4 Make the step and offset fields of the component descriptor express a
stefano
parents: 9321
diff changeset
40 uint16_t offset_plus1 :3;
9170
14e656ca3e17 Expand "lsb" to "least significant bits".
stefano
parents: 9129
diff changeset
41 uint16_t shift :3; ///< number of least significant bits that must be shifted away to get the value
9018
98995efdf3aa Pixel Format descriptor, try #1.
michael
parents:
diff changeset
42 uint16_t depth_minus1 :4; ///< number of bits in the component minus 1
98995efdf3aa Pixel Format descriptor, try #1.
michael
parents:
diff changeset
43 }AVComponentDescriptor;
98995efdf3aa Pixel Format descriptor, try #1.
michael
parents:
diff changeset
44
9019
895f99d00718 AVPixFmtDescriptor doxy
michael
parents: 9018
diff changeset
45 /**
9043
47e456d3f15b spelling/wording/grammar cosmetics
diego
parents: 9019
diff changeset
46 * Descriptor that unambiguously describes how the bits of a pixel are
9019
895f99d00718 AVPixFmtDescriptor doxy
michael
parents: 9018
diff changeset
47 * stored in the up to 4 data planes of an image. It also stores the
895f99d00718 AVPixFmtDescriptor doxy
michael
parents: 9018
diff changeset
48 * subsampling factors and number of components.
895f99d00718 AVPixFmtDescriptor doxy
michael
parents: 9018
diff changeset
49 *
9043
47e456d3f15b spelling/wording/grammar cosmetics
diego
parents: 9019
diff changeset
50 * @note This is separate of the colorspace (RGB, YCbCr, YPbPr, JPEG-style YUV
47e456d3f15b spelling/wording/grammar cosmetics
diego
parents: 9019
diff changeset
51 * and all the YUV variants) AVPixFmtDescriptor just stores how values
47e456d3f15b spelling/wording/grammar cosmetics
diego
parents: 9019
diff changeset
52 * are stored not what these values represent.
9019
895f99d00718 AVPixFmtDescriptor doxy
michael
parents: 9018
diff changeset
53 */
9018
98995efdf3aa Pixel Format descriptor, try #1.
michael
parents:
diff changeset
54 typedef struct AVPixFmtDescriptor{
9187
e10efe27c6b1 Implement a name field for AVPixFmtDescriptor.
stefano
parents: 9170
diff changeset
55 const char *name;
9018
98995efdf3aa Pixel Format descriptor, try #1.
michael
parents:
diff changeset
56 uint8_t nb_channels; ///< The number of components each pixel has, (1-4)
98995efdf3aa Pixel Format descriptor, try #1.
michael
parents:
diff changeset
57
98995efdf3aa Pixel Format descriptor, try #1.
michael
parents:
diff changeset
58 /**
9043
47e456d3f15b spelling/wording/grammar cosmetics
diego
parents: 9019
diff changeset
59 * Amount to shift the luma width right to find the chroma width.
47e456d3f15b spelling/wording/grammar cosmetics
diego
parents: 9019
diff changeset
60 * For YV12 this is 1 for example.
47e456d3f15b spelling/wording/grammar cosmetics
diego
parents: 9019
diff changeset
61 * chroma_width = -((-luma_width) >> log2_chroma_w)
47e456d3f15b spelling/wording/grammar cosmetics
diego
parents: 9019
diff changeset
62 * The note above is needed to ensure rounding up.
9018
98995efdf3aa Pixel Format descriptor, try #1.
michael
parents:
diff changeset
63 */
98995efdf3aa Pixel Format descriptor, try #1.
michael
parents:
diff changeset
64 uint8_t log2_chroma_w; ///< chroma_width = -((-luma_width )>>log2_chroma_w)
98995efdf3aa Pixel Format descriptor, try #1.
michael
parents:
diff changeset
65
98995efdf3aa Pixel Format descriptor, try #1.
michael
parents:
diff changeset
66 /**
9043
47e456d3f15b spelling/wording/grammar cosmetics
diego
parents: 9019
diff changeset
67 * Amount to shift the luma height right to find the chroma height.
47e456d3f15b spelling/wording/grammar cosmetics
diego
parents: 9019
diff changeset
68 * For YV12 this is 1 for example.
47e456d3f15b spelling/wording/grammar cosmetics
diego
parents: 9019
diff changeset
69 * chroma_height= -((-luma_height) >> log2_chroma_h)
47e456d3f15b spelling/wording/grammar cosmetics
diego
parents: 9019
diff changeset
70 * The note above is needed to ensure rounding up.
9018
98995efdf3aa Pixel Format descriptor, try #1.
michael
parents:
diff changeset
71 */
98995efdf3aa Pixel Format descriptor, try #1.
michael
parents:
diff changeset
72 uint8_t log2_chroma_h;
98995efdf3aa Pixel Format descriptor, try #1.
michael
parents:
diff changeset
73 uint8_t flags;
9043
47e456d3f15b spelling/wording/grammar cosmetics
diego
parents: 9019
diff changeset
74 AVComponentDescriptor comp[4]; ///< parameters that describe how pixels are packed
9018
98995efdf3aa Pixel Format descriptor, try #1.
michael
parents:
diff changeset
75 }AVPixFmtDescriptor;
98995efdf3aa Pixel Format descriptor, try #1.
michael
parents:
diff changeset
76
9043
47e456d3f15b spelling/wording/grammar cosmetics
diego
parents: 9019
diff changeset
77 #define PIX_FMT_BE 1 ///< big-endian
9129
913ae1f5c090 Fix typo: "i" -> "in".
stefano
parents: 9043
diff changeset
78 #define PIX_FMT_PAL 2 ///< Pixel format has a palette in data[1], values are indexes in this palette.
9043
47e456d3f15b spelling/wording/grammar cosmetics
diego
parents: 9019
diff changeset
79 #define PIX_FMT_BITSTREAM 4 ///< All values of a component are bit-wise packed end to end.
9018
98995efdf3aa Pixel Format descriptor, try #1.
michael
parents:
diff changeset
80
9234
49340eb6f96f Export to pixdesc.h the av_pix_fmt_descriptors array.
stefano
parents: 9187
diff changeset
81 /**
49340eb6f96f Export to pixdesc.h the av_pix_fmt_descriptors array.
stefano
parents: 9187
diff changeset
82 * The array of all the pixel format descriptors.
49340eb6f96f Export to pixdesc.h the av_pix_fmt_descriptors array.
stefano
parents: 9187
diff changeset
83 */
49340eb6f96f Export to pixdesc.h the av_pix_fmt_descriptors array.
stefano
parents: 9187
diff changeset
84 extern const AVPixFmtDescriptor av_pix_fmt_descriptors[];
9018
98995efdf3aa Pixel Format descriptor, try #1.
michael
parents:
diff changeset
85
9321
fdd902365b49 Document read_line().
stefano
parents: 9310
diff changeset
86 /**
fdd902365b49 Document read_line().
stefano
parents: 9310
diff changeset
87 * Reads a line from an image, and writes to \p dst the values of the
fdd902365b49 Document read_line().
stefano
parents: 9310
diff changeset
88 * pixel format component \p c.
fdd902365b49 Document read_line().
stefano
parents: 9310
diff changeset
89 *
fdd902365b49 Document read_line().
stefano
parents: 9310
diff changeset
90 * @param data the array containing the pointers to the planes of the image
fdd902365b49 Document read_line().
stefano
parents: 9310
diff changeset
91 * @param linesizes the array containing the linesizes of the image
fdd902365b49 Document read_line().
stefano
parents: 9310
diff changeset
92 * @param desc the pixel format descriptor for the image
fdd902365b49 Document read_line().
stefano
parents: 9310
diff changeset
93 * @param x the horizontal coordinate of the first pixel to read
fdd902365b49 Document read_line().
stefano
parents: 9310
diff changeset
94 * @param y the vertical coordinate of the first pixel to read
fdd902365b49 Document read_line().
stefano
parents: 9310
diff changeset
95 * @param w the width of the line to read, that is the number of
fdd902365b49 Document read_line().
stefano
parents: 9310
diff changeset
96 * values to write to \p dst
9330
f01741cc9471 Extend read_line() to make it take a read_pal_component parameter.
stefano
parents: 9325
diff changeset
97 * @param read_pal_component if not zero and the format is a paletted
f01741cc9471 Extend read_line() to make it take a read_pal_component parameter.
stefano
parents: 9325
diff changeset
98 * format writes to \p dst the values corresponding to the palette
f01741cc9471 Extend read_line() to make it take a read_pal_component parameter.
stefano
parents: 9325
diff changeset
99 * component \p c in data[1], rather than the palette indexes in
f01741cc9471 Extend read_line() to make it take a read_pal_component parameter.
stefano
parents: 9325
diff changeset
100 * data[0]. The behavior is undefined if the format is not paletted.
9321
fdd902365b49 Document read_line().
stefano
parents: 9310
diff changeset
101 */
9330
f01741cc9471 Extend read_line() to make it take a read_pal_component parameter.
stefano
parents: 9325
diff changeset
102 static inline void read_line(uint16_t *dst, const uint8_t *data[4], const int linesize[4],
f01741cc9471 Extend read_line() to make it take a read_pal_component parameter.
stefano
parents: 9325
diff changeset
103 const AVPixFmtDescriptor *desc, int x, int y, int c, int w, int read_pal_component)
9018
98995efdf3aa Pixel Format descriptor, try #1.
michael
parents:
diff changeset
104 {
98995efdf3aa Pixel Format descriptor, try #1.
michael
parents:
diff changeset
105 AVComponentDescriptor comp= desc->comp[c];
98995efdf3aa Pixel Format descriptor, try #1.
michael
parents:
diff changeset
106 int plane= comp.plane;
98995efdf3aa Pixel Format descriptor, try #1.
michael
parents:
diff changeset
107 int depth= comp.depth_minus1+1;
98995efdf3aa Pixel Format descriptor, try #1.
michael
parents:
diff changeset
108 int mask = (1<<depth)-1;
98995efdf3aa Pixel Format descriptor, try #1.
michael
parents:
diff changeset
109 int shift= comp.shift;
98995efdf3aa Pixel Format descriptor, try #1.
michael
parents:
diff changeset
110 int step = comp.step_minus1+1;
98995efdf3aa Pixel Format descriptor, try #1.
michael
parents:
diff changeset
111 int flags= desc->flags;
9324
f8cc0e2e7740 Add/fix support for bitstream formats reading in read_line().
stefano
parents: 9323
diff changeset
112
f8cc0e2e7740 Add/fix support for bitstream formats reading in read_line().
stefano
parents: 9323
diff changeset
113 if (flags & PIX_FMT_BITSTREAM){
f8cc0e2e7740 Add/fix support for bitstream formats reading in read_line().
stefano
parents: 9323
diff changeset
114 GetBitContext gb;
f8cc0e2e7740 Add/fix support for bitstream formats reading in read_line().
stefano
parents: 9323
diff changeset
115 init_get_bits(&gb, data[plane] + y*linesize[plane], linesize[plane]*8);
f8cc0e2e7740 Add/fix support for bitstream formats reading in read_line().
stefano
parents: 9323
diff changeset
116 skip_bits_long(&gb, x*step + comp.offset_plus1-1);
9018
98995efdf3aa Pixel Format descriptor, try #1.
michael
parents:
diff changeset
117
9324
f8cc0e2e7740 Add/fix support for bitstream formats reading in read_line().
stefano
parents: 9323
diff changeset
118 while(w--){
f8cc0e2e7740 Add/fix support for bitstream formats reading in read_line().
stefano
parents: 9323
diff changeset
119 int val = show_bits(&gb, depth);
9330
f01741cc9471 Extend read_line() to make it take a read_pal_component parameter.
stefano
parents: 9325
diff changeset
120 if(read_pal_component)
9324
f8cc0e2e7740 Add/fix support for bitstream formats reading in read_line().
stefano
parents: 9323
diff changeset
121 val= data[1][4*val + c];
f8cc0e2e7740 Add/fix support for bitstream formats reading in read_line().
stefano
parents: 9323
diff changeset
122 skip_bits(&gb, step);
f8cc0e2e7740 Add/fix support for bitstream formats reading in read_line().
stefano
parents: 9323
diff changeset
123 *dst++= val;
f8cc0e2e7740 Add/fix support for bitstream formats reading in read_line().
stefano
parents: 9323
diff changeset
124 }
f8cc0e2e7740 Add/fix support for bitstream formats reading in read_line().
stefano
parents: 9323
diff changeset
125 } else {
9325
2cf20144e7cb Reindent after the last patch.
stefano
parents: 9324
diff changeset
126 const uint8_t *p = data[plane]+ y*linesize[plane] + x*step + comp.offset_plus1-1;
9018
98995efdf3aa Pixel Format descriptor, try #1.
michael
parents:
diff changeset
127
9325
2cf20144e7cb Reindent after the last patch.
stefano
parents: 9324
diff changeset
128 while(w--){
2cf20144e7cb Reindent after the last patch.
stefano
parents: 9324
diff changeset
129 int val;
2cf20144e7cb Reindent after the last patch.
stefano
parents: 9324
diff changeset
130 if(flags & PIX_FMT_BE) val= AV_RB16(p);
2cf20144e7cb Reindent after the last patch.
stefano
parents: 9324
diff changeset
131 else val= AV_RL16(p);
2cf20144e7cb Reindent after the last patch.
stefano
parents: 9324
diff changeset
132 val = (val>>shift) & mask;
9330
f01741cc9471 Extend read_line() to make it take a read_pal_component parameter.
stefano
parents: 9325
diff changeset
133 if(read_pal_component)
9325
2cf20144e7cb Reindent after the last patch.
stefano
parents: 9324
diff changeset
134 val= data[1][4*val + c];
9018
98995efdf3aa Pixel Format descriptor, try #1.
michael
parents:
diff changeset
135 p+= step;
9325
2cf20144e7cb Reindent after the last patch.
stefano
parents: 9324
diff changeset
136 *dst++= val;
2cf20144e7cb Reindent after the last patch.
stefano
parents: 9324
diff changeset
137 }
9324
f8cc0e2e7740 Add/fix support for bitstream formats reading in read_line().
stefano
parents: 9323
diff changeset
138 }
9018
98995efdf3aa Pixel Format descriptor, try #1.
michael
parents:
diff changeset
139 }