[Rawstudio-commit] rawspeed r277 - RawSpeed
Klaus Post
klauspost at gmail.com
Thu Sep 23 19:37:58 CEST 2010
Author: post
Date: 2010-09-23 19:37:58 +0200 (Thu, 23 Sep 2010)
New Revision: 277
Added:
RawSpeed/BitPumpMSB32.cpp
RawSpeed/BitPumpMSB32.h
Modified:
RawSpeed/Common.h
RawSpeed/NefDecoder.cpp
RawSpeed/RawSpeed.vcproj
Log:
Finally got a break on Nikon Coolpix. (rawstudio makefile update pending)
Added: RawSpeed/BitPumpMSB32.cpp
===================================================================
--- RawSpeed/BitPumpMSB32.cpp (rev 0)
+++ RawSpeed/BitPumpMSB32.cpp 2010-09-23 17:37:58 UTC (rev 277)
@@ -0,0 +1,87 @@
+#include "StdAfx.h"
+#include "BitPumpMSB32.h"
+/*
+ RawSpeed - RAW file decoder.
+
+ Copyright (C) 2009 Klaus Post
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ http://www.klauspost.com
+*/
+
+namespace RawSpeed {
+
+/*** Used for entropy encoded sections, for now only Nikon Coolpix ***/
+
+
+BitPumpMSB32::BitPumpMSB32(ByteStream *s):
+ buffer(s->getData()), size(s->getRemainSize() + sizeof(uint32)), mLeft(0), mCurr(0), off(0) {
+ init();
+}
+
+BitPumpMSB32::BitPumpMSB32(const uchar8* _buffer, uint32 _size) :
+ buffer(_buffer), size(_size + sizeof(uint32)), mLeft(0), mCurr(0), off(0) {
+ init();
+}
+
+__inline void BitPumpMSB32::init() {
+ fill();
+}
+
+void BitPumpMSB32::fill()
+{
+ uint32 c, c2, c3, c4;
+
+ if (mLeft >= MIN_GET_BITS)
+ return;
+
+ c = buffer[off++];
+ c2 = buffer[off++];
+ c3 = buffer[off++];
+ c4 = buffer[off++];
+ mCurr <<= 32;
+ mCurr |= (c4 << 24) | (c3<<16) | (c2<<8) | c;
+ mLeft += 32;
+}
+
+uint32 BitPumpMSB32::getBitsSafe(unsigned int nbits) {
+ if (nbits > MIN_GET_BITS)
+ throw IOException("Too many bits requested");
+
+ if (mLeft < nbits) {
+ fill();
+ checkPos();
+ }
+
+ return (uint32)((mCurr >> (mLeft -= (nbits))) & ((1 << nbits) - 1));
+}
+
+
+void BitPumpMSB32::setAbsoluteOffset(unsigned int offset) {
+ if (offset >= size)
+ throw IOException("Offset set out of buffer");
+
+ mLeft = 0;
+ mCurr = 0;
+ off = offset;
+ fill();
+}
+
+BitPumpMSB32::~BitPumpMSB32(void) {
+}
+
+
+} // namespace RawSpeed
Added: RawSpeed/BitPumpMSB32.h
===================================================================
--- RawSpeed/BitPumpMSB32.h (rev 0)
+++ RawSpeed/BitPumpMSB32.h 2010-09-23 17:37:58 UTC (rev 277)
@@ -0,0 +1,76 @@
+/*
+ RawSpeed - RAW file decoder.
+
+ Copyright (C) 2009 Klaus Post
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ http://www.klauspost.com
+*/
+#pragma once
+#include "ByteStream.h"
+
+#ifdef MIN_GET_BITS
+#undef MIN_GET_BITS
+#endif
+
+#define BITS_PER_LONG_LONG (8*sizeof(uint64))
+#define MIN_GET_BITS (BITS_PER_LONG_LONG-33) /* max value for long getBuffer */
+
+namespace RawSpeed {
+
+// Note: Allocated buffer MUST be at least size+sizeof(uint32) large.
+
+class BitPumpMSB32
+{
+public:
+ BitPumpMSB32(ByteStream *s);
+ BitPumpMSB32(const uchar8* _buffer, uint32 _size );
+ uint32 getBitsSafe(uint32 nbits);
+ uint32 getBitSafe();
+ uchar8 getByteSafe();
+ void setAbsoluteOffset(uint32 offset); // Set offset in bytes
+ __inline uint32 getOffset() { return off-(mLeft>>3);}
+ __inline void checkPos() { if (off>size) throw IOException("Out of buffer read");}; // Check if we have a valid position
+
+ // Fill the buffer with at least 24 bits
+void fill();
+
+ __inline uint32 getBit() {
+ if (!mLeft) fill();
+
+ return (uint32)((mCurr >> (--mLeft)) & 1);
+ }
+
+ __inline uint32 getBits(uint32 nbits) {
+ if (mLeft < nbits) {
+ fill();
+ }
+
+ return (uint32)((mCurr >> (mLeft -= (nbits))) & ((1 << nbits) - 1));
+ }
+
+ virtual ~BitPumpMSB32(void);
+protected:
+ void __inline init();
+ const uchar8* buffer;
+ const uint32 size; // This if the end of buffer.
+ uint32 mLeft;
+ uint64 mCurr;
+ uint32 off; // Offset in bytes
+private:
+};
+
+} // namespace RawSpeed
Modified: RawSpeed/Common.h
===================================================================
--- RawSpeed/Common.h 2010-09-22 18:48:28 UTC (rev 276)
+++ RawSpeed/Common.h 2010-09-23 17:37:58 UTC (rev 277)
@@ -26,6 +26,7 @@
#pragma intrinsic(_ReturnAddress)
#define MIN(a,b) min(a,b)
#define MAX(a,b) max(a,b)
+typedef unsigned __int64 uint64;
#else // On linux
#define _ASSERTE(a) void(a)
#define _RPT0(a,b)
@@ -39,7 +40,8 @@
#define _aligned_free(a) do { free(a); } while (0)
#ifndef MIN
#define MIN(a, b) lmin(a,b)
-#endif
+typedef unsigned long long uint64;
+#endif // end On linux
#ifndef MAX
#define MAX(a, b) lmin(a,b)
#endif
Modified: RawSpeed/NefDecoder.cpp
===================================================================
--- RawSpeed/NefDecoder.cpp 2010-09-22 18:48:28 UTC (rev 276)
+++ RawSpeed/NefDecoder.cpp 2010-09-23 17:37:58 UTC (rev 277)
@@ -1,6 +1,7 @@
#include "StdAfx.h"
#include "NefDecoder.h"
#include "ByteStreamSwap.h"
+#include "BitpumpMSB32.h"
/*
RawSpeed - RAW file decoder.
@@ -228,50 +229,11 @@
uint32 y = offset.y;
h = MIN(h + (uint32)offset.y, (uint32)mRaw->dim.y);
w *= cpp;
- BitPumpMSB *in = new BitPumpMSB(&input);
+ BitPumpMSB32 *in = new BitPumpMSB32(&input);
for (; y < h; y++) {
ushort16* dest = (ushort16*) & data[offset.x*sizeof(ushort16)*cpp+y*outPitch];
- int val;
- int val2;
for (uint32 x = 0 ; x < w; x++) {
- switch (x&7) {
- case 0:
- val = in->getBits(12);
- break;
- case 2:
- case 5:
- val2 = in->getBits(12);
- val = dest[x-2]; // Swap this and pixel two to the left
- dest[x-2] = val2;
- break;
- case 1:
- val = in->getBits(12);
- val = ((val&0xf)<<8) | (((val>>4)&0xf)<<4) | (((val>>8)&0xf));
- break;
- case 3:
- val = in->getBits(4) << 8;
- val2 = in->getBits(8) << 4;
- val |= in->getBits(8);
- val2 |= in->getBits(4);
- dest[x] = val;
- x++;
- val= val2;
- break;
- case 6:
- val = in->getBits(4);
- val2 = in->getBits(4) << 8;
- val |= in->getBits(8) << 4;
- val2 |= in->getBits(4) <<4;
- val2 |= in->getBits(4);
- dest[x] = val;
- x++;
- val = val2;
- break;
- default:
- val = 4096;
- in->skipBits(12);
- }
- dest[x] = val;
+ dest[x] = in->getBits(12);
}
}
}
Modified: RawSpeed/RawSpeed.vcproj
===================================================================
--- RawSpeed/RawSpeed.vcproj 2010-09-22 18:48:28 UTC (rev 276)
+++ RawSpeed/RawSpeed.vcproj 2010-09-23 17:37:58 UTC (rev 277)
@@ -289,6 +289,10 @@
>
</File>
<File
+ RelativePath=".\BitPumpMSB32.cpp"
+ >
+ </File>
+ <File
RelativePath=".\BitPumpPlain.cpp"
>
</File>
@@ -411,6 +415,10 @@
>
</File>
<File
+ RelativePath=".\BitPumpMSB32.h"
+ >
+ </File>
+ <File
RelativePath=".\BitPumpPlain.h"
>
</File>
More information about the Rawstudio-commit
mailing list