package com.twilight.h264.decoder; import com.twilight.h264.util.*; public class ImageUtils { public static final int PIX_FMT_BE =1; ///< Pixel format is big-endian. public static final int PIX_FMT_PAL =2; ///< Pixel format has a palette in data[1], values are indexes in this palette. public static final int PIX_FMT_BITSTREAM =4; ///< All values of a component are bit-wise packed end to end. public static final int PIX_FMT_HWACCEL =8; ///< Pixel format is an HW accelerated format. // For JAVA .H264 Decoder, we support only Software Accelerated Format (PIX_FMT_YUV420P) public static AVPixFmtDescriptor[] av_pix_fmt_descriptors = new AVPixFmtDescriptor[] { null, new PixFmtYUV420P() }; //[PIX_FMT_NB] = { // [PIX_FMT_YUV420P] = { // .name = "yuv420p", // .nb_components= 3, // .log2_chroma_w= 1, // .log2_chroma_h= 1, // .comp = { // {0,0,1,0,7}, /* Y */ // {1,0,1,0,7}, /* U */ // {2,0,1,0,7}, /* V */ // }, // }, // [PIX_FMT_YUYV422] = { // .name = "yuyv422", // .nb_components= 3, // .log2_chroma_w= 1, // .log2_chroma_h= 0, // .comp = { // {0,1,1,0,7}, /* Y */ // {0,3,2,0,7}, /* U */ // {0,3,4,0,7}, /* V */ // }, // }, // [PIX_FMT_RGB24] = { // .name = "rgb24", // .nb_components= 3, // .log2_chroma_w= 0, // .log2_chroma_h= 0, // .comp = { // {0,2,1,0,7}, /* R */ // {0,2,2,0,7}, /* G */ // {0,2,3,0,7}, /* B */ // }, // }, // [PIX_FMT_BGR24] = { // .name = "bgr24", // .nb_components= 3, // .log2_chroma_w= 0, // .log2_chroma_h= 0, // .comp = { // {0,2,1,0,7}, /* B */ // {0,2,2,0,7}, /* G */ // {0,2,3,0,7}, /* R */ // }, // }, // [PIX_FMT_YUV422P] = { // .name = "yuv422p", // .nb_components= 3, // .log2_chroma_w= 1, // .log2_chroma_h= 0, // .comp = { // {0,0,1,0,7}, /* Y */ // {1,0,1,0,7}, /* U */ // {2,0,1,0,7}, /* V */ // }, // }, // [PIX_FMT_YUV444P] = { // .name = "yuv444p", // .nb_components= 3, // .log2_chroma_w= 0, // .log2_chroma_h= 0, // .comp = { // {0,0,1,0,7}, /* Y */ // {1,0,1,0,7}, /* U */ // {2,0,1,0,7}, /* V */ // }, // }, // [PIX_FMT_YUV410P] = { // .name = "yuv410p", // .nb_components= 3, // .log2_chroma_w= 2, // .log2_chroma_h= 2, // .comp = { // {0,0,1,0,7}, /* Y */ // {1,0,1,0,7}, /* U */ // {2,0,1,0,7}, /* V */ // }, // }, // [PIX_FMT_YUV411P] = { // .name = "yuv411p", // .nb_components= 3, // .log2_chroma_w= 2, // .log2_chroma_h= 0, // .comp = { // {0,0,1,0,7}, /* Y */ // {1,0,1,0,7}, /* U */ // {2,0,1,0,7}, /* V */ // }, // }, // [PIX_FMT_GRAY8] = { // .name = "gray", // .nb_components= 1, // .log2_chroma_w= 0, // .log2_chroma_h= 0, // .comp = { // {0,0,1,0,7}, /* Y */ // }, // .flags = PIX_FMT_PAL, // }, // [PIX_FMT_MONOWHITE] = { // .name = "monow", // .nb_components= 1, // .log2_chroma_w= 0, // .log2_chroma_h= 0, // .comp = { // {0,0,1,0,0}, /* Y */ // }, // .flags = PIX_FMT_BITSTREAM, // }, // [PIX_FMT_MONOBLACK] = { // .name = "monob", // .nb_components= 1, // .log2_chroma_w= 0, // .log2_chroma_h= 0, // .comp = { // {0,0,1,7,0}, /* Y */ // }, // .flags = PIX_FMT_BITSTREAM, // }, // [PIX_FMT_PAL8] = { // .name = "pal8", // .nb_components= 1, // .log2_chroma_w= 0, // .log2_chroma_h= 0, // .comp = { // {0,0,1,0,7}, // }, // .flags = PIX_FMT_PAL, // }, // [PIX_FMT_YUVJ420P] = { // .name = "yuvj420p", // .nb_components= 3, // .log2_chroma_w= 1, // .log2_chroma_h= 1, // .comp = { // {0,0,1,0,7}, /* Y */ // {1,0,1,0,7}, /* U */ // {2,0,1,0,7}, /* V */ // }, // }, // [PIX_FMT_YUVJ422P] = { // .name = "yuvj422p", // .nb_components= 3, // .log2_chroma_w= 1, // .log2_chroma_h= 0, // .comp = { // {0,0,1,0,7}, /* Y */ // {1,0,1,0,7}, /* U */ // {2,0,1,0,7}, /* V */ // }, // }, // [PIX_FMT_YUVJ444P] = { // .name = "yuvj444p", // .nb_components= 3, // .log2_chroma_w= 0, // .log2_chroma_h= 0, // .comp = { // {0,0,1,0,7}, /* Y */ // {1,0,1,0,7}, /* U */ // {2,0,1,0,7}, /* V */ // }, // }, // [PIX_FMT_XVMC_MPEG2_MC] = { // .name = "xvmcmc", // .flags = PIX_FMT_HWACCEL, // }, // [PIX_FMT_XVMC_MPEG2_IDCT] = { // .name = "xvmcidct", // .flags = PIX_FMT_HWACCEL, // }, // [PIX_FMT_UYVY422] = { // .name = "uyvy422", // .nb_components= 3, // .log2_chroma_w= 1, // .log2_chroma_h= 0, // .comp = { // {0,1,2,0,7}, /* Y */ // {0,3,1,0,7}, /* U */ // {0,3,3,0,7}, /* V */ // }, // }, // [PIX_FMT_UYYVYY411] = { // .name = "uyyvyy411", // .nb_components= 3, // .log2_chroma_w= 2, // .log2_chroma_h= 0, // .comp = { // {0,3,2,0,7}, /* Y */ // {0,5,1,0,7}, /* U */ // {0,5,4,0,7}, /* V */ // }, // }, // [PIX_FMT_BGR8] = { // .name = "bgr8", // .nb_components= 3, // .log2_chroma_w= 0, // .log2_chroma_h= 0, // .comp = { // {0,0,1,6,1}, /* B */ // {0,0,1,3,2}, /* G */ // {0,0,1,0,2}, /* R */ // }, // .flags = PIX_FMT_PAL, // }, // [PIX_FMT_BGR4] = { // .name = "bgr4", // .nb_components= 3, // .log2_chroma_w= 0, // .log2_chroma_h= 0, // .comp = { // {0,3,1,0,0}, /* B */ // {0,3,2,0,1}, /* G */ // {0,3,4,0,0}, /* R */ // }, // .flags = PIX_FMT_BITSTREAM, // }, // [PIX_FMT_BGR4_BYTE] = { // .name = "bgr4_byte", // .nb_components= 3, // .log2_chroma_w= 0, // .log2_chroma_h= 0, // .comp = { // {0,0,1,3,0}, /* B */ // {0,0,1,1,1}, /* G */ // {0,0,1,0,0}, /* R */ // }, // .flags = PIX_FMT_PAL, // }, // [PIX_FMT_RGB8] = { // .name = "rgb8", // .nb_components= 3, // .log2_chroma_w= 0, // .log2_chroma_h= 0, // .comp = { // {0,0,1,6,1}, /* R */ // {0,0,1,3,2}, /* G */ // {0,0,1,0,2}, /* B */ // }, // .flags = PIX_FMT_PAL, // }, // [PIX_FMT_RGB4] = { // .name = "rgb4", // .nb_components= 3, // .log2_chroma_w= 0, // .log2_chroma_h= 0, // .comp = { // {0,3,1,0,0}, /* R */ // {0,3,2,0,1}, /* G */ // {0,3,4,0,0}, /* B */ // }, // .flags = PIX_FMT_BITSTREAM, // }, // [PIX_FMT_RGB4_BYTE] = { // .name = "rgb4_byte", // .nb_components= 3, // .log2_chroma_w= 0, // .log2_chroma_h= 0, // .comp = { // {0,0,1,3,0}, /* R */ // {0,0,1,1,1}, /* G */ // {0,0,1,0,0}, /* B */ // }, // .flags = PIX_FMT_PAL, // }, // [PIX_FMT_NV12] = { // .name = "nv12", // .nb_components= 3, // .log2_chroma_w= 1, // .log2_chroma_h= 1, // .comp = { // {0,0,1,0,7}, /* Y */ // {1,1,1,0,7}, /* U */ // {1,1,2,0,7}, /* V */ // }, // }, // [PIX_FMT_NV21] = { // .name = "nv21", // .nb_components= 3, // .log2_chroma_w= 1, // .log2_chroma_h= 1, // .comp = { // {0,0,1,0,7}, /* Y */ // {1,1,1,0,7}, /* V */ // {1,1,2,0,7}, /* U */ // }, // }, // [PIX_FMT_ARGB] = { // .name = "argb", // .nb_components= 4, // .log2_chroma_w= 0, // .log2_chroma_h= 0, // .comp = { // {0,3,1,0,7}, /* A */ // {0,3,2,0,7}, /* R */ // {0,3,3,0,7}, /* G */ // {0,3,4,0,7}, /* B */ // }, // }, // [PIX_FMT_RGBA] = { // .name = "rgba", // .nb_components= 4, // .log2_chroma_w= 0, // .log2_chroma_h= 0, // .comp = { // {0,3,1,0,7}, /* R */ // {0,3,2,0,7}, /* G */ // {0,3,3,0,7}, /* B */ // {0,3,4,0,7}, /* A */ // }, // }, // [PIX_FMT_ABGR] = { // .name = "abgr", // .nb_components= 4, // .log2_chroma_w= 0, // .log2_chroma_h= 0, // .comp = { // {0,3,1,0,7}, /* A */ // {0,3,2,0,7}, /* B */ // {0,3,3,0,7}, /* G */ // {0,3,4,0,7}, /* R */ // }, // }, // [PIX_FMT_BGRA] = { // .name = "bgra", // .nb_components= 4, // .log2_chroma_w= 0, // .log2_chroma_h= 0, // .comp = { // {0,3,1,0,7}, /* B */ // {0,3,2,0,7}, /* G */ // {0,3,3,0,7}, /* R */ // {0,3,4,0,7}, /* A */ // }, // }, // [PIX_FMT_GRAY16BE] = { // .name = "gray16be", // .nb_components= 1, // .log2_chroma_w= 0, // .log2_chroma_h= 0, // .comp = { // {0,1,1,0,15}, /* Y */ // }, // .flags = PIX_FMT_BE, // }, // [PIX_FMT_GRAY16LE] = { // .name = "gray16le", // .nb_components= 1, // .log2_chroma_w= 0, // .log2_chroma_h= 0, // .comp = { // {0,1,1,0,15}, /* Y */ // }, // }, // [PIX_FMT_YUV440P] = { // .name = "yuv440p", // .nb_components= 3, // .log2_chroma_w= 0, // .log2_chroma_h= 1, // .comp = { // {0,0,1,0,7}, /* Y */ // {1,0,1,0,7}, /* U */ // {2,0,1,0,7}, /* V */ // }, // }, // [PIX_FMT_YUVJ440P] = { // .name = "yuvj440p", // .nb_components= 3, // .log2_chroma_w= 0, // .log2_chroma_h= 1, // .comp = { // {0,0,1,0,7}, /* Y */ // {1,0,1,0,7}, /* U */ // {2,0,1,0,7}, /* V */ // }, // }, // [PIX_FMT_YUVA420P] = { // .name = "yuva420p", // .nb_components= 4, // .log2_chroma_w= 1, // .log2_chroma_h= 1, // .comp = { // {0,0,1,0,7}, /* Y */ // {1,0,1,0,7}, /* U */ // {2,0,1,0,7}, /* V */ // {3,0,1,0,7}, /* A */ // }, // }, // [PIX_FMT_VDPAU_H264] = { // .name = "vdpau_h264", // .log2_chroma_w = 1, // .log2_chroma_h = 1, // .flags = PIX_FMT_HWACCEL, // }, // [PIX_FMT_VDPAU_MPEG1] = { // .name = "vdpau_mpeg1", // .log2_chroma_w = 1, // .log2_chroma_h = 1, // .flags = PIX_FMT_HWACCEL, // }, // [PIX_FMT_VDPAU_MPEG2] = { // .name = "vdpau_mpeg2", // .log2_chroma_w = 1, // .log2_chroma_h = 1, // .flags = PIX_FMT_HWACCEL, // }, // [PIX_FMT_VDPAU_WMV3] = { // .name = "vdpau_wmv3", // .log2_chroma_w = 1, // .log2_chroma_h = 1, // .flags = PIX_FMT_HWACCEL, // }, // [PIX_FMT_VDPAU_VC1] = { // .name = "vdpau_vc1", // .log2_chroma_w = 1, // .log2_chroma_h = 1, // .flags = PIX_FMT_HWACCEL, // }, // [PIX_FMT_VDPAU_MPEG4] = { // .name = "vdpau_mpeg4", // .log2_chroma_w = 1, // .log2_chroma_h = 1, // .flags = PIX_FMT_HWACCEL, // }, // [PIX_FMT_RGB48BE] = { // .name = "rgb48be", // .nb_components= 3, // .log2_chroma_w= 0, // .log2_chroma_h= 0, // .comp = { // {0,5,1,0,15}, /* R */ // {0,5,3,0,15}, /* G */ // {0,5,5,0,15}, /* B */ // }, // .flags = PIX_FMT_BE, // }, // [PIX_FMT_RGB48LE] = { // .name = "rgb48le", // .nb_components= 3, // .log2_chroma_w= 0, // .log2_chroma_h= 0, // .comp = { // {0,5,1,0,15}, /* R */ // {0,5,3,0,15}, /* G */ // {0,5,5,0,15}, /* B */ // }, // }, // [PIX_FMT_RGB565BE] = { // .name = "rgb565be", // .nb_components= 3, // .log2_chroma_w= 0, // .log2_chroma_h= 0, // .comp = { // {0,1,0,3,4}, /* R */ // {0,1,1,5,5}, /* G */ // {0,1,1,0,4}, /* B */ // }, // .flags = PIX_FMT_BE, // }, // [PIX_FMT_RGB565LE] = { // .name = "rgb565le", // .nb_components= 3, // .log2_chroma_w= 0, // .log2_chroma_h= 0, // .comp = { // {0,1,2,3,4}, /* R */ // {0,1,1,5,5}, /* G */ // {0,1,1,0,4}, /* B */ // }, // }, // [PIX_FMT_RGB555BE] = { // .name = "rgb555be", // .nb_components= 3, // .log2_chroma_w= 0, // .log2_chroma_h= 0, // .comp = { // {0,1,0,2,4}, /* R */ // {0,1,1,5,4}, /* G */ // {0,1,1,0,4}, /* B */ // }, // .flags = PIX_FMT_BE, // }, // [PIX_FMT_RGB555LE] = { // .name = "rgb555le", // .nb_components= 3, // .log2_chroma_w= 0, // .log2_chroma_h= 0, // .comp = { // {0,1,2,2,4}, /* R */ // {0,1,1,5,4}, /* G */ // {0,1,1,0,4}, /* B */ // }, // }, // [PIX_FMT_RGB444BE] = { // .name = "rgb444be", // .nb_components= 3, // .log2_chroma_w= 0, // .log2_chroma_h= 0, // .comp = { // {0,1,0,0,3}, /* R */ // {0,1,1,4,3}, /* G */ // {0,1,1,0,3}, /* B */ // }, // .flags = PIX_FMT_BE, // }, // [PIX_FMT_RGB444LE] = { // .name = "rgb444le", // .nb_components= 3, // .log2_chroma_w= 0, // .log2_chroma_h= 0, // .comp = { // {0,1,2,0,3}, /* R */ // {0,1,1,4,3}, /* G */ // {0,1,1,0,3}, /* B */ // }, // }, // [PIX_FMT_BGR565BE] = { // .name = "bgr565be", // .nb_components= 3, // .log2_chroma_w= 0, // .log2_chroma_h= 0, // .comp = { // {0,1,0,3,4}, /* B */ // {0,1,1,5,5}, /* G */ // {0,1,1,0,4}, /* R */ // }, // .flags = PIX_FMT_BE, // }, // [PIX_FMT_BGR565LE] = { // .name = "bgr565le", // .nb_components= 3, // .log2_chroma_w= 0, // .log2_chroma_h= 0, // .comp = { // {0,1,2,3,4}, /* B */ // {0,1,1,5,5}, /* G */ // {0,1,1,0,4}, /* R */ // }, // }, // [PIX_FMT_BGR555BE] = { // .name = "bgr555be", // .nb_components= 3, // .log2_chroma_w= 0, // .log2_chroma_h= 0, // .comp = { // {0,1,0,2,4}, /* B */ // {0,1,1,5,4}, /* G */ // {0,1,1,0,4}, /* R */ // }, // .flags = PIX_FMT_BE, // }, // [PIX_FMT_BGR555LE] = { // .name = "bgr555le", // .nb_components= 3, // .log2_chroma_w= 0, // .log2_chroma_h= 0, // .comp = { // {0,1,2,2,4}, /* B */ // {0,1,1,5,4}, /* G */ // {0,1,1,0,4}, /* R */ // }, // }, // [PIX_FMT_BGR444BE] = { // .name = "bgr444be", // .nb_components= 3, // .log2_chroma_w= 0, // .log2_chroma_h= 0, // .comp = { // {0,1,0,0,3}, /* B */ // {0,1,1,4,3}, /* G */ // {0,1,1,0,3}, /* R */ // }, // .flags = PIX_FMT_BE, // }, // [PIX_FMT_BGR444LE] = { // .name = "bgr444le", // .nb_components= 3, // .log2_chroma_w= 0, // .log2_chroma_h= 0, // .comp = { // {0,1,2,0,3}, /* B */ // {0,1,1,4,3}, /* G */ // {0,1,1,0,3}, /* R */ // }, // }, // [PIX_FMT_VAAPI_MOCO] = { // .name = "vaapi_moco", // .log2_chroma_w = 1, // .log2_chroma_h = 1, // .flags = PIX_FMT_HWACCEL, // }, // [PIX_FMT_VAAPI_IDCT] = { // .name = "vaapi_idct", // .log2_chroma_w = 1, // .log2_chroma_h = 1, // .flags = PIX_FMT_HWACCEL, // }, // [PIX_FMT_VAAPI_VLD] = { // .name = "vaapi_vld", // .log2_chroma_w = 1, // .log2_chroma_h = 1, // .flags = PIX_FMT_HWACCEL, // }, // [PIX_FMT_YUV420P16LE] = { // .name = "yuv420p16le", // .nb_components= 3, // .log2_chroma_w= 1, // .log2_chroma_h= 1, // .comp = { // {0,1,1,0,15}, /* Y */ // {1,1,1,0,15}, /* U */ // {2,1,1,0,15}, /* V */ // }, // }, // [PIX_FMT_YUV420P16BE] = { // .name = "yuv420p16be", // .nb_components= 3, // .log2_chroma_w= 1, // .log2_chroma_h= 1, // .comp = { // {0,1,1,0,15}, /* Y */ // {1,1,1,0,15}, /* U */ // {2,1,1,0,15}, /* V */ // }, // .flags = PIX_FMT_BE, // }, // [PIX_FMT_YUV422P16LE] = { // .name = "yuv422p16le", // .nb_components= 3, // .log2_chroma_w= 1, // .log2_chroma_h= 0, // .comp = { // {0,1,1,0,15}, /* Y */ // {1,1,1,0,15}, /* U */ // {2,1,1,0,15}, /* V */ // }, // }, // [PIX_FMT_YUV422P16BE] = { // .name = "yuv422p16be", // .nb_components= 3, // .log2_chroma_w= 1, // .log2_chroma_h= 0, // .comp = { // {0,1,1,0,15}, /* Y */ // {1,1,1,0,15}, /* U */ // {2,1,1,0,15}, /* V */ // }, // .flags = PIX_FMT_BE, // }, // [PIX_FMT_YUV444P16LE] = { // .name = "yuv444p16le", // .nb_components= 3, // .log2_chroma_w= 0, // .log2_chroma_h= 0, // .comp = { // {0,1,1,0,15}, /* Y */ // {1,1,1,0,15}, /* U */ // {2,1,1,0,15}, /* V */ // }, // }, // [PIX_FMT_YUV444P16BE] = { // .name = "yuv444p16be", // .nb_components= 3, // .log2_chroma_w= 0, // .log2_chroma_h= 0, // .comp = { // {0,1,1,0,15}, /* Y */ // {1,1,1,0,15}, /* U */ // {2,1,1,0,15}, /* V */ // }, // .flags = PIX_FMT_BE, // }, // [PIX_FMT_DXVA2_VLD] = { // .name = "dxva2_vld", // .log2_chroma_w = 1, // .log2_chroma_h = 1, // .flags = PIX_FMT_HWACCEL, // }, // [PIX_FMT_Y400A] = { // .name = "y400a", // .nb_components= 2, // .comp = { // {0,1,1,0,7}, /* Y */ // {0,1,2,0,7}, /* A */ // }, // }, // }; public static void av_image_copy(/* uint8_t * */int[][] dst_base, int[] dst_offset, int[] dst_linesizes, /* const uint8_t * */int[][] src_base, int[] src_offset, int[] src_linesizes, /* enum PixelFormat */int pix_fmt, int width, int height) { AVPixFmtDescriptor desc = av_pix_fmt_descriptors[pix_fmt]; // No H/W Accel // if (desc.flags & PIX_FMT_HWACCEL) // return; if ((desc.flags & PIX_FMT_PAL) != 0) { av_image_copy_plane(dst_base[0], dst_offset[0], dst_linesizes[0], src_base[0], src_offset[0], src_linesizes[0], width, height); /* copy the palette */ System.arraycopy(src_base[1], src_offset[1], dst_base[1], dst_offset[1], 4 * 256); // memcpy(dst_data[1], src_data[1], 4*256); } else { int i, planes_nb = 0; for (i = 0; i < desc.nb_components; i++) planes_nb = Math.max(planes_nb, desc.comp[i].plane + 1); for (i = 0; i < planes_nb; i++) { int h = height; int bwidth = av_image_get_linesize(pix_fmt, width, i); if (i == 1 || i == 2) { h = -((-height) >> desc.log2_chroma_h); } av_image_copy_plane(dst_base[i], dst_offset[i], dst_linesizes[i], src_base[i], src_offset[i], src_linesizes[i], bwidth, h); } } } public static void av_image_copy_plane(/* uint8_t * */int[] dst, int _dst_offset, int dst_linesize, /* const uint8_t * */int[] src, int _src_offset, int src_linesize, int bytewidth, int height) { int dst_offset = _dst_offset; int src_offset = _src_offset; if (dst == null || src == null) return; for (; height > 0; height--) { //memcpy(dst, src, bytewidth); System.arraycopy(src, src_offset, dst, dst_offset, bytewidth); dst_offset += dst_linesize; src_offset += src_linesize; } } public static int av_image_get_linesize(/*enum PixelFormat*/int pix_fmt, int width, int plane) { AVPixFmtDescriptor desc = av_pix_fmt_descriptors[pix_fmt]; int max_step[] = new int[4]; /* max pixel step for each plane */ int max_step_comp[] = new int[4]; /* the component for each plane which has the max pixel step */ int s; if ((desc.flags & PIX_FMT_BITSTREAM)!=0) return (width * (desc.comp[0].step_minus1+1) + 7) >> 3; av_image_fill_max_pixsteps(max_step, max_step_comp, desc); s = (max_step_comp[plane] == 1 || max_step_comp[plane] == 2) ? desc.log2_chroma_w : 0; return max_step[plane] * (((width + (1 << s) - 1)) >> s); } public static void av_image_fill_max_pixsteps(int[] max_pixsteps, int[] max_pixstep_comps, AVPixFmtDescriptor pixdesc) { int i; // memset(max_pixsteps, 0, 4*sizeof(max_pixsteps[0])); Arrays.fill(max_pixsteps, 0, 4, 0); if (max_pixstep_comps != null) // memset(max_pixstep_comps, 0, 4*sizeof(max_pixstep_comps[0])); Arrays.fill(max_pixstep_comps, 0, 4, 0); for (i = 0; i < 4; i++) { AVComponentDescriptor comp = (pixdesc.comp[i]); if ((comp.step_minus1 + 1) > max_pixsteps[comp.plane]) { max_pixsteps[comp.plane] = comp.step_minus1 + 1; if (max_pixstep_comps != null) max_pixstep_comps[comp.plane] = i; } } } }