user: Translate the below assembly code into C programming language:

```asm
<pixel_convert_8u_yuv420p_to_8u_rgb>:
  endbr64
  mov    %ecx,%eax
  mov    %r9d,%ecx
  push   %r15
  imul   %eax,%ecx
  push   %r14
  mov    %edx,%r14d
  push   %r13
  push   %r12
  push   %rbp
  test   %ecx,%ecx
  push   %rbx
  mov    %edx,-0x1c(%rsp)
  movslq %ecx,%rdx
  lea    (%r8,%rdx,4),%rdx
  mov    %r9d,-0x18(%rsp)
  mov    %rdx,-0x8(%rsp)
  lea    0x3(%rcx),%edx
  cmovns %ecx,%edx
  sar    $0x2,%edx
  movslq %edx,%rcx
  mov    %eax,%edx
  shr    $0x1f,%edx
  mov    %rcx,-0x28(%rsp)
  add    %eax,%edx
  sar    %edx
  mov    %edx,-0x14(%rsp)
  cmp    $0x1,%eax
  jle    L22
  lea    (%rsi,%rsi,1),%eax
  movslq %esi,%rsi
  mov    %r14d,%r13d
  mov    %rdi,-0x30(%rsp)
  cltq
  shr    $0x1f,%r13d
  movl   $0x0,-0x20(%rsp)
  shl    $0x2,%rax
  add    %r14d,%r13d
  xor    %r14d,%r14d
  mov    %rax,-0x10(%rsp)
  lea    (%rdi,%rsi,4),%rax
  sar    %r13d
  mov    %rax,-0x38(%rsp)
  movslq %r9d,%rax
  shl    $0x2,%rax
  mov    %rax,-0x40(%rsp)
  nopw   0x0(%rax,%rax,1)
L38:
  mov    -0x40(%rsp),%rax
  lea    (%rax,%r8,1),%rbx
  mov    %r14d,%eax
  shr    $0x1f,%eax
  add    %r14d,%eax
  sar    %eax
  cltq
  lea    0x0(,%rax,4),%rdx
  add    -0x28(%rsp),%rax
  shl    $0x2,%rax
  cmpl   $0x1,-0x1c(%rsp)
  jle    L30
  mov    -0x8(%rsp),%rcx
  mov    -0x38(%rsp),%r9
  xor    %esi,%esi
  mov    -0x30(%rsp),%rdi
  lea    (%rcx,%rdx,1),%r12
  lea    (%rcx,%rax,1),%rbp
  nopl   0x0(%rax,%rax,1)
L19:
  mov    (%r12,%rsi,4),%eax
  mov    0x0(%rbp,%rsi,4),%ecx
  mov    $0xff,%r15d
  add    $0xffffff80,%ecx
  lea    -0x80(%rax),%r10d
  imul   $0x1c6,%r10d,%eax
  imul   $0x167,%ecx,%edx
  imul   $0x58,%r10d,%r10d
  imul   $0xb7,%ecx,%ecx
  sar    $0x8,%eax
  sar    $0x8,%edx
  add    %r10d,%ecx
  mov    (%r8,%rsi,8),%r10d
  sar    $0x8,%ecx
  lea    (%rdx,%r10,1),%r11d
  cmp    %r15d,%r11d
  cmovg  %r15d,%r11d
  xor    %r15d,%r15d
  test   %r11d,%r11d
  cmovs  %r15d,%r11d
  mov    $0xff,%r15d
  mov    %r11d,(%rdi)
  mov    %r10d,%r11d
  sub    %ecx,%r11d
  cmp    %r15d,%r11d
  cmovg  %r15d,%r11d
  xor    %r15d,%r15d
  test   %r11d,%r11d
  cmovs  %r15d,%r11d
  add    %eax,%r10d
  mov    $0xff,%r15d
  mov    %r11d,0x4(%rdi)
  mov    $0xff,%r11d
  cmp    %r11d,%r10d
  cmovg  %r11d,%r10d
  xor    %r11d,%r11d
  test   %r10d,%r10d
  cmovs  %r11d,%r10d
  mov    %r10d,0x8(%rdi)
  mov    0x4(%r8,%rsi,8),%r10d
  lea    (%rdx,%r10,1),%r11d
  cmp    %r15d,%r11d
  cmovg  %r15d,%r11d
  xor    %r15d,%r15d
  test   %r11d,%r11d
  cmovs  %r15d,%r11d
  mov    $0xff,%r15d
  mov    %r11d,0xc(%rdi)
  mov    %r10d,%r11d
  sub    %ecx,%r11d
  cmp    %r15d,%r11d
  cmovg  %r15d,%r11d
  xor    %r15d,%r15d
  test   %r11d,%r11d
  cmovs  %r15d,%r11d
  add    %eax,%r10d
  mov    $0xff,%r15d
  mov    %r11d,0x10(%rdi)
  mov    $0xff,%r11d
  cmp    %r11d,%r10d
  cmovg  %r11d,%r10d
  xor    %r11d,%r11d
  test   %r10d,%r10d
  cmovs  %r11d,%r10d
  mov    %r10d,0x14(%rdi)
  mov    (%rbx,%rsi,8),%r10d
  lea    (%rdx,%r10,1),%r11d
  cmp    %r15d,%r11d
  cmovg  %r15d,%r11d
  xor    %r15d,%r15d
  test   %r11d,%r11d
  cmovs  %r15d,%r11d
  mov    $0xff,%r15d
  mov    %r11d,(%r9)
  mov    %r10d,%r11d
  sub    %ecx,%r11d
  cmp    %r15d,%r11d
  cmovg  %r15d,%r11d
  xor    %r15d,%r15d
  test   %r11d,%r11d
  cmovs  %r15d,%r11d
  add    %eax,%r10d
  mov    %r11d,0x4(%r9)
  mov    $0xff,%r11d
  cmp    %r11d,%r10d
  cmovg  %r11d,%r10d
  xor    %r11d,%r11d
  test   %r10d,%r10d
  cmovs  %r11d,%r10d
  mov    $0xff,%r11d
  mov    %r10d,0x8(%r9)
  mov    0x4(%rbx,%rsi,8),%r10d
  add    %r10d,%edx
  cmp    %r11d,%edx
  cmovg  %r11d,%edx
  xor    %r11d,%r11d
  test   %edx,%edx
  cmovs  %r11d,%edx
  mov    %edx,0xc(%r9)
  mov    %r10d,%edx
  sub    %ecx,%edx
  mov    $0xff,%ecx
  cmp    %ecx,%edx
  cmovg  %ecx,%edx
  xor    %ecx,%ecx
  test   %edx,%edx
  cmovs  %ecx,%edx
  add    %r10d,%eax
  mov    %edx,0x10(%r9)
  mov    $0xff,%edx
  cmp    %edx,%eax
  cmovg  %edx,%eax
  xor    %edx,%edx
  test   %eax,%eax
  cmovs  %edx,%eax
  add    $0x1,%rsi
  add    $0x18,%rdi
  add    $0x18,%r9
  mov    %eax,-0x4(%r9)
  cmp    %esi,%r13d
  jg     L19
L30:
  mov    -0x40(%rsp),%rdi
  mov    -0x10(%rsp),%rsi
  addl   $0x1,-0x20(%rsp)
  add    -0x18(%rsp),%r14d
  add    %rsi,-0x30(%rsp)
  mov    -0x20(%rsp),%eax
  lea    (%rbx,%rdi,1),%r8
  add    %rsi,-0x38(%rsp)
  cmp    -0x14(%rsp),%eax
  jl     L38
L22:
  pop    %rbx
  xor    %eax,%eax
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
```

