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

📄 jpegenc.cpp

📁 audio-video-codecs.rar语音编解码器
💻 CPP
📖 第 1 页 / 共 5 页
字号:
      if(JPEG_OK != jerr)
        return jerr;

      // optimal huff table for each JPEG color component
      jerr = AttachHuffmanTable(c, DC, c);
      if(JPEG_OK != jerr)
        return jerr;
    }
  }
  return JPEG_OK;
} // CJPEGEncoder::SetParams()


JERRCODE CJPEGEncoder::InitHuffmanTable(
  Ipp8u      bits[16],
  Ipp8u      vals[256],
  int        tbl_id,
  HTBL_CLASS tbl_class)
{
  JERRCODE jerr;

  if(MAX_HUFF_TABLES < tbl_id)
    return JPEG_ERR_PARAMS;

  switch(tbl_class)
  {
  case DC:
    jerr = m_dctbl[tbl_id].Init(tbl_id,tbl_class,bits,vals);
    break;

  case AC:
    jerr = m_actbl[tbl_id].Init(tbl_id,tbl_class,bits,vals);
    break;

  default:
    return JPEG_ERR_PARAMS;
  }

  return jerr;
} // CJPEGEncoder::InitHuffmanTable()


JERRCODE CJPEGEncoder::InitQuantTable(
  Ipp8u qnt[64],
  int   tbl_id,
  int   quality)
{
  if(MAX_QUANT_TABLES < tbl_id)
    return JPEG_ERR_PARAMS;

  return m_qntbl[tbl_id].Init(tbl_id,qnt,quality);
} // CJPEGEncoder::InitQuantTable()


JERRCODE CJPEGEncoder::InitQuantTable(
  Ipp16u qnt[64],
  int    tbl_id,
  int    quality)
{
  if(MAX_QUANT_TABLES < tbl_id)
    return JPEG_ERR_PARAMS;

  return m_qntbl[tbl_id].Init(tbl_id,qnt,quality);
} // CJPEGEncoder::InitQuantTable()


JERRCODE CJPEGEncoder::AttachHuffmanTable(int tbl_id, HTBL_CLASS tbl_class, int comp_no)
{
  if(MAX_HUFF_TABLES < tbl_id)
    return JPEG_ERR_PARAMS;

  if(comp_no > m_jpeg_ncomp)
    return JPEG_ERR_PARAMS;

  switch(tbl_class)
  {
  case DC:
    m_ccomp[comp_no].m_dc_selector = tbl_id;
    break;

  case AC:
    m_ccomp[comp_no].m_ac_selector = tbl_id;
    break;

  default:
    return JPEG_ERR_PARAMS;
  }

  return JPEG_OK;
} // CJPEGEncoder::AttachHuffmanTable()


JERRCODE CJPEGEncoder::AttachQuantTable(int tbl_id, int comp_no)
{
  if(MAX_QUANT_TABLES < tbl_id)
    return JPEG_ERR_PARAMS;

  if(comp_no > m_jpeg_ncomp)
    return JPEG_ERR_PARAMS;

  m_ccomp[comp_no].m_q_selector = tbl_id;

  return JPEG_OK;
} // CJPEGEncoder::AttachQuantTable()


JERRCODE CJPEGEncoder::WriteSOI(void)
{
  JERRCODE jerr;

  TRC0("-> WriteSOI");

  TRC1("  emit marker ",JM_SOI);

  jerr = m_BitStreamOut.WriteWord(0xff00 | JM_SOI);
  if(JPEG_OK != jerr)
    return jerr;

  return JPEG_OK;
} // CJPEGEncoder::WriteSOI()


JERRCODE CJPEGEncoder::WriteEOI(void)
{
  JERRCODE jerr;

  TRC0("-> WriteEOI");

  TRC1("emit marker ",JM_EOI);

  jerr = m_BitStreamOut.WriteWord(0xff00 | JM_EOI);
  if(JPEG_OK != jerr)
    return jerr;

  return JPEG_OK;
} // CJPEGEncoder::WriteEOI()


