⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jpegdec.cpp

📁 audio-video-codecs.rar语音编解码器
💻 CPP
📖 第 1 页 / 共 5 页
字号:

  jerr = m_BitStreamIn.CheckByte(1,&b1);
  if(JPEG_OK != jerr)
    return jerr;

  jerr = m_BitStreamIn.CheckByte(2,&b2);
  if(JPEG_OK != jerr)
    return jerr;

  jerr = m_BitStreamIn.CheckByte(3,&b3);
  if(JPEG_OK != jerr)
    return jerr;

  jerr = m_BitStreamIn.CheckByte(4,&b4);
  if(JPEG_OK != jerr)
    return jerr;

  if(len >= APP0_JFIF_LENGTH &&
     b0 == 0x4a && // J
     b1 == 0x46 && // F
     b2 == 0x49 && // I
     b3 == 0x46 && // F
     b4 == 0)
  {
    // we've found JFIF APP0 marker
    len -= 5;

    jerr = m_BitStreamIn.Seek(5);
    if(JPEG_OK != jerr)
      return jerr;

    m_jfif_app0_detected = 1;

    jerr = m_BitStreamIn.ReadByte(&m_jfif_app0_major);
    if(JPEG_OK != jerr)
      return jerr;

    jerr = m_BitStreamIn.ReadByte(&m_jfif_app0_minor);
    if(JPEG_OK != jerr)
      return jerr;

    jerr = m_BitStreamIn.ReadByte(&m_jfif_app0_units);
    if(JPEG_OK != jerr)
      return jerr;

    jerr = m_BitStreamIn.ReadWord(&m_jfif_app0_xDensity);
    if(JPEG_OK != jerr)
      return jerr;

    jerr = m_BitStreamIn.ReadWord(&m_jfif_app0_yDensity);
    if(JPEG_OK != jerr)
      return jerr;

    jerr = m_BitStreamIn.ReadByte(&m_jfif_app0_thumb_width);
    if(JPEG_OK != jerr)
      return jerr;

    jerr = m_BitStreamIn.ReadByte(&m_jfif_app0_thumb_height);
    if(JPEG_OK != jerr)
      return jerr;

    len -= 9;
  }

  jerr = m_BitStreamIn.CheckByte(0,&b0);
  if(JPEG_OK != jerr)
    return jerr;

  jerr = m_BitStreamIn.CheckByte(1,&b1);
  if(JPEG_OK != jerr)
    return jerr;

  jerr = m_BitStreamIn.CheckByte(2,&b2);
  if(JPEG_OK != jerr)
    return jerr;

  jerr = m_BitStreamIn.CheckByte(3,&b3);
  if(JPEG_OK != jerr)
    return jerr;

  jerr = m_BitStreamIn.CheckByte(4,&b4);
  if(JPEG_OK != jerr)
    return jerr;

  if(len >= APP0_JFXX_LENGTH &&
     b0 == 0x4a && // J
     b1 == 0x46 && // F
     b2 == 0x58 && // X
     b3 == 0x58 && // X
     b4 == 0)
  {
    // we've found JFXX APP0 extension marker
    len -= 5;

    jerr = m_BitStreamIn.Seek(5);
    if(JPEG_OK != jerr)
      return jerr;

    m_jfxx_app0_detected = 1;

    jerr = m_BitStreamIn.ReadByte(&m_jfxx_thumbnails_type);
    if(JPEG_OK != jerr)
      return jerr;

    switch(m_jfxx_thumbnails_type)
    {
    case 0x10: break;
    case 0x11: break;
    case 0x13: break;
    default:   break;
    }
    len -= 1;
  }

  jerr = m_BitStreamIn.CheckByte(0,&b0);
  if(JPEG_OK != jerr)
    return jerr;

  jerr = m_BitStreamIn.CheckByte(1,&b1);
  if(JPEG_OK != jerr)
    return jerr;

  jerr = m_BitStreamIn.CheckByte(2,&b2);
  if(JPEG_OK != jerr)
    return jerr;

  jerr = m_BitStreamIn.CheckByte(3,&b3);
  if(JPEG_OK != jerr)
    return jerr;

  if(len >= APP0_AVI1_LENGTH &&
     b0 == 0x41 && // A
     b1 == 0x56 && // V
     b2 == 0x49 && // I
     b3 == 0x31)   // 1
  {
    // we've found AVI1 APP0 marker
    len -= 4;

    jerr = m_BitStreamIn.Seek(4);
    if(JPEG_OK != jerr)
      return jerr;

    m_avi1_app0_detected = 1;

    jerr = m_BitStreamIn.ReadByte(&m_avi1_app0_polarity);
    if(JPEG_OK != jerr)
      return jerr;

    len -= 1;

    if(len == 7) // old MJPEG AVI
      len -= 7;

    if(len == 9) // ODML MJPEG AVI
    {
      jerr = m_BitStreamIn.ReadByte(&m_avi1_app0_reserved);
      if(JPEG_OK != jerr)
        return jerr;

      jerr = m_BitStreamIn.ReadDword(&m_avi1_app0_field_size);
      if(JPEG_OK != jerr)
        return jerr;

      jerr = m_BitStreamIn.ReadDword(&m_avi1_app0_field_size2);
      if(JPEG_OK != jerr)
        return jerr;

      len -= 9;
    }
  }

  jerr = m_BitStreamIn.Seek(len);
  if(JPEG_OK != jerr)
    return jerr;

  m_marker = JM_NONE;

  return JPEG_OK;
} // CJPEGDecoder::ParseAPP0()


JERRCODE CJPEGDecoder::ParseAPP1(void)
{
  int i;
  int b0, b1, b2, b3, b4;
  int len;
  JERRCODE jerr;

  TRC0("-> APP0");

  jerr = m_BitStreamIn.ReadWord(&len);
  if(JPEG_OK != jerr)
    return jerr;

  len -= 2;

  jerr = m_BitStreamIn.CheckByte(0,&b0);
  if(JPEG_OK != jerr)
    return jerr;

  jerr = m_BitStreamIn.CheckByte(1,&b1);
  if(JPEG_OK != jerr)
    return jerr;

  jerr = m_BitStreamIn.CheckByte(2,&b2);
  if(JPEG_OK != jerr)
    return jerr;

  jerr = m_BitStreamIn.CheckByte(3,&b3);
  if(JPEG_OK != jerr)
    return jerr;

  jerr = m_BitStreamIn.CheckByte(4,&b4);
  if(JPEG_OK != jerr)
    return jerr;

  if(b0 == 0x45 && // E
     b1 == 0x78 && // x
     b2 == 0x69 && // i
     b3 == 0x66 && // f
     b4 == 0)
  {
    m_exif_app1_detected  = 1;
    m_exif_app1_data_size = len;

    jerr = m_BitStreamIn.Seek(6);
    if(JPEG_OK != jerr)
      return jerr;

    len -= 6;

    if(m_exif_app1_data != 0)
    {
      ippFree(m_exif_app1_data);
      m_exif_app1_data = 0;
    }

    m_exif_app1_data = (Ipp8u*)ippMalloc(len);
    if(0 == m_exif_app1_data)
      return JPEG_ERR_ALLOC;

    for(i = 0; i < len; i++)
    {
      jerr = m_BitStreamIn.ReadByte(&b0);
      if(JPEG_OK != jerr)
        return jerr;

      m_exif_app1_data[i] = (Ipp8u)b0;
    }
  }
  else
  {
    jerr = m_BitStreamIn.Seek(len);
    if(JPEG_OK != jerr)
      return jerr;
  }

  m_marker = JM_NONE;

  return JPEG_OK;
} // CJPEGDecoder::ParseAPP1()


const int APP14_ADOBE_LENGTH = 12;

