Commit 9ab1a3e2 authored by Alexandra Hájková's avatar Alexandra Hájková Committed by Diego Biurrun

truemotion2: Convert to the new bitstream reader

parent 9f78e3a4
...@@ -27,9 +27,9 @@ ...@@ -27,9 +27,9 @@
#include <inttypes.h> #include <inttypes.h>
#include "avcodec.h" #include "avcodec.h"
#include "bitstream.h"
#include "bswapdsp.h" #include "bswapdsp.h"
#include "bytestream.h" #include "bytestream.h"
#include "get_bits.h"
#include "internal.h" #include "internal.h"
#define TM2_ESCAPE 0x80000000 #define TM2_ESCAPE 0x80000000
...@@ -62,7 +62,7 @@ typedef struct TM2Context { ...@@ -62,7 +62,7 @@ typedef struct TM2Context {
AVCodecContext *avctx; AVCodecContext *avctx;
AVFrame *pic; AVFrame *pic;
GetBitContext gb; BitstreamContext bc;
BswapDSPContext bdsp; BswapDSPContext bdsp;
/* TM2 streams */ /* TM2 streams */
...@@ -117,7 +117,7 @@ static int tm2_read_tree(TM2Context *ctx, uint32_t prefix, int length, TM2Huff * ...@@ -117,7 +117,7 @@ static int tm2_read_tree(TM2Context *ctx, uint32_t prefix, int length, TM2Huff *
return AVERROR_INVALIDDATA; return AVERROR_INVALIDDATA;
} }
if (!get_bits1(&ctx->gb)) { /* literal */ if (!bitstream_read_bit(&ctx->bc)) { /* literal */
if (length == 0) { if (length == 0) {
length = 1; length = 1;
} }
...@@ -125,7 +125,7 @@ static int tm2_read_tree(TM2Context *ctx, uint32_t prefix, int length, TM2Huff * ...@@ -125,7 +125,7 @@ static int tm2_read_tree(TM2Context *ctx, uint32_t prefix, int length, TM2Huff *
av_log(ctx->avctx, AV_LOG_DEBUG, "Too many literals\n"); av_log(ctx->avctx, AV_LOG_DEBUG, "Too many literals\n");
return AVERROR_INVALIDDATA; return AVERROR_INVALIDDATA;
} }
huff->nums[huff->num] = get_bits_long(&ctx->gb, huff->val_bits); huff->nums[huff->num] = bitstream_read(&ctx->bc, huff->val_bits);
huff->bits[huff->num] = prefix; huff->bits[huff->num] = prefix;
huff->lens[huff->num] = length; huff->lens[huff->num] = length;
huff->num++; huff->num++;
...@@ -144,10 +144,10 @@ static int tm2_build_huff_table(TM2Context *ctx, TM2Codes *code) ...@@ -144,10 +144,10 @@ static int tm2_build_huff_table(TM2Context *ctx, TM2Codes *code)
TM2Huff huff; TM2Huff huff;
int res = 0; int res = 0;
huff.val_bits = get_bits(&ctx->gb, 5); huff.val_bits = bitstream_read(&ctx->bc, 5);
huff.max_bits = get_bits(&ctx->gb, 5); huff.max_bits = bitstream_read(&ctx->bc, 5);
huff.min_bits = get_bits(&ctx->gb, 5); huff.min_bits = bitstream_read(&ctx->bc, 5);
huff.nodes = get_bits_long(&ctx->gb, 17); huff.nodes = bitstream_read(&ctx->bc, 17);
huff.num = 0; huff.num = 0;
/* check for correct codes parameters */ /* check for correct codes parameters */
...@@ -222,10 +222,10 @@ static void tm2_free_codes(TM2Codes *code) ...@@ -222,10 +222,10 @@ static void tm2_free_codes(TM2Codes *code)
ff_free_vlc(&code->vlc); ff_free_vlc(&code->vlc);
} }
static inline int tm2_get_token(GetBitContext *gb, TM2Codes *code) static inline int tm2_get_token(BitstreamContext *bc, TM2Codes *code)
{ {
int val; int val;
val = get_vlc2(gb, code->vlc.table, code->bits, 1); val = bitstream_read_vlc(bc, code->vlc.table, code->bits, 1);
return code->recode[val]; return code->recode[val];
} }
...@@ -254,8 +254,8 @@ static int tm2_read_deltas(TM2Context *ctx, int stream_id) ...@@ -254,8 +254,8 @@ static int tm2_read_deltas(TM2Context *ctx, int stream_id)
int d, mb; int d, mb;
int i, v; int i, v;
d = get_bits(&ctx->gb, 9); d = bitstream_read(&ctx->bc, 9);
mb = get_bits(&ctx->gb, 5); mb = bitstream_read(&ctx->bc, 5);
if ((d < 1) || (d > TM2_DELTAS) || (mb < 1) || (mb > 32)) { if ((d < 1) || (d > TM2_DELTAS) || (mb < 1) || (mb > 32)) {
av_log(ctx->avctx, AV_LOG_ERROR, "Incorrect delta table: %i deltas x %i bits\n", d, mb); av_log(ctx->avctx, AV_LOG_ERROR, "Incorrect delta table: %i deltas x %i bits\n", d, mb);
...@@ -263,7 +263,7 @@ static int tm2_read_deltas(TM2Context *ctx, int stream_id) ...@@ -263,7 +263,7 @@ static int tm2_read_deltas(TM2Context *ctx, int stream_id)
} }
for (i = 0; i < d; i++) { for (i = 0; i < d; i++) {
v = get_bits_long(&ctx->gb, mb); v = bitstream_read(&ctx->bc, mb);
if (v & (1 << (mb - 1))) if (v & (1 << (mb - 1)))
ctx->deltas[stream_id][i] = v - (1 << mb); ctx->deltas[stream_id][i] = v - (1 << mb);
else else
...@@ -306,10 +306,10 @@ static int tm2_read_stream(TM2Context *ctx, const uint8_t *buf, int stream_id, i ...@@ -306,10 +306,10 @@ static int tm2_read_stream(TM2Context *ctx, const uint8_t *buf, int stream_id, i
pos = bytestream2_tell(&gb); pos = bytestream2_tell(&gb);
if (skip <= pos) if (skip <= pos)
return AVERROR_INVALIDDATA; return AVERROR_INVALIDDATA;
init_get_bits(&ctx->gb, buf + pos, (skip - pos) * 8); bitstream_init(&ctx->bc, buf + pos, (skip - pos) * 8);
if ((ret = tm2_read_deltas(ctx, stream_id)) < 0) if ((ret = tm2_read_deltas(ctx, stream_id)) < 0)
return ret; return ret;
bytestream2_skip(&gb, ((get_bits_count(&ctx->gb) + 31) >> 5) << 2); bytestream2_skip(&gb, ((bitstream_tell(&ctx->bc) + 31) >> 5) << 2);
} }
} }
/* skip unused fields */ /* skip unused fields */
...@@ -323,10 +323,10 @@ static int tm2_read_stream(TM2Context *ctx, const uint8_t *buf, int stream_id, i ...@@ -323,10 +323,10 @@ static int tm2_read_stream(TM2Context *ctx, const uint8_t *buf, int stream_id, i
pos = bytestream2_tell(&gb); pos = bytestream2_tell(&gb);
if (skip <= pos) if (skip <= pos)
return AVERROR_INVALIDDATA; return AVERROR_INVALIDDATA;
init_get_bits(&ctx->gb, buf + pos, (skip - pos) * 8); bitstream_init(&ctx->bc, buf + pos, (skip - pos) * 8);
if ((ret = tm2_build_huff_table(ctx, &codes)) < 0) if ((ret = tm2_build_huff_table(ctx, &codes)) < 0)
return ret; return ret;
bytestream2_skip(&gb, ((get_bits_count(&ctx->gb) + 31) >> 5) << 2); bytestream2_skip(&gb, ((bitstream_tell(&ctx->bc) + 31) >> 5) << 2);
toks >>= 1; toks >>= 1;
/* check if we have sane number of tokens */ /* check if we have sane number of tokens */
...@@ -342,13 +342,13 @@ static int tm2_read_stream(TM2Context *ctx, const uint8_t *buf, int stream_id, i ...@@ -342,13 +342,13 @@ static int tm2_read_stream(TM2Context *ctx, const uint8_t *buf, int stream_id, i
pos = bytestream2_tell(&gb); pos = bytestream2_tell(&gb);
if (skip <= pos) if (skip <= pos)
return AVERROR_INVALIDDATA; return AVERROR_INVALIDDATA;
init_get_bits(&ctx->gb, buf + pos, (skip - pos) * 8); bitstream_init(&ctx->bc, buf + pos, (skip - pos) * 8);
for (i = 0; i < toks; i++) { for (i = 0; i < toks; i++) {
if (get_bits_left(&ctx->gb) <= 0) { if (bitstream_bits_left(&ctx->bc) <= 0) {
av_log(ctx->avctx, AV_LOG_ERROR, "Incorrect number of tokens: %i\n", toks); av_log(ctx->avctx, AV_LOG_ERROR, "Incorrect number of tokens: %i\n", toks);
return AVERROR_INVALIDDATA; return AVERROR_INVALIDDATA;
} }
ctx->tokens[stream_id][i] = tm2_get_token(&ctx->gb, &codes); ctx->tokens[stream_id][i] = tm2_get_token(&ctx->bc, &codes);
if (stream_id <= TM2_MOT && ctx->tokens[stream_id][i] >= TM2_DELTAS) { if (stream_id <= TM2_MOT && ctx->tokens[stream_id][i] >= TM2_DELTAS) {
av_log(ctx->avctx, AV_LOG_ERROR, "Invalid delta token index %d for type %d, n=%d\n", av_log(ctx->avctx, AV_LOG_ERROR, "Invalid delta token index %d for type %d, n=%d\n",
ctx->tokens[stream_id][i], stream_id, i); ctx->tokens[stream_id][i], stream_id, i);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment