summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/libmpeg2/decode.c64
-rw-r--r--src/libmpeg2/slice_xvmc.c9
-rw-r--r--src/libmpeg2/slice_xvmc_vld.c7
3 files changed, 42 insertions, 38 deletions
diff --git a/src/libmpeg2/decode.c b/src/libmpeg2/decode.c
index 3a6c4486f..243b3fdd2 100644
--- a/src/libmpeg2/decode.c
+++ b/src/libmpeg2/decode.c
@@ -276,38 +276,40 @@ static inline int parse_chunk (mpeg2dec_t * mpeg2dec, int code,
mpeg2dec->in_slice = 0;
if (is_frame_done && picture->current_frame != NULL) {
-
- /*
- * This frame completion code will move to a separate libmpeg2_accel.c file?
- * int libmpeg2_accel_frame_completion(mpeg2dec_t *, picture_t *, int);
- */
-
- if (mpeg2dec->frame_format == XINE_IMGFMT_XXMC) {
- xine_xxmc_t *xxmc = (xine_xxmc_t *)
- picture->current_frame->accel_data;
- switch(picture->current_frame->format) {
- case XINE_IMGFMT_XXMC:
- switch(xxmc->acceleration) {
- case XINE_XVMC_ACCEL_VLD:
- mpeg2_xxmc_vld_frame_complete(mpeg2dec, picture, code);
- break;
- case XINE_XVMC_ACCEL_IDCT:
- case XINE_XVMC_ACCEL_MOCOMP:
- xxmc->decoded = !picture->current_frame->bad_frame;
- xxmc->proc_xxmc_flush( picture->current_frame );
- break;
- default:
- break;
- }
- default:
- break;
+
+ /*
+ * This frame completion code will move to a separate libmpeg2_accel.c file?
+ * int libmpeg2_accel_frame_completion(mpeg2dec_t *, picture_t *, int);
+ */
+
+ if (mpeg2dec->frame_format == XINE_IMGFMT_XXMC) {
+ xine_xxmc_t *xxmc = (xine_xxmc_t *)
+ picture->current_frame->accel_data;
+ if (!xxmc->decoded) {
+ switch(picture->current_frame->format) {
+ case XINE_IMGFMT_XXMC:
+ switch(xxmc->acceleration) {
+ case XINE_XVMC_ACCEL_VLD:
+ mpeg2_xxmc_vld_frame_complete(mpeg2dec, picture, code);
+ break;
+ case XINE_XVMC_ACCEL_IDCT:
+ case XINE_XVMC_ACCEL_MOCOMP:
+ xxmc->decoded = !picture->current_frame->bad_frame;
+ xxmc->proc_xxmc_flush( picture->current_frame );
+ break;
+ default:
+ break;
+ }
+ default:
+ break;
+ }
+ }
}
- }
-
- /*
- * End of frame completion code.
- */
-
+
+ /*
+ * End of frame completion code.
+ */
+
if (((picture->picture_structure == FRAME_PICTURE) ||
(picture->second_field)) ) {
diff --git a/src/libmpeg2/slice_xvmc.c b/src/libmpeg2/slice_xvmc.c
index c4d2a5ff0..0079d361b 100644
--- a/src/libmpeg2/slice_xvmc.c
+++ b/src/libmpeg2/slice_xvmc.c
@@ -1707,8 +1707,9 @@ void mpeg2_xvmc_slice (mpeg2dec_t *mpeg2dec, picture_t * picture, int code, uint
if (1 == code) {
mpeg2dec->xvmc_last_slice_code = 0;
}
- if (code != mpeg2dec->xvmc_last_slice_code + 1)
- return;
+ if ((code != mpeg2dec->xvmc_last_slice_code + 1) &&
+ (code != mpeg2dec->xvmc_last_slice_code))
+ return;
bitstream_init (picture, buffer);
@@ -1936,7 +1937,7 @@ void mpeg2_xvmc_slice (mpeg2dec_t *mpeg2dec, picture_t * picture, int code, uint
default: /* end of slice, or error */
if (mpeg2_cpu_state_restore)
mpeg2_cpu_state_restore (&cpu_state);
- mpeg2dec->xvmc_last_slice_code++;
+ mpeg2dec->xvmc_last_slice_code = code;
return;
}
}
@@ -2036,7 +2037,7 @@ void mpeg2_xvmc_slice (mpeg2dec_t *mpeg2dec, picture_t * picture, int code, uint
}
}
}
- mpeg2dec->xvmc_last_slice_code++;
+ mpeg2dec->xvmc_last_slice_code = code;
#undef bit_buf
#undef bits
#undef bit_ptr
diff --git a/src/libmpeg2/slice_xvmc_vld.c b/src/libmpeg2/slice_xvmc_vld.c
index 006aea275..f099bc22a 100644
--- a/src/libmpeg2/slice_xvmc_vld.c
+++ b/src/libmpeg2/slice_xvmc_vld.c
@@ -192,7 +192,8 @@ void mpeg2_xxmc_slice( mpeg2dec_t *mpeg2dec, picture_t *picture, int code,
}
}
- if ((code == mpeg2dec->xvmc_last_slice_code + 1) &&
+ if (((code == mpeg2dec->xvmc_last_slice_code + 1) ||
+ (code == mpeg2dec->xvmc_last_slice_code)) &&
code <= mpeg2dec->xxmc_mb_pic_height) {
/*
@@ -220,6 +221,7 @@ void mpeg2_xxmc_slice( mpeg2dec_t *mpeg2dec, picture_t *picture, int code,
* went well, tell libmpeg2 that we are ready.
*/
+ mpeg2dec->xvmc_last_slice_code = code;
mpeg2_xxmc_vld_frame_complete(mpeg2dec,picture,code);
return;
} else {
@@ -228,7 +230,7 @@ void mpeg2_xxmc_slice( mpeg2dec_t *mpeg2dec, picture_t *picture, int code,
* Keep track of slices.
*/
- mpeg2dec->xvmc_last_slice_code++;
+ mpeg2dec->xvmc_last_slice_code = code;
}
} else {
@@ -259,7 +261,6 @@ void mpeg2_xxmc_vld_frame_complete(mpeg2dec_t *mpeg2dec, picture_t *picture, int
return;
}
xxmc->decoded = 1;
- mpeg2dec->xvmc_last_slice_code++;
if (picture->picture_structure == 3 || picture->second_field) {
if (xxmc->result == 0)
frame->bad_frame = 0;