Use libc qsort to sort ODML index.

Based on patch by phillip at phdcam dot com


git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@14298 b3059339-0415-0410-9bf9-f77b7e298cf2
This commit is contained in:
reimar 2005-01-02 14:29:43 +00:00
parent e9a2cd5738
commit e73aadd97b
1 changed files with 5 additions and 40 deletions

View File

@ -44,45 +44,10 @@ static int odml_get_vstream_id(int id, unsigned char res[])
return 0;
}
/**
* Simple quicksort for AVIINDEXENTRYs
* To avoid too deep recursion, the bigger part is handled iteratively,
* thus limiting recursion to log2(n) levels.
* The pivot element is randomized to "even out" otherwise extreme cases.
*/
static void avi_idx_quicksort(AVIINDEXENTRY *idx, int from, int to)
{
AVIINDEXENTRY temp;
int lo;
int hi;
off_t pivot_ofs;
int pivot_idx;
while (from < to) {
pivot_idx = from;
pivot_idx += rand() % (to - from + 1);
pivot_ofs = AVI_IDX_OFFSET(&idx[pivot_idx]);
lo = to;
hi = from;
do {
while(pivot_ofs < AVI_IDX_OFFSET(&idx[lo])) lo--;
while(pivot_ofs > AVI_IDX_OFFSET(&idx[hi])) hi++;
if(hi <= lo) {
if (hi != lo) {
memcpy(&temp, &idx[lo], sizeof(temp));
memcpy(&idx[lo], &idx[hi], sizeof(temp));
memcpy(&idx[hi], &temp, sizeof(temp));
}
lo--; hi++;
}
} while (lo >= hi);
if ((lo - from) < (to - hi)) {
avi_idx_quicksort(idx, from, lo);
from = hi;
} else {
avi_idx_quicksort(idx, hi, to);
to = lo;
}
}
int avi_idx_cmp(const void *elem1,const void *elem2) {
register off_t a = AVI_IDX_OFFSET((AVIINDEXENTRY *)elem1);
register off_t b = AVI_IDX_OFFSET((AVIINDEXENTRY *)elem2);
return (a > b) - (b > a);
}
void read_avi_header(demuxer_t *demuxer,int index_mode){
@ -535,7 +500,7 @@ if (priv->isodml && (index_mode==-1 || index_mode==0)) {
}
}
}
avi_idx_quicksort(priv->idx, 0, priv->idx_size-1);
qsort(priv->idx, priv->idx_size, sizeof(AVIINDEXENTRY), avi_idx_cmp);
/*
Hack to work around a "wrong" index in some divx odml files