#define MAX_REFERENCE_FRAMES 8
#define MAX_DELAY 5 /* limit for main profile for frame coding (TODO: field coding) */
#define MAX_FRAMES (MAX_REFERENCE_FRAMES + MAX_DELAY + 1)
-#define MAX_QUANT 68 /* max quant for VC-2 */
+#define MAX_QUANT 255 /* max quant for VC-2 */
#define MAX_BLOCKSIZE 32 /* maximum xblen/yblen we support */
/**
MpegvideoEncDSPContext mpvencdsp;
VideoDSPContext vdsp;
DiracDSPContext diracdsp;
+ DiracVersionInfo version;
GetBitContext gb;
dirac_source_params source;
int seen_sequence_header;
int zero_res; /* zero residue flag */
int is_arith; /* whether coeffs use arith or golomb coding */
+ int core_syntax; /* use core syntax only */
int low_delay; /* use the low delay syntax */
+ int hq_picture; /* high quality picture, enables low_delay */
+ int ld_picture; /* use low delay picture, turns on low_delay */
+ int dc_prediction; /* has dc prediction */
int globalmc_flag; /* use global motion compensation */
int num_refs; /* number of reference pictures */
unsigned old_delta_quant;
unsigned codeblock_mode;
+ unsigned num_x; /* number of horizontal slices */
+ unsigned num_y; /* number of vertical slices */
+
struct {
unsigned width;
unsigned height;
} codeblock[MAX_DWT_LEVELS+1];
struct {
- unsigned num_x; /* number of horizontal slices */
- unsigned num_y; /* number of vertical slices */
AVRational bytes; /* average bytes per slice */
uint8_t quant[MAX_DWT_LEVELS][4]; /* [DIRAC_STD] E.1 */
} lowdelay;
DiracFrame all_frames[MAX_FRAMES];
} DiracContext;
-/**
- * Dirac Specification ->
- * Parse code values. 9.6.1 Table 9.1
- */
-enum dirac_parse_code {
- pc_seq_header = 0x00,
- pc_eos = 0x10,
- pc_aux_data = 0x20,
- pc_padding = 0x30,
-};
-
enum dirac_subband {
subband_ll = 0,
subband_hl = 1,
{ { 3, 1, 1, 0}, { 0, 4, 4, 2}, { 0, 6, 6, 5}, { 0, 9, 9, 7} },
};
-static const int qscale_tab[MAX_QUANT+1] = {
- 4, 5, 6, 7, 8, 10, 11, 13,
- 16, 19, 23, 27, 32, 38, 45, 54,
- 64, 76, 91, 108, 128, 152, 181, 215,
- 256, 304, 362, 431, 512, 609, 724, 861,
- 1024, 1218, 1448, 1722, 2048, 2435, 2896, 3444,
- 4096, 4871, 5793, 6889, 8192, 9742, 11585, 13777,
- 16384, 19484, 23170, 27554, 32768, 38968, 46341, 55109,
- 65536, 77936
+static const int32_t qscale_tab[128] = {
+ 4, 5, 6, 7, 8, 10, 11, 13,
+ 16, 19, 23, 27, 32, 38, 45, 54,
+ 64, 76, 91, 108, 128, 152, 181, 215,
+ 256, 304, 362, 431, 512, 609, 724, 861,
+ 1024, 1218, 1448, 1722, 2048, 2435, 2896, 3444,
+ 4096, 4871, 5793, 6889, 8192, 9742, 11585, 13777,
+ 16384, 19484, -13317, 27554, 32768, -1581, 9853, -10518,
+ 65536, -3164, -16782, -21037, 131072, -6328, 2922, 23552,
+ 262144, -12658, 5844, -18524, 524288, 15232, 11689, 28578,
+ 1048576, -10085, -13110, -8471, 2097152, -20170, 10267, -16943,
+ 4194304, 208, -15954, 31741, 8388608, 416, 4579, -2146,
+ 16777216, 832, 9158, -4293, 33554432, 1663, -18172, -8587,
+ 67108864, 3326, 143, -17175, 134217728, 6653, 285, 31276,
+268435456, 13306, 570, -3075, 536870912, -13938, 1140, -6152,
+1073741824, 12672, 2281, -12304, -2147483648, -15205, 4561, -24610,
+ 0, 10138, 9122, 16407, 0, -20274, -18243, -32813,
};
-static const int qoffset_intra_tab[MAX_QUANT+1] = {
- 1, 2, 3, 4, 4, 5, 6, 7,
- 8, 10, 12, 14, 16, 19, 23, 27,
- 32, 38, 46, 54, 64, 76, 91, 108,
- 128, 152, 181, 216, 256, 305, 362, 431,
- 512, 609, 724, 861, 1024, 1218, 1448, 1722,
- 2048, 2436, 2897, 3445, 4096, 4871, 5793, 6889,
- 8192, 9742, 11585, 13777, 16384, 19484, 23171, 27555,
- 32768, 38968
+static const int32_t qoffset_intra_tab[128] = {
+ 1, 2, 3, 4, 4, 5, 6, 7,
+ 8, 10, 12, 14, 16, 19, 23, 27,
+ 32, 38, 46, 54, 64, 76, 91, 108,
+ 128, 152, 181, 216, 256, 305, 362, 431,
+ 512, 609, 724, 861, 1024, 1218, 1448, 1722,
+ 2048, 2436, 2897, 3445, 4096, 4871, 5793, 6889,
+ 8192, 9742, -6658, 13777, 16384, -790, 4927, -5258,
+ 32768, -1581, -8390, -10518, 65536, -3163, 1461, 11776,
+ 131072, -6328, 2922, -9261, 262144, 7616, 5845, 14289,
+ 524288, -5042, -6554, -4235, 1048576, -10084, 5134, -8471,
+ 2097152, 104, -7976, 15871, 4194304, 208, 2290, -1072,
+ 8388608, 416, 4579, -2146, 16777216, 832, -9085, -4293,
+ 33554432, 1663, 72, -8587, 67108864, 3327, 143, 15638,
+134217728, 6653, 285, -1537, 268435456, -6968, 570, -3075,
+536870912, 6336, 1141, -6151, -1073741823, -7602, 2281, -12304,
+ 0, 5069, 4561, 8204, 0, -10136, -9121, -16406,
};
static const int qoffset_inter_tab[MAX_QUANT+1] = {
return; \
} \
-/* [DIRAC_STD] 13.5.5.2 Luma slice subband data. luma_slice_band(level,orient,sx,sy) --> if b2 == NULL */
-/* [DIRAC_STD] 13.5.5.3 Chroma slice subband data. chroma_slice_band(level,orient,sx,sy) --> if b2 != NULL */
-static void lowdelay_subband(DiracContext *s, GetBitContext *gb, int quant,
- int slice_x, int slice_y, int bits_end,
- SubBand *b1, SubBand *b2)
+static void decode_subband(DiracContext *s, GetBitContext *gb, int quant,
+ int slice_x, int slice_y, int bits_end,
+ SubBand *b1, SubBand *b2)
{
- int left = b1->width * slice_x / s->lowdelay.num_x;
- int right = b1->width *(slice_x+1) / s->lowdelay.num_x;
- int top = b1->height * slice_y / s->lowdelay.num_y;
- int bottom = b1->height *(slice_y+1) / s->lowdelay.num_y;
+ int left = b1->width * slice_x / s->num_x;
+ int right = b1->width *(slice_x+1) / s->num_x;
+ int top = b1->height * slice_y / s->num_y;
+ int bottom = b1->height *(slice_y+1) / s->num_y;
- int qfactor = qscale_tab[FFMIN(quant, MAX_QUANT)];
- int qoffset = qoffset_intra_tab[FFMIN(quant, MAX_QUANT)];
+ int qfactor = qscale_tab[quant & 0x7f];
+ int qoffset = qoffset_intra_tab[quant & 0x7f];
uint8_t *buf1 = b1->ibuf + top * b1->stride;
uint8_t *buf2 = b2 ? b2->ibuf + top * b2->stride: NULL;
}
}
-struct lowdelay_slice {
+/* Used by Low Delay and High Quality profiles */
+typedef struct DiracSlice {
GetBitContext gb;
int slice_x;
int slice_y;
int bytes;
-};
+} DiracSlice;
/**
static int decode_lowdelay_slice(AVCodecContext *avctx, void *arg)
{
DiracContext *s = avctx->priv_data;
- struct lowdelay_slice *slice = arg;
+ DiracSlice *slice = arg;
GetBitContext *gb = &slice->gb;
enum dirac_subband orientation;
int level, quant, chroma_bits, chroma_end;
for (level = 0; level < s->wavelet_depth; level++)
for (orientation = !!level; orientation < 4; orientation++) {
quant = FFMAX(quant_base - s->lowdelay.quant[level][orientation], 0);
- lowdelay_subband(s, gb, quant, slice->slice_x, slice->slice_y, luma_end,
- &s->plane[0].band[level][orientation], NULL);
+ decode_subband(s, gb, quant, slice->slice_x, slice->slice_y, luma_end,
+ &s->plane[0].band[level][orientation], NULL);
}
/* consume any unused bits from luma */
for (level = 0; level < s->wavelet_depth; level++)
for (orientation = !!level; orientation < 4; orientation++) {
quant = FFMAX(quant_base - s->lowdelay.quant[level][orientation], 0);
- lowdelay_subband(s, gb, quant, slice->slice_x, slice->slice_y, chroma_end,
- &s->plane[1].band[level][orientation],
- &s->plane[2].band[level][orientation]);
+ decode_subband(s, gb, quant, slice->slice_x, slice->slice_y, chroma_end,
+ &s->plane[1].band[level][orientation],
+ &s->plane[2].band[level][orientation]);
}
return 0;
AVCodecContext *avctx = s->avctx;
int slice_x, slice_y, bytes, bufsize;
const uint8_t *buf;
- struct lowdelay_slice *slices;
+ DiracSlice *slices;
int slice_num = 0;
- slices = av_mallocz_array(s->lowdelay.num_x, s->lowdelay.num_y * sizeof(struct lowdelay_slice));
+ slices = av_mallocz_array(s->num_x, s->num_y * sizeof(DiracSlice));
if (!slices)
return AVERROR(ENOMEM);
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->lowdelay.num_y; slice_y++)
- for (slice_x = 0; bufsize > 0 && slice_x < s->lowdelay.num_x; slice_x++) {
+ 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;
else
bufsize = 0;
}
+ }
avctx->execute(avctx, decode_lowdelay_slice, slices, NULL, slice_num,
- sizeof(struct lowdelay_slice)); /* [DIRAC_STD] 13.5.2 Slices */
- if (s->pshift) {
- intra_dc_prediction_10(&s->plane[0].band[0][0]);
- intra_dc_prediction_10(&s->plane[1].band[0][0]);
- intra_dc_prediction_10(&s->plane[2].band[0][0]);
- } else {
- intra_dc_prediction_8(&s->plane[0].band[0][0]);
- intra_dc_prediction_8(&s->plane[1].band[0][0]);
- intra_dc_prediction_8(&s->plane[2].band[0][0]);
+ 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() */
+ intra_dc_prediction_10(&s->plane[1].band[0][0]); /* [DIRAC_STD] 13.3 intra_dc_prediction() */
+ intra_dc_prediction_10(&s->plane[2].band[0][0]); /* [DIRAC_STD] 13.3 intra_dc_prediction() */
+ } else {
+ intra_dc_prediction_8(&s->plane[0].band[0][0]);
+ intra_dc_prediction_8(&s->plane[1].band[0][0]);
+ intra_dc_prediction_8(&s->plane[2].band[0][0]);
+ }
}
av_free(slices);
return 0;
} else {
/* Slice parameters + quantization matrix*/
/*[DIRAC_STD] 11.3.4 Slice coding Parameters (low delay syntax only). slice_parameters() */
- s->lowdelay.num_x = svq3_get_ue_golomb(gb);
- s->lowdelay.num_y = svq3_get_ue_golomb(gb);
+ 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);
{
DiracContext *s = avctx->priv_data;
DiracFrame *pic = NULL;
- int ret, i, parse_code;
+ int ret, i;
+ uint8_t parse_code;
unsigned tmp;
if (size < DATA_UNIT_HEADER_SIZE)
init_get_bits(&s->gb, &buf[13], 8*(size - DATA_UNIT_HEADER_SIZE));
- if (parse_code == pc_seq_header) {
+ if (parse_code == DIRAC_PCODE_SEQ_HEADER) {
if (s->seen_sequence_header)
return 0;
/* [DIRAC_STD] 10. Sequence header */
ret = avpriv_dirac_parse_sequence_header(avctx, &s->gb, &s->source,
- &s->bit_depth);
+ &s->version, &s->bit_depth);
if (ret < 0)
return ret;
return ret;
s->seen_sequence_header = 1;
- } else if (parse_code == pc_eos) { /* [DIRAC_STD] End of Sequence */
+ } else if (parse_code == DIRAC_PCODE_END_SEQ) { /* [DIRAC_STD] End of Sequence */
free_sequence_buffers(s);
s->seen_sequence_header = 0;
- } else if (parse_code == pc_aux_data) {
+ } else if (parse_code == DIRAC_PCODE_AUX) {
if (buf[13] == 1) { /* encoder implementation/version */
int ver[3];
/* versions older than 1.0.8 don't store quant delta for
av_log(avctx, AV_LOG_ERROR, "num_refs of 3\n");
return AVERROR_INVALIDDATA;
}
- s->num_refs = tmp;
- s->is_arith = (parse_code & 0x48) == 0x08; /* [DIRAC_STD] using_ac() */
- s->low_delay = (parse_code & 0x88) == 0x88; /* [DIRAC_STD] is_low_delay() */
- pic->reference = (parse_code & 0x0C) == 0x0C; /* [DIRAC_STD] is_reference() */
- pic->avframe->key_frame = s->num_refs == 0; /* [DIRAC_STD] is_intra() */
- pic->avframe->pict_type = s->num_refs + 1; /* Definition of AVPictureType in avutil.h */
+ s->num_refs = tmp;
+ s->is_arith = (parse_code & 0x48) == 0x08; /* [DIRAC_STD] using_ac() */
+ s->low_delay = (parse_code & 0x88) == 0x88; /* [DIRAC_STD] is_low_delay() */
+ s->core_syntax = (parse_code & 0x88) == 0x08; /* [DIRAC_STD] is_core_syntax() */
+ s->ld_picture = (parse_code & 0xF8) == 0xC8; /* [DIRAC_STD] is_ld_picture() */
+ s->hq_picture = (parse_code & 0xF8) == 0xE8; /* [DIRAC_STD] is_hq_picture() */
+ s->dc_prediction = (parse_code & 0x28) == 0x08; /* [DIRAC_STD] using_dc_prediction() */
+ pic->reference = (parse_code & 0x0C) == 0x0C; /* [DIRAC_STD] is_reference() */
+ pic->avframe->key_frame = s->num_refs == 0; /* [DIRAC_STD] is_intra() */
+ pic->avframe->pict_type = s->num_refs + 1; /* Definition of AVPictureType in avutil.h */
+
+ if (s->version.minor == 2 && parse_code == 0x88)
+ s->ld_picture = 1;
+
+ if (s->low_delay && !(s->ld_picture || s->hq_picture) ) {
+ av_log(avctx, AV_LOG_ERROR, "Invalid low delay flag\n");
+ return AVERROR_INVALIDDATA;
+ }
if ((ret = get_buffer_with_edge(avctx, pic->avframe, (parse_code & 0x0C) == 0x0C ? AV_GET_BUFFER_FLAG_REF : 0)) < 0)
return ret;