diff options
author | Thomas Hellström <totte67@users.sourceforge.net> | 2005-05-06 07:42:20 +0000 |
---|---|---|
committer | Thomas Hellström <totte67@users.sourceforge.net> | 2005-05-06 07:42:20 +0000 |
commit | 143e6ca14ef8d043cc01e922ac6ed03e20b71606 (patch) | |
tree | 855efbe1c21374b95cda01984dd53db058f78607 /src/libmpeg2 | |
parent | e3e426cc9029ba7072bf48a4789ec04c179b63f1 (diff) | |
download | xine-lib-143e6ca14ef8d043cc01e922ac6ed03e20b71606.tar.gz xine-lib-143e6ca14ef8d043cc01e922ac6ed03e20b71606.tar.bz2 |
**BUGFIX**
improve xxmc cpu-usage for IDCT / MOCOMP acceleration through better locking
[bug #1195282]
CVS patchset: 7524
CVS date: 2005/05/06 07:42:20
Diffstat (limited to 'src/libmpeg2')
-rw-r--r-- | src/libmpeg2/decode.c | 4 | ||||
-rw-r--r-- | src/libmpeg2/libmpeg2_accel.c | 17 | ||||
-rw-r--r-- | src/libmpeg2/libmpeg2_accel.h | 4 | ||||
-rw-r--r-- | src/libmpeg2/slice_xvmc_vld.c | 12 |
4 files changed, 25 insertions, 12 deletions
diff --git a/src/libmpeg2/decode.c b/src/libmpeg2/decode.c index 5d3f78ec5..c4b980f79 100644 --- a/src/libmpeg2/decode.c +++ b/src/libmpeg2/decode.c @@ -573,8 +573,8 @@ static inline int parse_chunk (mpeg2dec_t * mpeg2dec, int code, printf("slice target %08x past %08x future %08x\n",picture->current_frame,picture->forward_reference_frame,picture->backward_reference_frame); fflush(stdout); #endif - libmpeg2_accel_slice(&mpeg2dec->accel, mpeg2dec->frame_format, picture, code, buffer, - mpeg2dec->chunk_size, mpeg2dec->chunk_buffer); + libmpeg2_accel_slice(&mpeg2dec->accel, picture, code, buffer, mpeg2dec->chunk_size, + mpeg2dec->chunk_buffer); if( picture->v_offset > picture->limit_y ) { picture->current_frame->bad_frame = 0; } diff --git a/src/libmpeg2/libmpeg2_accel.c b/src/libmpeg2/libmpeg2_accel.c index 376ae3979..54bdee549 100644 --- a/src/libmpeg2/libmpeg2_accel.c +++ b/src/libmpeg2/libmpeg2_accel.c @@ -147,8 +147,8 @@ libmpeg2_accel_frame_completion(mpeg2dec_accel_t * accel, uint32_t frame_format, int -libmpeg2_accel_slice(mpeg2dec_accel_t *accel, uint32_t frame_format, picture_t *picture, - int code, char * buffer, uint32_t chunk_size, uint8_t *chunk_buffer) +libmpeg2_accel_slice(mpeg2dec_accel_t *accel, picture_t *picture, int code, char * buffer, + uint32_t chunk_size, uint8_t *chunk_buffer) { /* * Don't reference frames of other formats. They are invalid. This may happen if the @@ -172,13 +172,21 @@ libmpeg2_accel_slice(mpeg2dec_accel_t *accel, uint32_t frame_format, picture_t * } } + switch( picture->current_frame->format ) { - switch( frame_format ) { case XINE_IMGFMT_XXMC: { xine_xxmc_t *xxmc = (xine_xxmc_t *) picture->current_frame->accel_data; + if ( xxmc->proc_xxmc_lock_valid( picture->current_frame, + picture->forward_reference_frame, + picture->backward_reference_frame, + picture->current_frame->picture_coding_type)) { + picture->v_offset = 0; + return 1; + } + switch(picture->current_frame->format) { case XINE_IMGFMT_XXMC: switch(xxmc->acceleration) { @@ -198,11 +206,14 @@ libmpeg2_accel_slice(mpeg2dec_accel_t *accel, uint32_t frame_format, picture_t * mpeg2_slice (picture, code, buffer); break; } + xxmc->proc_xxmc_unlock(picture->current_frame->driver); break; } + case XINE_IMGFMT_XVMC: mpeg2_xvmc_slice (accel, picture, code, buffer); break; + default: mpeg2_slice (picture, code, buffer); break; diff --git a/src/libmpeg2/libmpeg2_accel.h b/src/libmpeg2/libmpeg2_accel.h index 41b081cc5..5d0b37a78 100644 --- a/src/libmpeg2/libmpeg2_accel.h +++ b/src/libmpeg2/libmpeg2_accel.h @@ -41,8 +41,8 @@ extern int libmpeg2_accel_new_sequence(mpeg2dec_accel_t *accel, uint32_t frame_f extern int libmpeg2_accel_new_frame(mpeg2dec_accel_t *accel, uint32_t frame_format, picture_t *picture, double ratio, uint32_t flags); extern void libmpeg2_accel_frame_completion(mpeg2dec_accel_t *accel, uint32_t frame_format, picture_t *picture, int code); -extern int libmpeg2_accel_slice(mpeg2dec_accel_t *accel, uint32_t frame_format, picture_t *picture, - int code, char * buffer, uint32_t chunk_size, uint8_t *chunk_buffer); +extern int libmpeg2_accel_slice(mpeg2dec_accel_t *accel, picture_t *picture, int code, + char * buffer, uint32_t chunk_size, uint8_t *chunk_buffer); extern void libmpeg2_accel_scan( mpeg2dec_accel_t *accel, uint8_t *scan_norm, uint8_t *scan_alt); #endif diff --git a/src/libmpeg2/slice_xvmc_vld.c b/src/libmpeg2/slice_xvmc_vld.c index 3c177d97a..3647c7386 100644 --- a/src/libmpeg2/slice_xvmc_vld.c +++ b/src/libmpeg2/slice_xvmc_vld.c @@ -146,7 +146,6 @@ void mpeg2_xxmc_slice( mpeg2dec_accel_t *accel, picture_t *picture, vft->backward_reference_frame = picture->backward_reference_frame; xxmc->proc_xxmc_begin( frame ); if (xxmc->result != 0) { - xxmc->proc_xxmc_flush( frame ); accel->xvmc_last_slice_code=-1; } } @@ -164,9 +163,9 @@ void mpeg2_xxmc_slice( mpeg2dec_accel_t *accel, picture_t *picture, xxmc->slice_data = chunk_buffer; xxmc->slice_code = code; - xxmc->proc_xxmc_slice( frame ); + xxmc->proc_xxmc_slice( frame ); + if (xxmc->result != 0) { - xxmc->proc_xxmc_flush( frame ); accel->xvmc_last_slice_code=-1; return; } @@ -188,7 +187,6 @@ void mpeg2_xxmc_slice( mpeg2dec_accel_t *accel, picture_t *picture, lprintf("libmpeg2: VLD XvMC: Slice error.\n"); accel->xvmc_last_slice_code = -1; - xxmc->proc_xxmc_flush( frame ); return; } } @@ -200,7 +198,11 @@ void mpeg2_xxmc_vld_frame_complete(mpeg2dec_accel_t *accel, picture_t *picture, xine_xxmc_t *xxmc = (xine_xxmc_t *) frame->accel_data; - if (xxmc->decoded || (accel->xvmc_last_slice_code == -1)) return; + if (xxmc->decoded) return; + if (accel->xvmc_last_slice_code == -1) { + xxmc->proc_xxmc_flush( frame ); + return; + } if ((code != 0xff) || ((accel->xvmc_last_slice_code == accel->xxmc_mb_pic_height) && |