/* WARNING: Removing unreachable block (ram,0x004025a8) */
/* WARNING: Removing unreachable block (ram,0x0040261c) */
/* WARNING: Globals starting with '_' overlap smaller symbols at the same address */

undefined4 write_jpeg(char *param_1,int param_2,ushort param_3,ushort param_4,char *param_5)

{
  undefined1 uVar1;
  byte bVar2;
  byte bVar3;
  double dVar4;
  double dVar5;
  undefined1 *puVar6;
  size_t sVar7;
  int iVar8;
  int *piVar9;
  byte bVar10;
  int iVar11;
  int iVar12;
  int *piVar13;
  int iVar14;
  int iVar15;
  int *piVar16;
  uint uVar17;
  int iVar18;
  char cVar19;
  byte *pbVar20;
  double *pdVar21;
  int iVar22;
  uint uVar23;
  int iVar24;
  uint uVar25;
  undefined2 *puVar26;
  undefined4 uVar27;
  undefined4 uVar28;
  uint uVar29;
  undefined2 local_78;
  undefined2 local_76;
  undefined2 local_74 [2];
  undefined4 local_70;
  undefined8 local_68;
  
  if ((param_1 == (char *)0x0) || (param_2 == 0)) {
    uVar27 = 0xffffffff;
  }
  else {
    DAT_004183b8 = param_3;
    if ((param_3 & 7) != 0) {
      DAT_004183b8 = (param_3 & 0xfff8) + 8;
    }
    DAT_004183ba = param_4;
    if ((param_4 & 7) != 0) {
      DAT_004183ba = (param_4 & 0xfff8) + 8;
    }
    DAT_004183b4 = param_2;
    DAT_0041857c = fopen(param_1,"wb")   //possible issue identified - semgrep
    DQTinfo = 0xffdb;
    _DAT_00418776 = 0x84;
    DAT_004187b9 = 1;
    DAT_00418778 = 0;
    iVar15 = 0;
    do {
      pbVar20 = &DAT_00415088 + iVar15;
      uVar29 = ((uint)(byte)(&DAT_004150c8)[iVar15] * 0x32 + 0x32) / 100;
      iVar15 = iVar15 + 1;
      if (uVar29 == 0) {
        uVar29 = 1;
      }
      (&DAT_00418779)[*pbVar20] = (char)uVar29;
    } while (iVar15 != 0x40);
    iVar15 = 0;
    do {
      pbVar20 = &DAT_00415088 + iVar15;
      uVar29 = ((uint)(byte)(&DAT_00415108)[iVar15] * 0x32 + 0x32) / 100;
      iVar15 = iVar15 + 1;
      if (uVar29 == 0) {
        uVar29 = 1;
      }
      (&DAT_004187ba)[*pbVar20] = (char)uVar29;
    } while (iVar15 != 0x40);
    _DHTinfo = 0xffc4;
    _DAT_004185d2 = 0x1a2;
    DAT_004185d4 = 0;
    iVar15 = 0;
    do {
      iVar11 = iVar15 + 1;
      (&DAT_004185d5)[iVar15] = (&DAT_00415149)[iVar15];
      iVar15 = iVar11;
    } while (iVar11 != 0x10);
    puVar6 = &DAT_0041515c;
    iVar15 = 0;
    do {
      iVar11 = iVar15 + 1;
      (&DAT_004185e5)[iVar15] = *puVar6;
      puVar6 = &DAT_0041515d + iVar15;
      iVar15 = iVar11;
    } while (iVar11 != 0xc);
    DAT_004185f1 = 0x10;
    iVar15 = 0;
    do {
      iVar11 = iVar15 + 1;
      (&DAT_004185f2)[iVar15] = (&DAT_00415189)[iVar15];
      iVar15 = iVar11;
    } while (iVar11 != 0x10);
    puVar6 = &DAT_0041519c;
    iVar15 = 0;
    do {
      iVar11 = iVar15 + 1;
      (&DAT_00418602)[iVar15] = *puVar6;
      puVar6 = &DAT_0041519d + iVar15;
      iVar15 = iVar11;
    } while (iVar11 != 0xa2);
    DAT_004186a4 = 1;
    iVar15 = 0;
    do {
      iVar11 = iVar15 + 1;
      (&DAT_004186a5)[iVar15] = (&DAT_00415169)[iVar15];
      iVar15 = iVar11;
    } while (iVar11 != 0x10);
    puVar6 = &DAT_0041517c;
    iVar15 = 0;
    do {
      iVar11 = iVar15 + 1;
      (&DAT_004186b5)[iVar15] = *puVar6;
      puVar6 = &DAT_0041517d + iVar15;
      iVar15 = iVar11;
    } while (iVar11 != 0xc);
    DAT_004186c1 = 0x11;
    iVar15 = 0;
    do {
      iVar11 = iVar15 + 1;
      (&DAT_004186c2)[iVar15] = (&DAT_00415241)[iVar15];
      iVar15 = iVar11;
    } while (iVar11 != 0x10);
    iVar15 = 0;
    do {
      iVar11 = iVar15 + 1;
      (&DAT_004186d2)[iVar15] = (&DAT_00415254)[iVar15];
      iVar15 = iVar11;
    } while (iVar11 != 0xa2);
    pbVar20 = &DAT_00415149;
    uVar29 = 0;
    uVar23 = 0;
    cVar19 = '\x01';
    while( true ) {
      bVar10 = 1;
      while( true ) {
        if (*pbVar20 < bVar10) break;
        bVar2 = (&DAT_0041515c)[uVar23];
        uVar23 = uVar23 + 1 & 0xff;
        *(short *)(&DAT_00415546 + (uint)bVar2 * 4) = (short)uVar29;
        (&DAT_00415544)[(uint)bVar2 * 4] = cVar19;
        uVar29 = uVar29 + 1 & 0xffff;
        bVar10 = bVar10 + 1;
      }
      cVar19 = cVar19 + '\x01';
      pbVar20 = pbVar20 + 1;
      if (cVar19 == '\x11') break;
      uVar29 = (uVar29 & 0x7fff) << 1;
    }
    pbVar20 = &DAT_00415169;
    uVar29 = 0;
    uVar23 = 0;
    cVar19 = '\x01';
    while( true ) {
      bVar10 = 1;
      while( true ) {
        if (*pbVar20 < bVar10) break;
        bVar2 = (&DAT_0041517c)[uVar23];
        uVar23 = uVar23 + 1 & 0xff;
        *(short *)(&DAT_00415576 + (uint)bVar2 * 4) = (short)uVar29;
        (&DAT_00415574)[(uint)bVar2 * 4] = cVar19;
        uVar29 = uVar29 + 1 & 0xffff;
        bVar10 = bVar10 + 1;
      }
      cVar19 = cVar19 + '\x01';
      pbVar20 = pbVar20 + 1;
      if (cVar19 == '\x11') break;
      uVar29 = (uVar29 & 0x7fff) << 1;
    }
    pbVar20 = &DAT_00415189;
    uVar29 = 0;
    uVar23 = 0;
    cVar19 = '\x01';
    while( true ) {
      bVar10 = 1;
      while( true ) {
        if (*pbVar20 < bVar10) break;
        bVar2 = (&DAT_0041519c)[uVar23];
        uVar23 = uVar23 + 1 & 0xff;
        *(short *)((uint)bVar2 * 4 + 0x4155a6) = (short)uVar29;
        (&DAT_004155a4)[(uint)bVar2 * 4] = cVar19;
        uVar29 = uVar29 + 1 & 0xffff;
        bVar10 = bVar10 + 1;
      }
      cVar19 = cVar19 + '\x01';
      pbVar20 = pbVar20 + 1;
      if (cVar19 == '\x11') break;
      uVar29 = (uVar29 & 0x7fff) << 1;
    }
    pbVar20 = &DAT_00415241;
    uVar29 = 0;
    uVar23 = 0;
    cVar19 = '\x01';
    while( true ) {
      bVar10 = 1;
      while( true ) {
        if (*pbVar20 < bVar10) break;
        bVar2 = (&DAT_00415254)[uVar23];
        uVar23 = uVar23 + 1 & 0xff;
        *(short *)(&DAT_004159a6 + (uint)bVar2 * 4) = (short)uVar29;
        (&DAT_004159a4)[(uint)bVar2 * 4] = cVar19;
        uVar29 = uVar29 + 1 & 0xffff;
        bVar10 = bVar10 + 1;
      }
      cVar19 = cVar19 + '\x01';
      pbVar20 = pbVar20 + 1;
      if (cVar19 == '\x11') break;
      uVar29 = (uVar29 & 0x7fff) << 1;
    }
    DAT_00415da4 = malloc(0xffff)   //possible issue identified - semgrep
    if (DAT_00415da4 == (void *)0x0) {
      error_exit("not enough memory.\n");
    }
    DAT_00415da8 = (int)DAT_00415da4 + 0x7fff;
    DAT_00415dac = malloc(0x3fffc)   //possible issue identified - semgrep
    if (DAT_00415dac == (void *)0x0) {
      error_exit("not enough memory.\n");
    }
    DAT_00415db0 = (int)DAT_00415dac + 0x1fffc;
    cVar19 = '\x01';
    iVar11 = 2;
    iVar15 = 1;
    while( true ) {
      iVar12 = iVar15 << 2;
      for (iVar8 = iVar15; iVar8 < iVar11; iVar8 = iVar8 + 1) {
        *(char *)(DAT_00415da8 + iVar8) = cVar19;
        *(char *)(DAT_00415db0 + iVar12) = cVar19;
        *(short *)(DAT_00415db0 + iVar12 + 2) = (short)iVar8;
        iVar12 = iVar12 + 4;
      }
      iVar8 = 1 - iVar11;
      iVar12 = iVar8 * 4;
      uVar29 = iVar11 + -1 + iVar8;
      for (; iVar8 <= -iVar15; iVar8 = iVar8 + 1) {
        *(char *)(DAT_00415da8 + iVar8) = cVar19;
        *(char *)(DAT_00415db0 + iVar12) = cVar19;
        *(short *)(DAT_00415db0 + iVar12 + 2) = (short)uVar29;
        iVar12 = iVar12 + 4;
        uVar29 = (uVar29 & 0xffff) + 1;
      }
      cVar19 = cVar19 + '\x01';
      iVar15 = iVar15 << 1;
      if (cVar19 == '\x10') break;
      iVar11 = iVar11 << 1;
    }
    iVar15 = 0;
    iVar8 = 0;
    iVar11 = 0;
    do {
      piVar13 = (int *)((int)&DAT_00415db4 + iVar15);
      piVar16 = (int *)((int)&DAT_004169b4 + iVar15);
      piVar9 = (int *)((int)&DAT_004175b4 + iVar15);
      iVar12 = iVar15 << 0xd;
      iVar15 = iVar15 + 4;
      *piVar13 = iVar8;
      *piVar16 = iVar11;
      *piVar9 = iVar12;
      iVar8 = iVar8 + 0x4c8b;
      iVar11 = iVar11 + -0x2b32;
    } while (iVar15 != 0x400);
    iVar15 = 0;
    iVar8 = 0;
    iVar11 = 0;
    do {
      iVar12 = iVar15 * -0x1533;
      piVar16 = (int *)((int)&DAT_004161b4 + iVar15);
      piVar9 = (int *)((int)&DAT_00416db4 + iVar15);
      piVar13 = (int *)((int)&DAT_004179b4 + iVar15);
      iVar15 = iVar15 + 4;
      *piVar16 = iVar8;
      *piVar13 = iVar11;
      *piVar9 = iVar12;
      iVar8 = iVar8 + 0x9646;
      iVar11 = iVar11 + -0x6b2e;
    } while (iVar15 != 0x400);
    iVar15 = 0;
    iVar11 = 0;
    do {
      iVar12 = iVar15 * -0x534;
      piVar16 = (int *)((int)&DAT_004165b4 + iVar15);
      piVar13 = (int *)((int)&DAT_004171b4 + iVar15);
      iVar8 = iVar15 << 0xd;
      piVar9 = (int *)((int)&DAT_00417db4 + iVar15);
      iVar15 = iVar15 + 4;
      *piVar16 = iVar11;
      *piVar13 = iVar8;
      *piVar9 = iVar12;
      iVar11 = iVar11 + 0x1d2f;
    } while (iVar15 != 0x400);
    memcpy(&local_68,&DAT_00404ee0,0x40)   //possible issue identified - semgrep
    uVar29 = 0;
    do {
      uVar27 = *(undefined4 *)((int)&local_68 + uVar29);
      uVar28 = *(undefined4 *)((int)&local_68 + uVar29 + 4);
      pdVar21 = (double *)&local_68;
      uVar23 = uVar29;
      do {
        uVar17 = uVar23 & 0xff;
        dVar5 = *pdVar21;
        dVar4 = *pdVar21;
        bVar10 = (&DAT_004187ba)[(byte)(&DAT_00415088)[uVar17]];
        pdVar21 = pdVar21 + 1;
        uVar23 = uVar17 + 1;
        (&DAT_004181b4)[uVar17] =
             (float)(1.0 / ((double)(byte)(&DAT_00418779)[(byte)(&DAT_00415088)[uVar17]] *
                            (double)CONCAT44(uVar28,uVar27) * dVar4 * 8.0));
        (&DAT_004182b4)[uVar17] =
             (float)(1.0 / ((double)bVar10 * (double)CONCAT44(uVar28,uVar27) * dVar5 * 8.0));
      } while (pdVar21 != (double *)&stack0xffffffd8);
      uVar29 = uVar29 + 8;
    } while (uVar29 != 0x40);
    _DAT_0041506a = param_4;
    DAT_0041506c = param_3;
    fputc(0xff,DAT_0041857c);
    fputc(0xd8,DAT_0041857c);
    fputc((uint)(byte)((ushort)_DAT_00415050 >> 8),DAT_0041857c);
    fputc((int)_DAT_00415050,DAT_0041857c);
    fputc((uint)(byte)((ushort)_DAT_00415052 >> 8),DAT_0041857c);
    fputc((int)_DAT_00415052,DAT_0041857c);
    fputc(0x4a,DAT_0041857c);
    fputc(0x46,DAT_0041857c);
    fputc(0x49,DAT_0041857c);
    fputc(0x46,DAT_0041857c);
    fputc(0,DAT_0041857c);
    fputc((int)DAT_00415059,DAT_0041857c);
    fputc((int)DAT_0041505a,DAT_0041857c);
    fputc((int)DAT_0041505b,DAT_0041857c);
    fputc((uint)(byte)((ushort)_DAT_0041505c >> 8),DAT_0041857c);
    fputc((int)_DAT_0041505c,DAT_0041857c);
    fputc((uint)(byte)((ushort)_DAT_0041505e >> 8),DAT_0041857c);
    fputc((int)_DAT_0041505e,DAT_0041857c);
    fputc((int)DAT_00415060,DAT_0041857c);
    fputc((int)DAT_00415061,DAT_0041857c);
    if (param_5 != (char *)0x0) {
      fputc(0xff,DAT_0041857c);
      fputc(0xfe,DAT_0041857c);
      sVar7 = strlen(param_5);
      uVar29 = (sVar7 & 0xffff) + 2;
      fputc(uVar29 >> 8,DAT_0041857c);
      fputc(uVar29 & 0xff,DAT_0041857c);
      for (uVar29 = 0; uVar29 < (sVar7 & 0xffff); uVar29 = uVar29 + 1 & 0xffff) {
        cVar19 = *param_5;
        param_5 = param_5 + 1;
        fputc((int)cVar19,DAT_0041857c);
      }
    }
    fputc((uint)(byte)((ushort)DQTinfo >> 8),DAT_0041857c);
    fputc((int)DQTinfo,DAT_0041857c);
    fputc((uint)(byte)((ushort)_DAT_00418776 >> 8),DAT_0041857c);
    fputc((int)_DAT_00418776,DAT_0041857c);
    puVar6 = &DAT_00418779;
    fputc((int)DAT_00418778,DAT_0041857c);
    do {
      uVar1 = *puVar6;
      puVar6 = puVar6 + 1;
      fputc((int)uVar1,DAT_0041857c);
    } while (puVar6 != &DAT_004187b9);
    puVar6 = &DAT_004187ba;
    fputc((int)DAT_004187b9,DAT_0041857c);
    do {
      uVar1 = *puVar6;
      puVar6 = puVar6 + 1;
      fputc((int)uVar1,DAT_0041857c);
    } while (puVar6 != (undefined1 *)0x4187fa);
    fputc((uint)(byte)((ushort)_DAT_00415064 >> 8),DAT_0041857c);
    fputc((int)_DAT_00415064,DAT_0041857c);
    fputc((uint)(byte)((ushort)_DAT_00415066 >> 8),DAT_0041857c);
    fputc((int)_DAT_00415066,DAT_0041857c);
    fputc((int)DAT_00415068,DAT_0041857c);
    fputc((uint)(byte)(_DAT_0041506a >> 8),DAT_0041857c);
    puVar6 = &DAT_004185d5;
    fputc((int)_DAT_0041506a,DAT_0041857c);
    fputc((uint)(byte)(DAT_0041506c >> 8),DAT_0041857c);
    fputc((int)DAT_0041506c,DAT_0041857c);
    fputc((int)DAT_0041506e,DAT_0041857c);
    fputc((int)DAT_0041506f,DAT_0041857c);
    fputc((int)DAT_00415070,DAT_0041857c);
    fputc((int)DAT_00415071,DAT_0041857c);
    fputc((int)DAT_00415072,DAT_0041857c);
    fputc((int)DAT_00415073,DAT_0041857c);
    fputc((int)DAT_00415074,DAT_0041857c);
    fputc((int)DAT_00415075,DAT_0041857c);
    fputc((int)DAT_00415076,DAT_0041857c);
    fputc((int)DAT_00415077,DAT_0041857c);
    fputc((uint)(byte)((ushort)_DHTinfo >> 8),DAT_0041857c);
    fputc((int)_DHTinfo,DAT_0041857c);
    fputc((uint)(byte)((ushort)_DAT_004185d2 >> 8),DAT_0041857c);
    fputc((int)_DAT_004185d2,DAT_0041857c);
    fputc((int)DAT_004185d4,DAT_0041857c);
    do {
      uVar1 = *puVar6;
      puVar6 = puVar6 + 1;
      fputc((int)uVar1,DAT_0041857c);
    } while (puVar6 != &DAT_004185e5);
    puVar6 = &DAT_004185e5;
    do {
      uVar1 = *puVar6;
      puVar6 = puVar6 + 1;
      fputc((int)uVar1,DAT_0041857c);
    } while (puVar6 != &DAT_004185f1);
    puVar6 = &DAT_004185f2;
    fputc((int)DAT_004185f1,DAT_0041857c);
    do {
      uVar1 = *puVar6;
      puVar6 = puVar6 + 1;
      fputc((int)uVar1,DAT_0041857c);
    } while (puVar6 != &DAT_00418602);
    puVar6 = &DAT_00418602;
    do {
      uVar1 = *puVar6;
      puVar6 = puVar6 + 1;
      fputc((int)uVar1,DAT_0041857c);
    } while (puVar6 != &DAT_004186a4);
    puVar6 = &DAT_004186a5;
    fputc((int)DAT_004186a4,DAT_0041857c);
    do {
      uVar1 = *puVar6;
      puVar6 = puVar6 + 1;
      fputc((int)uVar1,DAT_0041857c);
    } while (puVar6 != &DAT_004186b5);
    puVar6 = &DAT_004186b5;
    do {
      uVar1 = *puVar6;
      puVar6 = puVar6 + 1;
      fputc((int)uVar1,DAT_0041857c);
    } while (puVar6 != &DAT_004186c1);
    puVar6 = &DAT_004186c2;
    fputc((int)DAT_004186c1,DAT_0041857c);
    do {
      uVar1 = *puVar6;
      puVar6 = puVar6 + 1;
      fputc((int)uVar1,DAT_0041857c);
    } while (puVar6 != &DAT_004186d2);
    puVar26 = (undefined2 *)&DAT_004186d2;
    do {
      uVar1 = *(undefined1 *)puVar26;
      puVar26 = (undefined2 *)((int)puVar26 + 1);
      fputc((int)uVar1,DAT_0041857c);
    } while (puVar26 != &DQTinfo);
    fputc((uint)(byte)((ushort)_DAT_00415078 >> 8),DAT_0041857c);
    fputc((int)_DAT_00415078,DAT_0041857c);
    fputc((uint)(byte)((ushort)_DAT_0041507a >> 8),DAT_0041857c);
    fputc((int)_DAT_0041507a,DAT_0041857c);
    fputc((int)DAT_0041507c,DAT_0041857c);
    fputc((int)DAT_0041507d,DAT_0041857c);
    fputc((int)DAT_0041507e,DAT_0041857c);
    fputc((int)DAT_0041507f,DAT_0041857c);
    fputc((int)DAT_00415080,DAT_0041857c);
    fputc((int)DAT_00415081,DAT_0041857c);
    fputc((int)DAT_00415082,DAT_0041857c);
    fputc((int)DAT_00415083,DAT_0041857c);
    fputc((int)DAT_00415084,DAT_0041857c);
    fputc((int)DAT_00415085,DAT_0041857c);
    DAT_004152f6 = '\a';
    DAT_00415540 = 0;
    local_78 = 0;
    local_76 = 0;
    local_74[0] = 0;
    for (uVar29 = 0; uVar23 = 0, uVar29 < DAT_004183ba; uVar29 = uVar29 + 8 & 0xffff) {
      for (; uVar23 < DAT_004183b8; uVar23 = uVar23 + 8 & 0xffff) {
        uVar17 = 0;
        iVar15 = uVar23 + uVar29 * DAT_0041506c;
        do {
          iVar11 = iVar15 * 3;
          cVar19 = '\0';
          uVar25 = uVar17;
          do {
            pbVar20 = (byte *)(DAT_004183b4 + iVar11);
            bVar10 = pbVar20[2];
            bVar2 = pbVar20[1];
            bVar3 = *pbVar20;
            iVar24 = (&DAT_004169b4)[bVar10];
            iVar18 = (&DAT_00416db4)[bVar2];
            iVar12 = (&DAT_004179b4)[bVar2];
            iVar22 = (&DAT_004175b4)[bVar10];
            iVar14 = (&DAT_00417db4)[bVar3];
            iVar8 = (&DAT_004171b4)[bVar3];
            cVar19 = cVar19 + '\x01';
            (&DAT_004183bc)[uVar25] =
                 (char)((uint)((&DAT_004161b4)[bVar2] + (&DAT_00415db4)[bVar10] +
                              (&DAT_004165b4)[bVar3]) >> 0x10) + -0x80;
            (&DAT_004183fc)[uVar25] = (char)((uint)(iVar18 + iVar24 + iVar8) >> 0x10);
            (&DAT_0041843c)[uVar25] = (char)((uint)(iVar12 + iVar22 + iVar14) >> 0x10);
            uVar25 = uVar25 + 1 & 0xff;
            iVar11 = iVar11 + 3;
          } while (cVar19 != '\b');
          uVar17 = uVar17 + 8 & 0xff;
          iVar15 = iVar15 + (uint)DAT_0041506c;
        } while (uVar17 != 0x40);
        FUN_004021c8(&DAT_004183bc,&DAT_004181b4,&local_78,&DAT_00415544,&DAT_004155a4);
        FUN_004021c8(&DAT_004183fc,&DAT_004182b4,&local_76,&DAT_00415574,&DAT_004159a4);
        FUN_004021c8(&DAT_0041843c,&DAT_004182b4,local_74,&DAT_00415574,&DAT_004159a4);
      }
    }
    uVar29 = (int)DAT_004152f6 + 1;
    if (-1 < DAT_004152f6) {
      local_70 = CONCAT22((short)(1 << (uVar29 & 0x1f)) + -1,(undefined2)local_70);
      local_70 = CONCAT31(local_70._1_3_,(char)uVar29);
      FUN_0040207c(local_70);
    }
    fputc(0xff,DAT_0041857c);
    fputc(0xd9,DAT_0041857c);
    free(DAT_00415da4);
    free(DAT_00415dac);
    fclose(DAT_0041857c);
    uVar27 = 0;
  }
  return uVar27;
}