Commit a13862e9 authored by Yuhel Tanaka's avatar Yuhel Tanaka

Fix issue #6450

parent fafada28
...@@ -35,6 +35,10 @@ ...@@ -35,6 +35,10 @@
#import <AVFoundation/AVFoundation.h> #import <AVFoundation/AVFoundation.h>
#import <Foundation/NSException.h> #import <Foundation/NSException.h>
#define CV_CAP_MODE_BGR CV_FOURCC_MACRO('B','G','R','3')
#define CV_CAP_MODE_RGB CV_FOURCC_MACRO('R','G','B','3')
#define CV_CAP_MODE_GRAY CV_FOURCC_MACRO('G','R','E','Y')
#define CV_CAP_MODE_YUYV CV_FOURCC_MACRO('Y', 'U', 'Y', 'V')
/********************** Declaration of class headers ************************/ /********************** Declaration of class headers ************************/
...@@ -125,35 +129,34 @@ class CvCaptureCAM : public CvCapture { ...@@ -125,35 +129,34 @@ class CvCaptureCAM : public CvCapture {
*****************************************************************************/ *****************************************************************************/
class CvCaptureFile : public CvCapture { class CvCaptureFile : public CvCapture {
public: public:
CvCaptureFile(const char* filename) ; CvCaptureFile(const char* filename) ;
~CvCaptureFile(); ~CvCaptureFile();
virtual bool grabFrame(); virtual bool grabFrame();
virtual IplImage* retrieveFrame(int); virtual IplImage* retrieveFrame(int);
virtual IplImage* queryFrame();
virtual double getProperty(int property_id) const; virtual double getProperty(int property_id) const;
virtual bool setProperty(int property_id, double value); virtual bool setProperty(int property_id, double value);
virtual int didStart(); virtual int didStart();
private:
private: AVAsset *mAsset;
AVAssetTrack *mAssetTrack;
AVAssetReader *mMovieReader; AVAssetReader *mAssetReader;
char* imagedata; AVAssetReaderTrackOutput *mTrackOutput;
IplImage* image;
char* bgr_imagedata; CMSampleBufferRef mCurrentSampleBuffer;
IplImage* bgr_image; CVImageBufferRef mGrabbedPixels;
IplImage *mDeviceImage;
uint8_t *mOutImagedata;
IplImage *mOutImage;
size_t currSize; size_t currSize;
uint32_t mMode;
int mFormat;
bool setupReadingAt(CMTime position);
IplImage* retrieveFramePixelBuffer(); IplImage* retrieveFramePixelBuffer();
double getFPS();
int movieWidth; CMTime mFrameTimestamp;
int movieHeight; size_t mFrameNum;
double movieFPS;
double currentFPS;
double movieDuration;
int changedPos;
int started; int started;
}; };
...@@ -766,216 +769,318 @@ fromConnection:(AVCaptureConnection *)connection{ ...@@ -766,216 +769,318 @@ fromConnection:(AVCaptureConnection *)connection{
*****************************************************************************/ *****************************************************************************/
CvCaptureFile::CvCaptureFile(const char* filename) { CvCaptureFile::CvCaptureFile(const char* filename) {
NSAutoreleasePool *localpool = [[NSAutoreleasePool alloc] init];
NSAutoreleasePool* localpool = [[NSAutoreleasePool alloc] init];
mAsset = nil;
mMovieReader = nil; mAssetTrack = nil;
image = NULL; mAssetReader = nil;
bgr_image = NULL; mTrackOutput = nil;
imagedata = NULL; mDeviceImage = NULL;
bgr_imagedata = NULL; mOutImage = NULL;
mOutImagedata = NULL;
currSize = 0; currSize = 0;
mMode = CV_CAP_MODE_BGR;
movieWidth = 0; mFormat = CV_8UC3;
movieHeight = 0; mCurrentSampleBuffer = NULL;
movieFPS = 0; mGrabbedPixels = NULL;
currentFPS = 0; mFrameTimestamp = kCMTimeZero;
movieDuration = 0; mFrameNum = 0;
changedPos = 0;
started = 0; started = 0;
AVURLAsset *asset = [AVURLAsset URLAssetWithURL: mAsset = [[AVAsset assetWithURL:[NSURL fileURLWithPath: @(filename)]] retain];
[NSURL fileURLWithPath: [NSString stringWithUTF8String:filename]]
options:nil];
AVAssetTrack* videoTrack = nil;
NSArray* tracks = [asset tracksWithMediaType:AVMediaTypeVideo];
if ([tracks count] == 1)
{
videoTrack = [tracks objectAtIndex:0];
movieWidth = videoTrack.naturalSize.width; if ( mAsset == nil ) {
movieHeight = videoTrack.naturalSize.height; fprintf(stderr, "OpenCV: Couldn't read movie file \"%s\"\n", filename);
movieFPS = videoTrack.nominalFrameRate; [localpool drain];
started = 0;
return;
}
currentFPS = movieFPS; //Debugging !! should be getFPS(); NSArray *tracks = [mAsset tracksWithMediaType:AVMediaTypeVideo];
//Debugging. need to be checked if ([tracks count] == 0) {
fprintf(stderr, "OpenCV: Couldn't read video stream from file \"%s\"\n", filename);
[localpool drain];
started = 0;
return;
}
// In ms mAssetTrack = [tracks[0] retain];
movieDuration = videoTrack.timeRange.duration.value/videoTrack.timeRange.duration.timescale * 1000;
started = 1; if ( ! setupReadingAt(kCMTimeZero) ) {
NSError* error = nil; fprintf(stderr, "OpenCV: Couldn't read movie file \"%s\"\n", filename);
mMovieReader = [[AVAssetReader alloc] initWithAsset:asset error:&error]; [localpool drain];
if (error) started = 0;
NSLog(@"%@", [error localizedDescription]); return;
NSDictionary* videoSettings =
[NSDictionary dictionaryWithObject:[NSNumber numberWithUnsignedInt:kCVPixelFormatType_32BGRA]
forKey:(NSString*)kCVPixelBufferPixelFormatTypeKey];
[mMovieReader addOutput:[AVAssetReaderTrackOutput
assetReaderTrackOutputWithTrack:videoTrack
outputSettings:videoSettings]];
[mMovieReader startReading];
} }
/*
// Asynchronously open the video in another thread. Always fail.
[asset loadValuesAsynchronouslyForKeys:[NSArray arrayWithObject:@"tracks"] completionHandler:
^{
// The completion block goes here.
dispatch_async(dispatch_get_main_queue(),
^{
AVAssetTrack* ::videoTrack = nil;
NSArray* ::tracks = [asset tracksWithMediaType:AVMediaTypeVideo];
if ([tracks count] == 1)
{
videoTrack = [tracks objectAtIndex:0];
movieWidth = videoTrack.naturalSize.width;
movieHeight = videoTrack.naturalSize.height;
movieFPS = videoTrack.nominalFrameRate;
currentFPS = movieFPS; //Debugging !! should be getFPS();
//Debugging. need to be checked
movieDuration = videoTrack.timeRange.duration.value/videoTrack.timeRange.duration.timescale * 1000;
started = 1; started = 1;
[localpool drain];
NSError* ::error = nil;
// mMovieReader is a member variable
mMovieReader = [[AVAssetReader alloc] initWithAsset:asset error:&error];
if (error)
NSLog(@"%@", [error localizedDescription]);
NSDictionary* ::videoSettings =
[NSDictionary dictionaryWithObject:[NSNumber numberWithUnsignedInt:kCVPixelFormatType_32BGRA]
forKey:(NSString*)kCVPixelBufferPixelFormatTypeKey];
[mMovieReader addOutput:[AVAssetReaderTrackOutput
assetReaderTrackOutputWithTrack:videoTrack
outputSettings:videoSettings]];
[mMovieReader startReading];
}
});
}];
*/
[localpool drain];
} }
CvCaptureFile::~CvCaptureFile() { CvCaptureFile::~CvCaptureFile() {
NSAutoreleasePool *localpool = [[NSAutoreleasePool alloc] init];
free(mOutImagedata);
cvReleaseImage(&mOutImage);
cvReleaseImage(&mDeviceImage);
[mAssetReader release];
[mTrackOutput release];
[mAssetTrack release];
[mAsset release];
CVBufferRelease(mGrabbedPixels);
if ( mCurrentSampleBuffer ) {
CFRelease(mCurrentSampleBuffer);
}
NSAutoreleasePool* localpool = [[NSAutoreleasePool alloc] init];
if (imagedata != NULL) free(imagedata);
if (bgr_imagedata != NULL) free(bgr_imagedata);
cvReleaseImage(&image);
cvReleaseImage(&bgr_image);
[mMovieReader release];
[localpool drain]; [localpool drain];
} }
int CvCaptureFile::didStart() { bool CvCaptureFile::setupReadingAt(CMTime position) {
return started; if (mAssetReader) {
} if (mAssetReader.status == AVAssetReaderStatusReading) {
[mAssetReader cancelReading];
bool CvCaptureFile::grabFrame() { }
[mAssetReader release];
mAssetReader = nil;
}
if (mTrackOutput) {
[mTrackOutput release];
mTrackOutput = nil;
}
//everything is done in queryFrame; // Capture in a pixel format that can be converted efficiently to the output mode.
currentFPS = movieFPS; OSType pixelFormat;
return 1; if (mMode == CV_CAP_MODE_BGR || mMode == CV_CAP_MODE_RGB) {
pixelFormat = kCVPixelFormatType_32BGRA;
mFormat = CV_8UC3;
} else if (mMode == CV_CAP_MODE_GRAY) {
pixelFormat = kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange;
mFormat = CV_8UC1;
} else if (mMode == CV_CAP_MODE_YUYV) {
pixelFormat = kCVPixelFormatType_422YpCbCr8;
mFormat = CV_8UC2;
} else {
fprintf(stderr, "VIDEOIO ERROR: AVF Mac: Unsupported mode: %d\n", mMode);
return false;
}
NSDictionary *settings =
@{
(id)kCVPixelBufferPixelFormatTypeKey: @(pixelFormat)
};
mTrackOutput = [[AVAssetReaderTrackOutput assetReaderTrackOutputWithTrack: mAssetTrack
outputSettings: settings] retain];
/* if ( !mTrackOutput ) {
double t1 = getProperty(CV_CAP_PROP_POS_MSEC); fprintf(stderr, "OpenCV: error in [AVAssetReaderTrackOutput assetReaderTrackOutputWithTrack:outputSettings:]\n");
[mCaptureSession stepForward]; return false;
double t2 = getProperty(CV_CAP_PROP_POS_MSEC);
if (t2>t1 && !changedPos) {
currentFPS = 1000.0/(t2-t1);
} else {
currentFPS = movieFPS;
} }
changedPos = 0;
*/ NSError *error = nil;
mAssetReader = [[AVAssetReader assetReaderWithAsset: mAsset
error: &error] retain];
if ( error ) {
fprintf(stderr, "OpenCV: error in [AVAssetReader assetReaderWithAsset:error:]\n");
NSLog(@"OpenCV: %@", error.localizedDescription);
return false;
}
mAssetReader.timeRange = CMTimeRangeMake(position, kCMTimePositiveInfinity);
mFrameTimestamp = position;
mFrameNum = round((mFrameTimestamp.value * mAssetTrack.nominalFrameRate) / double(mFrameTimestamp.timescale));
[mAssetReader addOutput: mTrackOutput];
return [mAssetReader startReading];
} }
int CvCaptureFile::didStart() {
return started;
}
IplImage* CvCaptureFile::retrieveFramePixelBuffer() { bool CvCaptureFile::grabFrame() {
NSAutoreleasePool* localpool = [[NSAutoreleasePool alloc] init]; NSAutoreleasePool *localpool = [[NSAutoreleasePool alloc] init];
if (mMovieReader.status != AVAssetReaderStatusReading){
return NULL; CVBufferRelease(mGrabbedPixels);
if ( mCurrentSampleBuffer ) {
CFRelease(mCurrentSampleBuffer);
} }
mCurrentSampleBuffer = [mTrackOutput copyNextSampleBuffer];
mGrabbedPixels = CMSampleBufferGetImageBuffer(mCurrentSampleBuffer);
CVBufferRetain(mGrabbedPixels);
mFrameTimestamp = CMSampleBufferGetOutputPresentationTimeStamp(mCurrentSampleBuffer);
mFrameNum++;
bool isReading = (mAssetReader.status == AVAssetReaderStatusReading);
AVAssetReaderOutput * output = [mMovieReader.outputs objectAtIndex:0];
CMSampleBufferRef sampleBuffer = [output copyNextSampleBuffer];
if (!sampleBuffer) {
[localpool drain]; [localpool drain];
return NULL; return isReading;
}
IplImage* CvCaptureFile::retrieveFramePixelBuffer() {
if ( ! mGrabbedPixels ) {
return 0;
} }
CVPixelBufferRef frame = CMSampleBufferGetImageBuffer(sampleBuffer);
CVPixelBufferRef pixels = CVBufferRetain(frame);
CVPixelBufferLockBaseAddress(pixels, 0); NSAutoreleasePool *localpool = [[NSAutoreleasePool alloc] init];
uint32_t* baseaddress = (uint32_t*)CVPixelBufferGetBaseAddress(pixels); CVPixelBufferLockBaseAddress(mGrabbedPixels, 0);
size_t width = CVPixelBufferGetWidth(pixels); void *baseaddress;
size_t height = CVPixelBufferGetHeight(pixels); size_t width, height, rowBytes;
size_t rowBytes = CVPixelBufferGetBytesPerRow(pixels);
if (rowBytes != 0) { OSType pixelFormat = CVPixelBufferGetPixelFormatType(mGrabbedPixels);
if (currSize != rowBytes*height*sizeof(char)) { if (CVPixelBufferIsPlanar(mGrabbedPixels)) {
currSize = rowBytes*height*sizeof(char); baseaddress = CVPixelBufferGetBaseAddressOfPlane(mGrabbedPixels, 0);
if (imagedata != NULL) free(imagedata); width = CVPixelBufferGetWidthOfPlane(mGrabbedPixels, 0);
if (bgr_imagedata != NULL) free(bgr_imagedata); height = CVPixelBufferGetHeightOfPlane(mGrabbedPixels, 0);
imagedata = (char*)malloc(currSize); rowBytes = CVPixelBufferGetBytesPerRowOfPlane(mGrabbedPixels, 0);
bgr_imagedata = (char*)malloc(currSize); } else {
baseaddress = CVPixelBufferGetBaseAddress(mGrabbedPixels);
width = CVPixelBufferGetWidth(mGrabbedPixels);
height = CVPixelBufferGetHeight(mGrabbedPixels);
rowBytes = CVPixelBufferGetBytesPerRow(mGrabbedPixels);
} }
memcpy(imagedata, baseaddress, currSize); if ( rowBytes == 0 ) {
fprintf(stderr, "OpenCV: error: rowBytes == 0\n");
if (image == NULL) { CVPixelBufferUnlockBaseAddress(mGrabbedPixels, 0);
image = cvCreateImageHeader(cvSize((int)width,(int)height), IPL_DEPTH_8U, 4); CVBufferRelease(mGrabbedPixels);
mGrabbedPixels = NULL;
return 0;
} }
image->width = (int)width; int outChannels;
image->height = (int)height; if (mMode == CV_CAP_MODE_BGR || mMode == CV_CAP_MODE_RGB) {
image->nChannels = 4; outChannels = 3;
image->depth = IPL_DEPTH_8U; } else if (mMode == CV_CAP_MODE_GRAY) {
image->widthStep = (int)rowBytes; outChannels = 1;
image->imageData = imagedata; } else if (mMode == CV_CAP_MODE_YUYV) {
image->imageSize = (int)currSize; outChannels = 2;
} else {
fprintf(stderr, "VIDEOIO ERROR: AVF Mac: Unsupported mode: %d\n", mMode);
if (bgr_image == NULL) { CVPixelBufferUnlockBaseAddress(mGrabbedPixels, 0);
bgr_image = cvCreateImageHeader(cvSize((int)width,(int)height), IPL_DEPTH_8U, 3); CVBufferRelease(mGrabbedPixels);
mGrabbedPixels = NULL;
return 0;
} }
bgr_image->width = (int)width; if ( currSize != width*outChannels*height ) {
bgr_image->height = (int)height; currSize = width*outChannels*height;
bgr_image->nChannels = 3; free(mOutImagedata);
bgr_image->depth = IPL_DEPTH_8U; mOutImagedata = reinterpret_cast<uint8_t*>(malloc(currSize));
bgr_image->widthStep = (int)rowBytes; }
bgr_image->imageData = bgr_imagedata;
bgr_image->imageSize = (int)currSize;
cvCvtColor(image, bgr_image,CV_BGRA2BGR); if (mOutImage == NULL) {
mOutImage = cvCreateImageHeader(cvSize((int)width,(int)height), IPL_DEPTH_8U, outChannels);
}
mOutImage->width = int(width);
mOutImage->height = int(height);
mOutImage->nChannels = outChannels;
mOutImage->depth = IPL_DEPTH_8U;
mOutImage->widthStep = int(width*outChannels);
mOutImage->imageData = reinterpret_cast<char *>(mOutImagedata);
mOutImage->imageSize = int(currSize);
int deviceChannels;
int cvtCode;
if ( pixelFormat == kCVPixelFormatType_32BGRA ) {
deviceChannels = 4;
if (mMode == CV_CAP_MODE_BGR) {
cvtCode = CV_BGRA2BGR;
} else if (mMode == CV_CAP_MODE_RGB) {
cvtCode = CV_BGRA2RGB;
} else if (mMode == CV_CAP_MODE_GRAY) {
cvtCode = CV_BGRA2GRAY;
} else {
CVPixelBufferUnlockBaseAddress(mGrabbedPixels, 0);
CVBufferRelease(mGrabbedPixels);
mGrabbedPixels = NULL;
fprintf(stderr, "OpenCV: unsupported pixel conversion mode\n");
return 0;
}
} else if ( pixelFormat == kCVPixelFormatType_24RGB ) {
deviceChannels = 3;
if (mMode == CV_CAP_MODE_BGR) {
cvtCode = CV_RGB2BGR;
} else if (mMode == CV_CAP_MODE_RGB) {
cvtCode = 0;
} else if (mMode == CV_CAP_MODE_GRAY) {
cvtCode = CV_RGB2GRAY;
} else {
CVPixelBufferUnlockBaseAddress(mGrabbedPixels, 0);
CVBufferRelease(mGrabbedPixels);
mGrabbedPixels = NULL;
fprintf(stderr, "OpenCV: unsupported pixel conversion mode\n");
return 0;
}
} else if ( pixelFormat == kCVPixelFormatType_422YpCbCr8 ) { // 422 (2vuy, UYVY)
deviceChannels = 2;
if (mMode == CV_CAP_MODE_BGR) {
cvtCode = CV_YUV2BGR_UYVY;
} else if (mMode == CV_CAP_MODE_RGB) {
cvtCode = CV_YUV2RGB_UYVY;
} else if (mMode == CV_CAP_MODE_GRAY) {
cvtCode = CV_YUV2GRAY_UYVY;
} else if (mMode == CV_CAP_MODE_YUYV) {
cvtCode = -1; // Copy
} else {
CVPixelBufferUnlockBaseAddress(mGrabbedPixels, 0);
CVBufferRelease(mGrabbedPixels);
mGrabbedPixels = NULL;
fprintf(stderr, "OpenCV: unsupported pixel conversion mode\n");
return 0;
}
} else if ( pixelFormat == kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange || // 420v
pixelFormat == kCVPixelFormatType_420YpCbCr8BiPlanarFullRange ) { // 420f
height = height * 3 / 2;
deviceChannels = 1;
if (mMode == CV_CAP_MODE_BGR) {
cvtCode = CV_YUV2BGR_YV12;
} else if (mMode == CV_CAP_MODE_RGB) {
cvtCode = CV_YUV2RGB_YV12;
} else if (mMode == CV_CAP_MODE_GRAY) {
cvtCode = CV_YUV2GRAY_420;
} else {
CVPixelBufferUnlockBaseAddress(mGrabbedPixels, 0);
CVBufferRelease(mGrabbedPixels);
mGrabbedPixels = NULL;
fprintf(stderr, "OpenCV: unsupported pixel conversion mode\n");
return 0;
}
} else {
fprintf(stderr, "OpenCV: unsupported pixel format '%s'\n", pixelFormat);
CVPixelBufferUnlockBaseAddress(mGrabbedPixels, 0);
CVBufferRelease(mGrabbedPixels);
mGrabbedPixels = NULL;
return 0;
}
if (mDeviceImage == NULL) {
mDeviceImage = cvCreateImageHeader(cvSize(int(width),int(height)), IPL_DEPTH_8U, deviceChannels);
}
mDeviceImage->width = int(width);
mDeviceImage->height = int(height);
mDeviceImage->nChannels = deviceChannels;
mDeviceImage->depth = IPL_DEPTH_8U;
mDeviceImage->widthStep = int(rowBytes);
mDeviceImage->imageData = reinterpret_cast<char *>(baseaddress);
mDeviceImage->imageSize = int(rowBytes*height);
if (cvtCode == -1) {
cv::cvarrToMat(mDeviceImage).copyTo(cv::cvarrToMat(mOutImage));
} else {
cvCvtColor(mDeviceImage, mOutImage, cvtCode);
} }
CVPixelBufferUnlockBaseAddress(pixels, 0); CVPixelBufferUnlockBaseAddress(mGrabbedPixels, 0);
CVBufferRelease(pixels);
CMSampleBufferInvalidate(sampleBuffer);
CFRelease(sampleBuffer);
[localpool drain]; [localpool drain];
return bgr_image;
return mOutImage;
} }
...@@ -983,123 +1088,88 @@ IplImage* CvCaptureFile::retrieveFrame(int) { ...@@ -983,123 +1088,88 @@ IplImage* CvCaptureFile::retrieveFrame(int) {
return retrieveFramePixelBuffer(); return retrieveFramePixelBuffer();
} }
IplImage* CvCaptureFile::queryFrame() { double CvCaptureFile::getProperty(int property_id) const{
grabFrame(); if (mAsset == nil) return 0;
return retrieveFrame(0);
}
double CvCaptureFile::getFPS() {
/*
if (mCaptureSession == nil) return 0;
NSAutoreleasePool* localpool = [[NSAutoreleasePool alloc] init];
double now = getProperty(CV_CAP_PROP_POS_MSEC);
double retval = 0;
if (now == 0) {
[mCaptureSession stepForward];
double t2 = getProperty(CV_CAP_PROP_POS_MSEC);
[mCaptureSession stepBackward];
retval = 1000.0 / (t2-now);
} else {
[mCaptureSession stepBackward];
double t2 = getProperty(CV_CAP_PROP_POS_MSEC);
[mCaptureSession stepForward];
retval = 1000.0 / (now-t2);
}
[localpool drain];
return retval;
*/
return 30.0; //TODO: Debugging
}
double CvCaptureFile::getProperty(int /*property_id*/) const{ CMTime t;
/*
if (mCaptureSession == nil) return 0;
NSAutoreleasePool* localpool = [[NSAutoreleasePool alloc] init];
double retval;
QTTime t;
switch (property_id) { switch (property_id) {
case CV_CAP_PROP_POS_MSEC: case CV_CAP_PROP_POS_MSEC:
[[mCaptureSession attributeForKey:QTMovieCurrentTimeAttribute] getValue:&t]; return mFrameTimestamp.value * 1000.0 / mFrameTimestamp.timescale;
retval = t.timeValue * 1000.0 / t.timeScale;
break;
case CV_CAP_PROP_POS_FRAMES: case CV_CAP_PROP_POS_FRAMES:
retval = movieFPS * getProperty(CV_CAP_PROP_POS_MSEC) / 1000; return mAssetTrack.nominalFrameRate > 0 ? mFrameNum : 0;
break;
case CV_CAP_PROP_POS_AVI_RATIO: case CV_CAP_PROP_POS_AVI_RATIO:
retval = (getProperty(CV_CAP_PROP_POS_MSEC)) / (movieDuration ); t = [mAsset duration];
break; return (mFrameTimestamp.value * t.timescale) / double(mFrameTimestamp.timescale * t.value);
case CV_CAP_PROP_FRAME_WIDTH: case CV_CAP_PROP_FRAME_WIDTH:
retval = movieWidth; return mAssetTrack.naturalSize.width;
break;
case CV_CAP_PROP_FRAME_HEIGHT: case CV_CAP_PROP_FRAME_HEIGHT:
retval = movieHeight; return mAssetTrack.naturalSize.height;
break;
case CV_CAP_PROP_FPS: case CV_CAP_PROP_FPS:
retval = currentFPS; return mAssetTrack.nominalFrameRate;
break; case CV_CAP_PROP_FRAME_COUNT:
t = [mAsset duration];
return round((t.value * mAssetTrack.nominalFrameRate) / double(t.timescale));
case CV_CAP_PROP_FORMAT:
return mFormat;
case CV_CAP_PROP_FOURCC: case CV_CAP_PROP_FOURCC:
return mMode;
default: default:
retval = 0; break;
} }
[localpool drain]; return 0;
return retval;
*/
return 1.0; //Debugging
} }
bool CvCaptureFile::setProperty(int /*property_id*/, double /*value*/) { bool CvCaptureFile::setProperty(int property_id, double value) {
if (mAsset == nil) return false;
/*
if (mCaptureSession == nil) return false;
NSAutoreleasePool* localpool = [[NSAutoreleasePool alloc] init]; NSAutoreleasePool* localpool = [[NSAutoreleasePool alloc] init];
bool retval = false; bool retval = false;
QTTime t; CMTime t;
double ms;
switch (property_id) { switch (property_id) {
case CV_CAP_PROP_POS_MSEC: case CV_CAP_PROP_POS_MSEC:
[[mCaptureSession attributeForKey:QTMovieCurrentTimeAttribute] getValue:&t]; t = mAsset.duration;
t.timeValue = value * t.timeScale / 1000; t.value = value * t.timescale / 1000;
[mCaptureSession setCurrentTime:t]; retval = setupReadingAt(t);
changedPos = 1;
retval = true;
break; break;
case CV_CAP_PROP_POS_FRAMES: case CV_CAP_PROP_POS_FRAMES:
ms = (value*1000.0 -5)/ currentFPS; retval = mAssetTrack.nominalFrameRate > 0 ? setupReadingAt(CMTimeMake(value, mAssetTrack.nominalFrameRate)) : false;
retval = setProperty(CV_CAP_PROP_POS_MSEC, ms);
break; break;
case CV_CAP_PROP_POS_AVI_RATIO: case CV_CAP_PROP_POS_AVI_RATIO:
ms = value * movieDuration; t = mAsset.duration;
retval = setProperty(CV_CAP_PROP_POS_MSEC, ms); t.value = round(t.value * value);
retval = setupReadingAt(t);
break; break;
case CV_CAP_PROP_FRAME_WIDTH: case CV_CAP_PROP_FOURCC:
//retval = movieWidth; uint32_t mode;
mode = cvRound(value);
if (mMode == mode) {
retval = true;
} else {
switch (mode) {
case CV_CAP_MODE_BGR:
case CV_CAP_MODE_RGB:
case CV_CAP_MODE_GRAY:
case CV_CAP_MODE_YUYV:
mMode = mode;
retval = setupReadingAt(mFrameTimestamp);
break; break;
case CV_CAP_PROP_FRAME_HEIGHT: default:
//retval = movieHeight; fprintf(stderr, "VIDEOIO ERROR: AVF iOS: Unsupported mode: %d\n", mode);
retval=false;
break; break;
case CV_CAP_PROP_FPS: }
//etval = currentFPS; }
break; break;
case CV_CAP_PROP_FOURCC:
default: default:
retval = false; break;
} }
[localpool drain]; [localpool drain];
return retval; return retval;
*/
return true;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment