mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2024-12-29 10:52:20 +00:00
Make the Golomb decoder work for Dirac
Originally committed as revision 10119 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
parent
6d324c813f
commit
9df4ce5e5b
@ -153,3 +153,21 @@ const int8_t ff_interleaved_se_golomb_vlc_code[256]={
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
};
|
||||
|
||||
const uint8_t ff_interleaved_dirac_golomb_vlc_code[256]={
|
||||
0, 1, 0, 0, 2, 3, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
4, 5, 2, 2, 6, 7, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
8, 9, 4, 4, 10,11,5, 5, 2, 2, 2, 2, 2, 2, 2, 2,
|
||||
12,13,6, 6, 14,15,7, 7, 3, 3, 3, 3, 3, 3, 3, 3,
|
||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,};
|
||||
|
@ -43,6 +43,7 @@ extern const uint8_t ff_ue_golomb_len[256];
|
||||
extern const uint8_t ff_interleaved_golomb_vlc_len[256];
|
||||
extern const uint8_t ff_interleaved_ue_golomb_vlc_code[256];
|
||||
extern const int8_t ff_interleaved_se_golomb_vlc_code[256];
|
||||
extern const uint8_t ff_interleaved_dirac_golomb_vlc_code[256];
|
||||
|
||||
|
||||
/**
|
||||
@ -75,7 +76,6 @@ static inline int get_ue_golomb(GetBitContext *gb){
|
||||
|
||||
static inline int svq3_get_ue_golomb(GetBitContext *gb){
|
||||
uint32_t buf;
|
||||
int log;
|
||||
|
||||
OPEN_READER(re, gb);
|
||||
UPDATE_CACHE(re, gb);
|
||||
@ -88,21 +88,24 @@ static inline int svq3_get_ue_golomb(GetBitContext *gb){
|
||||
|
||||
return ff_interleaved_ue_golomb_vlc_code[buf];
|
||||
}else{
|
||||
LAST_SKIP_BITS(re, gb, 8);
|
||||
UPDATE_CACHE(re, gb);
|
||||
buf |= 1 | (GET_CACHE(re, gb) >> 8);
|
||||
int ret = 1;
|
||||
|
||||
if((buf & 0xAAAAAAAA) == 0)
|
||||
return INVALID_VLC;
|
||||
while (1) {
|
||||
buf >>= 32 - 8;
|
||||
LAST_SKIP_BITS(re, gb, FFMIN(ff_interleaved_golomb_vlc_len[buf], 8));
|
||||
|
||||
for(log=31; (buf & 0x80000000) == 0; log--){
|
||||
buf = (buf << 2) - ((buf << log) >> (log - 1)) + (buf >> 30);
|
||||
if (ff_interleaved_golomb_vlc_len[buf] != 9){
|
||||
ret <<= (ff_interleaved_golomb_vlc_len[buf] - 1) >> 1;
|
||||
ret |= ff_interleaved_dirac_golomb_vlc_code[buf];
|
||||
break;
|
||||
}
|
||||
ret = (ret << 4) | ff_interleaved_dirac_golomb_vlc_code[buf];
|
||||
UPDATE_CACHE(re, gb);
|
||||
buf = GET_CACHE(re, gb);
|
||||
}
|
||||
|
||||
LAST_SKIP_BITS(re, gb, 63 - 2*log - 8);
|
||||
CLOSE_READER(re, gb);
|
||||
|
||||
return ((buf << log) >> log) - 1;
|
||||
return ret - 1;
|
||||
}
|
||||
}
|
||||
|
||||
@ -192,6 +195,24 @@ static inline int svq3_get_se_golomb(GetBitContext *gb){
|
||||
}
|
||||
}
|
||||
|
||||
static inline int dirac_get_se_golomb(GetBitContext *gb){
|
||||
uint32_t buf;
|
||||
uint32_t ret;
|
||||
|
||||
ret = svq3_get_ue_golomb(gb);
|
||||
|
||||
if (ret) {
|
||||
OPEN_READER(re, gb);
|
||||
UPDATE_CACHE(re, gb);
|
||||
buf = SHOW_SBITS(re, gb, 1);
|
||||
LAST_SKIP_BITS(re, gb, 1);
|
||||
ret = (ret ^ buf) - buf;
|
||||
CLOSE_READER(re, gb);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* read unsigned golomb rice code (ffv1).
|
||||
*/
|
||||
|
Loading…
Reference in New Issue
Block a user