JERRCODE CJPEGEncoder::WriteAPP0(void)
{
  int len;
  JERRCODE jerr;

  TRC0("-> WriteAPP0");

  len = 2 + 5 + 2 + 1 + 2 + 2 + 1 + 1;

  TRC1("  emit marker ",JM_APP0);
  TRC1("    length ",len);

  jerr = m_BitStreamOut.WriteWord(0xff00 | JM_APP0);
  if(JPEG_OK != jerr)
    return jerr;

  jerr = m_BitStreamOut.WriteWord(len);
  if(JPEG_OK != jerr)
    return jerr;

  // identificator JFIF
  jerr = m_BitStreamOut.WriteByte('J');
  if(JPEG_OK != jerr)
    return jerr;

  jerr = m_BitStreamOut.WriteByte('F');
  if(JPEG_OK != jerr)
    return jerr;

  jerr = m_BitStreamOut.WriteByte('I');
  if(JPEG_OK != jerr)
    return jerr;

  jerr = m_BitStreamOut.WriteByte('F');
  if(JPEG_OK != jerr)
    return jerr;

  jerr = m_BitStreamOut.WriteByte(0);
  if(JPEG_OK != jerr)
    return jerr;

  // version
  jerr = m_BitStreamOut.WriteWord(0x0102);
  if(JPEG_OK != jerr)
    return jerr;

  // units: 0 - none, 1 - dot per inch, 2 - dot per cm
  jerr = m_BitStreamOut.WriteByte(0);
  if(JPEG_OK != jerr)
    return jerr;

  // xDensity
  jerr = m_BitStreamOut.WriteWord(1);
  if(JPEG_OK != jerr)
    return jerr;

  // yDensity
  jerr = m_BitStreamOut.WriteWord(1);
  if(JPEG_OK != jerr)
    return jerr;

  // xThumbnails, yThumbnails
  jerr = m_BitStreamOut.WriteByte(0);
  if(JPEG_OK != jerr)
    return jerr;

  jerr = m_BitStreamOut.WriteByte(0);
  if(JPEG_OK != jerr)
    return jerr;

  return JPEG_OK;
} // CJPEGEncoder::WriteAPP0()


JERRCODE CJPEGEncoder::WriteAPP14(void)
{
  int len;
  JERRCODE jerr;

  TRC0("-> WriteAPP14");

  len = 2 + 5 + 2 + 2 + 2 + 1;

  TRC1("  emit marker ",JM_APP14);
  TRC1("    length ",len);

  jerr = m_BitStreamOut.WriteWord(0xff00 | JM_APP14);
  if(JPEG_OK != jerr)
    return jerr;

  jerr = m_BitStreamOut.WriteWord(len);
  if(JPEG_OK != jerr)
    return jerr;

  // identificator Adobe
  jerr = m_BitStreamOut.WriteByte('A');
  if(JPEG_OK != jerr)
    return jerr;

  jerr = m_BitStreamOut.WriteByte('d');
  if(JPEG_OK != jerr)
    return jerr;

  jerr = m_BitStreamOut.WriteByte('o');
  if(JPEG_OK != jerr)
    return jerr;

  jerr = m_BitStreamOut.WriteByte('b');
  if(JPEG_OK != jerr)
    return jerr;

  jerr = m_BitStreamOut.WriteByte('e');
  if(JPEG_OK != jerr)
    return jerr;

  // version
  jerr = m_BitStreamOut.WriteWord(100);
  if(JPEG_OK != jerr)
    return jerr;

  // Flags 0
  jerr = m_BitStreamOut.WriteWord(0);
  if(JPEG_OK != jerr)
    return jerr;

  // Flags 1
  jerr = m_BitStreamOut.WriteWord(0);
  if(JPEG_OK != jerr)
    return jerr;

  switch(m_jpeg_color)
  {
  case JC_YCBCR:
    jerr = m_BitStreamOut.WriteByte(1);
    break;

  case JC_YCCK:
    jerr = m_BitStreamOut.WriteByte(2);
    break;

  default:
    jerr = m_BitStreamOut.WriteByte(0);
    break;
  }

  if(JPEG_OK != jerr)
    return jerr;

  return JPEG_OK;
} // CJPEGEncoder::WriteAPP14()


