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(&current_time, NULL); 68 gettimeofday(&current_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(&current_time, NULL); 91 gettimeofday(&current_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 }