@ -33,6 +33,7 @@ extern "C" {
# include "libavformat/avformat.h"
# include "libavformat/internal.h"
# include "libavutil/imgutils.h"
# include "libavutil/intreadwrite.h"
# include "libavutil/bswap.h"
}
@ -158,8 +159,8 @@ int ff_decklink_set_format(AVFormatContext *avctx,
int i = 1 ;
HRESULT res ;
av_log ( avctx , AV_LOG_DEBUG , " Trying to find mode for frame size %dx%d, frame timing %d/%d, field order %d, direction %d, mode number %d \n " ,
width , height , tb_num , tb_den , field_order , direction , num ) ;
av_log ( avctx , AV_LOG_DEBUG , " Trying to find mode for frame size %dx%d, frame timing %d/%d, field order %d, direction %d, mode number %d, format code %s \n " ,
width , height , tb_num , tb_den , field_order , direction , num , ( cctx - > format_code ) ? cctx - > format_code : " (unset) " ) ;
if ( ctx - > duplex_mode ) {
DECKLINK_BOOL duplex_supported = false ;
@ -196,12 +197,17 @@ int ff_decklink_set_format(AVFormatContext *avctx,
return AVERROR ( EIO ) ;
}
char format_buf [ ] = " " ;
if ( cctx - > format_code )
memcpy ( format_buf , cctx - > format_code , FFMIN ( strlen ( cctx - > format_code ) , sizeof ( format_buf ) ) ) ;
BMDDisplayMode target_mode = ( BMDDisplayMode ) AV_RB32 ( format_buf ) ;
AVRational target_tb = av_make_q ( tb_num , tb_den ) ;
ctx - > bmd_mode = bmdModeUnknown ;
while ( ( ctx - > bmd_mode = = bmdModeUnknown ) & & itermode - > Next ( & mode ) = = S_OK ) {
BMDTimeValue bmd_tb_num , bmd_tb_den ;
int bmd_width = mode - > GetWidth ( ) ;
int bmd_height = mode - > GetHeight ( ) ;
BMDDisplayMode bmd_mode = mode - > GetDisplayMode ( ) ;
BMDFieldDominance bmd_field_dominance = mode - > GetFieldDominance ( ) ;
mode - > GetFrameRate ( & bmd_tb_num , & bmd_tb_den ) ;
@ -210,8 +216,10 @@ int ff_decklink_set_format(AVFormatContext *avctx,
if ( ( bmd_width = = width & &
bmd_height = = height & &
! av_cmp_q ( mode_tb , target_tb ) & &
field_order_eq ( field_order , bmd_field_dominance ) ) | | i = = num ) {
ctx - > bmd_mode = mode - > GetDisplayMode ( ) ;
field_order_eq ( field_order , bmd_field_dominance ) )
| | i = = num
| | target_mode = = bmd_mode ) {
ctx - > bmd_mode = bmd_mode ;
ctx - > bmd_width = bmd_width ;
ctx - > bmd_height = bmd_height ;
ctx - > bmd_tb_den = bmd_tb_den ;