Commit 9df4ce5e authored by Marco Gerards's avatar Marco Gerards

Make the Golomb decoder work for Dirac

Originally committed as revision 10119 to svn://svn.ffmpeg.org/ffmpeg/trunk
parent 6d324c81
...@@ -153,3 +153,21 @@ const int8_t ff_interleaved_se_golomb_vlc_code[256]={ ...@@ -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,
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]; ...@@ -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_golomb_vlc_len[256];
extern const uint8_t ff_interleaved_ue_golomb_vlc_code[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 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){ ...@@ -75,7 +76,6 @@ static inline int get_ue_golomb(GetBitContext *gb){
static inline int svq3_get_ue_golomb(GetBitContext *gb){ static inline int svq3_get_ue_golomb(GetBitContext *gb){
uint32_t buf; uint32_t buf;
int log;
OPEN_READER(re, gb); OPEN_READER(re, gb);
UPDATE_CACHE(re, gb); UPDATE_CACHE(re, gb);
...@@ -88,21 +88,24 @@ static inline int svq3_get_ue_golomb(GetBitContext *gb){ ...@@ -88,21 +88,24 @@ static inline int svq3_get_ue_golomb(GetBitContext *gb){
return ff_interleaved_ue_golomb_vlc_code[buf]; return ff_interleaved_ue_golomb_vlc_code[buf];
}else{ }else{
LAST_SKIP_BITS(re, gb, 8); int ret = 1;
UPDATE_CACHE(re, gb);
buf |= 1 | (GET_CACHE(re, gb) >> 8);
if((buf & 0xAAAAAAAA) == 0) while (1) {
return INVALID_VLC; buf >>= 32 - 8;
LAST_SKIP_BITS(re, gb, FFMIN(ff_interleaved_golomb_vlc_len[buf], 8));
for(log=31; (buf & 0x80000000) == 0; log--){ if (ff_interleaved_golomb_vlc_len[buf] != 9){
buf = (buf << 2) - ((buf << log) >> (log - 1)) + (buf >> 30); 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); CLOSE_READER(re, gb);
return ret - 1;
return ((buf << log) >> log) - 1;
} }
} }
...@@ -192,6 +195,24 @@ static inline int svq3_get_se_golomb(GetBitContext *gb){ ...@@ -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). * read unsigned golomb rice code (ffv1).
*/ */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment