18
18
19
19
namespace grk {
20
20
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
-
30
21
// TLM(2) + Ltlm(2) + Ztlm(1) + Stlm(1)
31
22
const uint32_t tlm_marker_start_bytes = 6 ;
32
23
@@ -258,7 +249,7 @@ TileLengthMarkers::TileLengthMarkers() :
258
249
m_markerTilePartIndex (0 ),
259
250
m_curr_vec (nullptr ),
260
251
m_stream (nullptr ),
261
- m_tlm_start_stream_position (0 ) {
252
+ streamStart (0 ) {
262
253
}
263
254
TileLengthMarkers::TileLengthMarkers (BufferedStream *stream): TileLengthMarkers() {
264
255
m_stream = stream;
@@ -343,7 +334,7 @@ void TileLengthMarkers::push(uint8_t i_TLM, TilePartLengthInfo info) {
343
334
m_markers->operator [](i_TLM) = vec;
344
335
}
345
336
}
346
- void TileLengthMarkers::getInit (void ){
337
+ void TileLengthMarkers::rewind (void ){
347
338
m_markerIndex = 0 ;
348
339
m_markerTilePartIndex = 0 ;
349
340
m_curr_vec = nullptr ;
@@ -373,7 +364,7 @@ TilePartLengthInfo TileLengthMarkers::getNext(void){
373
364
}
374
365
bool TileLengthMarkers::skipTo (uint16_t skipTileIndex, BufferedStream *stream,uint64_t firstSotPos){
375
366
assert (stream);
376
- getInit ();
367
+ rewind ();
377
368
auto tl = getNext ();
378
369
uint16_t tileIndex = 0 ;
379
370
uint64_t skip = 0 ;
@@ -392,7 +383,7 @@ bool TileLengthMarkers::skipTo(uint16_t skipTileIndex, BufferedStream *stream,ui
392
383
bool TileLengthMarkers::writeBegin (uint16_t numTilePartsTotal) {
393
384
uint32_t tlm_size = tlm_marker_start_bytes + tlmMarkerBytesPerTilePart * numTilePartsTotal;
394
385
395
- m_tlm_start_stream_position = m_stream->tell ();
386
+ streamStart = m_stream->tell ();
396
387
397
388
/* TLM */
398
389
if (!m_stream->write_short (J2K_MS_TLM))
@@ -417,7 +408,7 @@ void TileLengthMarkers::writeUpdate(uint16_t tileIndex, uint32_t tile_part_size)
417
408
push (m_markerIndex, TilePartLengthInfo (tileIndex,tile_part_size));
418
409
}
419
410
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;
421
412
uint64_t current_position = m_stream->tell ();
422
413
423
414
if (!m_stream->seek (tlm_position))
@@ -454,225 +445,6 @@ bool TileLengthMarkers::addTileMarkerInfo(uint16_t tileno,
454
445
return true ;
455
446
}
456
447
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
-
676
448
PacketInfo::PacketInfo (void ) : headerLength(0 ),
677
449
packetLength (0 ),
678
450
parsedData(false )
0 commit comments