JERRCODE CJPEGDecoder::ParseAPP14(void)
{
  int b0, b1, b2, b3, b4;
  int len;
  JERRCODE jerr;

  TRC0("-> APP14");

  jerr = m_BitStreamIn.ReadWord(&len);
  if(JPEG_OK != jerr)
    return jerr;

  len -= 2;

  jerr = m_BitStreamIn.CheckByte(0,&b0);
  if(JPEG_OK != jerr)
    return jerr;

  jerr = m_BitStreamIn.CheckByte(1,&b1);
  if(JPEG_OK != jerr)
    return jerr;

  jerr = m_BitStreamIn.CheckByte(2,&b2);
  if(JPEG_OK != jerr)
    return jerr;

  jerr = m_BitStreamIn.CheckByte(3,&b3);
  if(JPEG_OK != jerr)
    return jerr;

  jerr = m_BitStreamIn.CheckByte(4,&b4);
  if(JPEG_OK != jerr)
    return jerr;

  if(len >= APP14_ADOBE_LENGTH &&
     b0 == 0x41 && // A
     b1 == 0x64 && // d
     b2 == 0x6f && // o
     b3 == 0x62 && // b
     b4 == 0x65)   // e
  {
    // we've found Adobe APP14 marker
    len -= 5;

    jerr = m_BitStreamIn.Seek(5);
    if(JPEG_OK != jerr)
      return jerr;

    m_adobe_app14_detected = 1;

    jerr = m_BitStreamIn.ReadWord(&m_adobe_app14_version);
    if(JPEG_OK != jerr)
      return jerr;

    jerr = m_BitStreamIn.ReadWord(&m_adobe_app14_flags0);
    if(JPEG_OK != jerr)
      return jerr;

    jerr = m_BitStreamIn.ReadWord(&m_adobe_app14_flags1);
    if(JPEG_OK != jerr)
      return jerr;

    jerr = m_BitStreamIn.ReadByte(&m_adobe_app14_transform);
    if(JPEG_OK != jerr)
      return jerr;

    TRC1("  adobe_app14_version   - ",m_adobe_app14_version);
    TRC1("  adobe_app14_flags0    - ",m_adobe_app14_flags0);
    TRC1("  adobe_app14_flags1    - ",m_adobe_app14_flags1);
    TRC1("  adobe_app14_transform - ",m_adobe_app14_transform);

    len -= 7;
  }

  jerr = m_BitStreamIn.Seek(len);
  if(JPEG_OK != jerr)
    return jerr;

  m_marker = JM_NONE;

  return JPEG_OK;
} // CJPEGDecoder::ParseAPP14()


JERRCODE CJPEGDecoder::ParseCOM(void)
{
  int i;
  int c;
  int len;
  JERRCODE jerr;

  TRC0("-> COM");

  jerr = m_BitStreamIn.ReadWord(&len);
  if(JPEG_OK != jerr)
    return jerr;

  len -= 2;

  TRC1("  bytes for comment - ",len);

  m_jpeg_comment_detected = 1;
  m_jpeg_comment_size     = len;

  if(m_jpeg_comment != 0)
  {
    ippFree(m_jpeg_comment);
  }

  m_jpeg_comment = (Ipp8u*)ippMalloc(len+1);
  if(0 == m_jpeg_comment)
    return JPEG_ERR_ALLOC;

  for(i = 0; i < len; i++)
  {
    jerr = m_BitStreamIn.ReadByte(&c);
    if(JPEG_OK != jerr)
      return jerr;
    m_jpeg_comment[i] = (Ipp8u)c;
  }

  m_jpeg_comment[len] = 0;

  m_marker = JM_NONE;

  return JPEG_OK;
} // CJPEGDecoder::ParseCOM()


