mirror of
https://github.com/webmproject/libwebp.git
synced 2024-11-20 04:18:26 +01:00
Introduce Token buffer (unused for now)
Later, will be useful to collect stats and code bitstream in one single pass Change-Id: Icf866473958b5eff879e219dbb1d7e350f2268ba
This commit is contained in:
parent
5fa148f47c
commit
fd22104022
@ -85,6 +85,44 @@ static int FinalizeSkipProba(VP8Encoder* const enc) {
|
|||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// Token buffer
|
||||||
|
|
||||||
|
#ifdef USE_TOKEN_BUFFER
|
||||||
|
|
||||||
|
void VP8InitTBuffer(VP8TBuffer* const p) {
|
||||||
|
p->left_ = MAX_NUM_TOKEN;
|
||||||
|
p->error_ = 0;
|
||||||
|
p->next_ = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
int VP8AllocTBuffer(VP8TBuffer** const p) {
|
||||||
|
VP8TBuffer* const page = malloc(sizeof(*page));
|
||||||
|
if (page == NULL) {
|
||||||
|
(*p)->error_ |= 1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
VP8InitTBuffer(page);
|
||||||
|
(*p)->next_ = page;
|
||||||
|
*p = page;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int VP8EmitTokens(const VP8TBuffer* const p, VP8BitWriter* const bw,
|
||||||
|
const uint8_t* const probas) {
|
||||||
|
while (p != NULL) {
|
||||||
|
int n = MAX_NUM_TOKEN;
|
||||||
|
if (p->error_) return 0;
|
||||||
|
while (n-- > p->left) {
|
||||||
|
VP8PutBit(bw, (p->tokens_[n] >> 15) & 1, probas[p->tokens_[n] & 0x7fff]);
|
||||||
|
}
|
||||||
|
p = p->next_;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
// Recording of token probabilities.
|
// Recording of token probabilities.
|
||||||
|
|
||||||
|
@ -310,6 +310,35 @@ void VP8SetSkip(const VP8EncIterator* const it, int skip);
|
|||||||
void VP8SetSegment(const VP8EncIterator* const it, int segment);
|
void VP8SetSegment(const VP8EncIterator* const it, int segment);
|
||||||
void VP8IteratorResetCosts(VP8EncIterator* const it);
|
void VP8IteratorResetCosts(VP8EncIterator* const it);
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// Paginated token buffer
|
||||||
|
|
||||||
|
#ifdef USE_TOKEN_BUFFER
|
||||||
|
|
||||||
|
#define MAX_NUM_TOKEN 2030
|
||||||
|
|
||||||
|
typedef struct VP8TBuffer VP8TBuffer;
|
||||||
|
struct VP8TBuffer {
|
||||||
|
uint16_t tokens_[MAX_NUM_TOKEN]; // bit#15: bit, bits 0..14: slot idx
|
||||||
|
int left_;
|
||||||
|
int error_; // true in case of malloc error
|
||||||
|
VP8TBuffer* next_;
|
||||||
|
};
|
||||||
|
int VP8AllocTBuffer(VP8TBuffer** const p); // allocate a new page
|
||||||
|
void VP8InitTBuffer(VP8TBuffer* const p);
|
||||||
|
void VP8EmitTokens(const VP8TBuffer* const p, VP8BitWriter* const bw,
|
||||||
|
const uint8_t* const probas);
|
||||||
|
|
||||||
|
static WEBP_INLINE int VP8AddToken(VP8TBuffer** p, int bit, int proba_idx) {
|
||||||
|
if ((*p)->left_ > 0 || VP8AllocTBuffer(p)) {
|
||||||
|
const int slot = --(*p)->left_;
|
||||||
|
(*p)->tokens_[slot] = (bit << 15) | proba_idx;
|
||||||
|
}
|
||||||
|
return bit;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
// VP8Encoder
|
// VP8Encoder
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user