Mercurial > libdvdnav.hg
comparison decoder.c @ 114:b6834e6359cf src
big libdvdnav cleanup, quoting the ChangeLog:
* some bugfixes
* code cleanup
* build process polishing
* more sensible event order in get_next_block to ensure useful event delivery
* VOBU level resume
* fixed: seeking in a multiangle feature briefly showed the wrong angle
| author | mroi |
|---|---|
| date | Thu, 20 Feb 2003 15:32:21 +0000 |
| parents | 96707bfb63d7 |
| children | 5897ff629f7c |
comparison
equal
deleted
inserted
replaced
| 113:ec2df154be56 | 114:b6834e6359cf |
|---|---|
| 39 uint32_t vm_getbits(command_t *command, int start, int count) { | 39 uint32_t vm_getbits(command_t *command, int start, int count) { |
| 40 uint64_t result = 0; | 40 uint64_t result = 0; |
| 41 uint64_t bit_mask=0xffffffffffffffff; /* I could put -1 instead */ | 41 uint64_t bit_mask=0xffffffffffffffff; /* I could put -1 instead */ |
| 42 uint64_t examining = 0; | 42 uint64_t examining = 0; |
| 43 int32_t bits; | 43 int32_t bits; |
| 44 | |
| 44 if (count == 0) return 0; | 45 if (count == 0) return 0; |
| 45 | 46 |
| 46 if ( ((count+start) > 64) || | 47 if ( ((count+start) > 64) || |
| 47 (count > 32) || | 48 (count > 32) || |
| 48 (start > 63) || | 49 (start > 63) || |
| 49 (count < 0) || | 50 (count < 0) || |
| 50 (start < 0) ){ | 51 (start < 0) ) { |
| 51 fprintf(MSG_OUT, "libdvdnav: Bad call to vm_getbits. Parameter out of range\n"); | 52 fprintf(MSG_OUT, "libdvdnav: Bad call to vm_getbits. Parameter out of range\n"); |
| 52 assert(0); | 53 assert(0); |
| 53 } | 54 } |
| 54 bit_mask >>= start; | 55 bit_mask >>= start; |
| 55 bits = 64-count-start; | 56 bits = 64-count-start; |
| 99 SXXX_XXXX, where S is 1 if it is system register. */ | 100 SXXX_XXXX, where S is 1 if it is system register. */ |
| 100 static uint16_t eval_reg(command_t* command, uint8_t reg) { | 101 static uint16_t eval_reg(command_t* command, uint8_t reg) { |
| 101 if(reg & 0x80) { | 102 if(reg & 0x80) { |
| 102 if ((reg & 0x1f) == 20) { | 103 if ((reg & 0x1f) == 20) { |
| 103 fprintf(MSG_OUT, "libdvdnav: Suspected RCE Region Protection!!!"); | 104 fprintf(MSG_OUT, "libdvdnav: Suspected RCE Region Protection!!!"); |
| 104 } | 105 } |
| 105 return command->registers->SPRM[reg & 0x1f]; /* FIXME max 24 not 32 */ | 106 return command->registers->SPRM[reg & 0x1f]; /* FIXME max 24 not 32 */ |
| 106 } else { | 107 } else { |
| 107 return get_GPRM(command->registers, reg & 0x0f) ; | 108 return get_GPRM(command->registers, reg & 0x0f) ; |
| 108 } | 109 } |
| 109 } | 110 } |
| 568 } | 569 } |
| 569 | 570 |
| 570 return res; | 571 return res; |
| 571 } | 572 } |
| 572 | 573 |
| 573 /* Evaluate a set of commands in the given register set (which is | 574 /* Evaluate a set of commands in the given register set (which is modified) */ |
| 574 * modified */ | |
| 575 int32_t vmEval_CMD(vm_cmd_t commands[], int32_t num_commands, | 575 int32_t vmEval_CMD(vm_cmd_t commands[], int32_t num_commands, |
| 576 registers_t *registers, link_t *return_values) { | 576 registers_t *registers, link_t *return_values) { |
| 577 int32_t i = 0; | 577 int32_t i = 0; |
| 578 int32_t total = 0; | 578 int32_t total = 0; |
| 579 | 579 |
| 585 for(i = 0; i < num_commands; i++) | 585 for(i = 0; i < num_commands; i++) |
| 586 vmPrint_CMD(i, &commands[i]); | 586 vmPrint_CMD(i, &commands[i]); |
| 587 fprintf(MSG_OUT, "libdvdnav: --------------------------------------------\n"); | 587 fprintf(MSG_OUT, "libdvdnav: --------------------------------------------\n"); |
| 588 fprintf(MSG_OUT, "libdvdnav: Single stepping commands\n"); | 588 fprintf(MSG_OUT, "libdvdnav: Single stepping commands\n"); |
| 589 #endif | 589 #endif |
| 590 | |
| 590 i = 0; | 591 i = 0; |
| 591 while(i < num_commands && total < 100000) { | 592 while(i < num_commands && total < 100000) { |
| 592 int32_t line; | 593 int32_t line; |
| 593 | 594 |
| 594 #ifdef TRACE | 595 #ifdef TRACE |
| 595 vmPrint_CMD(i, &commands[i]); | 596 vmPrint_CMD(i, &commands[i]); |
| 596 #endif | 597 #endif |
| 598 | |
| 597 line = eval_command(&commands[i].bytes[0], registers, return_values); | 599 line = eval_command(&commands[i].bytes[0], registers, return_values); |
| 598 | 600 |
| 599 if (line < 0) { /* Link command */ | 601 if (line < 0) { /* Link command */ |
| 600 #ifdef TRACE | 602 #ifdef TRACE |
| 601 fprintf(MSG_OUT, "libdvdnav: Registers after transaction\n"); | 603 fprintf(MSG_OUT, "libdvdnav: Registers after transaction\n"); |
| 618 fprintf(MSG_OUT, "libdvdnav: Registers after transaction\n"); | 620 fprintf(MSG_OUT, "libdvdnav: Registers after transaction\n"); |
| 619 vmPrint_registers( registers ); | 621 vmPrint_registers( registers ); |
| 620 #endif | 622 #endif |
| 621 return 0; | 623 return 0; |
| 622 } | 624 } |
| 625 | |
| 626 #ifdef TRACE | |
| 623 | 627 |
| 624 static char *linkcmd2str(link_cmd_t cmd) { | 628 static char *linkcmd2str(link_cmd_t cmd) { |
| 625 switch(cmd) { | 629 switch(cmd) { |
| 626 case LinkNoLink: | 630 case LinkNoLink: |
| 627 return "LinkNoLink"; | 631 return "LinkNoLink"; |
| 760 fprintf(MSG_OUT, "\nlibdvdnav: Gtime: "); | 764 fprintf(MSG_OUT, "\nlibdvdnav: Gtime: "); |
| 761 for(i = 0; i < 16; i++) | 765 for(i = 0; i < 16; i++) |
| 762 fprintf(MSG_OUT, "%04lx|", registers->GPRM_time[i].tv_sec & 0xffff); | 766 fprintf(MSG_OUT, "%04lx|", registers->GPRM_time[i].tv_sec & 0xffff); |
| 763 fprintf(MSG_OUT, "\n"); | 767 fprintf(MSG_OUT, "\n"); |
| 764 } | 768 } |
| 769 | |
| 770 #endif | |
| 771 |
