@ -48,6 +48,7 @@
# include <algorithm>
# include <limits>
# define OPENCV_FOURCC(c1, c2, c3, c4) (((c1) & 255) + (((c2) & 255) << 8) + (((c3) & 255) << 16) + (((c4) & 255) << 24))
# define CALC_FFMPEG_VERSION(a,b,c) ( a<<16 | b<<8 | c )
# if defined _MSC_VER && _MSC_VER >= 1200
@ -350,6 +351,41 @@ struct AVInterruptCallbackMetadata
int timeout ;
} ;
// https://github.com/opencv/opencv/pull/12693#issuecomment-426236731
static
inline const char * _opencv_avcodec_get_name ( AVCodecID id )
{
# if LIBAVCODEC_VERSION_MICRO >= 100 \
& & LIBAVCODEC_BUILD > = CALC_FFMPEG_VERSION ( 53 , 47 , 100 )
return avcodec_get_name ( id ) ;
# else
const AVCodecDescriptor * cd ;
AVCodec * codec ;
if ( id = = AV_CODEC_ID_NONE )
{
return " none " ;
}
cd = avcodec_descriptor_get ( id ) ;
if ( cd )
{
return cd - > name ;
}
codec = avcodec_find_decoder ( id ) ;
if ( codec )
{
return codec - > name ;
}
codec = avcodec_find_encoder ( id ) ;
if ( codec )
{
return codec - > name ;
}
return " unknown_codec " ;
# endif
}
static
inline void _opencv_ffmpeg_free ( void * * ptr )
{
@ -1121,6 +1157,10 @@ double CvCapture_FFMPEG::getProperty( int property_id ) const
{
if ( ! video_st ) return 0 ;
double codec_tag = 0 ;
AVCodecID codec_id = AV_CODEC_ID_NONE ;
const char * codec_fourcc = NULL ;
switch ( property_id )
{
case CV_FFMPEG_CAP_PROP_POS_MSEC :
@ -1139,10 +1179,25 @@ double CvCapture_FFMPEG::getProperty( int property_id ) const
return get_fps ( ) ;
case CV_FFMPEG_CAP_PROP_FOURCC :
# if LIBAVFORMAT_BUILD > 4628
return ( double ) video_st - > codec - > codec_tag ;
codec_id = video_st - > codec - > codec_id ;
codec_tag = ( double ) video_st - > codec - > codec_tag ;
# else
return ( double ) video_st - > codec . codec_tag ;
codec_id = video_st - > codec . codec_id ;
codec_tag = ( double ) video_st - > codec . codec_tag ;
# endif
if ( codec_tag | | codec_id = = AV_CODEC_ID_NONE )
{
return codec_tag ;
}
codec_fourcc = _opencv_avcodec_get_name ( codec_id ) ;
if ( ! codec_fourcc | | strlen ( codec_fourcc ) < 4 | | strcmp ( codec_fourcc , " unknown_codec " ) = = 0 )
{
return codec_tag ;
}
return ( double ) OPENCV_FOURCC ( codec_fourcc [ 0 ] , codec_fourcc [ 1 ] , codec_fourcc [ 2 ] , codec_fourcc [ 3 ] ) ;
case CV_FFMPEG_CAP_PROP_SAR_NUM :
return _opencv_ffmpeg_get_sample_aspect_ratio ( ic - > streams [ video_stream ] ) . num ;
case CV_FFMPEG_CAP_PROP_SAR_DEN :