Skip to content

Commit 741a059

Browse files
author
Aaron Boxer
committed
PLT: move to separate class
1 parent 7b8c16c commit 741a059

File tree

5 files changed

+11
-273
lines changed

5 files changed

+11
-273
lines changed

src/lib/jp2/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,8 @@ set(GROK_LIBRARY_SRCS
136136
${CMAKE_CURRENT_SOURCE_DIR}/cache/MemManager.h
137137
${CMAKE_CURRENT_SOURCE_DIR}/cache/LengthCache.h
138138
${CMAKE_CURRENT_SOURCE_DIR}/cache/LengthCache.cpp
139+
${CMAKE_CURRENT_SOURCE_DIR}/cache/PacketLengthMarkers.h
140+
${CMAKE_CURRENT_SOURCE_DIR}/cache/PacketLengthMarkers.cpp
139141

140142
${CMAKE_CURRENT_SOURCE_DIR}/point_transform/mct.cpp
141143
${CMAKE_CURRENT_SOURCE_DIR}/point_transform/mct.h

src/lib/jp2/cache/LengthCache.cpp

Lines changed: 5 additions & 233 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,6 @@
1818

1919
namespace grk {
2020

21-
// bytes available in PLT marker to store packet lengths
22-
// (4 bytes are reserved for (marker + marker length), and 1 byte for index)
23-
const uint32_t available_packet_len_bytes_per_plt = USHRT_MAX - 1 - 4;
24-
25-
// minimum number of packet lengths that can be stored in a full
26-
// length PLT marker
27-
// (5 is maximum number of bytes for a single packet length)
28-
const uint32_t min_packets_per_full_plt = available_packet_len_bytes_per_plt / 5;
29-
3021
// TLM(2) + Ltlm(2) + Ztlm(1) + Stlm(1)
3122
const uint32_t tlm_marker_start_bytes = 6;
3223

@@ -258,7 +249,7 @@ TileLengthMarkers::TileLengthMarkers() :
258249
m_markerTilePartIndex(0),
259250
m_curr_vec(nullptr),
260251
m_stream(nullptr),
261-
m_tlm_start_stream_position(0) {
252+
streamStart(0) {
262253
}
263254
TileLengthMarkers::TileLengthMarkers(BufferedStream *stream): TileLengthMarkers() {
264255
m_stream = stream;
@@ -343,7 +334,7 @@ void TileLengthMarkers::push(uint8_t i_TLM, TilePartLengthInfo info) {
343334
m_markers->operator[](i_TLM) = vec;
344335
}
345336
}
346-
void TileLengthMarkers::getInit(void){
337+
void TileLengthMarkers::rewind(void){
347338
m_markerIndex = 0;
348339
m_markerTilePartIndex = 0;
349340
m_curr_vec = nullptr;
@@ -373,7 +364,7 @@ TilePartLengthInfo TileLengthMarkers::getNext(void){
373364
}
374365
bool TileLengthMarkers::skipTo(uint16_t skipTileIndex, BufferedStream *stream,uint64_t firstSotPos){
375366
assert(stream);
376-
getInit();
367+
rewind();
377368
auto tl = getNext();
378369
uint16_t tileIndex = 0;
379370
uint64_t skip = 0;
@@ -392,7 +383,7 @@ bool TileLengthMarkers::skipTo(uint16_t skipTileIndex, BufferedStream *stream,ui
392383
bool TileLengthMarkers::writeBegin(uint16_t numTilePartsTotal) {
393384
uint32_t tlm_size = tlm_marker_start_bytes + tlmMarkerBytesPerTilePart * numTilePartsTotal;
394385

395-
m_tlm_start_stream_position = m_stream->tell();
386+
streamStart = m_stream->tell();
396387

397388
/* TLM */
398389
if (!m_stream->write_short(J2K_MS_TLM))
@@ -417,7 +408,7 @@ void TileLengthMarkers::writeUpdate(uint16_t tileIndex, uint32_t tile_part_size)
417408
push(m_markerIndex, TilePartLengthInfo(tileIndex,tile_part_size));
418409
}
419410
bool TileLengthMarkers::writeEnd(void) {
420-
uint64_t tlm_position = m_tlm_start_stream_position+ tlm_marker_start_bytes;
411+
uint64_t tlm_position = streamStart+ tlm_marker_start_bytes;
421412
uint64_t current_position = m_stream->tell();
422413

423414
if (!m_stream->seek(tlm_position))
@@ -454,225 +445,6 @@ bool TileLengthMarkers::addTileMarkerInfo(uint16_t tileno,
454445
return true;
455446
}
456447

457-
PacketLengthMarkers::PacketLengthMarkers() :
458-
m_markers(new PL_MAP()),
459-
m_markerIndex(0),
460-
m_curr_vec(nullptr),
461-
m_packetIndex(0),
462-
m_packet_len(0),
463-
m_marker_bytes_written(0),
464-
m_total_bytes_written(0),
465-
m_marker_len_cache(0),
466-
m_stream(nullptr)
467-
{ }
468-
PacketLengthMarkers::PacketLengthMarkers(BufferedStream *strm) : PacketLengthMarkers()
469-
{
470-
m_stream = strm;
471-
writeInit();
472-
}
473-
PacketLengthMarkers::~PacketLengthMarkers() {
474-
if (m_markers) {
475-
for (auto it = m_markers->begin(); it != m_markers->end(); it++)
476-
delete it->second;
477-
delete m_markers;
478-
}
479-
}
480-
void PacketLengthMarkers::writeInit(void) {
481-
readInitIndex(0);
482-
m_total_bytes_written = 0;
483-
m_marker_bytes_written = 0;
484-
m_marker_len_cache = 0;
485-
}
486-
void PacketLengthMarkers::writeNext(uint32_t len) {
487-
assert(len);
488-
m_curr_vec->push_back(len);
489-
}
490-
void PacketLengthMarkers::writeIncrement(uint32_t bytes) {
491-
m_marker_bytes_written += bytes;
492-
m_total_bytes_written += bytes;
493-
}
494-
void PacketLengthMarkers::writeMarkerLength(){
495-
// write marker length
496-
if (m_marker_len_cache){
497-
uint64_t current_pos = m_stream->tell();
498-
m_stream->seek(m_marker_len_cache);
499-
//do not include 2 bytes for marker itself
500-
m_stream->write_short((uint16_t) (m_marker_bytes_written - 2));
501-
m_stream->seek(current_pos);
502-
m_marker_len_cache = 0;
503-
m_marker_bytes_written = 0;
504-
}
505-
assert(m_marker_bytes_written == 0);
506-
}
507-
// check if we need to start a new marker
508-
void PacketLengthMarkers::writeMarkerHeader() {
509-
// 5 bytes worst-case to store a packet length
510-
if (m_total_bytes_written == 0
511-
|| (m_marker_bytes_written >= available_packet_len_bytes_per_plt - 5)) {
512-
513-
// complete current marker
514-
writeMarkerLength();
515-
516-
// begin new marker
517-
m_stream->write_short(J2K_MS_PLT);
518-
writeIncrement(2);
519-
520-
// cache location of marker length and skip over
521-
m_marker_len_cache = m_stream->tell();
522-
m_stream->skip(2);
523-
writeIncrement(2);
524-
}
525-
}
526-
uint32_t PacketLengthMarkers::write() {
527-
writeMarkerHeader();
528-
for (auto map_iter = m_markers->begin(); map_iter != m_markers->end();
529-
++map_iter) {
530-
531-
// write index
532-
m_stream->write_byte(map_iter->first);
533-
writeIncrement(1);
534-
535-
// write marker lengths
536-
for (auto val_iter = map_iter->second->begin();
537-
val_iter != map_iter->second->end(); ++val_iter) {
538-
//check if we need to start a new PLT marker segment
539-
writeMarkerHeader();
540-
541-
// write from MSB down to LSB
542-
uint32_t val = *val_iter;
543-
uint32_t numbits = floorlog2<uint32_t>(val) + 1;
544-
uint32_t numbytes = (numbits + 6) / 7;
545-
assert(numbytes <= 5);
546-
547-
// write period
548-
uint8_t temp[5];
549-
int32_t counter = (int32_t)(numbytes - 1);
550-
temp[counter--] = (val & 0x7F);
551-
val = (uint32_t) (val >> 7);
552-
553-
//write commas (backwards from LSB to MSB)
554-
while (val) {
555-
uint8_t b = (uint8_t) ((val & 0x7F) | 0x80);
556-
temp[counter--] = b;
557-
val = (uint32_t) (val >> 7);
558-
}
559-
assert(counter == -1);
560-
uint32_t written = (uint32_t)m_stream->write_bytes(temp, numbytes);
561-
assert(written == numbytes);
562-
(void)written;
563-
writeIncrement(numbytes);
564-
}
565-
}
566-
// write final marker length
567-
writeMarkerLength();
568-
return m_total_bytes_written;
569-
}
570-
571-
bool PacketLengthMarkers::readPLM(uint8_t *p_header_data, uint16_t header_size){
572-
if (header_size < 1) {
573-
GRK_ERROR("PLM marker segment too short");
574-
return false;
575-
}
576-
// Zplm
577-
uint8_t Zplm = *p_header_data++;
578-
--header_size;
579-
readInitIndex(Zplm);
580-
while (header_size > 0) {
581-
// Nplm
582-
uint8_t Nplm = *p_header_data++;
583-
if (header_size < (1 + Nplm)) {
584-
GRK_ERROR("Malformed PLM marker segment");
585-
return false;
586-
}
587-
for (uint32_t i = 0; i < Nplm; ++i) {
588-
uint8_t tmp = *p_header_data;
589-
++p_header_data;
590-
readNext(tmp);
591-
}
592-
header_size = (uint16_t)(header_size - (1 + Nplm));
593-
if (m_packet_len != 0) {
594-
GRK_ERROR("Malformed PLM marker segment");
595-
return false;
596-
}
597-
}
598-
return true;
599-
}
600-
bool PacketLengthMarkers::readPLT(uint8_t *p_header_data, uint16_t header_size){
601-
if (header_size < 1) {
602-
GRK_ERROR("PLT marker segment too short");
603-
return false;
604-
}
605-
606-
/* Zplt */
607-
uint8_t Zpl = *p_header_data++;
608-
--header_size;
609-
readInitIndex(Zpl);
610-
for (uint32_t i = 0; i < header_size; ++i) {
611-
/* Iplt_ij */
612-
uint8_t tmp = *p_header_data++;
613-
readNext(tmp);
614-
}
615-
if (m_packet_len != 0) {
616-
GRK_ERROR("Malformed PLT marker segment");
617-
return false;
618-
}
619-
return true;
620-
}
621-
void PacketLengthMarkers::readInitIndex(uint8_t index) {
622-
m_markerIndex = index;
623-
m_packet_len = 0;
624-
auto pair = m_markers->find(m_markerIndex);
625-
if (pair != m_markers->end()) {
626-
m_curr_vec = pair->second;
627-
} else {
628-
m_curr_vec = new PL_INFO_VEC();
629-
m_markers->operator[](m_markerIndex) = m_curr_vec;
630-
}
631-
}
632-
void PacketLengthMarkers::readNext(uint8_t Iplm) {
633-
/* take only the lower seven bits */
634-
m_packet_len |= (Iplm & 0x7f);
635-
if (Iplm & 0x80) {
636-
m_packet_len <<= 7;
637-
} else {
638-
assert(m_curr_vec);
639-
m_curr_vec->push_back(m_packet_len);
640-
//GRK_INFO("Packet length: (%u, %u)", Zpl, packet_len);
641-
m_packet_len = 0;
642-
}
643-
}
644-
void PacketLengthMarkers::getInit(void) {
645-
m_packetIndex = 0;
646-
m_markerIndex = 0;
647-
m_curr_vec = nullptr;
648-
if (m_markers) {
649-
auto pair = m_markers->find(0);
650-
if (pair != m_markers->end()) {
651-
m_curr_vec = pair->second;
652-
}
653-
}
654-
}
655-
// note: packet length must be at least 1, so 0 indicates
656-
// no packet length available
657-
uint32_t PacketLengthMarkers::getNext(void) {
658-
if (!m_markers)
659-
return 0;
660-
if (m_curr_vec) {
661-
if (m_packetIndex == m_curr_vec->size()) {
662-
m_markerIndex++;
663-
if (m_markerIndex < m_markers->size()) {
664-
m_curr_vec = m_markers->operator[](m_markerIndex);
665-
m_packetIndex = 0;
666-
} else {
667-
m_curr_vec = nullptr;
668-
}
669-
}
670-
if (m_curr_vec)
671-
return m_curr_vec->operator[](m_packetIndex++);
672-
}
673-
return 0;
674-
}
675-
676448
PacketInfo::PacketInfo(void) : headerLength(0),
677449
packetLength(0),
678450
parsedData(false)

src/lib/jp2/cache/LengthCache.h

Lines changed: 2 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ struct TileLengthMarkers {
118118
~TileLengthMarkers();
119119

120120
bool read(uint8_t *p_header_data, uint16_t header_size);
121-
void getInit(void);
121+
void rewind(void);
122122
TilePartLengthInfo getNext(void);
123123
bool skipTo(uint16_t skipTileIndex, BufferedStream *stream, uint64_t firstSotPos);
124124

@@ -145,46 +145,9 @@ struct TileLengthMarkers {
145145
uint8_t m_markerTilePartIndex;
146146
TL_INFO_VEC *m_curr_vec;
147147
BufferedStream *m_stream;
148-
uint64_t m_tlm_start_stream_position;
148+
uint64_t streamStart;
149149
};
150150

151-
typedef std::vector<uint32_t> PL_INFO_VEC;
152-
153-
// map of (PLT/PLM marker id) => (packet length vector)
154-
typedef std::map<uint8_t, PL_INFO_VEC*> PL_MAP;
155-
156-
struct PacketLengthMarkers {
157-
PacketLengthMarkers(void);
158-
PacketLengthMarkers(BufferedStream *strm);
159-
~PacketLengthMarkers(void);
160-
161-
// decompressor packet lengths
162-
bool readPLT(uint8_t *p_header_data, uint16_t header_size);
163-
bool readPLM(uint8_t *p_header_data, uint16_t header_size);
164-
void getInit(void);
165-
uint32_t getNext(void);
166-
167-
// compressor packet lengths
168-
void writeInit(void);
169-
void writeNext(uint32_t len);
170-
uint32_t write();
171-
private:
172-
void readInitIndex(uint8_t index);
173-
void readNext(uint8_t Iplm);
174-
void writeMarkerHeader(void);
175-
void writeMarkerLength();
176-
void writeIncrement(uint32_t bytes);
177-
178-
PL_MAP *m_markers;
179-
uint8_t m_markerIndex;
180-
PL_INFO_VEC *m_curr_vec;
181-
size_t m_packetIndex;
182-
uint32_t m_packet_len;
183-
uint32_t m_marker_bytes_written;
184-
uint32_t m_total_bytes_written;
185-
uint64_t m_marker_len_cache;
186-
BufferedStream *m_stream;
187-
};
188151

189152
struct PacketInfo{
190153
PacketInfo(void);

src/lib/jp2/grk_includes.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@
107107
#include "Quantizer.h"
108108
#include "Profile.h"
109109
#include "LengthCache.h"
110+
#include "PacketLengthMarkers.h"
110111
#include "SIZMarker.h"
111112
#include "PPMMarker.h"
112113
#include "SOTMarker.h"

src/lib/jp2/t2/T2Decompress.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ bool T2Decompress::decompressPackets(uint16_t tile_no,
125125
// so we disable packet length markers if we have both PLT and PLM
126126
bool usePlt = packetLengths && !cp->plm_markers;
127127
if (usePlt)
128-
packetLengths->getInit();
128+
packetLengths->rewind();
129129
for (uint32_t pino = 0; pino <= tcp->numpocs; ++pino) {
130130
auto currPi = pi + pino;
131131
if (currPi->prog.progression == GRK_PROG_UNKNOWN) {

0 commit comments

Comments
 (0)