Autor Tópico: Como remover as tags de itálico - Firmware jmaraujo v1.3  (Lida 30568 vezes)

0 Membros e 3 Visitantes estão vendo este tópico.

Offline rictad

  • Hacker Honorário
  • Colaboradores
  • Papagaio
  • *
  • Mensagens: 285
  • Aprovação: +59/-0
    • Ver Perfil
Como remover as tags de itálico - Firmware jmaraujo v1.3
« Online: Setembro 30, 2009, 07:44:26 pm »
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:

Código: [Selecionar]
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:

Código: [Selecionar]
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:

Código: [Selecionar]
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:

Código: [Selecionar]
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:

Código: [Selecionar]
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.
« Última modificação: Outubro 01, 2009, 09:02:51 pm por Jefferson »

Offline jmaraujo

  • Seeder
  • Colaboradores
  • Papagaio
  • *
  • Mensagens: 409
  • Aprovação: +41/-0
  • Saudações desde Rivera, Uruguay!!! ;)
    • Ver Perfil
    • Fórum DVP5100K
Itálico em SRT no Firmware jmaraujo v1.3
« Responder #1 Online: Setembro 30, 2009, 07:55:39 pm »
Obrigadão, rictad. :yahoo!: Ficou muito claro e bem explicadinho. ;)

Vou dar uma olhada hoje a noite... ;D
« Última modificação: Setembro 30, 2009, 07:57:34 pm por jmaraujo »

FORUM.RYAN.COM.BR

Itálico em SRT no Firmware jmaraujo v1.3
« Responder #1 Online: Setembro 30, 2009, 07:55:39 pm »

Offline rictad

  • Hacker Honorário
  • Colaboradores
  • Papagaio
  • *
  • Mensagens: 285
  • Aprovação: +59/-0
    • Ver Perfil
Itálico em SRT no Firmware jmaraujo v1.3
« Responder #2 Online: Setembro 30, 2009, 07:59:10 pm »
Ah, esqueci. Só para confirmar se aquele é o ponto exato em que o caractere exibido é lido (eu sei que o caractere é lido ali, só não tenho certeza se é para ser exibido ou para cálculos, como largura, espaçamento etc.), troque a instrução em #E6F4 para:

Código: [Selecionar]
ROM:0000E6F4 61 25                       MOVS    R5, 61     ; caractere "a"
Se na sua legenda aparecer somente a letra "a" como caractere, é o ponto certo. Se não, teremos que procurar outro ponto em que o caractere lido é enviado para exibição. Mas eu acho que é ali.  8)

Offline jmaraujo

  • Seeder
  • Colaboradores
  • Papagaio
  • *
  • Mensagens: 409
  • Aprovação: +41/-0
  • Saudações desde Rivera, Uruguay!!! ;)
    • Ver Perfil
    • Fórum DVP5100K
Itálico em SRT no Firmware jmaraujo v1.3
« Responder #3 Online: Setembro 30, 2009, 08:04:12 pm »
Ok, muito obrigado.

Offline jmaraujo

  • Seeder
  • Colaboradores
  • Papagaio
  • *
  • Mensagens: 409
  • Aprovação: +41/-0
  • Saudações desde Rivera, Uruguay!!! ;)
    • Ver Perfil
    • Fórum DVP5100K
Itálico em SRT no Firmware jmaraujo v1.3
« Responder #4 Online: Setembro 30, 2009, 08:20:06 pm »
Acho que você está certo. Isto é o que eu tenho analizado nesse endereço. Faz tanto tempo que fiz a análise que nem me lembrava direito:

