17.patch 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. From 58a34b8fabf4d0e9e1984fb603a97f52fb934a09 Mon Sep 17 00:00:00 2001
  2. From: scimmia9286 <scimmia9286@yahoo.co.jp>
  3. Date: Thu, 22 Apr 2021 20:26:45 +0900
  4. Subject: [PATCH] Fixed DRCS parser bug
  5. ---
  6. src/decoder.c | 3 ++-
  7. src/drcs.c | 12 ++++++++----
  8. src/drcs.h | 2 +-
  9. src/parser.c | 25 +++++++++++++++++++++----
  10. 4 files changed, 32 insertions(+), 10 deletions(-)
  11. diff --git a/src/decoder.c b/src/decoder.c
  12. index 2b77f38..c9d6ac3 100644
  13. --- a/src/decoder.c
  14. +++ b/src/decoder.c
  15. @@ -1139,9 +1139,10 @@ static int decoder_handle_time( arib_decoder_t *decoder )
  16. return 1;
  17. break;
  18. default:
  19. - if( i_mode == 1 && c >= 0x40 && c <= 0x7F )
  20. + if( i_mode == 1 && c >= 0x40 && c <= 0x7F ) {
  21. decoder->i_control_time += c & 0x3f;
  22. return 1;
  23. + }
  24. return 0;
  25. }
  26. if( i_mode == 0 )
  27. diff --git a/src/drcs.c b/src/drcs.c
  28. index 114d846..8ff8d4f 100644
  29. --- a/src/drcs.c
  30. +++ b/src/drcs.c
  31. @@ -406,15 +406,19 @@ static void save_drcs_pattern_data_image(
  32. void save_drcs_pattern(
  33. arib_instance_t *p_instance,
  34. int i_width, int i_height,
  35. - int i_depth, const int8_t* p_patternData )
  36. + int i_depth, const int8_t* p_patternData,
  37. + int16_t i_CharacterCode )
  38. {
  39. +// int i_drcsPage = (i_CharacterCode >> 16) & 0xff;
  40. + int i_code = (i_CharacterCode & 0xff) - 0x20;
  41. char* psz_hash = get_drcs_pattern_data_hash( p_instance,
  42. i_width, i_height, i_depth, p_patternData );
  43. - strncpy( p_instance->p->drcs_hash_table[p_instance->p->i_drcs_num], psz_hash, 32 );
  44. - p_instance->p->drcs_hash_table[p_instance->p->i_drcs_num][32] = '\0';
  45. + strncpy( p_instance->p->drcs_hash_table[i_code-1], psz_hash, 32 );
  46. + p_instance->p->drcs_hash_table[i_code-1][32] = '\0';
  47. - p_instance->p->i_drcs_num++;
  48. + p_instance->p->i_drcs_num = i_code > p_instance->p->i_drcs_num ?
  49. + i_code : p_instance->p->i_drcs_num;
  50. save_drcs_pattern_data_image( p_instance, psz_hash,
  51. i_width, i_height, i_depth, p_patternData );
  52. diff --git a/src/drcs.h b/src/drcs.h
  53. index 274ff44..9c1533e 100644
  54. --- a/src/drcs.h
  55. +++ b/src/drcs.h
  56. @@ -77,6 +77,6 @@ typedef struct drcs_data_s
  57. bool apply_drcs_conversion_table( arib_instance_t * );
  58. bool load_drcs_conversion_table( arib_instance_t * );
  59. -void save_drcs_pattern( arib_instance_t *, int, int, int, const int8_t* );
  60. +void save_drcs_pattern( arib_instance_t *, int, int, int, const int8_t*, int16_t );
  61. #endif
  62. diff --git a/src/parser.c b/src/parser.c
  63. index 1403dd6..6db27ae 100644
  64. --- a/src/parser.c
  65. +++ b/src/parser.c
  66. @@ -79,7 +79,6 @@ static void parse_data_unit_DRCS( arib_parser_t *p_parser, bs_t *p_bs,
  67. uint8_t i_data_unit_parameter,
  68. uint32_t i_data_unit_size )
  69. {
  70. - p_parser->p_instance->p->i_drcs_num = 0;
  71. #ifdef ARIBSUB_GEN_DRCS_DATA
  72. if( p_parser->p_drcs_data != NULL )
  73. {
  74. @@ -119,7 +118,7 @@ static void parse_data_unit_DRCS( arib_parser_t *p_parser, bs_t *p_bs,
  75. for( int i = 0; i < i_NumberOfCode; i++ )
  76. {
  77. - bs_skip( p_bs, 16 ); /* i_character_code */
  78. + int16_t i_CharacterCode = bs_read( p_bs, 16 ); /* i_character_code */
  79. p_parser->i_data_unit_size += 2;
  80. uint8_t i_NumberOfFont = bs_read( p_bs, 8 );
  81. p_parser->i_data_unit_size += 1;
  82. @@ -139,7 +138,11 @@ static void parse_data_unit_DRCS( arib_parser_t *p_parser, bs_t *p_bs,
  83. for( int j = 0; j < i_NumberOfFont; j++ )
  84. {
  85. +#ifdef ARIBSUB_GEN_DRCS_DATA
  86. + int8_t i_fontId = bs_read( p_bs, 4 ); /* i_fontID */
  87. +#else
  88. bs_skip( p_bs, 4 ); /* i_fontID */
  89. +#endif //ARIBSUB_GEN_DRCS_DATA
  90. uint8_t i_mode = bs_read( p_bs, 4 );
  91. p_parser->i_data_unit_size += 1;
  92. @@ -206,18 +209,26 @@ static void parse_data_unit_DRCS( arib_parser_t *p_parser, bs_t *p_bs,
  93. #ifdef ARIBSUB_GEN_DRCS_DATA
  94. save_drcs_pattern( p_parser->p_instance, i_width, i_height, i_depth + 2,
  95. - p_drcs_pattern_data->p_patternData );
  96. + p_drcs_pattern_data->p_patternData, i_CharacterCode );
  97. #else
  98. save_drcs_pattern( p_parser->p_instance, i_width, i_height, i_depth + 2,
  99. - p_patternData );
  100. + p_patternData, i_CharacterCode);
  101. free( p_patternData );
  102. #endif //ARIBSUB_GEN_DRCS_DATA
  103. }
  104. else
  105. {
  106. +#ifdef ARIBSUB_GEN_DRCS_DATA
  107. + int8_t i_regionX = bs_read( p_bs, 8 ); /* i_regionX */
  108. +#else
  109. bs_skip( p_bs, 8 ); /* i_regionX */
  110. +#endif //ARIBSUB_GEN_DRCS_DATA
  111. p_parser->i_data_unit_size += 1;
  112. +#ifdef ARIBSUB_GEN_DRCS_DATA
  113. + int8_t i_regionY = bs_read( p_bs, 8 ); /* i_regionY */
  114. +#else
  115. bs_skip( p_bs, 8 ); /* i_regionY */
  116. +#endif //ARIBSUB_GEN_DRCS_DATA
  117. p_parser->i_data_unit_size += 1;
  118. uint16_t i_geometricData_length = bs_read( p_bs, 16 );
  119. p_parser->i_data_unit_size += 2;
  120. @@ -245,7 +256,11 @@ static void parse_data_unit_DRCS( arib_parser_t *p_parser, bs_t *p_bs,
  121. for( int k = 0; k < i_geometricData_length ; k++ )
  122. {
  123. +#ifdef ARIBSUB_GEN_DRCS_DATA
  124. + int8_t i_geometricData = bs_read( p_bs, 8 ); /* i_geometric_data */
  125. +#else
  126. bs_skip( p_bs, 8 ); /* i_geometric_data */
  127. +#endif //ARIBSUB_GEN_DRCS_DATA
  128. p_parser->i_data_unit_size += 1;
  129. #ifdef ARIBSUB_GEN_DRCS_DATA
  130. @@ -344,6 +359,8 @@ static void parse_caption_management_data( arib_parser_t *p_parser, bs_t *p_bs )
  131. p_parser->i_data_unit_size = 0;
  132. p_parser->i_subtitle_data_size = 0;
  133. p_parser->psz_subtitle_data = NULL;
  134. + p_parser->p_instance->p->i_drcs_num = 0;
  135. + memset(p_parser->p_instance->p->drcs_hash_table, 0, sizeof(p_parser->p_instance->p->drcs_hash_table));
  136. if( i_data_unit_loop_length > 0 )
  137. {
  138. p_parser->psz_subtitle_data = (unsigned char*) calloc(