Commit 4e797456 authored by Laurent Aimar's avatar Laurent Aimar

Added decoder_New/Delete/Link/UnlinkPicture helpers.

parent f0e63c5d
......@@ -81,29 +81,28 @@ struct decoder_t
* globaly, not necessary for the current packet */
block_t * ( * pf_get_cc ) ( decoder_t *, bool pb_present[4] );
/*
* Buffers allocation
*/
/* Video output callbacks */
picture_t * ( * pf_vout_buffer_new) ( decoder_t * );
void ( * pf_vout_buffer_del) ( decoder_t *, picture_t * );
void ( * pf_picture_link) ( decoder_t *, picture_t * );
void ( * pf_picture_unlink) ( decoder_t *, picture_t * );
/*
* Owner fields
* XXX You MUST not use them directly.
*/
/* Video output callbacks
* XXX use decoder_NewPicture/decoder_DeletePicture
* and decoder_LinkPicture/decoder_UnlinkPicture */
picture_t *(*pf_vout_buffer_new)( decoder_t * );
void (*pf_vout_buffer_del)( decoder_t *, picture_t * );
void (*pf_picture_link) ( decoder_t *, picture_t * );
void (*pf_picture_unlink) ( decoder_t *, picture_t * );
/* Audio output callbacks
* XXX use decoder_NewAudioBuffer/decoder_DeleteAudioBuffer */
aout_buffer_t * ( * pf_aout_buffer_new) ( decoder_t *, int );
void ( * pf_aout_buffer_del) ( decoder_t *, aout_buffer_t * );
aout_buffer_t *(*pf_aout_buffer_new)( decoder_t *, int );
void (*pf_aout_buffer_del)( decoder_t *, aout_buffer_t * );
/* SPU output callbacks
* XXX use decoder_NewSubpicture and decoder_DeleteSubpicture */
subpicture_t *(*pf_spu_buffer_new) ( decoder_t * );
void (*pf_spu_buffer_del) ( decoder_t *, subpicture_t * );
subpicture_t *(*pf_spu_buffer_new)( decoder_t * );
void (*pf_spu_buffer_del)( decoder_t *, subpicture_t * );
/* Input attachments
* XXX use decoder_GetInputAttachments */
......@@ -166,6 +165,30 @@ struct encoder_t
*/
/**
* This function will return a new picture usable by a decoder as an output
* buffer. You have to release it using decoder_DeletePicture or by returning
* it to the caller as a pf_decode_video return value.
*/
VLC_EXPORT( picture_t *, decoder_NewPicture, ( decoder_t * ) );
/**
* This function will release a picture create by decoder_NewPicture.
*/
VLC_EXPORT( void, decoder_DeletePicture, ( decoder_t *, picture_t *p_picture ) );
/**
* This function will increase the picture reference count.
* (picture_Hold is not usable.)
*/
VLC_EXPORT( void, decoder_LinkPicture, ( decoder_t *, picture_t * ) );
/**
* This function will decrease the picture reference count.
* (picture_Release is not usable.)
*/
VLC_EXPORT( void, decoder_UnlinkPicture, ( decoder_t *, picture_t * ) );
/**
* This function will return a new audio buffer usable by a decoder as an
* output buffer. You have to release it using decoder_DeleteAudioBuffer
......
......@@ -165,7 +165,7 @@ static inline picture_t *ffmpeg_NewPictBuf( decoder_t *p_dec,
p_dec->fmt_out.video.i_frame_rate_base = p_context->time_base.num;
}
p_pic = p_dec->pf_vout_buffer_new( p_dec );
p_pic = decoder_NewPicture( p_dec );
return p_pic;
}
......@@ -609,7 +609,7 @@ picture_t *DecodeVideo( decoder_t *p_dec, block_t **pp_block )
/* Do not display the picture */
p_pic = (picture_t *)p_sys->p_ff_pic->opaque;
if( !b_drawpicture && p_pic )
p_dec->pf_vout_buffer_del( p_dec, p_pic );
decoder_DeletePicture( p_dec, p_pic );
ffmpeg_NextPts( p_dec );
continue;
......@@ -699,7 +699,7 @@ picture_t *DecodeVideo( decoder_t *p_dec, block_t **pp_block )
}
else
{
p_dec->pf_vout_buffer_del( p_dec, p_pic );
decoder_DeletePicture( p_dec, p_pic );
}
}
......@@ -914,7 +914,7 @@ static int ffmpeg_GetFrameBuf( struct AVCodecContext *p_context,
if( p_ff_pic->reference != 0 )
{
p_dec->pf_picture_link( p_dec, p_pic );
decoder_LinkPicture( p_dec, p_pic );
}
/* FIXME what is that, should give good value */
......@@ -996,7 +996,7 @@ static void ffmpeg_ReleaseFrameBuf( struct AVCodecContext *p_context,
if( p_ff_pic->reference != 0 )
{
p_dec->pf_picture_unlink( p_dec, p_pic );
decoder_UnlinkPicture( p_dec, p_pic );
}
}
......
......@@ -153,7 +153,7 @@ static picture_t *Decode( decoder_t *p_dec, block_t **pp_block )
}
/* Get a new picture */
p_pic = p_dec->pf_vout_buffer_new( p_dec );
p_pic = decoder_NewPicture( p_dec );
if( !p_pic )
goto error;
......
......@@ -168,7 +168,7 @@ static picture_t *GetNewPicture( decoder_t *p_dec )
p_sys->p_dirac->src_params.frame_rate.denominator;
/* Get a new picture */
p_pic = p_dec->pf_vout_buffer_new( p_dec );
p_pic = decoder_NewPicture( p_dec );
if( p_pic == NULL ) return NULL;
p_pic->b_progressive = !p_sys->p_dirac->src_params.source_sampling;
......
......@@ -953,7 +953,7 @@ static void *DecBlock( decoder_t *p_dec, block_t **pp_block )
if( p_dec->fmt_out.i_cat == VIDEO_ES )
{
/* Get a new picture */
picture_t *p_pic = p_dec->pf_vout_buffer_new( p_dec );
picture_t *p_pic = decoder_NewPicture( p_dec );
if( !p_pic ) return NULL;
CopyPicture( p_pic, block_out.p_buffer );
......
......@@ -345,7 +345,7 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
picture_t *p_pic;
if( pp_block == NULL || !*pp_block ) return NULL;
p_pic = p_dec->pf_vout_buffer_new( p_dec );
p_pic = decoder_NewPicture( p_dec );
if( p_pic == NULL )
{
msg_Err( p_dec, "cannot get picture" );
......
......@@ -341,7 +341,7 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
/* For some reason, libmpeg2 will put this pic twice in
* discard_picture. This can be considered a bug in libmpeg2. */
p_dec->pf_picture_link( p_dec, p_pic );
decoder_LinkPicture( p_dec, p_pic );
if( p_sys->p_synchro )
{
......@@ -509,8 +509,8 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
if( p_sys->p_info->discard_fbuf &&
p_sys->p_info->discard_fbuf->id )
{
p_dec->pf_picture_unlink( p_dec,
p_sys->p_info->discard_fbuf->id );
decoder_UnlinkPicture( p_dec,
p_sys->p_info->discard_fbuf->id );
}
/* For still frames */
......@@ -639,7 +639,7 @@ static picture_t *GetNewPicture( decoder_t *p_dec, uint8_t **pp_buf )
VLC_FOURCC('I','4','2','0') : VLC_FOURCC('I','4','2','2');
/* Get a new picture */
p_pic = p_dec->pf_vout_buffer_new( p_dec );
p_pic = decoder_NewPicture( p_dec );
if( p_pic == NULL ) return NULL;
......@@ -650,7 +650,7 @@ static picture_t *GetNewPicture( decoder_t *p_dec, uint8_t **pp_buf )
p_pic->i_nb_fields = p_sys->p_info->current_picture != NULL ?
p_sys->p_info->current_picture->nb_fields : 2;
p_dec->pf_picture_link( p_dec, p_pic );
decoder_LinkPicture( p_dec, p_pic );
pp_buf[0] = p_pic->p[0].p_pixels;
pp_buf[1] = p_pic->p[1].p_pixels;
......
......@@ -202,7 +202,7 @@ static void *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
// p_sys->p_decoder->sync();
if( p_block->i_flags & BLOCK_FLAG_END_OF_FRAME )
{
p_pic = p_dec->pf_vout_buffer_new( p_dec );
p_pic = decoder_NewPicture( p_dec );
if( !p_pic )
{
block_Release( p_block );
......
......@@ -206,7 +206,7 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
}
/* Get a new picture */
p_pic = p_dec->pf_vout_buffer_new( p_dec );
p_pic = decoder_NewPicture( p_dec );
if( !p_pic ) goto error;
/* Decode picture */
......
......@@ -924,7 +924,7 @@ static picture_t *DecodeVideo( decoder_t *p_dec, block_t **pp_block )
vlc_mutex_lock( &qt_mutex );
if( ( p_pic = p_dec->pf_vout_buffer_new( p_dec ) ) )
if( ( p_pic = decoder_NewPicture( p_dec ) ) )
{
p_sys->decpar.data = (Ptr)p_block->p_buffer;
p_sys->decpar.bufferSize = p_block->i_buffer;
......
......@@ -289,7 +289,7 @@ static picture_t *DecodeFrame( decoder_t *p_dec, block_t *p_block )
picture_t *p_pic;
/* Get a new picture */
p_pic = p_dec->pf_vout_buffer_new( p_dec );
p_pic = decoder_NewPicture( p_dec );
if( !p_pic )
{
block_Release( p_block );
......
......@@ -463,7 +463,7 @@ static picture_t *DecodeVideo( decoder_t *p_dec, block_t **pp_block )
vlc_mutex_lock( &rm_mutex );
p_pic = p_dec->pf_vout_buffer_new( p_dec );
p_pic = decoder_NewPicture( p_dec );
if ( p_pic )
{
......
......@@ -256,7 +256,7 @@ static void SchroFrameFree( SchroFrame *frame, void *priv)
if( !p_free )
return;
p_free->p_dec->pf_vout_buffer_del( p_free->p_dec, p_free->p_pic );
decoder_DeletePicture( p_free->p_dec, p_free->p_pic );
free(p_free);
(void)frame;
}
......@@ -274,7 +274,7 @@ static SchroFrame *CreateSchroFrameFromPic( decoder_t *p_dec )
if( !p_schroframe )
return NULL;
p_pic = p_dec->pf_vout_buffer_new( p_dec );
p_pic = decoder_NewPicture( p_dec );
if( !p_pic )
return NULL;
......
......@@ -171,7 +171,7 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
/ p_surface->h;
/* Get a new picture. */
p_pic = p_dec->pf_vout_buffer_new( p_dec );
p_pic = decoder_NewPicture( p_dec );
if ( p_pic == NULL ) goto error;
switch ( p_surface->format->BitsPerPixel )
......
......@@ -266,7 +266,7 @@ static picture_t *DecodePacket( decoder_t *p_dec, block_t **pp_block,
p_dec->fmt_out.i_codec = i_chroma;
/* Get a new picture */
if( (p_pic = p_dec->pf_vout_buffer_new( p_dec )) )
if( (p_pic = decoder_NewPicture( p_dec )) )
{
tarkin_CopyPicture( p_dec, p_pic, rgb, i_stride );
......
......@@ -495,7 +495,7 @@ static picture_t *DecodePacket( decoder_t *p_dec, ogg_packet *p_oggpacket )
return NULL;
/* Get a new picture */
p_pic = p_dec->pf_vout_buffer_new( p_dec );
p_pic = decoder_NewPicture( p_dec );
if( !p_pic ) return NULL;
theora_CopyPicture( p_dec, p_pic, &yuv );
......
......@@ -378,7 +378,7 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
mpeg2_set_buf( p_sys->p_mpeg2dec, buf, p_pic );
p_pic->date = 0;
p_dec->pf_picture_link( p_dec, p_pic );
decoder_LinkPicture( p_dec, p_pic );
if( p_sys->p_synchro )
{
......@@ -531,7 +531,7 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
if( p_sys->p_info->discard_fbuf &&
p_sys->p_info->discard_fbuf->id )
{
p_dec->pf_picture_unlink( p_dec, p_sys->p_info->discard_fbuf->id );
decoder_UnlinkPicture( p_dec, p_sys->p_info->discard_fbuf->id );
}
/* For still frames */
//if( state == STATE_END && p_pic ) p_pic->b_force = true;
......@@ -703,7 +703,7 @@ static picture_t *GetNewPicture( decoder_t *p_dec, uint8_t **pp_buf )
fflush(p_sys->f_wd_nb);
}
#endif
p_pic = p_dec->pf_vout_buffer_new( p_dec );
p_pic = decoder_NewPicture( p_dec );
if( p_pic == NULL ) return NULL;
......@@ -716,7 +716,7 @@ static picture_t *GetNewPicture( decoder_t *p_dec, uint8_t **pp_buf )
p_pic->format.i_frame_rate = p_dec->fmt_out.video.i_frame_rate;
p_pic->format.i_frame_rate_base = p_dec->fmt_out.video.i_frame_rate_base;
p_dec->pf_picture_link( p_dec, p_pic );
decoder_LinkPicture( p_dec, p_pic );
pp_buf[0] = p_pic->p[0].p_pixels;
pp_buf[1] = p_pic->p[1].p_pixels;
......
......@@ -72,7 +72,7 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
p_dec->fmt_out.video.i_aspect = VOUT_ASPECT_FACTOR;
p_dec->fmt_out.i_codec = VLC_FOURCC('I','4','2','0');
p_pic = p_dec->pf_vout_buffer_new( p_dec );
p_pic = decoder_NewPicture( p_dec );
if( p_block->i_buffer == kBufferSize )
{
......
......@@ -161,6 +161,26 @@ struct decoder_owner_sys_t
/*****************************************************************************
* Public functions
*****************************************************************************/
picture_t *decoder_NewPicture( decoder_t *p_decoder )
{
picture_t *p_picture = p_decoder->pf_vout_buffer_new( p_decoder );
if( !p_picture )
msg_Warn( p_decoder, "can't get output picture" );
return p_picture;
}
void decoder_DeletePicture( decoder_t *p_decoder, picture_t *p_picture )
{
p_decoder->pf_vout_buffer_del( p_decoder, p_picture );
}
void decoder_LinkPicture( decoder_t *p_decoder, picture_t *p_picture )
{
p_decoder->pf_picture_link( p_decoder, p_picture );
}
void decoder_UnlinkPicture( decoder_t *p_decoder, picture_t *p_picture )
{
p_decoder->pf_picture_unlink( p_decoder, p_picture );
}
aout_buffer_t *decoder_NewAudioBuffer( decoder_t *p_decoder, int i_size )
{
if( !p_decoder->pf_aout_buffer_new )
......@@ -169,8 +189,6 @@ aout_buffer_t *decoder_NewAudioBuffer( decoder_t *p_decoder, int i_size )
}
void decoder_DeleteAudioBuffer( decoder_t *p_decoder, aout_buffer_t *p_buffer )
{
if( !p_decoder->pf_aout_buffer_del )
return;
p_decoder->pf_aout_buffer_del( p_decoder, p_buffer );
}
......
......@@ -78,11 +78,14 @@ date_Init
date_Move
date_Set
decoder_DeleteAudioBuffer
decoder_DeletePicture
decoder_DeleteSubpicture
decoder_GetDisplayDate
decoder_GetDisplayRate
decoder_GetInputAttachments
decoder_LinkPicture
decoder_NewAudioBuffer
decoder_NewPicture
decoder_NewSubpicture
decoder_SynchroChoose
decoder_SynchroDate
......@@ -93,6 +96,7 @@ decoder_SynchroNewPicture
decoder_SynchroRelease
decoder_SynchroReset
decoder_SynchroTrash
decoder_UnlinkPicture
decode_URI
decode_URI_duplicate
demux_PacketizerDestroy
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment