@ -113,7 +113,10 @@ static void fill_picture_parameters(struct dxva_context *ctx, const H264Context
pp - > bit_depth_luma_minus8 = h - > sps . bit_depth_luma - 8 ;
pp - > bit_depth_luma_minus8 = h - > sps . bit_depth_luma - 8 ;
pp - > bit_depth_chroma_minus8 = h - > sps . bit_depth_chroma - 8 ;
pp - > bit_depth_chroma_minus8 = h - > sps . bit_depth_chroma - 8 ;
pp - > Reserved16Bits = 3 ; /* FIXME is there a way to detect the right mode ? */
if ( ctx - > workaround & FF_DXVA2_WORKAROUND_SCALING_LIST_ZIGZAG )
pp - > Reserved16Bits = 0 ;
else
pp - > Reserved16Bits = 3 ; /* FIXME is there a way to detect the right mode ? */
pp - > StatusReportFeedbackNumber = 1 + ctx - > report_id + + ;
pp - > StatusReportFeedbackNumber = 1 + ctx - > report_id + + ;
pp - > CurrFieldOrderCnt [ 0 ] = 0 ;
pp - > CurrFieldOrderCnt [ 0 ] = 0 ;
if ( ( s - > picture_structure & PICT_TOP_FIELD ) & &
if ( ( s - > picture_structure & PICT_TOP_FIELD ) & &
@ -150,17 +153,27 @@ static void fill_picture_parameters(struct dxva_context *ctx, const H264Context
//pp->SliceGroupMap[810]; /* XXX not implemented by Libav */
//pp->SliceGroupMap[810]; /* XXX not implemented by Libav */
}
}
static void fill_scaling_lists ( const H264Context * h , DXVA_Qmatrix_H264 * qm )
static void fill_scaling_lists ( struct dxva_context * ctx , const H264Context * h , DXVA_Qmatrix_H264 * qm )
{
{
unsigned i , j ;
unsigned i , j ;
memset ( qm , 0 , sizeof ( * qm ) ) ;
memset ( qm , 0 , sizeof ( * qm ) ) ;
for ( i = 0 ; i < 6 ; i + + )
if ( ctx - > workaround & FF_DXVA2_WORKAROUND_SCALING_LIST_ZIGZAG ) {
for ( j = 0 ; j < 16 ; j + + )
for ( i = 0 ; i < 6 ; i + + )
qm - > bScalingLists4x4 [ i ] [ j ] = h - > pps . scaling_matrix4 [ i ] [ zigzag_scan [ j ] ] ;
for ( j = 0 ; j < 16 ; j + + )
qm - > bScalingLists4x4 [ i ] [ j ] = h - > pps . scaling_matrix4 [ i ] [ j ] ;
for ( i = 0 ; i < 2 ; i + + )
for ( j = 0 ; j < 64 ; j + + )
qm - > bScalingLists8x8 [ i ] [ j ] = h - > pps . scaling_matrix8 [ i ] [ j ] ;
} else {
for ( i = 0 ; i < 6 ; i + + )
for ( j = 0 ; j < 16 ; j + + )
qm - > bScalingLists4x4 [ i ] [ j ] = h - > pps . scaling_matrix4 [ i ] [ zigzag_scan [ j ] ] ;
for ( i = 0 ; i < 2 ; i + + )
for ( i = 0 ; i < 2 ; i + + )
for ( j = 0 ; j < 64 ; j + + )
for ( j = 0 ; j < 64 ; j + + )
qm - > bScalingLists8x8 [ i ] [ j ] = h - > pps . scaling_matrix8 [ i ] [ ff_zigzag_direct [ j ] ] ;
qm - > bScalingLists8x8 [ i ] [ j ] = h - > pps . scaling_matrix8 [ i ] [ ff_zigzag_direct [ j ] ] ;
}
}
}
static int is_slice_short ( struct dxva_context * ctx )
static int is_slice_short ( struct dxva_context * ctx )
@ -370,7 +383,7 @@ static int start_frame(AVCodecContext *avctx,
fill_picture_parameters ( ctx , h , & ctx_pic - > pp ) ;
fill_picture_parameters ( ctx , h , & ctx_pic - > pp ) ;
/* Fill up DXVA_Qmatrix_H264 */
/* Fill up DXVA_Qmatrix_H264 */
fill_scaling_lists ( h , & ctx_pic - > qm ) ;
fill_scaling_lists ( ctx , h , & ctx_pic - > qm ) ;
ctx_pic - > slice_count = 0 ;
ctx_pic - > slice_count = 0 ;
ctx_pic - > bitstream_size = 0 ;
ctx_pic - > bitstream_size = 0 ;