diff options
author | Roman Shaposhnik <roman@shaposhnik.org> | 2008-11-12 21:13:28 +0000 |
---|---|---|
committer | Roman Shaposhnik <roman@shaposhnik.org> | 2008-11-12 21:13:28 +0000 |
commit | 2ae7e1243095ac8405f0cb5f78e7f179bb1493cb (patch) | |
tree | fae0ea298e3a43cb8032b4d5cf5bdfac0e9a76a4 | |
parent | 77753f874a7b95400a694eaf6739cc77539d6580 (diff) | |
download | ffmpeg-2ae7e1243095ac8405f0cb5f78e7f179bb1493cb.tar.gz |
Taking advantage of the new ->execute API
Originally committed as revision 15806 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r-- | libavcodec/dv.c | 37 | ||||
-rw-r--r-- | libavcodec/dvdata.h | 25 |
2 files changed, 31 insertions, 31 deletions
diff --git a/libavcodec/dv.c b/libavcodec/dv.c index 9599612e60..a3f051112f 100644 --- a/libavcodec/dv.c +++ b/libavcodec/dv.c @@ -92,9 +92,9 @@ static inline int dv_work_pool_size(const DVprofile *d) 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 @@ static int dv_init_dynamic_tables(const DVprofile *d) 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 bit_copy(PutBitContext *pb, GetBitContext *gb) } } -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 @@ static inline void dv_calculate_mb_xy(DVVideoContext *s, int work_chunk, int m, } /* 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 @@ static inline void dv_decode_video_segment(DVVideoContext *s, int work_chunk) 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_guess_qnos(EncBlockInfo* blks, int* qnos) } } -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 @@ static inline void dv_encode_video_segment(DVVideoContext *s, int work_chunk) 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 inline void dv_encode_video_segment(DVVideoContext *s, int work_chunk) 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 @@ static int dvvideo_decode_frame(AVCodecContext *avctx, 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 @@ static int dvvideo_encode_frame(AVCodecContext *c, uint8_t *buf, int buf_size, 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 --git a/libavcodec/dvdata.h b/libavcodec/dvdata.h index 0e4381c109..60feda44e4 100644 --- a/libavcodec/dvdata.h +++ b/libavcodec/dvdata.h @@ -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 @@ typedef struct DVprofile { 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 @@ static const uint8_t block_sizes_dv100[8] = { 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, |