summaryrefslogtreecommitdiff
path: root/src/libmpeg2
diff options
context:
space:
mode:
Diffstat (limited to 'src/libmpeg2')
-rw-r--r--src/libmpeg2/decode.c4
-rw-r--r--src/libmpeg2/libmpeg2_accel.c17
-rw-r--r--src/libmpeg2/libmpeg2_accel.h4
-rw-r--r--src/libmpeg2/slice_xvmc_vld.c12
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) &&