mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
Optimize unpack_vectors() by not shuffling around redundant vectors.
Inspired by guidance from Dark Shikari. On a Core 2 Duo 2.0 GHz, this change decodes the 10-minute Big Buck Bunny 1080p short about 2 seconds faster. Originally committed as revision 20895 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
parent
b2cc8111d6
commit
e6e32bdc5f
@ -891,11 +891,6 @@ static int unpack_vectors(Vp3DecodeContext *s, GetBitContext *gb)
|
||||
motion_y[0] = fixed_motion_vector_table[get_bits(gb, 6)];
|
||||
}
|
||||
|
||||
for (k = 1; k < 6; k++) {
|
||||
motion_x[k] = motion_x[0];
|
||||
motion_y[k] = motion_y[0];
|
||||
}
|
||||
|
||||
/* vector maintenance, only on MODE_INTER_PLUS_MV */
|
||||
if (s->macroblock_coding[current_macroblock] ==
|
||||
MODE_INTER_PLUS_MV) {
|
||||
@ -946,10 +941,6 @@ static int unpack_vectors(Vp3DecodeContext *s, GetBitContext *gb)
|
||||
/* all 6 fragments use the last motion vector */
|
||||
motion_x[0] = last_motion_x;
|
||||
motion_y[0] = last_motion_y;
|
||||
for (k = 1; k < 6; k++) {
|
||||
motion_x[k] = motion_x[0];
|
||||
motion_y[k] = motion_y[0];
|
||||
}
|
||||
|
||||
/* no vector maintenance (last vector remains the
|
||||
* last vector) */
|
||||
@ -960,10 +951,6 @@ static int unpack_vectors(Vp3DecodeContext *s, GetBitContext *gb)
|
||||
* last motion vector */
|
||||
motion_x[0] = prior_last_motion_x;
|
||||
motion_y[0] = prior_last_motion_y;
|
||||
for (k = 1; k < 6; k++) {
|
||||
motion_x[k] = motion_x[0];
|
||||
motion_y[k] = motion_y[0];
|
||||
}
|
||||
|
||||
/* vector maintenance */
|
||||
prior_last_motion_x = last_motion_x;
|
||||
@ -974,8 +961,8 @@ static int unpack_vectors(Vp3DecodeContext *s, GetBitContext *gb)
|
||||
|
||||
default:
|
||||
/* covers intra, inter without MV, golden without MV */
|
||||
memset(motion_x, 0, 6 * sizeof(int));
|
||||
memset(motion_y, 0, 6 * sizeof(int));
|
||||
motion_x[0] = 0;
|
||||
motion_y[0] = 0;
|
||||
|
||||
/* no vector maintenance */
|
||||
break;
|
||||
@ -992,8 +979,13 @@ static int unpack_vectors(Vp3DecodeContext *s, GetBitContext *gb)
|
||||
current_fragment, s->fragment_count);
|
||||
return 1;
|
||||
}
|
||||
if (s->macroblock_coding[current_macroblock] == MODE_INTER_FOURMV) {
|
||||
s->all_fragments[current_fragment].motion_x = motion_x[k];
|
||||
s->all_fragments[current_fragment].motion_y = motion_y[k];
|
||||
} else {
|
||||
s->all_fragments[current_fragment].motion_x = motion_x[0];
|
||||
s->all_fragments[current_fragment].motion_y = motion_y[0];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user