diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/libmpeg2/decode.c | 64 | ||||
-rw-r--r-- | src/libmpeg2/slice_xvmc.c | 9 | ||||
-rw-r--r-- | src/libmpeg2/slice_xvmc_vld.c | 7 |
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; |