Hi,
Jon Burgess wrote:
+bool cVideoRepacker::ScanDataForStartCodeFast(const uchar *&Data, const uchar *Limit) +{
- Limit--;
- while (Data < Limit) {
if (*Data > 0x01)
Data += 3;
else if (*Data == 0x00)
Data++;
else if (Data[-2] != 0x00 || Data[-1] != 0x00)
Data += 3;
else {
scanner = 0x00000100 | *++Data;
return true;
}
}
Did you consider using memchr()? e.g. something like ... while (Data < Limit) { Data = memchr(Data, 0x01, Limit - Data); if (Data == NULL) break; if (Data[-2] != 0x00 || Data[-1] != 0x00) Data += 3; ...
It makes no noticeable difference on my AMD64 machine (<1%), but maybe it is worth trying on your EPIA?
I don't think that it is worth a try as it tests every byte while the above code tests most of the time only every third byte.
Consider the following data:
hh ii jj kk [ 00 00 01 01 ] mm nn oo 01 01 pp 01 ^^^^^^^^^^^^^^^^^^^ ++++++++++^^^ ^ ^^ 6 4 0 1
which will give you the above distance between consecutive 01 which are not part of a startcode (i. e. first slice start code [ 00 00 01 01 ]) or immediately following a startcode (the area marked with +++++). ++ or ^^ indicate bytes which have to be considered for the distance.
For the above case, a statistical analysis will give this numbers:
distance: 0, count: 1 distance: 1, count: 1 distance: 2, count: 0 distance: 3, count: 0 distance: 4, count: 1 distance: 5, count: 0 distance: 6, count: 1 distance: >, count: 0
Now consider real data, like 001.vdr of "Wetten, dass ..?" which was broadcast last Saturday on ZDF:
distance: 0, count: 75248 distance: 1, count: 519949 distance: 2, count: 316632 distance: 3, count: 331874 distance: 4, count: 381855 distance: 5, count: 367280 distance: 6, count: 370620 distance: 7, count: 369649 distance: 8, count: 405861 distance: 9, count: 360555 distance: 10, count: 332593 distance: 11, count: 366192 distance: 12, count: 319692 distance: 13, count: 313795 distance: 14, count: 309567 distance: 15, count: 305986 distance: 16, count: 297510 distance: 17, count: 291607 distance: 18, count: 286045 distance: >, count: 18794252
As you can easily see, it's a waste of time to test every byte (= distance 0) for 01 as it is very unlikely to find one.
Bye.