comparison imgutils.c @ 11:dabaa2056109 libavcore

Reimplement av_fill_image_pointers() using the information stored in the pixdescs. The new implementation is more compact, and does not need to be updated at each pixel format addition.
author stefano
date Fri, 30 Jul 2010 08:42:19 +0000
parents 356600e12af7
children c37229a98056
comparison
equal deleted inserted replaced
10:356600e12af7 11:dabaa2056109
58 58
59 return 0; 59 return 0;
60 } 60 }
61 61
62 int av_fill_image_pointers(uint8_t *data[4], enum PixelFormat pix_fmt, int height, 62 int av_fill_image_pointers(uint8_t *data[4], enum PixelFormat pix_fmt, int height,
63 uint8_t *ptr, const int linesize[4]) 63 uint8_t *ptr, const int linesizes[4])
64 { 64 {
65 int size, h2, size2; 65 int i, total_size, size[4], has_plane[4];
66
66 const AVPixFmtDescriptor *desc = &av_pix_fmt_descriptors[pix_fmt]; 67 const AVPixFmtDescriptor *desc = &av_pix_fmt_descriptors[pix_fmt];
68 memset(data , 0, sizeof(data[0])*4);
69 memset(size , 0, sizeof(size));
70 memset(has_plane, 0, sizeof(has_plane));
67 71
68 size = linesize[0] * height; 72 if (desc->flags & PIX_FMT_HWACCEL)
69 switch(pix_fmt) { 73 return AVERROR(EINVAL);
70 case PIX_FMT_YUV420P: 74
71 case PIX_FMT_YUV422P: 75 data[0] = ptr;
72 case PIX_FMT_YUV444P: 76 size[0] = linesizes[0] * height;
73 case PIX_FMT_YUV410P: 77
74 case PIX_FMT_YUV411P: 78 if (desc->flags & PIX_FMT_PAL) {
75 case PIX_FMT_YUV440P: 79 size[0] = (size[0] + 3) & ~3;
76 case PIX_FMT_YUVJ420P: 80 data[1] = ptr + size[0]; /* palette is stored here as 256 32 bits words */
77 case PIX_FMT_YUVJ422P: 81 return size[0] + 256 * 4;
78 case PIX_FMT_YUVJ444P:
79 case PIX_FMT_YUVJ440P:
80 case PIX_FMT_YUV420P16LE:
81 case PIX_FMT_YUV422P16LE:
82 case PIX_FMT_YUV444P16LE:
83 case PIX_FMT_YUV420P16BE:
84 case PIX_FMT_YUV422P16BE:
85 case PIX_FMT_YUV444P16BE:
86 h2 = (height + (1 << desc->log2_chroma_h) - 1) >> desc->log2_chroma_h;
87 size2 = linesize[1] * h2;
88 data[0] = ptr;
89 data[1] = data[0] + size;
90 data[2] = data[1] + size2;
91 data[3] = NULL;
92 return size + 2 * size2;
93 case PIX_FMT_YUVA420P:
94 h2 = (height + (1 << desc->log2_chroma_h) - 1) >> desc->log2_chroma_h;
95 size2 = linesize[1] * h2;
96 data[0] = ptr;
97 data[1] = data[0] + size;
98 data[2] = data[1] + size2;
99 data[3] = data[1] + size2 + size2;
100 return 2 * size + 2 * size2;
101 case PIX_FMT_NV12:
102 case PIX_FMT_NV21:
103 h2 = (height + (1 << desc->log2_chroma_h) - 1) >> desc->log2_chroma_h;
104 size2 = linesize[1] * h2;
105 data[0] = ptr;
106 data[1] = data[0] + size;
107 data[2] = NULL;
108 data[3] = NULL;
109 return size + size2;
110 case PIX_FMT_RGB24:
111 case PIX_FMT_BGR24:
112 case PIX_FMT_ARGB:
113 case PIX_FMT_ABGR:
114 case PIX_FMT_RGBA:
115 case PIX_FMT_BGRA:
116 case PIX_FMT_RGB48BE:
117 case PIX_FMT_RGB48LE:
118 case PIX_FMT_GRAY16BE:
119 case PIX_FMT_GRAY16LE:
120 case PIX_FMT_BGR444BE:
121 case PIX_FMT_BGR444LE:
122 case PIX_FMT_BGR555BE:
123 case PIX_FMT_BGR555LE:
124 case PIX_FMT_BGR565BE:
125 case PIX_FMT_BGR565LE:
126 case PIX_FMT_RGB444BE:
127 case PIX_FMT_RGB444LE:
128 case PIX_FMT_RGB555BE:
129 case PIX_FMT_RGB555LE:
130 case PIX_FMT_RGB565BE:
131 case PIX_FMT_RGB565LE:
132 case PIX_FMT_YUYV422:
133 case PIX_FMT_UYVY422:
134 case PIX_FMT_UYYVYY411:
135 case PIX_FMT_RGB4:
136 case PIX_FMT_BGR4:
137 case PIX_FMT_MONOWHITE:
138 case PIX_FMT_MONOBLACK:
139 case PIX_FMT_Y400A:
140 data[0] = ptr;
141 data[1] = NULL;
142 data[2] = NULL;
143 data[3] = NULL;
144 return size;
145 case PIX_FMT_PAL8:
146 case PIX_FMT_RGB8:
147 case PIX_FMT_BGR8:
148 case PIX_FMT_RGB4_BYTE:
149 case PIX_FMT_BGR4_BYTE:
150 case PIX_FMT_GRAY8:
151 size2 = (size + 3) & ~3;
152 data[0] = ptr;
153 data[1] = ptr + size2; /* palette is stored here as 256 32 bit words */
154 data[2] = NULL;
155 data[3] = NULL;
156 return size2 + 256 * 4;
157 default:
158 data[0] = NULL;
159 data[1] = NULL;
160 data[2] = NULL;
161 data[3] = NULL;
162 return -1;
163 } 82 }
83
84 for (i = 0; i < 4; i++)
85 has_plane[desc->comp[i].plane] = 1;
86
87 total_size = size[0];
88 for (i = 1; has_plane[i] && i < 4; i++) {
89 int h, s = (i == 1 || i == 2) ? desc->log2_chroma_h : 0;
90 data[i] = data[i-1] + size[i-1];
91 h = (height + (1 << s) - 1) >> s;
92 size[i] = h * linesizes[i];
93 total_size += size[i];
94 }
95
96 return total_size;
164 } 97 }