[FFmpeg-devel] [PATCH] Add android_capture indev

Michael Niedermayer michael at niedermayer.cc
Wed Nov 29 05:31:08 EET 2017


On Fri, Nov 10, 2017 at 09:41:04PM +0100, Felix Matouschek wrote:
> Hello,
> 
> here is a new version of the patch with further fixes.
[...]

> +static const char *camera_status_string(camera_status_t val)
> +{
> +    switch(val) {
> +        case ACAMERA_OK:
> +            return "ACAMERA_OK";

if the identifer and the string always match you could do this
with a macro avoiding the neede to duplcate each string
see AV_STRINGIFY


[...]
> +static int read_closing(AndroidCameraCtx *ctx)
> +{
> +    int read_closing;
> +    pthread_mutex_lock(&ctx->read_closing_mutex);
> +    read_closing = ctx->read_closing;
> +    pthread_mutex_unlock(&ctx->read_closing_mutex);
> +    return read_closing;
> +}
> +
> +static void set_read_closing(AndroidCameraCtx *ctx, int read_closing)
> +{
> +    pthread_mutex_lock(&ctx->read_closing_mutex);
> +    ctx->read_closing = read_closing;
> +    pthread_mutex_unlock(&ctx->read_closing_mutex);
> +}

Thic can be simplified using C11 atomics


[...]
> +static void match_video_size(AVFormatContext *avctx)
> +{
> +    AndroidCameraCtx *ctx = avctx->priv_data;
> +    ACameraMetadata_const_entry available_configs;
> +    int ret = -1;
> +
> +    ACameraMetadata_getConstEntry(ctx->camera_metadata,
> +                                  ACAMERA_SCALER_AVAILABLE_STREAM_CONFIGURATIONS,
> +                                  &available_configs);
> +
> +    for (int i = 0; i < available_configs.count; i++) {
> +        int32_t input = available_configs.data.i32[i * 4 + 3];
> +        int32_t format = available_configs.data.i32[i * 4 + 0];
> +
> +        if (input) {
> +            continue;
> +        }
> +
> +        if (format == IMAGE_FORMAT_ANDROID) {
> +            int32_t width = available_configs.data.i32[i * 4 + 1];
> +            int32_t height = available_configs.data.i32[i * 4 + 2];
> +
> +            //Same ratio

> +            if (ctx->requested_width * ctx->requested_height == width * height) {

the product of these can maybe overflow i think


> +                ctx->width = width;
> +                ctx->height = height;
> +                ret = 0;
> +                break;
> +            }
> +        }
> +    }
> +

> +    if (ret < 0 || ctx->width == 0 || ctx->height == 0) {
> +        ctx->width = available_configs.data.i32[1];
> +        ctx->height = available_configs.data.i32[2];
> +        ret = -1;
> +
> +        av_log(avctx, AV_LOG_WARNING,
> +               "Requested video_size %dx%d not available, falling back to %dx%d\n",
> +               ctx->requested_width, ctx->requested_height, ctx->width, ctx->height);
> +    }

you set ret but nothing uses it

> +
> +    return;
> +}

[...]
> +static int add_video_stream(AVFormatContext *avctx)
> +{
> +    AndroidCameraCtx *ctx = avctx->priv_data;
> +    AVStream *st;
> +    AVCodecParameters *codecpar;
> +
> +    st = avformat_new_stream(avctx, NULL);
> +    if (!st) {
> +        return AVERROR(ENOMEM);
> +    }
> +
> +    st->id = VIDEO_STREAM_INDEX;

> +    st->avg_frame_rate = (AVRational) { ctx->framerate_range[1], 1 };
> +    st->r_frame_rate = (AVRational) { ctx->framerate_range[1], 1 };

Are these values always correct ?


[...]
> +    if (ctx->camera_id) {
> +        av_freep(&ctx->camera_id);
> +    }

the if() is unneeded


[...]
-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

In a rich man's house there is no place to spit but his face.
-- Diogenes of Sinope
-------------- 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/20171129/a1ec65e1/attachment.sig>


More information about the ffmpeg-devel mailing list