/*****************************************************************************
* video_parser.h : video parser thread
- * (c)1999 VideoLAN
- *****************************************************************************
*****************************************************************************
+ * Copyright (C) 1999, 2000 VideoLAN
+ * $Id: video_parser.h,v 1.35 2001/05/30 17:03:11 sam Exp $
+ *
+ * Authors: Christophe Massiot <massiot@via.ecp.fr>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
+ *****************************************************************************/
+
+/*****************************************************************************
* Requires:
* "config.h"
* "common.h"
* "mtime.h"
- * "vlc_thread.h"
+ * "threads.h"
* "input.h"
* "video.h"
* "video_output.h"
* "vpar_headers.h"
*****************************************************************************/
+/*****************************************************************************
+ * video_fifo_t
+ *****************************************************************************
+ * This rotative FIFO contains undecoded macroblocks that are to be decoded
+ *****************************************************************************/
+struct vpar_thread_s;
+
+typedef struct video_fifo_s
+{
+#ifdef VDEC_SMP
+ vlc_mutex_t lock; /* fifo data lock */
+ vlc_cond_t wait; /* fifo data conditional variable */
+
+ /* buffer is an array of undec_picture_t pointers */
+ macroblock_t * buffer[VFIFO_SIZE + 1];
+ int i_start;
+ int i_end;
+#else
+ macroblock_t buffer;
+#endif
+
+ struct vpar_thread_s * p_vpar;
+} video_fifo_t;
+
+/*****************************************************************************
+ * video_buffer_t
+ *****************************************************************************
+ * This structure enables the parser to maintain a list of free
+ * macroblock_t structures
+ *****************************************************************************/
+#ifdef VDEC_SMP
+typedef struct video_buffer_s
+{
+ vlc_mutex_t lock; /* buffer data lock */
+
+ macroblock_t p_macroblocks[VFIFO_SIZE + 1];
+ macroblock_t * pp_mb_free[VFIFO_SIZE+1]; /* this is a LIFO */
+ int i_index;
+} video_buffer_t;
+#endif
+
/*****************************************************************************
* vpar_thread_t: video parser thread descriptor
*****************************************************************************
- * ??
+ * XXX??
*****************************************************************************/
typedef struct vpar_thread_s
{
+ bit_stream_t bit_stream;
+
/* Thread properties and locks */
- boolean_t b_die; /* `die' flag */
- boolean_t b_run; /* `run' flag */
- boolean_t b_error; /* `error' flag */
- boolean_t b_active; /* `active' flag */
vlc_thread_t thread_id; /* id for thread functions */
/* Thread configuration */
- /* ?? */
- /*??*/
+ /* XXX?? */
// int *pi_status;
-
- /* Input properties */
- decoder_fifo_t fifo; /* PES input fifo */
- /* The bit stream structure handles the PES stream at the bit level */
- bit_stream_t bit_stream;
+ /* Input properties */
+ decoder_fifo_t * p_fifo; /* PES input fifo */
+ vdec_config_t * p_config;
/* Output properties */
vout_thread_t * p_vout; /* video output thread */
- int i_stream; /* video stream id */
-
+
/* Decoder properties */
- struct vdec_thread_s * p_vdec[NB_VDEC];
+ struct vdec_thread_s * pp_vdec[NB_VDEC];
video_fifo_t vfifo;
+#ifdef VDEC_SMP
video_buffer_t vbuffer;
+#endif
/* Parser properties */
sequence_t sequence;
picture_parsing_t picture;
- slice_parsing_t slice;
macroblock_parsing_t mb;
video_synchro_t synchro;
/* Lookup tables */
-#ifdef MPEG2_COMPLIANT
- s16 pi_crop_buf[65536];
- s16 * pi_crop;
-#endif
lookup_t pl_mb_addr_inc[2048]; /* for macroblock
address increment */
- /* variable length codes for the structure dct_dc_size */
- lookup_t pppl_dct_dc_size[2][2][32];
- lookup_t pppl_dct_dc_size[2][2][32];
/* tables for macroblock types 0=P 1=B */
- lookup_t pl_mb_type[2][64];
+ lookup_t ppl_mb_type[2][64];
/* table for coded_block_pattern */
- lookup_t pl_coded_pattern[512];
+ lookup_t * pl_coded_pattern;
+ /* variable length codes for the structure dct_dc_size for intra blocks */
+ lookup_t * pppl_dct_dc_size[2][2];
+ /* Structure to store the tables B14 & B15 (ISO/IEC 13818-2 B.4) */
+ dct_lookup_t ppl_dct_coef[2][16384];
+ /* Scan table */
+ u8 ppi_scan[2][64];
+ /* Default quantization matrices */
+ u8 pi_default_intra_quant[64];
+ u8 pi_default_nonintra_quant[64];
+
+ /* Motion compensation plugin used and shortcuts */
+ struct module_s * p_motion_module;
+ void ( * pppf_motion[4][2][4] ) ( struct macroblock_s * );
+ void ( * ppf_motion_skipped[4][4] ) ( struct macroblock_s * );
+
+ /* IDCT plugin used and shortcuts to access its capabilities */
+ struct module_s * p_idct_module;
+ void ( * pf_idct_init ) ( struct vdec_thread_s * );
+ void ( * pf_sparse_idct ) ( struct vdec_thread_s *, dctelem_t*, int );
+ void ( * pf_idct ) ( struct vdec_thread_s *, dctelem_t*, int );
+ void ( * pf_norm_scan ) ( u8 ppi_scan[2][64] );
+ void ( * pf_decode_init ) ( struct vdec_thread_s * );
+ void ( * pf_decode_mb_c ) ( struct vdec_thread_s *, struct macroblock_s * );
+ void ( * pf_decode_mb_bw )( struct vdec_thread_s *, struct macroblock_s * );
#ifdef STATS
/* Statistics */
count_t c_loops; /* number of loops */
- count_t c_idle_loops; /* number of idle loops */
count_t c_sequences; /* number of sequences */
- count_t c_pictures; /* number of pictures read */
- count_t c_i_pictures; /* number of I pictures read */
- count_t c_p_pictures; /* number of P pictures read */
- count_t c_b_pictures; /* number of B pictures read */
- count_t c_decoded_pictures; /* number of pictures decoded */
- count_t c_decoded_i_pictures; /* number of I pictures decoded */
- count_t c_decoded_p_pictures; /* number of P pictures decoded */
- count_t c_decoded_b_pictures; /* number of B pictures decoded */
+ count_t pc_pictures[4]; /* number of (coding_type) pictures read */
+ count_t pc_decoded_pictures[4]; /* number of (coding_type)
+ * pictures decoded */
+ count_t pc_malformed_pictures[4]; /* number of pictures trashed
+ * during parsing */
#endif
} vpar_thread_t;
*****************************************************************************/
/* Thread management functions */
-vpar_thread_t * vpar_CreateThread ( /* video_cfg_t *p_cfg, */ input_thread_t *p_input /*,
- vout_thread_t *p_vout, int *pi_status */ );
-void vpar_DestroyThread ( vpar_thread_t *p_vpar /*, int *pi_status */ );
+vlc_thread_t vpar_CreateThread ( vdec_config_t * );
-/* Time management functions */
-/* ?? */
+/*****************************************************************************
+ * NextStartCode : Find the next start code
+ *****************************************************************************/
+static __inline__ void NextStartCode( bit_stream_t * p_bit_stream )
+{
+ /* Re-align the buffer on an 8-bit boundary */
+ RealignBits( p_bit_stream );
-/* Dynamic thread settings */
-/* ?? */
+ while( ShowBits( p_bit_stream, 24 ) != 0x01L
+ && !p_bit_stream->p_decoder_fifo->b_die )
+ {
+ RemoveBits( p_bit_stream, 8 );
+ }
+}
/*****************************************************************************
* LoadQuantizerScale
}
};
- p_vpar->slice.i_quantizer_scale = ppi_quantizer_scale
+ p_vpar->mb.i_quantizer_scale = ppi_quantizer_scale
[(!p_vpar->sequence.b_mpeg2 << 1) | p_vpar->picture.b_q_scale_type]
[GetBits( &p_vpar->bit_stream, 5 )];
}