JERRCODE CJPEGEncoder::WriteCOM(
  char*  comment)
{
  int   i;
  int   len;
  char* ptr;
  char  buf[128];
  JERRCODE jerr;

  TRC0("-> WriteCOM");

  if(comment != 0)
  {
    len = (int)strlen(comment) + 1;
    ptr = comment;
  }
  else
  {
    buf[0] = 0;
    ptr = &buf[0];
    const IppLibraryVersion* jv = ippjGetLibVersion();
    sprintf(ptr,"Intel(R) IPP JPEG encoder [%d.%d.%d] - %s",
      jv->major,
      jv->minor,
      jv->build,
      jv->BuildDate);

    len = (int)strlen(ptr) + 1;
  }

  len += 2;

  TRC1("  emit marker ",JM_COM);
  TRC1("    length ",len);

  jerr = m_BitStreamOut.WriteWord(0xff00 | JM_COM);
  if(JPEG_OK != jerr)
    return jerr;

  jerr = m_BitStreamOut.WriteWord(len);
  if(JPEG_OK != jerr)
    return jerr;

  for(i = 0; i < len - 2; i++)
  {
    jerr = m_BitStreamOut.WriteByte(ptr[i]);
    if(JPEG_OK != jerr)
      return jerr;
  }

  return JPEG_OK;
} // CJPEGEncoder::WriteCOM()


JERRCODE CJPEGEncoder::WriteDQT(
  CJPEGEncoderQuantTable* qtbl)
{
  int i;
  int len;
  JERRCODE jerr;

  TRC0("-> WriteDQT");

  len = DCTSIZE2 + 2 + 1;

  if(qtbl->m_precision)
    len += DCTSIZE2;

  TRC1("  emit marker ",JM_DQT);
  TRC1("    length ",len);

  jerr = m_BitStreamOut.WriteWord(0xff00 | JM_DQT);
  if(JPEG_OK != jerr)
    return jerr;

  jerr = m_BitStreamOut.WriteWord(len);
  if(JPEG_OK != jerr)
    return jerr;

  // precision/id
  jerr = m_BitStreamOut.WriteByte((qtbl->m_precision << 4) | qtbl->m_id);
  if(JPEG_OK != jerr)
    return jerr;

  TRC1("  id ",qtbl->m_id);
  TRC1("  precision ",qtbl->m_precision);

  TRC(endl);
  for(i = 0; i < DCTSIZE2; i++)
  {
    TRC(" ");
    TRC((int)qtbl->m_raw[i]);
    if(i % 8 == 7)
    {
      TRC(endl);
    }
  }
  TRC(endl);

  for(i = 0; i < DCTSIZE2; i++)
  {
    if(qtbl->m_precision == 0)
    {
      jerr = m_BitStreamOut.WriteByte(qtbl->m_raw8u[i]);
    }
    else
    {
      jerr = m_BitStreamOut.WriteWord(qtbl->m_raw16u[i]);
    }
    if(JPEG_OK != jerr)
      return jerr;
  }

  return JPEG_OK;
} // CJPEGEncoder::WriteDQT()


