+typedef std::pair<size_t, uint32_t> JpegPair; //offset, jpeg size
+typedef std::vector<JpegPair> JpegVector;
+
+void WriteDICOMItems(std::ostream *fp, JpegVector &v)
+{
+ // Item tag:
+ uint16_t group = 0xfffe;
+ uint16_t elem = 0xe000;
+ gdcm::binary_write(*fp, group);
+ gdcm::binary_write(*fp, elem);
+ // Item Length
+ uint32_t dummy = 0x12345678;
+ size_t offset = fp->tellp();
+ JpegPair jp;
+ jp.first = offset;
+ v.push_back(jp);
+ gdcm::binary_write(*fp, dummy);
+}
+
+// PS 3.5, page 66
+void EncodeWithoutBasicOffsetTable(std::ostream *fp, int numFrag)// JpegVector& v) //, uint32_t length)
+{
+ assert( numFrag == 1);
+
+ // Item tag:
+ uint16_t group = 0xfffe;
+ uint16_t elem = 0xe000;
+ gdcm::binary_write(*fp, group);
+ gdcm::binary_write(*fp, elem);
+ // Item Length
+ uint32_t item_length = 0x0000;
+ gdcm::binary_write(*fp, item_length);
+
+}
+
+// PS 3.5, page 67
+void EncodeWithBasicOffsetTable(std::ostream *fp, int numFrag, size_t &start)
+{
+ // Item tag:
+ uint16_t group = 0xfffe;
+ uint16_t elem = 0xe000;
+ gdcm::binary_write(*fp, group);
+ gdcm::binary_write(*fp, elem);
+ // Item Length
+ uint32_t item_length = numFrag*4; // sizeof(uint32_t)
+ gdcm::binary_write(*fp, item_length);
+
+ // Just prepare the space
+ start = fp->tellp(); //to be able to rewind
+ for(int i=0; i<numFrag;++i)
+ {
+ uint32_t dummy = 0x0000;
+ gdcm::binary_write(*fp, dummy);
+ }
+}
+
+void UpdateBasicOffsetTable(std::ostream *fp, JpegVector const &v, size_t pos)
+{
+ JpegVector::const_iterator i;
+ fp->seekp( pos );
+ const JpegPair &first = v[0];
+ for(i=v.begin(); i!=v.end(); ++i)
+ {
+ const JpegPair &jp = *i;
+ if(i == v.begin() ){ assert( jp.first - first.first == 0); }
+ gdcm::binary_write(*fp, jp.first - first.first);
+ std::cerr << "Updating Table:" << jp.first - first.first << std::endl;
+ }
+}
+
+void UpdateJpegFragmentSize(std::ostream *fp, JpegVector const &v)
+{
+ JpegVector::const_iterator i;
+ for(i= v.begin(); i!=v.end(); ++i)
+ {
+ const JpegPair &jp = *i;
+ fp->seekp( jp.first );
+ gdcm::binary_write(*fp, jp.second );
+ std::cerr << "Updating:" << jp.first << "," << jp.second << std::endl;
+ }
+}
+
+void CloseJpeg(std::ostream *fp, JpegVector &v)
+{
+ // sequence terminator
+ uint16_t group = 0xfffe;
+ uint16_t elem = 0xe000;
+ gdcm::binary_write(*fp, group);
+ gdcm::binary_write(*fp, elem);
+
+ uint32_t length = 0x0;
+ gdcm::binary_write(*fp, length);
+
+ // Jpeg is done, now update the frag length
+ UpdateJpegFragmentSize(fp, v);
+}
+
+bool InitializeJpeg(std::ostream *fp, int fragment_size, int image_width, int image_height,
+ int sample_pixel, int quality, struct jpeg_compress_struct &cinfo, int &row_stride)