@@ -1570,27 +1570,40 @@ uint32_t plm_buffer_tell(plm_buffer_t *self) {
1570
1570
}
1571
1571
1572
1572
void plm_buffer_discard_read_bytes (plm_buffer_t *self) {
1573
+ #ifndef NEW_WAY
1573
1574
size_t byte_pos = self->bit_index >> 3 ;
1574
1575
if (byte_pos == self->length ) {
1575
1576
self->bit_index = 0 ;
1576
1577
self->length = 0 ;
1577
- }
1578
- else if (byte_pos > 0 ) {
1578
+ } else if (byte_pos > 0 ) {
1579
1579
// This normally moves only the last 4 bytes; calling memmove is a waste of time
1580
- if (self->length - byte_pos < 8 ) {
1580
+ if (self->length - byte_pos < 16 ) {
1581
1581
uint8_t *d = self->bytes ;
1582
1582
uint8_t *s = &self->bytes [byte_pos];
1583
1583
uint8_t *pEnd = &self->bytes [self->length ];
1584
1584
while (s < pEnd) {
1585
1585
*d++ = *s++;
1586
1586
}
1587
- self->bit_index -= byte_pos << 3 ;
1588
- self->length -= byte_pos;
1589
- } else { // no need to move anything
1590
- byte_pos |= 0 ;
1591
- // memmove(self->bytes, self->bytes + byte_pos, self->length - byte_pos);
1587
+ } else {
1588
+ memmove (self->bytes , self->bytes + byte_pos, self->length - byte_pos);
1592
1589
}
1590
+ self->bit_index -= byte_pos << 3 ;
1591
+ self->length -= byte_pos;
1593
1592
}
1593
+ #else
1594
+ size_t byte_pos = self->bit_index >> 3 ;
1595
+ if (byte_pos >= self->length )
1596
+ {
1597
+ self->bit_index = 0 ;
1598
+ self->length = 0 ;
1599
+ }
1600
+ else if (byte_pos > 0 )
1601
+ {
1602
+ memmove (self->bytes , self->bytes + byte_pos, self->length - byte_pos);
1603
+ self->bit_index -= byte_pos << 3 ;
1604
+ self->length -= byte_pos;
1605
+ }
1606
+ #endif
1594
1607
}
1595
1608
1596
1609
void plm_buffer_load_file_callback (plm_buffer_t *self, void *user) {
@@ -2785,7 +2798,7 @@ struct plm_video_t {
2785
2798
int macroblock_intra;
2786
2799
2787
2800
int dc_predictor[3 ];
2788
-
2801
+
2789
2802
plm_buffer_t *buffer;
2790
2803
int destroy_buffer_when_done;
2791
2804
@@ -3285,7 +3298,7 @@ void plm_video_decode_macroblock(plm_video_t *self) {
3285
3298
self->macroblock_address ++;
3286
3299
}
3287
3300
3288
- self->mb_row = self->macroblock_address / self->mb_width ;
3301
+ self->mb_row = self->macroblock_address / self->mb_width ;
3289
3302
self->mb_col = self->macroblock_address % self->mb_width ;
3290
3303
3291
3304
if (self->mb_col >= self->mb_width || self->mb_row >= self->mb_height ) {
@@ -3531,13 +3544,13 @@ void plm_video_process_macroblock(
3531
3544
case 3 : // 2x2 average
3532
3545
{
3533
3546
int dest_scan = dw - block_size;
3534
- int a0, b0, a1, b1 ;
3547
+ int a0, b0;
3535
3548
for (int y = 0 ; y < block_size; y++) {
3536
- a0 = s[si]; a1 = s[si+dw];
3549
+ a0 = s[si] + s[si+dw];
3537
3550
for (int x = 0 ; x < block_size; x++) {
3538
- b0 = s[si+1 ]; b1 = s[si+dw+1 ];
3539
- d[di] = (a0+b0+a1+b1+ 2 )>>2 ;
3540
- a0 = b0; a1 = b1;
3551
+ b0 = s[si+1 ] + s[si+dw+1 ];
3552
+ d[di] = (a0+b0+2 )>>2 ;
3553
+ a0 = b0;
3541
3554
si++; di++;
3542
3555
} // for x
3543
3556
si += dest_scan;
@@ -3697,7 +3710,7 @@ void plm_video_decode_block(plm_video_t *self, int block) {
3697
3710
}
3698
3711
3699
3712
n += run;
3700
- if (n < 0 || n >= 64 ) {
3713
+ if (n >= 64 ) {
3701
3714
return ; // invalid
3702
3715
}
3703
3716
0 commit comments