1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2024-12-23 12:43:46 +02:00

dump the shady binary search logic (the part that binary searches

through unsorted data)

Originally committed as revision 1847 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
Mike Melanson 2003-05-10 16:06:33 +00:00
parent 89a79364ed
commit 0433188259

View File

@ -277,6 +277,11 @@ typedef struct Vp3DecodeContext {
* macroblock is coded. */
unsigned char *macroblock_coded;
int first_coded_y_fragment;
int first_coded_c_fragment;
int last_coded_y_fragment;
int last_coded_c_fragment;
} Vp3DecodeContext;
/************************************************************************
@ -1197,6 +1202,8 @@ static void unpack_superblocks(Vp3DecodeContext *s, GetBitContext *gb)
/* figure out which fragments are coded; iterate through each
* superblock (all planes) */
s->coded_fragment_list_index = 0;
s->first_coded_y_fragment = s->first_coded_c_fragment = 0;
s->last_coded_y_fragment = s->last_coded_c_fragment = -1;
memset(s->macroblock_coded, 0, s->macroblock_count);
for (i = 0; i < s->superblock_count; i++) {
@ -1225,8 +1232,14 @@ static void unpack_superblocks(Vp3DecodeContext *s, GetBitContext *gb)
/* mode will be decoded in the next phase */
s->all_fragments[current_fragment].coding_method =
MODE_INTER_NO_MV;
s->coded_fragment_list[s->coded_fragment_list_index++] =
s->coded_fragment_list[s->coded_fragment_list_index] =
current_fragment;
if ((current_fragment >= s->u_fragment_start) &&
(s->last_coded_y_fragment == -1)) {
s->first_coded_c_fragment = s->coded_fragment_list_index;
s->last_coded_y_fragment = s->first_coded_c_fragment - 1;
}
s->coded_fragment_list_index++;
s->macroblock_coded[s->all_fragments[current_fragment].macroblock] = 1;
debug_block_coding(" superblock %d is partially coded, fragment %d is coded\n",
i, current_fragment);
@ -1246,8 +1259,14 @@ static void unpack_superblocks(Vp3DecodeContext *s, GetBitContext *gb)
* coding will be determined in next step */
s->all_fragments[current_fragment].coding_method =
MODE_INTER_NO_MV;
s->coded_fragment_list[s->coded_fragment_list_index++] =
s->coded_fragment_list[s->coded_fragment_list_index] =
current_fragment;
if ((current_fragment >= s->u_fragment_start) &&
(s->last_coded_y_fragment == -1)) {
s->first_coded_c_fragment = s->coded_fragment_list_index;
s->last_coded_y_fragment = s->first_coded_c_fragment - 1;
}
s->coded_fragment_list_index++;
s->macroblock_coded[s->all_fragments[current_fragment].macroblock] = 1;
debug_block_coding(" superblock %d is fully coded, fragment %d is coded\n",
i, current_fragment);
@ -1255,6 +1274,18 @@ static void unpack_superblocks(Vp3DecodeContext *s, GetBitContext *gb)
}
}
}
if (s->first_coded_c_fragment == 0)
/* no C fragments coded */
s->last_coded_y_fragment = s->coded_fragment_list_index - 1;
else
s->last_coded_c_fragment = s->coded_fragment_list_index - 1;
debug_block_coding(" %d total coded fragments, y: %d -> %d, c: %d -> %d\n",
s->coded_fragment_list_index,
s->first_coded_y_fragment,
s->last_coded_y_fragment,
s->first_coded_c_fragment,
s->last_coded_c_fragment);
}
/*
@ -1565,7 +1596,7 @@ static int unpack_vlcs(Vp3DecodeContext *s, GetBitContext *gb,
DCTELEM coeff;
Vp3Fragment *fragment;
for (i = first_fragment; i < last_fragment; i++) {
for (i = first_fragment; i <= last_fragment; i++) {
fragment = &s->all_fragments[s->coded_fragment_list[i]];
if (fragment->coeff_count > coeff_index)
@ -1610,42 +1641,6 @@ static void unpack_dct_coeffs(Vp3DecodeContext *s, GetBitContext *gb)
int ac_c_table;
int residual_eob_run = 0;
/* for the binary search */
int left, middle, right, found;
/* this indicates the first fragment of the color plane data */
int plane_split = 0;
debug_vp3(" vp3: unpacking DCT coefficients\n");
/* find the plane split (the first color plane fragment) using a binary
* search; test the boundaries first */
if (s->coded_fragment_list_index == 0)
return;
if (s->u_fragment_start <= s->coded_fragment_list[0])
plane_split = 0; /* this means no Y fragments */
else if (s->coded_fragment_list[s->coded_fragment_list_index - 1] >
s->u_fragment_start) {
left = 0;
right = s->coded_fragment_list_index - 1;
found = 0;
do {
middle = (left + right + 1) / 2;
if ((s->coded_fragment_list[middle] >= s->u_fragment_start) &&
(s->coded_fragment_list[middle - 1] < s->u_fragment_start))
found = 1;
else if (s->coded_fragment_list[middle] < s->u_fragment_start)
left = middle;
else
right = middle;
} while (!found);
plane_split = middle;
}
debug_vp3(" plane split @ index %d (fragment %d)\n", plane_split,
s->coded_fragment_list[plane_split]);
/* fetch the DC table indices */
dc_y_table = get_bits(gb, 4);
dc_c_table = get_bits(gb, 4);
@ -1654,13 +1649,13 @@ static void unpack_dct_coeffs(Vp3DecodeContext *s, GetBitContext *gb)
debug_vp3(" vp3: unpacking Y plane DC coefficients using table %d\n",
dc_y_table);
residual_eob_run = unpack_vlcs(s, gb, &s->dc_vlc[dc_y_table], 0,
0, plane_split, residual_eob_run);
s->first_coded_y_fragment, s->last_coded_y_fragment, residual_eob_run);
/* unpack the C plane DC coefficients */
debug_vp3(" vp3: unpacking C plane DC coefficients using table %d\n",
dc_c_table);
residual_eob_run = unpack_vlcs(s, gb, &s->dc_vlc[dc_c_table], 0,
plane_split, s->coded_fragment_list_index, residual_eob_run);
s->first_coded_c_fragment, s->last_coded_c_fragment, residual_eob_run);
/* fetch the AC table indices */
ac_y_table = get_bits(gb, 4);
@ -1672,12 +1667,12 @@ static void unpack_dct_coeffs(Vp3DecodeContext *s, GetBitContext *gb)
debug_vp3(" vp3: unpacking level %d Y plane AC coefficients using table %d\n",
i, ac_y_table);
residual_eob_run = unpack_vlcs(s, gb, &s->ac_vlc_1[ac_y_table], i,
0, plane_split, residual_eob_run);
s->first_coded_y_fragment, s->last_coded_y_fragment, residual_eob_run);
debug_vp3(" vp3: unpacking level %d C plane AC coefficients using table %d\n",
i, ac_c_table);
residual_eob_run = unpack_vlcs(s, gb, &s->ac_vlc_1[ac_c_table], i,
plane_split, s->coded_fragment_list_index, residual_eob_run);
s->first_coded_c_fragment, s->last_coded_c_fragment, residual_eob_run);
}
/* unpack the group 2 AC coefficients (coeffs 6-14) */
@ -1686,12 +1681,12 @@ static void unpack_dct_coeffs(Vp3DecodeContext *s, GetBitContext *gb)
debug_vp3(" vp3: unpacking level %d Y plane AC coefficients using table %d\n",
i, ac_y_table);
residual_eob_run = unpack_vlcs(s, gb, &s->ac_vlc_2[ac_y_table], i,
0, plane_split, residual_eob_run);
s->first_coded_y_fragment, s->last_coded_y_fragment, residual_eob_run);
debug_vp3(" vp3: unpacking level %d C plane AC coefficients using table %d\n",
i, ac_c_table);
residual_eob_run = unpack_vlcs(s, gb, &s->ac_vlc_2[ac_c_table], i,
plane_split, s->coded_fragment_list_index, residual_eob_run);
s->first_coded_c_fragment, s->last_coded_c_fragment, residual_eob_run);
}
/* unpack the group 3 AC coefficients (coeffs 15-27) */
@ -1700,12 +1695,12 @@ static void unpack_dct_coeffs(Vp3DecodeContext *s, GetBitContext *gb)
debug_vp3(" vp3: unpacking level %d Y plane AC coefficients using table %d\n",
i, ac_y_table);
residual_eob_run = unpack_vlcs(s, gb, &s->ac_vlc_3[ac_y_table], i,
0, plane_split, residual_eob_run);
s->first_coded_y_fragment, s->last_coded_y_fragment, residual_eob_run);
debug_vp3(" vp3: unpacking level %d C plane AC coefficients using table %d\n",
i, ac_c_table);
residual_eob_run = unpack_vlcs(s, gb, &s->ac_vlc_3[ac_c_table], i,
plane_split, s->coded_fragment_list_index, residual_eob_run);
s->first_coded_c_fragment, s->last_coded_c_fragment, residual_eob_run);
}
/* unpack the group 4 AC coefficients (coeffs 28-63) */
@ -1714,12 +1709,12 @@ static void unpack_dct_coeffs(Vp3DecodeContext *s, GetBitContext *gb)
debug_vp3(" vp3: unpacking level %d Y plane AC coefficients using table %d\n",
i, ac_y_table);
residual_eob_run = unpack_vlcs(s, gb, &s->ac_vlc_4[ac_y_table], i,
0, plane_split, residual_eob_run);
s->first_coded_y_fragment, s->last_coded_y_fragment, residual_eob_run);
debug_vp3(" vp3: unpacking level %d C plane AC coefficients using table %d\n",
i, ac_c_table);
residual_eob_run = unpack_vlcs(s, gb, &s->ac_vlc_4[ac_c_table], i,
plane_split, s->coded_fragment_list_index, residual_eob_run);
s->first_coded_c_fragment, s->last_coded_c_fragment, residual_eob_run);
}
}