Go to the documentation of this file.
   30 #define BITSTREAM_READER_LE 
   40 #define BINK_FLAG_ALPHA 0x00100000 
   41 #define BINK_FLAG_GRAY  0x00020000 
   64     4, 8, 8, 5, 5, 11, 11, 4, 4, 7
 
   68     0, 0, 0, 1, 1, 0, 1, 0, 0, 0
 
   99 #define GET_HUFF(gb, tree)  (tree).syms[get_vlc2(gb, bink_trees[(tree).vlc_num].table,\ 
  100                                                  bink_trees[(tree).vlc_num].bits, 1)] 
  187     bw = (
c->avctx->width  + 7) >> 3;
 
  188     bh = (
c->avctx->height + 7) >> 3;
 
  195         c->bundle[
i].data     = 
tmp;
 
  197         c->bundle[
i].data_end = 
tmp;
 
  234     } 
while (
size && size2);
 
  250     uint8_t tmp1[16] = { 0 }, tmp2[16], *in = tmp1, *
out = tmp2;
 
  258         for (
i = 0; 
i < 16; 
i++)
 
  264         for (
i = 0; 
i <= 
len; 
i++) {
 
  266             tmp1[tree->
syms[
i]] = 1;
 
  268         for (
i = 0; 
i < 16 && 
len < 16 - 1; 
i++)
 
  273         for (
i = 0; 
i < 16; 
i++)
 
  275         for (
i = 0; 
i <= 
len; 
i++) {
 
  277             for (t = 0; t < 16; t += 
size << 1)
 
  281         memcpy(tree->
syms, in, 16);
 
  298         for (
i = 0; 
i < 16; 
i++) {
 
  310     c->bundle[bundle_num].cur_dec =
 
  311     c->bundle[bundle_num].cur_ptr = 
c->bundle[bundle_num].data;
 
  323 #define CHECK_READ_VAL(gb, b, t) \ 
  324     if (!b->cur_dec || (b->cur_dec > b->cur_ptr)) \ 
  326     t = get_bits(gb, b->len); \ 
  335     const uint8_t *dec_end;
 
  338     dec_end = 
b->cur_dec + t;
 
  339     if (dec_end > 
b->data_end) {
 
  347         memset(
b->cur_dec, v, t);
 
  350         while (
b->cur_dec < dec_end)
 
  359     const uint8_t *dec_end;
 
  362     dec_end = 
b->cur_dec + t;
 
  363     if (dec_end > 
b->data_end) {
 
  373             v = (v ^ sign) - sign;
 
  375         memset(
b->cur_dec, v, t);
 
  378         while (
b->cur_dec < dec_end) {
 
  382                 v = (v ^ sign) - sign;
 
  397     const uint8_t *dec_end;
 
  400     if (
c->version == 
'k') {
 
  407     dec_end = 
b->cur_dec + t;
 
  408     if (dec_end > 
b->data_end) {
 
  416         memset(
b->cur_dec, v, t);
 
  419         while (
b->cur_dec < dec_end) {
 
  427                 if (dec_end - 
b->cur_dec < 
run)
 
  429                 memset(
b->cur_dec, last, 
run);
 
  440     const uint8_t *dec_end;
 
  443     dec_end = 
b->cur_dec + t;
 
  444     if (dec_end > 
b->data_end) {
 
  448     while (
b->cur_dec < dec_end) {
 
  462     const uint8_t *dec_end;
 
  465     dec_end = 
b->cur_dec + t;
 
  466     if (dec_end > 
b->data_end) {
 
  473         c->col_lastval = 
GET_HUFF(gb, 
c->col_high[
c->col_lastval]);
 
  475         v = (
c->col_lastval << 4) | v;
 
  476         if (
c->version < 
'i') {
 
  477             sign = ((int8_t) v) >> 7;
 
  478             v = ((v & 0x7F) ^ sign) - sign;
 
  481         memset(
b->cur_dec, v, t);
 
  484         while (
b->cur_dec < dec_end) {
 
  487             c->col_lastval = 
GET_HUFF(gb, 
c->col_high[
c->col_lastval]);
 
  489             v = (
c->col_lastval << 4) | v;
 
  490             if (
c->version < 
'i') {
 
  491                 sign = ((int8_t) v) >> 7;
 
  492                 v = ((v & 0x7F) ^ sign) - sign;
 
  502 #define DC_START_BITS 11 
  505                     int start_bits, 
int has_sign)
 
  507     int i, j, 
len, len2, bsize, sign, v, v2;
 
  508     int16_t *dst     = (int16_t*)
b->cur_dec;
 
  509     int16_t *dst_end = (int16_t*)
b->data_end;
 
  514     v = 
get_bits(gb, start_bits - has_sign);
 
  517         v = (v ^ sign) - sign;
 
  519     if (dst_end - dst < 1)
 
  523     for (
i = 0; 
i < 
len; 
i += 8) {
 
  525         if (dst_end - dst < len2)
 
  529             for (j = 0; j < len2; j++) {
 
  533                     v2 = (v2 ^ sign) - sign;
 
  537                 if (v < -32768 || v > 32767) {
 
  543             for (j = 0; j < len2; j++)
 
  548     b->cur_dec = (uint8_t*)dst;
 
  563         return *
c->bundle[bundle].cur_ptr++;
 
  565         return (int8_t)*
c->bundle[bundle].cur_ptr++;
 
  566     ret = *(int16_t*)
c->bundle[bundle].cur_ptr;
 
  567     c->bundle[bundle].cur_ptr += 2;
 
  573     c->bundle[bundle_num].cur_dec =
 
  574     c->bundle[bundle_num].cur_ptr = 
c->bundle[bundle_num].data;
 
  575     c->bundle[bundle_num].len = 13;
 
  594     if (
b->data_end - 
b->cur_dec < 
len * (1 + (
bits > 8)))
 
  605         int16_t *dst = (int16_t*)
b->cur_dec;
 
  614         b->cur_dec = (uint8_t*)dst;
 
  625         int val = *
c->bundle[bundle_num].cur_ptr++;
 
  628     ret = *(int16_t*)
c->bundle[bundle_num].cur_ptr;
 
  629     c->bundle[bundle_num].cur_ptr += 2;
 
  643                            const uint8_t *scan, 
int *coef_count_,
 
  644                            int coef_idx[64], 
int q)
 
  649     int list_start = 64, list_end = 64, list_pos;
 
  656     coef_list[list_end] = 4;  mode_list[list_end++] = 0;
 
  657     coef_list[list_end] = 24; mode_list[list_end++] = 0;
 
  658     coef_list[list_end] = 44; mode_list[list_end++] = 0;
 
  659     coef_list[list_end] = 1;  mode_list[list_end++] = 3;
 
  660     coef_list[list_end] = 2;  mode_list[list_end++] = 3;
 
  661     coef_list[list_end] = 3;  mode_list[list_end++] = 3;
 
  664         list_pos = list_start;
 
  665         while (list_pos < list_end) {
 
  666             if (!(mode_list[list_pos] | coef_list[list_pos]) || !
get_bits1(gb)) {
 
  670             ccoef = coef_list[list_pos];
 
  671             mode  = mode_list[list_pos];
 
  674                 coef_list[list_pos] = ccoef + 4;
 
  675                 mode_list[list_pos] = 1;
 
  678                     coef_list[list_pos]   = 0;
 
  679                     mode_list[list_pos++] = 0;
 
  681                 for (
i = 0; 
i < 4; 
i++, ccoef++) {
 
  683                         coef_list[--list_start] = ccoef;
 
  684                         mode_list[  list_start] = 3;
 
  691                             t = (t ^ sign) - sign;
 
  693                         block[scan[ccoef]] = t;
 
  694                         coef_idx[coef_count++] = ccoef;
 
  699                 mode_list[list_pos] = 2;
 
  700                 for (
i = 0; 
i < 3; 
i++) {
 
  702                     coef_list[list_end]   = ccoef;
 
  703                     mode_list[list_end++] = 2;
 
  712                     t = (t ^ sign) - sign;
 
  714                 block[scan[ccoef]] = t;
 
  715                 coef_idx[coef_count++] = ccoef;
 
  716                 coef_list[list_pos]   = 0;
 
  717                 mode_list[list_pos++] = 0;
 
  727         if (quant_idx > 15
U) {
 
  733     *coef_count_ = coef_count;
 
  739                                   int coef_count, 
int coef_idx[64],
 
  744     for (
i = 0; 
i < coef_count; 
i++) {
 
  745         int idx = coef_idx[
i];
 
  763     int list_start = 64, list_end = 64, list_pos;
 
  765     int nz_coeff_count = 0;
 
  767     coef_list[list_end] =  4; mode_list[list_end++] = 0;
 
  768     coef_list[list_end] = 24; mode_list[list_end++] = 0;
 
  769     coef_list[list_end] = 44; mode_list[list_end++] = 0;
 
  770     coef_list[list_end] =  0; mode_list[list_end++] = 2;
 
  773         for (
i = 0; 
i < nz_coeff_count; 
i++) {
 
  776             if (
block[nz_coeff[
i]] < 0)
 
  784         list_pos = list_start;
 
  785         while (list_pos < list_end) {
 
  786             if (!(coef_list[list_pos] | mode_list[list_pos]) || !
get_bits1(gb)) {
 
  790             ccoef = coef_list[list_pos];
 
  791             mode  = mode_list[list_pos];
 
  794                 coef_list[list_pos] = ccoef + 4;
 
  795                 mode_list[list_pos] = 1;
 
  798                     coef_list[list_pos]   = 0;
 
  799                     mode_list[list_pos++] = 0;
 
  801                 for (
i = 0; 
i < 4; 
i++, ccoef++) {
 
  803                         coef_list[--list_start] = ccoef;
 
  804                         mode_list[  list_start] = 3;
 
  806                         nz_coeff[nz_coeff_count++] = 
bink_scan[ccoef];
 
  816                 mode_list[list_pos] = 2;
 
  817                 for (
i = 0; 
i < 3; 
i++) {
 
  819                     coef_list[list_end]   = ccoef;
 
  820                     mode_list[list_end++] = 2;
 
  824                 nz_coeff[nz_coeff_count++] = 
bink_scan[ccoef];
 
  827                 coef_list[list_pos]   = 0;
 
  828                 mode_list[list_pos++] = 0;
 
  847     for (
i = 0; 
i < 8; 
i++)
 
  849     for (
i = 0; 
i < 8; 
i++)
 
  854                               int plane_idx, 
int is_key, 
int is_chroma)
 
  858     uint8_t *dst, *
ref, *ref_start, *ref_end;
 
  865     int ybias = is_key ? -15 : 0;
 
  866     int qp, quant_idx, coef_count, coef_idx[64];
 
  869     int bw = is_chroma ? (
c->avctx->width  + 15) >> 4 : (
c->avctx->width  + 7) >> 3;
 
  870     int bh = is_chroma ? (
c->avctx->height + 15) >> 4 : (
c->avctx->height + 7) >> 3;
 
  876     for (
i = 0; 
i < 64; 
i++)
 
  877         coordmap[
i] = (
i & 7) + (
i >> 3) * 
stride;
 
  879     for (by = 0; by < bh; by++) {
 
  886         for (bx = 0; bx < bw; bx++, dst += 8) {
 
  907                         for (j = 0; j < 
run; j++)
 
  908                             dst[coordmap[*scan++]] = v;
 
  910                         for (j = 0; j < 
run; j++)
 
  918                 memset(dctblock, 0, 
sizeof(*dctblock) * 64);
 
  924                 c->binkdsp.idct_put(dst, 
stride, dctblock);
 
  930                 if (ref < ref_start || ref > ref_end) {
 
  932                 } 
else if (
ref + 8*stride < dst || ref >= dst + 8*
stride) {
 
  937                 c->bdsp.clear_block(
block);
 
  946                 if (ref < ref_start || ref > ref_end) {
 
  948                 } 
else if (
ref + 8*stride < dst || ref >= dst + 8*
stride) {
 
  953                 memset(dctblock, 0, 
sizeof(*dctblock) * 64);
 
  959                 c->binkdsp.idct_add(dst, 
stride, dctblock);
 
  963                 c->bdsp.fill_block_tab[1](dst, v, 
stride, 8);
 
  966                 for (
i = 0; 
i < 2; 
i++)
 
  968                 for (
i = 0; 
i < 8; 
i++) {
 
  970                     for (j = 0; j < 8; j++, v >>= 1)
 
  971                         dst[
i*
stride + j] = col[v & 1];
 
  978                 if (ref < ref_start || ref > ref_end) {
 
  980                 } 
else if (
ref + 8*stride < dst || ref >= dst + 8*
stride) {
 
  987                 for (
i = 0; 
i < 8; 
i++)
 
 1004                            uint8_t *dst, uint8_t *prev, 
int stride,
 
 1010     uint8_t *
ref = prev + xoff + yoff * 
stride;
 
 1011     if (ref < ref_start || ref > ref_end) {
 
 1022                              int plane_idx, 
int is_chroma)
 
 1026     uint8_t *dst, *prev, *ref_start, *ref_end;
 
 1028     const uint8_t *scan;
 
 1032     int coordmap[64], quant_idx, coef_count, coef_idx[64];
 
 1035     int bw = is_chroma ? (
c->avctx->width  + 15) >> 4 : (
c->avctx->width  + 7) >> 3;
 
 1036     int bh = is_chroma ? (
c->avctx->height + 15) >> 4 : (
c->avctx->height + 7) >> 3;
 
 1037     int width = 
c->avctx->width >> is_chroma;
 
 1038     int height = 
c->avctx->height >> is_chroma;
 
 1057     ref_start = 
c->last->data[plane_idx] ? 
c->last->data[plane_idx]
 
 1060                 + (bw - 1 + 
c->last->linesize[plane_idx] * (bh - 1)) * 8;
 
 1062     for (
i = 0; 
i < 64; 
i++)
 
 1063         coordmap[
i] = (
i & 7) + (
i >> 3) * 
stride;
 
 1065     for (by = 0; by < bh; by++) {
 
 1086         prev = (
c->last->data[plane_idx] ? 
c->last->data[plane_idx]
 
 1088         for (bx = 0; bx < bw; bx++, dst += 8, prev += 8) {
 
 1099                 c->put_pixels_tab(dst, prev, 
stride, 8);
 
 1119                             for (j = 0; j < 
run; j++)
 
 1120                                 ublock[*scan++] = v;
 
 1122                             for (j = 0; j < 
run; j++)
 
 1130                     memset(dctblock, 0, 
sizeof(*dctblock) * 64);
 
 1135                     c->binkdsp.idct_put(ublock, 8, dctblock);
 
 1139                     c->bdsp.fill_block_tab[0](dst, v, 
stride, 16);
 
 1142                     for (
i = 0; 
i < 2; 
i++)
 
 1144                     for (j = 0; j < 8; j++) {
 
 1146                         for (
i = 0; i < 8; i++, v >>= 1)
 
 1147                             ublock[
i + j*8] = col[v & 1];
 
 1151                     for (j = 0; j < 8; j++)
 
 1152                         for (
i = 0; 
i < 8; 
i++)
 
 1160                 c->binkdsp.scale_block(ublock, dst, 
stride);
 
 1167                                       ref_start, ref_end);
 
 1184                         for (j = 0; j < 
run; j++)
 
 1185                             dst[coordmap[*scan++]] = v;
 
 1187                         for (j = 0; j < 
run; j++)
 
 1196                                       ref_start, ref_end);
 
 1199                 c->bdsp.clear_block(
block);
 
 1205                 memset(dctblock, 0, 
sizeof(*dctblock) * 64);
 
 1210                 c->binkdsp.idct_put(dst, 
stride, dctblock);
 
 1214                 c->bdsp.fill_block_tab[1](dst, v, 
stride, 8);
 
 1218                                       ref_start, ref_end);
 
 1221                 memset(dctblock, 0, 
sizeof(*dctblock) * 64);
 
 1226                 c->binkdsp.idct_add(dst, 
stride, dctblock);
 
 1229                 for (
i = 0; 
i < 2; 
i++)
 
 1231                 for (
i = 0; 
i < 8; 
i++) {
 
 1233                     for (j = 0; j < 8; j++, v >>= 1)
 
 1234                         dst[
i*
stride + j] = col[v & 1];
 
 1238                 for (
i = 0; 
i < 8; 
i++)
 
 1261     int plane, plane_idx, 
ret;
 
 1262     int bits_count = 
pkt->
size << 3;
 
 1264     if (
c->version > 
'b') {
 
 1276         if (
c->version >= 
'i')
 
 1281     if (
c->version >= 
'i')
 
 1286     for (plane = 0; plane < 3; plane++) {
 
 1287         plane_idx = (!plane || !
c->swap_planes) ? plane : (plane ^ 3);
 
 1289         if (
c->version > 
'b') {
 
 1294                                           c->frame_num == 1, !!plane)) < 0)
 
 1302     if (
c->version > 
'b') {
 
 1315     for (
int i = 0, 
offset = 0; 
i < 16; 
i++) {
 
 1332     uint8_t inv_bink_scan[64];
 
 1333     static const int s[64]={
 
 1334         1073741824,1489322693,1402911301,1262586814,1073741824, 843633538, 581104888, 296244703,
 
 1335         1489322693,2065749918,1945893874,1751258219,1489322693,1170153332, 806015634, 410903207,
 
 1336         1402911301,1945893874,1832991949,1649649171,1402911301,1102260336, 759250125, 387062357,
 
 1337         1262586814,1751258219,1649649171,1484645031,1262586814, 992008094, 683307060, 348346918,
 
 1338         1073741824,1489322693,1402911301,1262586814,1073741824, 843633538, 581104888, 296244703,
 
 1339          843633538,1170153332,1102260336, 992008094, 843633538, 662838617, 456571181, 232757969,
 
 1340          581104888, 806015634, 759250125, 683307060, 581104888, 456571181, 314491699, 160326478,
 
 1341          296244703, 410903207, 387062357, 348346918, 296244703, 232757969, 160326478,  81733730,
 
 1345     for (
i = 0; 
i < 64; 
i++)
 
 1348     for (j = 0; j < 16; j++) {
 
 1349         for (
i = 0; 
i < 64; 
i++) {
 
 1350             int k = inv_bink_scan[
i];
 
 1374     c->swap_planes = 
c->version >= 
'h';
 
 1395     if (
c->version == 
'b') {
 
 1422     .
p.
name         = 
"binkvideo",
 
  
Tree tree
Huffman tree-related data.
av_cold void ff_binkdsp_init(BinkDSPContext *c)
static int binkb_decode_plane(BinkContext *c, AVFrame *frame, GetBitContext *gb, int plane_idx, int is_key, int is_chroma)
static av_cold int init_bundles(BinkContext *c)
Allocate memory for bundles.
static void skip_bits_long(GetBitContext *s, int n)
Skips the specified number of bits.
#define AV_LOG_WARNING
Something somehow does not look correct.
uint8_t * cur_dec
pointer to the not yet decoded part of the buffer
static void put_pixels8x8_overlapped(uint8_t *dst, uint8_t *src, int stride)
Copy 8x8 block from source to destination, where src and dst may be overlapped.
@ BINKB_SRC_Y_OFF
Y components of motion value.
#define FF_CODEC_CAP_INIT_CLEANUP
The codec allows calling the close function for deallocation even if the init function returned a fai...
static int get_bits_left(GetBitContext *gb)
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
static void init_lengths(BinkContext *c, int width, int bw)
Initialize length in all bundles.
@ INTER_BLOCK
motion block with DCT applied to the difference
#define u(width, name, range_min, range_max)
static const uint8_t bink_scan[64]
Bink DCT and residue 8x8 block scan order.
static void flush(AVCodecContext *avctx)
#define DC_START_BITS
number of bits used to store first DC value in bundle
Tree col_high[16]
trees for decoding high nibble in "colours" data type
static int get_bits_count(const GetBitContext *s)
static int read_patterns(AVCodecContext *avctx, GetBitContext *gb, Bundle *b)
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
static void merge(GetBitContext *gb, uint8_t *dst, uint8_t *src, int size)
Merge two consequent lists of equal size depending on bits read.
@ INTRA_BLOCK
intra DCT block
const FFCodec ff_bink_decoder
This structure describes decoded (raw) audio or video data.
@ AVCOL_RANGE_JPEG
Full range content.
static const uint16_t table[]
int vlc_num
tree number (in bink_trees[])
static const uint8_t binkb_bundle_signed[BINKB_NB_SRC]
static const uint8_t binkb_inter_seed[64]
@ BINK_SRC_BLOCK_TYPES
8x8 block types
@ BINKB_SRC_INTER_DC
DC values for interblocks with DCT.
@ BINK_SRC_X_OFF
X components of motion value.
static const uint8_t binkb_den[16]
static int read_block_types(AVCodecContext *avctx, GetBitContext *gb, Bundle *b)
static int init_get_bits(GetBitContext *s, const uint8_t *buffer, int bit_size)
Initialize GetBitContext.
static int32_t binkb_intra_quant[16][64]
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
static const uint8_t binkb_num[16]
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
op_pixels_func put_pixels_tab
int col_lastval
value of last decoded high nibble in "colours" data type
AVCodec p
The public AVCodec.
static int bink_decode_plane(BinkContext *c, AVFrame *frame, GetBitContext *gb, int plane_idx, int is_chroma)
OldSources
IDs for different data types used in old version of Bink video codec.
int flags
AV_CODEC_FLAG_*.
static double val(void *priv, double ch)
static int bink_put_pixels(BinkContext *c, uint8_t *dst, uint8_t *prev, int stride, uint8_t *ref_start, uint8_t *ref_end)
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
static VLC bink_trees[16]
static const uint8_t quant[64]
static int ff_thread_once(char *control, void(*routine)(void))
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
static int binkb_read_bundle(BinkContext *c, GetBitContext *gb, int bundle_num)
static const uint8_t binkb_intra_seed[64]
static const uint16_t mask[17]
#define FF_CODEC_DECODE_CB(func)
av_cold void ff_blockdsp_init(BlockDSPContext *c)
@ AV_PIX_FMT_YUVA420P
planar YUV 4:2:0, 20bpp, (1 Cr & Cb sample per 2x2 Y & A samples)
@ FILL_BLOCK
block is filled with single colour
static const uint8_t binkb_bundle_sizes[BINKB_NB_SRC]
#define AV_GET_BUFFER_FLAG_REF
The decoder will keep a reference to the frame and may reuse it later.
static av_cold void bink_init_vlcs(void)
@ BINKB_SRC_INTRA_DC
DC values for intrablocks with DCT.
int(* init)(AVBSFContext *ctx)
#define LOCAL_ALIGNED_16(t, v,...)
#define vlc_init(vlc, nb_bits, nb_codes, bits, bits_wrap, bits_size, codes, codes_wrap, codes_size, flags)
static int read_dcs(AVCodecContext *avctx, GetBitContext *gb, Bundle *b, int start_bits, int has_sign)
@ AV_PIX_FMT_YUV420P
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
#define CODEC_LONG_NAME(str)
av_cold void ff_hpeldsp_init(HpelDSPContext *c, int flags)
static int binkb_get_value(BinkContext *c, int bundle_num)
@ BINK_SRC_Y_OFF
Y components of motion value.
@ BINK_SRC_RUN
run lengths for special fill block
#define LOCAL_ALIGNED_32(t, v,...)
@ RUN_BLOCK
block is composed from runs of colours with custom scan order
enum AVColorRange color_range
MPEG vs JPEG YUV range.
@ PATTERN_BLOCK
block is filled with two colours following custom pattern
static int read_runs(AVCodecContext *avctx, GetBitContext *gb, Bundle *b)
static unsigned int get_bits1(GetBitContext *s)
@ BINK_SRC_PATTERN
8-bit values for 2-colour pattern fill
uint8_t * data
buffer for decoded symbols
int len
length of number of entries to decode (in bits)
static int decode_frame(AVCodecContext *avctx, AVFrame *frame, int *got_frame, AVPacket *pkt)
static int read_bundle(GetBitContext *gb, BinkContext *c, int bundle_num)
Prepare bundle for decoding data.
BlockTypes
Bink video block types.
static int get_value(BinkContext *c, int bundle)
Retrieve next value from bundle.
void(* op_pixels_func)(uint8_t *block, const uint8_t *pixels, ptrdiff_t line_size, int h)
@ RESIDUE_BLOCK
motion block with some difference added
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
data structure used for decoding single Bink data type
static int read_dct_coeffs(BinkContext *c, GetBitContext *gb, int32_t block[64], const uint8_t *scan, int *coef_count_, int coef_idx[64], int q)
Read 8x8 block of DCT coefficients.
op_pixels_func put_pixels_tab[4][4]
Halfpel motion compensation with rounding (a+b+1)>>1.
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame.
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
int av_frame_ref(AVFrame *dst, const AVFrame *src)
Set up a new reference to the data described by the source frame.
static av_cold int decode_end(AVCodecContext *avctx)
@ BINKB_SRC_COLORS
pixel values used for different block types
static av_cold void binkb_calc_quant(void)
Calculate quantization tables for version b.
@ BINKB_SRC_INTER_COEFS
number of coefficients for residue blocks
uint8_t * data_end
buffer end
int version
internal Bink file version
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf offset
@ MOTION_BLOCK
block is copied from previous frame with some offset
data needed to decode 4-bit Huffman-coded value
@ BINK_SRC_INTRA_DC
DC values for intrablocks with DCT.
@ BINKB_SRC_X_OFF
X components of motion value.
#define i(width, name, range_min, range_max)
uint8_t * extradata
some codecs need / can use extradata like Huffman tables.
@ BINK_SRC_COLORS
pixel values used for different block types
static const uint8_t bink_rlelens[4]
static const uint8_t binkb_runbits[64]
@ BINKB_SRC_INTRA_Q
quantizer values for intrablocks with DCT
const char * name
Name of the codec implementation.
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
Bundle bundle[BINKB_NB_SRC]
bundles for decoding all data types
@ AVCOL_RANGE_MPEG
Narrow or limited range content.
void * av_calloc(size_t nmemb, size_t size)
int ff_reget_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Identical in function to ff_get_buffer(), except it reuses the existing buffer if available.
static const int32_t bink_intra_quant[16][64]
#define FFSWAP(type, a, b)
uint8_t syms[16]
leaf value to symbol mapping
static av_cold void free_bundles(BinkContext *c)
Free memory used by bundles.
static const int32_t bink_inter_quant[16][64]
static int32_t binkb_inter_quant[16][64]
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_RL32
static int read_colors(GetBitContext *gb, Bundle *b, BinkContext *c)
int av_frame_replace(AVFrame *dst, const AVFrame *src)
Ensure the destination frame refers to the same data described by the source frame,...
main external API structure.
static int read_tree(GetBitContext *gb, Tree *tree)
Read information about Huffman tree used to decode data.
@ SKIP_BLOCK
skipped block
static av_cold void binkb_init_bundle(BinkContext *c, int bundle_num)
static void unquantize_dct_coeffs(int32_t block[64], const uint32_t quant[64], int coef_count, int coef_idx[64], const uint8_t *scan)
@ RAW_BLOCK
uncoded 8x8 block
#define CHECK_READ_VAL(gb, b, t)
common check before starting decoding bundle data
@ BINKB_SRC_INTER_Q
quantizer values for interblocks with DCT
static int ref[MAX_W *MAX_W]
uint8_t * cur_ptr
pointer to the data that is not read from buffer yet
static av_cold void binkb_init_bundles(BinkContext *c)
@ BINK_SRC_SUB_BLOCK_TYPES
16x16 block types (a subset of 8x8 block types)
static int read_residue(GetBitContext *gb, int16_t block[64], int masks_count)
Read 8x8 block with residue after motion compensation.
@ BINK_SRC_INTER_DC
DC values for interblocks with DCT.
unsigned int codec_tag
fourcc (LSB first, so "ABCD" -> ('D'<<24) + ('C'<<16) + ('B'<<8) + 'A').
This structure stores compressed data.
static const uint8_t bink_patterns[16][64]
@ SCALED_BLOCK
block has size 16x16
static const uint8_t bink_tree_lens[16][16]
int width
picture width / height.
#define flags(name, subs,...)
int linesize[AV_NUM_DATA_POINTERS]
For video, a positive or negative value, which is typically indicating the size in bytes of each pict...
The exact code depends on how similar the blocks are and how related they are to the block
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
#define VLC_INIT_USE_STATIC
int av_image_check_size(unsigned int w, unsigned int h, int log_offset, void *log_ctx)
Check if the given dimension of an image is valid, meaning that all bytes of the image can be address...
@ BINKB_SRC_PATTERN
8-bit values for 2-colour pattern fill
static int read_motion_values(AVCodecContext *avctx, GetBitContext *gb, Bundle *b)
Sources
IDs for different data types used in Bink video codec.
static const uint8_t bink_tree_bits[16][16]
@ BINKB_SRC_BLOCK_TYPES
8x8 block types
#define GET_HUFF(gb, tree)
static av_cold int decode_init(AVCodecContext *avctx)