Commit a69c70e1 authored by Thilo Borgmann's avatar Thilo Borgmann Committed by Michael Niedermayer

lavd/avfoundation: Split adding a device and getting the device configuration...

lavd/avfoundation: Split adding a device and getting the device configuration into separate functions.
Signed-off-by: 's avatarMichael Niedermayer <michaelni@gmx.at>
parent 88c937fd
...@@ -172,99 +172,23 @@ static void destroy_context(AVFContext* ctx) ...@@ -172,99 +172,23 @@ static void destroy_context(AVFContext* ctx)
} }
} }
static int avf_read_header(AVFormatContext *s) static int add_video_device(AVFormatContext *s, AVCaptureDevice *video_device)
{ {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; AVFContext *ctx = (AVFContext*)s->priv_data;
AVFContext *ctx = (AVFContext*)s->priv_data; NSError *error = nil;
ctx->first_pts = av_gettime();
pthread_mutex_init(&ctx->frame_lock, NULL);
pthread_cond_init(&ctx->frame_wait_cond, NULL);
// List devices if requested
if (ctx->list_devices) {
av_log(ctx, AV_LOG_INFO, "AVFoundation video devices:\n");
NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];
for (AVCaptureDevice *device in devices) {
const char *name = [[device localizedName] UTF8String];
int index = [devices indexOfObject:device];
av_log(ctx, AV_LOG_INFO, "[%d] %s\n", index, name);
}
goto fail;
}
// Find capture device
AVCaptureDevice *video_device = nil;
// check for device index given in filename
if (ctx->video_device_index == -1) {
sscanf(s->filename, "%d", &ctx->video_device_index);
}
if (ctx->video_device_index >= 0) {
NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];
if (ctx->video_device_index >= [devices count]) {
av_log(ctx, AV_LOG_ERROR, "Invalid device index\n");
goto fail;
}
video_device = [devices objectAtIndex:ctx->video_device_index];
} else if (strncmp(s->filename, "", 1) &&
strncmp(s->filename, "default", 7)) {
NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];
for (AVCaptureDevice *device in devices) {
if (!strncmp(s->filename, [[device localizedName] UTF8String], strlen(s->filename))) {
video_device = device;
break;
}
}
if (!video_device) {
av_log(ctx, AV_LOG_ERROR, "Video device not found\n");
goto fail;
}
} else {
video_device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeMuxed];
}
// Video capture device not found, looking for AVMediaTypeVideo
if (!video_device) {
video_device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
if (!video_device) {
av_log(s, AV_LOG_ERROR, "No AV capture device found\n");
goto fail;
}
}
NSString* dev_display_name = [video_device localizedName];
av_log(s, AV_LOG_DEBUG, "'%s' opened\n", [dev_display_name UTF8String]);
// Initialize capture session
ctx->capture_session = [[AVCaptureSession alloc] init];
NSError *error = nil;
AVCaptureDeviceInput* capture_dev_input = [[[AVCaptureDeviceInput alloc] initWithDevice:video_device error:&error] autorelease]; AVCaptureDeviceInput* capture_dev_input = [[[AVCaptureDeviceInput alloc] initWithDevice:video_device error:&error] autorelease];
if (!capture_dev_input) { if (!capture_dev_input) {
av_log(s, AV_LOG_ERROR, "Failed to create AV capture input device: %s\n", av_log(s, AV_LOG_ERROR, "Failed to create AV capture input device: %s\n",
[[error localizedDescription] UTF8String]); [[error localizedDescription] UTF8String]);
goto fail; return 1;
}
if (!capture_dev_input) {
av_log(s, AV_LOG_ERROR, "Failed to add AV capture input device to session: %s\n",
[[error localizedDescription] UTF8String]);
goto fail;
} }
if ([ctx->capture_session canAddInput:capture_dev_input]) { if ([ctx->capture_session canAddInput:capture_dev_input]) {
[ctx->capture_session addInput:capture_dev_input]; [ctx->capture_session addInput:capture_dev_input];
} else { } else {
av_log(s, AV_LOG_ERROR, "can't add video input to capture session\n"); av_log(s, AV_LOG_ERROR, "can't add video input to capture session\n");
goto fail; return 1;
} }
// Attaching output // Attaching output
...@@ -272,7 +196,7 @@ static int avf_read_header(AVFormatContext *s) ...@@ -272,7 +196,7 @@ static int avf_read_header(AVFormatContext *s)
if (!ctx->video_output) { if (!ctx->video_output) {
av_log(s, AV_LOG_ERROR, "Failed to init AV video output\n"); av_log(s, AV_LOG_ERROR, "Failed to init AV video output\n");
goto fail; return 1;
} }
// select pixel format // select pixel format
...@@ -290,7 +214,7 @@ static int avf_read_header(AVFormatContext *s) ...@@ -290,7 +214,7 @@ static int avf_read_header(AVFormatContext *s)
if (pxl_fmt_spec.ff_id == AV_PIX_FMT_NONE) { if (pxl_fmt_spec.ff_id == AV_PIX_FMT_NONE) {
av_log(s, AV_LOG_ERROR, "Selected pixel format (%s) is not supported by AVFoundation.\n", av_log(s, AV_LOG_ERROR, "Selected pixel format (%s) is not supported by AVFoundation.\n",
av_get_pix_fmt_name(pxl_fmt_spec.ff_id)); av_get_pix_fmt_name(pxl_fmt_spec.ff_id));
goto fail; return 1;
} }
// check if the pixel format is available for this device // check if the pixel format is available for this device
...@@ -323,14 +247,14 @@ static int avf_read_header(AVFormatContext *s) ...@@ -323,14 +247,14 @@ static int avf_read_header(AVFormatContext *s)
// fail if there is no appropriate pixel format or print a warning about overriding the pixel format // fail if there is no appropriate pixel format or print a warning about overriding the pixel format
if (pxl_fmt_spec.ff_id == AV_PIX_FMT_NONE) { if (pxl_fmt_spec.ff_id == AV_PIX_FMT_NONE) {
goto fail; return 1;
} else { } else {
av_log(s, AV_LOG_WARNING, "Overriding selected pixel format to use %s instead.\n", av_log(s, AV_LOG_WARNING, "Overriding selected pixel format to use %s instead.\n",
av_get_pix_fmt_name(pxl_fmt_spec.ff_id)); av_get_pix_fmt_name(pxl_fmt_spec.ff_id));
} }
} }
ctx->pixel_format = pxl_fmt_spec.ff_id;
NSNumber *pixel_format = [NSNumber numberWithUnsignedInt:pxl_fmt_spec.avf_id]; NSNumber *pixel_format = [NSNumber numberWithUnsignedInt:pxl_fmt_spec.avf_id];
NSDictionary *capture_dict = [NSDictionary dictionaryWithObject:pixel_format NSDictionary *capture_dict = [NSDictionary dictionaryWithObject:pixel_format
forKey:(id)kCVPixelBufferPixelFormatTypeKey]; forKey:(id)kCVPixelBufferPixelFormatTypeKey];
...@@ -348,10 +272,15 @@ static int avf_read_header(AVFormatContext *s) ...@@ -348,10 +272,15 @@ static int avf_read_header(AVFormatContext *s)
[ctx->capture_session addOutput:ctx->video_output]; [ctx->capture_session addOutput:ctx->video_output];
} else { } else {
av_log(s, AV_LOG_ERROR, "can't add video output to capture session\n"); av_log(s, AV_LOG_ERROR, "can't add video output to capture session\n");
goto fail; return 1;
} }
[ctx->capture_session startRunning]; return 0;
}
static int get_video_config(AVFormatContext *s)
{
AVFContext *ctx = (AVFContext*)s->priv_data;
// Take stream info from the first frame. // Take stream info from the first frame.
while (ctx->frames_captured < 1) { while (ctx->frames_captured < 1) {
...@@ -363,7 +292,7 @@ static int avf_read_header(AVFormatContext *s) ...@@ -363,7 +292,7 @@ static int avf_read_header(AVFormatContext *s)
AVStream* stream = avformat_new_stream(s, NULL); AVStream* stream = avformat_new_stream(s, NULL);
if (!stream) { if (!stream) {
goto fail; return 1;
} }
avpriv_set_pts_info(stream, 64, 1, avf_time_base); avpriv_set_pts_info(stream, 64, 1, avf_time_base);
...@@ -375,12 +304,99 @@ static int avf_read_header(AVFormatContext *s) ...@@ -375,12 +304,99 @@ static int avf_read_header(AVFormatContext *s)
stream->codec->codec_type = AVMEDIA_TYPE_VIDEO; stream->codec->codec_type = AVMEDIA_TYPE_VIDEO;
stream->codec->width = (int)image_buffer_size.width; stream->codec->width = (int)image_buffer_size.width;
stream->codec->height = (int)image_buffer_size.height; stream->codec->height = (int)image_buffer_size.height;
stream->codec->pix_fmt = pxl_fmt_spec.ff_id; stream->codec->pix_fmt = ctx->pixel_format;
CFRelease(ctx->current_frame); CFRelease(ctx->current_frame);
ctx->current_frame = nil; ctx->current_frame = nil;
unlock_frames(ctx); unlock_frames(ctx);
return 0;
}
static int avf_read_header(AVFormatContext *s)
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
AVFContext *ctx = (AVFContext*)s->priv_data;
ctx->first_pts = av_gettime();
pthread_mutex_init(&ctx->frame_lock, NULL);
pthread_cond_init(&ctx->frame_wait_cond, NULL);
// List devices if requested
if (ctx->list_devices) {
av_log(ctx, AV_LOG_INFO, "AVFoundation video devices:\n");
NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];
for (AVCaptureDevice *device in devices) {
const char *name = [[device localizedName] UTF8String];
int index = [devices indexOfObject:device];
av_log(ctx, AV_LOG_INFO, "[%d] %s\n", index, name);
}
goto fail;
}
// Find capture device
AVCaptureDevice *video_device = nil;
// check for device index given in filename
if (ctx->video_device_index == -1) {
sscanf(s->filename, "%d", &ctx->video_device_index);
}
if (ctx->video_device_index >= 0) {
NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];
if (ctx->video_device_index >= [devices count]) {
av_log(ctx, AV_LOG_ERROR, "Invalid device index\n");
goto fail;
}
video_device = [devices objectAtIndex:ctx->video_device_index];
} else if (strncmp(s->filename, "", 1) &&
strncmp(s->filename, "default", 7)) {
NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];
for (AVCaptureDevice *device in devices) {
if (!strncmp(s->filename, [[device localizedName] UTF8String], strlen(s->filename))) {
video_device = device;
break;
}
}
if (!video_device) {
av_log(ctx, AV_LOG_ERROR, "Video device not found\n");
goto fail;
}
} else {
video_device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
}
// Video capture device not found, looking for AVMediaTypeVideo
if (!video_device) {
video_device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
if (!video_device) {
av_log(s, AV_LOG_ERROR, "No AV capture device found\n");
goto fail;
}
}
NSString* dev_display_name = [video_device localizedName];
av_log(s, AV_LOG_DEBUG, "'%s' opened\n", [dev_display_name UTF8String]);
// Initialize capture session
ctx->capture_session = [[AVCaptureSession alloc] init];
if (add_video_device(s, video_device)) {
goto fail;
}
[ctx->capture_session startRunning];
if (get_video_config(s)) {
goto fail;
}
[pool release]; [pool release];
return 0; return 0;
......
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