Mercurial > libdvdnav.hg
comparison decoder.c @ 76:0e2abe7083de src
more consistent console output
| author | mroi |
|---|---|
| date | Tue, 27 Aug 2002 19:15:08 +0000 |
| parents | 8b08ee66cbff |
| children | e106f51eb8f5 |
comparison
equal
deleted
inserted
replaced
| 75:06cda03dc1e5 | 76:0e2abe7083de |
|---|---|
| 32 #include <string.h> /* For memset */ | 32 #include <string.h> /* For memset */ |
| 33 #include <dvdread/ifo_types.h> /* vm_cmd_t */ | 33 #include <dvdread/ifo_types.h> /* vm_cmd_t */ |
| 34 #include <assert.h> | 34 #include <assert.h> |
| 35 #include "vmcmd.h" | 35 #include "vmcmd.h" |
| 36 #include "decoder.h" | 36 #include "decoder.h" |
| 37 #include "dvdnav_internal.h" | |
| 37 | 38 |
| 38 uint32_t vm_getbits(command_t *command, int start, int count) { | 39 uint32_t vm_getbits(command_t *command, int start, int count) { |
| 39 uint64_t result = 0; | 40 uint64_t result = 0; |
| 40 uint64_t bit_mask=0xffffffffffffffff; /* I could put -1 instead */ | 41 uint64_t bit_mask=0xffffffffffffffff; /* I could put -1 instead */ |
| 41 uint64_t examining = 0; | 42 uint64_t examining = 0; |
| 45 if ( ((count+start) > 64) || | 46 if ( ((count+start) > 64) || |
| 46 (count > 32) || | 47 (count > 32) || |
| 47 (start > 63) || | 48 (start > 63) || |
| 48 (count < 0) || | 49 (count < 0) || |
| 49 (start < 0) ){ | 50 (start < 0) ){ |
| 50 fprintf(stderr, "Bad call to vm_getbits. Parameter out of range\n"); | 51 fprintf(MSG_OUT, "libdvdnav: Bad call to vm_getbits. Parameter out of range\n"); |
| 51 assert(0); | 52 assert(0); |
| 52 } | 53 } |
| 53 bit_mask >>= start; | 54 bit_mask >>= start; |
| 54 bits = 64-count-start; | 55 bits = 64-count-start; |
| 55 examining = ((bit_mask >> bits) << bits ); | 56 examining = ((bit_mask >> bits) << bits ); |
| 61 static uint16_t get_GPRM(registers_t* registers, uint8_t reg) { | 62 static uint16_t get_GPRM(registers_t* registers, uint8_t reg) { |
| 62 if (registers->GPRM_mode[reg] & 0x01) { | 63 if (registers->GPRM_mode[reg] & 0x01) { |
| 63 struct timeval current_time, time_offset; | 64 struct timeval current_time, time_offset; |
| 64 uint16_t result; | 65 uint16_t result; |
| 65 /* Counter mode */ | 66 /* Counter mode */ |
| 66 /* fprintf(stderr, "Getting counter %d\n",reg);*/ | 67 /* fprintf(MSG_OUT, "libdvdnav: Getting counter %d\n",reg);*/ |
| 67 gettimeofday(¤t_time, NULL); | 68 gettimeofday(¤t_time, NULL); |
| 68 time_offset.tv_sec = current_time.tv_sec - registers->GPRM_time[reg].tv_sec; | 69 time_offset.tv_sec = current_time.tv_sec - registers->GPRM_time[reg].tv_sec; |
| 69 time_offset.tv_usec = current_time.tv_usec - registers->GPRM_time[reg].tv_usec; | 70 time_offset.tv_usec = current_time.tv_usec - registers->GPRM_time[reg].tv_usec; |
| 70 if (time_offset.tv_usec < 0) { | 71 if (time_offset.tv_usec < 0) { |
| 71 time_offset.tv_sec--; | 72 time_offset.tv_sec--; |
| 84 | 85 |
| 85 static void set_GPRM(registers_t* registers, uint8_t reg, uint16_t value) { | 86 static void set_GPRM(registers_t* registers, uint8_t reg, uint16_t value) { |
| 86 if (registers->GPRM_mode[reg] & 0x01) { | 87 if (registers->GPRM_mode[reg] & 0x01) { |
| 87 struct timeval current_time; | 88 struct timeval current_time; |
| 88 /* Counter mode */ | 89 /* Counter mode */ |
| 89 /* fprintf(stderr, "Setting counter %d\n",reg); */ | 90 /* fprintf(MSG_OUT, "libdvdnav: Setting counter %d\n",reg); */ |
| 90 gettimeofday(¤t_time, NULL); | 91 gettimeofday(¤t_time, NULL); |
| 91 registers->GPRM_time[reg] = current_time; | 92 registers->GPRM_time[reg] = current_time; |
| 92 registers->GPRM_time[reg].tv_sec -= value; | 93 registers->GPRM_time[reg].tv_sec -= value; |
| 93 } | 94 } |
| 94 registers->GPRM[reg] = value; | 95 registers->GPRM[reg] = value; |
| 97 /* Eval register code, can either be system or general register. | 98 /* Eval register code, can either be system or general register. |
| 98 SXXX_XXXX, where S is 1 if it is system register. */ | 99 SXXX_XXXX, where S is 1 if it is system register. */ |
| 99 static uint16_t eval_reg(command_t* command, uint8_t reg) { | 100 static uint16_t eval_reg(command_t* command, uint8_t reg) { |
| 100 if(reg & 0x80) { | 101 if(reg & 0x80) { |
| 101 if ((reg & 0x1f) == 20) { | 102 if ((reg & 0x1f) == 20) { |
| 102 fprintf(stderr, "Suspected RCE Region Protection!!!"); | 103 fprintf(MSG_OUT, "libdvdnav: Suspected RCE Region Protection!!!"); |
| 103 } | 104 } |
| 104 return command->registers->SPRM[reg & 0x1f]; /* FIXME max 24 not 32 */ | 105 return command->registers->SPRM[reg & 0x1f]; /* FIXME max 24 not 32 */ |
| 105 } else { | 106 } else { |
| 106 return get_GPRM(command->registers, reg & 0x0f) ; | 107 return get_GPRM(command->registers, reg & 0x0f) ; |
| 107 } | 108 } |
| 147 case 6: | 148 case 6: |
| 148 return data1 <= data2; | 149 return data1 <= data2; |
| 149 case 7: | 150 case 7: |
| 150 return data1 < data2; | 151 return data1 < data2; |
| 151 } | 152 } |
| 152 fprintf(stderr,"eval_compare: Invalid comparison code\n"); | 153 fprintf(MSG_OUT, "libdvdnav: eval_compare: Invalid comparison code\n"); |
| 153 return 0; | 154 return 0; |
| 154 } | 155 } |
| 155 | 156 |
| 156 | 157 |
| 157 /* Evaluate if version 1. | 158 /* Evaluate if version 1. |
| 501 switch(vm_getbits(&command, 0, 3)) { /* three first old_bits */ | 502 switch(vm_getbits(&command, 0, 3)) { /* three first old_bits */ |
| 502 case 0: /* Special instructions */ | 503 case 0: /* Special instructions */ |
| 503 cond = eval_if_version_1(&command); | 504 cond = eval_if_version_1(&command); |
| 504 res = eval_special_instruction(&command, cond); | 505 res = eval_special_instruction(&command, cond); |
| 505 if(res == -1) { | 506 if(res == -1) { |
| 506 fprintf(stderr, "Unknown Instruction!\n"); | 507 fprintf(MSG_OUT, "libdvdnav: Unknown Instruction!\n"); |
| 507 assert(0); | 508 assert(0); |
| 508 } | 509 } |
| 509 break; | 510 break; |
| 510 case 1: /* Link/jump instructions */ | 511 case 1: /* Link/jump instructions */ |
| 511 if(vm_getbits(&command, 3, 1)) { | 512 if(vm_getbits(&command, 3, 1)) { |
| 553 res = eval_link_subins(&command, /*True*/ 1, return_values); | 554 res = eval_link_subins(&command, /*True*/ 1, return_values); |
| 554 if(res) | 555 if(res) |
| 555 res = -1; | 556 res = -1; |
| 556 break; | 557 break; |
| 557 default: /* Unknown command */ | 558 default: /* Unknown command */ |
| 558 fprintf(stderr, "WARNING: Unknown Command=%x\n", vm_getbits(&command, 0, 3)); | 559 fprintf(MSG_OUT, "libdvdnav: WARNING: Unknown Command=%x\n", vm_getbits(&command, 0, 3)); |
| 559 assert(0); | 560 assert(0); |
| 560 } | 561 } |
| 561 /* Check if there are bits not yet examined */ | 562 /* Check if there are bits not yet examined */ |
| 562 | 563 |
| 563 if(command.instruction & ~ command.examined) { | 564 if(command.instruction & ~ command.examined) { |
| 564 fprintf(stderr, " libdvdnav: decoder.c: [WARNING, unknown bits:"); | 565 fprintf(MSG_OUT, "libdvdnav: decoder.c: [WARNING, unknown bits:"); |
| 565 fprintf(stderr, " %08llx", (command.instruction & ~ command.examined) ); | 566 fprintf(MSG_OUT, " %08llx", (command.instruction & ~ command.examined) ); |
| 566 fprintf(stderr, "]"); | 567 fprintf(MSG_OUT, "]\n"); |
| 567 } | 568 } |
| 568 | 569 |
| 569 return res; | 570 return res; |
| 570 } | 571 } |
| 571 | 572 |
| 576 int32_t i = 0; | 577 int32_t i = 0; |
| 577 int32_t total = 0; | 578 int32_t total = 0; |
| 578 | 579 |
| 579 #ifdef TRACE | 580 #ifdef TRACE |
| 580 /* DEBUG */ | 581 /* DEBUG */ |
| 581 fprintf(stderr, "libdvdnav: Registers before transaction\n"); | 582 fprintf(MSG_OUT, "libdvdnav: Registers before transaction\n"); |
| 582 vmPrint_registers( registers ); | 583 vmPrint_registers( registers ); |
| 583 if(1) { | 584 int32_t i; |
| 584 int32_t i; | 585 fprintf(MSG_OUT, "libdvdnav: Full list of commands to execute\n"); |
| 585 fprintf(stderr, "libdvdnav: Full list of commands to execute\n"); | 586 for(i = 0; i < num_commands; i++) |
| 586 for(i = 0; i < num_commands; i++) | 587 vmPrint_CMD(i, &commands[i]); |
| 587 vmPrint_CMD(i, &commands[i]); | 588 fprintf(MSG_OUT, "libdvdnav: --------------------------------------------\n"); |
| 588 fprintf(stderr, "--------------------------------------------\n"); | 589 fprintf(MSG_OUT, "libdvdnav: Single stepping commands\n"); |
| 589 } /* end DEBUG */ | |
| 590 if (1) { | |
| 591 fprintf(stderr, "libdvdnav: Single stepping commands\n"); | |
| 592 } | |
| 593 #endif | 590 #endif |
| 594 | 591 |
| 595 while(i < num_commands && total < 100000) { | 592 while(i < num_commands && total < 100000) { |
| 596 int32_t line; | 593 int32_t line; |
| 597 | 594 |
| 598 #ifdef TRACE | 595 #ifdef TRACE |
| 599 if(1) vmPrint_CMD(i, &commands[i]); | 596 vmPrint_CMD(i, &commands[i]); |
| 600 #endif | 597 #endif |
| 601 line = eval_command(&commands[i].bytes[0], registers, return_values); | 598 line = eval_command(&commands[i].bytes[0], registers, return_values); |
| 602 | 599 |
| 603 if (line < 0) { /* Link command */ | 600 if (line < 0) { /* Link command */ |
| 604 #ifdef TRACE | 601 #ifdef TRACE |
| 605 fprintf(stderr, "libdvdnav: Registers after transaction\n"); | 602 fprintf(MSG_OUT, "libdvdnav: Registers after transaction\n"); |
| 606 vmPrint_registers( registers ); | 603 vmPrint_registers( registers ); |
| 607 fprintf(stderr, "eval: Doing Link/Jump/Call\n"); | 604 fprintf(MSG_OUT, "libdvdnav: eval: Doing Link/Jump/Call\n"); |
| 608 #endif | 605 #endif |
| 609 return 1; | 606 return 1; |
| 610 } | 607 } |
| 611 | 608 |
| 612 if (line > 0) /* Goto command */ | 609 if (line > 0) /* Goto command */ |
| 617 total++; | 614 total++; |
| 618 } | 615 } |
| 619 | 616 |
| 620 memset(return_values, 0, sizeof(link_t)); | 617 memset(return_values, 0, sizeof(link_t)); |
| 621 #ifdef TRACE | 618 #ifdef TRACE |
| 622 fprintf(stderr, "libdvdnav: Registers after transaction\n"); | 619 fprintf(MSG_OUT, "libdvdnav: Registers after transaction\n"); |
| 623 vmPrint_registers( registers ); | 620 vmPrint_registers( registers ); |
| 624 #endif | 621 #endif |
| 625 return 0; | 622 return 0; |
| 626 } | 623 } |
| 627 | 624 |
| 706 case LinkNextPGC: | 703 case LinkNextPGC: |
| 707 case LinkPrevPGC: | 704 case LinkPrevPGC: |
| 708 case LinkGoUpPGC: | 705 case LinkGoUpPGC: |
| 709 case LinkTailPGC: | 706 case LinkTailPGC: |
| 710 case LinkRSM: | 707 case LinkRSM: |
| 711 fprintf(stderr, "%s (button %d)\n", cmd, value.data1); | 708 fprintf(MSG_OUT, "libdvdnav: %s (button %d)\n", cmd, value.data1); |
| 712 break; | 709 break; |
| 713 case LinkPGCN: | 710 case LinkPGCN: |
| 714 case JumpTT: | 711 case JumpTT: |
| 715 case JumpVTS_TT: | 712 case JumpVTS_TT: |
| 716 case JumpSS_VMGM_MENU: /* == 2 -> Title Menu */ | 713 case JumpSS_VMGM_MENU: /* == 2 -> Title Menu */ |
| 717 case JumpSS_VMGM_PGC: | 714 case JumpSS_VMGM_PGC: |
| 718 fprintf(stderr, "%s %d\n", cmd, value.data1); | 715 fprintf(MSG_OUT, "libdvdnav: %s %d\n", cmd, value.data1); |
| 719 break; | 716 break; |
| 720 case LinkPTTN: | 717 case LinkPTTN: |
| 721 case LinkPGN: | 718 case LinkPGN: |
| 722 case LinkCN: | 719 case LinkCN: |
| 723 fprintf(stderr, "%s %d (button %d)\n", cmd, value.data1, value.data2); | 720 fprintf(MSG_OUT, "libdvdnav: %s %d (button %d)\n", cmd, value.data1, value.data2); |
| 724 break; | 721 break; |
| 725 case Exit: | 722 case Exit: |
| 726 case JumpSS_FP: | 723 case JumpSS_FP: |
| 727 case PlayThis: /* Humm.. should we have this at all.. */ | 724 case PlayThis: /* Humm.. should we have this at all.. */ |
| 728 fprintf(stderr, "%s\n", cmd); | 725 fprintf(MSG_OUT, "libdvdnav: %s\n", cmd); |
| 729 break; | 726 break; |
| 730 case JumpVTS_PTT: | 727 case JumpVTS_PTT: |
| 731 fprintf(stderr, "%s %d:%d\n", cmd, value.data1, value.data2); | 728 fprintf(MSG_OUT, "libdvdnav: %s %d:%d\n", cmd, value.data1, value.data2); |
| 732 break; | 729 break; |
| 733 case JumpSS_VTSM: | 730 case JumpSS_VTSM: |
| 734 fprintf(stderr, "%s vts %d title %d menu %d\n", | 731 fprintf(MSG_OUT, "libdvdnav: %s vts %d title %d menu %d\n", |
| 735 cmd, value.data1, value.data2, value.data3); | 732 cmd, value.data1, value.data2, value.data3); |
| 736 break; | 733 break; |
| 737 case CallSS_FP: | 734 case CallSS_FP: |
| 738 fprintf(stderr, "%s resume cell %d\n", cmd, value.data1); | 735 fprintf(MSG_OUT, "libdvdnav: %s resume cell %d\n", cmd, value.data1); |
| 739 break; | 736 break; |
| 740 case CallSS_VMGM_MENU: /* == 2 -> Title Menu */ | 737 case CallSS_VMGM_MENU: /* == 2 -> Title Menu */ |
| 741 case CallSS_VTSM: | 738 case CallSS_VTSM: |
| 742 fprintf(stderr, "%s %d resume cell %d\n", cmd, value.data1, value.data2); | 739 fprintf(MSG_OUT, "libdvdnav: %s %d resume cell %d\n", cmd, value.data1, value.data2); |
| 743 break; | 740 break; |
| 744 case CallSS_VMGM_PGC: | 741 case CallSS_VMGM_PGC: |
| 745 fprintf(stderr, "%s %d resume cell %d\n", cmd, value.data1, value.data2); | 742 fprintf(MSG_OUT, "libdvdnav: %s %d resume cell %d\n", cmd, value.data1, value.data2); |
| 746 break; | 743 break; |
| 747 } | 744 } |
| 748 } | 745 } |
| 749 | 746 |
| 750 void vmPrint_registers( registers_t *registers ) { | 747 void vmPrint_registers( registers_t *registers ) { |
| 751 int32_t i; | 748 int32_t i; |
| 752 fprintf(stderr, " # "); | 749 fprintf(MSG_OUT, "libdvdnav: # "); |
| 753 for(i = 0; i < 24; i++) | 750 for(i = 0; i < 24; i++) |
| 754 fprintf(stderr, " %2d |", i); | 751 fprintf(MSG_OUT, " %2d |", i); |
| 755 fprintf(stderr, "\nSRPMS: "); | 752 fprintf(MSG_OUT, "\nlibdvdnav: SRPMS: "); |
| 756 for(i = 0; i < 24; i++) | 753 for(i = 0; i < 24; i++) |
| 757 fprintf(stderr, "%04x|", registers->SPRM[i]); | 754 fprintf(MSG_OUT, "%04x|", registers->SPRM[i]); |
| 758 fprintf(stderr, "\nGRPMS: "); | 755 fprintf(MSG_OUT, "\nlibdvdnav: GRPMS: "); |
| 759 for(i = 0; i < 16; i++) | 756 for(i = 0; i < 16; i++) |
| 760 fprintf(stderr, "%04x|", get_GPRM(registers, i) ); | 757 fprintf(MSG_OUT, "%04x|", get_GPRM(registers, i) ); |
| 761 fprintf(stderr, "\nGmode: "); | 758 fprintf(MSG_OUT, "\nlibdvdnav: Gmode: "); |
| 762 for(i = 0; i < 16; i++) | 759 for(i = 0; i < 16; i++) |
| 763 fprintf(stderr, "%04x|", registers->GPRM_mode[i]); | 760 fprintf(MSG_OUT, "%04x|", registers->GPRM_mode[i]); |
| 764 fprintf(stderr, "\nGtime: "); | 761 fprintf(MSG_OUT, "\nlibdvdnav: Gtime: "); |
| 765 for(i = 0; i < 16; i++) | 762 for(i = 0; i < 16; i++) |
| 766 fprintf(stderr, "%04lx|", registers->GPRM_time[i].tv_sec & 0xffff); | 763 fprintf(MSG_OUT, "%04lx|", registers->GPRM_time[i].tv_sec & 0xffff); |
| 767 fprintf(stderr, "\n"); | 764 fprintf(MSG_OUT, "\n"); |
| 768 } | 765 } |
