Mercurial > libavcodec.hg
comparison dv.c @ 8175:0d1c9c936a52 libavcodec
Making idct factor tables dynamically allocated
author | romansh |
---|---|
date | Thu, 20 Nov 2008 01:40:40 +0000 |
parents | 471b16105266 |
children | 7a463923ecd1 |
comparison
equal
deleted
inserted
replaced
8174:f11197441364 | 8175:0d1c9c936a52 |
---|---|
52 AVFrame picture; | 52 AVFrame picture; |
53 AVCodecContext *avctx; | 53 AVCodecContext *avctx; |
54 uint8_t *buf; | 54 uint8_t *buf; |
55 | 55 |
56 uint8_t dv_zigzag[2][64]; | 56 uint8_t dv_zigzag[2][64]; |
57 uint32_t dv_idct_factor[2][2][22][64]; | |
58 uint32_t dv100_idct_factor[4][4][16][64]; | |
59 | 57 |
60 void (*get_pixels)(DCTELEM *block, const uint8_t *pixels, int line_size); | 58 void (*get_pixels)(DCTELEM *block, const uint8_t *pixels, int line_size); |
61 void (*fdct[2])(DCTELEM *block); | 59 void (*fdct[2])(DCTELEM *block); |
62 void (*idct_put[2])(uint8_t *dest, int line_size, DCTELEM *block); | 60 void (*idct_put[2])(uint8_t *dest, int line_size, DCTELEM *block); |
63 } DVVideoContext; | 61 } DVVideoContext; |
206 } | 204 } |
207 | 205 |
208 static int dv_init_dynamic_tables(const DVprofile *d) | 206 static int dv_init_dynamic_tables(const DVprofile *d) |
209 { | 207 { |
210 int j,i,c,s,p; | 208 int j,i,c,s,p; |
209 uint32_t *factor1, *factor2; | |
210 const int *iweight1, *iweight2; | |
211 | 211 |
212 if (!d->work_chunks[dv_work_pool_size(d)-1].buf_offset) { | 212 if (!d->work_chunks[dv_work_pool_size(d)-1].buf_offset) { |
213 p = i = 0; | 213 p = i = 0; |
214 for (c=0; c<d->n_difchan; c++) { | 214 for (c=0; c<d->n_difchan; c++) { |
215 for (s=0; s<d->difseg_size; s++) { | 215 for (s=0; s<d->difseg_size; s++) { |
224 p += 5; | 224 p += 5; |
225 } | 225 } |
226 } | 226 } |
227 } | 227 } |
228 } | 228 } |
229 | |
230 if (!d->idct_factor[DV_PROFILE_IS_HD(d)?8191:5631]) { | |
231 factor1 = &d->idct_factor[0]; | |
232 factor2 = &d->idct_factor[DV_PROFILE_IS_HD(d)?4096:2816]; | |
233 if (d->height == 720) { | |
234 iweight1 = &dv_iweight_720_y[0]; | |
235 iweight2 = &dv_iweight_720_c[0]; | |
236 } else { | |
237 iweight1 = &dv_iweight_1080_y[0]; | |
238 iweight2 = &dv_iweight_1080_c[0]; | |
239 } | |
240 if (DV_PROFILE_IS_HD(d)) { | |
241 for (c = 0; c < 4; c++) { | |
242 for (s = 0; s < 16; s++) { | |
243 for (i = 0; i < 64; i++) { | |
244 *factor1++ = (dv100_qstep[s] << (c + 9)) * iweight1[i]; | |
245 *factor2++ = (dv100_qstep[s] << (c + 9)) * iweight2[i]; | |
246 } | |
247 } | |
248 } | |
249 } else { | |
250 iweight1 = &dv_iweight_88[0]; | |
251 for (j = 0; j < 2; j++, iweight1 = &dv_iweight_248[0]) { | |
252 for (s = 0; s < 22; s++) { | |
253 for (i = c = 0; c < 4; c++) { | |
254 for (; i < dv_quant_areas[c]; i++) { | |
255 *factor1 = iweight1[i] << (dv_quant_shifts[s][c] + 1); | |
256 *factor2++ = (*factor1++) << 1; | |
257 } | |
258 } | |
259 } | |
260 } | |
261 } | |
262 } | |
263 | |
229 return 0; | 264 return 0; |
230 } | |
231 | |
232 static void dv_build_unquantize_tables(DVVideoContext *s, uint8_t* perm) | |
233 { | |
234 int i, q, a; | |
235 | |
236 /* NOTE: max left shift is 6 */ | |
237 for (q = 0; q < 22; q++) { | |
238 /* 88DCT */ | |
239 i = 1; | |
240 for (a = 0; a < 4; a++) { | |
241 for (; i < dv_quant_areas[a]; i++) { | |
242 /* 88 table */ | |
243 s->dv_idct_factor[0][0][q][i] = dv_iweight_88[i] << (dv_quant_shifts[q][a] + 1); | |
244 s->dv_idct_factor[1][0][q][i] = s->dv_idct_factor[0][0][q][i] << 1; | |
245 | |
246 /* 248 table */ | |
247 s->dv_idct_factor[0][1][q][i] = dv_iweight_248[i] << (dv_quant_shifts[q][a] + 1); | |
248 s->dv_idct_factor[1][1][q][i] = s->dv_idct_factor[0][1][q][i] << 1; | |
249 } | |
250 } | |
251 } | |
252 | |
253 for (a = 0; a < 4; a++) { | |
254 for (q = 0; q < 16; q++) { | |
255 for (i = 1; i < 64; i++) { | |
256 s->dv100_idct_factor[0][a][q][i] = (dv100_qstep[q] << (a + 9)) * dv_iweight_1080_y[i]; | |
257 s->dv100_idct_factor[1][a][q][i] = (dv100_qstep[q] << (a + 9)) * dv_iweight_1080_c[i]; | |
258 s->dv100_idct_factor[2][a][q][i] = (dv100_qstep[q] << (a + 9)) * dv_iweight_720_y[i]; | |
259 s->dv100_idct_factor[3][a][q][i] = (dv100_qstep[q] << (a + 9)) * dv_iweight_720_c[i]; | |
260 } | |
261 } | |
262 } | |
263 } | 265 } |
264 | 266 |
265 static av_cold int dvvideo_init(AVCodecContext *avctx) | 267 static av_cold int dvvideo_init(AVCodecContext *avctx) |
266 { | 268 { |
267 DVVideoContext *s = avctx->priv_data; | 269 DVVideoContext *s = avctx->priv_data; |
383 s->dv_zigzag[1][i] = dsp.idct_permutation[(j & 7) + (j & 8) * 4 + (j & 48) / 2]; | 385 s->dv_zigzag[1][i] = dsp.idct_permutation[(j & 7) + (j & 8) * 4 + (j & 48) / 2]; |
384 } | 386 } |
385 }else | 387 }else |
386 memcpy(s->dv_zigzag[1], ff_zigzag248_direct, 64); | 388 memcpy(s->dv_zigzag[1], ff_zigzag248_direct, 64); |
387 | 389 |
388 /* XXX: do it only for constant case */ | |
389 dv_build_unquantize_tables(s, dsp.idct_permutation); | |
390 | |
391 avctx->coded_frame = &s->picture; | 390 avctx->coded_frame = &s->picture; |
392 s->avctx = avctx; | 391 s->avctx = avctx; |
393 | 392 |
394 return 0; | 393 return 0; |
395 } | 394 } |
554 dct_mode = get_bits1(&gb); | 553 dct_mode = get_bits1(&gb); |
555 class1 = get_bits(&gb, 2); | 554 class1 = get_bits(&gb, 2); |
556 if (DV_PROFILE_IS_HD(s->sys)) { | 555 if (DV_PROFILE_IS_HD(s->sys)) { |
557 mb->idct_put = s->idct_put[0]; | 556 mb->idct_put = s->idct_put[0]; |
558 mb->scan_table = s->dv_zigzag[0]; | 557 mb->scan_table = s->dv_zigzag[0]; |
559 mb->factor_table = s->dv100_idct_factor[((s->sys->height == 720) << 1) | (j >= 4)][class1][quant]; | 558 mb->factor_table = &s->sys->idct_factor[(j >= 4)*4*16*64 + class1*16*64 + quant*64]; |
560 is_field_mode[mb_index] |= !j && dct_mode; | 559 is_field_mode[mb_index] |= !j && dct_mode; |
561 } else { | 560 } else { |
562 mb->idct_put = s->idct_put[dct_mode && log2_blocksize == 3]; | 561 mb->idct_put = s->idct_put[dct_mode && log2_blocksize == 3]; |
563 mb->scan_table = s->dv_zigzag[dct_mode]; | 562 mb->scan_table = s->dv_zigzag[dct_mode]; |
564 mb->factor_table = s->dv_idct_factor[class1 == 3][dct_mode] | 563 mb->factor_table = &s->sys->idct_factor[(class1 == 3)*2*22*64 + dct_mode*22*64 + |
565 [quant + dv_quant_offset[class1]]; | 564 (quant + dv_quant_offset[class1])*64]; |
566 } | 565 } |
567 dc = dc << 2; | 566 dc = dc << 2; |
568 /* convert to unsigned because 128 is not added in the | 567 /* convert to unsigned because 128 is not added in the |
569 standard IDCT */ | 568 standard IDCT */ |
570 dc += 1024; | 569 dc += 1024; |