Código: [Selecionar]
ROM:0000E6F0             ProcessNextChar
ROM:0000E6F0 60 1C                 ADD   R0, R4, #1
ROM:0000E6F2 21 1C                 ADD   R1, R4, #0
ROM:0000E6F4 75 5C                 LDRB  R5, [R6,R1]
ROM:0000E6F6 00 06                 LSL   R0, R0, #0x18
ROM:0000E6F8 00 0E                 LSR   R0, R0, #0x18
ROM:0000E6FA 04 1C                 ADD   R4, R0, #0
ROM:0000E6FC 0D 2D                 CMP   R5, #0xD
ROM:0000E6FE 1C D1                 BNE   ProcessCurrentChar
ROM:0000E700 60 1C                 ADD   R0, R4, #1
ROM:0000E702 00 06                 LSL   R0, R0, #0x18
ROM:0000E704 00 0E                 LSR   R0, R0, #0x18
ROM:0000E706 21 1C                 ADD   R1, R4, #0
ROM:0000E708 04 1C                 ADD   R4, R0, #0
ROM:0000E70A 70 5C                 LDRB  R0, [R6,R1]
ROM:0000E70C 0A 28                 CMP   R0, #0xA
ROM:0000E70E 3E D1                 BNE   JumpTO__Check_AllCharsDisplayed

Offline jmaraujo

  • Seeder
  • Colaboradores
  • Papagaio
  • *
  • Mensagens: 409
  • Aprovação: +41/-0
  • Saudações desde Rivera, Uruguay!!! ;)
    • Ver Perfil
    • Fórum DVP5100K
Itálico em SRT no Firmware jmaraujo v1.3
« Responder #5 Online: Setembro 30, 2009, 08:54:11 pm »
Ah, esqueci. Só para confirmar se aquele é o ponto exato em que o caractere exibido é lido (eu sei que o caractere é lido ali, só não tenho certeza se é para ser exibido ou para cálculos, como largura, espaçamento etc.), troque a instrução em #E6F4 para:

Código: [Selecionar]
ROM:0000E6F4 61 25                       MOVS    R5, 61     ; caractere "a"
Se na sua legenda aparecer somente a letra "a" como caractere, é o ponto certo. Se não, teremos que procurar outro ponto em que o caractere lido é enviado para exibição. Mas eu acho que é ali.  8)
Bem, o primeiro teste foi favorável: O texto exibido e um monte de "aaaaaaaaaaaaaaaaaaaa"...   :laugh:  Agora vou experimentar com o patch.  :)

Offline jmaraujo

  • Seeder
  • Colaboradores
  • Papagaio
  • *
  • Mensagens: 409
  • Aprovação: +41/-0
  • Saudações desde Rivera, Uruguay!!! ;)
    • Ver Perfil
    • Fórum DVP5100K
Itálico em SRT no Firmware jmaraujo v1.3
« Responder #6 Online: Setembro 30, 2009, 09:36:16 pm »
Infelizmente não funcionou... O player ficou travado com o seguinte texto na tela "úllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll". :(

Offline rictad

  • Hacker Honorário
  • Colaboradores
  • Papagaio
  • *
  • Mensagens: 285
  • Aprovação: +59/-0
    • Ver Perfil
Itálico em SRT no Firmware jmaraujo v1.3
« Responder #7 Online: Setembro 30, 2009, 10:09:18 pm »
Infelizmente não funcionou... O player ficou travado com o seguinte texto na tela "úllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll". :(

Bom, como o "a" passou no teste, então o ponto é ali mesmo.  8)

Deve haver algum erro na rotina. Algum detalhe. Mas o esquema é mais ou menos daquele jeito. Tenta ver como ficou no IDA depois da modificação, para ver se os códigos estão certos, se o BL ficou apontando para o endereço certo também e se os outros BRANCHS estão certos. Olha essas coisas, porque eu fiz o código de cabeça ;D. Vou conferir mais algumas coisas aqui.
« Última modificação: Setembro 30, 2009, 11:59:46 pm por rictad »

Offline rictad

  • Hacker Honorário
  • Colaboradores
  • Papagaio
  • *
  • Mensagens: 285
  • Aprovação: +59/-0
    • Ver Perfil
Itálico em SRT no Firmware jmaraujo v1.3
« Responder #8 Online: Setembro 30, 2009, 10:16:29 pm »
Achei um erro. Mas o código está certo. Na penúltima linha da rotina:
             00 0E                       LSLS    R0, R0, #0x18
 
deve ser:
             00 0E                       LSRS    R0, R0, #0x18

EDIT: Você também pode tentar trocar o NOP em #E6FA por um NOP mais confiável, como #46 #C0 (MOVS R8,R8, o mais usado como NOP, até o IDA chama de NOP) ou #1C #00 (MOVS R0,R0), pois não estou absolutamente certo de #00 #00 (LSLS R0,R0,#0) ser totalmente um NOP. Acho que uma vez isso me deu problemas, mas não tenho certeza.
« Última modificação: Outubro 01, 2009, 12:06:45 am por rictad »

Offline jmaraujo

  • Seeder
  • Colaboradores
  • Papagaio
  • *
  • Mensagens: 409
  • Aprovação: +41/-0
  • Saudações desde Rivera, Uruguay!!! ;)
    • Ver Perfil
    • Fórum DVP5100K
Itálico em SRT no Firmware jmaraujo v1.3
« Responder #9 Online: Outubro 01, 2009, 06:16:31 am »
Ok, rictad, achei um erro no meu patch. Mas ainda não está dando certo. Agora o player não trava mas somente exibe dois pontos nas falas da legenda "..".

Aqui estão as minhas mudanças:
Código: [Selecionar]
ROM:0000E6F0             ProcessNextChar
ROM:0000E6F0 21 1C                 ADD   R1, R4, #0
ROM:0000E6F2 75 5C                 LDRB  R5, [R6,R1]
ROM:0000E6F4 66 F0 7C FF           BL    Filtrado_de_Italicas
ROM:0000E6F8 04 1C                 ADD   R4, R0, #0
ROM:0000E6FA C0 46                 NOP
ROM:0000E6FC 0D 2D                 CMP   R5, #0xD
ROM:0000E6FE 1C D1                 BNE   ProcessCurrentChar
ROM:0000E700 60 1C                 ADD   R0, R4, #1
ROM:0000E702 00 06                 LSL   R0, R0, #0x18
ROM:0000E704 00 0E                 LSR   R0, R0, #0x18
ROM:0000E706 21 1C                 ADD   R1, R4, #0
ROM:0000E708 04 1C                 ADD   R4, R0, #0
ROM:0000E70A 70 5C                 LDRB  R0, [R6,R1]
ROM:0000E70C 0A 28                 CMP   R0, #0xA
ROM:0000E70E 3E D1                 BNE   JumpTO__Check_AllCharsDisplayed

E o patch:
Código: [Selecionar]
ROM:000755F0             Filtrado_de_Italicas
ROM:000755F0 3C 2D                 CMP   R5, #0x3C ; '<'
ROM:000755F2 06 D1                 BNE   Proseguir
ROM:000755F4
ROM:000755F4             Busca_End_Tag
ROM:000755F4 01 31                 ADD   R1, #1
ROM:000755F6 75 5C                 LDRB  R5, [R6,R1]
ROM:000755F8 3D 2D                 CMP   R5, #0x3D ; '='
ROM:000755FA FB D1                 BNE   Busca_End_Tag
ROM:000755FC 01 31                 ADD   R1, #1
ROM:000755FE 75 5C                 LDRB  R5, [R6,R1]
ROM:00075600 F6 E7                 B     Filtrado_de_Italicas
ROM:00075602             ; ---------------------------------------------------------------------------
ROM:00075602
ROM:00075602             Proseguir
ROM:00075602 48 1C                 ADD   R0, R1, #1
ROM:00075604 00 06                 LSL   R0, R0, #0x18
ROM:00075606 00 0E                 LSR   R0, R0, #0x18
ROM:00075608 70 47                 BX    LR
ROM:00075608             ; End of function Filtrado_de_Italicas

FORUM.RYAN.COM.BR

Itálico em SRT no Firmware jmaraujo v1.3
« Responder #9 Online: Outubro 01, 2009, 06:16:31 am »