From patchwork Wed Jul 15 06:50:56 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Buzdyk X-Patchwork-Id: 21032 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 38AD444B5A2 for ; Wed, 15 Jul 2020 10:51:27 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 1372C68B2B1; Wed, 15 Jul 2020 10:51:27 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-ed1-f68.google.com (mail-ed1-f68.google.com [209.85.208.68]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 0000B6880AB for ; Wed, 15 Jul 2020 10:51:19 +0300 (EEST) Received: by mail-ed1-f68.google.com with SMTP id z17so880638edr.9 for ; Wed, 15 Jul 2020 00:51:19 -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=F/Hc+xTG6MCt62sG93LUFdVQlhX6MdqOPxyz9DqSaC0=; b=hCWMWRO+rh1IFjWQl1fwl43Fw38881nQ6eDTo3stReqfQKksBA87oeESbxuEoB3oSZ mfvwsuAwWlwRraSXMccW9OEml7p3Wp38sKLNgXRZIY87rbvAGMK5i1/vejrgIUvs4l5P cuG1LG2tBQFnGCYmqlKftXCqdm+BG8M77mvTDJ9bCWjk601/b+zJRnhlgprM7YgmTr+d FZHucXJMrPN7yBwHQoT/o9fDaKio0AjOadM3siKdN3PSvZl/rPr7w17XF4+SnkNflmM5 HLHzifehp9dwH6huiBj0GKRHkdcD1cCQuC0DahD7AyxgeRrfQnwNG5Y6iZ1AeEMcos68 x8BQ== 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=F/Hc+xTG6MCt62sG93LUFdVQlhX6MdqOPxyz9DqSaC0=; b=Cv5WsArLYK/0jyy5pmJ4FqZHWFHYCsyYYBM7eKJ8E5mgiQKkwQOdPRGEWlx6xTbKxm lH32SaWN3oI88xV5agfLpoGhlEKP9ioRPmg2J+sFPk+QC7lgMVjod0GZwD7tJ6h5eIvV 1TD+1GUXjCHccB18AnpVIGccJ3s1whpmVVwauOag6IocoItb7XDbrqA6O0GUEcz2GhBB zvdoGyPIx8qURTbhayEZ4oAOLZwNVX7aDLBqI1O9gOrObdw9+/21WwHcyhiv6GmwNEcn VnQ6JNS54DDteuk28SaVwie8VdLwck7AWTurjuFA9Y5KsmH9+S13Pt8JO8XMU0YEBqzD X1/A== X-Gm-Message-State: AOAM533mZnUfsQJdBHOAnOOYuvZAZoFjKy+jhLCWYvyiPu6+Yd5RhJ4n TP7bXAgeBKaYcRY0NqTErT7dztAl3qU= X-Google-Smtp-Source: ABdhPJyXtVEHNb/ombNOxY3sMQCFqLR7uwX1/nt5z85yTNxSo3ZSDfntJUhv1QyHl/K1hlZPDT3/7w== X-Received: by 2002:a19:87c2:: with SMTP id j185mr3982329lfd.183.1594795862926; Tue, 14 Jul 2020 23:51:02 -0700 (PDT) Received: from localhost.localdomain ([185.57.31.227]) by smtp.gmail.com with ESMTPSA id o1sm288457lfi.92.2020.07.14.23.51.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 14 Jul 2020 23:51:02 -0700 (PDT) From: Dima Buzdyk To: ffmpeg-devel@ffmpeg.org Date: Wed, 15 Jul 2020 16:50:56 +1000 Message-Id: <20200715065057.548738-1-dima.buzdyk@gmail.com> X-Mailer: git-send-email 2.25.1 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 1/2] avdevice/v4l2: add support for HEVC payloads 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: Dima Buzdyk Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" * Add mapping for V4L2_PIX_FMT_HEVC payloads * Request bitstream parsing just like H264 Signed-off-by: Dima Buzdyk --- libavdevice/v4l2-common.c | 3 +++ libavdevice/v4l2.c | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) This change add support for HEVC playback for v4l2 devices. Corresponding Linux kernel patch for UVC devices submitted to https://patchwork.kernel.org/patch/11577395/ Sample output of ffmpeg for camera capable of HEVC streaming: 1. Available formats: ~/packages/ffmpeg/ffmpeg-git$ ./ffmpeg -f v4l2 -list_formats all -i /dev/video2 ffmpeg version 4.3.git Copyright (c) 2000-2020 the FFmpeg developers built with gcc 9 (Ubuntu 9.3.0-10ubuntu2) configuration: libavutil 56. 55.100 / 56. 55.100 libavcodec 58. 96.100 / 58. 96.100 libavformat 58. 48.100 / 58. 48.100 libavdevice 58. 11.101 / 58. 11.101 libavfilter 7. 87.100 / 7. 87.100 libswscale 5. 8.100 / 5. 8.100 libswresample 3. 8.100 / 3. 8.100 [video4linux2,v4l2 @ 0x55c04e131700] Compressed: h264 : H.264 : 1440x1920 [video4linux2,v4l2 @ 0x55c04e131700] Compressed: hevc : HEVC : 1440x1920 [video4linux2,v4l2 @ 0x55c04e131700] Compressed: mjpeg : Motion-JPEG : 3000x4000 /dev/video2: Immediate exit requested 2. ffprobe output for given input format: ~/packages/ffmpeg/ffmpeg-git$ ./ffprobe -f v4l2 -input_format hevc -i /dev/video2 ffprobe version 4.3.git Copyright (c) 2007-2020 the FFmpeg developers built with gcc 9 (Ubuntu 9.3.0-10ubuntu2) configuration: libavutil 56. 55.100 / 56. 55.100 libavcodec 58. 96.100 / 58. 96.100 libavformat 58. 48.100 / 58. 48.100 libavdevice 58. 11.101 / 58. 11.101 libavfilter 7. 87.100 / 7. 87.100 libswscale 5. 8.100 / 5. 8.100 libswresample 3. 8.100 / 3. 8.100 Input #0, video4linux2,v4l2, from '/dev/video2': Duration: N/A, start: 416791.927897, bitrate: N/A Stream #0:0: Video: hevc (Main), yuv420p(tv), 1440x1920, 30 fps, 30 tbr, 1000k tbn, 29.97 tbc diff --git a/libavdevice/v4l2-common.c b/libavdevice/v4l2-common.c index b5b4448a31..353e83efdd 100644 --- a/libavdevice/v4l2-common.c +++ b/libavdevice/v4l2-common.c @@ -55,6 +55,9 @@ const struct fmt_map ff_fmt_conversion_table[] = { #ifdef V4L2_PIX_FMT_H264 { AV_PIX_FMT_NONE, AV_CODEC_ID_H264, V4L2_PIX_FMT_H264 }, #endif +#ifdef V4L2_PIX_FMT_HEVC + { AV_PIX_FMT_NONE, AV_CODEC_ID_HEVC, V4L2_PIX_FMT_HEVC }, +#endif #ifdef V4L2_PIX_FMT_MPEG4 { AV_PIX_FMT_NONE, AV_CODEC_ID_MPEG4, V4L2_PIX_FMT_MPEG4 }, #endif diff --git a/libavdevice/v4l2.c b/libavdevice/v4l2.c index 365bacd771..70e0f620f8 100644 --- a/libavdevice/v4l2.c +++ b/libavdevice/v4l2.c @@ -960,7 +960,7 @@ static int v4l2_read_header(AVFormatContext *ctx) if (codec_id == AV_CODEC_ID_RAWVIDEO) st->codecpar->codec_tag = avcodec_pix_fmt_to_codec_tag(st->codecpar->format); - else if (codec_id == AV_CODEC_ID_H264) { + else if (codec_id == AV_CODEC_ID_H264 || codec_id == AV_CODEC_ID_HEVC) { st->need_parsing = AVSTREAM_PARSE_FULL_ONCE; } if (desired_format == V4L2_PIX_FMT_YVU420)