@@ -481,7 +481,7 @@ struct CvCapture_FFMPEG
481
481
double getProperty (int ) const ;
482
482
bool setProperty (int , double );
483
483
bool grabFrame ();
484
- bool retrieveFrame (int , cv::Mat &mat );
484
+ bool retrieveFrame (int , unsigned char ** data, int * step, int * width, int * height, int * cn );
485
485
void rotateFrame (cv::Mat &mat) const ;
486
486
487
487
void init ();
@@ -564,11 +564,17 @@ void CvCapture_FFMPEG::init()
564
564
frame_number = 0 ;
565
565
eps_zero = 0.000025 ;
566
566
567
- rotation_auto = true ;
568
567
rotation_angle = 0 ;
569
568
570
- #if LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(52, 111, 0)
569
+ #if (LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(52, 111, 0))
570
+ #if (LIBAVUTIL_BUILD >= CALC_FFMPEG_VERSION(52, 92, 100))
571
+ rotation_auto = true ;
572
+ #else
573
+ rotation_auto = false ;
574
+ #endif
571
575
dict = NULL ;
576
+ #else
577
+ rotation_auto = false ;
572
578
#endif
573
579
574
580
rawMode = false ;
@@ -1287,19 +1293,20 @@ bool CvCapture_FFMPEG::grabFrame()
1287
1293
return valid;
1288
1294
}
1289
1295
1290
- bool CvCapture_FFMPEG::retrieveFrame (int , cv::Mat &mat )
1296
+ bool CvCapture_FFMPEG::retrieveFrame (int , unsigned char ** data, int * step, int * width, int * height, int * cn )
1291
1297
{
1292
1298
if (!video_st)
1293
1299
return false ;
1294
1300
1295
1301
if (rawMode)
1296
1302
{
1297
1303
AVPacket& p = bsfc ? packet_filtered : packet;
1298
- if (p.data == NULL )
1299
- return false ;
1300
-
1301
- mat = cv::Mat (1 , p.size , CV_MAKETYPE (CV_8U, 1 ), p.data , p.size );
1302
- return true ;
1304
+ *data = p.data ;
1305
+ *step = p.size ;
1306
+ *width = p.size ;
1307
+ *height = 1 ;
1308
+ *cn = 1 ;
1309
+ return p.data != NULL ;
1303
1310
}
1304
1311
1305
1312
if (!picture->data [0 ])
@@ -1362,28 +1369,13 @@ bool CvCapture_FFMPEG::retrieveFrame(int, cv::Mat &mat)
1362
1369
rgb_picture.linesize
1363
1370
);
1364
1371
1365
- mat = cv::Mat (frame.height , frame.width , CV_MAKETYPE (CV_8U, frame.cn ), frame.data , frame.step );
1366
- rotateFrame (mat);
1367
- return true ;
1368
- }
1369
-
1370
- void CvCapture_FFMPEG::rotateFrame (cv::Mat &mat) const {
1371
- if (!rotation_auto || rotation_angle%360 == 0 ) {
1372
- return ;
1373
- }
1374
-
1375
- cv::RotateFlags flag;
1376
- if (rotation_angle == 90 || rotation_angle == -270 ) { // Rotate clockwise 90 degrees
1377
- flag = cv::ROTATE_90_CLOCKWISE;
1378
- } else if (rotation_angle == 270 || rotation_angle == -90 ) { // Rotate clockwise 270 degrees
1379
- flag = cv::ROTATE_90_COUNTERCLOCKWISE;
1380
- } else if (rotation_angle == 180 || rotation_angle == -180 ) { // Rotate clockwise 180 degrees
1381
- flag = cv::ROTATE_180;
1382
- } else { // Unsupported rotation
1383
- return ;
1384
- }
1372
+ *data = frame.data ;
1373
+ *step = frame.step ;
1374
+ *width = frame.width ;
1375
+ *height = frame.height ;
1376
+ *cn = frame.cn ;
1385
1377
1386
- cv::rotate (mat, mat, flag) ;
1378
+ return true ;
1387
1379
}
1388
1380
1389
1381
double CvCapture_FFMPEG::getProperty ( int property_id ) const
@@ -1409,9 +1401,9 @@ double CvCapture_FFMPEG::getProperty( int property_id ) const
1409
1401
case CV_FFMPEG_CAP_PROP_FRAME_COUNT:
1410
1402
return (double )get_total_frames ();
1411
1403
case CV_FFMPEG_CAP_PROP_FRAME_WIDTH:
1412
- return (double )((rotation_auto && rotation_angle%360 ) ? frame.height : frame.width );
1404
+ return (double )((rotation_auto && rotation_angle%180 ) ? frame.height : frame.width );
1413
1405
case CV_FFMPEG_CAP_PROP_FRAME_HEIGHT:
1414
- return (double )((rotation_auto && rotation_angle%360 ) ? frame.width : frame.height );
1406
+ return (double )((rotation_auto && rotation_angle%180 ) ? frame.width : frame.height );
1415
1407
case CV_FFMPEG_CAP_PROP_FPS:
1416
1408
return get_fps ();
1417
1409
case CV_FFMPEG_CAP_PROP_FOURCC:
@@ -1458,7 +1450,12 @@ double CvCapture_FFMPEG::getProperty( int property_id ) const
1458
1450
case CV_FFMPEG_CAP_PROP_ORIENTATION_META:
1459
1451
return static_cast <double >(rotation_angle);
1460
1452
case CV_FFMPEG_CAP_PROP_ORIENTATION_AUTO:
1453
+ #if ((LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(52, 111, 0)) && \
1454
+ (LIBAVUTIL_BUILD >= CALC_FFMPEG_VERSION (52 , 94 , 100 )))
1461
1455
return static_cast <double >(rotation_auto);
1456
+ #else
1457
+ return 0 ;
1458
+ #endif
1462
1459
default :
1463
1460
break ;
1464
1461
}
@@ -1540,9 +1537,12 @@ double CvCapture_FFMPEG::dts_to_sec(int64_t dts) const
1540
1537
void CvCapture_FFMPEG::get_rotation_angle ()
1541
1538
{
1542
1539
rotation_angle = 0 ;
1540
+ #if ((LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(52, 111, 0)) && \
1541
+ (LIBAVUTIL_BUILD >= CALC_FFMPEG_VERSION (52 , 94 , 100 )))
1543
1542
AVDictionaryEntry *rotate_tag = av_dict_get (video_st->metadata , " rotate" , NULL , 0 );
1544
1543
if (rotate_tag != NULL )
1545
1544
rotation_angle = atoi (rotate_tag->value );
1545
+ #endif
1546
1546
}
1547
1547
1548
1548
void CvCapture_FFMPEG::seek (int64_t _frame_number)
@@ -1641,7 +1641,14 @@ bool CvCapture_FFMPEG::setProperty( int property_id, double value )
1641
1641
return setRaw ();
1642
1642
return false ;
1643
1643
case CV_FFMPEG_CAP_PROP_ORIENTATION_AUTO:
1644
+ #if ((LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(52, 111, 0)) && \
1645
+ (LIBAVUTIL_BUILD >= CALC_FFMPEG_VERSION (52 , 94 , 100 )))
1644
1646
rotation_auto = static_cast <bool >(value);
1647
+ return true ;
1648
+ #else
1649
+ rotation_auto = 0 ;
1650
+ return false ;
1651
+ #endif
1645
1652
break ;
1646
1653
default :
1647
1654
return false ;
@@ -2670,9 +2677,9 @@ int cvGrabFrame_FFMPEG(CvCapture_FFMPEG* capture)
2670
2677
return capture->grabFrame ();
2671
2678
}
2672
2679
2673
- int cvRetrieveFrame_FFMPEG (CvCapture_FFMPEG* capture, cv::Mat &mat )
2680
+ int cvRetrieveFrame_FFMPEG (CvCapture_FFMPEG* capture, unsigned char ** data, int * step, int * width, int * height, int * cn )
2674
2681
{
2675
- return capture->retrieveFrame (0 , mat );
2682
+ return capture->retrieveFrame (0 , data, step, width, height, cn );
2676
2683
}
2677
2684
2678
2685
CvVideoWriter_FFMPEG* cvCreateVideoWriter_FFMPEG ( const char * filename, int fourcc, double fps,
0 commit comments