unpack.cpp
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include <assert.h>
00025 #include "unpack.h"
00026 #include "debug.h"
00027 #include "ifd.h"
00028
00029 namespace OpenRaw { namespace Internals {
00030
00031 using namespace Debug;
00032
00033 Unpack::Unpack(uint32_t w, uint32_t t)
00034 : m_w(w), m_type(t)
00035 {
00036 }
00037
00038
00039 size_t Unpack::block_size()
00040 {
00041 size_t bs;
00042 if(m_type == IFD::COMPRESS_NIKON_PACK) {
00043 bs = (m_w / 2 * 3) + (m_w / 10);
00044 }
00045 else {
00046 bs = m_w / 2 * 3;
00047 }
00048 return bs;
00049 }
00050
00051
00056 size_t Unpack::unpack_be12to16(uint8_t *dest, const uint8_t *src,
00057 size_t size)
00058 {
00059 uint16_t *dest16 = reinterpret_cast<uint16_t *>(dest);
00060 size_t pad = (m_type == IFD::COMPRESS_NIKON_PACK) ? 1 : 0;
00061 size_t n = size / (15 + pad);
00062 size_t rest = size % (15 + pad);
00063 size_t ret = n * 20 + rest / 3 * 4;
00064
00065
00066
00067 if (pad) {
00068 assert (size % 16 == 0);
00069 }
00070 assert (rest % 3 == 0);
00071
00072 for (size_t i = 0; i < n + 1; i++) {
00073 size_t m = i == n ? rest / 3 : 5;
00074 for(size_t j = 0; j < m; j++) {
00075
00076 uint32_t t = *src++;
00077 t <<= 8;
00078 t |= *src++;
00079 t <<= 8;
00080 t |= *src++;
00081
00082
00083 *dest16 = (t & (0xfff << 12)) >> 12;
00084 dest16++;
00085
00086 *dest16 = t & 0xfff;
00087 dest16++;
00088 }
00089
00090 src += pad;
00091 }
00092
00093 return ret;
00094 }
00095
00096 } }