mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
dnxhddec: handle cid change in bitstream.
This commit is contained in:
parent
109d8aa1e6
commit
11a32d53ca
@ -70,7 +70,7 @@ static av_cold int dnxhd_decode_init(AVCodecContext *avctx)
|
|||||||
|
|
||||||
static int dnxhd_init_vlc(DNXHDContext *ctx, int cid)
|
static int dnxhd_init_vlc(DNXHDContext *ctx, int cid)
|
||||||
{
|
{
|
||||||
if (!ctx->cid_table) {
|
if (cid != ctx->cid) {
|
||||||
int index;
|
int index;
|
||||||
|
|
||||||
if ((index = ff_dnxhd_get_cid_table(cid)) < 0) {
|
if ((index = ff_dnxhd_get_cid_table(cid)) < 0) {
|
||||||
@ -78,6 +78,11 @@ static int dnxhd_init_vlc(DNXHDContext *ctx, int cid)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
ctx->cid_table = &ff_dnxhd_cid_table[index];
|
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,
|
init_vlc(&ctx->ac_vlc, DNXHD_VLC_BITS, 257,
|
||||||
ctx->cid_table->ac_bits, 1, 1,
|
ctx->cid_table->ac_bits, 1, 1,
|
||||||
ctx->cid_table->ac_codes, 2, 2, 0);
|
ctx->cid_table->ac_codes, 2, 2, 0);
|
||||||
@ -89,6 +94,7 @@ static int dnxhd_init_vlc(DNXHDContext *ctx, int cid)
|
|||||||
ctx->cid_table->run_codes, 2, 2, 0);
|
ctx->cid_table->run_codes, 2, 2, 0);
|
||||||
|
|
||||||
ff_init_scantable(ctx->dsp.idct_permutation, &ctx->scantable, ff_zigzag_direct);
|
ff_init_scantable(ctx->dsp.idct_permutation, &ctx->scantable, ff_zigzag_direct);
|
||||||
|
ctx->cid = cid;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -96,7 +102,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 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 };
|
static const uint8_t header_prefix[] = { 0x00, 0x00, 0x02, 0x80, 0x01 };
|
||||||
int i;
|
int i, cid;
|
||||||
|
|
||||||
if (buf_size < 0x280)
|
if (buf_size < 0x280)
|
||||||
return -1;
|
return -1;
|
||||||
@ -135,10 +141,10 @@ static int dnxhd_decode_header(DNXHDContext *ctx, const uint8_t *buf, int buf_si
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx->cid = AV_RB32(buf + 0x28);
|
cid = AV_RB32(buf + 0x28);
|
||||||
av_dlog(ctx->avctx, "compression id %d\n", ctx->cid);
|
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;
|
return -1;
|
||||||
|
|
||||||
if (buf_size < ctx->cid_table->coding_unit_size) {
|
if (buf_size < ctx->cid_table->coding_unit_size) {
|
||||||
|
Loading…
Reference in New Issue
Block a user