diff --git a/multimedia/Makefile b/multimedia/Makefile --- a/multimedia/Makefile +++ b/multimedia/Makefile @@ -8,6 +8,7 @@ SUBDIR += aom SUBDIR += aravis SUBDIR += arcan + SUBDIR += aribb24 SUBDIR += assimp SUBDIR += atomicparsley SUBDIR += audacious diff --git a/multimedia/aribb24/Makefile b/multimedia/aribb24/Makefile new file mode 100644 --- /dev/null +++ b/multimedia/aribb24/Makefile @@ -0,0 +1,25 @@ +PORTNAME= aribb24 +DISTVERSION= 1.0.4 +CATEGORIES= multimedia + +MAINTAINER= driesm@FreeBSD.org +COMMENT= ARIB STD-B24 library + +LICENSE= LGPL3 +LICENSE_FILE= ${WRKSRC}/COPYING + +LIB_DEPENDS= libpng.so:graphics/png + +USES= autoreconf libtool pkgconfig +USE_GITHUB= yes +GH_ACCOUNT= jeeb +GH_TAGNAME= a41b904 +USE_LDCONFIG= yes + +GNU_CONFIGURE= yes + +INSTALL_TARGET= install-strip + +OPTIONS_DEFINE= DOCS + +.include diff --git a/multimedia/aribb24/distinfo b/multimedia/aribb24/distinfo new file mode 100644 --- /dev/null +++ b/multimedia/aribb24/distinfo @@ -0,0 +1,3 @@ +TIMESTAMP = 1644955608 +SHA256 (jeeb-aribb24-1.0.4-a41b904_GH0.tar.gz) = bff07228a919309263bea08eb880efa9376dca5b4ec19ce9b404d175504da596 +SIZE (jeeb-aribb24-1.0.4-a41b904_GH0.tar.gz) = 47404 diff --git a/multimedia/aribb24/files/patch-src_aribb24__private.h b/multimedia/aribb24/files/patch-src_aribb24__private.h new file mode 100644 --- /dev/null +++ b/multimedia/aribb24/files/patch-src_aribb24__private.h @@ -0,0 +1,16 @@ +https://github.com/scimmia9286/aribb24/commit/fa54dee41aa38560f02868b24f911a24c33780a8 +--- src/aribb24_private.h.orig 2019-09-16 15:57:19 UTC ++++ src/aribb24_private.h +@@ -35,9 +35,9 @@ struct arib_instance_private_t + char *psz_last_error; + + drcs_conversion_t *p_drcs_conv; +- int i_drcs_num; +- unsigned int drcs_conv_table[188]; +- char drcs_hash_table[188][32 + 1]; ++ int i_drcs_num[15]; ++ unsigned int drcs_conv_table[15][188]; ++ char drcs_hash_table[15][188][32 + 1]; + }; + + void arib_log( arib_instance_t *, const char *, ... ); diff --git a/multimedia/aribb24/files/patch-src_decoder.c b/multimedia/aribb24/files/patch-src_decoder.c new file mode 100644 --- /dev/null +++ b/multimedia/aribb24/files/patch-src_decoder.c @@ -0,0 +1,89 @@ +https://github.com/scimmia9286/aribb24/commit/fa54dee41aa38560f02868b24f911a24c33780a8 +--- src/decoder.c.orig 2019-09-16 15:57:19 UTC ++++ src/decoder.c +@@ -82,6 +82,7 @@ struct arib_decoder_t + int (*handle_g2)(arib_decoder_t *, int); + int (*handle_g3)(arib_decoder_t *, int); + int kanji_ku; ++ int drcs_plane; + + int i_control_time; + +@@ -448,11 +449,8 @@ static int decoder_handle_drcs( arib_decoder_t *decode + { + unsigned int uc; + +- uc = 0; +- if( c < decoder->p_instance->p->i_drcs_num ) +- { +- uc = decoder->p_instance->p->drcs_conv_table[c]; +- } ++ uc = decoder->p_instance->p->drcs_conv_table[decoder->drcs_plane-1][c]; ++ + if( uc == 0 ) + { + /* uc = 0x3000; */ /* WHITESPACE */ +@@ -555,6 +553,7 @@ static int decoder_handle_esc( arib_decoder_t *decoder + { + int c; + int (**handle)(arib_decoder_t *, int); ++ int drcs = 0; + + handle = &decoder->handle_g0; + while( decoder_pull( decoder, &c ) != 0 ) +@@ -562,6 +561,7 @@ static int decoder_handle_esc( arib_decoder_t *decoder + switch( c ) + { + case 0x20: // DRCS ++ drcs = 1; + break; + case 0x24: + case 0x28: +@@ -585,12 +585,29 @@ static int decoder_handle_esc( arib_decoder_t *decoder + return 1; + case 0x39: + case 0x3b: +- case 0x42: + *handle = decoder_handle_kanji; + return 1; ++ case 0x42: ++ if (drcs==1) ++ { ++ decoder->drcs_plane = c-0x40; ++ *handle = decoder_handle_drcs; ++ } ++ else ++ { ++ *handle = decoder_handle_kanji; ++ } + case 0x36: + case 0x4a: +- *handle = decoder_handle_alnum; ++ if (drcs==1) ++ { ++ decoder->drcs_plane = c-0x40; ++ *handle = decoder_handle_drcs; ++ } ++ else ++ { ++ *handle = decoder_handle_alnum; ++ } + return 1; + case 0x40: + case 0x41: +@@ -608,6 +625,7 @@ static int decoder_handle_esc( arib_decoder_t *decoder + case 0x4d: + case 0x4e: + case 0x4f: ++ decoder->drcs_plane = c-0x40; + *handle = decoder_handle_drcs; + return 1; + case 0x6e: //LS2 +@@ -1401,6 +1419,7 @@ void arib_initialize_decoder( arib_decoder_t* decoder + decoder->handle_g2 = decoder_handle_hiragana; + decoder->handle_g3 = decoder_handle_katakana; + decoder->kanji_ku = -1; ++ decoder->drcs_plane = -1; + + decoder->i_control_time = 0; + diff --git a/multimedia/aribb24/files/patch-src_drcs.h b/multimedia/aribb24/files/patch-src_drcs.h new file mode 100644 --- /dev/null +++ b/multimedia/aribb24/files/patch-src_drcs.h @@ -0,0 +1,11 @@ +https://github.com/scimmia9286/aribb24/commit/58a34b8fabf4d0e9e1984fb603a97f52fb934a09 +--- src/drcs.h.orig 2019-09-16 15:57:19 UTC ++++ src/drcs.h +@@ -77,6 +77,6 @@ typedef struct drcs_data_s + + bool apply_drcs_conversion_table( arib_instance_t * ); + bool load_drcs_conversion_table( arib_instance_t * ); +-void save_drcs_pattern( arib_instance_t *, int, int, int, const int8_t* ); ++void save_drcs_pattern( arib_instance_t *, int, int, int, const int8_t*, int16_t ); + + #endif diff --git a/multimedia/aribb24/files/patch-src_drcs.c b/multimedia/aribb24/files/patch-src_drcs.c new file mode 100644 --- /dev/null +++ b/multimedia/aribb24/files/patch-src_drcs.c @@ -0,0 +1,89 @@ +https://github.com/scimmia9286/aribb24/commit/58a34b8fabf4d0e9e1984fb603a97f52fb934a09 +https://github.com/scimmia9286/aribb24/commit/fa54dee41aa38560f02868b24f911a24c33780a8 +--- src/drcs.c.orig 2019-09-16 15:57:19 UTC ++++ src/drcs.c +@@ -127,32 +127,39 @@ static bool create_arib_datadir( arib_instance_t *p_in + + bool apply_drcs_conversion_table( arib_instance_t *p_instance ) + { +- for( int i = 0; i < p_instance->p->i_drcs_num; i++ ) ++ for( int i = 0; i < 15; i++ ) + { +- unsigned int uc = 0; +- drcs_conversion_t *p_drcs_conv = p_instance->p->p_drcs_conv; +- while( p_drcs_conv != NULL ) ++ for( int j = 0; j < p_instance->p->i_drcs_num[i]; j++ ) + { +- if( strcmp( p_drcs_conv->hash, p_instance->p->drcs_hash_table[i] ) == 0 ) ++ if (p_instance->p->drcs_hash_table[i][j][0] != 0) + { +- uc = p_drcs_conv->code; +- break; +- } +- p_drcs_conv = p_drcs_conv->p_next; +- } ++ unsigned int uc = 0; ++ drcs_conversion_t *p_drcs_conv = p_instance->p->p_drcs_conv; ++ while( p_drcs_conv != NULL ) ++ { ++ if( strcmp( p_drcs_conv->hash, p_instance->p->drcs_hash_table[i][j] ) == 0 ) ++ { ++ uc = p_drcs_conv->code; ++ break; ++ } ++ p_drcs_conv = p_drcs_conv->p_next; ++ } ++ + #ifdef DEBUG_ARIBSUB +- if( uc ) +- { +- arib_log( p_instance, "Mapping [%s=U+%04x] will be used.", +- p_instance->p->drcs_hash_table[i], uc ); +- } +- else +- { +- arib_log( p_instance, "Mapping for hash[%s] is not found.", +- p_instance->p->drcs_hash_table[i] ); +- } ++ if( uc ) ++ { ++ arib_log( p_instance, "Mapping [%s=U+%04x] will be used.", ++ p_instance->p->drcs_hash_table[i][j], uc ); ++ } ++ else ++ { ++ arib_log( p_instance, "Mapping for hash[%s] is not found.", ++ p_instance->p->drcs_hash_table[i][j] ); ++ } + #endif +- p_instance->p->drcs_conv_table[i] = uc; ++ p_instance->p->drcs_conv_table[i][j] = uc; ++ } ++ } + } + return true; + } +@@ -406,15 +413,19 @@ png_create_write_struct_failed: + void save_drcs_pattern( + arib_instance_t *p_instance, + int i_width, int i_height, +- int i_depth, const int8_t* p_patternData ) ++ int i_depth, const int8_t* p_patternData, ++ int16_t i_CharacterCode ) + { ++ int i_drcsPlane = ((i_CharacterCode >> 8) & 0xff) - 0x40; ++ int i_code = (i_CharacterCode & 0xff) - 0x20; + char* psz_hash = get_drcs_pattern_data_hash( p_instance, + i_width, i_height, i_depth, p_patternData ); + +- strncpy( p_instance->p->drcs_hash_table[p_instance->p->i_drcs_num], psz_hash, 32 ); +- p_instance->p->drcs_hash_table[p_instance->p->i_drcs_num][32] = '\0'; ++ strncpy( p_instance->p->drcs_hash_table[i_drcsPlane-1][i_code-1], psz_hash, 32 ); ++ p_instance->p->drcs_hash_table[i_drcsPlane-1][i_code-1][32] = '\0'; + +- p_instance->p->i_drcs_num++; ++ p_instance->p->i_drcs_num[i_drcsPlane-1] = i_code > p_instance->p->i_drcs_num[i_drcsPlane-1] ? ++ i_code : p_instance->p->i_drcs_num[i_drcsPlane-1]; + + save_drcs_pattern_data_image( p_instance, psz_hash, + i_width, i_height, i_depth, p_patternData ); diff --git a/multimedia/aribb24/files/patch-src_parser.c b/multimedia/aribb24/files/patch-src_parser.c new file mode 100644 --- /dev/null +++ b/multimedia/aribb24/files/patch-src_parser.c @@ -0,0 +1,85 @@ +https://github.com/scimmia9286/aribb24/commit/58a34b8fabf4d0e9e1984fb603a97f52fb934a09 +https://github.com/scimmia9286/aribb24/commit/fa54dee41aa38560f02868b24f911a24c33780a8 +--- src/parser.c.orig 2019-09-16 15:57:19 UTC ++++ src/parser.c +@@ -79,7 +79,6 @@ static void parse_data_unit_DRCS( arib_parser_t *p_par + uint8_t i_data_unit_parameter, + uint32_t i_data_unit_size ) + { +- p_parser->p_instance->p->i_drcs_num = 0; + #ifdef ARIBSUB_GEN_DRCS_DATA + if( p_parser->p_drcs_data != NULL ) + { +@@ -119,7 +118,7 @@ static void parse_data_unit_DRCS( arib_parser_t *p_par + + for( int i = 0; i < i_NumberOfCode; i++ ) + { +- bs_skip( p_bs, 16 ); /* i_character_code */ ++ int16_t i_CharacterCode = bs_read( p_bs, 16 ); /* i_character_code */ + p_parser->i_data_unit_size += 2; + uint8_t i_NumberOfFont = bs_read( p_bs, 8 ); + p_parser->i_data_unit_size += 1; +@@ -139,7 +138,11 @@ static void parse_data_unit_DRCS( arib_parser_t *p_par + + for( int j = 0; j < i_NumberOfFont; j++ ) + { ++#ifdef ARIBSUB_GEN_DRCS_DATA ++ int8_t i_fontId = bs_read( p_bs, 4 ); /* i_fontID */ ++#else + bs_skip( p_bs, 4 ); /* i_fontID */ ++#endif //ARUBSUB_GEN_DRCS_DATA + uint8_t i_mode = bs_read( p_bs, 4 ); + p_parser->i_data_unit_size += 1; + +@@ -206,18 +209,26 @@ static void parse_data_unit_DRCS( arib_parser_t *p_par + + #ifdef ARIBSUB_GEN_DRCS_DATA + save_drcs_pattern( p_parser->p_instance, i_width, i_height, i_depth + 2, +- p_drcs_pattern_data->p_patternData ); ++ p_drcs_pattern_data->p_patternData, i_CharacterCode ); + #else + save_drcs_pattern( p_parser->p_instance, i_width, i_height, i_depth + 2, +- p_patternData ); ++ p_patternData, i_CharacterCode ); + free( p_patternData ); + #endif //ARIBSUB_GEN_DRCS_DATA + } + else + { ++#ifdef ARIBSUB_GEN_DRCS_DATA ++ int8_t i_regionX = bs_read( p_bs, 8 ); /* i_regionX */ ++#else + bs_skip( p_bs, 8 ); /* i_regionX */ ++#endif //ARIBSUB_GEN_DRCS_DATA + p_parser->i_data_unit_size += 1; ++#ifdef ARIBSUB_GEN_DRCS_DATA ++ int8_t i_regionY = bs_read( p_bs, 8 ); /* i_regionY */ ++#else + bs_skip( p_bs, 8 ); /* i_regionY */ ++#endif //ARIBSUB_GEN_DRCS_DATA + p_parser->i_data_unit_size += 1; + uint16_t i_geometricData_length = bs_read( p_bs, 16 ); + p_parser->i_data_unit_size += 2; +@@ -245,7 +256,11 @@ static void parse_data_unit_DRCS( arib_parser_t *p_par + + for( int k = 0; k < i_geometricData_length ; k++ ) + { ++#ifdef ARIBSUB_GEN_DRCS_DATA ++ int8_t i_geometricData = bs_read( p_bs, 8 ); /* i_geometric_data */ ++#else + bs_skip( p_bs, 8 ); /* i_geometric_data */ ++#endif //ARIBSUB_GEN_DRCS_DATA + p_parser->i_data_unit_size += 1; + + #ifdef ARIBSUB_GEN_DRCS_DATA +@@ -344,6 +359,10 @@ static void parse_caption_management_data( arib_parser + p_parser->i_data_unit_size = 0; + p_parser->i_subtitle_data_size = 0; + p_parser->psz_subtitle_data = NULL; ++ memset(p_parser->p_instance->p->i_drcs_num, 0, ++ sizeof(p_parser->p_instance->p->i_drcs_num)); ++ memset(p_parser->p_instance->p->drcs_hash_table, 0, ++ sizeof(p_parser->p_instance->p->drcs_hash_table)); + if( i_data_unit_loop_length > 0 ) + { + p_parser->psz_subtitle_data = (unsigned char*) calloc( diff --git a/multimedia/aribb24/pkg-descr b/multimedia/aribb24/pkg-descr new file mode 100644 --- /dev/null +++ b/multimedia/aribb24/pkg-descr @@ -0,0 +1,4 @@ +A library for ARIB STD-B24, decoding JIS 8 bit characters +and parsing MPEG-TS stream. + +WWW: https://github.com/nkoriyama/aribb24 diff --git a/multimedia/aribb24/pkg-plist b/multimedia/aribb24/pkg-plist new file mode 100644 --- /dev/null +++ b/multimedia/aribb24/pkg-plist @@ -0,0 +1,11 @@ +include/aribb24/aribb24.h +include/aribb24/bits.h +include/aribb24/decoder.h +include/aribb24/parser.h +lib/libaribb24.a +lib/libaribb24.so +lib/libaribb24.so.0 +lib/libaribb24.so.0.0.0 +libdata/pkgconfig/aribb24.pc +%%PORTDOCS%%%%DOCSDIR%%/COPYING +%%PORTDOCS%%%%DOCSDIR%%/README.md