diff --git a/source/convert.cc b/source/convert.cc index 09cad217c..0c802fa33 100644 --- a/source/convert.cc +++ b/source/convert.cc @@ -1132,10 +1132,9 @@ int ConvertToI420(const uint8* sample, size_t sample_size, dst_width, inv_dst_height, rotation); break; } - // Triplanar formats case FOURCC_I422: case FOURCC_YV16: { - const uint8* src_y = sample + (src_width * crop_y + crop_x); + const uint8* src_y = sample + src_width * crop_y + crop_x; const uint8* src_u; const uint8* src_v; int halfwidth = (src_width + 1) / 2; @@ -1159,6 +1158,27 @@ int ConvertToI420(const uint8* sample, size_t sample_size, dst_width, inv_dst_height); break; } + case FOURCC_I444: + case FOURCC_YV24: { + const uint8* src_y = sample + src_width * crop_y + crop_x; + const uint8* src_u; + const uint8* src_v; + if (format == FOURCC_I444) { + src_u = sample + src_width * (abs_src_height + crop_y) + crop_x; + src_v = sample + src_width * (abs_src_height * 2 + crop_y) + crop_x; + } else { + src_v = sample + src_width * (abs_src_height + crop_y) + crop_x; + src_u = sample + src_width * (abs_src_height * 2 + crop_y) + crop_x; + } + I444ToI420(src_y, src_width, + src_u, halfwidth, + src_v, halfwidth, + y, y_stride, + u, u_stride, + v, v_stride, + dst_width, inv_dst_height); + break; + } // Formats not supported case FOURCC_MJPG: default: diff --git a/source/video_common.cc b/source/video_common.cc index 8b8ee622d..0f5f3b646 100644 --- a/source/video_common.cc +++ b/source/video_common.cc @@ -25,6 +25,8 @@ struct FourCCAliasEntry { static const FourCCAliasEntry kFourCCAliases[] = { {FOURCC_IYUV, FOURCC_I420}, {FOURCC_YU12, FOURCC_I420}, + {FOURCC_YU16, FOURCC_I422}, + {FOURCC_YU24, FOURCC_I444}, {FOURCC_YUYV, FOURCC_YUY2}, {FOURCC_YUVS, FOURCC_YUY2}, {FOURCC_HDYC, FOURCC_UYVY}, diff --git a/source/video_common.h b/source/video_common.h index 839050de8..0f4c6ee5c 100644 --- a/source/video_common.h +++ b/source/video_common.h @@ -39,8 +39,10 @@ enum FourCC { // Canonical fourcc codes used in our code. FOURCC_I420 = FOURCC('I', '4', '2', '0'), FOURCC_I422 = FOURCC('I', '4', '2', '2'), + FOURCC_I444 = FOURCC('I', '4', '4', '4'), FOURCC_YV12 = FOURCC('Y', 'V', '1', '2'), FOURCC_YV16 = FOURCC('Y', 'V', '1', '6'), + FOURCC_YV24 = FOURCC('Y', 'V', '2', '4'), FOURCC_YUY2 = FOURCC('Y', 'U', 'Y', '2'), FOURCC_UYVY = FOURCC('U', 'Y', 'V', 'Y'), FOURCC_M420 = FOURCC('M', '4', '2', '0'), @@ -65,6 +67,7 @@ enum FourCC { FOURCC_IYUV = FOURCC('I', 'Y', 'U', 'V'), // Alias for I420 FOURCC_YU12 = FOURCC('Y', 'U', '1', '2'), // Alias for I420 FOURCC_YU16 = FOURCC('Y', 'U', '1', '6'), // Alias for I422 + FOURCC_YU24 = FOURCC('Y', 'U', '2', '4'), // Alias for I444 FOURCC_YUYV = FOURCC('Y', 'U', 'Y', 'V'), // Alias for YUY2 FOURCC_YUVS = FOURCC('y', 'u', 'v', 's'), // Alias for YUY2 on Mac FOURCC_HDYC = FOURCC('H', 'D', 'Y', 'C'), // Alias for UYVY