diracdec: Make slice parameters common between lowdelay and future hq profile

pull/235/head
Kieran Kunhya 9 years ago committed by Rostislav Pehlivanov
parent 3bb6ce1af9
commit 9f374c5906
  1. 36
      libavcodec/diracdec.c

@ -168,14 +168,15 @@ typedef struct DiracContext {
unsigned old_delta_quant; unsigned old_delta_quant;
unsigned codeblock_mode; unsigned codeblock_mode;
unsigned num_x; /* number of horizontal slices */
unsigned num_y; /* number of vertical slices */
struct { struct {
unsigned width; unsigned width;
unsigned height; unsigned height;
} codeblock[MAX_DWT_LEVELS+1]; } codeblock[MAX_DWT_LEVELS+1];
struct { struct {
unsigned num_x; /* number of horizontal slices */
unsigned num_y; /* number of vertical slices */
AVRational bytes; /* average bytes per slice */ AVRational bytes; /* average bytes per slice */
uint8_t quant[MAX_DWT_LEVELS][4]; /* [DIRAC_STD] E.1 */ uint8_t quant[MAX_DWT_LEVELS][4]; /* [DIRAC_STD] E.1 */
} lowdelay; } lowdelay;
@ -723,10 +724,10 @@ static void decode_subband(DiracContext *s, GetBitContext *gb, int quant,
int slice_x, int slice_y, int bits_end, int slice_x, int slice_y, int bits_end,
SubBand *b1, SubBand *b2) SubBand *b1, SubBand *b2)
{ {
int left = b1->width * slice_x / s->lowdelay.num_x; int left = b1->width * slice_x / s->num_x;
int right = b1->width *(slice_x+1) / s->lowdelay.num_x; int right = b1->width *(slice_x+1) / s->num_x;
int top = b1->height * slice_y / s->lowdelay.num_y; int top = b1->height * slice_y / s->num_y;
int bottom = b1->height *(slice_y+1) / s->lowdelay.num_y; int bottom = b1->height *(slice_y+1) / s->num_y;
int qfactor = qscale_tab[FFMIN(quant, MAX_QUANT)]; int qfactor = qscale_tab[FFMIN(quant, MAX_QUANT)];
int qoffset = qoffset_intra_tab[FFMIN(quant, MAX_QUANT)]; int qoffset = qoffset_intra_tab[FFMIN(quant, MAX_QUANT)];
@ -761,12 +762,13 @@ static void decode_subband(DiracContext *s, GetBitContext *gb, int quant,
} }
} }
struct lowdelay_slice { /* Used by Low Delay and High Quality profiles */
typedef struct DiracSlice {
GetBitContext gb; GetBitContext gb;
int slice_x; int slice_x;
int slice_y; int slice_y;
int bytes; int bytes;
}; } DiracSlice;
/** /**
@ -776,7 +778,7 @@ struct lowdelay_slice {
static int decode_lowdelay_slice(AVCodecContext *avctx, void *arg) static int decode_lowdelay_slice(AVCodecContext *avctx, void *arg)
{ {
DiracContext *s = avctx->priv_data; DiracContext *s = avctx->priv_data;
struct lowdelay_slice *slice = arg; DiracSlice *slice = arg;
GetBitContext *gb = &slice->gb; GetBitContext *gb = &slice->gb;
enum dirac_subband orientation; enum dirac_subband orientation;
int level, quant, chroma_bits, chroma_end; int level, quant, chroma_bits, chroma_end;
@ -820,10 +822,10 @@ static int decode_lowdelay(DiracContext *s)
AVCodecContext *avctx = s->avctx; AVCodecContext *avctx = s->avctx;
int slice_x, slice_y, bytes, bufsize; int slice_x, slice_y, bytes, bufsize;
const uint8_t *buf; const uint8_t *buf;
struct lowdelay_slice *slices; DiracSlice *slices;
int slice_num = 0; 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) if (!slices)
return AVERROR(ENOMEM); return AVERROR(ENOMEM);
@ -832,11 +834,10 @@ static int decode_lowdelay(DiracContext *s)
buf = s->gb.buffer + get_bits_count(&s->gb)/8; buf = s->gb.buffer + get_bits_count(&s->gb)/8;
bufsize = get_bits_left(&s->gb); bufsize = get_bits_left(&s->gb);
for (slice_y = 0; bufsize > 0 && slice_y < s->lowdelay.num_y; slice_y++) for (slice_y = 0; bufsize > 0 && slice_y < s->num_y; slice_y++) {
for (slice_x = 0; bufsize > 0 && slice_x < s->lowdelay.num_x; slice_x++) { 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 bytes = (slice_num+1) * s->lowdelay.bytes.num / s->lowdelay.bytes.den
- slice_num * 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].bytes = bytes;
slices[slice_num].slice_x = slice_x; slices[slice_num].slice_x = slice_x;
slices[slice_num].slice_y = slice_y; slices[slice_num].slice_y = slice_y;
@ -849,9 +850,10 @@ static int decode_lowdelay(DiracContext *s)
else else
bufsize = 0; bufsize = 0;
} }
}
avctx->execute(avctx, decode_lowdelay_slice, slices, NULL, slice_num, avctx->execute(avctx, decode_lowdelay_slice, slices, NULL, slice_num,
sizeof(struct lowdelay_slice)); /* [DIRAC_STD] 13.5.2 Slices */ sizeof(struct DiracSlice)); /* [DIRAC_STD] 13.5.2 Slices */
if (s->pshift) { if (s->pshift) {
intra_dc_prediction_10(&s->plane[0].band[0][0]); 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[1].band[0][0]);
@ -1078,8 +1080,8 @@ static int dirac_unpack_idwt_params(DiracContext *s)
} else { } else {
/* Slice parameters + quantization matrix*/ /* Slice parameters + quantization matrix*/
/*[DIRAC_STD] 11.3.4 Slice coding Parameters (low delay syntax only). slice_parameters() */ /*[DIRAC_STD] 11.3.4 Slice coding Parameters (low delay syntax only). slice_parameters() */
s->lowdelay.num_x = svq3_get_ue_golomb(gb); s->num_x = svq3_get_ue_golomb(gb);
s->lowdelay.num_y = 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.num = svq3_get_ue_golomb(gb);
s->lowdelay.bytes.den = svq3_get_ue_golomb(gb); s->lowdelay.bytes.den = svq3_get_ue_golomb(gb);

Loading…
Cancel
Save