nkoriyama / aribb24

A library for ARIB STD-B24, decoding JIS 8 bit characters and parsing MPEG-TS stream.
GNU Lesser General Public License v3.0
60 stars 24 forks source link

Fixed DRCS parser bug #17

Open scimmia9286 opened 3 years ago

scimmia9286 commented 3 years ago

DRCSデータのパース不具合

DRCSデータの内容によっては不具合が生じるケースがありました。 "ARIB STD-B24 Table D-1 DRCS structure syntax" の値を例に正常動作するケース、不具合が生じるケースを記載します。

CharacerCodeが0x4121から始まり、抜けなく0x4122, 0x4123, ... のように並んでいるケースでは正常に動作します。

正常ケース1 { "NumberOfCode":1, "Codes": [ {"CharacterCode":0x4121, ...} ] } 正常ケース2 { "NumberOfCode":2, "Codes": [ {"CharacterCode":0x4121, ...}, {"CharacterCode":0x4122, ...} ] }

一方、CharacterCodeが0x4121以外で始まるか、途中に抜けがあるケースでは正常に動作しません(下駄に変換される)。

正常に動作しないケース1 { "NumberOfCode":1, "Codes": [ {"CharacterCode":0x4122, ...} ] } 正常に動作しないケース2 { "NumberOfCode":2, "Codes": [ {"CharacterCode":0x4121, ...}, {"CharacterCode":0x4123, ...} ] }

修正内容

正常に動作させるためには、CharacerCodeの上位・下位のバイトを見て、ハッシュテーブルに登録する必要があります。 現在のaribb24ライブラリでは、DRCS0-15のページは区別して扱っていないため、ページは無視して下位のバイトのみを見てハッシュテーブルに格納する添字を計算しました。

DRCSハッシュテーブルの初期化不具合

parse_caption_management_data()からparse_data_unit()が複数回呼ばれるケースでは、parse_data_unit_DRCS()も複数回呼ばれるため、parse_data_unit_DRCS()でp_parser->p_instance->p->i_drcs_num = 0 をすると処理中にハッシュテーブル件数が初期化されてしまいます。

修正内容

初期化を parse_data_unit() に移動しました。