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

```asm
<pixel_convert_8u_yuv420p_to_8u_rgb>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  mov    %rdi,%rax
  mov    %edx,%r14d
  mov    %edx,-0x1c(%rsp)
  mov    %ecx,%edx
  mov    %r9d,-0x18(%rsp)
  mov    %r9d,%edi
  imul   %ecx,%edi
  movslq %edi,%rcx
  lea    (%r8,%rcx,4),%rcx
  mov    %rcx,-0x8(%rsp)
  lea    0x3(%rdi),%ecx
  test   %edi,%edi
  cmovns %edi,%ecx
  sar    $0x2,%ecx
  movslq %ecx,%rdi
  mov    %rdi,-0x28(%rsp)
  mov    %edx,%ecx
  shr    $0x1f,%ecx
  add    %edx,%ecx
  sar    %ecx
  mov    %ecx,-0x14(%rsp)
  cmp    $0x1,%edx
  jle    L11
  mov    %r14d,%r13d
  shr    $0x1f,%r13d
  add    %r14d,%r13d
  sar    %r13d
  lea    (%rsi,%rsi,1),%edx
  movslq %edx,%rdx
  lea    0x0(,%rdx,4),%rdi
  mov    %rdi,-0x10(%rsp)
  mov    %rax,-0x38(%rsp)
  movslq %esi,%rsi
  lea    (%rax,%rsi,4),%rax
  mov    %rax,-0x30(%rsp)
  movslq %r9d,%rax
  shl    $0x2,%rax
  mov    %rax,-0x40(%rsp)
  movl   $0x0,-0x20(%rsp)
  mov    $0x0,%r14d
  mov    %r8,%rbx
L31:
  mov    %rbx,%rbp
  add    -0x40(%rsp),%rbx
  mov    -0x20(%rsp),%eax
  mov    %eax,%r11d
  shr    $0x1f,%r11d
  add    %eax,%r11d
  sar    %r11d
  movslq %r11d,%r11
  lea    0x0(,%r11,4),%r12
  add    -0x28(%rsp),%r11
  shl    $0x2,%r11
  cmpl   $0x1,-0x1c(%rsp)
  jle    L29
  mov    -0x30(%rsp),%r8
  mov    -0x38(%rsp),%rdi
  mov    $0x0,%esi
  mov    -0x8(%rsp),%rax
  add    %rax,%r12
  add    %rax,%r11
L36:
  mov    (%r12,%rsi,4),%eax
  lea    -0x80(%rax),%r9d
  imul   $0x1c6,%r9d,%eax
  sar    $0x8,%eax
  mov    (%r11,%rsi,4),%ecx
  add    $0xffffff80,%ecx
  imul   $0x167,%ecx,%edx
  sar    $0x8,%edx
  imul   $0xb7,%ecx,%ecx
  imul   $0x58,%r9d,%r9d
  add    %r9d,%ecx
  sar    $0x8,%ecx
  mov    0x0(%rbp,%rsi,8),%r9d
  lea    (%rdx,%r9,1),%r10d
  mov    $0xff,%r15d
  cmp    %r15d,%r10d
  cmovg  %r15d,%r10d
  test   %r10d,%r10d
  mov    $0x0,%r15d
  cmovs  %r15d,%r10d
  mov    %r10d,(%rdi)
  mov    %r9d,%r10d
  sub    %ecx,%r10d
  mov    $0xff,%r15d
  cmp    %r15d,%r10d
  cmovg  %r15d,%r10d
  test   %r10d,%r10d
  mov    $0x0,%r15d
  cmovs  %r15d,%r10d
  mov    %r10d,0x4(%rdi)
  add    %eax,%r9d
  mov    $0xff,%r10d
  cmp    %r10d,%r9d
  cmovg  %r10d,%r9d
  test   %r9d,%r9d
  mov    $0x0,%r10d
  cmovs  %r10d,%r9d
  mov    %r9d,0x8(%rdi)
  mov    0x4(%rbp,%rsi,8),%r9d
  lea    (%rdx,%r9,1),%r10d
  mov    $0xff,%r15d
  cmp    %r15d,%r10d
  cmovg  %r15d,%r10d
  test   %r10d,%r10d
  mov    $0x0,%r15d
  cmovs  %r15d,%r10d
  mov    %r10d,0xc(%rdi)
  mov    %r9d,%r10d
  sub    %ecx,%r10d
  mov    $0xff,%r15d
  cmp    %r15d,%r10d
  cmovg  %r15d,%r10d
  test   %r10d,%r10d
  mov    $0x0,%r15d
  cmovs  %r15d,%r10d
  mov    %r10d,0x10(%rdi)
  add    %eax,%r9d
  mov    $0xff,%r10d
  cmp    %r10d,%r9d
  cmovg  %r10d,%r9d
  test   %r9d,%r9d
  mov    $0x0,%r10d
  cmovs  %r10d,%r9d
  mov    %r9d,0x14(%rdi)
  mov    (%rbx,%rsi,8),%r9d
  lea    (%rdx,%r9,1),%r10d
  mov    $0xff,%r15d
  cmp    %r15d,%r10d
  cmovg  %r15d,%r10d
  test   %r10d,%r10d
  mov    $0x0,%r15d
  cmovs  %r15d,%r10d
  mov    %r10d,(%r8)
  mov    %r9d,%r10d
  sub    %ecx,%r10d
  mov    $0xff,%r15d
  cmp    %r15d,%r10d
  cmovg  %r15d,%r10d
  test   %r10d,%r10d
  mov    $0x0,%r15d
  cmovs  %r15d,%r10d
  mov    %r10d,0x4(%r8)
  add    %eax,%r9d
  mov    $0xff,%r10d
  cmp    %r10d,%r9d
  cmovg  %r10d,%r9d
  test   %r9d,%r9d
  mov    $0x0,%r10d
  cmovs  %r10d,%r9d
  mov    %r9d,0x8(%r8)
  mov    0x4(%rbx,%rsi,8),%r9d
  add    %r9d,%edx
  mov    $0xff,%r10d
  cmp    %r10d,%edx
  cmovg  %r10d,%edx
  test   %edx,%edx
  mov    $0x0,%r10d
  cmovs  %r10d,%edx
  mov    %edx,0xc(%r8)
  mov    %r9d,%edx
  sub    %ecx,%edx
  mov    $0xff,%ecx
  cmp    %ecx,%edx
  cmovg  %ecx,%edx
  test   %edx,%edx
  mov    $0x0,%ecx
  cmovs  %ecx,%edx
  mov    %edx,0x10(%r8)
  add    %r9d,%eax
  mov    $0xff,%edx
  cmp    %edx,%eax
  cmovg  %edx,%eax
  test   %eax,%eax
  mov    $0x0,%edx
  cmovs  %edx,%eax
  mov    %eax,0x14(%r8)
  add    $0x1,%rsi
  add    $0x18,%rdi
  add    $0x18,%r8
  cmp    %esi,%r13d
  jg     L36
L29:
  add    $0x1,%r14d
  mov    -0x18(%rsp),%edi
  add    %edi,-0x20(%rsp)
  mov    -0x10(%rsp),%rdi
  add    %rdi,-0x38(%rsp)
  add    %rdi,-0x30(%rsp)
  add    -0x40(%rsp),%rbx
  cmp    -0x14(%rsp),%r14d
  jl     L31
L11:
  mov    $0x0,%eax
  pop    %rbx
  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;
}
```