summaryrefslogtreecommitdiffstats
path: root/libavcodec/dnxhddec.c
diff options
context:
space:
mode:
authorBaptiste Coudurier <baptiste.coudurier@gmail.com>2011-06-26 14:08:22 -0700
committerBaptiste Coudurier <baptiste.coudurier@gmail.com>2011-06-26 14:09:48 -0700
commit721719dd0c0321b47500fa49b649c78422e910aa (patch)
treeb4e02291fbbd422d07548d354a3762541a6b32ba /libavcodec/dnxhddec.c
parent90a40b226a5c90e48da8041294c3782de6ee61fc (diff)
downloadffmpeg-streaming-721719dd0c0321b47500fa49b649c78422e910aa.zip
ffmpeg-streaming-721719dd0c0321b47500fa49b649c78422e910aa.tar.gz
dnxhddec: handle cid change in bitstream.
Diffstat (limited to 'libavcodec/dnxhddec.c')
-rw-r--r--libavcodec/dnxhddec.c16
1 files changed, 11 insertions, 5 deletions
diff --git a/libavcodec/dnxhddec.c b/libavcodec/dnxhddec.c
index 8cbe1a8..43c4679 100644
--- a/libavcodec/dnxhddec.c
+++ b/libavcodec/dnxhddec.c
@@ -63,7 +63,7 @@ static av_cold int dnxhd_decode_init(AVCodecContext *avctx)
static int dnxhd_init_vlc(DNXHDContext *ctx, int cid)
{
- if (!ctx->cid_table) {
+ if (cid != ctx->cid) {
int index;
if ((index = ff_dnxhd_get_cid_table(cid)) < 0) {
@@ -71,6 +71,11 @@ static int dnxhd_init_vlc(DNXHDContext *ctx, int cid)
return -1;
}
ctx->cid_table = &ff_dnxhd_cid_table[index];
+
+ free_vlc(&ctx->ac_vlc);
+ free_vlc(&ctx->dc_vlc);
+ free_vlc(&ctx->run_vlc);
+
init_vlc(&ctx->ac_vlc, DNXHD_VLC_BITS, 257,
ctx->cid_table->ac_bits, 1, 1,
ctx->cid_table->ac_codes, 2, 2, 0);
@@ -82,6 +87,7 @@ static int dnxhd_init_vlc(DNXHDContext *ctx, int cid)
ctx->cid_table->run_codes, 2, 2, 0);
ff_init_scantable(ctx->dsp.idct_permutation, &ctx->scantable, ff_zigzag_direct);
+ ctx->cid = cid;
}
return 0;
}
@@ -89,7 +95,7 @@ static int dnxhd_init_vlc(DNXHDContext *ctx, int cid)
static int dnxhd_decode_header(DNXHDContext *ctx, const uint8_t *buf, int buf_size, int first_field)
{
static const uint8_t header_prefix[] = { 0x00, 0x00, 0x02, 0x80, 0x01 };
- int i;
+ int i, cid;
if (buf_size < 0x280)
return -1;
@@ -115,10 +121,10 @@ static int dnxhd_decode_header(DNXHDContext *ctx, const uint8_t *buf, int buf_si
return -1;
}
- ctx->cid = AV_RB32(buf + 0x28);
- av_dlog(ctx->avctx, "compression id %d\n", ctx->cid);
+ cid = AV_RB32(buf + 0x28);
+ av_dlog(ctx->avctx, "compression id %d\n", cid);
- if (dnxhd_init_vlc(ctx, ctx->cid) < 0)
+ if (dnxhd_init_vlc(ctx, cid) < 0)
return -1;
if (buf_size < ctx->cid_table->coding_unit_size) {
OpenPOWER on IntegriCloud