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

0 Membros e 1 Visitante estão vendo este tópico.

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 #10 Online: Outubro 01, 2009, 12:23:52 pm »
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 "..".

Mas esses pontos aparecem em qualquer trecho ou só quando há alguma tag?

Descobri outro erro no código que te passei:

ROM:000755F8 3D 2D                 CMP   R5, #0x3D ; '='

Na verdade, deve ser:

ROM:000755F8 3E 2D                 CMP   R5, #0x3E ; '>'   ; fim da tag

Aos poucos a gente vai acertando.

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 #11 Online: Outubro 01, 2009, 03:53:12 pm »
Faça o seguinte teste. Volte o trecho da rotina ao original e depois apenas tire as instruções de deslocamento. Assim:

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 C0 46                       NOP
ROM:0000E6F8 C0 46                       NOP
ROM:0000E6FA 04 1C                       ADDS    R4, R0, #0
ROM:0000E6FC 0D 2D                       CMP     R5, #0xD
ROM:0000E6FE 1C D1                       BNE     loc_E73A


Vamos ver como isso afeta a legenda. Caso haja anomalias, como os pontos "..", pode ser que tenha faltado tratar melhor esses deslocamentos na rotina filtro.

FORUM.RYAN.COM.BR

Itálico em SRT no Firmware jmaraujo v1.3
« Responder #11 Online: Outubro 01, 2009, 03:53:12 pm »

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 #12 Online: Outubro 01, 2009, 05:41:33 pm »
Agora sim deu certo, rictad! :yahoo!:

Trocando o byte 3D (=) pelo 3E (>) o filtro funciona, mas com uma pequena ressalva: a legenda fica um pouco deslocada para a esquerda, como na seguinte imagem:



Ainda não fiz o segundo teste.

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 #13 Online: Outubro 01, 2009, 05:58:13 pm »
Não precisa fazer o outro teste não. Já que funcionou, não fará diferença. 8)

Com relação ao deslocamento, eu acho que sei o motivo. É devido ao(s) trecho(s) que calcula(m) a largura da linha para poder centralizar. Provavelmente o buffer de legenda é lido novamente, mas com as tags. Aí a legenda é centralizada levando as tags em consideração. Como não foi possível identificar o local do buffer primário (se o patch fosse feito lá, isso não aconteceria, pois o buffer secundário já ficaria sem as tags) a gente terá que identificar em que momento essa outra leitura é feita para fazer mais um patch. Certamente tem a ver com as rotinas SUB_CalcLineStartPosX ou SUB_GetCharWidth (ou ambas) que você já identificou.

Não sei se você já percebeu, mas isso tornou possível implementar o itálico light que o zeurt propôs no tópico do firmware do LG DV256k. ;)

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 #14 Online: Outubro 01, 2009, 06:10:14 pm »
Acho que tem de ser em SUB_CalcTextLineWidth. A rotina SUB_GetCharWidth faz parte do patch do wordwrap (o patch do Danny Moroz) e não do firmware original.

No meu patch de quebra de linhas eu tive que copiar boa parte dessa rutina (SUB_CalcTextLineWidth).

Esta parte de SUB_CalcTextLineWidth foi reutilizada no patch do wordwrap (a partir de ROM:00075386).
Código: [Selecionar]
ROM:0000E3D4 34 49                  LDR     R1, =PB_B_Storage
ROM:0000E3D6 33 48                  LDR     R0, =unk_79FF0
ROM:0000E3D8 09 78                  LDRB    R1, [R1]
ROM:0000E3DA 00 68                  LDR     R0, [R0]
ROM:0000E3DC A1 23                  MOV     R3, #0xA1 ; 'í'
ROM:0000E3DE 40 5C                  LDRB    R0, [R0,R1]
ROM:0000E3E0 1B 01                  LSL     R3, R3, #4
ROM:0000E3E2 32 49                  LDR     R1, =unk_79FEC
ROM:0000E3E4 58 43                  MUL     R0, R3
ROM:0000E3E6 09 68                  LDR     R1, [R1]
ROM:0000E3E8 40 18                  ADD     R0, R0, R1
ROM:0000E3EA 80 19                  ADD     R0, R0, R6
ROM:0000E3EC 00 7C                  LDRB    R0, [R0,#0x10]

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 #15 Online: Outubro 01, 2009, 06:24:01 pm »
Acho que tem de ser em SUB_CalcTextLineWidth.

Isso, é ela mesma! Está lá o ponto em que o buffer é lido novamente. É só fazer um patch parecido e pronto. Acho que vai centralizar. Depois eu posto o patch aqui.

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 #16 Online: Outubro 01, 2009, 06:27:57 pm »
Algumas mudanças que eu fiz no patch do wordwrap:

Antes:
Código: [Selecionar]
ROM:0000E66E             Display_subtitle
ROM:0000E66E 30 78                 LDRB  R0, [R6]
ROM:0000E670 01 36                 ADD   R6, #1
ROM:0000E672 03 90                 STR   R0, [SP,#0x38+SubtitleTextLength]
ROM:0000E674 03 98                 LDR   R0, [SP,#0x38+SubtitleTextLength]
ROM:0000E676 FF 28                 CMP   R0, #0xFF
ROM:0000E678 01 D9                 BLS   loc_E67E
ROM:0000E67A FF 20                 MOV   R0, #0xFF
ROM:0000E67C 03 90                 STR   R0, [SP,#0x38+SubtitleTextLength]
ROM:0000E67E
ROM:0000E67E             loc_E67E
ROM:0000E67E 03 99                 LDR   R1, [SP,#0x38+SubtitleTextLength]   <-- O código foi mudado daqui
ROM:0000E680 00 20                 MOV   R0, #0
ROM:0000E682 70 54                 STRB  R0, [R6,R1]                         <-- até aqui
ROM:0000E684 30 1C                 ADD   R0, R6, #0

Depois:
Código: [Selecionar]
ROM:0000E66E             Display_subtitle
ROM:0000E66E 30 78                 LDRB  R0, [R6]
ROM:0000E670 01 36                 ADD   R6, #1
ROM:0000E672 03 90                 STR   R0, [SP,#0x38+SubtitleTextLength]
ROM:0000E674 03 98                 LDR   R0, [SP,#0x38+SubtitleTextLength]
ROM:0000E676 FF 28                 CMP   R0, #0xFF
ROM:0000E678 01 D9                 BLS   loc_E67E
ROM:0000E67A FF 20                 MOV   R0, #0xFF
ROM:0000E67C 03 90                 STR   R0, [SP,#0x38+SubtitleTextLength]
ROM:0000E67E
ROM:0000E67E             loc_E67E
ROM:0000E67E 69 46                 MOV   R1, SP
ROM:0000E680 0C 31                 ADD   R1, #0xC
ROM:0000E682 C0 46                 NOP
ROM:0000E684 30 1C                 ADD   R0, R6, #0

Outra coisa interessante que diz no documento do wordwrap: "For stack variable SubtitleTextLength find it's offset from SP."
Código: [Selecionar]
   LDR     R0, [SP,#0x30+SubtitleTextLength]No meu player o Offset = C

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 #17 Online: Outubro 01, 2009, 06:42:53 pm »
O segundo patch pode ser assim:

Código: [Selecionar]
ROM:0000E39C 21 1C                       ADDS    R1, R4, #0       ; temporariamente copia o valor atual do contador em R1
ROM:0000E39E 7E 5C                       LDRB    R6, [R7,R1]      ; le caractere, na posição atual R7+R1 = R7+R4
ROM:0000E3A0 XX XX XX XX                 BL      filtra_tag2
ROM:0000E3A4 04 1C                       ADDS    R4, R0, #0       ; o contador R4 é atualizado com o valor em R0, que é R4+1
ROM:0000E3A6 C0 46                       NOP                      ; pseudo nop
ROM:0000E3A8 00 2E                       CMP     R6, #0
....................................................................
....................................................................
             3C 2E    filtra_tag2        CMP     R6, #0x3C        ; caractere ="<"?
             06 D1                       BNE prossiga2             ; se não, vai embora
             01 31    procura_fim_tag2   ADDS    R1, R1, #1       ; se sim, atualiza contador para procurar fim da tag ">"
             7E 5C                       LDRB    R6, [R7,R1]
             3E 2E                       CMP     R6, #0x3E        ; caractere =">"?
             FB D1                       BNE procura_fim_tag2      ; se não, volta e continua procurando
             01 31                       ADDS    R1, #1           ; se sim, atualiza contador para próximo caractere fora da tag
             7E 5C                       LDRB    R6, [R7,R1]
             F6 E7                       B filtra_tag2             ; e se o próximo caractere for outra tag?
             48 1C   prossiga2           ADDS    R0, R1, #1       ; atualiza contador em R0 para ser repassado a R4 depois
             00 06                       LSLS    R0, R0, #0x18
             00 0E                       LSRS    R0, R0, #0x18
             70 47                       BX LR                    ; retorna

Veja que agora o buffer está em R7 e é lido em R6. Só confere os códigos do IDA antes, porque fazer isso na mão às vezes falha...  ;D
Se der tudo certo, a legenda estará centralizada mesmo quando houver tags escondidas.

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 #18 Online: Outubro 01, 2009, 06:52:09 pm »
Outra coisa interessante que diz no documento do wordwrap: "For stack variable SubtitleTextLength find it's offset from SP."
Código: [Selecionar]
   LDR     R0, [SP,#0x30+SubtitleTextLength]No meu player o Offset = C

Certo, vi a modificação aqui:

Código: [Selecionar]
ROM:0000E67E 69 46                       MOV     R1, SP
ROM:0000E680 0C 31                       ADDS    R1, #0xC

Mas como você descobriu esse offset? No original era assim:

Código: [Selecionar]
ROM:0000E67E 03 99                 LDR   R1, [SP,#0x38+SubtitleTextLength]
Como é possível saber o valor do offset guardado nessas variáveis somadas a SP? No IDA eu nunca consegui descobrir....

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 #19 Online: Outubro 01, 2009, 07:03:48 pm »
Faça clique com a tecla direita do mouse sobre o texto SubtitleTextLenght e esolha a opção #16. Ou faça clique no texto e presione a tecla "Q".

FORUM.RYAN.COM.BR

Itálico em SRT no Firmware jmaraujo v1.3
« Responder #19 Online: Outubro 01, 2009, 07:03:48 pm »