user: What is the c source code of the assembly code below:

```asm
<yuv420_to_yuv420_crop>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x18,%rsp
  mov    %rdi,%rax
  mov    %rsi,%r15
  mov    %rdx,%r10
  mov    %rdx,0x8(%rsp)
  mov    %ecx,%esi
  mov    %r8d,%r12d
  mov    %r9d,%r14d
  mov    0x50(%rsp),%r8d
  mov    0x60(%rsp),%ecx
  mov    0x70(%rsp),%rdi
  mov    %ecx,%ebx
  or     0x68(%rsp),%ebx
  mov    %ebx,%edx
  or     0x58(%rsp),%edx
  or     %r8d,%edx
  je     L0
  mov    %ecx,%edx
  imul   %r9d,%edx
  add    %r8d,%edx
  movslq %edx,%rdx
  add    %rdx,%rax
  mov    %ecx,%r9d
  shr    $0x1f,%r9d
  add    %ecx,%r9d
  sar    %r9d
  imul   %r14d,%r9d
  mov    %r9d,%edx
  shr    $0x1f,%edx
  add    %r9d,%edx
  sar    %edx
  mov    %r8d,%r9d
  shr    $0x1f,%r9d
  add    %r8d,%r9d
  sar    %r9d
  add    %r9d,%edx
  movslq %edx,%rdx
  add    %rdx,%r15
  add    %rdx,%r10
  mov    %r10,0x8(%rsp)
  add    0x58(%rsp),%r8d
  sub    %r8d,%esi
  add    0x68(%rsp),%ecx
  sub    %ecx,%r12d
L0:
  mov    0x78(%rsp),%rdx
  mov    %esi,(%rdx)
  mov    0x80(%rsp),%rdx
  mov    %r12d,(%rdx)
  mov    %esi,%r13d
  imul   %r12d,%r13d
  movslq %r13d,%r13
  add    %rdi,%r13
  mov    %esi,%ebp
  shr    $0x1f,%ebp
  add    %esi,%ebp
  sar    %ebp
  mov    %ebp,%edx
  imul   %r12d,%edx
  mov    %edx,%ebx
  shr    $0x1f,%ebx
  add    %edx,%ebx
  sar    %ebx
  movslq %ebx,%rbx
  add    %r13,%rbx
  mov    %r12d,%r9d
  mov    %esi,%r8d
  mov    %r14d,%ecx
  mov    %rax,%rdx
  call   <plane_copy@plt>
  mov    %r12d,%eax
  shr    $0x1f,%eax
  add    %eax,%r12d
  sar    %r12d
  mov    %r14d,%eax
  shr    $0x1f,%eax
  add    %eax,%r14d
  sar    %r14d
  mov    %r12d,%r9d
  mov    %ebp,%r8d
  mov    %r14d,%ecx
  mov    %r15,%rdx
  mov    %ebp,%esi
  mov    %r13,%rdi
  call   <plane_copy@plt>
  mov    %r12d,%r9d
  mov    %ebp,%r8d
  mov    %r14d,%ecx
  mov    0x8(%rsp),%rdx
  mov    %ebp,%esi
  mov    %rbx,%rdi
  call   <plane_copy@plt>
  add    $0x18,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
```

assistant: ```c
void yuv420_to_yuv420_crop(unsigned char *pInpY, unsigned char *pInpCb, unsigned char *pInpCr, int picWidth, int picHeight, int stride, int CropLeft, int CropRight, int CropTop, int CropBottom, unsigned char *pDest, int *pDestWidth, int *pDestHeight) {
  unsigned char *p_sour[3];
  unsigned char *p_dest[3];
  int inp_width = picWidth;
  int inp_height = picHeight;
  int out_width = picWidth;
  int out_height = picHeight;
  p_sour[0] = pInpY;
  p_sour[1] = pInpCb;
  p_sour[2] = pInpCr;
  if (CropLeft || CropRight || CropTop || CropBottom) {
    p_sour[0] = pInpY + (CropTop * stride + CropLeft);
    p_sour[1] = pInpCb + (CropTop / 2 * stride / 2 + CropLeft / 2);
    p_sour[2] = pInpCr + (CropTop / 2 * stride / 2 + CropLeft / 2);
    inp_width = inp_width - (CropLeft + CropRight);
    inp_height = inp_height - (CropTop + CropBottom);
    out_width = inp_width;
    out_height = inp_height;
  }
  *pDestWidth = out_width;
  *pDestHeight = out_height;
  p_dest[0] = pDest;
  p_dest[1] = p_dest[0] + out_width * out_height;
  p_dest[2] = p_dest[1] + out_width / 2 * out_height / 2;
  plane_copy(p_dest[0], out_width, p_sour[0], stride, inp_width, inp_height);
  plane_copy(p_dest[1], out_width / 2, p_sour[1], stride / 2, inp_width / 2, inp_height / 2);
  plane_copy(p_dest[2], out_width / 2, p_sour[2], stride / 2, inp_width / 2, inp_height / 2);
}
```