@@ -198,16 +198,21 @@ void CTraceB24Caption::OutputPrivateDataPes(const std::vector<uint8_t> &pes,
198
198
return ;
199
199
}
200
200
201
- PARSE_PRIVATE_DATA_RESULT ret = ParsePrivateData (m_buf, pes.data () + payloadPos, pes.size () - payloadPos, drcsList, langTags);
201
+ PARSE_PRIVATE_DATA_RESULT ret = ParsePrivateData (m_buf, m_intBuf, pes.data () + payloadPos, pes.size () - payloadPos, drcsList, langTags);
202
202
if (ret != PARSE_PRIVATE_DATA_FAILED_NEED_MANAGEMENT) {
203
203
int64_t ptsPcrDiff = (0x200000000 + pts - m_pcr) & 0x1ffffffff ;
204
204
if (ptsPcrDiff >= 0x100000000 ) {
205
205
ptsPcrDiff -= 0x200000000 ;
206
206
}
207
- fprintf (m_fp, " pts=%010lld;pcrrel=%+08d;b24%s " ,
207
+ fprintf (m_fp, " pts=%010lld;pcrrel=%+08d" ,
208
208
static_cast <long long >(pts),
209
- static_cast <int >(m_pcr < 0 ? -9999999 : std::min<int64_t >(std::max<int64_t >(ptsPcrDiff, -9999999 ), 9999999 )),
210
- dataIdentifier == 0x81 ? " superimpose" : " caption" );
209
+ static_cast <int >(m_pcr < 0 ? -9999999 : std::min<int64_t >(std::max<int64_t >(ptsPcrDiff, -9999999 ), 9999999 )));
210
+ if (ret == PARSE_PRIVATE_DATA_SUCCEEDED) {
211
+ for (size_t i = 0 ; i + 1 < m_intBuf.size (); ++i) {
212
+ fprintf (m_fp, " %s%d" , i == 0 ? " ;text=" : " ," , m_intBuf[i + 1 ] - m_intBuf[i]);
213
+ }
214
+ }
215
+ fprintf (m_fp, " ;b24%s" , dataIdentifier == 0x81 ? " superimpose" : " caption" );
211
216
if (ret == PARSE_PRIVATE_DATA_SUCCEEDED) {
212
217
m_buf.push_back (' \n ' );
213
218
fwrite (m_buf.data (), 1 , m_buf.size (), m_fp);
@@ -334,8 +339,21 @@ void InitializeArib8(std::pair<GS_CLASS, uint8_t> (&gbuf)[4], int &gl, int &gr,
334
339
gr = 2 ;
335
340
}
336
341
337
- void AnalizeArib8 (std::vector<uint8_t > &buf, const uint8_t *&data, const uint8_t *dataEnd, const std::vector<uint16_t > &drcsList,
338
- std::pair<GS_CLASS, uint8_t > (&gbuf)[4], int &gl, int &gr, bool isLatin)
342
+ void CheckReadableTextPosList (std::vector<int > &textPosList, const std::vector<uint8_t > &buf, bool isNextReadable)
343
+ {
344
+ if ((textPosList.size () % 2 != 0 ) == isNextReadable) {
345
+ int codeCount = 0 ;
346
+ for (size_t i = 0 ; i < buf.size (); ++i) {
347
+ if ((buf[i] & 0xc0 ) != 0x80 ) {
348
+ ++codeCount;
349
+ }
350
+ }
351
+ textPosList.push_back (codeCount);
352
+ }
353
+ }
354
+
355
+ void AnalizeArib8 (std::vector<uint8_t > &buf, std::vector<int > &textPosList, const uint8_t *&data, const uint8_t *dataEnd,
356
+ const std::vector<uint16_t > &drcsList, std::pair<GS_CLASS, uint8_t > (&gbuf)[4], int &gl, int &gr, bool isLatin)
339
357
{
340
358
std::pair<GS_CLASS, uint8_t > *gss = nullptr ;
341
359
while (data != dataEnd) {
@@ -403,6 +421,7 @@ void AnalizeArib8(std::vector<uint8_t> &buf, const uint8_t *&data, const uint8_t
403
421
gss = &gbuf[3 ];
404
422
}
405
423
else if (b != 0 ) {
424
+ CheckReadableTextPosList (textPosList, buf, b == 0x20 );
406
425
AddChar (buf, b);
407
426
if (b == 0x0c ) {
408
427
// CS
@@ -435,13 +454,16 @@ void AnalizeArib8(std::vector<uint8_t> &buf, const uint8_t *&data, const uint8_t
435
454
}
436
455
else {
437
456
if (b == 0x7f ) {
457
+ CheckReadableTextPosList (textPosList, buf, false );
438
458
AddChar (buf, b);
439
459
}
440
460
else if (b == 0xa0 ) {
461
+ CheckReadableTextPosList (textPosList, buf, true );
441
462
AddChar32 (buf, U' \u00A0 ' );
442
463
}
443
464
else {
444
465
// caret notation
466
+ CheckReadableTextPosList (textPosList, buf, false );
445
467
buf.push_back (' %' );
446
468
AddChar (buf, ' ^' );
447
469
AddChar (buf, b - 0x40 );
@@ -493,6 +515,7 @@ void AnalizeArib8(std::vector<uint8_t> &buf, const uint8_t *&data, const uint8_t
493
515
gss = nullptr ;
494
516
b &= 0x7f ;
495
517
if (g.first == GS_1BYTE_G) {
518
+ CheckReadableTextPosList (textPosList, buf, true );
496
519
if (g.second == GS_ASCII || g.second == GS_PROP_ASCII) {
497
520
if (isLatin) {
498
521
AddChar (buf, b);
@@ -511,6 +534,7 @@ void AnalizeArib8(std::vector<uint8_t> &buf, const uint8_t *&data, const uint8_t
511
534
}
512
535
}
513
536
else if (g.first == GS_2BYTE_G) {
537
+ CheckReadableTextPosList (textPosList, buf, true );
514
538
uint8_t c = ReadByte (data, dataEnd) & 0x7f ;
515
539
if (g.second == GS_JIS_KANJI1 ||
516
540
g.second == GS_JIS_KANJI2 ||
@@ -545,12 +569,13 @@ void AnalizeArib8(std::vector<uint8_t> &buf, const uint8_t *&data, const uint8_t
545
569
x = static_cast <char32_t >(it - 1 - drcsList.begin () + 0xec00 );
546
570
}
547
571
}
572
+ CheckReadableTextPosList (textPosList, buf, true );
548
573
AddChar32 (buf, x);
549
574
}
550
575
else if (g.second == GS_MACRO) {
551
576
if (0x60 <= b && b <= 0x6f ) {
552
577
const uint8_t *macro = DefaultMacro[b & 0x0f ];
553
- AnalizeArib8 (buf, macro, macro + sizeof (DefaultMacro[0 ]), drcsList, gbuf, gl, gr, isLatin);
578
+ AnalizeArib8 (buf, textPosList, macro, macro + sizeof (DefaultMacro[0 ]), drcsList, gbuf, gl, gr, isLatin);
554
579
}
555
580
else {
556
581
AddChar32 (buf, U' \uFFFD ' );
@@ -572,6 +597,7 @@ void AnalizeArib8(std::vector<uint8_t> &buf, const uint8_t *&data, const uint8_t
572
597
x = static_cast <char32_t >(it - 1 - drcsList.begin () + 0xec00 );
573
598
}
574
599
}
600
+ CheckReadableTextPosList (textPosList, buf, true );
575
601
AddChar32 (buf, x);
576
602
}
577
603
else {
@@ -585,12 +611,14 @@ void AnalizeArib8(std::vector<uint8_t> &buf, const uint8_t *&data, const uint8_t
585
611
}
586
612
}
587
613
588
- void AddArib8AsUtf8 (std::vector<uint8_t > &buf, const uint8_t *data, size_t dataSize, const std::vector<uint16_t > &drcsList, bool isLatin)
614
+ void AddArib8AsUtf8 (std::vector<uint8_t > &buf, std::vector<int > &textPosList, const uint8_t *data, size_t dataSize,
615
+ const std::vector<uint16_t > &drcsList, bool isLatin)
589
616
{
590
617
std::pair<GS_CLASS, uint8_t > gbuf[4 ];
591
618
int gl, gr;
592
619
InitializeArib8 (gbuf, gl, gr, isLatin);
593
- AnalizeArib8 (buf, data, data + dataSize, drcsList, gbuf, gl, gr, isLatin);
620
+ AnalizeArib8 (buf, textPosList, data, data + dataSize, drcsList, gbuf, gl, gr, isLatin);
621
+ CheckReadableTextPosList (textPosList, buf, false );
594
622
}
595
623
596
624
size_t AddEscapedData (std::vector<uint8_t > &buf, const uint8_t *data, size_t dataSize)
@@ -636,7 +664,7 @@ void AddUcs(std::vector<uint8_t> &buf, const uint8_t *data, size_t dataSize)
636
664
}
637
665
638
666
CTraceB24Caption::PARSE_PRIVATE_DATA_RESULT
639
- CTraceB24Caption::ParsePrivateData (std::vector<uint8_t > &buf, const uint8_t *data, size_t dataSize,
667
+ CTraceB24Caption::ParsePrivateData (std::vector<uint8_t > &buf, std::vector< int > &textPosList, const uint8_t *data, size_t dataSize,
640
668
std::vector<uint16_t > &drcsList, LANG_TAG_TYPE (&langTags)[8])
641
669
{
642
670
const uint8_t BEGIN_UNIT_BRACE[] = {' %' , ' =' , ' {' };
@@ -670,6 +698,8 @@ CTraceB24Caption::ParsePrivateData(std::vector<uint8_t> &buf, const uint8_t *dat
670
698
buf.clear ();
671
699
buf.push_back (' 0' + dgiType);
672
700
buf.push_back (' =' );
701
+ textPosList.clear ();
702
+ CheckReadableTextPosList (textPosList, buf, false );
673
703
pos += AddEscapedData (buf, data + pos, 3 );
674
704
// omit data_group_size
675
705
pos += 2 ;
@@ -758,7 +788,7 @@ CTraceB24Caption::ParsePrivateData(std::vector<uint8_t> &buf, const uint8_t *dat
758
788
if (unitParameter == 0x20 ) {
759
789
// Statement body
760
790
if (lang == LANG_TAG_ARIB8 || lang == LANG_TAG_ARIB8_LATIN) {
761
- AddArib8AsUtf8 (buf, data + pos, dataUnitSize, drcsList, lang == LANG_TAG_ARIB8_LATIN);
791
+ AddArib8AsUtf8 (buf, textPosList, data + pos, dataUnitSize, drcsList, lang == LANG_TAG_ARIB8_LATIN);
762
792
pos += dataUnitSize;
763
793
}
764
794
else if (lang == LANG_TAG_UCS) {
0 commit comments