Blame lib/unpack.cpp

rpm-build d2b433
/*
rpm-build d2b433
 * libopenraw - unpack.cpp
rpm-build d2b433
 *
rpm-build d2b433
 * Copyright (C) 2008-2016 Hubert Figuiere
rpm-build d2b433
 * Copyright (C) 2008 Novell, Inc.
rpm-build d2b433
 *
rpm-build d2b433
 * This library is free software: you can redistribute it and/or
rpm-build d2b433
 * modify it under the terms of the GNU Lesser General Public License
rpm-build d2b433
 * as published by the Free Software Foundation, either version 3 of
rpm-build d2b433
 * the License, or (at your option) any later version.
rpm-build d2b433
 *
rpm-build d2b433
 * This library is distributed in the hope that it will be useful,
rpm-build d2b433
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
rpm-build d2b433
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
rpm-build d2b433
 * Lesser General Public License for more details.
rpm-build d2b433
 *
rpm-build d2b433
 * You should have received a copy of the GNU Lesser General Public
rpm-build d2b433
 * License along with this library.  If not, see
rpm-build d2b433
 * <http://www.gnu.org/licenses/>.
rpm-build d2b433
 */
rpm-build d2b433
rpm-build d2b433
#include <assert.h>
rpm-build d2b433
rpm-build d2b433
#include <libopenraw/consts.h>
rpm-build d2b433
rpm-build d2b433
#include "unpack.hpp"
rpm-build d2b433
#include "trace.hpp"
rpm-build d2b433
#include "ifd.hpp"
rpm-build d2b433
rpm-build d2b433
namespace OpenRaw {
rpm-build d2b433
namespace Internals {
rpm-build d2b433
rpm-build d2b433
using namespace Debug;
rpm-build d2b433
rpm-build d2b433
Unpack::Unpack(uint32_t w, uint32_t t)
rpm-build d2b433
  : m_w(w), m_type(t)
rpm-build d2b433
{
rpm-build d2b433
}
rpm-build d2b433
rpm-build d2b433
/* Return the size of an image row. */
rpm-build d2b433
size_t Unpack::block_size()
rpm-build d2b433
{
rpm-build d2b433
  size_t bs;
rpm-build d2b433
  if(m_type == IFD::COMPRESS_NIKON_PACK) {
rpm-build d2b433
    bs = (m_w / 2 * 3) + (m_w / 10);
rpm-build d2b433
  }
rpm-build d2b433
  else {
rpm-build d2b433
    bs = m_w / 2 * 3;
rpm-build d2b433
  }
rpm-build d2b433
  return bs;
rpm-build d2b433
}
rpm-build d2b433
rpm-build d2b433
rpm-build d2b433
/** source is in BE byte order
rpm-build d2b433
 * the output is always 16-bits values in native (host) byte order.
rpm-build d2b433
 * the source must correspond to an image row.
rpm-build d2b433
 */
rpm-build d2b433
or_error Unpack::unpack_be12to16(uint8_t *dest, size_t destsize, const uint8_t *src,
rpm-build d2b433
                                 size_t size, size_t & out)
rpm-build d2b433
{
rpm-build d2b433
  or_error err = OR_ERROR_NONE;
rpm-build d2b433
  uint16_t *dest16 = reinterpret_cast<uint16_t *>(dest);
rpm-build d2b433
  size_t pad = (m_type == IFD::COMPRESS_NIKON_PACK) ? 1 : 0;
rpm-build d2b433
  size_t n = size / (15 + pad);
rpm-build d2b433
  size_t rest = size % (15 + pad);
rpm-build d2b433
  size_t ret = n * 20 + rest / 3 * 4;
rpm-build d2b433
rpm-build d2b433
  out = 0;
rpm-build d2b433
rpm-build d2b433
  /* The inner loop advances 10 columns, which corresponds to 15 input
rpm-build d2b433
     bytes, 20 output bytes and, in a Nikon pack, one padding byte.*/
rpm-build d2b433
  if (pad) {
rpm-build d2b433
    if ((size % 16) != 0) {
rpm-build d2b433
      LOGERR("be12to16 incorrect padding.\n");
rpm-build d2b433
      return OR_ERROR_DECOMPRESSION;
rpm-build d2b433
    }
rpm-build d2b433
  }
rpm-build d2b433
  if ((rest % 3) != 0) {
rpm-build d2b433
    LOGERR("be12to16 incorrect rest.\n");
rpm-build d2b433
    return OR_ERROR_DECOMPRESSION;
rpm-build d2b433
  }
rpm-build d2b433
rpm-build d2b433
  for (size_t i = 0; i < n + 1; i++) {
rpm-build d2b433
    size_t m = (i == n) ? rest / 3 : 5;
rpm-build d2b433
    if((reinterpret_cast<uint8_t *>(dest16) - dest) + (m * 4) >  destsize) {
rpm-build d2b433
      err = OR_ERROR_DECOMPRESSION;
rpm-build d2b433
      LOGERR("overflow !\n");
rpm-build d2b433
      break;
rpm-build d2b433
    }
rpm-build d2b433
    for(size_t j = 0; j < m; j++) {
rpm-build d2b433
      /* Read 3 bytes */
rpm-build d2b433
      uint32_t t = *src++;
rpm-build d2b433
      t <<= 8;
rpm-build d2b433
      t |= *src++;
rpm-build d2b433
      t <<= 8;
rpm-build d2b433
      t |= *src++;
rpm-build d2b433
rpm-build d2b433
      /* Write two 16 bit values. */
rpm-build d2b433
      *dest16 = (t & (0xfff << 12)) >> 12;
rpm-build d2b433
      dest16++;
rpm-build d2b433
rpm-build d2b433
      *dest16 = t & 0xfff;
rpm-build d2b433
      dest16++;
rpm-build d2b433
    }
rpm-build d2b433
rpm-build d2b433
    src += pad;
rpm-build d2b433
  }
rpm-build d2b433
rpm-build d2b433
  out = ret;
rpm-build d2b433
  return err;
rpm-build d2b433
}
rpm-build d2b433
rpm-build d2b433
} }
rpm-build d2b433
/*
rpm-build d2b433
  Local Variables:
rpm-build d2b433
  mode:c++
rpm-build d2b433
  c-file-style:"stroustrup"
rpm-build d2b433
  c-file-offsets:((innamespace . 0))
rpm-build d2b433
  tab-width:2
rpm-build d2b433
  c-basic-offset:2
rpm-build d2b433
  indent-tabs-mode:nil
rpm-build d2b433
  fill-column:80
rpm-build d2b433
  End:
rpm-build d2b433
*/