mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-12 19:36:38 +00:00
63 lines
1.6 KiB
C
63 lines
1.6 KiB
C
|
/*
|
||
|
* gstvp8rangedecoder.c - VP8 range decoder interface
|
||
|
*
|
||
|
* Use of this source code is governed by a BSD-style license
|
||
|
* that can be found in the LICENSE file in the root of the source
|
||
|
* tree. An additional intellectual property rights grant can be found
|
||
|
* in the file PATENTS. All contributing project authors may
|
||
|
* be found in the AUTHORS file in the root of the source tree.
|
||
|
*/
|
||
|
|
||
|
#include "gstvp8rangedecoder.h"
|
||
|
#include "dboolhuff.h"
|
||
|
|
||
|
#define BOOL_DECODER_CAST(rd) \
|
||
|
((BOOL_DECODER *)(&(rd)->_gst_reserved[1]))
|
||
|
|
||
|
gboolean
|
||
|
gst_vp8_range_decoder_init (GstVp8RangeDecoder * rd, const guchar * buf,
|
||
|
guint buf_size)
|
||
|
{
|
||
|
BOOL_DECODER *const bd = BOOL_DECODER_CAST (rd);
|
||
|
|
||
|
g_return_val_if_fail (sizeof (rd->_gst_reserved) >= sizeof (*bd), FALSE);
|
||
|
|
||
|
rd->buf = buf;
|
||
|
rd->buf_size = buf_size;
|
||
|
return vp8dx_start_decode (bd, buf, buf_size, NULL, NULL) == 0;
|
||
|
}
|
||
|
|
||
|
gint
|
||
|
gst_vp8_range_decoder_read (GstVp8RangeDecoder * rd, guint8 prob)
|
||
|
{
|
||
|
return vp8dx_decode_bool (BOOL_DECODER_CAST (rd), prob);
|
||
|
}
|
||
|
|
||
|
gint
|
||
|
gst_vp8_range_decoder_read_literal (GstVp8RangeDecoder * rd, gint bits)
|
||
|
{
|
||
|
return vp8_decode_value (BOOL_DECODER_CAST (rd), bits);
|
||
|
}
|
||
|
|
||
|
guint
|
||
|
gst_vp8_range_decoder_get_pos (GstVp8RangeDecoder * rd)
|
||
|
{
|
||
|
BOOL_DECODER *const bd = BOOL_DECODER_CAST (rd);
|
||
|
|
||
|
return (bd->user_buffer - rd->buf) * 8 - (8 + bd->count);
|
||
|
}
|
||
|
|
||
|
void
|
||
|
gst_vp8_range_decoder_get_state (GstVp8RangeDecoder * rd,
|
||
|
GstVp8RangeDecoderState * state)
|
||
|
{
|
||
|
BOOL_DECODER *const bd = BOOL_DECODER_CAST (rd);
|
||
|
|
||
|
if (bd->count < 0)
|
||
|
vp8dx_bool_decoder_fill (bd);
|
||
|
|
||
|
state->range = bd->range;
|
||
|
state->value = (guint8) ((bd->value) >> (VP8_BD_VALUE_SIZE - 8));
|
||
|
state->count = (8 + bd->count) % 8;
|
||
|
}
|