*****************************************************************************/
void vpar_ReleaseMacroblock( video_fifo_t * p_fifo, macroblock_t * p_mb )
{
- /* Unlink referenced pictures */
- if( p_mb->p_forw_top != NULL )
- {
- vout_UnlinkPicture( p_fifo->p_vpar->p_vout, p_mb->p_forw_top );
- }
- if( p_mb->p_backw_top != NULL )
- {
- vout_UnlinkPicture( p_fifo->p_vpar->p_vout, p_mb->p_backw_top );
- }
- if( p_mb->p_forw_bot != NULL )
- {
- vout_UnlinkPicture( p_fifo->p_vpar->p_vout, p_mb->p_forw_bot );
- }
- if( p_mb->p_backw_bot != NULL )
- {
- vout_UnlinkPicture( p_fifo->p_vpar->p_vout, p_mb->p_backw_bot );
- }
-
/* Unlink picture buffer */
vlc_mutex_lock( &p_mb->p_picture->lock_deccount );
p_mb->p_picture->i_deccount--;
/* Warn Synchro for its records. */
vpar_SynchroEnd( p_fifo->p_vpar );
- }
+
+ /* Unlink referenced pictures */
+ if( p_mb->p_forward != NULL )
+ {
+ vout_UnlinkPicture( p_fifo->p_vpar->p_vout, p_mb->p_forward );
+ }
+ if( p_mb->p_backward != NULL )
+ {
+ vout_UnlinkPicture( p_fifo->p_vpar->p_vout, p_mb->p_backward );
+ }
+ }
vlc_mutex_unlock( & p_mb->p_picture->lock_deccount );
/* Release the macroblock_t structure */
*****************************************************************************/
void vpar_DestroyMacroblock( video_fifo_t * p_fifo, macroblock_t * p_mb )
{
- /* Unlink referenced pictures */
- if( p_mb->p_forw_top != NULL )
- {
- vout_UnlinkPicture( p_fifo->p_vpar->p_vout, p_mb->p_forw_top );
- }
- if( p_mb->p_backw_top != NULL )
- {
- vout_UnlinkPicture( p_fifo->p_vpar->p_vout, p_mb->p_backw_top );
- }
- if( p_mb->p_forw_bot != NULL )
- {
- vout_UnlinkPicture( p_fifo->p_vpar->p_vout, p_mb->p_forw_bot );
- }
- if( p_mb->p_backw_bot != NULL )
- {
- vout_UnlinkPicture( p_fifo->p_vpar->p_vout, p_mb->p_backw_bot );
- }
-
/* Release the macroblock_t structure */
#define P_buffer p_fifo->p_vpar->vbuffer
vlc_mutex_lock( &P_buffer.lock );
{
/* This is a new frame. Get a structure from the video_output. */
P_picture = vout_CreatePicture( p_vpar->p_vout,
- SPLITTED_YUV_PICTURE,
+ 99+p_vpar->sequence.i_chroma_format, /*???*/
p_vpar->sequence.i_width,
p_vpar->sequence.i_height,
- p_vpar->sequence.i_chroma_format );
+ p_vpar->sequence.i_width*sizeof(yuv_data_t) );
/* Initialize values. */
P_picture->date = vpar_SynchroDecode( p_vpar,
/* Decode slice data. */
SliceHeader( p_vpar, &i_mb_address, i_mb_base, i_dummy & 255 );
}
-
+
+ /* Link referenced pictures for the decoder
+ * They are unlinked in vpar_ReleaseMacroblock() & vpar_DestroyMacroblock() */
+ if( p_vpar->sequence.p_forward != NULL )
+ {
+ vout_LinkPicture( p_vpar->p_vout, p_vpar->sequence.p_forward );
+ }
+ if( p_vpar->sequence.p_backward != NULL )
+ {
+ vout_LinkPicture( p_vpar->p_vout, p_vpar->sequence.p_backward );
+ }
+
if( p_vpar->picture.b_error )
{
/* Trash picture. */
ReferenceReplace( p_vpar, p_vpar->picture.i_coding_type, NULL );
vout_DestroyPicture( p_vpar->p_vout, P_picture );
+ /* Unlink referenced pictures */
+ if( p_vpar->sequence.p_forward != NULL )
+ {
+ vout_UnlinkPicture( p_vpar->p_vout, p_vpar->sequence.p_forward );
+ }
+ if( p_vpar->sequence.p_backward != NULL )
+ {
+ vout_UnlinkPicture( p_vpar->p_vout, p_vpar->sequence.p_backward );
+ }
+
/* Prepare context for the next picture. */
P_picture = NULL;
}
else if( p_vpar->picture.i_current_structure == FRAME_STRUCTURE )
{
/* Frame completely parsed. */
- P_picture.i_deccount = p_vpar->sequence.i_mb_size;
+ P_picture->i_deccount = p_vpar->sequence.i_mb_size;
for( i_mb = 0; i_mb < p_vpar->sequence.i_mb_size; i_mb++ )
{
vpar_DecodeMacroblock( &p_vpar->vfifo, p_vpar->picture.pp_mb[i_mb] );