summaryrefslogtreecommitdiff
path: root/src/libffmpeg/libavcodec/common.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libffmpeg/libavcodec/common.c')
-rw-r--r--src/libffmpeg/libavcodec/common.c201
1 files changed, 58 insertions, 143 deletions
diff --git a/src/libffmpeg/libavcodec/common.c b/src/libffmpeg/libavcodec/common.c
index 8f0fdc1bb..77f94689e 100644
--- a/src/libffmpeg/libavcodec/common.c
+++ b/src/libffmpeg/libavcodec/common.c
@@ -15,6 +15,8 @@
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * alternative bitstream reader & writer by Michael Niedermayer <michaelni@gmx.at>
*/
#include "common.h"
#include <math.h>
@@ -25,155 +27,96 @@ void init_put_bits(PutBitContext *s,
void (*write_data)(void *, UINT8 *, int))
{
s->buf = buffer;
- s->buf_ptr = s->buf;
s->buf_end = s->buf + buffer_size;
- s->bit_cnt=0;
- s->bit_buf=0;
s->data_out_size = 0;
- s->write_data = write_data;
- s->opaque = opaque;
-}
-
-static void flush_buffer(PutBitContext *s)
-{
- int size;
- if (s->write_data) {
- size = s->buf_ptr - s->buf;
- if (size > 0)
- s->write_data(s->opaque, s->buf, size);
- s->buf_ptr = s->buf;
- s->data_out_size += size;
+ if(write_data!=NULL)
+ {
+ fprintf(stderr, "write Data callback is not supported\n");
}
-}
-
-void put_bits(PutBitContext *s, int n, unsigned int value)
-{
- unsigned int bit_buf;
- int bit_cnt;
-
-#ifdef STATS
- st_out_bit_counts[st_current_index] += n;
+#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
- // printf("put_bits=%d %x\n", n, value);
- assert(n == 32 || value < (1U << n));
-
- bit_buf = s->bit_buf;
- bit_cnt = s->bit_cnt;
-
- // printf("n=%d value=%x cnt=%d buf=%x\n", n, value, bit_cnt, bit_buf);
- /* XXX: optimize */
- if (n < (32-bit_cnt)) {
- bit_buf |= value << (32 - n - bit_cnt);
- bit_cnt+=n;
- } else {
- bit_buf |= value >> (n + bit_cnt - 32);
- *(UINT32 *)s->buf_ptr = be2me_32(bit_buf);
- //printf("bitbuf = %08x\n", bit_buf);
- s->buf_ptr+=4;
- if (s->buf_ptr >= s->buf_end)
- flush_buffer(s);
- bit_cnt=bit_cnt + n - 32;
- if (bit_cnt == 0) {
- bit_buf = 0;
- } else {
- bit_buf = value << (32 - bit_cnt);
- }
- }
-
- s->bit_buf = bit_buf;
- s->bit_cnt = bit_cnt;
}
/* return the number of bits output */
INT64 get_bit_count(PutBitContext *s)
{
- return (s->buf_ptr - s->buf + s->data_out_size) * 8 + (INT64)s->bit_cnt;
+#ifdef ALT_BITSTREAM_WRITER
+ return s->data_out_size * 8 + s->index;
+#else
+ return (s->buf_ptr - s->buf + s->data_out_size) * 8 + 32 - (INT64)s->bit_left;
+#endif
}
void align_put_bits(PutBitContext *s)
{
- put_bits(s,(8 - s->bit_cnt) & 7,0);
+#ifdef ALT_BITSTREAM_WRITER
+ put_bits(s,( - s->index) & 7,0);
+#else
+ put_bits(s,s->bit_left & 7,0);
+#endif
}
/* pad the end of the output stream with zeros */
void flush_put_bits(PutBitContext *s)
{
- while (s->bit_cnt > 0) {
+#ifdef ALT_BITSTREAM_WRITER
+ align_put_bits(s);
+#else
+ s->bit_buf<<= s->bit_left;
+ while (s->bit_left < 32) {
/* XXX: should test end of buffer */
*s->buf_ptr++=s->bit_buf >> 24;
s->bit_buf<<=8;
- s->bit_cnt-=8;
+ s->bit_left+=8;
}
- flush_buffer(s);
- s->bit_cnt=0;
+ s->bit_left=32;
s->bit_buf=0;
-}
-
-/* for jpeg : escape 0xff with 0x00 after it */
-void jput_bits(PutBitContext *s, int n, unsigned int value)
-{
- unsigned int bit_buf, b;
- int bit_cnt, i;
-
- assert(n == 32 || value < (1U << n));
-
- bit_buf = s->bit_buf;
- bit_cnt = s->bit_cnt;
-
- //printf("n=%d value=%x cnt=%d buf=%x\n", n, value, bit_cnt, bit_buf);
- /* XXX: optimize */
- if (n < (32-bit_cnt)) {
- bit_buf |= value << (32 - n - bit_cnt);
- bit_cnt+=n;
- } else {
- bit_buf |= value >> (n + bit_cnt - 32);
- /* handle escape */
- for(i=0;i<4;i++) {
- b = (bit_buf >> 24);
- *(s->buf_ptr++) = b;
- if (b == 0xff)
- *(s->buf_ptr++) = 0;
- bit_buf <<= 8;
- }
- /* we flush the buffer sooner to handle worst case */
- if (s->buf_ptr >= (s->buf_end - 8))
- flush_buffer(s);
-
- bit_cnt=bit_cnt + n - 32;
- if (bit_cnt == 0) {
- bit_buf = 0;
- } else {
- bit_buf = value << (32 - bit_cnt);
- }
- }
-
- s->bit_buf = bit_buf;
- s->bit_cnt = bit_cnt;
+#endif
}
/* pad the end of the output stream with zeros */
+#ifndef ALT_BITSTREAM_WRITER
void jflush_put_bits(PutBitContext *s)
{
unsigned int b;
+ s->bit_buf<<= s->bit_left;
+ s->bit_buf |= ~1U >> (32 - s->bit_left); /* set all the unused bits to one */
- while (s->bit_cnt > 0) {
+ while (s->bit_left < 32) {
b = s->bit_buf >> 24;
*s->buf_ptr++ = b;
if (b == 0xff)
*s->buf_ptr++ = 0;
s->bit_buf<<=8;
- s->bit_cnt-=8;
+ s->bit_left+=8;
}
- flush_buffer(s);
- s->bit_cnt=0;
+ s->bit_left=32;
s->bit_buf=0;
}
+#else
+void jflush_put_bits(PutBitContext *s)
+{
+ int num= ( - s->index) & 7;
+ jput_bits(s, num,0xFF>>(8-num));
+}
+#endif
/* bit input functions */
void init_get_bits(GetBitContext *s,
UINT8 *buffer, int buffer_size)
{
+#ifdef ALT_BITSTREAM_READER
+ s->index=0;
+ s->buffer= buffer;
+#else
s->buf = buffer;
s->buf_ptr = buffer;
s->buf_end = buffer + buffer_size;
@@ -184,8 +127,10 @@ void init_get_bits(GetBitContext *s,
s->bit_buf |= (*s->buf_ptr++ << (24 - s->bit_cnt));
s->bit_cnt += 8;
}
+#endif
}
+#ifndef ALT_BITSTREAM_READER
/* n must be >= 1 and <= 32 */
/* also true: n > s->bit_cnt */
unsigned int get_bits_long(GetBitContext *s, int n)
@@ -241,15 +186,22 @@ unsigned int get_bits_long(GetBitContext *s, int n)
s->bit_cnt = bit_cnt;
return val;
}
+#endif
void align_get_bits(GetBitContext *s)
{
+#ifdef ALT_BITSTREAM_READER
+ s->index= (s->index + 7) & (~7);
+#else
int n;
n = s->bit_cnt & 7;
if (n > 0) {
get_bits(s, n);
}
+#endif
}
+
+#ifndef ALT_BITSTREAM_READER
/* This function is identical to get_bits_long(), the */
/* only diference is that it doesn't touch the buffer */
/* it is usefull to see the buffer. */
@@ -296,6 +248,7 @@ unsigned int show_bits_long(GetBitContext *s, int n)
return val;
}
+#endif
/* VLC decoding */
@@ -489,41 +442,3 @@ void free_vlc(VLC *vlc)
free(vlc->table_codes);
}
-int get_vlc(GetBitContext *s, VLC *vlc)
-{
- int bit_cnt, code, n, nb_bits, index;
- UINT32 bit_buf;
- INT16 *table_codes;
- INT8 *table_bits;
- UINT8 *buf_ptr;
-
- SAVE_BITS(s);
- nb_bits = vlc->bits;
- table_codes = vlc->table_codes;
- table_bits = vlc->table_bits;
- for(;;) {
- SHOW_BITS(s, index, nb_bits);
- code = table_codes[index];
- n = table_bits[index];
- if (n > 0) {
- /* most common case */
- FLUSH_BITS(n);
-#ifdef STATS
- st_bit_counts[st_current_index] += n;
-#endif
- break;
- } else if (n == 0) {
- return -1;
- } else {
- FLUSH_BITS(nb_bits);
-#ifdef STATS
- st_bit_counts[st_current_index] += nb_bits;
-#endif
- nb_bits = -n;
- table_codes = vlc->table_codes + code;
- table_bits = vlc->table_bits + code;
- }
- }
- RESTORE_BITS(s);
- return code;
-}