From patchwork Sat Apr 4 20:26:22 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andriy Gelman X-Patchwork-Id: 18649 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 4774644AA7A for ; Sat, 4 Apr 2020 23:34:57 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 2B8E268B51A; Sat, 4 Apr 2020 23:34:57 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qk1-f195.google.com (mail-qk1-f195.google.com [209.85.222.195]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 35A2768B1E0 for ; Sat, 4 Apr 2020 23:34:50 +0300 (EEST) Received: by mail-qk1-f195.google.com with SMTP id o10so11976255qki.10 for ; Sat, 04 Apr 2020 13:34:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=Jo+cCXulwj1YTnwv171m31WM6j1vJjQiJS/dfpGv+UQ=; b=owWw8yDIaTRDEfBKwar6jrzSD79Rrhp9ptrMbx3MIa9OMHCh5i4WEJwUu/XEZF2WbF 2fw0V5429Z56oLarh2HQYjAPl/oVqi6YX3Bvc7oYb6VZunvm2EzDq7N7jlrX7mpWqwLV bJ6bQybrpy0ZQ9fqTkblJa9uWbtRg1Np/LyakbHRraNcI5FrmUVGm7trqe3OBpoLW2ki DtKR1aXuw5ftl7TfOII4KEjWMERvqMnNoLxDjispRJltrrHsfCg0CUivRzPgGUDBRoYq 2jjM1aJAUTNJkwwTEtFGf0HCfy0RPyPhfQqf48Bp4ZuzSZsGT3EjPUSkSsN1f6G86G+U /SMg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=Jo+cCXulwj1YTnwv171m31WM6j1vJjQiJS/dfpGv+UQ=; b=dETzPbhOERLX1innEKPMLUH0dDVEExtMKbopHDnDdP1lG62IqkFBU9lcZgPnqslyxu SsTL5e6GL6SF5QhOOnd1CtoVXa30c/eXR+NVwTRTB4kAc5jKpst1XeiyG5nVIvSIU2tT HJEV5Ae7rlARtTl26i03Ne+9TUhgTy0uMJuVwfha8SmKuKrwTNKJrWrKoU4FHo8kJSUs mlkbIwoiXqDQtNz3Iwam8U3ihCS+WiMRxV5tgJkFiNRyc58QJ2vBispARhXBv8IZS9x3 xHnMswt46IbHmfiZ27PVsO5OuCn6kd6S8F0lgd6wZrxfNSrQsj+i+VU68YthWKBn+iqd lTkw== X-Gm-Message-State: AGi0PuZ4dgdGssv/LKFQeYT5bkJBWq6biMoW5WSKxF8ksQSLvkoeqREV m19OfJhpv9eQyA25K2ECddbpP6qE X-Google-Smtp-Source: APiQypJ1BVknaS18gentJh9fde3wyBjBlfObG64Kip4vipIhw+FG3nxpeTJ3t77OiC/cShzm11qZZQ== X-Received: by 2002:a37:a0d6:: with SMTP id j205mr11127386qke.455.1586031995151; Sat, 04 Apr 2020 13:26:35 -0700 (PDT) Received: from localhost.localdomain (c-71-232-27-28.hsd1.ma.comcast.net. [71.232.27.28]) by smtp.gmail.com with ESMTPSA id h10sm3482345qtp.93.2020.04.04.13.26.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 04 Apr 2020 13:26:34 -0700 (PDT) From: Andriy Gelman X-Google-Original-From: Andriy Gelman To: ffmpeg-devel@ffmpeg.org Date: Sat, 4 Apr 2020 16:26:22 -0400 Message-Id: <20200404202622.22348-1-andriy.gelman@gmail.com> X-Mailer: git-send-email 2.25.1 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH] avcodec/v4l2_m2m_enc: Add option to remove ivf container X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Cc: Andriy Gelman Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" From: Andriy Gelman The dequeued packets from vp8 (s5p-mfc) encoder are output in ivf format which breaks the stream when the packets are muxed in avformat. This commit adds an option to remove the container and thus support the encoder. Signed-off-by: Andriy Gelman --- libavcodec/v4l2_m2m.h | 2 ++ libavcodec/v4l2_m2m_enc.c | 53 +++++++++++++++++++++++++++++++-------- 2 files changed, 45 insertions(+), 10 deletions(-) diff --git a/libavcodec/v4l2_m2m.h b/libavcodec/v4l2_m2m.h index 456281f48c..525f9456e9 100644 --- a/libavcodec/v4l2_m2m.h +++ b/libavcodec/v4l2_m2m.h @@ -73,6 +73,8 @@ typedef struct V4L2m2mPriv { int num_output_buffers; int num_capture_buffers; + int strip_ivf; + int ivf_detected; } V4L2m2mPriv; /** diff --git a/libavcodec/v4l2_m2m_enc.c b/libavcodec/v4l2_m2m_enc.c index c9f1741bfd..9c11f90567 100644 --- a/libavcodec/v4l2_m2m_enc.c +++ b/libavcodec/v4l2_m2m_enc.c @@ -25,6 +25,8 @@ #include #include #include "libavcodec/avcodec.h" +#include "libavcodec/internal.h" +#include "libavutil/intreadwrite.h" #include "libavutil/pixdesc.h" #include "libavutil/pixfmt.h" #include "libavutil/opt.h" @@ -256,6 +258,7 @@ static int v4l2_send_frame(AVCodecContext *avctx, const AVFrame *frame) static int v4l2_receive_packet(AVCodecContext *avctx, AVPacket *avpkt) { + V4L2m2mPriv *priv = avctx->priv_data; V4L2m2mContext *s = ((V4L2m2mPriv*)avctx->priv_data)->context; V4L2Context *const capture = &s->capture; V4L2Context *const output = &s->output; @@ -281,7 +284,28 @@ static int v4l2_receive_packet(AVCodecContext *avctx, AVPacket *avpkt) } dequeue: - return ff_v4l2_context_dequeue_packet(capture, avpkt); + ret = ff_v4l2_context_dequeue_packet(capture, avpkt); + if (ret) + return ret; + + if (priv->strip_ivf) { + int header_offset = 0; + if (avpkt->size >= 32 && AV_RL32(avpkt->data) == MKTAG('D','K','I','F')) { + header_offset = 32; + priv->ivf_detected = 1; + } else if (priv->ivf_detected) { + header_offset = 12; + } + header_offset = FFMIN(header_offset, avpkt->size); + avpkt->data += header_offset; + avpkt->size -= header_offset; + + if (avpkt->size == 0) { + av_packet_unref(avpkt); + goto dequeue; + } + } + return 0; } static av_cold int v4l2_encode_init(AVCodecContext *avctx) @@ -349,16 +373,25 @@ static const AVOption options[] = { { NULL }, }; -#define M2MENC_CLASS(NAME) \ +static const AVOption vp8_options[] = { + V4L_M2M_DEFAULT_OPTS, + { "num_capture_buffers", "Number of buffers in the capture context", + OFFSET(num_capture_buffers), AV_OPT_TYPE_INT, { .i64 = 4 }, 4, INT_MAX, FLAGS }, + { "strip_ivf", "Strip ivf container", + OFFSET(strip_ivf), AV_OPT_TYPE_BOOL, { .i64 = 1 }, 0, 1, FLAGS }, + { NULL }, +}; + +#define M2MENC_CLASS(NAME, OPTIONS) \ static const AVClass v4l2_m2m_ ## NAME ## _enc_class = { \ .class_name = #NAME "_v4l2m2m_encoder", \ .item_name = av_default_item_name, \ - .option = options, \ + .option = OPTIONS, \ .version = LIBAVUTIL_VERSION_INT, \ }; -#define M2MENC(NAME, LONGNAME, CODEC) \ - M2MENC_CLASS(NAME) \ +#define M2MENC(NAME, LONGNAME, CODEC, OPTIONS) \ + M2MENC_CLASS(NAME, OPTIONS) \ AVCodec ff_ ## NAME ## _v4l2m2m_encoder = { \ .name = #NAME "_v4l2m2m" , \ .long_name = NULL_IF_CONFIG_SMALL("V4L2 mem2mem " LONGNAME " encoder wrapper"), \ @@ -374,8 +407,8 @@ static const AVOption options[] = { .wrapper_name = "v4l2m2m", \ }; -M2MENC(mpeg4,"MPEG4", AV_CODEC_ID_MPEG4); -M2MENC(h263, "H.263", AV_CODEC_ID_H263); -M2MENC(h264, "H.264", AV_CODEC_ID_H264); -M2MENC(hevc, "HEVC", AV_CODEC_ID_HEVC); -M2MENC(vp8, "VP8", AV_CODEC_ID_VP8); +M2MENC(mpeg4,"MPEG4", AV_CODEC_ID_MPEG4, options); +M2MENC(h263, "H.263", AV_CODEC_ID_H263, options); +M2MENC(h264, "H.264", AV_CODEC_ID_H264, options); +M2MENC(hevc, "HEVC", AV_CODEC_ID_HEVC, options); +M2MENC(vp8, "VP8", AV_CODEC_ID_VP8, vp8_options);