JERRCODE CJPEGEncoder::WriteDHT(
  CJPEGEncoderHuffmanTable* htbl)
{
  int i;
  int len;
  int htbl_len;
  JERRCODE jerr;

  TRC0("-> WriteDHT");

  for(htbl_len = 0, i = 0; i < 16; i++)
  {
    htbl_len += htbl->m_bits[i];
  }

  len = 16 + htbl_len + 2 + 1;

  TRC1("  emit marker ",JM_DHT);
  TRC1("    length ",len);

  jerr = m_BitStreamOut.WriteWord(0xff00 | JM_DHT);
  if(JPEG_OK != jerr)
    return jerr;

  jerr = m_BitStreamOut.WriteWord(len);
  if(JPEG_OK != jerr)
    return jerr;

  jerr = m_BitStreamOut.WriteByte((htbl->m_hclass << 4) | htbl->m_id);
  if(JPEG_OK != jerr)
    return jerr;

  TRC1("  id ",htbl->m_id);
  TRC1("  class ",htbl->m_hclass);

  for(i = 0; i < 16; i++)
  {
    jerr = m_BitStreamOut.WriteByte(htbl->m_bits[i]);
    if(JPEG_OK != jerr)
      return jerr;
  }

  for(i = 0; i < htbl_len; i++)
  {
    jerr = m_BitStreamOut.WriteByte(htbl->m_vals[i]);
    if(JPEG_OK != jerr)
      return jerr;
  }

  return JPEG_OK;
} // CJPEGEncoder::WriteDHT()


JERRCODE CJPEGEncoder::WriteSOF0(void)
{
  int len;
  JERRCODE jerr;

  TRC0("-> WriteSOF0");

  len = 8 + m_jpeg_ncomp * 3;

  TRC1("  emit marker ",JM_SOF0);
  TRC1("    length ",len);

  jerr = m_BitStreamOut.WriteWord(0xff00 | JM_SOF0);
  if(JPEG_OK != jerr)
    return jerr;

  jerr = m_BitStreamOut.WriteWord(len);
  if(JPEG_OK != jerr)
    return jerr;

  // sample precision
  jerr = m_BitStreamOut.WriteByte(8);
  if(JPEG_OK != jerr)
    return jerr;

  jerr = m_BitStreamOut.WriteWord(m_src.height);
  if(JPEG_OK != jerr)
    return jerr;

  jerr = m_BitStreamOut.WriteWord(m_src.width);
  if(JPEG_OK != jerr)
    return jerr;

  jerr = m_BitStreamOut.WriteByte(m_jpeg_ncomp);
  if(JPEG_OK != jerr)
    return jerr;

  for(int i = 0; i < m_jpeg_ncomp; i++)
  {
    jerr = m_BitStreamOut.WriteByte(i);
    if(JPEG_OK != jerr)
      return jerr;

    jerr = m_BitStreamOut.WriteByte((m_ccomp[i].m_hsampling << 4) | m_ccomp[i].m_vsampling);
    if(JPEG_OK != jerr)
      return jerr;

    jerr = m_BitStreamOut.WriteByte(m_ccomp[i].m_q_selector);
    if(JPEG_OK != jerr)
      return jerr;
  }

  return JPEG_OK;
} // CJPEGEncoder::WriteSOF0()


JERRCODE CJPEGEncoder::WriteSOF1(void)
{
  int len;
  JERRCODE jerr;

  TRC0("-> WriteSOF1");

  len = 8 + m_jpeg_ncomp * 3;

  TRC1("  emit marker ",JM_SOF1);
  TRC1("    length ",sof1_len);

  jerr = m_BitStreamOut.WriteWord(0xff00 | JM_SOF1);
  if(JPEG_OK != jerr)
    return jerr;

  jerr = m_BitStreamOut.WriteWord(len);
  if(JPEG_OK != jerr)
    return jerr;

  // sample precision
  jerr = m_BitStreamOut.WriteByte(m_jpeg_precision);
  if(JPEG_OK != jerr)
    return jerr;

  jerr = m_BitStreamOut.WriteWord(m_src.height);
  if(JPEG_OK != jerr)
    return jerr;

⌨️ 快捷键说明

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