assistant: ```c
int pixel_convert_8u_yuv420p_to_8u_rgb(uint8_t *dest, int dstride, int dwidth, int dheight, const uint8_t *src, int sstride) {
  const uint8_t *uplane = src + dheight * sstride;
  const uint8_t *vplane = uplane + dheight * sstride / 4;
  for (int i = 0; i < dheight / 2; i++) {
    const uint8_t *yrow1 = src + i * 2 * sstride;
    const uint8_t *yrow2 = src + i * 2 * sstride + sstride;
    const uint8_t *urow = uplane + i * sstride / 2;
    const uint8_t *vrow = vplane + i * sstride / 2;
    uint8_t *rgb1 = dest + i * 2 * dstride;
    uint8_t *rgb2 = dest + i * 2 * dstride + dstride;
    for (int j = 0; j < dwidth / 2; j++) {
      int cb = ((urow[j] - 128) * 454) >> 8;
      int cr = ((vrow[j] - 128) * 359) >> 8;
      int cg = ((vrow[j] - 128) * 183 + (urow[j] - 128) * 88) >> 8;
      int r, g, b, yp;
      yp = yrow1[j * 2];
      r = yp + cr;
      b = yp + cb;
      g = yp - cg;
      rgb1[j * 6 + 0] = ((0) > (((255) < (r) ? (255) : (r))) ? (0) : (((255) < (r) ? (255) : (r))));
      rgb1[j * 6 + 1] = ((0) > (((255) < (g) ? (255) : (g))) ? (0) : (((255) < (g) ? (255) : (g))));
      rgb1[j * 6 + 2] = ((0) > (((255) < (b) ? (255) : (b))) ? (0) : (((255) < (b) ? (255) : (b))));
      yp = yrow1[j * 2 + 1];
      r = yp + cr;
      b = yp + cb;
      g = yp - cg;
      rgb1[j * 6 + 3] = ((0) > (((255) < (r) ? (255) : (r))) ? (0) : (((255) < (r) ? (255) : (r))));
      rgb1[j * 6 + 4] = ((0) > (((255) < (g) ? (255) : (g))) ? (0) : (((255) < (g) ? (255) : (g))));
      rgb1[j * 6 + 5] = ((0) > (((255) < (b) ? (255) : (b))) ? (0) : (((255) < (b) ? (255) : (b))));
      yp = yrow2[j * 2];
      r = yp + cr;
      b = yp + cb;
      g = yp - cg;
      rgb2[j * 6 + 0] = ((0) > (((255) < (r) ? (255) : (r))) ? (0) : (((255) < (r) ? (255) : (r))));
      rgb2[j * 6 + 1] = ((0) > (((255) < (g) ? (255) : (g))) ? (0) : (((255) < (g) ? (255) : (g))));
      rgb2[j * 6 + 2] = ((0) > (((255) < (b) ? (255) : (b))) ? (0) : (((255) < (b) ? (255) : (b))));
      yp = yrow2[j * 2 + 1];
      r = yp + cr;
      b = yp + cb;
      g = yp - cg;
      rgb2[j * 6 + 3] = ((0) > (((255) < (r) ? (255) : (r))) ? (0) : (((255) < (r) ? (255) : (r))));
      rgb2[j * 6 + 4] = ((0) > (((255) < (g) ? (255) : (g))) ? (0) : (((255) < (g) ? (255) : (g))));
      rgb2[j * 6 + 5] = ((0) > (((255) < (b) ? (255) : (b))) ? (0) : (((255) < (b) ? (255) : (b))));
    }
  }
  return 0;
}
```