[FFmpeg-devel] [PATCH 2/3] lavd/avfoundation: Allow selection of audio format and list audio formats for specific devices.
Michael Niedermayer
michael at niedermayer.cc
Wed Dec 30 19:24:13 CET 2015
On Tue, Nov 24, 2015 at 07:31:55PM +0100, Thilo Borgmann wrote:
>
> avfoundation.m | 150 +++++++++++++++++++++++++++++++++++++++++++--------------
> 1 file changed, 115 insertions(+), 35 deletions(-)
> 183c79226fa60ce275f0be667c8bddec1115a554 0002-lavd-avfoundation-Allow-selection-of-audio-format-an.patch
> From 735e26a0f525d94a31db56d4a25a3d15d021cca6 Mon Sep 17 00:00:00 2001
> From: Thilo Borgmann <thilo.borgmann at mail.de>
> Date: Tue, 24 Nov 2015 19:01:55 +0100
> Subject: [PATCH 2/3] lavd/avfoundation: Allow selection of audio format and
> list audio formats for specific devices.
>
> ---
> libavdevice/avfoundation.m | 150 ++++++++++++++++++++++++++++++++++-----------
> 1 file changed, 115 insertions(+), 35 deletions(-)
>
> diff --git a/libavdevice/avfoundation.m b/libavdevice/avfoundation.m
> index 37f6be0..20341ef 100644
> --- a/libavdevice/avfoundation.m
> +++ b/libavdevice/avfoundation.m
> @@ -95,10 +95,12 @@ typedef struct
> int capture_mouse_clicks;
>
> int list_devices;
> + int list_audio_formats;
> int video_device_index;
> int video_stream_index;
> int audio_device_index;
> int audio_stream_index;
> + int audio_format_index;
>
> char *video_filename;
> char *audio_filename;
> @@ -109,11 +111,6 @@ typedef struct
>
> int audio_channels;
> int audio_bits_per_sample;
> - int audio_float;
> - int audio_be;
> - int audio_signed_integer;
> - int audio_packed;
> - int audio_non_interleaved;
>
> int32_t *audio_buffer;
> int audio_buffer_size;
> @@ -259,7 +256,7 @@ static int configure_video_device(AVFormatContext *s, AVCaptureDevice *video_dev
> [video_device setValue:min_frame_duration forKey:@"activeVideoMinFrameDuration"];
> [video_device setValue:min_frame_duration forKey:@"activeVideoMaxFrameDuration"];
> } else {
> - av_log(s, AV_LOG_ERROR, "Could not lock device for configuration");
> + av_log(s, AV_LOG_ERROR, "Could not lock video device for configuration");
> return AVERROR(EINVAL);
> }
>
> @@ -333,8 +330,24 @@ static int add_video_device(AVFormatContext *s, AVCaptureDevice *video_device)
> }
> } @catch (NSException *exception) {
> if (![[exception name] isEqualToString:NSUndefinedKeyException]) {
> - av_log (s, AV_LOG_ERROR, "An error occurred: %s", [exception.reason UTF8String]);
> - return AVERROR_EXTERNAL;
> + av_log (s, AV_LOG_ERROR, "An error occurred: %s", [exception.reason UTF8String]);
> + return AVERROR_EXTERNAL;
maybe commit this seperatly as its cosmetic
> + } else {
> + // AVCaptureScreenInput does not contain formats property
> + // get the screen dimensions using CoreGraphics and display id
> +#if !TARGET_OS_IPHONE && __MAC_OS_X_VERSION_MIN_REQUIRED >= 1070
> + uint32_t num_screens = 0;
> + CGGetActiveDisplayList(0, NULL, &num_screens);
> + if (ctx->video_device_index < ctx->num_video_devices + num_screens) {
> + CGDirectDisplayID screens[num_screens];
> + CGGetActiveDisplayList(num_screens, screens, &num_screens);
> + int screen_idx = ctx->video_device_index - ctx->num_video_devices;
> + CGDisplayModeRef mode = CGDisplayCopyDisplayMode(screens[screen_idx]);
> + ctx->width = CGDisplayModeGetWidth(mode);
> + ctx->height = CGDisplayModeGetHeight(mode);
> + CFRelease(mode);
> + }
> +#endif
> }
> }
>
> @@ -440,6 +453,12 @@ static int add_audio_device(AVFormatContext *s, AVCaptureDevice *audio_device)
>
> [ctx->audio_output setSampleBufferDelegate:ctx->avf_delegate queue:ctx->dispatch_queue];
>
> + if ([audio_device lockForConfiguration:NULL] == YES) {
> + audio_device.activeFormat = ctx->audio_format;
> + } else {
> + av_log(s, AV_LOG_ERROR, "Could not lock audio device for configuration");
> + return AVERROR(EINVAL);
> + }
>
> if ([ctx->capture_session canAddOutput:ctx->audio_output]) {
> [ctx->capture_session addOutput:ctx->audio_output];
> @@ -570,17 +589,15 @@ static int avf_read_header(AVFormatContext *s)
> AVFContext *ctx = (AVFContext*)s->priv_data;
> AVCaptureDevice *video_device = nil;
> AVCaptureDevice *audio_device = nil;
> - // Find capture device
> - NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];
> - ctx->num_video_devices = [devices count];
>
> - ctx->first_pts = av_gettime();
> - ctx->first_audio_pts = av_gettime();
> // Create dispatch queue and set delegate
> CMBufferQueueCreate(kCFAllocatorDefault, 0, CMBufferQueueGetCallbacksForSampleBuffersSortedByOutputPTS(), &ctx->frame_buffer);
> ctx->avf_delegate = [[AVFFrameReceiver alloc] initWithContext:ctx];
> ctx->dispatch_queue = dispatch_queue_create("org.ffmpeg.dispatch_queue", NULL);
>
> + // Query video devices
> + NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];
> + ctx->num_video_devices = [devices count];
>
> #if !TARGET_OS_IPHONE && __MAC_OS_X_VERSION_MIN_REQUIRED >= 1070
> CGGetActiveDisplayList(0, NULL, &num_screens);
> @@ -661,21 +678,19 @@ static int avf_read_header(AVFormatContext *s)
> av_log(ctx, AV_LOG_ERROR, "Invalid device index\n");
> goto fail;
> }
> - } else if (ctx->video_filename &&
> - strncmp(ctx->video_filename, "none", 4)) {
> + } else if (ctx->video_filename && strncmp(ctx->video_filename, "none", 4)) { //select video device by name
> if (!strncmp(ctx->video_filename, "default", 7)) {
> - video_device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
> + video_device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; // XXX set device index
> } else {
> - // looking for video inputs
> - for (AVCaptureDevice *device in devices) {
> - if (!strncmp(ctx->video_filename, [[device localizedName] UTF8String], strlen(ctx->video_filename))) {
> - video_device = device;
> - break;
> - }
> + for (AVCaptureDevice *device in devices) {
> + if (!strncmp(ctx->video_filename, [[device localizedName] UTF8String], strlen(ctx->video_filename))) {
> + video_device = device; // XXX set device index
> + break;
> + }
this too looks cosmetic
> }
>
> #if !TARGET_OS_IPHONE && __MAC_OS_X_VERSION_MIN_REQUIRED >= 1070
> - // looking for screen inputs
> + // select video device for capture screen inputs
> if (!video_device) {
> int idx;
> if(sscanf(ctx->video_filename, "Capture screen %d", &idx) && idx < num_screens) {
> @@ -724,20 +739,20 @@ static int avf_read_header(AVFormatContext *s)
> }
>
> audio_device = [devices objectAtIndex:ctx->audio_device_index];
> - } else if (ctx->audio_filename &&
> + } else if (ctx->audio_filename && // select audio device by name
> strncmp(ctx->audio_filename, "none", 4)) {
> if (!strncmp(ctx->audio_filename, "default", 7)) {
> - audio_device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio];
> + audio_device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio]; // XXX set device index
> } else {
> - NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeAudio];
> + NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeAudio];
>
> - for (AVCaptureDevice *device in devices) {
> - if (!strncmp(ctx->audio_filename, [[device localizedName] UTF8String], strlen(ctx->audio_filename))) {
> - audio_device = device;
> - break;
> + for (AVCaptureDevice *device in devices) {
> + if (!strncmp(ctx->audio_filename, [[device localizedName] UTF8String], strlen(ctx->audio_filename))) {
> + audio_device = device; // XXX set device index
> + break;
> + }
so does this
[...]
> @@ -762,23 +832,29 @@ static int avf_read_header(AVFormatContext *s)
> av_log(s, AV_LOG_DEBUG, "audio device '%s' opened\n", [[audio_device localizedName] UTF8String]);
> }
>
> - // Initialize capture session
> + // initialize capture session
> ctx->capture_session = [[AVCaptureSession alloc] init];
[...]
> - /* Unlock device configuration only after the session is started so it
> - * does not reset the capture formats */
> + // unlock device configuration only after the session is started so it
> + // does not reset the capture formats
and this
i think the changes are ok if they are split into cosmetic and
non cosmetic
[...]
--
Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
The worst form of inequality is to try to make unequal things equal.
-- Aristotle
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 181 bytes
Desc: Digital signature
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20151230/55db3c93/attachment.sig>
More information about the ffmpeg-devel
mailing list