mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2025-01-20 06:11:04 +00:00
diracdec: Add support for HQ profile
This commit is contained in:
parent
0379603632
commit
a349a10edf
@ -186,6 +186,11 @@ typedef struct DiracContext {
|
||||
uint8_t quant[MAX_DWT_LEVELS][4]; /* [DIRAC_STD] E.1 */
|
||||
} lowdelay;
|
||||
|
||||
struct {
|
||||
unsigned prefix_bytes;
|
||||
unsigned size_scaler;
|
||||
} highquality;
|
||||
|
||||
struct {
|
||||
int pan_tilt[2]; /* pan/tilt vector */
|
||||
int zrs[2][2]; /* zoom/rotate/shear matrix */
|
||||
@ -823,6 +828,44 @@ static int decode_lowdelay_slice(AVCodecContext *avctx, void *arg)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* VC-2 Specification ->
|
||||
* 13.5.3 hq_slice(sx,sy)
|
||||
*/
|
||||
static int decode_hq_slice(DiracContext *s, GetBitContext *gb,
|
||||
int slice_x, int slice_y)
|
||||
{
|
||||
int i, quant, level, orientation, quant_idx;
|
||||
uint8_t quants[MAX_DWT_LEVELS][4];
|
||||
|
||||
skip_bits_long(gb, 8*s->highquality.prefix_bytes);
|
||||
quant_idx = get_bits(gb, 8);
|
||||
|
||||
/* Slice quantization (slice_quantizers() in the specs) */
|
||||
for (level = 0; level < s->wavelet_depth; level++) {
|
||||
for (orientation = !!level; orientation < 4; orientation++) {
|
||||
quant = FFMAX(quant_idx - s->lowdelay.quant[level][orientation], 0);
|
||||
quants[level][orientation] = quant;
|
||||
}
|
||||
}
|
||||
|
||||
/* Luma + 2 Chroma planes */
|
||||
for (i = 0; i < 3; i++) {
|
||||
int length = s->highquality.size_scaler * get_bits(gb, 8);
|
||||
int bits_left = 8 * length;
|
||||
int bits_end = get_bits_count(gb) + bits_left;
|
||||
for (level = 0; level < s->wavelet_depth; level++) {
|
||||
for (orientation = !!level; orientation < 4; orientation++) {
|
||||
decode_subband(s, gb, quants[level][orientation], slice_x, slice_y, bits_end,
|
||||
&s->plane[i].band[level][orientation], NULL);
|
||||
}
|
||||
}
|
||||
skip_bits_long(gb, bits_end - get_bits_count(gb));
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Dirac Specification ->
|
||||
* 13.5.1 low_delay_transform_data()
|
||||
@ -844,26 +887,34 @@ static int decode_lowdelay(DiracContext *s)
|
||||
buf = s->gb.buffer + get_bits_count(&s->gb)/8;
|
||||
bufsize = get_bits_left(&s->gb);
|
||||
|
||||
for (slice_y = 0; bufsize > 0 && slice_y < s->num_y; slice_y++) {
|
||||
for (slice_x = 0; bufsize > 0 && slice_x < s->num_x; slice_x++) {
|
||||
bytes = (slice_num+1) * s->lowdelay.bytes.num / s->lowdelay.bytes.den
|
||||
- slice_num * s->lowdelay.bytes.num / s->lowdelay.bytes.den;
|
||||
slices[slice_num].bytes = bytes;
|
||||
slices[slice_num].slice_x = slice_x;
|
||||
slices[slice_num].slice_y = slice_y;
|
||||
init_get_bits(&slices[slice_num].gb, buf, bufsize);
|
||||
slice_num++;
|
||||
|
||||
buf += bytes;
|
||||
if (bufsize/8 >= bytes)
|
||||
bufsize -= bytes*8;
|
||||
else
|
||||
bufsize = 0;
|
||||
if (s->hq_picture) {
|
||||
for (slice_y = 0; slice_y < s->num_y; slice_y++) {
|
||||
for (slice_x = 0; slice_x < s->num_x; slice_x++) {
|
||||
decode_hq_slice(s, &s->gb, slice_x, slice_y);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
for (slice_y = 0; bufsize > 0 && slice_y < s->num_y; slice_y++) {
|
||||
for (slice_x = 0; bufsize > 0 && slice_x < s->num_x; slice_x++) {
|
||||
bytes = (slice_num+1) * s->lowdelay.bytes.num / s->lowdelay.bytes.den
|
||||
- slice_num * s->lowdelay.bytes.num / s->lowdelay.bytes.den;
|
||||
slices[slice_num].bytes = bytes;
|
||||
slices[slice_num].slice_x = slice_x;
|
||||
slices[slice_num].slice_y = slice_y;
|
||||
init_get_bits(&slices[slice_num].gb, buf, bufsize);
|
||||
slice_num++;
|
||||
|
||||
buf += bytes;
|
||||
if (bufsize/8 >= bytes)
|
||||
bufsize -= bytes*8;
|
||||
else
|
||||
bufsize = 0;
|
||||
}
|
||||
}
|
||||
avctx->execute(avctx, decode_lowdelay_slice, slices, NULL, slice_num,
|
||||
sizeof(DiracSlice)); /* [DIRAC_STD] 13.5.2 Slices */
|
||||
}
|
||||
|
||||
avctx->execute(avctx, decode_lowdelay_slice, slices, NULL, slice_num,
|
||||
sizeof(struct DiracSlice)); /* [DIRAC_STD] 13.5.2 Slices */
|
||||
if (s->dc_prediction) {
|
||||
if (s->pshift) {
|
||||
intra_dc_prediction_10(&s->plane[0].band[0][0]); /* [DIRAC_STD] 13.3 intra_dc_prediction() */
|
||||
@ -1077,29 +1128,19 @@ static int dirac_unpack_idwt_params(DiracContext *s)
|
||||
|
||||
CHECKEDREAD(s->wavelet_depth, tmp > MAX_DWT_LEVELS || tmp < 1, "invalid number of DWT decompositions\n")
|
||||
|
||||
if (!s->low_delay) {
|
||||
/* Codeblock parameters (core syntax only) */
|
||||
if (get_bits1(gb)) {
|
||||
for (i = 0; i <= s->wavelet_depth; i++) {
|
||||
CHECKEDREAD(s->codeblock[i].width , tmp < 1 || tmp > (s->avctx->width >>s->wavelet_depth-i), "codeblock width invalid\n")
|
||||
CHECKEDREAD(s->codeblock[i].height, tmp < 1 || tmp > (s->avctx->height>>s->wavelet_depth-i), "codeblock height invalid\n")
|
||||
if (s->low_delay) {
|
||||
s->num_x = svq3_get_ue_golomb(gb);
|
||||
s->num_y = svq3_get_ue_golomb(gb);
|
||||
if (s->ld_picture) {
|
||||
s->lowdelay.bytes.num = svq3_get_ue_golomb(gb);
|
||||
s->lowdelay.bytes.den = svq3_get_ue_golomb(gb);
|
||||
if (s->lowdelay.bytes.den <= 0) {
|
||||
av_log(s->avctx,AV_LOG_ERROR,"Invalid lowdelay.bytes.den\n");
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
|
||||
CHECKEDREAD(s->codeblock_mode, tmp > 1, "unknown codeblock mode\n")
|
||||
} else
|
||||
for (i = 0; i <= s->wavelet_depth; i++)
|
||||
s->codeblock[i].width = s->codeblock[i].height = 1;
|
||||
} else {
|
||||
/* Slice parameters + quantization matrix*/
|
||||
/*[DIRAC_STD] 11.3.4 Slice coding Parameters (low delay syntax only). slice_parameters() */
|
||||
s->num_x = svq3_get_ue_golomb(gb);
|
||||
s->num_y = svq3_get_ue_golomb(gb);
|
||||
s->lowdelay.bytes.num = svq3_get_ue_golomb(gb);
|
||||
s->lowdelay.bytes.den = svq3_get_ue_golomb(gb);
|
||||
|
||||
if (s->lowdelay.bytes.den <= 0) {
|
||||
av_log(s->avctx,AV_LOG_ERROR,"Invalid lowdelay.bytes.den\n");
|
||||
return AVERROR_INVALIDDATA;
|
||||
} else if (s->hq_picture) {
|
||||
s->highquality.prefix_bytes = svq3_get_ue_golomb(gb);
|
||||
s->highquality.size_scaler = svq3_get_ue_golomb(gb);
|
||||
}
|
||||
|
||||
/* [DIRAC_STD] 11.3.5 Quantisation matrices (low-delay syntax). quant_matrix() */
|
||||
|
Loading…
Reference in New Issue
Block a user