On Thu, Nov 30, 2017 at 10:15:48AM +0100, Felix Matouschek wrote: > Sorry, my mail client swallowed the attachment, sent it again. >
> Changelog | 1 > MAINTAINERS | 1 > configure | 6 > doc/indevs.texi | 40 ++ > libavdevice/Makefile | 1 > libavdevice/alldevices.c | 1 > libavdevice/android_camera.c | 816 > +++++++++++++++++++++++++++++++++++++++++++ > libavdevice/version.h | 2 > 8 files changed, 867 insertions(+), 1 deletion(-) > 2fea6cb3990aed83c3a3c492aa482f619a885ed7 > 0001-avdevice-add-android_camera-indev.patch > From b70da28e33e07b4565daffc94c8ffe3c8df747ff Mon Sep 17 00:00:00 2001 > From: Felix Matouschek <fe...@matouschek.org> > Date: Thu, 30 Nov 2017 10:03:54 +0100 > Subject: [PATCH] avdevice: add android_camera indev > To: ffmpeg-devel@ffmpeg.org > > This commit adds an indev for Android devices on API level 24+ which > uses the Android NDK Camera2 API to capture video from builtin cameras > > Signed-off-by: Felix Matouschek <fe...@matouschek.org> > --- > Changelog | 1 + > MAINTAINERS | 1 + > configure | 6 + > doc/indevs.texi | 40 +++ > libavdevice/Makefile | 1 + > libavdevice/alldevices.c | 1 + > libavdevice/android_camera.c | 816 > +++++++++++++++++++++++++++++++++++++++++++ > libavdevice/version.h | 2 +- > 8 files changed, 867 insertions(+), 1 deletion(-) > create mode 100644 libavdevice/android_camera.c > > diff --git a/Changelog b/Changelog > index 6592d868da..f58cd810e0 100644 > --- a/Changelog > +++ b/Changelog > @@ -6,6 +6,7 @@ version <next>: > - Dropped support for OpenJPEG versions 2.0 and below. Using OpenJPEG now > requires 2.1 (or later) and pkg-config. > - VDA dropped (use VideoToolbox instead) > +- Add android_camera indev > > > version 3.4: > diff --git a/MAINTAINERS b/MAINTAINERS > index 1d2ff78b0e..d6cb135964 100644 > --- a/MAINTAINERS > +++ b/MAINTAINERS > @@ -281,6 +281,7 @@ libavdevice > > > avfoundation.m Thilo Borgmann > + android_camera.c Felix Matouschek > decklink* Marton Balint > dshow.c Roger Pack (CC rogerdp...@gmail.com) > fbdev_enc.c Lukasz Marek > diff --git a/configure b/configure > index 7a53bc76c7..d52b18fab3 100755 > --- a/configure > +++ b/configure > @@ -3068,6 +3068,8 @@ xmv_demuxer_select="riffdec" > xwma_demuxer_select="riffdec" > > # indevs / outdevs > +android_camera_indev_deps="android camera2ndk mediandk pthreads" > +android_camera_indev_extralibs="-landroid -lcamera2ndk -lmediandk" > alsa_indev_deps="alsa" > alsa_outdev_deps="alsa" > avfoundation_indev_deps="avfoundation corevideo coremedia pthreads" > @@ -5836,6 +5838,10 @@ check_lib shell32 "windows.h shellapi.h" > CommandLineToArgvW -lshell32 > check_lib wincrypt "windows.h wincrypt.h" CryptGenRandom -ladvapi32 > check_lib psapi "windows.h psapi.h" GetProcessMemoryInfo -lpsapi > > +check_lib android android/native_window.h ANativeWindow_acquire -landroid > +check_lib mediandk "stdint.h media/NdkImage.h" AImage_delete -lmediandk > +check_lib camera2ndk "stdbool.h stdint.h camera/NdkCameraManager.h" > ACameraManager_create -lcamera2ndk > + > enabled appkit && check_apple_framework AppKit > enabled audiotoolbox && check_apple_framework AudioToolbox > enabled avfoundation && check_apple_framework AVFoundation > diff --git a/doc/indevs.texi b/doc/indevs.texi > index d308bbf7de..07056d762e 100644 > --- a/doc/indevs.texi > +++ b/doc/indevs.texi > @@ -63,6 +63,46 @@ Set the number of channels. Default is 2. > > @end table > > +@section android_camera > + > +Android camera input device. > + > +This input devices uses the Android Camera2 NDK API which is > +available on devices with API level 24+. The availability of > +android_camera is autodetected during configuration. > + > +This device allows capturing from all cameras on an Android device, > +which are integrated into the Camera2 NDK API. > + > +The available cameras are enumerated internally and can be selected > +with the @var{camera_index} parameter. The input file string is > +discarded. > + > +Generally the back facing camera has index 0 while the front facing > +camera has index 1. > + > +@subsection Options > + > +@table @option > + > +@item video_size > +Set the video size given as a string such as 640x480 or hd720. > +Falls back to the first available configuration reported by > +Android if requested video size is not available or by default. > + > +@item framerate > +Set the video framerate. > +Falls back to the first available configuration reported by > +Android if requested framerate is not available or by default (-1). > + > +@item camera_index > +Set the index of the camera to use. Default is 0. > + > +@item input_queue_size > +Set the maximum number of frames to buffer. Default is 5. > + > +@end table > + > @section avfoundation > > AVFoundation input device. > diff --git a/libavdevice/Makefile b/libavdevice/Makefile > index 8228d62147..f11a6f2a86 100644 > --- a/libavdevice/Makefile > +++ b/libavdevice/Makefile > @@ -14,6 +14,7 @@ OBJS-$(CONFIG_SHARED) += reverse.o > # input/output devices > OBJS-$(CONFIG_ALSA_INDEV) += alsa_dec.o alsa.o timefilter.o > OBJS-$(CONFIG_ALSA_OUTDEV) += alsa_enc.o alsa.o > +OBJS-$(CONFIG_ANDROID_CAMERA_INDEV) += android_camera.o > OBJS-$(CONFIG_AVFOUNDATION_INDEV) += avfoundation.o > OBJS-$(CONFIG_BKTR_INDEV) += bktr.o > OBJS-$(CONFIG_CACA_OUTDEV) += caca.o > diff --git a/libavdevice/alldevices.c b/libavdevice/alldevices.c > index b767b6a718..2c8d9035da 100644 > --- a/libavdevice/alldevices.c > +++ b/libavdevice/alldevices.c > @@ -42,6 +42,7 @@ static void register_all(void) > { > /* devices */ > REGISTER_INOUTDEV(ALSA, alsa); > + REGISTER_INDEV (ANDROID_CAMERA, android_camera); > REGISTER_INDEV (AVFOUNDATION, avfoundation); > REGISTER_INDEV (BKTR, bktr); > REGISTER_OUTDEV (CACA, caca); > diff --git a/libavdevice/android_camera.c b/libavdevice/android_camera.c > new file mode 100644 > index 0000000000..eaef032a4c > --- /dev/null > +++ b/libavdevice/android_camera.c > @@ -0,0 +1,816 @@ > +/* > + * Android camera input device > + * > + * Copyright (C) 2017 Felix Matouschek > + * > + * This file is part of FFmpeg. > + * > + * FFmpeg is free software; you can redistribute it and/or > + * modify it under the terms of the GNU Lesser General Public > + * License as published by the Free Software Foundation; either > + * version 2.1 of the License, or (at your option) any later version. > + * > + * FFmpeg is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > + * Lesser General Public License for more details. > + * > + * You should have received a copy of the GNU Lesser General Public > + * License along with FFmpeg; if not, write to the Free Software > + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 > USA > + */ > + > +#include <errno.h> > +#include <pthread.h> > +#include <stdatomic.h> > +#include <stdbool.h> > +#include <stdint.h> > + > +#include <camera/NdkCameraDevice.h> > +#include <camera/NdkCameraManager.h> > +#include <media/NdkImage.h> > +#include <media/NdkImageReader.h> > + > +#include "libavformat/avformat.h" > +#include "libavformat/internal.h" > +#include "libavutil/avstring.h" > +#include "libavutil/display.h" > +#include "libavutil/imgutils.h" > +#include "libavutil/log.h" > +#include "libavutil/opt.h" > +#include "libavutil/parseutils.h" > +#include "libavutil/threadmessage.h" > +#include "libavutil/time.h" > + > +#include "version.h" > + > +/* This image format is available on all Android devices > + * supporting the Camera2 API */ > +#define IMAGE_FORMAT_ANDROID AIMAGE_FORMAT_YUV_420_888 > +#define IMAGE_FORMAT_FFMPEG AV_PIX_FMT_YUV420P > +#define IMAGE_NUM_PLANES 3 > + > +#define MAX_BUF_COUNT 2 > +#define VIDEO_STREAM_INDEX 0 > +#define VIDEO_TIMEBASE 1000000000 > + > +typedef struct AndroidCameraCtx { > + const AVClass *class; > + > + int requested_width; > + int requested_height; > + AVRational framerate; > + int camera_index; > + int input_queue_size; > + > + uint8_t lens_facing; > + int32_t sensor_orientation; > + int width; > + int height; > + int32_t framerate_range[2]; > + > + ACameraManager *camera_mgr; > + char *camera_id; > + ACameraMetadata *camera_metadata; > + ACameraDevice *camera_dev; > + ACameraDevice_StateCallbacks camera_state_callbacks; > + AImageReader *image_reader; > + AImageReader_ImageListener image_listener; > + ANativeWindow *image_reader_window; > + ACaptureSessionOutputContainer *capture_session_output_container; > + ACaptureSessionOutput *capture_session_output; > + ACameraOutputTarget *camera_output_target; > + ACaptureRequest *capture_request; > + ACameraCaptureSession_stateCallbacks capture_session_state_callbacks; > + ACameraCaptureSession *capture_session; > + > + AVThreadMessageQueue *input_queue; > + atomic_int exit; > + int display_matrix_sent; > +} AndroidCameraCtx; > + > +static const char *camera_status_string(camera_status_t val) > +{ > + switch(val) { > + case ACAMERA_OK: > + return AV_STRINGIFY(ACAMERA_OK); > + case ACAMERA_ERROR_UNKNOWN: > + return AV_STRINGIFY(ACAMERA_ERROR_UNKNOWN); > + case ACAMERA_ERROR_INVALID_PARAMETER: > + return AV_STRINGIFY(ACAMERA_ERROR_INVALID_PARAMETER); what i meant was something like #define RETURN_CASE(x) case x: return AV_STRINGIFY(x); switch(val) { RETURN_CASE(ACAMERA_OK) RETURN_CASE(ACAMERA_ERROR_UNKNOWN) RETURN_CASE(ACAMERA_ERROR_INVALID_PARAMETER) [...] -- Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB If you fake or manipulate statistics in a paper in physics you will never get a job again. If you fake or manipulate statistics in a paper in medicin you will get a job for life at the pharma industry.
signature.asc
Description: Digital signature
_______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel