@ -38,10 +38,8 @@
void ff_xvmc_init_block ( MpegEncContext * s )
{
struct xvmc_pixfmt_render * render = ( struct xvmc_pixfmt_render * ) s - > current_picture . data [ 2 ] ;
if ( ! render | | render - > magic_id ! = AV_XVMC_RENDER_MAGIC ) {
assert ( 0 ) ;
return ; // make sure that this is a render packet
}
assert ( render & & render - > magic_id = = AV_XVMC_RENDER_MAGIC ) ;
s - > block = ( DCTELEM * ) ( render - > data_blocks + render - > next_free_data_block_num * 64 ) ;
}
@ -67,20 +65,37 @@ void ff_xvmc_pack_pblocks(MpegEncContext *s, int cbp)
int ff_xvmc_field_start ( MpegEncContext * s , AVCodecContext * avctx )
{
struct xvmc_pixfmt_render * last , * next , * render = ( struct xvmc_pixfmt_render * ) s - > current_picture . data [ 2 ] ;
const int mb_block_count = 4 + ( 1 < < s - > chroma_format ) ;
assert ( avctx ) ;
if ( ! render | | render - > magic_id ! = AV_XVMC_RENDER_MAGIC )
if ( ! render | | render - > magic_id ! = AV_XVMC_RENDER_MAGIC | |
! render - > data_blocks | | ! render - > mv_blocks ) {
av_log ( avctx , AV_LOG_ERROR ,
" Render token doesn't look as expected. \n " ) ;
return - 1 ; // make sure that this is a render packet
}
render - > picture_structure = s - > picture_structure ;
render - > flags = s - > first_field ? 0 : XVMC_SECOND_FIELD ;
if ( render - > filled_mv_blocks_num ) {
av_log ( avctx , AV_LOG_ERROR ,
" Rendering surface contains %i unprocessed blocks \n " ,
" Rendering surface contains %i unprocessed blocks. \n " ,
render - > filled_mv_blocks_num ) ;
return - 1 ;
}
if ( render - > total_number_of_mv_blocks < 1 | |
render - > total_number_of_data_blocks < mb_block_count ) {
av_log ( avctx , AV_LOG_ERROR ,
" Rendering surface doesn't provide enough block structures to work with. \n " ) ;
return - 1 ;
}
if ( render - > total_number_of_mv_blocks < 1 | |
render - > total_number_of_data_blocks < mb_block_count ) {
av_log ( avctx , AV_LOG_ERROR ,
" Rendering surface doesn't provide enough block structures to work with. \n " ) ;
return - 1 ;
}
render - > p_future_surface = NULL ;
render - > p_past_surface = NULL ;