forked from len0rd/rockbox
More cleaning for libwmapro; use codeclib's bitstream functions and drop those from the libwmapro.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@27453 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
090768194f
commit
0f94710410
8 changed files with 5 additions and 1925 deletions
|
|
@ -1,6 +1,5 @@
|
||||||
wmaprodec.c
|
wmaprodec.c
|
||||||
wma.c
|
wma.c
|
||||||
mdct_tables.c
|
mdct_tables.c
|
||||||
bitstream.c
|
../lib/ffmpeg_bitstream.c
|
||||||
wmapro_mdct.c
|
wmapro_mdct.c
|
||||||
//libavutil/mathematics.c
|
|
||||||
|
|
|
||||||
|
|
@ -1,358 +0,0 @@
|
||||||
/*
|
|
||||||
* Common bit i/o utils
|
|
||||||
* Copyright (c) 2000, 2001 Fabrice Bellard
|
|
||||||
* Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
|
|
||||||
* Copyright (c) 2010 Loren Merritt
|
|
||||||
*
|
|
||||||
* alternative bitstream reader & writer by Michael Niedermayer <michaelni@gmx.at>
|
|
||||||
*
|
|
||||||
* This file is part of FFmpeg.
|
|
||||||
*
|
|
||||||
* FFmpeg is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
|
||||||
* License as published by the Free Software Foundation; either
|
|
||||||
* version 2.1 of the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* FFmpeg is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* Lesser General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Lesser General Public
|
|
||||||
* License along with FFmpeg; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @file libavcodec/bitstream.c
|
|
||||||
* bitstream api.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "get_bits.h"
|
|
||||||
#include "put_bits.h"
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#define av_log(...)
|
|
||||||
|
|
||||||
/* Taken from libavutil/common.h */
|
|
||||||
#define FFMIN(a,b) ((a) > (b) ? (b) : (a))
|
|
||||||
#define FFMAX(a,b) ((a) > (b) ? (a) : (b))
|
|
||||||
|
|
||||||
/* av_reverse - taken from libavutil/mathematics.c*/
|
|
||||||
const uint8_t av_reverse[256]={
|
|
||||||
0x00,0x80,0x40,0xC0,0x20,0xA0,0x60,0xE0,0x10,0x90,0x50,0xD0,0x30,0xB0,0x70,0xF0,
|
|
||||||
0x08,0x88,0x48,0xC8,0x28,0xA8,0x68,0xE8,0x18,0x98,0x58,0xD8,0x38,0xB8,0x78,0xF8,
|
|
||||||
0x04,0x84,0x44,0xC4,0x24,0xA4,0x64,0xE4,0x14,0x94,0x54,0xD4,0x34,0xB4,0x74,0xF4,
|
|
||||||
0x0C,0x8C,0x4C,0xCC,0x2C,0xAC,0x6C,0xEC,0x1C,0x9C,0x5C,0xDC,0x3C,0xBC,0x7C,0xFC,
|
|
||||||
0x02,0x82,0x42,0xC2,0x22,0xA2,0x62,0xE2,0x12,0x92,0x52,0xD2,0x32,0xB2,0x72,0xF2,
|
|
||||||
0x0A,0x8A,0x4A,0xCA,0x2A,0xAA,0x6A,0xEA,0x1A,0x9A,0x5A,0xDA,0x3A,0xBA,0x7A,0xFA,
|
|
||||||
0x06,0x86,0x46,0xC6,0x26,0xA6,0x66,0xE6,0x16,0x96,0x56,0xD6,0x36,0xB6,0x76,0xF6,
|
|
||||||
0x0E,0x8E,0x4E,0xCE,0x2E,0xAE,0x6E,0xEE,0x1E,0x9E,0x5E,0xDE,0x3E,0xBE,0x7E,0xFE,
|
|
||||||
0x01,0x81,0x41,0xC1,0x21,0xA1,0x61,0xE1,0x11,0x91,0x51,0xD1,0x31,0xB1,0x71,0xF1,
|
|
||||||
0x09,0x89,0x49,0xC9,0x29,0xA9,0x69,0xE9,0x19,0x99,0x59,0xD9,0x39,0xB9,0x79,0xF9,
|
|
||||||
0x05,0x85,0x45,0xC5,0x25,0xA5,0x65,0xE5,0x15,0x95,0x55,0xD5,0x35,0xB5,0x75,0xF5,
|
|
||||||
0x0D,0x8D,0x4D,0xCD,0x2D,0xAD,0x6D,0xED,0x1D,0x9D,0x5D,0xDD,0x3D,0xBD,0x7D,0xFD,
|
|
||||||
0x03,0x83,0x43,0xC3,0x23,0xA3,0x63,0xE3,0x13,0x93,0x53,0xD3,0x33,0xB3,0x73,0xF3,
|
|
||||||
0x0B,0x8B,0x4B,0xCB,0x2B,0xAB,0x6B,0xEB,0x1B,0x9B,0x5B,0xDB,0x3B,0xBB,0x7B,0xFB,
|
|
||||||
0x07,0x87,0x47,0xC7,0x27,0xA7,0x67,0xE7,0x17,0x97,0x57,0xD7,0x37,0xB7,0x77,0xF7,
|
|
||||||
0x0F,0x8F,0x4F,0xCF,0x2F,0xAF,0x6F,0xEF,0x1F,0x9F,0x5F,0xDF,0x3F,0xBF,0x7F,0xFF,
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
const uint8_t ff_log2_run[32]={
|
|
||||||
0, 0, 0, 0, 1, 1, 1, 1,
|
|
||||||
2, 2, 2, 2, 3, 3, 3, 3,
|
|
||||||
4, 4, 5, 5, 6, 6, 7, 7,
|
|
||||||
8, 9,10,11,12,13,14,15
|
|
||||||
};
|
|
||||||
|
|
||||||
void align_put_bits(PutBitContext *s)
|
|
||||||
{
|
|
||||||
#ifdef ALT_BITSTREAM_WRITER
|
|
||||||
put_bits(s,( - s->index) & 7,0);
|
|
||||||
#else
|
|
||||||
put_bits(s,s->bit_left & 7,0);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
void ff_put_string(PutBitContext *pb, const char *string, int terminate_string)
|
|
||||||
{
|
|
||||||
while(*string){
|
|
||||||
put_bits(pb, 8, *string);
|
|
||||||
string++;
|
|
||||||
}
|
|
||||||
if(terminate_string)
|
|
||||||
put_bits(pb, 8, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ff_copy_bits(PutBitContext *pb, const uint8_t *src, int length)
|
|
||||||
{
|
|
||||||
int words= length>>4;
|
|
||||||
int bits= length&15;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
if(length==0) return;
|
|
||||||
/* The following define was just added to make the codec (wma pro) compile */
|
|
||||||
#define CONFIG_SMALL 0
|
|
||||||
if(CONFIG_SMALL || words < 16 || put_bits_count(pb)&7){
|
|
||||||
for(i=0; i<words; i++) put_bits(pb, 16, AV_RB16(src + 2*i));
|
|
||||||
}else{
|
|
||||||
for(i=0; put_bits_count(pb)&31; i++)
|
|
||||||
put_bits(pb, 8, src[i]);
|
|
||||||
flush_put_bits(pb);
|
|
||||||
memcpy(put_bits_ptr(pb), src+i, 2*words-i);
|
|
||||||
skip_put_bytes(pb, 2*words-i);
|
|
||||||
}
|
|
||||||
|
|
||||||
put_bits(pb, bits, AV_RB16(src + 2*words)>>(16-bits));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* VLC decoding */
|
|
||||||
|
|
||||||
//#define DEBUG_VLC
|
|
||||||
|
|
||||||
#define GET_DATA(v, table, i, wrap, size) \
|
|
||||||
{\
|
|
||||||
const uint8_t *ptr = (const uint8_t *)table + i * wrap;\
|
|
||||||
switch(size) {\
|
|
||||||
case 1:\
|
|
||||||
v = *(const uint8_t *)ptr;\
|
|
||||||
break;\
|
|
||||||
case 2:\
|
|
||||||
v = *(const uint16_t *)ptr;\
|
|
||||||
break;\
|
|
||||||
default:\
|
|
||||||
v = *(const uint32_t *)ptr;\
|
|
||||||
break;\
|
|
||||||
}\
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static int alloc_table(VLC *vlc, int size, int use_static)
|
|
||||||
{
|
|
||||||
int index;
|
|
||||||
index = vlc->table_size;
|
|
||||||
vlc->table_size += size;
|
|
||||||
if (vlc->table_size > vlc->table_allocated) {
|
|
||||||
if(use_static)
|
|
||||||
return -1; //cant do anything, init_vlc() is used with too little memory
|
|
||||||
vlc->table_allocated += (1 << vlc->bits);
|
|
||||||
//vlc->table = av_realloc(vlc->table,
|
|
||||||
// sizeof(VLC_TYPE) * 2 * vlc->table_allocated);
|
|
||||||
if (!vlc->table)
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
return index;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline uint32_t bitswap_32(uint32_t x) {
|
|
||||||
return av_reverse[x&0xFF]<<24
|
|
||||||
| av_reverse[(x>>8)&0xFF]<<16
|
|
||||||
| av_reverse[(x>>16)&0xFF]<<8
|
|
||||||
| av_reverse[x>>24];
|
|
||||||
}
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
uint8_t bits;
|
|
||||||
uint16_t symbol;
|
|
||||||
/** codeword, with the first bit-to-be-read in the msb
|
|
||||||
* (even if intended for a little-endian bitstream reader) */
|
|
||||||
uint32_t code;
|
|
||||||
} VLCcode;
|
|
||||||
|
|
||||||
static int compare_vlcspec(const void *a, const void *b)
|
|
||||||
{
|
|
||||||
const VLCcode *sa=a, *sb=b;
|
|
||||||
return (sa->code >> 1) - (sb->code >> 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Build VLC decoding tables suitable for use with get_vlc().
|
|
||||||
*
|
|
||||||
* @param vlc the context to be initted
|
|
||||||
*
|
|
||||||
* @param table_nb_bits max length of vlc codes to store directly in this table
|
|
||||||
* (Longer codes are delegated to subtables.)
|
|
||||||
*
|
|
||||||
* @param nb_codes number of elements in codes[]
|
|
||||||
*
|
|
||||||
* @param codes descriptions of the vlc codes
|
|
||||||
* These must be ordered such that codes going into the same subtable are contiguous.
|
|
||||||
* Sorting by VLCcode.code is sufficient, though not necessary.
|
|
||||||
*/
|
|
||||||
static int build_table(VLC *vlc, int table_nb_bits, int nb_codes,
|
|
||||||
VLCcode *codes, int flags)
|
|
||||||
{
|
|
||||||
int table_size, table_index, index, code_prefix, symbol, subtable_bits;
|
|
||||||
int i, j, k, n, nb, inc;
|
|
||||||
uint32_t code;
|
|
||||||
VLC_TYPE (*table)[2];
|
|
||||||
|
|
||||||
table_size = 1 << table_nb_bits;
|
|
||||||
table_index = alloc_table(vlc, table_size, flags & INIT_VLC_USE_NEW_STATIC);
|
|
||||||
#ifdef DEBUG_VLC
|
|
||||||
av_log(NULL,AV_LOG_DEBUG,"new table index=%d size=%d\n",
|
|
||||||
table_index, table_size);
|
|
||||||
#endif
|
|
||||||
if (table_index < 0)
|
|
||||||
return -1;
|
|
||||||
table = &vlc->table[table_index];
|
|
||||||
|
|
||||||
for (i = 0; i < table_size; i++) {
|
|
||||||
table[i][1] = 0; //bits
|
|
||||||
table[i][0] = -1; //codes
|
|
||||||
}
|
|
||||||
|
|
||||||
/* first pass: map codes and compute auxillary table sizes */
|
|
||||||
for (i = 0; i < nb_codes; i++) {
|
|
||||||
n = codes[i].bits;
|
|
||||||
code = codes[i].code;
|
|
||||||
symbol = codes[i].symbol;
|
|
||||||
#if defined(DEBUG_VLC) && 0
|
|
||||||
av_log(NULL,AV_LOG_DEBUG,"i=%d n=%d code=0x%x\n", i, n, code);
|
|
||||||
#endif
|
|
||||||
if (n <= table_nb_bits) {
|
|
||||||
/* no need to add another table */
|
|
||||||
j = code >> (32 - table_nb_bits);
|
|
||||||
nb = 1 << (table_nb_bits - n);
|
|
||||||
inc = 1;
|
|
||||||
if (flags & INIT_VLC_LE) {
|
|
||||||
j = bitswap_32(code);
|
|
||||||
inc = 1 << n;
|
|
||||||
}
|
|
||||||
for (k = 0; k < nb; k++) {
|
|
||||||
#ifdef DEBUG_VLC
|
|
||||||
av_log(NULL, AV_LOG_DEBUG, "%4x: code=%d n=%d\n",
|
|
||||||
j, i, n);
|
|
||||||
#endif
|
|
||||||
if (table[j][1] /*bits*/ != 0) {
|
|
||||||
av_log(NULL, AV_LOG_ERROR, "incorrect codes\n");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
table[j][1] = n; //bits
|
|
||||||
table[j][0] = symbol;
|
|
||||||
j += inc;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
/* fill auxiliary table recursively */
|
|
||||||
n -= table_nb_bits;
|
|
||||||
code_prefix = code >> (32 - table_nb_bits);
|
|
||||||
subtable_bits = n;
|
|
||||||
codes[i].bits = n;
|
|
||||||
codes[i].code = code << table_nb_bits;
|
|
||||||
for (k = i+1; k < nb_codes; k++) {
|
|
||||||
n = codes[k].bits - table_nb_bits;
|
|
||||||
if (n <= 0)
|
|
||||||
break;
|
|
||||||
code = codes[k].code;
|
|
||||||
if (code >> (32 - table_nb_bits) != (unsigned)code_prefix)
|
|
||||||
break;
|
|
||||||
codes[k].bits = n;
|
|
||||||
codes[k].code = code << table_nb_bits;
|
|
||||||
subtable_bits = FFMAX(subtable_bits, n);
|
|
||||||
}
|
|
||||||
subtable_bits = FFMIN(subtable_bits, table_nb_bits);
|
|
||||||
j = (flags & INIT_VLC_LE) ? bitswap_32(code_prefix) >> (32 - table_nb_bits) : (unsigned)code_prefix;
|
|
||||||
table[j][1] = -subtable_bits;
|
|
||||||
#ifdef DEBUG_VLC
|
|
||||||
av_log(NULL,AV_LOG_DEBUG,"%4x: n=%d (subtable)\n",
|
|
||||||
j, codes[i].bits + table_nb_bits);
|
|
||||||
#endif
|
|
||||||
index = build_table(vlc, subtable_bits, k-i, codes+i, flags);
|
|
||||||
if (index < 0)
|
|
||||||
return -1;
|
|
||||||
/* note: realloc has been done, so reload tables */
|
|
||||||
table = &vlc->table[table_index];
|
|
||||||
table[j][0] = index; //code
|
|
||||||
i = k-1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return table_index;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* Build VLC decoding tables suitable for use with get_vlc().
|
|
||||||
|
|
||||||
'nb_bits' set thee decoding table size (2^nb_bits) entries. The
|
|
||||||
bigger it is, the faster is the decoding. But it should not be too
|
|
||||||
big to save memory and L1 cache. '9' is a good compromise.
|
|
||||||
|
|
||||||
'nb_codes' : number of vlcs codes
|
|
||||||
|
|
||||||
'bits' : table which gives the size (in bits) of each vlc code.
|
|
||||||
|
|
||||||
'codes' : table which gives the bit pattern of of each vlc code.
|
|
||||||
|
|
||||||
'symbols' : table which gives the values to be returned from get_vlc().
|
|
||||||
|
|
||||||
'xxx_wrap' : give the number of bytes between each entry of the
|
|
||||||
'bits' or 'codes' tables.
|
|
||||||
|
|
||||||
'xxx_size' : gives the number of bytes of each entry of the 'bits'
|
|
||||||
or 'codes' tables.
|
|
||||||
|
|
||||||
'wrap' and 'size' allows to use any memory configuration and types
|
|
||||||
(byte/word/long) to store the 'bits', 'codes', and 'symbols' tables.
|
|
||||||
|
|
||||||
'use_static' should be set to 1 for tables, which should be freed
|
|
||||||
with av_free_static(), 0 if free_vlc() will be used.
|
|
||||||
*/
|
|
||||||
int init_vlc_sparse(VLC *vlc, int nb_bits, int nb_codes,
|
|
||||||
const void *bits, int bits_wrap, int bits_size,
|
|
||||||
const void *codes, int codes_wrap, int codes_size,
|
|
||||||
const void *symbols, int symbols_wrap, int symbols_size,
|
|
||||||
int flags)
|
|
||||||
{
|
|
||||||
VLCcode buf[nb_codes];
|
|
||||||
int i, j;
|
|
||||||
|
|
||||||
vlc->bits = nb_bits;
|
|
||||||
if(flags & INIT_VLC_USE_NEW_STATIC){
|
|
||||||
if(vlc->table_size && vlc->table_size == vlc->table_allocated){
|
|
||||||
return 0;
|
|
||||||
}else if(vlc->table_size){
|
|
||||||
return -1; // fatal error, we are called on a partially initialized table
|
|
||||||
}
|
|
||||||
}else {
|
|
||||||
vlc->table = NULL;
|
|
||||||
vlc->table_allocated = 0;
|
|
||||||
vlc->table_size = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef DEBUG_VLC
|
|
||||||
av_log(NULL,AV_LOG_DEBUG,"build table nb_codes=%d\n", nb_codes);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//assert(symbols_size <= 2 || !symbols);
|
|
||||||
j = 0;
|
|
||||||
#define COPY(condition)\
|
|
||||||
for (i = 0; i < nb_codes; i++) {\
|
|
||||||
GET_DATA(buf[j].bits, bits, i, bits_wrap, bits_size);\
|
|
||||||
if (!(condition))\
|
|
||||||
continue;\
|
|
||||||
GET_DATA(buf[j].code, codes, i, codes_wrap, codes_size);\
|
|
||||||
if (flags & INIT_VLC_LE)\
|
|
||||||
buf[j].code = bitswap_32(buf[j].code);\
|
|
||||||
else\
|
|
||||||
buf[j].code <<= 32 - buf[j].bits;\
|
|
||||||
if (symbols)\
|
|
||||||
GET_DATA(buf[j].symbol, symbols, i, symbols_wrap, symbols_size)\
|
|
||||||
else\
|
|
||||||
buf[j].symbol = i;\
|
|
||||||
j++;\
|
|
||||||
}
|
|
||||||
COPY(buf[j].bits > nb_bits);
|
|
||||||
// qsort is the slowest part of init_vlc, and could probably be improved or avoided
|
|
||||||
qsort(buf, j, sizeof(VLCcode), compare_vlcspec);
|
|
||||||
COPY(buf[j].bits && buf[j].bits <= nb_bits);
|
|
||||||
nb_codes = j;
|
|
||||||
|
|
||||||
if (build_table(vlc, nb_bits, nb_codes, buf, flags) < 0) {
|
|
||||||
//av_freep(&vlc->table);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
//if((flags & INIT_VLC_USE_NEW_STATIC) && vlc->table_size != vlc->table_allocated)
|
|
||||||
// av_log(NULL, AV_LOG_ERROR, "needed %d had %d\n", vlc->table_size, vlc->table_allocated);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
@ -1,661 +0,0 @@
|
||||||
/*
|
|
||||||
* copyright (c) 2004 Michael Niedermayer <michaelni@gmx.at>
|
|
||||||
*
|
|
||||||
* This file is part of FFmpeg.
|
|
||||||
*
|
|
||||||
* FFmpeg is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
|
||||||
* License as published by the Free Software Foundation; either
|
|
||||||
* version 2.1 of the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* FFmpeg is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* Lesser General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Lesser General Public
|
|
||||||
* License along with FFmpeg; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @file libavcodec/get_bits.h
|
|
||||||
* bitstream reader API header.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef AVCODEC_GET_BITS_H
|
|
||||||
#define AVCODEC_GET_BITS_H
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
//#include <assert.h>
|
|
||||||
#include "libavutil/bswap.h"
|
|
||||||
//#include "libavutil/common.h"
|
|
||||||
#include "libavutil/intreadwrite.h"
|
|
||||||
//#include "libavutil/log.h"
|
|
||||||
|
|
||||||
#define av_log(...)
|
|
||||||
|
|
||||||
/* NEG_* were taken from mathops.h */
|
|
||||||
#ifndef NEG_SSR32
|
|
||||||
# define NEG_SSR32(a,s) ((( int32_t)(a))>>(32-(s)))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef NEG_USR32
|
|
||||||
# define NEG_USR32(a,s) (((uint32_t)(a))>>(32-(s)))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(ALT_BITSTREAM_READER_LE) && !defined(ALT_BITSTREAM_READER)
|
|
||||||
# define ALT_BITSTREAM_READER
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if !defined(LIBMPEG2_BITSTREAM_READER) && !defined(A32_BITSTREAM_READER) && !defined(ALT_BITSTREAM_READER)
|
|
||||||
# define ALT_BITSTREAM_READER
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* bit input */
|
|
||||||
/* buffer, buffer_end and size_in_bits must be present and used by every reader */
|
|
||||||
typedef struct GetBitContext {
|
|
||||||
const uint8_t *buffer, *buffer_end;
|
|
||||||
#ifdef ALT_BITSTREAM_READER
|
|
||||||
int index;
|
|
||||||
#elif defined LIBMPEG2_BITSTREAM_READER
|
|
||||||
uint8_t *buffer_ptr;
|
|
||||||
uint32_t cache;
|
|
||||||
int bit_count;
|
|
||||||
#elif defined A32_BITSTREAM_READER
|
|
||||||
uint32_t *buffer_ptr;
|
|
||||||
uint32_t cache0;
|
|
||||||
uint32_t cache1;
|
|
||||||
int bit_count;
|
|
||||||
#endif
|
|
||||||
int size_in_bits;
|
|
||||||
} GetBitContext;
|
|
||||||
|
|
||||||
#define VLC_TYPE int16_t
|
|
||||||
|
|
||||||
typedef struct VLC {
|
|
||||||
int bits;
|
|
||||||
VLC_TYPE (*table)[2]; ///< code, bits
|
|
||||||
int table_size, table_allocated;
|
|
||||||
} VLC;
|
|
||||||
|
|
||||||
typedef struct RL_VLC_ELEM {
|
|
||||||
int16_t level;
|
|
||||||
int8_t len;
|
|
||||||
uint8_t run;
|
|
||||||
} RL_VLC_ELEM;
|
|
||||||
|
|
||||||
/* Bitstream reader API docs:
|
|
||||||
name
|
|
||||||
arbitrary name which is used as prefix for the internal variables
|
|
||||||
|
|
||||||
gb
|
|
||||||
getbitcontext
|
|
||||||
|
|
||||||
OPEN_READER(name, gb)
|
|
||||||
loads gb into local variables
|
|
||||||
|
|
||||||
CLOSE_READER(name, gb)
|
|
||||||
stores local vars in gb
|
|
||||||
|
|
||||||
UPDATE_CACHE(name, gb)
|
|
||||||
refills the internal cache from the bitstream
|
|
||||||
after this call at least MIN_CACHE_BITS will be available,
|
|
||||||
|
|
||||||
GET_CACHE(name, gb)
|
|
||||||
will output the contents of the internal cache, next bit is MSB of 32 or 64 bit (FIXME 64bit)
|
|
||||||
|
|
||||||
SHOW_UBITS(name, gb, num)
|
|
||||||
will return the next num bits
|
|
||||||
|
|
||||||
SHOW_SBITS(name, gb, num)
|
|
||||||
will return the next num bits and do sign extension
|
|
||||||
|
|
||||||
SKIP_BITS(name, gb, num)
|
|
||||||
will skip over the next num bits
|
|
||||||
note, this is equivalent to SKIP_CACHE; SKIP_COUNTER
|
|
||||||
|
|
||||||
SKIP_CACHE(name, gb, num)
|
|
||||||
will remove the next num bits from the cache (note SKIP_COUNTER MUST be called before UPDATE_CACHE / CLOSE_READER)
|
|
||||||
|
|
||||||
SKIP_COUNTER(name, gb, num)
|
|
||||||
will increment the internal bit counter (see SKIP_CACHE & SKIP_BITS)
|
|
||||||
|
|
||||||
LAST_SKIP_CACHE(name, gb, num)
|
|
||||||
will remove the next num bits from the cache if it is needed for UPDATE_CACHE otherwise it will do nothing
|
|
||||||
|
|
||||||
LAST_SKIP_BITS(name, gb, num)
|
|
||||||
is equivalent to LAST_SKIP_CACHE; SKIP_COUNTER
|
|
||||||
|
|
||||||
for examples see get_bits, show_bits, skip_bits, get_vlc
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef ALT_BITSTREAM_READER
|
|
||||||
# define MIN_CACHE_BITS 25
|
|
||||||
|
|
||||||
# define OPEN_READER(name, gb)\
|
|
||||||
unsigned int name##_index= (gb)->index;\
|
|
||||||
int name##_cache= 0;\
|
|
||||||
|
|
||||||
# define CLOSE_READER(name, gb)\
|
|
||||||
(gb)->index= name##_index;\
|
|
||||||
|
|
||||||
# ifdef ALT_BITSTREAM_READER_LE
|
|
||||||
# define UPDATE_CACHE(name, gb)\
|
|
||||||
name##_cache= AV_RL32( ((const uint8_t *)(gb)->buffer)+(name##_index>>3) ) >> (name##_index&0x07);\
|
|
||||||
|
|
||||||
# define SKIP_CACHE(name, gb, num)\
|
|
||||||
name##_cache >>= (num);
|
|
||||||
# else
|
|
||||||
# define UPDATE_CACHE(name, gb)\
|
|
||||||
name##_cache= AV_RB32( ((const uint8_t *)(gb)->buffer)+(name##_index>>3) ) << (name##_index&0x07);\
|
|
||||||
|
|
||||||
# define SKIP_CACHE(name, gb, num)\
|
|
||||||
name##_cache <<= (num);
|
|
||||||
# endif
|
|
||||||
|
|
||||||
// FIXME name?
|
|
||||||
# define SKIP_COUNTER(name, gb, num)\
|
|
||||||
name##_index += (num);\
|
|
||||||
|
|
||||||
# define SKIP_BITS(name, gb, num)\
|
|
||||||
{\
|
|
||||||
SKIP_CACHE(name, gb, num)\
|
|
||||||
SKIP_COUNTER(name, gb, num)\
|
|
||||||
}\
|
|
||||||
|
|
||||||
# define LAST_SKIP_BITS(name, gb, num) SKIP_COUNTER(name, gb, num)
|
|
||||||
# define LAST_SKIP_CACHE(name, gb, num) ;
|
|
||||||
|
|
||||||
# ifdef ALT_BITSTREAM_READER_LE
|
|
||||||
# define SHOW_UBITS(name, gb, num)\
|
|
||||||
zero_extend(name##_cache, num)
|
|
||||||
|
|
||||||
# define SHOW_SBITS(name, gb, num)\
|
|
||||||
sign_extend(name##_cache, num)
|
|
||||||
# else
|
|
||||||
# define SHOW_UBITS(name, gb, num)\
|
|
||||||
NEG_USR32(name##_cache, num)
|
|
||||||
|
|
||||||
# define SHOW_SBITS(name, gb, num)\
|
|
||||||
NEG_SSR32(name##_cache, num)
|
|
||||||
# endif
|
|
||||||
|
|
||||||
# define GET_CACHE(name, gb)\
|
|
||||||
((uint32_t)name##_cache)
|
|
||||||
|
|
||||||
static inline int get_bits_count(const GetBitContext *s){
|
|
||||||
return s->index;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void skip_bits_long(GetBitContext *s, int n){
|
|
||||||
s->index += n;
|
|
||||||
}
|
|
||||||
|
|
||||||
#elif defined LIBMPEG2_BITSTREAM_READER
|
|
||||||
//libmpeg2 like reader
|
|
||||||
|
|
||||||
# define MIN_CACHE_BITS 17
|
|
||||||
|
|
||||||
# define OPEN_READER(name, gb)\
|
|
||||||
int name##_bit_count=(gb)->bit_count;\
|
|
||||||
int name##_cache= (gb)->cache;\
|
|
||||||
uint8_t * name##_buffer_ptr=(gb)->buffer_ptr;\
|
|
||||||
|
|
||||||
# define CLOSE_READER(name, gb)\
|
|
||||||
(gb)->bit_count= name##_bit_count;\
|
|
||||||
(gb)->cache= name##_cache;\
|
|
||||||
(gb)->buffer_ptr= name##_buffer_ptr;\
|
|
||||||
|
|
||||||
# define UPDATE_CACHE(name, gb)\
|
|
||||||
if(name##_bit_count >= 0){\
|
|
||||||
name##_cache+= AV_RB16(name##_buffer_ptr) << name##_bit_count; \
|
|
||||||
name##_buffer_ptr+=2;\
|
|
||||||
name##_bit_count-= 16;\
|
|
||||||
}\
|
|
||||||
|
|
||||||
# define SKIP_CACHE(name, gb, num)\
|
|
||||||
name##_cache <<= (num);\
|
|
||||||
|
|
||||||
# define SKIP_COUNTER(name, gb, num)\
|
|
||||||
name##_bit_count += (num);\
|
|
||||||
|
|
||||||
# define SKIP_BITS(name, gb, num)\
|
|
||||||
{\
|
|
||||||
SKIP_CACHE(name, gb, num)\
|
|
||||||
SKIP_COUNTER(name, gb, num)\
|
|
||||||
}\
|
|
||||||
|
|
||||||
# define LAST_SKIP_BITS(name, gb, num) SKIP_BITS(name, gb, num)
|
|
||||||
# define LAST_SKIP_CACHE(name, gb, num) SKIP_CACHE(name, gb, num)
|
|
||||||
|
|
||||||
# define SHOW_UBITS(name, gb, num)\
|
|
||||||
NEG_USR32(name##_cache, num)
|
|
||||||
|
|
||||||
# define SHOW_SBITS(name, gb, num)\
|
|
||||||
NEG_SSR32(name##_cache, num)
|
|
||||||
|
|
||||||
# define GET_CACHE(name, gb)\
|
|
||||||
((uint32_t)name##_cache)
|
|
||||||
|
|
||||||
static inline int get_bits_count(const GetBitContext *s){
|
|
||||||
return (s->buffer_ptr - s->buffer)*8 - 16 + s->bit_count;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void skip_bits_long(GetBitContext *s, int n){
|
|
||||||
OPEN_READER(re, s)
|
|
||||||
re_bit_count += n;
|
|
||||||
re_buffer_ptr += 2*(re_bit_count>>4);
|
|
||||||
re_bit_count &= 15;
|
|
||||||
re_cache = ((re_buffer_ptr[-2]<<8) + re_buffer_ptr[-1]) << (16+re_bit_count);
|
|
||||||
UPDATE_CACHE(re, s)
|
|
||||||
CLOSE_READER(re, s)
|
|
||||||
}
|
|
||||||
|
|
||||||
#elif defined A32_BITSTREAM_READER
|
|
||||||
|
|
||||||
# define MIN_CACHE_BITS 32
|
|
||||||
|
|
||||||
# define OPEN_READER(name, gb)\
|
|
||||||
int name##_bit_count=(gb)->bit_count;\
|
|
||||||
uint32_t name##_cache0= (gb)->cache0;\
|
|
||||||
uint32_t name##_cache1= (gb)->cache1;\
|
|
||||||
uint32_t * name##_buffer_ptr=(gb)->buffer_ptr;\
|
|
||||||
|
|
||||||
# define CLOSE_READER(name, gb)\
|
|
||||||
(gb)->bit_count= name##_bit_count;\
|
|
||||||
(gb)->cache0= name##_cache0;\
|
|
||||||
(gb)->cache1= name##_cache1;\
|
|
||||||
(gb)->buffer_ptr= name##_buffer_ptr;\
|
|
||||||
|
|
||||||
# define UPDATE_CACHE(name, gb)\
|
|
||||||
if(name##_bit_count > 0){\
|
|
||||||
const uint32_t next= be2me_32( *name##_buffer_ptr );\
|
|
||||||
name##_cache0 |= NEG_USR32(next,name##_bit_count);\
|
|
||||||
name##_cache1 |= next<<name##_bit_count;\
|
|
||||||
name##_buffer_ptr++;\
|
|
||||||
name##_bit_count-= 32;\
|
|
||||||
}\
|
|
||||||
|
|
||||||
#if ARCH_X86
|
|
||||||
# define SKIP_CACHE(name, gb, num)\
|
|
||||||
__asm__(\
|
|
||||||
"shldl %2, %1, %0 \n\t"\
|
|
||||||
"shll %2, %1 \n\t"\
|
|
||||||
: "+r" (name##_cache0), "+r" (name##_cache1)\
|
|
||||||
: "Ic" ((uint8_t)(num))\
|
|
||||||
);
|
|
||||||
#else
|
|
||||||
# define SKIP_CACHE(name, gb, num)\
|
|
||||||
name##_cache0 <<= (num);\
|
|
||||||
name##_cache0 |= NEG_USR32(name##_cache1,num);\
|
|
||||||
name##_cache1 <<= (num);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
# define SKIP_COUNTER(name, gb, num)\
|
|
||||||
name##_bit_count += (num);\
|
|
||||||
|
|
||||||
# define SKIP_BITS(name, gb, num)\
|
|
||||||
{\
|
|
||||||
SKIP_CACHE(name, gb, num)\
|
|
||||||
SKIP_COUNTER(name, gb, num)\
|
|
||||||
}\
|
|
||||||
|
|
||||||
# define LAST_SKIP_BITS(name, gb, num) SKIP_BITS(name, gb, num)
|
|
||||||
# define LAST_SKIP_CACHE(name, gb, num) SKIP_CACHE(name, gb, num)
|
|
||||||
|
|
||||||
# define SHOW_UBITS(name, gb, num)\
|
|
||||||
NEG_USR32(name##_cache0, num)
|
|
||||||
|
|
||||||
# define SHOW_SBITS(name, gb, num)\
|
|
||||||
NEG_SSR32(name##_cache0, num)
|
|
||||||
|
|
||||||
# define GET_CACHE(name, gb)\
|
|
||||||
(name##_cache0)
|
|
||||||
|
|
||||||
static inline int get_bits_count(const GetBitContext *s){
|
|
||||||
return ((uint8_t*)s->buffer_ptr - s->buffer)*8 - 32 + s->bit_count;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void skip_bits_long(GetBitContext *s, int n){
|
|
||||||
OPEN_READER(re, s)
|
|
||||||
re_bit_count += n;
|
|
||||||
re_buffer_ptr += re_bit_count>>5;
|
|
||||||
re_bit_count &= 31;
|
|
||||||
re_cache0 = be2me_32( re_buffer_ptr[-1] ) << re_bit_count;
|
|
||||||
re_cache1 = 0;
|
|
||||||
UPDATE_CACHE(re, s)
|
|
||||||
CLOSE_READER(re, s)
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static inline int get_sbits(GetBitContext *s, int n){
|
|
||||||
register int tmp;
|
|
||||||
OPEN_READER(re, s)
|
|
||||||
UPDATE_CACHE(re, s)
|
|
||||||
tmp= SHOW_SBITS(re, s, n);
|
|
||||||
LAST_SKIP_BITS(re, s, n)
|
|
||||||
CLOSE_READER(re, s)
|
|
||||||
return tmp;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* reads 1-17 bits.
|
|
||||||
* Note, the alt bitstream reader can read up to 25 bits, but the libmpeg2 reader can't
|
|
||||||
*/
|
|
||||||
static inline unsigned int get_bits(GetBitContext *s, int n){
|
|
||||||
register int tmp;
|
|
||||||
OPEN_READER(re, s)
|
|
||||||
UPDATE_CACHE(re, s)
|
|
||||||
tmp= SHOW_UBITS(re, s, n);
|
|
||||||
LAST_SKIP_BITS(re, s, n)
|
|
||||||
CLOSE_READER(re, s)
|
|
||||||
return tmp;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* shows 1-17 bits.
|
|
||||||
* Note, the alt bitstream reader can read up to 25 bits, but the libmpeg2 reader can't
|
|
||||||
*/
|
|
||||||
static inline unsigned int show_bits(GetBitContext *s, int n){
|
|
||||||
register int tmp;
|
|
||||||
OPEN_READER(re, s)
|
|
||||||
UPDATE_CACHE(re, s)
|
|
||||||
tmp= SHOW_UBITS(re, s, n);
|
|
||||||
// CLOSE_READER(re, s)
|
|
||||||
return tmp;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void skip_bits(GetBitContext *s, int n){
|
|
||||||
//Note gcc seems to optimize this to s->index+=n for the ALT_READER :))
|
|
||||||
OPEN_READER(re, s)
|
|
||||||
UPDATE_CACHE(re, s)
|
|
||||||
LAST_SKIP_BITS(re, s, n)
|
|
||||||
CLOSE_READER(re, s)
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline unsigned int get_bits1(GetBitContext *s){
|
|
||||||
#ifdef ALT_BITSTREAM_READER
|
|
||||||
unsigned int index= s->index;
|
|
||||||
uint8_t result= s->buffer[ index>>3 ];
|
|
||||||
#ifdef ALT_BITSTREAM_READER_LE
|
|
||||||
result>>= (index&0x07);
|
|
||||||
result&= 1;
|
|
||||||
#else
|
|
||||||
result<<= (index&0x07);
|
|
||||||
result>>= 8 - 1;
|
|
||||||
#endif
|
|
||||||
index++;
|
|
||||||
s->index= index;
|
|
||||||
|
|
||||||
return result;
|
|
||||||
#else
|
|
||||||
return get_bits(s, 1);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline unsigned int show_bits1(GetBitContext *s){
|
|
||||||
return show_bits(s, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void skip_bits1(GetBitContext *s){
|
|
||||||
skip_bits(s, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* reads 0-32 bits.
|
|
||||||
*/
|
|
||||||
static inline unsigned int get_bits_long(GetBitContext *s, int n){
|
|
||||||
if(n<=MIN_CACHE_BITS) return get_bits(s, n);
|
|
||||||
else{
|
|
||||||
#ifdef ALT_BITSTREAM_READER_LE
|
|
||||||
int ret= get_bits(s, 16);
|
|
||||||
return ret | (get_bits(s, n-16) << 16);
|
|
||||||
#else
|
|
||||||
int ret= get_bits(s, 16) << (n-16);
|
|
||||||
return ret | get_bits(s, n-16);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* shows 0-32 bits.
|
|
||||||
*/
|
|
||||||
static inline unsigned int show_bits_long(GetBitContext *s, int n){
|
|
||||||
if(n<=MIN_CACHE_BITS) return show_bits(s, n);
|
|
||||||
else{
|
|
||||||
GetBitContext gb= *s;
|
|
||||||
return get_bits_long(&gb, n);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* init GetBitContext.
|
|
||||||
* @param buffer bitstream buffer, must be FF_INPUT_BUFFER_PADDING_SIZE bytes larger then the actual read bits
|
|
||||||
* because some optimized bitstream readers read 32 or 64 bit at once and could read over the end
|
|
||||||
* @param bit_size the size of the buffer in bits
|
|
||||||
*
|
|
||||||
* While GetBitContext stores the buffer size, for performance reasons you are
|
|
||||||
* responsible for checking for the buffer end yourself (take advantage of the padding)!
|
|
||||||
*/
|
|
||||||
static inline void init_get_bits(GetBitContext *s,
|
|
||||||
const uint8_t *buffer, int bit_size)
|
|
||||||
{
|
|
||||||
int buffer_size= (bit_size+7)>>3;
|
|
||||||
if(buffer_size < 0 || bit_size < 0) {
|
|
||||||
buffer_size = bit_size = 0;
|
|
||||||
buffer = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
s->buffer= buffer;
|
|
||||||
s->size_in_bits= bit_size;
|
|
||||||
s->buffer_end= buffer + buffer_size;
|
|
||||||
#ifdef ALT_BITSTREAM_READER
|
|
||||||
s->index=0;
|
|
||||||
#elif defined LIBMPEG2_BITSTREAM_READER
|
|
||||||
s->buffer_ptr = (uint8_t*)((intptr_t)buffer&(~1));
|
|
||||||
s->bit_count = 16 + 8*((intptr_t)buffer&1);
|
|
||||||
skip_bits_long(s, 0);
|
|
||||||
#elif defined A32_BITSTREAM_READER
|
|
||||||
s->buffer_ptr = (uint32_t*)((intptr_t)buffer&(~3));
|
|
||||||
s->bit_count = 32 + 8*((intptr_t)buffer&3);
|
|
||||||
skip_bits_long(s, 0);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void align_get_bits(GetBitContext *s)
|
|
||||||
{
|
|
||||||
int n= (-get_bits_count(s)) & 7;
|
|
||||||
if(n) skip_bits(s, n);
|
|
||||||
}
|
|
||||||
|
|
||||||
#define init_vlc(vlc, nb_bits, nb_codes,\
|
|
||||||
bits, bits_wrap, bits_size,\
|
|
||||||
codes, codes_wrap, codes_size,\
|
|
||||||
flags)\
|
|
||||||
init_vlc_sparse(vlc, nb_bits, nb_codes,\
|
|
||||||
bits, bits_wrap, bits_size,\
|
|
||||||
codes, codes_wrap, codes_size,\
|
|
||||||
NULL, 0, 0, flags)
|
|
||||||
|
|
||||||
int init_vlc_sparse(VLC *vlc, int nb_bits, int nb_codes,
|
|
||||||
const void *bits, int bits_wrap, int bits_size,
|
|
||||||
const void *codes, int codes_wrap, int codes_size,
|
|
||||||
const void *symbols, int symbols_wrap, int symbols_size,
|
|
||||||
int flags);
|
|
||||||
#define INIT_VLC_LE 2
|
|
||||||
#define INIT_VLC_USE_NEW_STATIC 4
|
|
||||||
void free_vlc(VLC *vlc);
|
|
||||||
|
|
||||||
#define INIT_VLC_STATIC(vlc, bits, a,b,c,d,e,f,g, static_size)\
|
|
||||||
{\
|
|
||||||
static VLC_TYPE table[static_size][2];\
|
|
||||||
(vlc)->table= table;\
|
|
||||||
(vlc)->table_allocated= static_size;\
|
|
||||||
init_vlc(vlc, bits, a,b,c,d,e,f,g, INIT_VLC_USE_NEW_STATIC);\
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* If the vlc code is invalid and max_depth=1, then no bits will be removed.
|
|
||||||
* If the vlc code is invalid and max_depth>1, then the number of bits removed
|
|
||||||
* is undefined.
|
|
||||||
*/
|
|
||||||
#define GET_VLC(code, name, gb, table, bits, max_depth)\
|
|
||||||
{\
|
|
||||||
int n, nb_bits;\
|
|
||||||
unsigned int index;\
|
|
||||||
\
|
|
||||||
index= SHOW_UBITS(name, gb, bits);\
|
|
||||||
code = table[index][0];\
|
|
||||||
n = table[index][1];\
|
|
||||||
\
|
|
||||||
if(max_depth > 1 && n < 0){\
|
|
||||||
LAST_SKIP_BITS(name, gb, bits)\
|
|
||||||
UPDATE_CACHE(name, gb)\
|
|
||||||
\
|
|
||||||
nb_bits = -n;\
|
|
||||||
\
|
|
||||||
index= SHOW_UBITS(name, gb, nb_bits) + code;\
|
|
||||||
code = table[index][0];\
|
|
||||||
n = table[index][1];\
|
|
||||||
if(max_depth > 2 && n < 0){\
|
|
||||||
LAST_SKIP_BITS(name, gb, nb_bits)\
|
|
||||||
UPDATE_CACHE(name, gb)\
|
|
||||||
\
|
|
||||||
nb_bits = -n;\
|
|
||||||
\
|
|
||||||
index= SHOW_UBITS(name, gb, nb_bits) + code;\
|
|
||||||
code = table[index][0];\
|
|
||||||
n = table[index][1];\
|
|
||||||
}\
|
|
||||||
}\
|
|
||||||
SKIP_BITS(name, gb, n)\
|
|
||||||
}
|
|
||||||
|
|
||||||
#define GET_RL_VLC(level, run, name, gb, table, bits, max_depth, need_update)\
|
|
||||||
{\
|
|
||||||
int n, nb_bits;\
|
|
||||||
unsigned int index;\
|
|
||||||
\
|
|
||||||
index= SHOW_UBITS(name, gb, bits);\
|
|
||||||
level = table[index].level;\
|
|
||||||
n = table[index].len;\
|
|
||||||
\
|
|
||||||
if(max_depth > 1 && n < 0){\
|
|
||||||
SKIP_BITS(name, gb, bits)\
|
|
||||||
if(need_update){\
|
|
||||||
UPDATE_CACHE(name, gb)\
|
|
||||||
}\
|
|
||||||
\
|
|
||||||
nb_bits = -n;\
|
|
||||||
\
|
|
||||||
index= SHOW_UBITS(name, gb, nb_bits) + level;\
|
|
||||||
level = table[index].level;\
|
|
||||||
n = table[index].len;\
|
|
||||||
}\
|
|
||||||
run= table[index].run;\
|
|
||||||
SKIP_BITS(name, gb, n)\
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* parses a vlc code, faster then get_vlc()
|
|
||||||
* @param bits is the number of bits which will be read at once, must be
|
|
||||||
* identical to nb_bits in init_vlc()
|
|
||||||
* @param max_depth is the number of times bits bits must be read to completely
|
|
||||||
* read the longest vlc code
|
|
||||||
* = (max_vlc_length + bits - 1) / bits
|
|
||||||
*/
|
|
||||||
static inline int get_vlc2(GetBitContext *s, VLC_TYPE (*table)[2],
|
|
||||||
int bits, int max_depth)
|
|
||||||
{
|
|
||||||
int code;
|
|
||||||
|
|
||||||
OPEN_READER(re, s)
|
|
||||||
UPDATE_CACHE(re, s)
|
|
||||||
|
|
||||||
GET_VLC(code, re, s, table, bits, max_depth)
|
|
||||||
|
|
||||||
CLOSE_READER(re, s)
|
|
||||||
return code;
|
|
||||||
}
|
|
||||||
|
|
||||||
//#define TRACE
|
|
||||||
|
|
||||||
#ifdef TRACE
|
|
||||||
static inline void print_bin(int bits, int n){
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for(i=n-1; i>=0; i--){
|
|
||||||
av_log(NULL, AV_LOG_DEBUG, "%d", (bits>>i)&1);
|
|
||||||
}
|
|
||||||
for(i=n; i<24; i++)
|
|
||||||
av_log(NULL, AV_LOG_DEBUG, " ");
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int get_bits_trace(GetBitContext *s, int n, char *file, const char *func, int line){
|
|
||||||
int r= get_bits(s, n);
|
|
||||||
|
|
||||||
print_bin(r, n);
|
|
||||||
av_log(NULL, AV_LOG_DEBUG, "%5d %2d %3d bit @%5d in %s %s:%d\n", r, n, r, get_bits_count(s)-n, file, func, line);
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
static inline int get_vlc_trace(GetBitContext *s, VLC_TYPE (*table)[2], int bits, int max_depth, char *file, const char *func, int line){
|
|
||||||
int show= show_bits(s, 24);
|
|
||||||
int pos= get_bits_count(s);
|
|
||||||
int r= get_vlc2(s, table, bits, max_depth);
|
|
||||||
int len= get_bits_count(s) - pos;
|
|
||||||
int bits2= show>>(24-len);
|
|
||||||
|
|
||||||
print_bin(bits2, len);
|
|
||||||
|
|
||||||
av_log(NULL, AV_LOG_DEBUG, "%5d %2d %3d vlc @%5d in %s %s:%d\n", bits2, len, r, pos, file, func, line);
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
static inline int get_xbits_trace(GetBitContext *s, int n, char *file, const char *func, int line){
|
|
||||||
int show= show_bits(s, n);
|
|
||||||
int r= get_xbits(s, n);
|
|
||||||
|
|
||||||
print_bin(show, n);
|
|
||||||
av_log(NULL, AV_LOG_DEBUG, "%5d %2d %3d xbt @%5d in %s %s:%d\n", show, n, r, get_bits_count(s)-n, file, func, line);
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define get_bits(s, n) get_bits_trace(s, n, __FILE__, __PRETTY_FUNCTION__, __LINE__)
|
|
||||||
#define get_bits1(s) get_bits_trace(s, 1, __FILE__, __PRETTY_FUNCTION__, __LINE__)
|
|
||||||
#define get_xbits(s, n) get_xbits_trace(s, n, __FILE__, __PRETTY_FUNCTION__, __LINE__)
|
|
||||||
#define get_vlc(s, vlc) get_vlc_trace(s, (vlc)->table, (vlc)->bits, 3, __FILE__, __PRETTY_FUNCTION__, __LINE__)
|
|
||||||
#define get_vlc2(s, tab, bits, max) get_vlc_trace(s, tab, bits, max, __FILE__, __PRETTY_FUNCTION__, __LINE__)
|
|
||||||
|
|
||||||
#define tprintf(p, ...) av_log(p, AV_LOG_DEBUG, __VA_ARGS__)
|
|
||||||
|
|
||||||
#else //TRACE
|
|
||||||
#define tprintf(p, ...) {}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static inline int decode012(GetBitContext *gb){
|
|
||||||
int n;
|
|
||||||
n = get_bits1(gb);
|
|
||||||
if (n == 0)
|
|
||||||
return 0;
|
|
||||||
else
|
|
||||||
return get_bits1(gb) + 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int decode210(GetBitContext *gb){
|
|
||||||
if (get_bits1(gb))
|
|
||||||
return 0;
|
|
||||||
else
|
|
||||||
return 2 - get_bits1(gb);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int get_bits_left(GetBitContext *gb)
|
|
||||||
{
|
|
||||||
return gb->size_in_bits - get_bits_count(gb);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* AVCODEC_GET_BITS_H */
|
|
||||||
|
|
@ -1,89 +0,0 @@
|
||||||
/*
|
|
||||||
* copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>
|
|
||||||
*
|
|
||||||
* This file is part of FFmpeg.
|
|
||||||
*
|
|
||||||
* FFmpeg is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
|
||||||
* License as published by the Free Software Foundation; either
|
|
||||||
* version 2.1 of the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* FFmpeg is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* Lesser General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Lesser General Public
|
|
||||||
* License along with FFmpeg; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @file libavutil/bswap.h
|
|
||||||
* byte swapping routines
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef AVUTIL_BSWAP_H
|
|
||||||
#define AVUTIL_BSWAP_H
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
//#include "config.h"
|
|
||||||
|
|
||||||
#ifndef bswap_16
|
|
||||||
static inline uint16_t bswap_16(uint16_t x)
|
|
||||||
{
|
|
||||||
x= (x>>8) | (x<<8);
|
|
||||||
return x;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef bswap_32
|
|
||||||
static inline uint32_t bswap_32(uint32_t x)
|
|
||||||
{
|
|
||||||
x= ((x<<8)&0xFF00FF00) | ((x>>8)&0x00FF00FF);
|
|
||||||
x= (x>>16) | (x<<16);
|
|
||||||
return x;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef bswap_64
|
|
||||||
static inline uint64_t bswap_64(uint64_t x)
|
|
||||||
{
|
|
||||||
#if 0
|
|
||||||
x= ((x<< 8)&0xFF00FF00FF00FF00ULL) | ((x>> 8)&0x00FF00FF00FF00FFULL);
|
|
||||||
x= ((x<<16)&0xFFFF0000FFFF0000ULL) | ((x>>16)&0x0000FFFF0000FFFFULL);
|
|
||||||
return (x>>32) | (x<<32);
|
|
||||||
#else
|
|
||||||
union {
|
|
||||||
uint64_t ll;
|
|
||||||
uint32_t l[2];
|
|
||||||
} w, r;
|
|
||||||
w.ll = x;
|
|
||||||
r.l[0] = bswap_32 (w.l[1]);
|
|
||||||
r.l[1] = bswap_32 (w.l[0]);
|
|
||||||
return r.ll;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// be2me ... big-endian to machine-endian
|
|
||||||
// le2me ... little-endian to machine-endian
|
|
||||||
|
|
||||||
#define HAVE_BIGENDIAN 0
|
|
||||||
#if HAVE_BIGENDIAN
|
|
||||||
#define be2me_16(x) (x)
|
|
||||||
#define be2me_32(x) (x)
|
|
||||||
#define be2me_64(x) (x)
|
|
||||||
#define le2me_16(x) bswap_16(x)
|
|
||||||
#define le2me_32(x) bswap_32(x)
|
|
||||||
#define le2me_64(x) bswap_64(x)
|
|
||||||
#else
|
|
||||||
#define be2me_16(x) bswap_16(x)
|
|
||||||
#define be2me_32(x) bswap_32(x)
|
|
||||||
#define be2me_64(x) bswap_64(x)
|
|
||||||
#define le2me_16(x) (x)
|
|
||||||
#define le2me_32(x) (x)
|
|
||||||
#define le2me_64(x) (x)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* AVUTIL_BSWAP_H */
|
|
||||||
|
|
@ -1,483 +0,0 @@
|
||||||
/*
|
|
||||||
* This file is part of FFmpeg.
|
|
||||||
*
|
|
||||||
* FFmpeg is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
|
||||||
* License as published by the Free Software Foundation; either
|
|
||||||
* version 2.1 of the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* FFmpeg is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* Lesser General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Lesser General Public
|
|
||||||
* License along with FFmpeg; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef AVUTIL_INTREADWRITE_H
|
|
||||||
#define AVUTIL_INTREADWRITE_H
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
//#include "config.h"
|
|
||||||
#include "bswap.h"
|
|
||||||
//#include "common.h"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Arch-specific headers can provide any combination of
|
|
||||||
* AV_[RW][BLN](16|24|32|64) and AV_(COPY|SWAP|ZERO)(64|128) macros.
|
|
||||||
* Preprocessor symbols must be defined, even if these are implemented
|
|
||||||
* as inline functions.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Map AV_RNXX <-> AV_R[BL]XX for all variants provided by per-arch headers.
|
|
||||||
*/
|
|
||||||
#define HAVE_BIGENDIAN 0
|
|
||||||
#if HAVE_BIGENDIAN
|
|
||||||
|
|
||||||
# if defined(AV_RN16) && !defined(AV_RB16)
|
|
||||||
# define AV_RB16(p) AV_RN16(p)
|
|
||||||
# elif !defined(AV_RN16) && defined(AV_RB16)
|
|
||||||
# define AV_RN16(p) AV_RB16(p)
|
|
||||||
# endif
|
|
||||||
|
|
||||||
# if defined(AV_WN16) && !defined(AV_WB16)
|
|
||||||
# define AV_WB16(p, v) AV_WN16(p, v)
|
|
||||||
# elif !defined(AV_WN16) && defined(AV_WB16)
|
|
||||||
# define AV_WN16(p, v) AV_WB16(p, v)
|
|
||||||
# endif
|
|
||||||
|
|
||||||
# if defined(AV_RN24) && !defined(AV_RB24)
|
|
||||||
# define AV_RB24(p) AV_RN24(p)
|
|
||||||
# elif !defined(AV_RN24) && defined(AV_RB24)
|
|
||||||
# define AV_RN24(p) AV_RB24(p)
|
|
||||||
# endif
|
|
||||||
|
|
||||||
# if defined(AV_WN24) && !defined(AV_WB24)
|
|
||||||
# define AV_WB24(p, v) AV_WN24(p, v)
|
|
||||||
# elif !defined(AV_WN24) && defined(AV_WB24)
|
|
||||||
# define AV_WN24(p, v) AV_WB24(p, v)
|
|
||||||
# endif
|
|
||||||
|
|
||||||
# if defined(AV_RN32) && !defined(AV_RB32)
|
|
||||||
# define AV_RB32(p) AV_RN32(p)
|
|
||||||
# elif !defined(AV_RN32) && defined(AV_RB32)
|
|
||||||
# define AV_RN32(p) AV_RB32(p)
|
|
||||||
# endif
|
|
||||||
|
|
||||||
# if defined(AV_WN32) && !defined(AV_WB32)
|
|
||||||
# define AV_WB32(p, v) AV_WN32(p, v)
|
|
||||||
# elif !defined(AV_WN32) && defined(AV_WB32)
|
|
||||||
# define AV_WN32(p, v) AV_WB32(p, v)
|
|
||||||
# endif
|
|
||||||
|
|
||||||
# if defined(AV_RN64) && !defined(AV_RB64)
|
|
||||||
# define AV_RB64(p) AV_RN64(p)
|
|
||||||
# elif !defined(AV_RN64) && defined(AV_RB64)
|
|
||||||
# define AV_RN64(p) AV_RB64(p)
|
|
||||||
# endif
|
|
||||||
|
|
||||||
# if defined(AV_WN64) && !defined(AV_WB64)
|
|
||||||
# define AV_WB64(p, v) AV_WN64(p, v)
|
|
||||||
# elif !defined(AV_WN64) && defined(AV_WB64)
|
|
||||||
# define AV_WN64(p, v) AV_WB64(p, v)
|
|
||||||
# endif
|
|
||||||
|
|
||||||
#else /* HAVE_BIGENDIAN */
|
|
||||||
|
|
||||||
# if defined(AV_RN16) && !defined(AV_RL16)
|
|
||||||
# define AV_RL16(p) AV_RN16(p)
|
|
||||||
# elif !defined(AV_RN16) && defined(AV_RL16)
|
|
||||||
# define AV_RN16(p) AV_RL16(p)
|
|
||||||
# endif
|
|
||||||
|
|
||||||
# if defined(AV_WN16) && !defined(AV_WL16)
|
|
||||||
# define AV_WL16(p, v) AV_WN16(p, v)
|
|
||||||
# elif !defined(AV_WN16) && defined(AV_WL16)
|
|
||||||
# define AV_WN16(p, v) AV_WL16(p, v)
|
|
||||||
# endif
|
|
||||||
|
|
||||||
# if defined(AV_RN24) && !defined(AV_RL24)
|
|
||||||
# define AV_RL24(p) AV_RN24(p)
|
|
||||||
# elif !defined(AV_RN24) && defined(AV_RL24)
|
|
||||||
# define AV_RN24(p) AV_RL24(p)
|
|
||||||
# endif
|
|
||||||
|
|
||||||
# if defined(AV_WN24) && !defined(AV_WL24)
|
|
||||||
# define AV_WL24(p, v) AV_WN24(p, v)
|
|
||||||
# elif !defined(AV_WN24) && defined(AV_WL24)
|
|
||||||
# define AV_WN24(p, v) AV_WL24(p, v)
|
|
||||||
# endif
|
|
||||||
|
|
||||||
# if defined(AV_RN32) && !defined(AV_RL32)
|
|
||||||
# define AV_RL32(p) AV_RN32(p)
|
|
||||||
# elif !defined(AV_RN32) && defined(AV_RL32)
|
|
||||||
# define AV_RN32(p) AV_RL32(p)
|
|
||||||
# endif
|
|
||||||
|
|
||||||
# if defined(AV_WN32) && !defined(AV_WL32)
|
|
||||||
# define AV_WL32(p, v) AV_WN32(p, v)
|
|
||||||
# elif !defined(AV_WN32) && defined(AV_WL32)
|
|
||||||
# define AV_WN32(p, v) AV_WL32(p, v)
|
|
||||||
# endif
|
|
||||||
|
|
||||||
# if defined(AV_RN64) && !defined(AV_RL64)
|
|
||||||
# define AV_RL64(p) AV_RN64(p)
|
|
||||||
# elif !defined(AV_RN64) && defined(AV_RL64)
|
|
||||||
# define AV_RN64(p) AV_RL64(p)
|
|
||||||
# endif
|
|
||||||
|
|
||||||
# if defined(AV_WN64) && !defined(AV_WL64)
|
|
||||||
# define AV_WL64(p, v) AV_WN64(p, v)
|
|
||||||
# elif !defined(AV_WN64) && defined(AV_WL64)
|
|
||||||
# define AV_WN64(p, v) AV_WL64(p, v)
|
|
||||||
# endif
|
|
||||||
|
|
||||||
#endif /* !HAVE_BIGENDIAN */
|
|
||||||
|
|
||||||
#define HAVE_ATTRIBUTE_PACKED 0
|
|
||||||
#define HAVE_FAST_UNALIGNED 0
|
|
||||||
/*
|
|
||||||
* Define AV_[RW]N helper macros to simplify definitions not provided
|
|
||||||
* by per-arch headers.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#if HAVE_ATTRIBUTE_PACKED
|
|
||||||
|
|
||||||
union unaligned_64 { uint64_t l; } __attribute__((packed)) av_alias;
|
|
||||||
union unaligned_32 { uint32_t l; } __attribute__((packed)) av_alias;
|
|
||||||
union unaligned_16 { uint16_t l; } __attribute__((packed)) av_alias;
|
|
||||||
|
|
||||||
# define AV_RN(s, p) (((const union unaligned_##s *) (p))->l)
|
|
||||||
# define AV_WN(s, p, v) ((((union unaligned_##s *) (p))->l) = (v))
|
|
||||||
|
|
||||||
#elif defined(__DECC)
|
|
||||||
|
|
||||||
# define AV_RN(s, p) (*((const __unaligned uint##s##_t*)(p)))
|
|
||||||
# define AV_WN(s, p, v) (*((__unaligned uint##s##_t*)(p)) = (v))
|
|
||||||
|
|
||||||
#elif HAVE_FAST_UNALIGNED
|
|
||||||
|
|
||||||
# define AV_RN(s, p) (((const av_alias##s*)(p))->u##s)
|
|
||||||
# define AV_WN(s, p, v) (((av_alias##s*)(p))->u##s = (v))
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
#ifndef AV_RB16
|
|
||||||
# define AV_RB16(x) \
|
|
||||||
((((const uint8_t*)(x))[0] << 8) | \
|
|
||||||
((const uint8_t*)(x))[1])
|
|
||||||
#endif
|
|
||||||
#ifndef AV_WB16
|
|
||||||
# define AV_WB16(p, d) do { \
|
|
||||||
((uint8_t*)(p))[1] = (d); \
|
|
||||||
((uint8_t*)(p))[0] = (d)>>8; \
|
|
||||||
} while(0)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef AV_RL16
|
|
||||||
# define AV_RL16(x) \
|
|
||||||
((((const uint8_t*)(x))[1] << 8) | \
|
|
||||||
((const uint8_t*)(x))[0])
|
|
||||||
#endif
|
|
||||||
#ifndef AV_WL16
|
|
||||||
# define AV_WL16(p, d) do { \
|
|
||||||
((uint8_t*)(p))[0] = (d); \
|
|
||||||
((uint8_t*)(p))[1] = (d)>>8; \
|
|
||||||
} while(0)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef AV_RB32
|
|
||||||
# define AV_RB32(x) \
|
|
||||||
((((const uint8_t*)(x))[0] << 24) | \
|
|
||||||
(((const uint8_t*)(x))[1] << 16) | \
|
|
||||||
(((const uint8_t*)(x))[2] << 8) | \
|
|
||||||
((const uint8_t*)(x))[3])
|
|
||||||
#endif
|
|
||||||
#ifndef AV_WB32
|
|
||||||
# define AV_WB32(p, d) do { \
|
|
||||||
((uint8_t*)(p))[3] = (d); \
|
|
||||||
((uint8_t*)(p))[2] = (d)>>8; \
|
|
||||||
((uint8_t*)(p))[1] = (d)>>16; \
|
|
||||||
((uint8_t*)(p))[0] = (d)>>24; \
|
|
||||||
} while(0)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef AV_RL32
|
|
||||||
# define AV_RL32(x) \
|
|
||||||
((((const uint8_t*)(x))[3] << 24) | \
|
|
||||||
(((const uint8_t*)(x))[2] << 16) | \
|
|
||||||
(((const uint8_t*)(x))[1] << 8) | \
|
|
||||||
((const uint8_t*)(x))[0])
|
|
||||||
#endif
|
|
||||||
#ifndef AV_WL32
|
|
||||||
# define AV_WL32(p, d) do { \
|
|
||||||
((uint8_t*)(p))[0] = (d); \
|
|
||||||
((uint8_t*)(p))[1] = (d)>>8; \
|
|
||||||
((uint8_t*)(p))[2] = (d)>>16; \
|
|
||||||
((uint8_t*)(p))[3] = (d)>>24; \
|
|
||||||
} while(0)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef AV_RB64
|
|
||||||
# define AV_RB64(x) \
|
|
||||||
(((uint64_t)((const uint8_t*)(x))[0] << 56) | \
|
|
||||||
((uint64_t)((const uint8_t*)(x))[1] << 48) | \
|
|
||||||
((uint64_t)((const uint8_t*)(x))[2] << 40) | \
|
|
||||||
((uint64_t)((const uint8_t*)(x))[3] << 32) | \
|
|
||||||
((uint64_t)((const uint8_t*)(x))[4] << 24) | \
|
|
||||||
((uint64_t)((const uint8_t*)(x))[5] << 16) | \
|
|
||||||
((uint64_t)((const uint8_t*)(x))[6] << 8) | \
|
|
||||||
(uint64_t)((const uint8_t*)(x))[7])
|
|
||||||
#endif
|
|
||||||
#ifndef AV_WB64
|
|
||||||
# define AV_WB64(p, d) do { \
|
|
||||||
((uint8_t*)(p))[7] = (d); \
|
|
||||||
((uint8_t*)(p))[6] = (d)>>8; \
|
|
||||||
((uint8_t*)(p))[5] = (d)>>16; \
|
|
||||||
((uint8_t*)(p))[4] = (d)>>24; \
|
|
||||||
((uint8_t*)(p))[3] = (d)>>32; \
|
|
||||||
((uint8_t*)(p))[2] = (d)>>40; \
|
|
||||||
((uint8_t*)(p))[1] = (d)>>48; \
|
|
||||||
((uint8_t*)(p))[0] = (d)>>56; \
|
|
||||||
} while(0)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef AV_RL64
|
|
||||||
# define AV_RL64(x) \
|
|
||||||
(((uint64_t)((const uint8_t*)(x))[7] << 56) | \
|
|
||||||
((uint64_t)((const uint8_t*)(x))[6] << 48) | \
|
|
||||||
((uint64_t)((const uint8_t*)(x))[5] << 40) | \
|
|
||||||
((uint64_t)((const uint8_t*)(x))[4] << 32) | \
|
|
||||||
((uint64_t)((const uint8_t*)(x))[3] << 24) | \
|
|
||||||
((uint64_t)((const uint8_t*)(x))[2] << 16) | \
|
|
||||||
((uint64_t)((const uint8_t*)(x))[1] << 8) | \
|
|
||||||
(uint64_t)((const uint8_t*)(x))[0])
|
|
||||||
#endif
|
|
||||||
#ifndef AV_WL64
|
|
||||||
# define AV_WL64(p, d) do { \
|
|
||||||
((uint8_t*)(p))[0] = (d); \
|
|
||||||
((uint8_t*)(p))[1] = (d)>>8; \
|
|
||||||
((uint8_t*)(p))[2] = (d)>>16; \
|
|
||||||
((uint8_t*)(p))[3] = (d)>>24; \
|
|
||||||
((uint8_t*)(p))[4] = (d)>>32; \
|
|
||||||
((uint8_t*)(p))[5] = (d)>>40; \
|
|
||||||
((uint8_t*)(p))[6] = (d)>>48; \
|
|
||||||
((uint8_t*)(p))[7] = (d)>>56; \
|
|
||||||
} while(0)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if HAVE_BIGENDIAN
|
|
||||||
# define AV_RN(s, p) AV_RB##s(p)
|
|
||||||
# define AV_WN(s, p, v) AV_WB##s(p, v)
|
|
||||||
#else
|
|
||||||
# define AV_RN(s, p) AV_RL##s(p)
|
|
||||||
# define AV_WN(s, p, v) AV_WL##s(p, v)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* HAVE_FAST_UNALIGNED */
|
|
||||||
|
|
||||||
#ifndef AV_RN16
|
|
||||||
# define AV_RN16(p) AV_RN(16, p)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef AV_RN32
|
|
||||||
# define AV_RN32(p) AV_RN(32, p)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef AV_RN64
|
|
||||||
# define AV_RN64(p) AV_RN(64, p)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef AV_WN16
|
|
||||||
# define AV_WN16(p, v) AV_WN(16, p, v)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef AV_WN32
|
|
||||||
# define AV_WN32(p, v) AV_WN(32, p, v)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef AV_WN64
|
|
||||||
# define AV_WN64(p, v) AV_WN(64, p, v)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if HAVE_BIGENDIAN
|
|
||||||
# define AV_RB(s, p) AV_RN##s(p)
|
|
||||||
# define AV_WB(s, p, v) AV_WN##s(p, v)
|
|
||||||
# define AV_RL(s, p) bswap_##s(AV_RN##s(p))
|
|
||||||
# define AV_WL(s, p, v) AV_WN##s(p, bswap_##s(v))
|
|
||||||
#else
|
|
||||||
# define AV_RB(s, p) bswap_##s(AV_RN##s(p))
|
|
||||||
# define AV_WB(s, p, v) AV_WN##s(p, bswap_##s(v))
|
|
||||||
# define AV_RL(s, p) AV_RN##s(p)
|
|
||||||
# define AV_WL(s, p, v) AV_WN##s(p, v)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define AV_RB8(x) (((const uint8_t*)(x))[0])
|
|
||||||
#define AV_WB8(p, d) do { ((uint8_t*)(p))[0] = (d); } while(0)
|
|
||||||
|
|
||||||
#define AV_RL8(x) AV_RB8(x)
|
|
||||||
#define AV_WL8(p, d) AV_WB8(p, d)
|
|
||||||
|
|
||||||
#ifndef AV_RB16
|
|
||||||
# define AV_RB16(p) AV_RB(16, p)
|
|
||||||
#endif
|
|
||||||
#ifndef AV_WB16
|
|
||||||
# define AV_WB16(p, v) AV_WB(16, p, v)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef AV_RL16
|
|
||||||
# define AV_RL16(p) AV_RL(16, p)
|
|
||||||
#endif
|
|
||||||
#ifndef AV_WL16
|
|
||||||
# define AV_WL16(p, v) AV_WL(16, p, v)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef AV_RB32
|
|
||||||
# define AV_RB32(p) AV_RB(32, p)
|
|
||||||
#endif
|
|
||||||
#ifndef AV_WB32
|
|
||||||
# define AV_WB32(p, v) AV_WB(32, p, v)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef AV_RL32
|
|
||||||
# define AV_RL32(p) AV_RL(32, p)
|
|
||||||
#endif
|
|
||||||
#ifndef AV_WL32
|
|
||||||
# define AV_WL32(p, v) AV_WL(32, p, v)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef AV_RB64
|
|
||||||
# define AV_RB64(p) AV_RB(64, p)
|
|
||||||
#endif
|
|
||||||
#ifndef AV_WB64
|
|
||||||
# define AV_WB64(p, v) AV_WB(64, p, v)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef AV_RL64
|
|
||||||
# define AV_RL64(p) AV_RL(64, p)
|
|
||||||
#endif
|
|
||||||
#ifndef AV_WL64
|
|
||||||
# define AV_WL64(p, v) AV_WL(64, p, v)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef AV_RB24
|
|
||||||
# define AV_RB24(x) \
|
|
||||||
((((const uint8_t*)(x))[0] << 16) | \
|
|
||||||
(((const uint8_t*)(x))[1] << 8) | \
|
|
||||||
((const uint8_t*)(x))[2])
|
|
||||||
#endif
|
|
||||||
#ifndef AV_WB24
|
|
||||||
# define AV_WB24(p, d) do { \
|
|
||||||
((uint8_t*)(p))[2] = (d); \
|
|
||||||
((uint8_t*)(p))[1] = (d)>>8; \
|
|
||||||
((uint8_t*)(p))[0] = (d)>>16; \
|
|
||||||
} while(0)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef AV_RL24
|
|
||||||
# define AV_RL24(x) \
|
|
||||||
((((const uint8_t*)(x))[2] << 16) | \
|
|
||||||
(((const uint8_t*)(x))[1] << 8) | \
|
|
||||||
((const uint8_t*)(x))[0])
|
|
||||||
#endif
|
|
||||||
#ifndef AV_WL24
|
|
||||||
# define AV_WL24(p, d) do { \
|
|
||||||
((uint8_t*)(p))[0] = (d); \
|
|
||||||
((uint8_t*)(p))[1] = (d)>>8; \
|
|
||||||
((uint8_t*)(p))[2] = (d)>>16; \
|
|
||||||
} while(0)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The AV_[RW]NA macros access naturally aligned data
|
|
||||||
* in a type-safe way.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define AV_RNA(s, p) (((const av_alias##s*)(p))->u##s)
|
|
||||||
#define AV_WNA(s, p, v) (((av_alias##s*)(p))->u##s = (v))
|
|
||||||
|
|
||||||
#ifndef AV_RN16A
|
|
||||||
# define AV_RN16A(p) AV_RNA(16, p)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef AV_RN32A
|
|
||||||
# define AV_RN32A(p) AV_RNA(32, p)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef AV_RN64A
|
|
||||||
# define AV_RN64A(p) AV_RNA(64, p)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef AV_WN16A
|
|
||||||
# define AV_WN16A(p, v) AV_WNA(16, p, v)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef AV_WN32A
|
|
||||||
# define AV_WN32A(p, v) AV_WNA(32, p, v)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef AV_WN64A
|
|
||||||
# define AV_WN64A(p, v) AV_WNA(64, p, v)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Parameters for AV_COPY*, AV_SWAP*, AV_ZERO* must be
|
|
||||||
* naturally aligned. They may be implemented using MMX,
|
|
||||||
* so emms_c() must be called before using any float code
|
|
||||||
* afterwards.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define AV_COPY(n, d, s) \
|
|
||||||
(((av_alias##n*)(d))->u##n = ((const av_alias##n*)(s))->u##n)
|
|
||||||
|
|
||||||
#ifndef AV_COPY16
|
|
||||||
# define AV_COPY16(d, s) AV_COPY(16, d, s)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef AV_COPY32
|
|
||||||
# define AV_COPY32(d, s) AV_COPY(32, d, s)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef AV_COPY64
|
|
||||||
# define AV_COPY64(d, s) AV_COPY(64, d, s)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef AV_COPY128
|
|
||||||
# define AV_COPY128(d, s) \
|
|
||||||
do { \
|
|
||||||
AV_COPY64(d, s); \
|
|
||||||
AV_COPY64((char*)(d)+8, (char*)(s)+8); \
|
|
||||||
} while(0)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define AV_SWAP(n, a, b) FFSWAP(av_alias##n, *(av_alias##n*)(a), *(av_alias##n*)(b))
|
|
||||||
|
|
||||||
#ifndef AV_SWAP64
|
|
||||||
# define AV_SWAP64(a, b) AV_SWAP(64, a, b)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define AV_ZERO(n, d) (((av_alias##n*)(d))->u##n = 0)
|
|
||||||
|
|
||||||
#ifndef AV_ZERO16
|
|
||||||
# define AV_ZERO16(d) AV_ZERO(16, d)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef AV_ZERO32
|
|
||||||
# define AV_ZERO32(d) AV_ZERO(32, d)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef AV_ZERO64
|
|
||||||
# define AV_ZERO64(d) AV_ZERO(64, d)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef AV_ZERO128
|
|
||||||
# define AV_ZERO128(d) \
|
|
||||||
do { \
|
|
||||||
AV_ZERO64(d); \
|
|
||||||
AV_ZERO64((char*)(d)+8); \
|
|
||||||
} while(0)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* AVUTIL_INTREADWRITE_H */
|
|
||||||
|
|
@ -1,328 +0,0 @@
|
||||||
/*
|
|
||||||
* copyright (c) 2004 Michael Niedermayer <michaelni@gmx.at>
|
|
||||||
*
|
|
||||||
* This file is part of FFmpeg.
|
|
||||||
*
|
|
||||||
* FFmpeg is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
|
||||||
* License as published by the Free Software Foundation; either
|
|
||||||
* version 2.1 of the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* FFmpeg is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* Lesser General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Lesser General Public
|
|
||||||
* License along with FFmpeg; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @file libavcodec/put_bits.h
|
|
||||||
* bitstream writer API
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef AVCODEC_PUT_BITS_H
|
|
||||||
#define AVCODEC_PUT_BITS_H
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
//#include <assert.h>
|
|
||||||
#include "libavutil/bswap.h"
|
|
||||||
//#include "libavutil/common.h"
|
|
||||||
//#include "libavutil/intreadwrite.h"
|
|
||||||
//#include "libavutil/log.h"
|
|
||||||
|
|
||||||
#define av_log(...)
|
|
||||||
|
|
||||||
//#define ALT_BITSTREAM_WRITER
|
|
||||||
//#define ALIGNED_BITSTREAM_WRITER
|
|
||||||
#define HAVE_FAST_UNALIGNED 0
|
|
||||||
/* buf and buf_end must be present and used by every alternative writer. */
|
|
||||||
typedef struct PutBitContext {
|
|
||||||
#ifdef ALT_BITSTREAM_WRITER
|
|
||||||
uint8_t *buf, *buf_end;
|
|
||||||
int index;
|
|
||||||
#else
|
|
||||||
uint32_t bit_buf;
|
|
||||||
int bit_left;
|
|
||||||
uint8_t *buf, *buf_ptr, *buf_end;
|
|
||||||
#endif
|
|
||||||
int size_in_bits;
|
|
||||||
} PutBitContext;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Initializes the PutBitContext s.
|
|
||||||
*
|
|
||||||
* @param buffer the buffer where to put bits
|
|
||||||
* @param buffer_size the size in bytes of buffer
|
|
||||||
*/
|
|
||||||
static inline void init_put_bits(PutBitContext *s, uint8_t *buffer, int buffer_size)
|
|
||||||
{
|
|
||||||
if(buffer_size < 0) {
|
|
||||||
buffer_size = 0;
|
|
||||||
buffer = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
s->size_in_bits= 8*buffer_size;
|
|
||||||
s->buf = buffer;
|
|
||||||
s->buf_end = s->buf + buffer_size;
|
|
||||||
#ifdef ALT_BITSTREAM_WRITER
|
|
||||||
s->index=0;
|
|
||||||
((uint32_t*)(s->buf))[0]=0;
|
|
||||||
// memset(buffer, 0, buffer_size);
|
|
||||||
#else
|
|
||||||
s->buf_ptr = s->buf;
|
|
||||||
s->bit_left=32;
|
|
||||||
s->bit_buf=0;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the total number of bits written to the bitstream.
|
|
||||||
*/
|
|
||||||
static inline int put_bits_count(PutBitContext *s)
|
|
||||||
{
|
|
||||||
#ifdef ALT_BITSTREAM_WRITER
|
|
||||||
return s->index;
|
|
||||||
#else
|
|
||||||
return (s->buf_ptr - s->buf) * 8 + 32 - s->bit_left;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Pads the end of the output stream with zeros.
|
|
||||||
*/
|
|
||||||
static inline void flush_put_bits(PutBitContext *s)
|
|
||||||
{
|
|
||||||
#ifdef ALT_BITSTREAM_WRITER
|
|
||||||
align_put_bits(s);
|
|
||||||
#else
|
|
||||||
#ifndef BITSTREAM_WRITER_LE
|
|
||||||
s->bit_buf<<= s->bit_left;
|
|
||||||
#endif
|
|
||||||
while (s->bit_left < 32) {
|
|
||||||
/* XXX: should test end of buffer */
|
|
||||||
#ifdef BITSTREAM_WRITER_LE
|
|
||||||
*s->buf_ptr++=s->bit_buf;
|
|
||||||
s->bit_buf>>=8;
|
|
||||||
#else
|
|
||||||
*s->buf_ptr++=s->bit_buf >> 24;
|
|
||||||
s->bit_buf<<=8;
|
|
||||||
#endif
|
|
||||||
s->bit_left+=8;
|
|
||||||
}
|
|
||||||
s->bit_left=32;
|
|
||||||
s->bit_buf=0;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
#if defined(ALT_BITSTREAM_WRITER) || defined(BITSTREAM_WRITER_LE)
|
|
||||||
#define align_put_bits align_put_bits_unsupported_here
|
|
||||||
#define ff_put_string ff_put_string_unsupported_here
|
|
||||||
#define ff_copy_bits ff_copy_bits_unsupported_here
|
|
||||||
#else
|
|
||||||
/**
|
|
||||||
* Pads the bitstream with zeros up to the next byte boundary.
|
|
||||||
*/
|
|
||||||
void align_put_bits(PutBitContext *s);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Puts the string string in the bitstream.
|
|
||||||
*
|
|
||||||
* @param terminate_string 0-terminates the written string if value is 1
|
|
||||||
*/
|
|
||||||
void ff_put_string(PutBitContext *pb, const char *string, int terminate_string);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Copies the content of src to the bitstream.
|
|
||||||
*
|
|
||||||
* @param length the number of bits of src to copy
|
|
||||||
*/
|
|
||||||
void ff_copy_bits(PutBitContext *pb, const uint8_t *src, int length);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Writes up to 31 bits into a bitstream.
|
|
||||||
* Use put_bits32 to write 32 bits.
|
|
||||||
*/
|
|
||||||
static inline void put_bits(PutBitContext *s, int n, unsigned int value)
|
|
||||||
#ifndef ALT_BITSTREAM_WRITER
|
|
||||||
{
|
|
||||||
unsigned int bit_buf;
|
|
||||||
int bit_left;
|
|
||||||
|
|
||||||
// printf("put_bits=%d %x\n", n, value);
|
|
||||||
//assert(n <= 31 && value < (1U << n));
|
|
||||||
|
|
||||||
bit_buf = s->bit_buf;
|
|
||||||
bit_left = s->bit_left;
|
|
||||||
|
|
||||||
// printf("n=%d value=%x cnt=%d buf=%x\n", n, value, bit_cnt, bit_buf);
|
|
||||||
/* XXX: optimize */
|
|
||||||
#ifdef BITSTREAM_WRITER_LE
|
|
||||||
bit_buf |= value << (32 - bit_left);
|
|
||||||
if (n >= bit_left) {
|
|
||||||
#if !HAVE_FAST_UNALIGNED
|
|
||||||
if (3 & (intptr_t) s->buf_ptr) {
|
|
||||||
AV_WL32(s->buf_ptr, bit_buf);
|
|
||||||
} else
|
|
||||||
#endif
|
|
||||||
*(uint32_t *)s->buf_ptr = le2me_32(bit_buf);
|
|
||||||
s->buf_ptr+=4;
|
|
||||||
bit_buf = (bit_left==32)?0:value >> bit_left;
|
|
||||||
bit_left+=32;
|
|
||||||
}
|
|
||||||
bit_left-=n;
|
|
||||||
#else
|
|
||||||
if (n < bit_left) {
|
|
||||||
bit_buf = (bit_buf<<n) | value;
|
|
||||||
bit_left-=n;
|
|
||||||
} else {
|
|
||||||
bit_buf<<=bit_left;
|
|
||||||
bit_buf |= value >> (n - bit_left);
|
|
||||||
#if !HAVE_FAST_UNALIGNED
|
|
||||||
if (3 & (intptr_t) s->buf_ptr) {
|
|
||||||
AV_WB32(s->buf_ptr, bit_buf);
|
|
||||||
} else
|
|
||||||
#endif
|
|
||||||
*(uint32_t *)s->buf_ptr = be2me_32(bit_buf);
|
|
||||||
//printf("bitbuf = %08x\n", bit_buf);
|
|
||||||
s->buf_ptr+=4;
|
|
||||||
bit_left+=32 - n;
|
|
||||||
bit_buf = value;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
s->bit_buf = bit_buf;
|
|
||||||
s->bit_left = bit_left;
|
|
||||||
}
|
|
||||||
#else /* ALT_BITSTREAM_WRITER defined */
|
|
||||||
{
|
|
||||||
# ifdef ALIGNED_BITSTREAM_WRITER
|
|
||||||
# if ARCH_X86
|
|
||||||
__asm__ volatile(
|
|
||||||
"movl %0, %%ecx \n\t"
|
|
||||||
"xorl %%eax, %%eax \n\t"
|
|
||||||
"shrdl %%cl, %1, %%eax \n\t"
|
|
||||||
"shrl %%cl, %1 \n\t"
|
|
||||||
"movl %0, %%ecx \n\t"
|
|
||||||
"shrl $3, %%ecx \n\t"
|
|
||||||
"andl $0xFFFFFFFC, %%ecx \n\t"
|
|
||||||
"bswapl %1 \n\t"
|
|
||||||
"orl %1, (%2, %%ecx) \n\t"
|
|
||||||
"bswapl %%eax \n\t"
|
|
||||||
"addl %3, %0 \n\t"
|
|
||||||
"movl %%eax, 4(%2, %%ecx) \n\t"
|
|
||||||
: "=&r" (s->index), "=&r" (value)
|
|
||||||
: "r" (s->buf), "r" (n), "0" (s->index), "1" (value<<(-n))
|
|
||||||
: "%eax", "%ecx"
|
|
||||||
);
|
|
||||||
# else
|
|
||||||
int index= s->index;
|
|
||||||
uint32_t *ptr= ((uint32_t *)s->buf)+(index>>5);
|
|
||||||
|
|
||||||
value<<= 32-n;
|
|
||||||
|
|
||||||
ptr[0] |= be2me_32(value>>(index&31));
|
|
||||||
ptr[1] = be2me_32(value<<(32-(index&31)));
|
|
||||||
//if(n>24) printf("%d %d\n", n, value);
|
|
||||||
index+= n;
|
|
||||||
s->index= index;
|
|
||||||
# endif
|
|
||||||
# else //ALIGNED_BITSTREAM_WRITER
|
|
||||||
# if ARCH_X86
|
|
||||||
__asm__ volatile(
|
|
||||||
"movl $7, %%ecx \n\t"
|
|
||||||
"andl %0, %%ecx \n\t"
|
|
||||||
"addl %3, %%ecx \n\t"
|
|
||||||
"negl %%ecx \n\t"
|
|
||||||
"shll %%cl, %1 \n\t"
|
|
||||||
"bswapl %1 \n\t"
|
|
||||||
"movl %0, %%ecx \n\t"
|
|
||||||
"shrl $3, %%ecx \n\t"
|
|
||||||
"orl %1, (%%ecx, %2) \n\t"
|
|
||||||
"addl %3, %0 \n\t"
|
|
||||||
"movl $0, 4(%%ecx, %2) \n\t"
|
|
||||||
: "=&r" (s->index), "=&r" (value)
|
|
||||||
: "r" (s->buf), "r" (n), "0" (s->index), "1" (value)
|
|
||||||
: "%ecx"
|
|
||||||
);
|
|
||||||
# else
|
|
||||||
int index= s->index;
|
|
||||||
uint32_t *ptr= (uint32_t*)(((uint8_t *)s->buf)+(index>>3));
|
|
||||||
|
|
||||||
ptr[0] |= be2me_32(value<<(32-n-(index&7) ));
|
|
||||||
ptr[1] = 0;
|
|
||||||
//if(n>24) printf("%d %d\n", n, value);
|
|
||||||
index+= n;
|
|
||||||
s->index= index;
|
|
||||||
# endif
|
|
||||||
# endif //!ALIGNED_BITSTREAM_WRITER
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static inline void put_sbits(PutBitContext *pb, int n, int32_t value)
|
|
||||||
{
|
|
||||||
//assert(n >= 0 && n <= 31);
|
|
||||||
|
|
||||||
put_bits(pb, n, value & ((1<<n)-1));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the pointer to the byte where the bitstream writer will put
|
|
||||||
* the next bit.
|
|
||||||
*/
|
|
||||||
static inline uint8_t* put_bits_ptr(PutBitContext *s)
|
|
||||||
{
|
|
||||||
#ifdef ALT_BITSTREAM_WRITER
|
|
||||||
return s->buf + (s->index>>3);
|
|
||||||
#else
|
|
||||||
return s->buf_ptr;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Skips the given number of bytes.
|
|
||||||
* PutBitContext must be flushed & aligned to a byte boundary before calling this.
|
|
||||||
*/
|
|
||||||
static inline void skip_put_bytes(PutBitContext *s, int n)
|
|
||||||
{
|
|
||||||
//assert((put_bits_count(s)&7)==0);
|
|
||||||
#ifdef ALT_BITSTREAM_WRITER
|
|
||||||
FIXME may need some cleaning of the buffer
|
|
||||||
s->index += n<<3;
|
|
||||||
#else
|
|
||||||
//assert(s->bit_left==32);
|
|
||||||
s->buf_ptr += n;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Skips the given number of bits.
|
|
||||||
* Must only be used if the actual values in the bitstream do not matter.
|
|
||||||
* If n is 0 the behavior is undefined.
|
|
||||||
*/
|
|
||||||
static inline void skip_put_bits(PutBitContext *s, int n)
|
|
||||||
{
|
|
||||||
#ifdef ALT_BITSTREAM_WRITER
|
|
||||||
s->index += n;
|
|
||||||
#else
|
|
||||||
s->bit_left -= n;
|
|
||||||
s->buf_ptr-= 4*(s->bit_left>>5);
|
|
||||||
s->bit_left &= 31;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Changes the end of the buffer.
|
|
||||||
*
|
|
||||||
* @param size the new size in bytes of the buffer where to put bits
|
|
||||||
*/
|
|
||||||
static inline void set_put_bits_buffer_size(PutBitContext *s, int size)
|
|
||||||
{
|
|
||||||
s->buf_end= s->buf + size;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* AVCODEC_PUT_BITS_H */
|
|
||||||
|
|
@ -22,8 +22,8 @@
|
||||||
#ifndef AVCODEC_WMA_H
|
#ifndef AVCODEC_WMA_H
|
||||||
#define AVCODEC_WMA_H
|
#define AVCODEC_WMA_H
|
||||||
|
|
||||||
#include "get_bits.h"
|
#include "ffmpeg_get_bits.h"
|
||||||
#include "put_bits.h"
|
#include "ffmpeg_put_bits.h"
|
||||||
|
|
||||||
/* size of blocks */
|
/* size of blocks */
|
||||||
#define BLOCK_MIN_BITS 7
|
#define BLOCK_MIN_BITS 7
|
||||||
|
|
|
||||||
|
|
@ -86,8 +86,8 @@
|
||||||
* subframe in order to reconstruct the output samples.
|
* subframe in order to reconstruct the output samples.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "get_bits.h"
|
#include "ffmpeg_get_bits.h"
|
||||||
#include "put_bits.h"
|
#include "ffmpeg_put_bits.h"
|
||||||
#include "wmaprodata.h"
|
#include "wmaprodata.h"
|
||||||
#include "wma.h"
|
#include "wma.h"
|
||||||
#include "wmaprodec.h"
|
#include "wmaprodec.h"
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue