# HG changeset patch # User romansh # Date 1226524408 0 # Node ID c30bdda1adb1d81b05d000a749b6116aa0403bc0 # Parent c45366b01126a6a0ffbe62d464986f301a203458 Taking advantage of the new ->execute API diff -r c45366b01126 -r c30bdda1adb1 dv.c --- a/dv.c Wed Nov 12 20:23:36 2008 +0000 +++ b/dv.c Wed Nov 12 21:13:28 2008 +0000 @@ -92,9 +92,9 @@ static int dv_init_dynamic_tables(const DVprofile *d) { - int j,i,c,s,p; + int j,i,c,s,p,k; - if (d->work_chunks[dv_work_pool_size(d)-1]) + if (d->work_chunks[dv_work_pool_size(d)-1].buf_offset) return 0; p = i = 0; @@ -105,7 +105,9 @@ p += !(j%3); if (!(DV_PROFILE_IS_1080i50(d) && c != 0 && s == 11) && !(DV_PROFILE_IS_720p50(d) && s > 9)) { - d->work_chunks[i++] = (void*)(size_t)((p<<18)|(c << 16)|(s << 8)|j); + for (k=0; k<5; k++) + d->work_chunks[i].mb_coordinates[k] = d->video_place[(c*d->difseg_size+s)*27*5 + j*5 + k]; + d->work_chunks[i++].buf_offset = p; } p += 5; } @@ -381,17 +383,10 @@ } } -static inline void dv_calculate_mb_xy(DVVideoContext *s, int work_chunk, int m, int *mb_x, int *mb_y) +static inline void dv_calculate_mb_xy(DVVideoContext *s, DVwork_chunk *work_chunk, int m, int *mb_x, int *mb_y) { - int i, chan, seg, slot; - - chan = (work_chunk>>16)&0x03; - seg = (work_chunk>>8)&0xff; - slot = (work_chunk)&0xff; - - i = (chan*s->sys->difseg_size+seg)*27*5 + slot*5 + m; - *mb_x = s->sys->video_place[i] & 0xff; - *mb_y = s->sys->video_place[i] >> 8; + *mb_x = work_chunk->mb_coordinates[m] & 0xff; + *mb_y = work_chunk->mb_coordinates[m] >> 8; /* We work with 720p frames split in half. The odd half-frame (chan==2,3) is displaced :-( */ if (s->sys->height == 720 && !(s->buf[1]&0x0C)) { @@ -400,7 +395,7 @@ } /* mb_x and mb_y are in units of 8 pixels */ -static inline void dv_decode_video_segment(DVVideoContext *s, int work_chunk) +static inline void dv_decode_video_segment(DVVideoContext *s, DVwork_chunk *work_chunk) { int quant, dc, dct_mode, class1, j; int mb_index, mb_x, mb_y, last_index; @@ -424,7 +419,7 @@ memset(sblock, 0, sizeof(sblock)); /* pass 1 : read DC and AC coefficients in blocks */ - buf_ptr = &s->buf[(work_chunk>>18)*80]; + buf_ptr = &s->buf[work_chunk->buf_offset*80]; block1 = &sblock[0][0]; mb1 = mb_data; init_put_bits(&vs_pb, vs_bit_buffer, 5 * 80); @@ -862,7 +857,7 @@ } } -static inline void dv_encode_video_segment(DVVideoContext *s, int work_chunk) +static inline void dv_encode_video_segment(DVVideoContext *s, DVwork_chunk *work_chunk) { int mb_index, i, j; int mb_x, mb_y, c_offset, linesize; @@ -881,7 +876,7 @@ assert((((int)block) & 15) == 0); - dif = &s->buf[(work_chunk>>18)*80]; + dif = &s->buf[work_chunk->buf_offset*80]; enc_blk = &enc_blks[0]; pb = &pbs[0]; for (mb_index = 0; mb_index < 5; mb_index++) { @@ -1013,14 +1008,14 @@ static int dv_decode_mt(AVCodecContext *avctx, void* sl) { - dv_decode_video_segment((DVVideoContext *)avctx->priv_data, *(size_t*)sl); + dv_decode_video_segment((DVVideoContext *)avctx->priv_data, (DVwork_chunk*)sl); return 0; } #ifdef CONFIG_DVVIDEO_ENCODER static int dv_encode_mt(AVCodecContext *avctx, void* sl) { - dv_encode_video_segment((DVVideoContext *)avctx->priv_data, *(size_t*)sl); + dv_encode_video_segment((DVVideoContext *)avctx->priv_data, (DVwork_chunk*)sl); return 0; } #endif @@ -1056,7 +1051,7 @@ s->buf = buf; avctx->execute(avctx, dv_decode_mt, s->sys->work_chunks, NULL, - dv_work_pool_size(s->sys), sizeof(void*)); + dv_work_pool_size(s->sys), sizeof(DVwork_chunk)); emms_c(); @@ -1209,7 +1204,7 @@ s->buf = buf; c->execute(c, dv_encode_mt, s->sys->work_chunks, NULL, - dv_work_pool_size(s->sys), sizeof(void*)); + dv_work_pool_size(s->sys), sizeof(DVwork_chunk)); emms_c(); diff -r c45366b01126 -r c30bdda1adb1 dvdata.h --- a/dvdata.h Wed Nov 12 20:23:36 2008 +0000 +++ b/dvdata.h Wed Nov 12 21:13:28 2008 +0000 @@ -30,6 +30,11 @@ #include "libavutil/rational.h" #include "avcodec.h" +typedef struct DVwork_chunk { + uint16_t buf_offset; + uint16_t mb_coordinates[5]; +} DVwork_chunk; + /* * DVprofile is used to express the differences between various * DV flavors. For now it's primarily used for differentiating @@ -47,7 +52,7 @@ int height; /* picture height in pixels */ int width; /* picture width in pixels */ AVRational sar[2]; /* sample aspect ratios for 4:3 and 16:9 */ - void **work_chunks; /* each thread gets its own chunk of frame to work on */ + DVwork_chunk *work_chunks; /* each thread gets its own chunk of frame to work on */ const uint16_t *video_place; /* positions of all DV macroblocks */ enum PixelFormat pix_fmt; /* picture pixel format */ int bpm; /* blocks per macroblock */ @@ -6160,15 +6165,15 @@ 80, 80, 80, 80, 80, 80, 64, 64, }; -static void *work_chunks_dv25pal [1*12*27]; -static void *work_chunks_dv25pal411[1*12*27]; -static void *work_chunks_dv25ntsc [1*10*27]; -static void *work_chunks_dv50pal [2*12*27]; -static void *work_chunks_dv50ntsc [2*10*27]; -static void *work_chunks_dv100palp [2*12*27]; -static void *work_chunks_dv100ntscp[2*10*27]; -static void *work_chunks_dv100pali [4*12*27]; -static void *work_chunks_dv100ntsci[4*10*27]; +static DVwork_chunk work_chunks_dv25pal [1*12*27]; +static DVwork_chunk work_chunks_dv25pal411[1*12*27]; +static DVwork_chunk work_chunks_dv25ntsc [1*10*27]; +static DVwork_chunk work_chunks_dv50pal [2*12*27]; +static DVwork_chunk work_chunks_dv50ntsc [2*10*27]; +static DVwork_chunk work_chunks_dv100palp [2*12*27]; +static DVwork_chunk work_chunks_dv100ntscp[2*10*27]; +static DVwork_chunk work_chunks_dv100pali [4*12*27]; +static DVwork_chunk work_chunks_dv100ntsci[4*10*27]; static const DVprofile dv_profiles[] = { { .dsf = 0,