Olá jmaraujo,
Olhando nos ARM codes do seu firmware, eu havia identificado a rotina sub_E64C como possível responsável pela exibição das legendas, mas achei ela muito diferente das usadas nos aparelhos LG. Porém, com o email que você me mandou, com várias identificações encontradas por você dos pontos mostrados no texto "MPEG4 Subtitle Display in ARM", eu pude confirmar que é ela mesma. Interessante que a rotina que origina a chamada a ela, que começa em sub_AEE4, é idêntica à que eu já identifiquei em alguns aparelhos LG.
Bom, o maior problema dessa rotina é que não dá para identificar de forma clara em que posição de RAM fica o buffer de legenda. Parece que o caractere é lido neste trecho:
ROM:0000E6F0 60 1C ADDS R0, R4, #1
ROM:0000E6F2 21 1C ADDS R1, R4, #0
ROM:0000E6F4 75 5C LDRB R5, [R6,R1] ; le caractere?
ROM:0000E6F6 00 06 LSLS R0, R0, #0x18
ROM:0000E6F8 00 0E LSRS R0, R0, #0x18
ROM:0000E6FA 04 1C ADDS R4, R0, #0
ROM:0000E6FC 0D 2D CMP R5, #0xD
A posição inicial do buffer está carregada em R6. Porém, o registrador R6 não tem a posição carregada diretamente. Isso ocorre aqui:
ROM:0000E66A 08 9E LDR R6, [SP,#0x38+var_18]
ROM:0000E66C 01 36 ADDS R6, #1
ROM:0000E66E 30 78 LDRB R0, [R6]
ROM:0000E670 01 36 ADDS R6, #1
Ele é carregado com o conteúdo de uma posição relativa ao Stack Pointer e depois incrementado 2 vezes. Então fica mais difícil saber exatamente o valor da primeira posição do buffer e procurar a região em que o buffer é preenchido, com a leitura do buffer primário (se é que no Philips tem isso).
De qualquer forma, a própria rotina que exibe a legenda possui um contador próprio para percorrer o buffer de legenda, de forma que é possível para você colocar um filtro de tags. Se olharmos novamente o trecho de leitura do caractere, podemos ver o contador:
ROM:0000E6F0 60 1C ADDS R0, R4, #1 ; adiciona 1 a R4, que é o contador, e guarda o valor em R0 para atualizar R4 depois.
ROM:0000E6F2 21 1C ADDS R1, R4, #0 ; temporariamente copia o valor atual do contador em R1
ROM:0000E6F4 75 5C LDRB R5, [R6,R1] ; le caractere, na posição atual R6+R1 = R6+R4
ROM:0000E6F6 00 06 LSLS R0, R0, #0x18 ; ainda não entendi essa sequencia, muito utilizada no ARM. a primeira multiplica R0 por 2^18
ROM:0000E6F8 00 0E LSRS R0, R0, #0x18 ; a segunda divide R0 por 2^18. R0 fica com o mesmo valor (R4 + 1). a utilidade deve ser zerar
; alguma flag ou truncar alguns bits de R0
ROM:0000E6FA 04 1C ADDS R4, R0, #0 ; o contador R4 é atualizado com o valor em R0, que é R4+1
ROM:0000E6FC 0D 2D CMP R5, #0xD ; caractere é quebra de linha?
A partir de ROM:0000E6F0, você pode tentar fazer algumas modificações, com um salto para uma rotina que filtra as tags. Segue um exemplo:
ROM:0000E6F0 21 1C ADDS R1, R4, #0 ; temporariamente copia o valor atual do contador em R1
ROM:0000E6F2 75 5C LDRB R5, [R6,R1] ; le caractere, na posição atual R6+R1 = R6+R4
ROM:0000E6F4 XX XX XX XX BL filtra_tag
ROM:0000E6F8 04 1C ADDS R4, R0, #0 ; o contador R4 é atualizado com o valor em R0, que é R4+1
ROM:0000E6FA 00 00 NOP ; pseudo nop
ROM:0000E6FC 0D 2D CMP R5, #0xD
....................................................................
....................................................................
3C 2D filtra_tag CMP R5, #0x3C ; caractere ="<"?
06 D1 BNE prossiga ; se não, vai embora
01 31 procura_fim_tag ADDS R1, R1, #1 ; se sim, atualiza contador para procurar fim da tag ">"
75 5C LDRB R5, [R6,R1]
3D 2D CMP R5, #0x3D ; caractere =">"?
FB D1 BNE procura_fim_tag ; se não, volta e continua procurando
01 31 ADDS R1, #1 ; se sim, atualiza contador para próximo caractere fora da tag
75 5C LDRB R5, [R6,R1]
F6 E7 B filtra_tag ; e se o próximo caractere for outra tag?
48 1C prossiga ADDS R0, R1, #1 ; atualiza contador em R0 para ser repassado a R4 depois
00 06 LSLS R0, R0, #0x18
00 0E LSLS R0, R0, #0x18
70 47 BX LR ; retorna
O problema dessa modificação é que ela considera que o buffer é infinito. Então, se tivermos uma tag enorme, por exemplo <akjkj............asas> maior que o buffer de legenda ou ainda se a tag começar em um quadro de legenda e só terminar em outro (são 2 situações bem raras, só uma legenda feita propositalmente com defeito teria isso), poderemos ter falhas na exibição da legenda. Caso queira evitar esse tipo de coisa, pode dar uma olhada no trecho que verifica o limite do contador R4:
ROM:0000E7D8 loc_E7D8 ; CODE XREF: sub_E64C:loc_E78E_j
ROM:0000E7D8 ; sub_E64C+14A_j ...
ROM:0000E7D8 03 98 LDR R0, [SP,#0x38+var_2C]
ROM:0000E7DA 84 42 CMP R4, R0
ROM:0000E7DC 88 D3 BCC loc_E6F0
Espero ter ajudado. Tudo isso é hipotético, pois precisa ser testado de fato.