y4 = s[4 * (i + 4) + 1] >> 6;
y5 = s[4 * (i + 5) + 1] >> 6;
- u0 = (s[4 * (i + 0) + 2] + s[4 * (i + 1) + 2] + 1) >> 7;
- u1 = (s[4 * (i + 2) + 2] + s[4 * (i + 3) + 2] + 1) >> 7;
- u2 = (s[4 * (i + 4) + 2] + s[4 * (i + 5) + 2] + 1) >> 7;
+ u0 = s[4 * (i + 0) + 2] >> 6;
+ u1 = s[4 * (i + 2) + 2] >> 6;
+ u2 = s[4 * (i + 4) + 2] >> 6;
- v0 = (s[4 * (i + 0) + 3] + s[4 * (i + 1) + 3] + 1) >> 7;
- v1 = (s[4 * (i + 2) + 3] + s[4 * (i + 3) + 3] + 1) >> 7;
- v2 = (s[4 * (i + 4) + 3] + s[4 * (i + 5) + 3] + 1) >> 7;
+ v0 = s[4 * (i + 0) + 3] >> 6;
+ v1 = s[4 * (i + 2) + 3] >> 6;
+ v2 = s[4 * (i + 4) + 3] >> 6;
a0 = u0 | (y0 << 10) | (v0 << 20);
a1 = y1 | (u1 << 10) | (y2 << 20);
destY[i + 2] = s[i * 4 + 9];
destY[i + 3] = s[i * 4 + 13];
- destU[i >> 2] =
- (s[i * 4 + 2] + s[i * 4 + 6] + s[i * 4 + 10] + s[i * 4 + 14] + 2) >> 2;
- destV[i >> 2] =
- (s[i * 4 + 3] + s[i * 4 + 7] + s[i * 4 + 11] + s[i * 4 + 15] + 2) >> 2;
+ destU[i >> 2] = s[i * 4 + 2];
+ destV[i >> 2] = s[i * 4 + 3];
}
if (i == width - 3) {
destY[i + 1] = s[i * 4 + 5];
destY[i + 2] = s[i * 4 + 9];
- destU[i >> 2] = (s[i * 4 + 2] + s[i * 4 + 6] + s[i * 4 + 10] + 1) / 3;
- destV[i >> 2] = (s[i * 4 + 3] + s[i * 4 + 7] + s[i * 4 + 11] + 1) / 3;
+ destU[i >> 2] = s[i * 4 + 2];
+ destV[i >> 2] = s[i * 4 + 3];
} else if (i == width - 2) {
destY[i] = s[i * 4 + 1];
destY[i + 1] = s[i * 4 + 5];
- destU[i >> 2] = (s[i * 4 + 2] + s[i * 4 + 6] + 1) >> 1;
- destV[i >> 2] = (s[i * 4 + 3] + s[i * 4 + 7] + 1) >> 1;
+ destU[i >> 2] = s[i * 4 + 2];
+ destV[i >> 2] = s[i * 4 + 3];
} else if (i == width - 1) {
destY[i + 1] = s[i * 4 + 5];
y0 = s[4 * (i + 0) + 1];
y1 = s[4 * (i + 1) + 1];
- u0 = (s[4 * (i + 0) + 2] + s[4 * (i + 1) + 2] + 1) >> 1;
- v0 = (s[4 * (i + 0) + 3] + s[4 * (i + 1) + 3] + 1) >> 1;
+ u0 = s[4 * (i + 0) + 2];
+ v0 = s[4 * (i + 0) + 3];
d[(i / 2) * 5 + 0] = u0 >> 8;
d[(i / 2) * 5 + 1] = (u0 & 0xc0) | y0 >> 10;
destY[i + 2] = s[i * 4 + 9];
destY[i + 3] = s[i * 4 + 13];
if (y % 4 == 0) {
- destU[i >> 2] =
- (s[i * 4 + 2] + s[i * 4 + 6] + s[i * 4 + 10] + s[i * 4 + 14]) >> 2;
- destV[i >> 2] =
- (s[i * 4 + 3] + s[i * 4 + 7] + s[i * 4 + 11] + s[i * 4 + 15]) >> 2;
+ destU[i >> 2] = s[i * 4 + 2];
+ destV[i >> 2] = s[i * 4 + 3];
}
}
destY[i + 1] = s[i * 4 + 5];
destY[i + 2] = s[i * 4 + 9];
if (y % 4 == 0) {
- destU[i >> 2] = (s[i * 4 + 2] + s[i * 4 + 6] + s[i * 4 + 10]) / 3;
- destV[i >> 2] = (s[i * 4 + 3] + s[i * 4 + 7] + s[i * 4 + 11]) / 3;
+ destU[i >> 2] = s[i * 4 + 2];
+ destV[i >> 2] = s[i * 4 + 3];
}
} else if (i == width - 2) {
destY[i] = s[i * 4 + 1];
destY[i + 1] = s[i * 4 + 5];
if (y % 4 == 0) {
- destU[i >> 2] = (s[i * 4 + 2] + s[i * 4 + 6]) >> 1;
- destV[i >> 2] = (s[i * 4 + 3] + s[i * 4 + 7]) >> 1;
+ destU[i >> 2] = s[i * 4 + 2];
+ destV[i >> 2] = s[i * 4 + 3];
}
} else if (i == width - 1) {
destY[i] = s[i * 4 + 1];
d[(i >> 2) * 6 + 2] = s[i * 4 + 5];
d[(i >> 2) * 6 + 4] = s[i * 4 + 9];
d[(i >> 2) * 6 + 5] = s[i * 4 + 13];
- d[(i >> 2) * 6 + 0] =
- (s[i * 4 + 2] + s[i * 4 + 6] + s[i * 4 + 10] + s[i * 4 + 14]) >> 2;
- d[(i >> 2) * 6 + 3] =
- (s[i * 4 + 3] + s[i * 4 + 7] + s[i * 4 + 11] + s[i * 4 + 15]) >> 2;
+ d[(i >> 2) * 6 + 0] = s[i * 4 + 2];
+ d[(i >> 2) * 6 + 3] = s[i * 4 + 3];
}
if (i == width - 3) {
d[(i >> 2) * 6 + 1] = s[i * 4 + 1];
d[(i >> 2) * 6 + 2] = s[i * 4 + 5];
d[(i >> 2) * 6 + 4] = s[i * 4 + 9];
- d[(i >> 2) * 6 + 0] = (s[i * 4 + 2] + s[i * 4 + 6] + s[i * 4 + 10]) / 3;
- d[(i >> 2) * 6 + 3] = (s[i * 4 + 3] + s[i * 4 + 7] + s[i * 4 + 11]) / 3;
+ d[(i >> 2) * 6 + 0] = s[i * 4 + 2];
+ d[(i >> 2) * 6 + 3] = s[i * 4 + 3];
} else if (i == width - 2) {
d[(i >> 2) * 6 + 1] = s[i * 4 + 1];
d[(i >> 2) * 6 + 2] = s[i * 4 + 5];
- d[(i >> 2) * 6 + 0] = (s[i * 4 + 2] + s[i * 4 + 6]) >> 1;
- d[(i >> 2) * 6 + 3] = (s[i * 4 + 3] + s[i * 4 + 7]) >> 1;
+ d[(i >> 2) * 6 + 0] = s[i * 4 + 2];
+ d[(i >> 2) * 6 + 3] = s[i * 4 + 3];
} else if (i == width - 1) {
d[(i >> 2) * 6 + 1] = s[i * 4 + 1];
d[(i >> 2) * 6 + 0] = s[i * 4 + 2];
const guint16 *s = src;
for (i = 0; i < width - 1; i += 2) {
- Y0 = (s[i * 4 + 1]) >> 6;
- Y1 = (s[i * 4 + 5]) >> 6;
- U = ((s[i * 4 + 2] + s[i * 4 + 6] + 1) >> 1) >> 6;
- V = ((s[i * 4 + 3] + s[i * 4 + 7] + 1) >> 1) >> 6;
+ Y0 = s[i * 4 + 1] >> 6;
+ Y1 = s[i * 4 + 5] >> 6;
+ U = s[i * 4 + 2] >> 6;
+ V = s[i * 4 + 3] >> 6;
GST_WRITE_UINT16_LE (destY + i + 0, Y0);
GST_WRITE_UINT16_LE (destY + i + 1, Y1);
for (i = 0; i < width - 1; i += 2) {
Y0 = s[i * 4 + 1] >> 6;
Y1 = s[i * 4 + 5] >> 6;
- U = ((s[i * 4 + 2] + s[i * 4 + 6] + 1) >> 1) >> 6;
- V = ((s[i * 4 + 3] + s[i * 4 + 7] + 1) >> 1) >> 6;
+ U = s[i * 4 + 2] >> 6;
+ V = s[i * 4 + 3] >> 6;
GST_WRITE_UINT16_BE (destY + i + 0, Y0);
GST_WRITE_UINT16_BE (destY + i + 1, Y1);
const guint16 *s = src;
for (i = 0; i < width - 1; i += 2) {
- Y0 = (s[i * 4 + 1]) >> 6;
- Y1 = (s[i * 4 + 5]) >> 6;
- U = ((s[i * 4 + 2] + s[i * 4 + 6] + 1) >> 1) >> 6;
- V = ((s[i * 4 + 3] + s[i * 4 + 7] + 1) >> 1) >> 6;
+ Y0 = s[i * 4 + 1] >> 6;
+ Y1 = s[i * 4 + 5] >> 6;
+ U = s[i * 4 + 2] >> 6;
+ V = s[i * 4 + 3] >> 6;
GST_WRITE_UINT16_LE (destY + i + 0, Y0);
GST_WRITE_UINT16_LE (destY + i + 1, Y1);
for (i = 0; i < width - 1; i += 2) {
Y0 = s[i * 4 + 1] >> 6;
Y1 = s[i * 4 + 5] >> 6;
- U = ((s[i * 4 + 2] + s[i * 4 + 6] + 1) >> 1) >> 6;
- V = ((s[i * 4 + 3] + s[i * 4 + 7] + 1) >> 1) >> 6;
+ U = s[i * 4 + 2] >> 6;
+ V = s[i * 4 + 3] >> 6;
GST_WRITE_UINT16_BE (destY + i + 0, Y0);
GST_WRITE_UINT16_BE (destY + i + 1, Y1);
* format @info. The pixels will be unpacked into @dest which each component
* interleaved. @dest should at least be big enough to hold @width *
* n_components * size(unpack_format) bytes.
+ *
+ * For subsampled formats, the components will be duplicated in the destination
+ * array. Reconstruction of the missing components can be performed in a
+ * separate step after unpacking.
*/
typedef void (*GstVideoFormatUnpack) (const GstVideoFormatInfo *info,
GstVideoPackFlags flags, gpointer dest,
* @sstride: the source array stride
* @data: pointers to the destination data planes
* @stride: strides of the destination planes
- * @chroma_site: the chroma siting of the target when subsampled
+ * @chroma_site: the chroma siting of the target when subsampled (not used)
* @y: the y position in the image to pack to
* @width: the amount of pixels to pack.
*
* This function operates on pack_lines lines, meaning that @src should
* contain at least pack_lines lines with a stride of @sstride and @y
* should be a multiple of pack_lines.
+ *
+ * Subsampled formats will use the horizontally cosited component in the
+ * destination. Subsampling should be performed before packing.
*/
typedef void (*GstVideoFormatPack) (const GstVideoFormatInfo *info,
GstVideoPackFlags flags,