@ -481,7 +481,7 @@ struct CvCapture_FFMPEG
double getProperty ( int ) const ;
bool setProperty ( int , double ) ;
bool grabFrame ( ) ;
bool retrieveFrame ( int , cv : : Mat & mat ) ;
bool retrieveFrame ( int , unsigned char * * data , int * step , int * width , int * height , int * cn ) ;
void rotateFrame ( cv : : Mat & mat ) const ;
void init ( ) ;
@ -564,11 +564,17 @@ void CvCapture_FFMPEG::init()
frame_number = 0 ;
eps_zero = 0.000025 ;
rotation_auto = true ;
rotation_angle = 0 ;
# if LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(52, 111, 0)
# if (LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(52, 111, 0))
# if (LIBAVUTIL_BUILD >= CALC_FFMPEG_VERSION(52, 92, 100))
rotation_auto = true ;
# else
rotation_auto = false ;
# endif
dict = NULL ;
# else
rotation_auto = false ;
# endif
rawMode = false ;
@ -1287,7 +1293,7 @@ bool CvCapture_FFMPEG::grabFrame()
return valid ;
}
bool CvCapture_FFMPEG : : retrieveFrame ( int , cv : : Mat & mat )
bool CvCapture_FFMPEG : : retrieveFrame ( int , unsigned char * * data , int * step , int * width , int * height , int * cn )
{
if ( ! video_st )
return false ;
@ -1295,11 +1301,12 @@ bool CvCapture_FFMPEG::retrieveFrame(int, cv::Mat &mat)
if ( rawMode )
{
AVPacket & p = bsfc ? packet_filtered : packet ;
if ( p . data = = NULL )
return false ;
mat = cv : : Mat ( 1 , p . size , CV_MAKETYPE ( CV_8U , 1 ) , p . data , p . size ) ;
return true ;
* data = p . data ;
* step = p . size ;
* width = p . size ;
* height = 1 ;
* cn = 1 ;
return p . data ! = NULL ;
}
if ( ! picture - > data [ 0 ] )
@ -1362,28 +1369,13 @@ bool CvCapture_FFMPEG::retrieveFrame(int, cv::Mat &mat)
rgb_picture . linesize
) ;
mat = cv : : Mat ( frame . height , frame . width , CV_MAKETYPE ( CV_8U , frame . cn ) , frame . data , frame . step ) ;
rotateFrame ( mat ) ;
return true ;
}
void CvCapture_FFMPEG : : rotateFrame ( cv : : Mat & mat ) const {
if ( ! rotation_auto | | rotation_angle % 360 = = 0 ) {
return ;
}
cv : : RotateFlags flag ;
if ( rotation_angle = = 90 | | rotation_angle = = - 270 ) { // Rotate clockwise 90 degrees
flag = cv : : ROTATE_90_CLOCKWISE ;
} else if ( rotation_angle = = 270 | | rotation_angle = = - 90 ) { // Rotate clockwise 270 degrees
flag = cv : : ROTATE_90_COUNTERCLOCKWISE ;
} else if ( rotation_angle = = 180 | | rotation_angle = = - 180 ) { // Rotate clockwise 180 degrees
flag = cv : : ROTATE_180 ;
} else { // Unsupported rotation
return ;
}
* data = frame . data ;
* step = frame . step ;
* width = frame . width ;
* height = frame . height ;
* cn = frame . cn ;
cv : : rotate ( mat , mat , flag ) ;
return true ;
}
double CvCapture_FFMPEG : : getProperty ( int property_id ) const
@ -1409,9 +1401,9 @@ double CvCapture_FFMPEG::getProperty( int property_id ) const
case CV_FFMPEG_CAP_PROP_FRAME_COUNT :
return ( double ) get_total_frames ( ) ;
case CV_FFMPEG_CAP_PROP_FRAME_WIDTH :
return ( double ) ( ( rotation_auto & & rotation_angle % 36 0) ? frame . height : frame . width ) ;
return ( double ) ( ( rotation_auto & & rotation_angle % 18 0) ? frame . height : frame . width ) ;
case CV_FFMPEG_CAP_PROP_FRAME_HEIGHT :
return ( double ) ( ( rotation_auto & & rotation_angle % 36 0) ? frame . width : frame . height ) ;
return ( double ) ( ( rotation_auto & & rotation_angle % 18 0) ? frame . width : frame . height ) ;
case CV_FFMPEG_CAP_PROP_FPS :
return get_fps ( ) ;
case CV_FFMPEG_CAP_PROP_FOURCC :
@ -1458,7 +1450,12 @@ double CvCapture_FFMPEG::getProperty( int property_id ) const
case CV_FFMPEG_CAP_PROP_ORIENTATION_META :
return static_cast < double > ( rotation_angle ) ;
case CV_FFMPEG_CAP_PROP_ORIENTATION_AUTO :
# if ((LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(52, 111, 0)) && \
( LIBAVUTIL_BUILD > = CALC_FFMPEG_VERSION ( 52 , 94 , 100 ) ) )
return static_cast < double > ( rotation_auto ) ;
# else
return 0 ;
# endif
default :
break ;
}
@ -1540,9 +1537,12 @@ double CvCapture_FFMPEG::dts_to_sec(int64_t dts) const
void CvCapture_FFMPEG : : get_rotation_angle ( )
{
rotation_angle = 0 ;
# if ((LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(52, 111, 0)) && \
( LIBAVUTIL_BUILD > = CALC_FFMPEG_VERSION ( 52 , 94 , 100 ) ) )
AVDictionaryEntry * rotate_tag = av_dict_get ( video_st - > metadata , " rotate " , NULL , 0 ) ;
if ( rotate_tag ! = NULL )
rotation_angle = atoi ( rotate_tag - > value ) ;
# endif
}
void CvCapture_FFMPEG : : seek ( int64_t _frame_number )
@ -1641,7 +1641,14 @@ bool CvCapture_FFMPEG::setProperty( int property_id, double value )
return setRaw ( ) ;
return false ;
case CV_FFMPEG_CAP_PROP_ORIENTATION_AUTO :
# if ((LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(52, 111, 0)) && \
( LIBAVUTIL_BUILD > = CALC_FFMPEG_VERSION ( 52 , 94 , 100 ) ) )
rotation_auto = static_cast < bool > ( value ) ;
return true ;
# else
rotation_auto = 0 ;
return false ;
# endif
break ;
default :
return false ;
@ -2670,9 +2677,9 @@ int cvGrabFrame_FFMPEG(CvCapture_FFMPEG* capture)
return capture - > grabFrame ( ) ;
}
int cvRetrieveFrame_FFMPEG ( CvCapture_FFMPEG * capture , cv : : Mat & mat )
int cvRetrieveFrame_FFMPEG ( CvCapture_FFMPEG * capture , unsigned char * * data , int * step , int * width , int * height , int * cn )
{
return capture - > retrieveFrame ( 0 , mat ) ;
return capture - > retrieveFrame ( 0 , data , step , width , height , cn ) ;
}
CvVideoWriter_FFMPEG * cvCreateVideoWriter_FFMPEG ( const char * filename , int fourcc , double fps ,