| Index: source/convert_from.cc | 
| diff --git a/source/convert_from.cc b/source/convert_from.cc | 
| index f81054c20d2c696d221f0dcc8b28abe1435e5441..d285e98d6b2d25452eacabeb9c4bd5c938b087f9 100644 | 
| --- a/source/convert_from.cc | 
| +++ b/source/convert_from.cc | 
| @@ -1094,53 +1094,58 @@ int ConvertFromI420(const uint8* y, | 
| } | 
| // TODO(fbarchard): Add M420. | 
| // Triplanar formats | 
| -    // TODO(fbarchard): halfstride instead of halfwidth | 
| case FOURCC_I420: | 
| case FOURCC_YV12: { | 
| -      int halfwidth = (width + 1) / 2; | 
| +      dst_sample_stride = dst_sample_stride ? dst_sample_stride : width; | 
| +      int halfstride = (dst_sample_stride + 1) / 2; | 
| int halfheight = (height + 1) / 2; | 
| uint8* dst_u; | 
| uint8* dst_v; | 
| if (format == FOURCC_YV12) { | 
| -        dst_v = dst_sample + width * height; | 
| -        dst_u = dst_v + halfwidth * halfheight; | 
| +        dst_v = dst_sample + dst_sample_stride * height; | 
| +        dst_u = dst_v + halfstride * halfheight; | 
| } else { | 
| -        dst_u = dst_sample + width * height; | 
| -        dst_v = dst_u + halfwidth * halfheight; | 
| +        dst_u = dst_sample + dst_sample_stride * height; | 
| +        dst_v = dst_u + halfstride * halfheight; | 
| } | 
| -      r = I420Copy(y, y_stride, u, u_stride, v, v_stride, dst_sample, width, | 
| -                   dst_u, halfwidth, dst_v, halfwidth, width, height); | 
| +      r = I420Copy(y, y_stride, u, u_stride, v, v_stride, dst_sample, | 
| +                   dst_sample_stride, dst_u, halfstride, dst_v, halfstride, | 
| +                   width, height); | 
| break; | 
| } | 
| case FOURCC_I422: | 
| case FOURCC_YV16: { | 
| -      int halfwidth = (width + 1) / 2; | 
| +      dst_sample_stride = dst_sample_stride ? dst_sample_stride : width; | 
| +      int halfstride = (dst_sample_stride + 1) / 2; | 
| uint8* dst_u; | 
| uint8* dst_v; | 
| if (format == FOURCC_YV16) { | 
| -        dst_v = dst_sample + width * height; | 
| -        dst_u = dst_v + halfwidth * height; | 
| +        dst_v = dst_sample + dst_sample_stride * height; | 
| +        dst_u = dst_v + halfstride * height; | 
| } else { | 
| -        dst_u = dst_sample + width * height; | 
| -        dst_v = dst_u + halfwidth * height; | 
| +        dst_u = dst_sample + dst_sample_stride * height; | 
| +        dst_v = dst_u + halfstride * height; | 
| } | 
| -      r = I420ToI422(y, y_stride, u, u_stride, v, v_stride, dst_sample, width, | 
| -                     dst_u, halfwidth, dst_v, halfwidth, width, height); | 
| +      r = I420ToI422(y, y_stride, u, u_stride, v, v_stride, dst_sample, | 
| +                     dst_sample_stride, dst_u, halfstride, dst_v, halfstride, | 
| +                     width, height); | 
| break; | 
| } | 
| case FOURCC_I444: | 
| case FOURCC_YV24: { | 
| +      dst_sample_stride = dst_sample_stride ? dst_sample_stride : width; | 
| uint8* dst_u; | 
| uint8* dst_v; | 
| if (format == FOURCC_YV24) { | 
| -        dst_v = dst_sample + width * height; | 
| -        dst_u = dst_v + width * height; | 
| +        dst_v = dst_sample + dst_sample_stride * height; | 
| +        dst_u = dst_v + dst_sample_stride * height; | 
| } else { | 
| -        dst_u = dst_sample + width * height; | 
| -        dst_v = dst_u + width * height; | 
| +        dst_u = dst_sample + dst_sample_stride * height; | 
| +        dst_v = dst_u + dst_sample_stride * height; | 
| } | 
| -      r = I420ToI444(y, y_stride, u, u_stride, v, v_stride, dst_sample, width, | 
| -                     dst_u, width, dst_v, width, width, height); | 
| +      r = I420ToI444(y, y_stride, u, u_stride, v, v_stride, dst_sample, | 
| +                     dst_sample_stride, dst_u, dst_sample_stride, dst_v, | 
| +                     dst_sample_stride, width, height); | 
| break; | 
| } | 
| // Formats not supported - MJPG, biplanar, some rgb formats. | 
|  |