JERRCODE CJPEGDecoder::ParseDQT(void)
{
  int i;
  int id;
  int len;
  JERRCODE jerr;

  TRC0("-> DQT");

  jerr = m_BitStreamIn.ReadWord(&len);
  if(JPEG_OK != jerr)
    return jerr;

  len -= 2;

  while(len > 0)
  {
    jerr = m_BitStreamIn.ReadByte(&id);
    if(JPEG_OK != jerr)
      return jerr;

    int precision = (id & 0xf0) >> 4;

    TRC1("  id        - ",(id & 0x0f));
    TRC1("  precision - ",precision);

    if((id & 0x0f) > MAX_QUANT_TABLES)
    {
      return JPEG_ERR_DQT_DATA;
    }

    int q;
    Ipp8u qnt[DCTSIZE2*sizeof(Ipp16s)];
    Ipp8u*  pq8  = (Ipp8u*) qnt;
    Ipp16u* pq16 = (Ipp16u*)qnt;

    for(i = 0; i < DCTSIZE2; i++)
    {
      if(precision)
      {
        jerr = m_BitStreamIn.ReadWord(&q);
        pq16[i] = (Ipp16u)q;
      }
      else
      {
        jerr = m_BitStreamIn.ReadByte(&q);
        pq8[i]  = (Ipp8u)q;
      }

      if(JPEG_OK != jerr)
        return jerr;
    }

    if(precision == 1)
      jerr = m_qntbl[id & 0x0f].Init(id,pq16);
    else
      jerr = m_qntbl[id & 0x0f].Init(id,pq8);
    if(JPEG_OK != jerr)
    {
      return jerr;
    }

    len -= DCTSIZE2 + DCTSIZE2*precision + 1;
  }

  if(len != 0)
  {
    return JPEG_ERR_DQT_DATA;
  }

  m_marker = JM_NONE;

  return JPEG_OK;
} // CJPEGDecoder::ParseDQT()


JERRCODE CJPEGDecoder::ParseDHT(void)
{
  int i;
  int len;
  int index;
  int count;
  JERRCODE jerr;

  TRC0("-> DHT");

  jerr = m_BitStreamIn.ReadWord(&len);
  if(JPEG_OK != jerr)
    return jerr;

  len -= 2;

  int v;
  Ipp8u bits[MAX_HUFF_BITS];
  Ipp8u vals[MAX_HUFF_VALS];

  while(len > 16)
  {
    jerr = m_BitStreamIn.ReadByte(&index);
    if(JPEG_OK != jerr)
      return jerr;

    count = 0;
    for(i = 0; i < MAX_HUFF_BITS; i++)
    {
      jerr = m_BitStreamIn.ReadByte(&v);
      if(JPEG_OK != jerr)
        return jerr;

      bits[i] = (Ipp8u)v;
      count += bits[i];
    }

    len -= 16 + 1;

    if(count > MAX_HUFF_VALS || count > len)
    {
      return JPEG_ERR_DHT_DATA;
    }

    for(i = 0; i < count; i++)
    {
      jerr = m_BitStreamIn.ReadByte(&v);
      if(JPEG_OK != jerr)
        return jerr;

      vals[i] = (Ipp8u)v;
    }

    len -= count;

    if(index >> 4)
    {
      // make AC Huffman table
      if(m_actbl[index & 0x0f].IsEmpty())
      {
        jerr = m_actbl[index & 0x0f].Create();
        if(JPEG_OK != jerr)
        {
          LOG0("    Can't create AC huffman table");
          return jerr;
        }
      }

      TRC1("    AC Huffman Table - ",index & 0x0f);
      jerr = m_actbl[index & 0x0f].Init(index & 0x0f,index >> 4,bits,vals);
      if(JPEG_OK != jerr)
      {
        LOG0("    Can't build AC huffman table");
        return jerr;
      }
    }
    else
    {
      // make DC Huffman table
      if(m_dctbl[index & 0x0f].IsEmpty())
      {
        jerr = m_dctbl[index & 0x0f].Create();
        if(JPEG_OK != jerr)
        {
          LOG0("    Can't create DC huffman table");
          return jerr;
        }
      }

      TRC1("    DC Huffman Table - ",index & 0x0f);
      jerr = m_dctbl[index & 0x0f].Init(index & 0x0f,index >> 4,bits,vals);
      if(JPEG_OK != jerr)
      {
        LOG0("    Can't build DC huffman table");
        return jerr;
      }
    }
  }

  if(len != 0)
  {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -