summaryrefslogtreecommitdiff
path: root/src/libmpeg2/decode.c
diff options
context:
space:
mode:
authorThomas Hellström <totte67@users.sourceforge.net>2005-04-09 11:22:14 +0000
committerThomas Hellström <totte67@users.sourceforge.net>2005-04-09 11:22:14 +0000
commit18216a2fe0871d528f941ba4e5feeb8f9472523e (patch)
tree53f71e16c2ee96cbf69efd640fdd982149de5693 /src/libmpeg2/decode.c
parent637785d626edb3591d95e0127597ca0ce6ddee41 (diff)
downloadxine-lib-18216a2fe0871d528f941ba4e5feeb8f9472523e.tar.gz
xine-lib-18216a2fe0871d528f941ba4e5feeb8f9472523e.tar.bz2
**BUGFIX**
Multiple slice-per-rows (HDTV) fixes in the libmpeg2 code, particularly regarding VLD XvMC. Cleaned up hardware acceleration hooks in libmpeg2. Fixed X include path searching while configure detects XvMC support. CVS patchset: 7449 CVS date: 2005/04/09 11:22:14
Diffstat (limited to 'src/libmpeg2/decode.c')
-rw-r--r--src/libmpeg2/decode.c173
1 files changed, 27 insertions, 146 deletions
diff --git a/src/libmpeg2/decode.c b/src/libmpeg2/decode.c
index 6da1e07cf..63e6edbb4 100644
--- a/src/libmpeg2/decode.c
+++ b/src/libmpeg2/decode.c
@@ -41,7 +41,7 @@
#include "mpeg2.h"
#include "mpeg2_internal.h"
#include "xineutils.h"
-#include "xvmc_vld.h"
+#include "libmpeg2_accel.h"
/*
#define LOG_PAN_SCAN
@@ -64,7 +64,7 @@ void mpeg2_init (mpeg2dec_t * mpeg2dec,
mpeg2_cpu_state_init (mm_accel);
mpeg2_idct_init (mm_accel);
mpeg2_mc_init (mm_accel);
- xvmc_setup_scan_ptable();
+ libmpeg2_accel_scan(&mpeg2dec->accel, mpeg2_scan_norm, mpeg2_scan_alt);
}
if( !mpeg2dec->chunk_buffer )
@@ -250,7 +250,6 @@ static void remember_metainfo (mpeg2dec_t *mpeg2dec) {
_x_meta_info_set_utf8(mpeg2dec->stream, XINE_META_INFO_VIDEOCODEC, "MPEG (libmpeg2)");
}
-
static inline int parse_chunk (mpeg2dec_t * mpeg2dec, int code,
uint8_t * buffer)
{
@@ -282,40 +281,9 @@ 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;
- 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.
- */
-
+
+ libmpeg2_accel_frame_completion(&mpeg2dec->accel, mpeg2dec->frame_format,
+ picture, code);
if (((picture->picture_structure == FRAME_PICTURE) ||
(picture->second_field)) ) {
@@ -503,9 +471,9 @@ static inline int parse_chunk (mpeg2dec_t * mpeg2dec, int code,
abort();
}
default:
- if (code >= 0xb9)
- printf ("libmpeg2: stream not demultiplexed ?\n");
-
+ if ((code >= 0xb9) && (code != 0xe4)) {
+ printf("Not multiplexed? 0x%x\n",code);
+ }
if (code >= 0xb0)
break;
@@ -539,14 +507,8 @@ static inline int parse_chunk (mpeg2dec_t * mpeg2dec, int code,
ratio,
mpeg2dec->frame_format,
flags);
- /*
- * Move to libmpeg2_accel.c
- * int libmpeg2_accel_new_frame(mpeg2dec_t *, picture_t *)
- */
- mpeg2_xxmc_choose_coding(mpeg2dec, picture, ratio, flags);
- /*
- * End of new frame accel code.
- */
+ libmpeg2_accel_new_frame( &mpeg2dec->accel, mpeg2dec->frame_format,
+ picture, ratio);
} else {
ratio = get_aspect_ratio(mpeg2dec);
picture->current_frame =
@@ -556,14 +518,10 @@ static inline int parse_chunk (mpeg2dec_t * mpeg2dec, int code,
ratio,
mpeg2dec->frame_format,
flags);
- /*
- * Move to libmpeg2_accel.c
- * int libmpeg2_accel_new_frame(mpeg2dec_t *, picture_t *)
- */
- mpeg2_xxmc_choose_coding(mpeg2dec, picture, ratio, flags);
- /*
- * End of new frame accel code.
- */
+
+ libmpeg2_accel_new_frame( &mpeg2dec->accel, mpeg2dec->frame_format,
+ picture, ratio);
+
if (picture->forward_reference_frame &&
picture->forward_reference_frame != picture->backward_reference_frame)
picture->forward_reference_frame->free (picture->forward_reference_frame);
@@ -573,28 +531,10 @@ static inline int parse_chunk (mpeg2dec_t * mpeg2dec, int code,
picture->backward_reference_frame = picture->current_frame;
}
- /*
- * Move to libmpeg2_accel.c
- * int libmpeg2_accel_new_sequence(mpeg2dec_t *, picture_t *)
- */
-
- if(mpeg2dec->new_sequence) {
- switch(mpeg2dec->frame_format) {
- case XINE_IMGFMT_XXMC:
- case XINE_IMGFMT_XVMC: {
- xine_xvmc_t *xvmc = (xine_xvmc_t *)
- picture->current_frame->accel_data;
- picture->mc = xvmc->macroblocks;
- mpeg2dec->new_sequence = 0;
- break;
- }
- default:
- break;
- }
- }
- /*
- * End of new sequence accel code.
- */
+ if(mpeg2dec->new_sequence)
+ mpeg2dec->new_sequence =
+ libmpeg2_accel_new_sequence(&mpeg2dec->accel, mpeg2dec->frame_format,
+ picture);
picture->current_frame->bad_frame = 1;
picture->current_frame->drawn = 0;
@@ -633,48 +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
- /*
- * The below accelerated slice function choice will move to libmpeg2_accel.c ?
- * int libmpeg2_accel_slice(mpeg2dec_t *, picture_t *, int , char *)
- */
-
- switch( mpeg2dec->frame_format ) {
- case 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_slice(mpeg2dec, picture, code, buffer);
- break;
- case XINE_XVMC_ACCEL_IDCT:
- case XINE_XVMC_ACCEL_MOCOMP:
- mpeg2_xvmc_slice (mpeg2dec, picture, code, buffer);
- break;
- default:
- mpeg2_slice (picture, code, buffer);
- break;
- }
- break;
- default:
- mpeg2_slice (picture, code, buffer);
- break;
- }
- break;
- }
- case XINE_IMGFMT_XVMC:
- mpeg2_xvmc_slice (mpeg2dec, picture, code, buffer);
- break;
- default:
- mpeg2_slice (picture, code, buffer);
- break;
- }
- /*
- * End of acceleration code.
- */
-
+ libmpeg2_accel_slice(&mpeg2dec->accel, mpeg2dec->frame_format, picture, code, buffer,
+ mpeg2dec->chunk_size, mpeg2dec->chunk_buffer);
if( picture->v_offset > picture->limit_y ) {
picture->current_frame->bad_frame = 0;
}
@@ -747,11 +647,14 @@ int mpeg2_decode_data (mpeg2dec_t * mpeg2dec, uint8_t * current, uint8_t * end,
while (current != end) {
code = mpeg2dec->code;
current = copy_chunk (mpeg2dec, current, end);
- if (current == NULL)
- return ret;
+ if (current == NULL)
+ break;
ret += parse_chunk (mpeg2dec, code, mpeg2dec->chunk_buffer);
}
+ libmpeg2_accel_frame_completion(&mpeg2dec->accel, mpeg2dec->frame_format,
+ mpeg2dec->picture, 0xff);
+
return ret;
}
@@ -768,30 +671,8 @@ void mpeg2_discontinuity (mpeg2dec_t * mpeg2dec) {
picture->forward_reference_frame->pts = 0;
if ( picture->backward_reference_frame )
picture->backward_reference_frame->pts = 0;
-
- /*
- * Move to libmpeg2_accel.c
- * int libmpeg2_accel_discontinuity(mpeg2dec_t *);
- */
- mpeg2dec->xvmc_last_slice_code=-1;
- if ( !picture->current_frame )
- return;
- if (mpeg2dec->frame_format == XINE_IMGFMT_XXMC) {
- xine_xxmc_t *xxmc = (xine_xxmc_t *)
- picture->current_frame->accel_data;
- switch(xxmc->acceleration) {
- case XINE_XVMC_ACCEL_VLD:
- case XINE_XVMC_ACCEL_IDCT:
- case XINE_XVMC_ACCEL_MOCOMP:
- xxmc->proc_xxmc_flush( picture->current_frame );
- break;
- default:
- break;
- }
- }
- /*
- * End of discontinuity accel code.
- */
+
+ libmpeg2_accel_discontinuity(&mpeg2dec->accel, mpeg2dec->frame_format, picture);
}
void mpeg2_reset (mpeg2dec_t * mpeg2dec) {